Compare commits

..

2 Commits
master ... v2

  1. 184
      .gitattributes
  2. 103
      CHANGELOG.md
  3. 10
      aide/saisies.html
  4. 4
      balise/generer_saisies.php
  5. 9
      balise/voir_saisies.php
  6. 48
      champs_extras/calculer_balise_lister_valeurs_choix_grille.php
  7. 18
      champs_extras/serialiser_choix_grille.php
  8. 308
      css/formulaires_constructeur.css
  9. 139
      css/saisies.css
  10. 19
      demo/page-saisies_cvt.html
  11. 30
      demo/voir_saisies.html
  12. 0
      formulaires/configurer_saisies.html
  13. 23
      formulaires/configurer_saisies.php
  14. 263
      formulaires/construire_formulaire.html
  15. 600
      formulaires/construire_formulaire.php
  16. 18
      formulaires/inc-construire_formulaire-actions.html
  17. 2
      formulaires/inc-generer_saisies_configurables.html
  18. 31
      formulaires/inc-saisies-cvt-boutons.html
  19. 43
      formulaires/inc-saisies-cvt-etapes-courante.html
  20. 32
      formulaires/inc-saisies-cvt-etapes-defaut.html
  21. 14
      formulaires/inc-saisies-cvt-etapes-recapitulatif.html
  22. 2
      formulaires/inc-saisies-cvt-etapes.html
  23. 38
      formulaires/inc-saisies-cvt.html
  24. 137
      formulaires/saisies_cvt.php
  25. BIN
      images/formulaire-annuler-16.png
  26. BIN
      images/formulaire-configurer-16.png
  27. BIN
      images/formulaire-deplacer-16.png
  28. BIN
      images/formulaire-dupliquer-16.png
  29. BIN
      images/formulaire-enregistrer-16.png
  30. BIN
      images/formulaire-reinitialiser-24.png
  31. 1
      images/formulaire-saisie-defaut-xx.svg
  32. BIN
      images/formulaire-saisie-defaut.png
  33. BIN
      images/formulaire-supprimer-16.png
  34. BIN
      images/logo_saisie_48.png
  35. BIN
      images/saisies-16.png
  36. BIN
      images/saisies-24.png
  37. BIN
      images/saisies-32.png
  38. 8
      images/saisies-xx.svg
  39. 1
      images/saisies_articles-xx.svg
  40. 1
      images/saisies_auteurs-xx.svg
  41. BIN
      images/saisies_auteurs.png
  42. 1
      images/saisies_case-xx.svg
  43. BIN
      images/saisies_case.png
  44. 1
      images/saisies_checkbox-xx.svg
  45. BIN
      images/saisies_checkbox.png
  46. 1
      images/saisies_choix_grille-xx.svg
  47. BIN
      images/saisies_date.png
  48. 1
      images/saisies_destinataires-xx.svg
  49. 1
      images/saisies_documents-xx.svg
  50. BIN
      images/saisies_email.png
  51. 1
      images/saisies_evenements-xx.svg
  52. 1
      images/saisies_explication-xx.svg
  53. BIN
      images/saisies_explication.png
  54. 1
      images/saisies_fieldset-xx.svg
  55. BIN
      images/saisies_fieldset.png
  56. 1
      images/saisies_grille-xx.svg
  57. 1
      images/saisies_hidden-xx.svg
  58. BIN
      images/saisies_hidden.png
  59. 1568
      images/saisies_icones_src.svg
  60. 1
      images/saisies_input-xx.svg
  61. BIN
      images/saisies_input.png
  62. 1
      images/saisies_input_colors-xx.svg
  63. 1
      images/saisies_input_date-xx.svg
  64. 1
      images/saisies_input_email-xx.svg
  65. 1
      images/saisies_input_number-xx.svg
  66. 1
      images/saisies_input_password-xx.svg
  67. 1
      images/saisies_mots-xx.svg
  68. BIN
      images/saisies_oui_non.png
  69. 1
      images/saisies_radio-xx.svg
  70. BIN
      images/saisies_radio.png
  71. 1
      images/saisies_rubriques-xx.svg
  72. 1
      images/saisies_rubriques_articles-xx.svg
  73. 1
      images/saisies_select-xx.svg
  74. 1
      images/saisies_select_multiple-xx.svg
  75. BIN
      images/saisies_selecteur_article.png
  76. BIN
      images/saisies_selecteur_rubrique.png
  77. BIN
      images/saisies_selecteur_rubrique_article.png
  78. BIN
      images/saisies_selection.png
  79. BIN
      images/saisies_selection_multiple.png
  80. 1
      images/saisies_textarea-xx.svg
  81. BIN
      images/saisies_textarea.png
  82. 1
      images/saisies_toggle-xx.svg
  83. 606
      inc/saisies.php
  84. 352
      inc/saisies_afficher.php
  85. 376
      inc/saisies_afficher_si_commun.php
  86. 127
      inc/saisies_afficher_si_js.php
  87. 301
      inc/saisies_afficher_si_php.php
  88. 66
      inc/saisies_aide.php
  89. 279
      inc/saisies_data.php
  90. 122
      inc/saisies_formulaire.php
  91. 79
      inc/saisies_identifiants.php
  92. 361
      inc/saisies_lister.php
  93. 368
      inc/saisies_lister_disponibles.php
  94. 292
      inc/saisies_manipuler.php
  95. 103
      inc/saisies_name.php
  96. 201
      inc/saisies_request.php
  97. 186
      inc/saisies_verifier.php
  98. 9
      inclure/fieldset_legend.html
  99. 27
      inclure/generer_saisies.html
  100. 7
      inclure/js_afficher_si.html
  101. Some files were not shown because too many files have changed in this diff Show More

184
.gitattributes vendored

