add contact data enrichment && add templating on messages

This commit is contained in:
osaajani 2019-11-20 02:45:00 +01:00
parent 50c7e4298c
commit 9f98fb5ae3
16 changed files with 833 additions and 88 deletions

View file

@ -53,13 +53,13 @@
</div>
<div class="form-group">
<label>Données du contact</label>
<p class="italic small" id="description-datas">
<p class="italic small help" id="description-datas">
Les données d'un contact vous permettent de l'enrichir afin de pouvoir accéder à ces données au sein d'un message via <a href="#">l'utilisation de templates.</a><br/>
Laissez vide si vous ne souhaitez pas renseigner d'informations supplémentaires pour le contact.
Laissez vide si vous ne souhaitez pas renseigner d'informations supplémentaires pour le contact. Utilisez uniquement des lettres, des chiffres et des underscore pour les noms de données, ni espace ni caractères spéciaux.
</p>
<div id="contact-datas-container">
<div class="contact-datas-container">
<div class="form-group">
<input name="" class="form-control contact-data-name" type="text" placeholder="Nom de la donnée">
<input name="" class="form-control contact-data-name" type="text" placeholder="Nom de la donnée" pattern="[a-zA-Z0-9_]*">
:
<input name="" class="form-control contact-data-value" type="text" placeholder="Valeur de la donnée">
</div>
@ -88,40 +88,70 @@
});
jQuery('#contact-datas-container').on('input', '.contact-data-value', function (e)
jQuery('.contact-datas-container').on('input', '.contact-data-value, .contact-data-name', function (e)
{
var focus_group = jQuery(this).parent('.form-group');
var focus_input = this;
var input_name = focus_group.find('.contact-data-name');
var input_value = focus_group.find('.contact-data-value');
jQuery('#contact-datas-container .form-group').each(function (e)
jQuery('.contact-datas-container .form-group').each(function (e)
{
var current_input_name = jQuery(this).find('.contact-data-name');
var current_input_value = jQuery(this).find('.contact-data-value');
if (current_input_value.is(focus_input))
if (current_input_value.is(focus_input) || current_input_name.is(focus_input))
{
return true;
}
if (jQuery(current_input_name).val() !== '' || jQuery(current_input_value).val() !== '')
if (jQuery(current_input_name).val() === '' && jQuery(current_input_value).val() === '')
{
return true;
jQuery(this).remove();
}
jQuery(this).remove();
return true;
});
if (jQuery(focus_input).val() === '')
if (input_name.val() === '' || input_value.val() === '')
{
return true;
}
var template = '' +
'<div class="form-group">' +
'<input name="" class="form-control contact-data-name" type="text" placeholder="Nom de la donnée">' +
'<input name="" class="form-control contact-data-name" type="text" placeholder="Nom de la donnée" pattern="[a-zA-Z0-9_]*">' +
' : ' +
'<input name="" class="form-control contact-data-value" type="text" placeholder="Valeur de la donnée">' +
' <a href="#" class="contact-datas-remove"><span class="fa fa-times"></span></a>' +
'</div>';
jQuery('#contact-datas-container').append(template);
jQuery('.contact-datas-container').append(template);
});
jQuery('.contact-datas-container').on('click', '.contact-datas-remove', function (e)
{
e.preventDefault();
if (jQuery('.contact-datas-container .form-group').length > 1)
{
jQuery(this).parent('.form-group').remove();
}
return false;
});
jQuery('form').on('submit', function (e)
{
e.preventDefault();
jQuery('.contact-datas-container .form-group').each(function ()
{
var name = jQuery(this).find('.contact-data-name').val();
name = name.replace(/\W/g, '');
name = 'datas[' + name + ']';
jQuery(this).find('.contact-data-value').attr('name', name);
});
e.currentTarget.submit();
});
});
</script>

View file

