Crvi/templates/modules/modals/event-modal.php
2026-01-20 21:17:45 +01:00

572 lines
34 KiB
PHP

<?php
// Template du modal d'événement principal pour l'agenda (FullCalendar)
// Contexte : "admin" (par défaut) ou "front_intervenant" (défini côté front).
/** @var string|null $crvi_agenda_context */
$crvi_agenda_context = isset($crvi_agenda_context) ? $crvi_agenda_context : 'admin';
$crvi_is_front_context = ($crvi_agenda_context !== 'admin');
?>
<div class="modal fade" id="eventModal" tabindex="-1" aria-labelledby="eventModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="eventModalLabel">
<i class="fas fa-calendar-alt me-2"></i>Événement
</h5>
<button type="button" class="btn-close" id="closeModalBtn" aria-label="Fermer"></button>
</div>
<div class="modal-body">
<!-- Alerte de statut (absent/présent) -->
<div class="alert alert-warning mb-3" id="statutAlert" style="display: none;">
<i class="fas fa-info-circle me-2"></i>
<span id="statutAlertText"></span>
</div>
<!-- Bloc lecture seule (vue) avec grille Bootstrap en 2 colonnes -->
<div id="eventViewBlock">
<div class="event-grid">
<div class="row">
<!-- Colonne gauche -->
<div class="col-md-6">
<div class="row">
<div class="col-6">
<p class="event-label date"><i class="fas fa-calendar me-2"></i>Date</p>
</div>
<div class="col-6">
<p class="event-value" id="view_date_rdv"></p>
</div>
</div>
<div class="row">
<div class="col-6">
<p class="event-label time"><i class="fas fa-clock me-2"></i>Heure</p>
</div>
<div class="col-6">
<p class="event-value" id="view_heure_rdv"></p>
</div>
</div>
<div class="row">
<div class="col-6">
<p class="event-label type"><i class="fas fa-users me-2"></i>Type</p>
</div>
<div class="col-6">
<p class="event-value" id="view_type"></p>
</div>
</div>
<div class="row">
<div class="col-6">
<p class="event-label language"><i class="fas fa-language me-2"></i>Langue</p>
</div>
<div class="col-6">
<p class="event-value" id="view_langue"></p>
</div>
</div>
<div class="row">
<div class="col-6">
<p class="event-label beneficiary"><i class="fas fa-user me-2"></i>Bénéficiaire</p>
</div>
<div class="col-6">
<p class="event-value" id="view_beneficiaire"></p>
</div>
</div>
<!-- Zone d'alerte d'absence -->
<div class="row">
<div class="col-12">
<div class="alert alert-warning mt-2 mb-3" id="absence_alert" style="font-size: 90%; display: none;">
<i class="fas fa-exclamation-triangle me-2"></i>
Le ou la bénéficiaire ne s'est pas présenté à ses derniers rdvs
</div>
</div>
</div>
<div class="row">
<div class="col-6">
<p class="event-label intervenant"><i class="fas fa-user-md me-2"></i>Intervenant</p>
</div>
<div class="col-6">
<p class="event-value" id="view_intervenant"></p>
</div>
</div>
<div class="row">
<div class="col-6">
<p class="event-label departement"><i class="fas fa-building me-2"></i>Département</p>
</div>
<div class="col-6">
<p class="event-value" id="view_departement"></p>
</div>
</div>
<div class="row">
<div class="col-6">
<p class="event-label type_intervention"><i class="fas fa-tools me-2"></i>Type d'intervention</p>
</div>
<div class="col-6">
<p class="event-value" id="view_type_intervention"></p>
</div>
</div>
</div>
<!-- Colonne droite -->
<div class="col-md-6">
<div class="row">
<div class="col-6">
<p class="event-label translator"><i class="fas fa-language me-2"></i>Traducteur</p>
</div>
<div class="col-6">
<p class="event-value" id="view_traducteur"></p>
</div>
</div>
<div class="row">
<div class="col-6">
<p class="event-label location"><i class="fas fa-map-marker-alt me-2"></i>Local</p>
</div>
<div class="col-6">
<p class="event-value" id="view_local"></p>
</div>
</div>
<div class="row groupe-only-field" style="display: none;">
<div class="col-6">
<p class="event-label participants"><i class="fas fa-users me-2"></i>Participants</p>
</div>
<div class="col-6">
<p class="event-value" id="view_nb_participants"></p>
</div>
</div>
<div class="row groupe-only-field" style="display: none;">
<div class="col-6">
<p class="event-label men"><i class="fas fa-male me-2"></i>Hommes</p>
</div>
<div class="col-6">
<p class="event-value" id="view_nb_hommes"></p>
</div>
</div>
<div class="row groupe-only-field" style="display: none;">
<div class="col-6">
<p class="event-label women"><i class="fas fa-female me-2"></i>Femmes</p>
</div>
<div class="col-6">
<p class="event-value" id="view_nb_femmes"></p>
</div>
</div>
</div>
</div>
<!-- Commentaire sur toute la largeur -->
<div class="row">
<div class="col-12">
<div class="row">
<div class="col-3">
<p class="event-label comment"><i class="fas fa-comment me-2"></i>Commentaire</p>
</div>
<div class="col-9">
<p class="event-value" id="view_commentaire"></p>
</div>
</div>
</div>
</div>
<!-- Informations de clôture -->
<div class="row mt-3" id="cloture_info_section" style="display: none;">
<div class="col-12">
<div class="alert alert-info mb-0">
<div class="row">
<div class="col-12 mb-2">
<strong><i class="fas fa-check-circle me-2"></i>Événement clôturé</strong>
</div>
</div>
<div class="row">
<div class="col-md-6">
<p class="mb-1"><strong>Statut :</strong> <span id="view_statut_cloture"></span></p>
</div>
<div class="col-md-6">
<p class="mb-1"><strong>Clôturé le :</strong> <span id="view_cloture_rdv"></span></p>
</div>
</div>
<div class="row">
<div class="col-12">
<p class="mb-0"><strong>Clôturé par :</strong> <span id="view_cloture_par"></span></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Bloc édition/création (formulaire) -->
<form id="eventForm" style="display:none;">
<div class="row">
<div class="col-md-6">
<div class="mb-3">
<label for="date_rdv" class="form-label">Date de rendez-vous *</label>
<input type="date" class="form-control" id="date_rdv" name="date_rdv" required>
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for="heure_rdv" class="form-label">Heure de début *</label>
<input type="time" class="form-control" id="heure_rdv" name="heure_rdv" min="09:00" max="18:00" step="900" required>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="mb-3">
<label for="date_fin" class="form-label">Date de fin</label>
<input type="date" class="form-control" id="date_fin" name="date_fin">
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for="heure_fin" class="form-label">Heure de fin</label>
<input type="time" class="form-control" id="heure_fin" name="heure_fin" min="09:00" max="18:00" step="900">
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="mb-3">
<label for="type" class="form-label">Type *</label>
<select class="form-select" id="type" name="type" required>
<option value="">Sélectionner...</option>
<option value="individuel">Individuel</option>
<option value="groupe">Groupe</option>
</select>
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for="langue" class="form-label">Langue *</label>
<select class="form-select" id="langue" name="langue" required>
<option value="">Sélectionner...</option>
<?php
if (isset($langues_beneficiaire) && is_array($langues_beneficiaire)) {
foreach ($langues_beneficiaire as $langue) {
$slug = isset($langue['slug']) ? esc_attr($langue['slug']) : '';
$data_slug_attr = !empty($slug) ? ' data-slug="' . $slug . '"' : '';
echo '<option value="' . esc_attr($langue['id']) . '"' . $data_slug_attr . '>' . esc_html($langue['nom']) . '</option>';
}
}
?>
</select>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="mb-3">
<label for="id_departement" class="form-label">Département</label>
<select class="form-select" id="id_departement" name="id_departement">
<option value="">Sélectionner...</option>
<?php
if (isset($departements) && is_array($departements)) {
foreach ($departements as $departement) {
echo '<option value="' . esc_attr($departement['id']) . '">' . esc_html($departement['nom']) . '</option>';
}
}
?>
</select>
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for="id_type_intervention" class="form-label">Type d'intervention</label>
<select class="form-select" id="id_type_intervention" name="id_type_intervention">
<option value="">Sélectionner...</option>
<?php
if (isset($types_intervention) && is_array($types_intervention)) {
foreach ($types_intervention as $type_intervention) {
echo '<option value="' . esc_attr($type_intervention['id']) . '">' . esc_html($type_intervention['nom']) . '</option>';
}
}
?>
</select>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="mb-3">
<label for="id_beneficiaire" class="plus-label form-label">Bénéficiaire *
<?php if ( $crvi_is_front_context || ( ! $crvi_is_front_context && current_user_can( 'manage_options' ) ) ) : ?>
<a href="#" id="createBeneficiaireLink" class="crvi-add-link ms-2" title="Créer un nouveau bénéficiaire"><i class="fas fa-plus me-1"></i>Ajouter</a>
<?php endif; ?>
</label>
<div class="input-group">
<select class="form-select" id="id_beneficiaire" name="id_beneficiaire" required>
<option value="">Sélectionner...</option>
<!-- Options dynamiques via API -->
<?php
if (isset($beneficiaires) && is_array($beneficiaires)) {
foreach ($beneficiaires as $beneficiaire) {
echo '<option value="' . esc_attr($beneficiaire['id']) . '">' . esc_html($beneficiaire['nom']) . '</option>';
}
}
?>
</select>
</div>
<!-- Case à cocher pour ajouter le bénéficiaire à la liste rouge -->
<div class="form-check mt-2" id="liste-rouge-container" style="display: none;">
<input class="form-check-input" type="checkbox" value="1" id="liste_rouge" name="liste_rouge">
<label class="form-check-label" for="liste_rouge">
<i class="fas fa-exclamation-triangle text-danger me-1"></i>Ajouter bénéficiaire à la liste rouge
</label>
</div>
<!-- Alerte liste rouge (s'affiche si le bénéficiaire est en liste rouge) -->
<div class="alert alert-danger mt-2 mb-0" id="beneficiaire-liste-rouge-alert" style="font-size: 90%; display: none;">
<i class="fas fa-exclamation-triangle me-2"></i>
Personne en liste rouge
</div>
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for="id_intervenant" class="plus-label form-label">Intervenant *
<?php if ( ! $crvi_is_front_context && current_user_can( 'manage_options' ) ) : ?>
<a href="#" id="createIntervenantLink" class="crvi-add-link ms-2" title="Créer un nouvel intervenant"><i class="fas fa-plus me-1"></i>Ajouter</a>
<?php endif; ?>
</label>
<div class="input-group">
<?php if ( $crvi_is_front_context ) : ?>
<?php
// En front: si l'utilisateur est admin, utiliser l'ID intervenant simulé (11) et son nom/prénom
$current_user = wp_get_current_user();
if ( current_user_can( 'administrator' ) ) {
$current_intervenant_id = 11;
$sim_user = get_user_by( 'id', $current_intervenant_id );
$sim_name = '';
if ( $sim_user ) {
$sim_name = trim( (string) $sim_user->first_name . ' ' . (string) $sim_user->last_name );
if ( $sim_name === '' ) {
$sim_name = $sim_user->display_name;
}
}
$current_intervenant_name = $sim_name !== '' ? $sim_name : 'Intervenant #11';
} else {
$current_intervenant_id = (int) $current_user->ID;
$current_intervenant_name = trim( $current_user->first_name . ' ' . $current_user->last_name );
if ( $current_intervenant_name === '' ) {
$current_intervenant_name = $current_user->display_name;
}
}
?>
<div class="form-control-plaintext" id="id_intervenant_display"><?php echo esc_html($current_intervenant_name); ?></div>
<input type="hidden" id="id_intervenant" name="id_intervenant" value="<?php echo esc_html($current_intervenant_id); ?>">
<?php else : ?>
<select class="form-select" id="id_intervenant" name="id_intervenant" required>
<option value="">Sélectionner...</option>
<!-- Options dynamiques via API -->
<?php
if (isset($intervenants) && is_array($intervenants)) {
foreach ($intervenants as $intervenant) {
echo '<option value="' . esc_attr($intervenant['id']) . '">' . esc_html($intervenant['nom'] . ' ' . $intervenant['prenom']) . '</option>';
}
}
?>
</select>
<?php endif; ?>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="mb-3">
<label for="id_traducteur" class="plus-label form-label">Traducteur
<?php if ( ! $crvi_is_front_context && current_user_can( 'manage_options' ) ) : ?>
<a href="#" id="createTraducteurLink" class="crvi-add-link ms-2" title="Créer un nouveau traducteur"><i class="fas fa-plus me-1"></i>Ajouter</a>
<?php endif; ?>
</label>
<div class="mb-2">
<label for="nom_traducteur" class="form-label">Nom du traducteur</label>
<input type="text" class="form-control" id="nom_traducteur" name="nom_traducteur" placeholder="Saisir le nom du traducteur">
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="checkbox" value="1" id="use_existing_traducteur" name="use_existing_traducteur">
<label class="form-check-label" for="use_existing_traducteur">
Traducteur existant
</label>
</div>
<div class="input-group d-none" id="traducteur-select-container">
<select class="form-select" id="id_traducteur" name="id_traducteur">
<option value="">Sélectionner...</option>
<!-- Options dynamiques via API -->
<?php
if (isset($traducteurs) && is_array($traducteurs)) {
foreach ($traducteurs as $traducteur) {
// Récupérer les langues parlées du traducteur depuis la taxonomy
$langues_terms = wp_get_post_terms($traducteur['id'], 'langue', ['fields' => 'slugs']);
$langues_slugs = !empty($langues_terms) && !is_wp_error($langues_terms) ? implode(',', $langues_terms) : '';
$data_langue_attr = !empty($langues_slugs) ? ' data-langue="' . esc_attr($langues_slugs) . '"' : '';
echo '<option value="' . esc_attr($traducteur['id']) . '"' . $data_langue_attr . '>' . esc_html($traducteur['nom']) . '</option>';
}
}
?>
</select>
</div>
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for="id_local" class="plus-label form-label">Local *
<?php if ( ! $crvi_is_front_context && current_user_can( 'manage_options' ) ) : ?>
<a href="#" id="createLocalLink" class="crvi-add-link ms-2" title="Créer un nouveau local"><i class="fas fa-plus me-1"></i>Ajouter</a>
<?php endif; ?>
</label>
<div class="input-group">
<select class="form-select" id="id_local" name="id_local" required>
<option value="">Sélectionner...</option>
<!-- Options dynamiques via API -->
<?php
if (isset($locals) && is_array($locals)) {
foreach ($locals as $local) {
echo '<option value="' . esc_attr($local['id']) . '">' . esc_html($local['nom']) . '</option>';
}
}
?>
</select>
</div>
</div>
</div>
</div>
<!-- Champs conditionnels pour les RDV de groupe -->
<div class="row" id="groupeFields" style="display:none;">
<div class="col-md-4">
<div class="mb-3">
<label for="nb_participants" class="form-label">Nombre de participants *</label>
<input type="number" min="1" class="form-control" id="nb_participants" name="nb_participants">
</div>
</div>
<div class="col-md-4">
<div class="mb-3">
<label for="nb_hommes" class="form-label">Nombre d'hommes</label>
<input type="number" min="0" class="form-control" id="nb_hommes" name="nb_hommes">
</div>
</div>
<div class="col-md-4">
<div class="mb-3">
<label for="nb_femmes" class="form-label">Nombre de femmes</label>
<input type="number" min="0" class="form-control" id="nb_femmes" name="nb_femmes">
</div>
</div>
</div>
<div class="mb-3">
<label for="commentaire" class="form-label">Commentaire</label>
<textarea class="form-control" id="commentaire" name="commentaire" rows="3"></textarea>
</div>
<!-- Zone d'alerte d'absence -->
<div class="alert alert-warning mt-2 mb-3" id="absence_alert_edit" style="font-size: 90%; display: none;">
<i class="fas fa-exclamation-triangle me-2"></i>
Le ou la bénéficiaire ne s'est pas présenté à ses derniers rdvs
</div>
<!-- Informations de clôture (mode édition) -->
<div id="cloture_info_section_edit" style="display: none;">
<div class="alert alert-info mb-0">
<div class="row">
<div class="col-12 mb-2">
<strong><i class="fas fa-check-circle me-2"></i>Événement clôturé</strong>
</div>
</div>
<div class="row">
<div class="col-md-6">
<p class="mb-1"><strong>Statut :</strong> <span id="edit_statut_cloture"></span></p>
</div>
<div class="col-md-6">
<p class="mb-1"><strong>Clôturé le :</strong> <span id="edit_cloture_rdv"></span></p>
</div>
</div>
<div class="row">
<div class="col-12">
<p class="mb-0"><strong>Clôturé par :</strong> <span id="edit_cloture_par"></span></p>
</div>
</div>
</div>
</div>
</form>
<!-- Zone d'affichage des erreurs inline -->
<div id="eventFormErrors" class="alert alert-danger d-none" role="alert"></div>
<!-- Boutons de changement de statut rapide (mode édition uniquement) -->
<div id="eventStatusButtons">
<div class="btn-group" role="group">
<button type="button" class="btn btn-success btn-sm" id="markPresentBtn" title="Valider la présence">
<i class="fas fa-user-check me-1"></i>Valider présence
</button>
<button type="button" class="btn btn-warning btn-sm" id="markAbsentBtn" title="Marquer comme absent">
<i class="fas fa-user-times me-1"></i>Absent
</button>
<button type="button" class="btn btn-danger btn-sm" id="cancelAppointmentBtn" title="Annuler le rendez-vous">
<i class="fas fa-times-circle me-1"></i>Annuler RDV
</button>
<?php
// Afficher le bouton Debug SMS si activé dans la config
$debug_sms_enabled = true;
// plugin_dir_path(__FILE__) depuis templates/modules/modals/ donne templates/modules/modals/
// On doit remonter de 3 niveaux pour atteindre la racine du plugin
$cfg_path = plugin_dir_path(__FILE__) . '../../../app/config.php';
if (file_exists($cfg_path)) {
include $cfg_path;
if (isset($debug_sms)) {
$debug_sms_enabled = (bool) $debug_sms;
}
}
if ($debug_sms_enabled) : ?>
<button type="button" class="btn btn-info btn-sm" id="debugSmsBtn" title="Debug SMS">
<i class="fas fa-bug me-1"></i>Debug SMS
</button>
<?php endif; ?>
<button type="button" class="btn btn-warning btn-sm" id="reportIncidentBtn" title="Signaler un incident">
<i class="fas fa-exclamation-triangle me-1"></i>Signaler un incident
</button>
<button type="button" class="btn btn-info btn-sm" id="viewIncidentsBtn" title="Voir les incidents" style="display: none;">
<i class="fas fa-eye me-1"></i>Détail incident(s)
</button>
</div>
</div>
</div>
<div class="modal-footer">
<!-- Boutons pour le mode vue -->
<div id="eventViewFooter">
<button type="button" class="btn btn-secondary" id="closeViewBtn">
<i class="fas fa-times me-2"></i>Fermer
</button>
<button type="button" class="btn btn-primary" id="editEventBtn" style="display:none;">
<i class="fas fa-edit me-2"></i>Modifier
</button>
<button type="button" class="btn btn-info" id="showBeneficiaireHistoriqueBtn" style="display: none;" data-benef="">
<i class="fas fa-history me-2"></i>Historique bénéficiaire
</button>
</div>
<!-- Boutons pour le mode édition/création -->
<div id="eventEditFooter" style="display:none;">
<button type="button" class="btn btn-secondary" id="cancelEditBtn">
<i class="fas fa-arrow-left me-2"></i>Annuler
</button>
<button type="button" class="btn btn-primary" id="saveEvent">
<i class="fas fa-save me-2"></i>Enregistrer
</button>
<button type="button" class="btn btn-danger" id="deleteEvent" style="display: none;">
<i class="fas fa-trash me-2"></i>Supprimer
</button>
</div>
</div>
</div>
</div>
</div>
<script>
// Affichage conditionnel des champs groupe
jQuery(document).ready(function($){
$('#type').on('change', function(){
if($(this).val() === 'groupe') {
$('#groupeFields').show();
$('#nb_participants').attr('required', true);
// Masquer le champ bénéficiaire pour les RDV de groupe
$('#id_beneficiaire').closest('.col-md-6').hide();
$('#id_beneficiaire').removeAttr('required');
} else {
$('#groupeFields').hide();
$('#nb_participants').removeAttr('required');
// Afficher le champ bénéficiaire pour les RDV individuels
$('#id_beneficiaire').closest('.col-md-6').show();
$('#id_beneficiaire').attr('required', true);
}
});
});
</script>