Skip to content
Snippets Groups Projects

Fonctions JS vMap

  • Clone with SSH
  • Clone with HTTPS
  • Embed
  • Share
    The snippet can be accessed without any authentication.
    Authored by Armand Bahi
    fonctions_vmap.js 7.04 KiB
    /**
     * Exemple récupération puis modification de la valeur d'un champ
     *
     * Fonction lancée au chargement du formulaire
     * @param { object } scope Formreader
     * @param { object } env environment
     * @param { object } services
     * @returns { undefined } 
     */
    var constructor_form = function (scope, env, services) {
        console.log('scope', scope);
        console.log('env', env);
        console.log('services', services);
    
        // Permet de debug depuis la console du navigateur
        window.scope = scope;
        window.env = env;
        window.services = services;
    
        /**
         * Une fonction js pour lancer depuis un bouton la génération d'un rapport
         */
        scope.generateReport = function (report_id) {
            services.mapToolsReportService.printReportById(scope.map, report_id, scope.data);
        }
    
        /**
         * Une fonction js pour mettre à jour une liste déroulante en fonction d'une valeur d'un autre champ, l'objectif est de filtrer les listes déroulantes.
         * 
         * Méthode 1 : une source de données existe déjà, j'ajoute un filtre puis je décenche le rechargement via les fonctions de FormReader
         */
        scope.updateDatasource = function () {
    
            // Nouveau filtre
            const oFilter = {
                column: 'codeinsee',
                compare_operator: '=',
                value: '66015' // Je mets une valeur en dur, mais elle pourrait très bien venir d'un des attributs du formulaire
            }
    
            // Set le nouveau filtre sur la datasource
            services.oFormReader.oFormDefinition.datasources.datasource_0.parameters.filter = oFilter;
    
            // Champ liste déroulante que l'on veut mettre à jour (ici j'ai pris un champ armoires comme exemple)
            const oField = services.oFormReader.getFormField('armoires');
    
            // Recharge la liste déroulante de l'attribut armoires
            services.oFormReader.reloadDatasource(oField);
    
            // Event appelé à la fin du chargement
            const choicesSubscribe = oField.options.observableChoises.subscribe(() => {
    
                // À ce moment les données sont bien dans le select mais il faut faire croire à angular qu'il y a eut un event sur l'interface pour qu'il mette à jour la vue
                setTimeout(() => {
                    $(oField.element).click();
                });
            });
            choicesSubscribe.unsubscribe();
        }
    
        /**
         * Une fonction js pour mettre à jour une liste déroulante en fonction d'une valeur d'un autre champ, l'objectif est de filtrer les listes déroulantes.
         * 
         * Méthode 2 : c'est moi qui fait la requête manuellement, puis je donne les valeurs au champ
         */
        scope.updateDatasourceV2 = function () {
    
            // Champ liste déroulante que l'on veut mettre à jour (ici j'ai pris un champ armoires comme exemple)
            const oField = services.oFormReader.getFormField('armoires');
    
            // Requête (ici la table armoires pour exemple)
            services.vitisRequest.ajaxRequestPromise({
                method: 'GET',
                url: `${env.properties.app_api_url}/vitis/genericqueries`,
                params: {
                    filter: {
                        column: 'codeinsee',
                        compare_operator: '=',
                        value: '66015' // Je mets une valeur en dur, mais elle pourrait très bien venir d'un des attributs du formulaire
                    },
                    database: 'eclairage_public',
                    schema: 's_eclairagepublic',
                    table: 'armoire',
                    attributs: 'armoire_id', // filtrer les attributs améliorera les performances
                    order_by: 'armoire_id',
                    sort_order: 'ASC',
                    distinct: 'true'
                }
            }).then((resp) => {
                if (resp && resp.data && resp.data.data) {
                    console.log('data', resp.data.data);
    
                    let aOptions = [];
                    for (const armoire of resp.data.data) {
                        aOptions.push({
                            label: armoire.armoire_id,
                            value: armoire.armoire_id
                        });
                    }
    
                    oField.options.choises = aOptions;
    
                    // À ce moment les données sont bien dans le select mais il faut faire croire à angular qu'il y a eut un event sur l'interface pour qu'il mette à jour la vue
                    setTimeout(() => {
                        $(oField.element).click();
                    });
    
                } else {
                    console.error('Error getting data');
                }
            }).catch((err) => {
                console.error('Error getting data', err);
            });
        }
    
        /**
         * Une fonction js pour envoyer un mail depuis un bouton avec le nouvel outil d'envoi de mail de vmap2
         * 
         * Pb droits : seul les admin ont le droit de déclencher un email
         */
        scope.sendEmail = function () {
    
            const mailId = '-3'; // Id du template
    
            // Requête 
            services.vitisRequest.ajaxRequestPromise({
                method: 'POST',
                url: `${env.properties.app_api_url}/vitis/emailtemplates/${mailId}/test`, // attention aux privilèges : vmap/vas/src/Module/Vitis/WebService/routes.json
                data: {
                    email_template_id: mailId,
                    to: 'contact@breizhmapping.com',
                    subject: 'Email vMap',
                    body: 'Hello {{nom}}', // On peut forcer le body, s'il n'est pas spécifié alors il prend celui du template
                    scope: {
                        nom: 'Gwendal',
                    }
                }
            }).then((resp) => {
                if (resp && resp.data && resp.data.status === 1) {
                    services.vitisAlert.fireToast({
                        type: 'success',
                        title: 'Email envoyé avec succès'
                    });
                }
            }).catch((err) => {
                console.error('Error sending email', err);
            });
        }
    
        /**
         * Une fonction js pour rendre invisible les champs vides. Le but est d'alléger le formulaire de consultation quand l'utilisateur n'a saisi aucune info
         * 
         */
        scope.autoSetInvisible = function () {
    
            // Exceptions
            const aExceptionTypes = ['title', 'subtitle', 'text_body', 'hr', 'data_grid_vmap'];
    
            for (const field of services.oFormReader.getFormFields()) {
                if (aExceptionTypes.indexOf(field.type) === -1) {
    
                    let visible = false;
                    if (Object.hasOwnProperty.call(scope.data, field.name)) {
                        if (services.vitisCheck.isDefAndNotNull(scope.data[field.name]) &&
                            scope.data[field.name] !== '') {
                            visible = true;
                        }
                    }
    
                    if (visible === false) {
                        field.visible = false;
    
                        // À ce moment les données sont bien dans le select mais il faut faire croire à angular qu'il y a eut un event sur l'interface pour qu'il mette à jour la vue
                        setTimeout(() => {
                            if (field.element) {
                                $(field.element).click();
                            }
                        });
                    }
                }
            }
        }
    }
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Please register or to comment