@ -53,6 +53,37 @@
<input name="" class="form-control phone-international-input" type="tel" contact-id="<?php $this->s($contact['id']); ?>" value="<?php $this->s($contact['number']); ?>">
</div>
</div>
<div class="form-group">
<label>Données du contact</label>
<p class="italic small help" id="description-datas">
Les données d'un contact vous permettent de l'enrichir afin de pouvoir accéder à ces données au sein d'un message via <a href="#">l'utilisation de templates.</a><br/>
Laissez vide si vous ne souhaitez pas renseigner d'informations supplémentaires pour le contact. Utilisez uniquement des lettres, des chiffres et des underscore pour les noms de données, ni espace ni caractères spéciaux.
</p>
<div class="contact-datas-container" data-id-contact="<?php $this->s($contact['id']); ?>">
<?php if (!$contact['datas']) { ?>
<div class="form-group">
<input name="" class="form-control contact-data-name" type="text" placeholder="Nom de la donnée" pattern="[a-zA-Z0-9_]*">
:
<input name="" class="form-control contact-data-value" type="text" placeholder="Valeur de la donnée">
</div>
<?php } else {?>
<?php foreach ($contact['datas'] as $name => $data) { ?>
<div class="form-group">
<input name="" class="form-control contact-data-name" type="text" placeholder="Nom de la donnée" pattern="[a-zA-Z0-9_]*" value="<?php $this->s($name); ?>">
:
<input name="" class="form-control contact-data-value" type="text" placeholder="Valeur de la donnée" value="<?php $this->s($data); ?>">
<a href="#" class="contact-datas-remove"><span class="fa fa-times"></span></a>
</div>
<?php } ?>
<div class="form-group">
<input name="" class="form-control contact-data-name" type="text" placeholder="Nom de la donnée" pattern="[a-zA-Z0-9_]*">
:
<input name="" class="form-control contact-data-value" type="text" placeholder="Valeur de la donnée">
<a href="#" class="contact-datas-remove"><span class="fa fa-times"></span></a>
</div>
<?php } ?>
</div>
</div>
<hr/>
<?php } ?>
<a class="btn btn-danger" href="<?php echo \descartes\Router::url('Contact', 'list'); ?>">Annuler</a>
@ -80,6 +111,78 @@
utilsScript: '<?php echo HTTP_PWD_JS; ?>/intlTelInput/utils.js'
});
});
jQuery('.contact-datas-container').on('input', '.contact-data-value, .contact-data-name', function (e)
{
var focus_group = jQuery(this).parent('.form-group');
var focus_input = this;
var input_name = focus_group.find('.contact-data-name');
var input_value = focus_group.find('.contact-data-value');
var datas_container = jQuery(this).parents('.contact-datas-container');
datas_container.find('.form-group').each(function (e)
{
console.log(this);
var current_input_name = jQuery(this).find('.contact-data-name');
var current_input_value = jQuery(this).find('.contact-data-value');
if (current_input_value.is(focus_input) || current_input_name.is(focus_input))
{
return true;
}
if (jQuery(current_input_name).val() === '' && jQuery(current_input_value).val() === '')
{
jQuery(this).remove();
}
return true;
});
if (input_name.val() === '' || input_value.val() === '')
{
return true;
}
var template = '' +
'<div class="form-group">' +
'<input name="" class="form-control contact-data-name" type="text" placeholder="Nom de la donnée" pattern="[a-zA-Z0-9_]*">' +
' : ' +
'<input name="" class="form-control contact-data-value" type="text" placeholder="Valeur de la donnée">' +
' <a href="#" class="contact-datas-remove"><span class="fa fa-times"></span></a>' +
'</div>';
datas_container.append(template);
});
jQuery('.contact-datas-container').on('click', '.contact-datas-remove', function (e)
{
e.preventDefault();
if (jQuery('.contact-datas-container .form-group').length > 1)
{
jQuery(this).parent('.form-group').remove();
}
return false;
});
jQuery('form').on('submit', function (e)
{
e.preventDefault();
jQuery('.contact-datas-container .form-group').each(function ()
{
var contact_id = jQuery(this).parents('.contact-datas-container').attr('data-id-contact');
var name = jQuery(this).find('.contact-data-name').val();
name = name.replace(/\W/g, '');
name = 'contacts[' + contact_id + '][datas][' + name + ']';
jQuery(this).find('.contact-data-value').attr('name', name);
});
e.currentTarget.submit();
});
});
</script>
<?php

View file

@ -18,6 +18,10 @@
<?php } ?>
</script>
<?php } ?>
<?php if (!$_SESSION['user']['settings']['display_help']) { ?>
<style>.help {display: none;}</style>
<?php } ?>
</body>
</html>