@ -0,0 +1,184 @@
* text=auto !eol
action/deplacer_saisie.php -text
aide/saisies.html -text
balise/configurer_saisie.php -text
balise/generer_saisies.php -text
balise/saisie.php -text
balise/voir_saisie.php -text
balise/voir_saisies.php -text
css/formulaires_constructeur.css -text
demo/configurer_saisie.html -text
demo/generer_saisies.html -text
demo/page-saisies_cvt.html -text
demo/saisie.html -text
demo/voir_saisie.html -text
demo/voir_saisies.html -text
formulaires/construire_formulaire.html -text
formulaires/construire_formulaire.php -text
formulaires/inc-construire_formulaire-actions.html -text
formulaires/inc-generer_saisies_configurables.html -text
formulaires/inc-saisies-cvt.html -text
formulaires/saisies_cvt.html -text
formulaires/saisies_cvt.php -text
images/formulaire-annuler-16.png -text
images/formulaire-configurer-16.png -text
images/formulaire-deplacer-16.png -text
images/formulaire-dupliquer-16.png -text
images/formulaire-enregistrer-16.png -text
images/formulaire-reinitialiser-24.png -text
images/formulaire-saisie-defaut.png -text
images/formulaire-supprimer-16.png -text
images/logo_saisie_48.png -text
images/saisies-16.png -text svneol=unset#image/png
images/saisies-24.png -text svneol=unset#image/png
images/saisies-32.png -text svneol=unset#image/png
images/saisies_auteurs.png -text
images/saisies_case.png -text
images/saisies_checkbox.png -text
images/saisies_date.png -text
images/saisies_email.png -text
images/saisies_explication.png -text
images/saisies_fieldset.png -text
images/saisies_hidden.png -text
images/saisies_input.png -text
images/saisies_oui_non.png -text
images/saisies_radio.png -text
images/saisies_selecteur_article.png -text
images/saisies_selecteur_rubrique.png -text
images/saisies_selecteur_rubrique_article.png -text
images/saisies_selection.png -text
images/saisies_selection_multiple.png -text
images/saisies_textarea.png -text
inc/saisies.php -text
inc/saisies_afficher.php -text
inc/saisies_lister.php -text
inc/saisies_manipuler.php -text
inc/saisies_migrer_afficher_si_remplissage.php -text
inclure/configurer_saisie.html -text
inclure/configurer_saisie_fonctions.php -text
inclure/fieldset_legend.html -text
inclure/generer_saisies.html -text
inclure/js_afficher_si.html -text
inclure/saisies_aide.html -text
inclure/voir_saisies.html -text
javascript/saisies.js -text
lang/paquet-saisies.xml -text
lang/paquet-saisies_ar.php -text
lang/paquet-saisies_de.php -text
lang/paquet-saisies_en.php -text
lang/paquet-saisies_es.php -text
lang/paquet-saisies_fr.php -text
lang/paquet-saisies_fr_tu.php -text
lang/paquet-saisies_nl.php -text
lang/paquet-saisies_pt_br.php -text
lang/paquet-saisies_ru.php -text
lang/paquet-saisies_sk.php -text
lang/saisies.xml -text
lang/saisies_ca.php -text
lang/saisies_de.php -text
lang/saisies_en.php -text
lang/saisies_es.php -text
lang/saisies_fa.php -text
lang/saisies_fr.php -text
lang/saisies_fr_tu.php -text
lang/saisies_it.php -text
lang/saisies_nl.php -text
lang/saisies_pt_br.php -text
lang/saisies_ru.php -text
lang/saisies_sk.php -text
/paquet.xml -text
prive/exec/construire_formulaire.html -text
prive/listes/articles_originaux_recursifs.html -text
prive/listes/rubriques_recursives.html -text
prive/squelettes/contenu/saisies_doc.html -text
prive/squelettes/navigation/saisies_doc.html -text
prive/style_prive_plugin_saisies.html -text
saisies-vues/_base.html -text
saisies-vues/auteurs.html -text
saisies-vues/case.html -text
saisies-vues/checkbox.html -text
saisies-vues/couleur.html -text
saisies-vues/date.html -text
saisies-vues/destinataires.html -text
saisies-vues/explication.html -text
saisies-vues/fieldset.html -text
saisies-vues/groupe_mots.html -text
saisies-vues/mot.html -text
saisies-vues/oui_non.html -text
saisies-vues/radio.html -text
saisies-vues/secteur.html -text
saisies-vues/selecteur.html -text
saisies-vues/selecteur_article.html -text
saisies-vues/selecteur_article_fonctions.php -text
saisies-vues/selecteur_document.html -text
saisies-vues/selecteur_rubrique.html -text
saisies-vues/selecteur_rubrique_article.html -text
saisies-vues/selecteur_site.html -text
saisies-vues/selection.html -text
saisies-vues/selection_multiple.html -text
/saisies.css.html -text
saisies/_base.html -text
saisies/articles_originaux.html -text
saisies/auteurs.html -text
saisies/auteurs.yaml -text
saisies/case.html -text
saisies/case.yaml -text
saisies/checkbox.html -text
saisies/checkbox.yaml -text
saisies/choisir_objet.html -text
saisies/choisir_objets.html -text
saisies/choisir_objets_edit.html -text
saisies/choix_grille.html -text
saisies/couleur.html -text
saisies/date.html -text
saisies/date.yaml -text
saisies/date_jour_mois_annee.html -text
saisies/destinataires.html -text
saisies/destinataires.yaml -text
saisies/email.html -text
saisies/email.yaml -text
saisies/explication.html -text
saisies/explication.yaml -text
saisies/fieldset.html -text
saisies/fieldset.yaml -text
saisies/groupe_mots.html -text
saisies/hidden.html -text
saisies/hidden.yaml -text
saisies/input.html -text
saisies/input.yaml -text
saisies/mot.html -text
saisies/mot.yaml -text
saisies/oui_non.html -text
saisies/oui_non.yaml -text
saisies/pays.html -text
saisies/police.html -text
saisies/position_construire_formulaire.html -text
saisies/radio.html -text
saisies/radio.yaml -text
saisies/recherche.html -text
saisies/secteur.html -text
saisies/selecteur.html -text
saisies/selecteur_article.html -text
saisies/selecteur_article.yaml -text
saisies/selecteur_document.html -text
saisies/selecteur_document.yaml -text
saisies/selecteur_langue.html -text
saisies/selecteur_rubrique.html -text
saisies/selecteur_rubrique.yaml -text
saisies/selecteur_rubrique_article.html -text
saisies/selecteur_rubrique_article.yaml -text
saisies/selecteur_site.html -text
saisies/selection.html -text
saisies/selection.yaml -text
saisies/selection_multiple.html -text
saisies/selection_multiple.yaml -text
saisies/selection_par_groupe.html -text
saisies/statuts_auteurs.html -text
saisies/telephone.html -text
saisies/textarea.html -text
saisies/textarea.yaml -text
saisies/true_false.html -text
saisies/url.html -text
/saisies_fonctions.php -text
/saisies_options.php -text
/saisies_pipelines.php -text

103
CHANGELOG.md

