Fonctions JS vMap
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();
}
});
}
}
}
}
}
Please register or sign in to comment