View file

@ -40,7 +40,7 @@
<form action="<?php echo \descartes\Router::url('Phone', 'create', ['csrf' => $_SESSION['csrf']]);?>" method="POST">
<div class="form-group">
<label>Numéro de téléphone</label>
<p class="italic small">
<p class="italic small help">
Le numéro de téléphone qui enverra et recevra les messages.
</p>
<div class="form-group">
@ -49,7 +49,7 @@
</div>
<div class="form-group">
<label>Adaptateur logiciel du téléphone : </label>
<p class="italic small" id="description-adapter">
<p class="italic small help" id="description-adapter">
L'adaptateur logiciel utilisé par RaspiSMS pour communiquer avec le téléphone. Pour plus d'information, consultez <a href="https://raspisms.raspberry-pi.fr/documentation" target="_blank">la documentation de RaspiSMS</a> concernant les adaptateurs logiciels.
</p>
<select name="adapter" class="form-control" id="adapter-select">
@ -67,7 +67,7 @@
</div>
<div class="form-group" id="adapter-datas-container">
<label>Configuration de l'adaptateur</label>
<p class="italic small" id="description-adapter-datas">
<p class="italic small help" id="description-adapter-datas">
Les données à fournir à l'adaptateur pour lui permettre de faire la liaison avec le téléphone. Par exemple des identifiants d'API.<br/>
</p>
<textarea id="adapter-datas" name="adapter_datas" class="form-control has-error"></textarea>

View file