@ -1,103 +0,0 @@
# Changelog
## [4.6.1] - 2022-12-01
### Added
- #236 Ajout de la saisie `type_mime` (utilisé pour constructeur de formulaire) depuis CVT-Upload
### Fixed
- #236 Correction d'un bug sur constructeur de formulaire lorsque CVT-Upload n'est pas disponible
- #236 Ne pas proposer la vérification `fichiers` pour des saisies non `fichiers`
- #237 `saisie_transformer_option()` ajoute l'option si jamais elle est inexistante (bug introduit en v4.5.0)
- #237 Constructeur de formulaire : toutes les saisies sont en pleine largeur (comportement qui avait été cassé en v4.5.0)
- #237 `saisie_mapper_option()` ajoute l'option si jamais elle est inexistante
- #238 Saisie `destinataires` : ne pas afficher de label si jamais tout est caché
## [4.6.0] - 2022-11-21
### Changed
- Dans le constructeur de formulaires, on ne gère plus directement les exceptions de vérification pour la saisie `fichiers` du plugin CVT-Upload. On n'utilise à la place un pipeline `saisies_verifier_lister_disponibles`.
### Fixed
- #233 Lorsqu'un constructeur de formulaire ajoute ses propres fieldsets racine à la configuration d'une saisie, les afficher en onglet à côté des autres fieldset, pas en dessous
- inserer_modeles/#12 Faire fonctionner la saisie `selecteur_documents` appelée au sein d'une modalbox
- #226 Debug des `afficher_si` au chargement des pages qui chargent également du contenu/javascript en Ajax
- cvt-upload/#12 Constructeur de formulaire : afficher les options de vérification pour la saisie fichier
### Removed
- La saisie `selecteur_documents` n'a plus besoin de `_modalbox_retour`
## [4.5.2] - 2022-09-23
### Fixed
- #225 : un input avec une valeur 0 (ou '0') affichait une chaine vide : saisies_utf8_restaurer_planes() ne retourne plus une chaine vide
## [4.5.1] - 2022-09-14
### Fixed
- Refait fonctionner la vérification de (certains) formulaires
## [4.5.0] - 2022-09-11
### Fixed
- formidable/#120: Pour la saisie explication, seul le bouton d'affichage/masquage affiche/masque, pas les boutons du constructeur de formulaire.
- #208 Générer une exception dans `saisies_lister_disponibles()` et `saisies_charger_infos()` si le plugin `YAML` n'est pas actif.
- formidable_participation/#9 + #207 Dans l'espace privé, éviter les problèmes de marge supérieur lorsqu'un fieldset suit un élèment masqué par `afficher_si`.
- #216 Eviter une rupture de compat brutal en v4 concernant l'emplacement de `nouveau_type_saisie` dans l'argument `$modifs` dans `saisie_modifier()`.
### Added
- #208 Tenir compte des options pour dev lorsqu'on nettoie l'environnement de `#GENERER_SAISIES`
- #222 Nouvelle fonction `saisie_mapper_option()` pour appliquer une fonction de rappel sur une (ou plusieurs) options données d'un ensemble de saisies
- #222 `saisie_transformer_option()` peut recevoir une liste d'options à modifier, plutôt qu'une option unique
## [4.4.1] - 2022-06-06
### Fixed
- #206 Pour la saisie radio, si les clés sont des entiers, ne pas considérer que l'absence de valeur par défaut vaut valeur par défaut == 0
- Correction de `selecteur_document.yaml` mal formaté
## [4.4.0] - 2022-05-31
### Added
- #200 Ajout de `saisies_verifier_coherence_afficher_si()` (utilisable par les constructeurs de formulaire)
- #171 Option de saisie `explication_apres`, pour insérer une explication après le champ, en plus ou à la place de l'explication avant
- #171 Dans l'aide de saisies, les messages d'attention accolés aux options sont affichés
- #185 Les emoji apparaissent sous la forme normale, et non pas la forme entité HTML, dans les saisies `textarea` et `input`
- #198 Ajout de quatre `trigger` Javascript sur les `afficher_si` :
* `afficher_si_visible_pre` (avant de rendre visible un champ);
* `afficher_si_visible_post` (après avoir rendu visible);
* `afficher_si_masque_pre` (avant de masquer un champ);
* `afficher_si_masque_post` (après avoir masqué un champ);
### Changed
- formidable/#70 Vue des `fieldset` : utiliser aussi un markup `fieldset`/`legend`, pour affichage correct dans les emails
- #198 `afficher_si` : ne faire les actions de masquage/demasquage que si la saisie n'est pas déjà masquée/démasquée
- #199 Constructeur de saisie : tout ce qui est `afficher_si` dans un
onglet `condition` à part
- #188 Constructeur de formulaire : positionner l'écran sur la saisie en cours d'édition
### Fixed
- #196 Debug du constructeur de formulaire, qui ne doit pas proposer les saisies obsolètes, même aprés une première vérification de saisies
- #198 Lors de l'édition d'un formulaire, les fieldsets ne sont pas mis en mode onglet
- #198 Les fieldset en onglets restent à leur emplacement ; il est possible de mettre du contenu hors onglet entre deux fieldset
- #194 La saisie `fieldset` n'hérite plus de l'`id` du formulaire
- #193 Afficher correctement les erreurs des champs dont le nom est déclarée selon la syntaxe SPIP `cle/souscle/nom`
- Le `describedby` d'un champ lorsque l'on a une erreur sur une saisie avec un `name` contenant des crochets est corrigé
- #198 Les `afficher_si` fonctionnent désormais sur les onglets
- #198 Attribut `aria-labelledby` correct sur les onglets
- #180 Sous firefox : pouvoir sélectionner la barre de scroll pour les onglets horizontaux + ne pas la superposer avec la bordure des onglets
- #166 Constructeur de formulaire : rendre visible les boutons d'action lorsqu'une saisie non `fieldset` suit un `fieldset`

10
aide/saisies.html

