Arborescence des pages

Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.

...

Pour pré-remplir ou auto-compléter un formulaire, esup-signature se base une une classe de "pré-remplissage" du type "PreFill". D'origine esup-signature est fourni avec la classe DefaultPreFill qui prend en charge les données externes de type DefaultExtValue et LdapExtValue. Ceci répond à une grande partie des besoins.

Cependant, tout comme cela peut être le cas pour les workflows, il se peut qu'il soit nécessaire de calculer certaines données à pré-remplir spécifiquement pour un formulaire (donnée calculée en fonction de l'utilisateur courant par exemple). Dans ce cas il y a la possibilité d'implémenter votre propre classe de type PreFill (voir DefaultPreFill.java pour l'exemple).

Voici un cas pratique se basant sur une base de donnée mariaDb :

  1. Il faut configurer une connexion au niveau du fichier de configuration. Ici pour une base de données nomée "totoDataSource". Ne pas utiliser le nom "userListDataSource" pour la source de données car il est réserver pour un autre service

    Bloc de code
    languageyml
    themeRDark
    extdb:
        datasources:
            totoDataSource:
                driver-class-name: org.mariadb.jdbc.Driver
                password: ********
                url: jdbc:mariadb://serveur.univ-ville.fr:3306/toto
                username: consult
                name: toto


  2. ajouter une classe TotoExtValue dans src/main/java/org/esupportail/esupsignature/service/interfaces/extvalue/impl/ . Voici un exemple :

    Bloc de code
    languagejava
    themeRDark
    package org.esupportail.esupsignature.service.interfaces.extvalue.impl;
    
    import org.esupportail.esupsignature.entity.SignRequest;
    import org.esupportail.esupsignature.entity.User;
    import org.esupportail.esupsignature.service.extdb.ExtDbService;
    import org.esupportail.esupsignature.service.interfaces.extvalue.ExtValue;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.Resource;
    import java.sql.ResultSet;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    @Component
    @ConditionalOnProperty(name = "extdb.datasources.totoDataSource.name")
    public class TotoExtValue implements ExtValue {
    
       private JdbcTemplate jdbcTemplate;
    
       @Resource
       private ExtDbService extDbService;
    
       @PostConstruct
       public void initJdbcTemplate() {
          this.jdbcTemplate = extDbService.getJdbcTemplateByName("totoDataSource");
       }
    
       @Override
       public String getValueByName(String name, User user, SignRequest signRequest) {
          return initValues(user, signRequest).get(name).toString();
       }
    
       @Override
       public List<Map<String, Object>> search(String searchType, String searchString, String searchReturn) {
          return null;
       }
    
       @Override
       public String getName() {
          return "toto";
       }
    
       @Override
       public Map<String, Object> initValues(User user, SignRequest signRequest) {
          Map<String, Object> values = new HashMap<>();
          jdbcTemplate.query("select nom_user, prenom_user from user where eppn='" + user.getEppn() + "'", (ResultSet rs) -> {
             values.put("nom", rs.getString("nom_user"));
             values.put("prenom", rs.getString("prenom_user"));
          });
          return values;
       }
    
    }

    Dans ce cas précis, on suppose que que l'on souhaite récupérer les nom / prénom du l'utilisateur courant dans notre base mariaDB. On affecte les valeurs récupérées dans la une map d'attributs (on y nomme les attributs comme on le souhaite).

    Info

    Les attributs disponibles au niveau de la méthode initValues sont :


  3. ajouter une classe TotoPreFill dans src/main/java/org/esupportail/esupsignature/service/interfaces/prefill/impl/ . Il est possible de repartir de la classe https://github.com/EsupPortail/esup-signature/blob/master/src/main/java/org/esupportail/esupsignature/service/interfaces/prefill/impl/TestPreFill.java en la modifiant comme suit :

    Bloc de code
    languagejava
    themeRDark
    @Override
    public Map<String, List<String>> getTypes() {
       Map<String, List<String>> types = new HashMap<>();
       types.put("ldap", Arrays.asList("person"));
       types.put("default", Arrays.asList("system"));
       types.put("toto", Arrays.asList("attributs"));										#Ajout d'un nom de type représentant le type de données
       return types;
    }
    
    
    ................
    
    
    public List<Field> preFillFields(List<Field> fields, User user, SignRequest signRequest) {
       List<Field> filledFields = new ArrayList<>();
       PDFont font = PDType1Font.HELVETICA;
       PDResources resources = new PDResources();
       resources.put(COSName.getPDFName("Helvetica"), font);
       ExtValue extDefaultValue = extValueService.getExtValueServiceByName("default");
       Map<String, Object> defaultValues = extDefaultValue.initValues(user, signRequest);
       ExtValue extTotoValue = extValueService.getExtValueServiceByName("toto");			#déclaration du nouveau extValue
       Map<String, Object> totoValues = extTotoValue.initValues(user, signRequest);			#initialisation des valeurs
       ExtValue extLdapValue = extValueService.getExtValueServiceByName("ldap");
       Map<String, Object> ldapValues = extLdapValue.initValues(user, signRequest);
       for(Field field : fields) {
          if(field.getExtValueServiceName() != null && !field.getExtValueServiceName().isEmpty()) {
             if(field.getExtValueServiceName().equals("ldap")) {
                String extValueName = field.getExtValueReturn();
                if(ldapValues.containsKey(extValueName)) {
                   if(extValueName.equals("schacDateOfBirth")) {
                      field.setDefaultValue(extLdapValue.getValueByName("schacDateOfBirth", user, signRequest));
                   } else {
                      field.setDefaultValue((String) ldapValues.get(extValueName));
                   }
                }
             } else if(field.getExtValueServiceName().equals("default")) {
                String extValueName = field.getExtValueReturn();
                if(defaultValues.containsKey(extValueName)) {
                   field.setDefaultValue((String) defaultValues.get(extValueName));
                }
                if(field.getExtValueReturn().equals("covid(duree)")) {
                   field.setDefaultValue("1");
                }
             } else if(field.getExtValueServiceName().equals("toto")) {						#gestion des champs pré-remplis par toto
                String extValueName = field.getExtValueReturn();
                if(totoValues.containsKey(extValueName)) {
                   field.setDefaultValue((String) totoValues.get(extValueName));
                }
             }
          }
          filledFields.add(field);
       }
       return filledFields;
    }

    On y ajoute le nouveau service ExtValue "toto" en respectant la syntaxe. A ce niveau il est en possible de faire des calculs ou de mettre des données en dur avant l'affectation de la valeur aux champs du formulaire. A noter que l'on pourrait imaginer qu'un ExtValue puisse retourner différents types de données comme c'est le cas avec LdapExtValue (person, organizationalUnit). Dans ce cas on dispatche arbitrairement les données au moment du pré-remplissage.

  4. Après recompilation / redémarrage et redéploiement, le service de pré-remplissage "toto" doit être disponible. On choisi donc le service puis le type de données (dans notre cas, "toto" puis "attributs") et on saisie manuellement le nom de l'attribut "nom" ou prenom..


Gestionnaire du formulaire

...