@ -39,59 +39,93 @@
<div class="panel-body">
<form action="<?php echo \descartes\Router::url('Scheduled', 'create', ['csrf' => $_SESSION['csrf']]);?>" method="POST">
<div class="form-group">
<label>Texte du SMS</label>
<textarea name="text" class="form-control" required></textarea>
</div>
<div class="form-group">
<label>Date d'envoi du SMS</label>
<input name="at" class="form-control form-datetime" type="text" value="<?php $this->s($now); ?>" readonly>
</div>
<div class="form-group">
<label>Numéros cibles</label>
<div class="form-group scheduleds-number-groupe-container">
<div class="form-group scheduleds-number-groupe">
<input name="" class="form-control phone-international-input" type="tel" >
<span class="remove-scheduleds-number fa fa-times"></span>
</div>
<div class="add-number-button fa fa-plus-circle"></div>
</div>
</div>
<div class="form-group">
<label>Contacts cibles</label>
<input class="add-contacts form-control" name="contacts[]"/>
</div>
<div class="form-group">
<label>Groupes cibles</label>
<input class="add-groupes form-control" name="groups[]"/>
</div>
<?php if ($_SESSION['user']['settings']['sms_flash']) { ?>
<div class="form-group">
<label>Envoyer comme un SMS Flash : </label>
<div class="form-group">
<input name="flash" type="radio" value="1" required /> Oui
<input name="flash" type="radio" value="0" required checked/> Non
</div>
</div>
<?php } ?>
<div class="form-group">
<label>Téléphone à employer : </label>
<select name="origin" class="form-control">
<option value="">N'importe lequel</option>
<?php foreach ($phones as $phone) { ?>
<option value="<?php $this->s($phone['number']); ?>"><?php $this->s($phone['number']); ?></option>
<?php } ?>
</select>
<label>Texte du SMS</label>
<?php if ($_SESSION['user']['settings']['templating']) { ?>
<p class="italic small help description-scheduled-text">
Vous pouvez utilisez des fonctionnalités de templating pour indiquer des valeures génériques qui seront remplacées par les données du contact au moment de l'envoie. Pour plus d'information, consultez la documentation sur <a href="#">l'utilisation des templates.</a><br/>
Vous pouvez obtenir une prévisualisation du résultat pour un contact en cliquant sur le boutton <b>"Prévisualiser"</b>.
</p>
<?php } ?>
<textarea name="text" class="form-control" required></textarea>
<?php if ($_SESSION['user']['settings']['templating']) { ?>
<div class="scheduled-preview-container">
<label>Prévisualiser pour : </label>
<select name="" class="form-control">
<?php foreach ($contacts as $contact) { ?>
<option value="<?php $this->s($contact['id']); ?>"><?php $this->s($contact['name']); ?></option>
<?php } ?>
</select>
<a class="btn btn-info preview-button" href="#">Prévisualiser</a>
</div>
<?php } ?>
</div>
<div class="form-group">
<label>Date d'envoi du SMS</label>
<input name="at" class="form-control form-datetime" type="text" value="<?php $this->s($now); ?>" readonly>
</div>
<div class="form-group">
<label>Numéros cibles</label>
<div class="form-group scheduleds-number-groupe-container">
<div class="form-group scheduleds-number-groupe">
<input name="" class="form-control phone-international-input" type="tel" >
<span class="remove-scheduleds-number fa fa-times"></span>
</div>
<div class="add-number-button fa fa-plus-circle"></div>
</div>
<a class="btn btn-danger" href="<?php echo \descartes\Router::url('Scheduled', 'list'); ?>">Annuler</a>
<input type="submit" class="btn btn-success" value="Enregistrer le SMS" />
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="form-group">
<label>Contacts cibles</label>
<input class="add-contacts form-control" name="contacts[]"/>
</div>
<div class="form-group">
<label>Groupes cibles</label>
<input class="add-groupes form-control" name="groups[]"/>
</div>
<?php if ($_SESSION['user']['settings']['sms_flash']) { ?>
<div class="form-group">
<label>Envoyer comme un SMS Flash : </label>
<div class="form-group">
<input name="flash" type="radio" value="1" required /> Oui
<input name="flash" type="radio" value="0" required checked/> Non
</div>
</div>
<?php } ?>
<div class="form-group">
<label>Numéro à employer : </label>
<select name="origin" class="form-control">
<option value="">N'importe lequel</option>
<?php foreach ($phones as $phone) { ?>
<option value="<?php $this->s($phone['number']); ?>"><?php $this->s($phone['number']); ?></option>
<?php } ?>
</select>
</div>
<a class="btn btn-danger" href="<?php echo \descartes\Router::url('Scheduled', 'list'); ?>">Annuler</a>
<input type="submit" class="btn btn-success" value="Enregistrer le SMS" />
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="modal fade" tabindex="-1" id="scheduled-preview-text-modal">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title">Prévisualisation du message</h4>
</div>
<div class="modal-body">
<pre></pre>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<script>
jQuery(document).ready(function()
{
@ -136,7 +170,7 @@
var newScheduledsNumberGroupe = '' +
'<div class="form-group scheduleds-number-groupe">' +
'<input name="" class="form-control phone-international-input" type="tel" id="' + random_id + '">' +
'<span class="remove-scheduleds-number fa fa-times"></span>' +
' <span class="remove-scheduleds-number fa fa-times"></span>' +
'</div>';
jQuery(this).before(newScheduledsNumberGroupe);
@ -169,6 +203,29 @@
'number_input': number_input,
'iti_number_input': iti_number_input,
});
jQuery('body').on('click', '.preview-button', function (e)
{
e.preventDefault();
var id_contact = jQuery(this).parents('.scheduled-preview-container').find('select').val();
var template = jQuery(this).parents('.form-group').find('textarea').val();
var datas = {
'id_contact' : id_contact,
'template' : template,
};
jQuery.ajax({
type: "POST",
url: HTTP_PWD + '/template/preview',
data: datas,
success: function (datas) {
jQuery('#scheduled-preview-text-modal').find('.modal-body pre').text(datas.result);
jQuery('#scheduled-preview-text-modal').modal({'keyboard': true});
},
dataType: 'json'
});
});
});
</script>
<?php

View file