@ -1,13 +1,5 @@
[(#PLUGIN{yaml}|oui)
<h1>Références complètes des saisies</h1>
<p>Cette documentation a été générée à partir de la [v(#PLUGIN{saisies,version})] du plugin Saisies.</p>
[(#ENV{format}|=={brut}|oui)<textarea style="width:100%; height:100%;">]
[(#VAL|saisies_generer_aide)
[(#VAL|saisies_generer_aide)]
[(#ENV{format}|=={brut}|oui)</textarea>]
]
]
[(#PLUGIN{yaml}|non)
Activez le plugin YAML pour générer l'aide]

4
balise/generer_saisies.php

@ -18,11 +18,11 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* La balise accepte 1 paramètre qui est une liste de descriptions de saisies
* dont on veut générer le HTML affichant les champs du formulaires
*
* Cette balise est un raccourci :
* Cette balise est un raccourcis :
* - `#GENERER_SAISIES{#TABLEAU_DE_SAISIES}` est équivalent à
* - `#INCLURE{fond=inclure/generer_saisies,env,saisies=#TABLEAU_DE_SAISIES}`
*
* @syntaxe `#GENERER_SAISIES{#TABLEAU_DE_SAISIES}`
* @syntaxe `#GENERER_SAISIE{#TABLEAU_DE_SAISIES}`
* @uses Pile::recuperer_et_supprimer_argument_balise()
* @uses Pile::creer_et_ajouter_argument_balise()
* @see balise_INCLURE_dist()

9
balise/voir_saisies.php

@ -14,13 +14,12 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* Compile la balise `#VOIR_SAISIES` qui retourne le code HTML des vues de formulaire,
* à partir du tableau des saisies transmises
*
* La balise accepte 2 paramètre :
* - une liste de descriptions de saisies
* dont on veut générer le HTML affichant les vues du formulaires
* - un liste des valeurs
* La balise accepte 1 paramètre qui est une liste de descriptions de saisies
* dont on veut générer le HTML affichant les vues du formulaires
*
* Cette balise est un raccourcis :
* - `#VOIR_SAISIES{#TABLEAU_DE_SAISIES}` est équivalent à
* - `#INCLURE{fond=inclure/voir_saisies,env,saisies=#TABLEAU_DE_SAISIES,valeurs=#TABLEAU_DE_VALEURS}`
* - `#INCLURE{fond=inclure/voir_saisies,env,saisies=#TABLEAU_DE_SAISIES}`
*
* @syntaxe `#VOIR_SAISIES{#TABLEAU_DE_SAISIES}`
* @uses Pile::recuperer_et_supprimer_argument_balise()

48
champs_extras/calculer_balise_lister_valeurs_choix_grille.php

@ -1,48 +0,0 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Déclaration de la balise LISTER_VALEURS pour la saisie `choix_grille`
* @param string $objet
* Type d'objet
* @param string $colonne
* Nom de la colonne SQL
* @param string $cles
* Valeurs enregistrées pour ce champ dans la bdd pour l'objet en cours
* @return array|string vide
* Tableau de type 'Clé de ligne|Valeur de ligne' => 'Ligne en valeur humaine|Valeur de ligne en humain'.
* Par ex 'Ligne1|Colonne1' => 'Ma première ligne|Ma première colonne'
**/
function champs_extras_calculer_balise_LISTER_VALEURS_choix_grille($objet, $colonne, $cles) {
if (
$options = calculer_balise_CHAMP_EXTRA($objet, $colonne)
and isset($options['data_rows'])
and isset($options['data_cols'])
) {
$data_rows = saisies_chaine2tableau($options['data_rows']);
$data_cols = saisies_chaine2tableau($options['data_cols']);
$retour = [];
$valeurs = saisies_chaine2tableau($cles);
foreach ($valeurs as $cle => $valeur) {
if (is_array($valeur)) {
$colonne_humaine = join('|',
array_map(
function ($i) use ($data_cols) {
return $data_cols[$i];
},
$valeur
)
);
$retour["$cle|".join('|', $valeur)] = $data_rows[$cle].'|'.$colonne_humaine;
} else {
$retour["$cle|$valeur"] = $data_rows[$cle].'|'.$data_cols[$valeur];
}
}
return $retour;
} else {
return '';
}
}

18
champs_extras/serialiser_choix_grille.php

@ -1,18 +0,0 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Sérialise les réponses à un champ extra de type `choix_grille` pour encodage en base.
* @param array $extra
* La valeur reçue en POST
* @param array $saisie
* La description de la saisie
* @return string
* Forme serialisé, en l'occurence avec saisies_tableau2chaine
**/
function champs_extras_serialiser_choix_grille($extra, $saisie) {
include_spip('inc/saisies');
return saisies_tableau2chaine($extra);
}

308
css/formulaires_constructeur.css

@ -1,252 +1,126 @@
/**
* Styles du constructeur de formulaires.
*/
.formulaire_spip .formulaire_spip{
border:none;
background:transparent;
}
#deplacable .ui-state-highlight { height: 5em; line-height: 1.2em; }
#deplacable .ui-sortable {min-height:3em;}
/**
* Conteneur
*/
.formulaire_construire_formulaire {
--saisies-btn-padding-x: var(--spip-btn-padding-x);
--saisies-btn-padding-y: var(--spip-btn-padding-y);
--saisies-btn-fontsize: var(--spip-btn-font-size);
--saisies-btn-iconsize: 32px;
margin-left: calc(var(--spip-form-spacing-x) * -1);
margin-right: calc(var(--spip-form-spacing-x) * -1);
.formulaire_construire_formulaire .actions_formulaire{
margin:0;
padding:1em;
text-align:center;
border:0;
}
.formulaire_spip .formulaire_construire_formulaire {
border: none;
background: transparent;
.formulaire_construire_formulaire .actions_formulaire img{
vertical-align:middle;
}
.formulaire_construire_formulaire .en_configuration{
border:5px solid #999;
border-radius:5px;
margin:.5em;
}
.formulaire_construire_formulaire .fieldset.configurable>fieldset>.editer-groupe {margin-left:30px;}
/**
* Saisie en configuration, avec le formulaire inséré à la fin.
* Pour les fieldsets, c'est inséré après.
*/
.formulaire_construire_formulaire .en_configuration {
border: 3px solid var(--spip-color-theme) !important;
border-radius: var(--spip-form-border-radius);
padding-top: var(--spip-form-spacing-y);
padding-bottom: 0;
margin: calc(var(--spip-form-spacing-y) / 2) 0;
box-shadow: 0 0 2em var(--spip-color-theme-lightest); /* Pour faire « poper » la saisie */
.formulaire_construire_formulaire .formulaire_configurer{
border-top:3px dashed #999;
margin: 1em -8px 0 -138px;
padding: 1em .5em .5em .5em;
background:white;
}
.formulaire_construire_formulaire .fieldset.en_configuration > fieldset,
.formulaire_construire_formulaire .fieldset.en_configuration > .formulaire_configurer {
margin: 0;
.formulaire_construire_formulaire .fieldset > .formulaire_configurer{
margin: 1em -8px 0;
}
/**
* Formulaire de configuration dans une saisie
*/
.formulaire_construire_formulaire .formulaire_configurer {
margin-top: var(--spip-form-spacing-y);
margin-left: calc((var(--spip-form-label-width) + (var(--spip-form-spacing-x) * 2)) * -1);
margin-right: calc(var(--spip-form-spacing-x) * -1);
padding: var(--spip-form-spacing-y) var(--spip-form-spacing-x) 0;
border-top: 3px dashed var(--spip-color-theme-light);
}
.formulaire_construire_formulaire .editer.pleine_largeur .formulaire_configurer,
.formulaire_construire_formulaire fieldset.editer:not(.en_configuration) .formulaire_configurer {
margin-left: calc(var(--spip-form-spacing-x) * -1);
.formulaire_construire_formulaire .formulaire_configurer .formulaire_configurer-onglets {
overflow:auto;
}
.formulaire_construire_formulaire .editer.long_label .formulaire_configurer {
margin-left: calc((var(--spip-form-label-long-width) + (var(--spip-form-spacing-x) * 2)) * -1);
.formulaire_construire_formulaire .formulaire_configurer .formulaire_configurer-onglets li{
float:left;
width:auto;
clear:none;
padding:0;
background:#eee;
border:1px solid #ddd;
margin-right:1px;
-moz-border-radius:5px 5px 0 0;
-webkit-border-radius:5px 5px 0 0;
-o-border-radius:5px 5px 0 0;
border-radius:5px 5px 0 0;
}
.formulaire_construire_formulaire .formulaire_configurer > .editer-groupe {
margin-left: 0;
margin-right: 0;
.formulaire_construire_formulaire .formulaire_configurer .formulaire_configurer-onglets li.actif{
background:white;
border-bottom:1px solid white;
}
/* onglets */
.formulaire_construire_formulaire .formulaire_configurer .saisies-contenus-onglets > .fieldset {
padding-left: 0;
.formulaire_construire_formulaire .formulaire_configurer .formulaire_configurer-onglets li.erreur a{
color:#CC3300;
}
/* boutons */
.formulaire_construire_formulaire .formulaire_configurer .boutons {
margin: 0 calc(var(--spip-form-spacing-x) * -1);
.formulaire_construire_formulaire .formulaire_configurer .formulaire_configurer-onglets li a{
display:block;
padding:.5em;
}
.formulaire_construire_formulaire .formulaire_configurer .boutons { margin-bottom: -20px; }
/**
* Fieldsets
* On ajoute une bordure pour mieux visualiser, il faut donc ajuster les marges et cie.
*/
.formulaire_construire_formulaire .fieldset.configurable:not(.en_configuration) > fieldset {
border: 1px dashed var(--spip-color-gray);
}
.formulaire_construire_formulaire .saisies_presentes .fieldset > fieldset {
margin-left: 0;
margin-right: 0;
}
.formulaire_construire_formulaire .saisies_presentes .fieldset > fieldset fieldset:not(.editer),
.formulaire_construire_formulaire .saisies_presentes .fieldset > fieldset fieldset.editer.pleine_largeur {
padding-left: var(--spip-form-spacing-x);
padding-right: var(--spip-form-spacing-x);
}
/* Ceux dans le form de config (nb : fieldsets 1er niveaux affichés sous forme d'onglets) */
.formulaire_construire_formulaire .saisies_presentes .formulaire_configurer fieldset fieldset > .editer-groupe > .editer:first-child {
padding-top: 0;
.formulaire_construire_formulaire .editer.obligatoire .formulaire_configurer label {
color: #666;
font-weight: normal;
}
.formulaire_construire_formulaire .saisies_presentes .formulaire_configurer .fieldset > fieldset {
padding-left: 0;
padding-right: 0;
.formulaire_construire_formulaire .editer.obligatoire .formulaire_configurer .obligatoire label {
color: black;
font-weight: bold;
}
/**
* Bouton de configuration des options globales
*/
.formulaire_construire_formulaire .actions-globales {
margin-top: var(--spip-form-spacing-y);
}
.formulaire_construire_formulaire .actions-globales .submit {
margin-bottom: 0; /* déjà la marge nécessaire via .editer-groupe + .editer */
}
.formulaire_construire_formulaire .actions-globales ~ .editer-groupe {
clear: both;
}
.formulaire_configurer-contenus > .fieldset > fieldset:first-child {border-top:0;}
.formulaire_configurer-contenus > .fieldset > fieldset {padding: 0}
.formulaire_construire_formulaire .editer-groupe>.configurable {padding-top:30px; position:relative;}
.formulaire_construire_formulaire .editer.saisie_explication > .explication { position:initial; }
.formulaire_construire_formulaire .editer.pleine_largeur .formulaire_configurer { margin-left: 0px; }
.formulaire_construire_formulaire li.editer.pleine_largeur .formulaire_configurer > .formulaire_configurer-contenus { margin-left: -138px; } /*uniquement pour Spip < 3.1, d'où le li */
.formulaire_construire_formulaire .formulaire_configurer .fieldset {padding-top:0px;}
.formulaire_construire_formulaire .formulaire_configurer fieldset fieldset>.editer-groupe>.editer:first-child {padding-top:0px;}
/**
* Boutons divers au début (réinitialiser, etc.)
*/
.formulaire_construire_formulaire .actions_formulaire {
margin: 0;
text-align: center;
border: 0;
}
.formulaire_construire_formulaire .actions_formulaire img {
vertical-align: middle;
}
/* SPIP 3.0 compat avec li.selecteur_item */
.formulaire_construire_formulaire ul.editer-groupe > li.selecteur_item { background:transparent; padding-left:140px; }
.formulaire_construire_formulaire ul.editer-groupe > li.selecteur_item label { margin-left:-130px; }
.formulaire_construire_formulaire ul.editer-groupe > li.selecteur_item .choix label { margin-left:5px; }
.formulaire_construire_formulaire .editer.hover {background-color:transparent;}
/**
* Barre de boutons d'actions pour une saisie
*/
.formulaire_spip.formulaire_construire_formulaire .disabled{
/* Surcharger les réglages de spip en .formulaire_construire_formulaire .disabled
*/
opacity: 1;
pointer-events: inherit;
}
.formulaire_construire_formulaire .actionable {
padding-top: calc((var(--spip-form-spacing-y) / 2) + (16px + (var(--spip-btn-padding-y) * 2)))!important;
position: relative;
}
.formulaire_construire_formulaire .fieldset.actionable > .actions {
right: 0;
.formulaire_construire_formulaire .actions{
position:absolute;
right:5px;
top:5px;
}
.formulaire_construire_formulaire .actions {
position: absolute;
top: calc(var(--spip-form-spacing-y) / 2);
right: var(--spip-form-spacing-x);
inset-inline-end: var(--spip-form-spacing-x);
display: flex;
justify-content: flex-end;
margin: 0;
}
.formulaire_construire_formulaire .actions button,
.formulaire_construire_formulaire .actions .btn {
cursor: pointer;
background-color: var(--spip-color-gray-lightest);
border: none;
margin: 0;
.formulaire_construire_formulaire .actions button{
cursor:pointer;
background:none;
border:none;
opacity:0.7;
}
.formulaire_construire_formulaire .actions button:hover,
.formulaire_construire_formulaire .actions .btn:hover {
background-color: var(--spip-color-gray-lighter);
.formulaire_construire_formulaire .actions button:hover{
opacity:1;
}
.formulaire_construire_formulaire .actions .move {
cursor:move;
}
/**
* Groupes de boutons d'ajout de saisies
*/
.formulaire_construire_formulaire .fieldset_saisie_categorie legend.legend {
background-color: transparent;
}
.formulaire_construire_formulaire .fieldset_saisie_categorie .editer_groupe {
display: grid;
grid-template-columns: 1fr;
grid-gap: 1em;
}
@media (min-width: 580px) {
.formulaire_construire_formulaire .fieldset_saisie_categorie .editer_groupe {
grid-template-columns: repeat(2, 1fr);
}
}
@media (min-width: 960px) {
.formulaire_construire_formulaire .fieldset_saisie_categorie .editer_groupe {
grid-template-columns: repeat(3, 1fr);
}
}
/**
* Bouton d'ajout d'une saisie avec icône
*/
.formulaire_construire_formulaire .ajouter_saisie {
color: var(--spip-black, black);
padding: var(--saisies-btn-padding-y) var(--saisies-btn-padding-x);
padding-left: calc(var(--saisies-btn-iconsize) + (var(--saisies-btn-padding-x) * 2));
min-height: calc(var(--saisies-btn-iconsize) + (var(--saisies-btn-padding-y) * 2));
margin: 0;
border: 0;
background-color: var(--spip-color-gray-lightest);
background-size: auto var(--saisies-btn-iconsize);
background-repeat: no-repeat;
background-position: var(--spip-left) var(--saisies-btn-padding-x) center;
white-space: initial;
font-size: var(--saisies-btn-fontsize);
text-align: var(--spip-left);
justify-content: flex-start;
}
.formulaire_construire_formulaire .ajouter_saisie:hover {
background-color: var(--spip-color-gray-lighter);
.formulaire_construire_formulaire .ajouter_saisie{
width:45%;
margin:5px;
padding:0.5em 8px 0.5em 36px;
font-size:1em;
text-align:left;
color:black;
cursor:pointer;
background:white url() 8px center no-repeat;
border:1px solid #ccc;
}
.formulaire_construire_formulaire .ajouter_saisie img{
vertical-align:middle;
}
/**
* Divers
*/
/* Bitonio de sortable.js */
.formulaire_construire_formulaire .sortable-ghost {
opacity: 0;
}
/* Labels */
.formulaire_construire_formulaire .editer.obligatoire .formulaire_configurer label {
color: #666;
font-weight: normal;
}
.formulaire_construire_formulaire .editer.obligatoire .formulaire_configurer .obligatoire label {
color: black;
font-weight: bold;
}
/* ? */
.formulaire_construire_formulaire .editer-groupe.formulaire_configurer-contenus {
padding: 0;
}
/* boutons */
.formulaire_construire_formulaire .editer-groupe.en_configuration .boutons {
margin: 0.5em 0 0;
}
/* onglets */
.formulaire_construire_formulaire .saisies-menu-onglets__items {
margin: 0;
}
/* Explication */
.formulaire_construire_formulaire .editer.saisie_explication > .explication {
position: initial;
}
.formulaire_construire_formulaire .editer.hover {
background-color: transparent;
}

139
css/saisies.css

@ -1,139 +0,0 @@
/* Correction d'un bug de navigateur. On l'ajoute là pour tout le monde, c'est gentil. https://stackoverflow.com/a/17863685 */
fieldset {
min-width:0;
}
.fieldset.pliable > fieldset > .legend{
cursor:pointer;
}
.fieldset.pliable:not(.plie) > fieldset > .legend span:before{
content: '▾ ';
}
.fieldset.plie > fieldset > .legend span:before{
content: '▸ ';
}
[dir='rtl'] .fieldset.plie > fieldset > .legend span:before{
content: '◂ ';
}
/*date triple champs...
jour mois annee
/12/ /10/ /2010/
*/
.editer.saisie_date_jour_mois_annee .choix {
display: inline-block;
background-color:transparent;
padding:0;
border:0;
}
.saisie_date_jour_mois_annee .choix+.choix {margin-left:1em;}
.saisie_date_jour_mois_annee .choix label{display:block; width:auto;}
.saisie_date_jour_mois_annee .choix .text{width:auto;}
/* avec crayons + formulaire de saisies, éviter un padding à gauche du label */
.formulaire_crayon .editer-groupe .editer { padding-left:10px; }
/* les étapes */
.formulaire_spip .etapes__items {
list-style: none;
}
.formulaire_spip .etapes__item {
display: inline-block;
}
.formulaire_spip .etapes__item:not(:first-child):before {
content: ' → ';
}
/* Pour les saisies grilles, on s'arrange pour faire défiler si ça dépasse en largeur */
.choix_grille_wrapper {
overflow-x: auto;
}
.formulaire_spip .choix-groupe {
border: none;
margin-top: 0;
margin-bottom: 0;
margin-left: 0;
padding: 0;
}
.formulaire_spip .choix-groupe label,
.formulaire_spip .choix-groupe legend.label,
.formulaire_spip .choix-groupe .editer-label {
float: none;
background-color: transparent;
margin-left: 0;
margin-bottom: 0.5em;
padding-left: 0;
padding-bottom: 0;
width: auto;
}
/* Base minimale des onglets des saisies fieldsets */
.saisies-menu-onglets {
border-bottom: 1px solid hsla(0, 0%, 0%, 0.15);
}
.saisies-menu-onglets__items {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
list-style: none;
padding: 0;
margin: 0;
}
.saisies-menu-onglets__item,
.saisies-menu-onglets__lien {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
.saisies-menu-onglets__lien {
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
padding: 0.5em 1em;
text-decoration: none;
}
.saisies-menu-onglets__lien.actif {
font-weight: bold;
}
.saisies-contenus-onglets fieldset {
margin-top: 0; /* pour la dist */
}
.afficher_si_masque_chargement, .etapes__item.afficher_si_masque{
position: absolute!important;
width: 1px!important;
height: 1px!important;
padding: 0!important;
overflow: hidden!important;
clip: rect(0, 0, 0, 0)!important;
white-space: nowrap!important;
border: 0!important;
}
.champ.afficher {
margin-bottom: 1rem;
}
.champ.afficher p:last-child,
#wysiwyg .champ.afficher p:last-child {
margin-bottom: 0;
}
.champ.afficher.saisie_fieldset fieldset > .fieldset_legend {
font-weight: 800;
font-size: 1.1em;
margin-left: 0;
margin-bottom: 1rem;
}
.champ.afficher.saisie_fieldset > .fieldset_valeurs {
padding-left: 1.5em;
border-left: 1px solid #E3E3E3;
border-radius: 12px;
}

19
demo/page-saisies_cvt.html

@ -1,17 +1,4 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
<head>
<title>Demo Saisies CVT</title>
<INCLURE{fond=inclure/head} />
</head>
<body>
<div class="page">
<h1>CVT automatique avec Saisies</h1>
<p>Démonstration d'un formulaire CVT généré uniquement à partir d'une déclaration de Saisies</p>
<h1>CVT automatique avec Saisies</h1>
<p>Démonstration d'un formulaire CVT généré uniquement à partir d'une déclaration de Saisies</p>
<div class="ajax">
#FORMULAIRE_SAISIES_CVT
</div>
</div>
</body>
</html>
#FORMULAIRE_SAISIES_CVT

30
demo/voir_saisies.html

@ -1,10 +1,31 @@
<html>
<head>
<title>Test de génération des vues de saisies</title>
<INCLURE{fond=inclure/head} />
[<link rel="stylesheet" href="(#CHEMIN{spip_formulaires.css})" type="text/css" media="all" title="formulaires" charset="utf-8" />]
<style type="text/css">
.formulaire_spip{
width:40%;
border:1px solid black;
-moz-border-radius:10px;
-webkit-border-radius:10px;
border-radius:10px;
}
.formulaire_spip ul li{
padding:0.5em;
}
.formulaire_spip li.fieldset{
padding:0;
}
.formulaire_spip li.obligatoire{
background:#ffcfcf;
}
.formulaire_spip .fieldset .legend{
margin:0;
font-style:italic;
}
</style>
</head>
<body>
<div class="page">
<h1>Générer des vues de saisie</h1>
#SET{saisies,
@ -66,7 +87,6 @@
nom, voie,
label, Voie,
obligatoire, non,
rows,2
}
},
2,#ARRAY{
@ -101,7 +121,9 @@
<h2>Formulaire auquel on doit répondre</h2>
<div class="formulaire_spip">
<ul>
#GENERER_SAISIES{#GET{saisies}}
</ul>
</div>
@ -121,7 +143,5 @@
<h2>Réponse à ce formulaire</h2>
#VOIR_SAISIES{#GET{saisies}, #GET{valeurs}}
</div>
</body>
</html>

0
formulaires/configurer_saisies.html

23
formulaires/configurer_saisies.php

@ -1,23 +0,0 @@
<?php
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Saisies du formulaire de configuration de saisies
* @return array
**/
function formulaires_configurer_saisies_saisies_dist() {
return array(
array(
'saisie' => 'case',
'options' => array(
'nom' => 'assets_global',
'label_case' => '<:saisies:assets_global:>',
'conteneur_class' => 'pleine_largeur',
)
)
);
}

263
formulaires/construire_formulaire.html

@ -2,44 +2,22 @@
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
<p id="message_attention" class="message_reinitialiser reponse_formulaire reponse_formulaire_ok">#ENV*{_message_attention}</p>
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
<BOUCLE_editable(CONDITION){si #ENV{editable}|oui}>
<form method='post' action='#ENV{action}' enctype='multipart/form-data'><div>
[(#REM) declarer les hidden qui declencheront le service du formulaire
[(#REM) declarer les hidden qui declencheront le service du formulaire
parametre : url d'action ]
#ACTION_FORMULAIRE{#ENV{action}}
<input type="submit" class="submit noscroll invisible" name="enregistrer" value="<:bouton_enregistrer:>" />
[(#ENV{_activer_options_globales}|oui)
[(#ENV{erreurs/configurer_globales}|non)
<div class="actions-globales float-end">
<button type="submit" class="submit btn_secondaire" name="configurer_globales" value="oui">
<:saisies:construire_configurer_globales_label:>
</button>
</div>
]
[(#ENV{erreurs/configurer_globales}|oui)
<div class="editer-groupe en_configuration">
#GENERER_SAISIES{#ENV{erreurs/configurer_globales}}
<div class="boutons">
<input type="hidden" name="enregistrer_globales" value="oui" />
<div class="groupe-btns">
<button type="submit" class="submit btn_secondaire noscroll" name="enregistrer_globales" value=""><:bouton_annuler:></button>
<input type="submit" class="submit noscroll" name="enregistrer" value="<:bouton_valider:>" />
</div>
</div>
</div>
]
]
<div id="reinitialiser" class="actions_formulaire">
<button type="submit" class="submit btn_secondaire" name="reinitialiser" value="oui" onclick="return confirm('<:saisies:construire_reinitialiser_confirmer:>')">
[(#CHEMIN_IMAGE{formulaire-action-reinitialiser-16.png}|balise_img{'','sp-icone'})]
<[(#DIV|sinon{ul})] class="editer-groupe" id="deplacable">
<[(#DIV|sinon{li})] id="reinitialiser" class="actions_formulaire">
<button type="submit" class="submit" name="reinitialiser" value="oui" onclick="return confirm('<:saisies:construire_reinitialiser_confirmer:>')">
<img src="#CHEMIN{images/formulaire-reinitialiser-24.png}" alt="" />
<:saisies:construire_reinitialiser:>
</button>
</div>
<div class="editer-groupe saisies_presentes" id="sortable">
</[(#DIV|sinon{li})]>
[(#REM)<!-- les choix de saisies -->]
<BOUCLE_contenu(DATA){source tableau, #ENV{_contenu}}>
@ -47,47 +25,37 @@
[(#VALEUR**|construire_formulaire_generer_saisie_configurable{#ENV**|unserialize})]
]
</BOUCLE_contenu>
[(#ALERTE_MESSAGE{<:saisies:construire_aucun_champs:>})]
<[(#DIV|sinon{li})] class="aucun"><em class="attention"><:saisies:construire_aucun_champs:></em></[(#DIV|sinon{li})]>
<//B_contenu>
</div>
<B_saisies_disponibles_par_categories>
<div class="editer haut saisies_disponibles" id="attrapable">
<h2><:saisies:construire_ajouter_champ:></h2>
<BOUCLE_saisies_disponibles_par_categories(DATA){source tableau, #ENV{_saisies_disponibles_par_categories}}>
<B_saisies_disponibles>
<div class="fieldset[ fieldset_saisie_categorie_(#CLE|saisie_nom2classe)] fieldset_saisie_categorie">
<fieldset>
<legend class="legend">#NOM</legend>
<div class="editer_groupe">
<BOUCLE_saisies_disponibles(DATA){source tableau, #SAISIES}>
<button type="submit" name="ajouter_saisie" value="#CLE" class="submit noscroll ajouter_saisie"[ title="(#DESCRIPTION)"] [style="background-image:url((#ICONE|sinon{#CHEMIN{images/formulaire-saisie-defaut-xx.svg}}))"]>
<span>#TITRE</span>
</button>
</BOUCLE_saisies_disponibles>
</div>
</fieldset>
</div>
</B_saisies_disponibles>
</BOUCLE_saisies_disponibles_par_categories>
</div>
</B_saisies_disponibles_par_categories>
<B_saisies_disponibles>
<[(#DIV|sinon{li})] class="editer haut saisies_disponibles" id="attrapable">
<label><:saisies:construire_ajouter_champ:></label>
<BOUCLE_saisies_disponibles(DATA){source tableau, #ENV{_saisies_disponibles}}{par titre}>
<button type="submit" name="ajouter_saisie" value="#CLE" class="submit noscroll ajouter_saisie"[ title="(#DESCRIPTION)"] [style="background-image:url((#ICONE|sinon{#CHEMIN{images/formulaire-saisie-defaut.png}}))"]>
<span>#TITRE</span>
</button>
</BOUCLE_saisies_disponibles>
</[(#DIV|sinon{li})]>
</B_saisies_disponibles>
<B_saisies_groupes_disponibles>
<div class="editer haut saisies_groupes_disponibles" id="attrapable_bis">
<[(#DIV|sinon{li})] class="editer haut saisies_groupes_disponibles" id="attrapable_bis">
<label><:saisies:construire_ajouter_groupe:></label>
<BOUCLE_saisies_groupes_disponibles(DATA){source tableau, #ENV{_saisies_groupes_disponibles}}{par titre}>
<button type="submit" name="ajouter_groupe_saisie" value="#CLE" class="submit noscroll ajouter_saisie"[ title="(#DESCRIPTION)"] [style="background-image:url((#ICONE|sinon{#CHEMIN{images/formulaire-saisie-defaut-xx.svg}}))"]>
<button type="submit" name="ajouter_groupe_saisie" value="#CLE" class="submit noscroll ajouter_saisie"[ title="(#DESCRIPTION)"] [style="background-image:url((#ICONE|sinon{#CHEMIN{images/formulaire-saisie-defaut.png}}))"]>
<span>#TITRE</span>
</button>
</BOUCLE_saisies_groupes_disponibles>
</div>
</[(#DIV|sinon{li})]>
</B_saisies_groupes_disponibles>
</[(#DIV|sinon{ul})]>
[(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
<!--extra-->
<span class='image_loading'></span>
</div></form>
@ -98,46 +66,58 @@
<script type="text/javascript">
(function($){
jQuery.getScript('[(#CHEMIN{prive/javascript/Sortable.js}|timestamp)]').done(function() {
var sortableOptions = {
group: {
name: "construire_formulaire",
pull: true,
put: true,
},
handle: '.deplacer_saisie',
onEnd: function(evt) {
$saisie = $(evt.item);
id = $saisie.data('id');
ou = $saisie.next().data('id');
if (!ou) {
// sinon dans le parent
ou = $saisie.closest('.avec_sous_saisies').data('id');
// Si jamais match lui-même, ca veut dire qu'on déplace un fieldest
if (ou == id) {
ou = $saisie.parents('.avec_sous_saisies').first().data("id");
}
if (ou) {
ou = '\[' + ou + '\]';
}
}
url = "#URL_ECRIRE";
$.get(url, {
session: '#ENV{_identifiant_session}',
action: 'deplacer_saisie',
saisie: id,
ou: ou
}, function() {
$('.formulaire_#ENV{form}').addClass('modifie').trigger('modifsaisies');
});
},
animation: 250,
};
containers = document.querySelectorAll("#sortable, #sortable .avec_sous_saisies .editer-groupe");
for (var i = 0; i < containers.length; i++) {
new Sortable(containers[i], sortableOptions);
}
});
function formulaire_configurer_onglets() {
var $formulaire_configurer = $('.formulaire_configurer');
var $onglets = $('<ul class="formulaire_configurer-onglets"></ul>');
var $contenus = $formulaire_configurer.find('> .editer-groupe > .fieldset');
// On ajoute le conteneur des onglets
$formulaire_configurer.prepend($onglets);
// On parcourt les contenus pour générer les onglets
$contenus.each(function(i){
// On ajoute un identifiant et une classe
$(this)
.attr('id', 'formulaire_configurer-contenu-'+i)
.addClass('formulaire_configurer-contenu');
// On récupère le titre (en le cachant au passage)
var titre = $(this).find('[(#VAL{"{{{ titre }}}"}|propre|replace{"\n",""}|replace{"<(\S*).*>",$1,i})]').eq(0).hide().text();
// On crée un onglet
var $onglet = $('<li><a href="#formulaire_configurer-contenu-'+i+'">'+titre+'</a></li>');
$onglet
.click(function(){
$contenus.hide();
$(
$(this)
.siblings()
.removeClass('actif')
.end()
.addClass('actif')
.find('a')
.attr('href')
).show();
return false;
});
// On active le premier onglet au démarrage
if (i == 0) {
$onglet.addClass('actif');
}
// S'il y a des erreurs dans cette partie du contenu, on met une classe "erreurs" à l'onglet aussi
if ($(this).find('.editer.erreur').length > 0) {
$onglet.addClass('erreur');
}
// On ajoute l'onglet
$onglets.append($onglet);
})
.hide()
.eq(0)
.show();
}
/* enlever les required */
$('.formulaire_#FORM .editer.obligatoire').find('input, textarea, select').each(function(){
if ($(this).prop('required')) {
@ -150,6 +130,8 @@
function(){
$(this)