@ -40,8 +40,25 @@
<form action="<?php echo \descartes\Router::url('Scheduled', 'update', ['csrf' => $_SESSION['csrf']]);?>" method="POST">
<?php foreach ($scheduleds as $scheduled) { ?>
<div class="form-group">
<label>Texte du SMS</label>
<label>Texte du SMS</label>
<?php if ($_SESSION['user']['settings']['templating']) { ?>
<p class="italic small help description-scheduled-text">
Vous pouvez utilisez des fonctionnalités de templating pour indiquer des valeures génériques qui seront remplacées par les données du contact au moment de l'envoie. Pour plus d'information, consultez la documentation sur <a href="#">l'utilisation des templates.</a><br/>
Vous pouvez obtenir une prévisualisation du résultat pour un contact en cliquant sur le boutton <b>"Prévisualiser"</b>.
</p>
<?php } ?>
<textarea name="scheduleds[<?php $this->s($scheduled['id']); ?>][text]" class="form-control" required><?php $this->s($scheduled['text'], true); ?></textarea>
<?php if ($_SESSION['user']['settings']['templating']) { ?>
<div class="scheduled-preview-container">
<label>Prévisualiser pour : </label>
<select name="" class="form-control">
<?php foreach ($contacts as $contact) { ?>
<option value="<?php $this->s($contact['id']); ?>"><?php $this->s($contact['name']); ?></option>
<?php } ?>
</select>
<a class="btn btn-info preview-button" href="#">Prévisualiser</a>
</div>
<?php } ?>
</div>
<div class="form-group">
<label>Date d'envoi du SMS</label>
@ -77,7 +94,7 @@
</div>
<?php } ?>
<div class="form-group">
<label>Téléphone à employer : </label>
<label>Numéro à employer : </label>
<select name="scheduleds[<?php $this->s($scheduled['id']); ?>][origin]" class="form-control">
<option <?php echo ($scheduled['origin'] ? '' : 'selected="selected"'); ?> value="">N'importe lequel</option>
<?php foreach ($phones as $phone) { ?>
@ -97,6 +114,22 @@
</div>
</div>
</div>
<div class="modal fade" tabindex="-1" id="scheduled-preview-text-modal">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title">Prévisualisation du message</h4>
</div>
<div class="modal-body">
<pre></pre>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<script>
jQuery(document).ready(function()
{
@ -150,7 +183,7 @@
var newScheduledsNumberGroupe = '' +
'<div class="form-group scheduleds-number-groupe">' +
'<input name="" class="form-control phone-international-input" type="tel" scheduled-id="' + scheduledId + '" id="' + random_id + '">' +
'<span class="remove-scheduleds-number fa fa-times"></span>' +
' <span class="remove-scheduleds-number fa fa-times"></span>' +
'</div>';
jQuery(this).before(newScheduledsNumberGroupe);
@ -167,7 +200,28 @@
});
jQuery('body').on('click', '.preview-button', function (e)
{
e.preventDefault();
var id_contact = jQuery(this).parents('.scheduled-preview-container').find('select').val();
var template = jQuery(this).parents('.form-group').find('textarea').val();
var datas = {
'id_contact' : id_contact,
'template' : template,
};
jQuery.ajax({
type: "POST",
url: HTTP_PWD + '/template/preview',
data: datas,
success: function (datas) {
jQuery('#scheduled-preview-text-modal').find('.modal-body pre').text(datas.result);
jQuery('#scheduled-preview-text-modal').modal({'keyboard': true});
},
dataType: 'json'
});
});
});
</script>
<?php

View file

@ -108,6 +108,25 @@
</form>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title"><i class="fa fa-question-circle fa-fw"></i> Affichage de l'aide</h4>
</div>
<div class="panel-body">
<form action="<?php echo \descartes\Router::url('Setting', 'update', ['setting_name' => 'display_help', 'csrf' => $_SESSION['csrf']]); ?>" method="POST">
<div class="form-group">
<label>Afficher l'aide : </label>
<select name="setting_value" class="form-control">
<option value="0">Non</option>
<option value="1" <?php echo $_SESSION['user']['settings']['display_help'] ? 'selected' : ''; ?>>Oui</option>
</select>
</div>
<div class="text-center">
<button class="btn btn-success">Mettre à jour les données</button>
</div>
</form>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6">
<div class="panel panel-default">
@ -164,6 +183,25 @@
</form>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title"><i class="fa fa-code fa-fw"></i> Support du templating</h4>
</div>
<div class="panel-body">
<form action="<?php echo \descartes\Router::url('Setting', 'update', ['setting_name' => 'templating', 'csrf' => $_SESSION['csrf']]); ?>" method="POST">
<div class="form-group">
<label>Templating activé : </label>
<select name="setting_value" class="form-control">
<option value="0">Non</option>
<option value="1" <?php echo $_SESSION['user']['settings']['templating'] ? 'selected' : ''; ?>>Oui</option>
</select>
</div>
<div class="text-center">
<button class="btn btn-success">Mettre à jour les données</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>