This commit is contained in:
KONE SOREL 2026-03-11 17:23:31 +00:00
parent edf9ecc8ef
commit 31aa30b801
5 changed files with 123 additions and 441 deletions

View File

@ -1483,3 +1483,95 @@ select[class*="selectpicker"],
display: flex !important;
align-items: center;
}
/* Styles sidebar toggle + ligne sélectionnée */
/* ── Ligne DataTable sélectionnée ── */
.table tbody tr.row-selected > td {
background: rgba(26, 107, 74, 0.08) !important;
border-left: 3px solid var(--color-accent, #0abf7c);
}
/* Transitions fluides (doivent être déclarées ici, APRÈS le CSS du template,
pour ne pas être écrasées par Bootstrap/css/style.css) */
/*
#sidebar {
transition: width 0.3s cubic-bezier(.4,0,.2,1),
transform 0.3s cubic-bezier(.4,0,.2,1) !important;
overflow: hidden !important;
will-change: width;
}
*/
/*
#main {
transition: margin-left 0.3s cubic-bezier(.4,0,.2,1) !important;
will-change: margin-left;
}
*/
/* ── Mode réduit (icônes seules) — desktop ── */
body.toggle-sidebar #sidebar {
width: 68px !important;
min-width: 68px !important;
}
body.toggle-sidebar #main {
margin-left: 68px !important;
}
/* Masquer textes et chevrons */
body.toggle-sidebar #sidebar .nav-link span,
body.toggle-sidebar #sidebar .nav-link .bi-chevron-down,
body.toggle-sidebar #sidebar .sidebar-section-label {
opacity: 0;
width: 0;
overflow: hidden;
white-space: nowrap;
display: inline-block; /* garder dans le flux mais invisible — évite le reflow brutal */
transition: opacity 0.2s ease, width 0.2s ease;
}
body:not(.toggle-sidebar) #sidebar .nav-link span,
body:not(.toggle-sidebar) #sidebar .nav-link .bi-chevron-down {
opacity: 1;
width: auto;
transition: opacity 0.25s ease 0.05s, width 0.25s ease;
}
/* Centrer les icônes et agrandir légèrement */
body.toggle-sidebar #sidebar .nav-link {
justify-content: center !important;
padding: 11px 0 !important;
}
body.toggle-sidebar #sidebar .nav-link i:first-child {
font-size: 1.25rem !important;
width: auto !important;
margin: 0 !important;
}
/* Fermer les sous-menus */
body.toggle-sidebar #sidebar .nav-content {
display: none !important;
}
/* Tooltip natif au survol en mode réduit */
body.toggle-sidebar #sidebar .nav-link {
position: relative;
}
/* ── Mobile : slide depuis la gauche ── */
@media (max-width: 1199px) {
#sidebar {
transform: translateX(-100%);
width: var(--sidebar-width, 240px) !important;
}
#sidebar.sidebar-mobile-open {
transform: translateX(0);
}
/* Overlay semi-transparent derrière le sidebar mobile */
#sidebar.sidebar-mobile-open::after {
content: '';
position: fixed;
inset: 0;
background: rgba(0,0,0,0.35);
z-index: -1;
}
#main {
margin-left: 0 !important;
}
}

View File

@ -1,320 +0,0 @@
<!doctype html>
<html lang="fr">
<head>
<meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<base href="<?= $racineWeb ?>" >
<link rel="icon" href="Bootstrap/images/favicon.png"/>
<link href="Bootstrap/css/bootstrap.min.css" rel="stylesheet">
<link href="Bootstrap/css/ajaxmask.css" rel="stylesheet">
<link href="Bootstrap/css/simple-sidebar.css" rel="stylesheet">
<link href="Bootstrap/css/jquery-ui.css" rel="stylesheet">
<link href="Bootstrap/css/style.css?ver=2021.07.23.06" rel="stylesheet">
<link href="Bootstrap/css/datatables.min.css" rel="stylesheet">
<link href="Bootstrap/css/select2.min.css" rel="stylesheet">
<link href="Bootstrap/css/bootstrap-select.min.css" rel="stylesheet">
<!-- <title><?= $titre ?></title> -->
<title><?= $_SESSION['vue'] ?></title>
<script type="text/javascript">
if (document.addEventListener) {
document.addEventListener('contextmenu', function (e) {
e.preventDefault();
}, false);
} else {
document.attachEvent('oncontextmenu', function () {
window.event.returnValue = false;
});
}
</script>
</head>
<body style="width: 98%" >
<!--
actesHarmonises : <?= $_SESSION['actesHarmonises'] ?>
<br>
controlerPlafondAdherent : <?= $_SESSION['controlerPlafondAdherent'] ?>
<br>
controlerPlafondBeneficiaire : <?= $_SESSION['controlerPlafondBeneficiaire'] ?>
-->
<input class="sr-only" type="text" id="racineWeb" name="racineWeb" value="<?= $racineWeb ?>">
<!-- <div class="navbar navbar-inverse navbar-fixed-top" style="font-size:9pt; background-color: red;"> -->
<div class="navbar navbar-inverse navbar-fixed-top" style="font-size:9pt;">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<div id="navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<?php foreach ($menus as $menu): ?>
<li><a style="color: rgb(255,255,255)" href="<?= $menu['lienMenu'] ?>"><?= $menu['libeleMenu']; ?></a></li>
<?php endforeach; ?>
<!--
<li><a style="color:white;">TESTS</a></li>
-->
</ul>
</div>
</div>
</div>
<div class="row content">
<div class="col-xs-1 sidenav">
<ul id ="barre_laterale" class="sidebar-nav" style="background-color: rgb(40,96,144)">
<?php foreach ($menusvue as $menuvue): ?>
<li><a style="color: rgb(255,255,255)" class="btn-link" href="<?= $menuvue['lienMenu'] ?>"><?= $menuvue['libeleMenu']; ?></a></li>
<hr>
<?php endforeach; ?>
</ul>
</div>
<div class="col-xs-10 text-left" style="padding-left:5px; padding-top:0px; padding-right:0px; font-size:8pt;">
<div id="contenu">
<div id="div_test_gabarit">
</div>
<?= $contenu ?>
</div>
</div>
<div id="barre_laterale_d" class="col-xs-1 sidenav" style="font-size:8pt; padding:0px;">
<INPUT class="sr-only" TYPE="button" id="nomClient_C" NAME="nomClient_C" value="<?= $this->nettoyer($_SESSION['nomClient_C']) ?>" onclick="javascript:afficher_client_id();">
<table class="table table-responsive table-condensed" style="font-size:6pt;" >
<thead>
<tr>
<th>Context</th>
</tr>
</thead>
<tbody>
<tr>
<td> <textarea rows="2" cols="25" readonly ><?= $this->nettoyer($_SESSION['nomSociete']) ?></textarea> </td>
</tr>
<tr>
<td><INPUT TYPE="button" TYPE="button" value="<?= substr($this->nettoyer($_SESSION['utilisateur_C']), 0, 25) ?>" ></td>
</tr>
<tr>
<td> <INPUT TYPE="button" id="numeroClient_C" NAME="numeroClient_C" value="<?= _('Client').' : '.$this->nettoyer($_SESSION['numeroClient_C']) ?>" onclick="javascript:afficher_client_id();"></td>
</tr>
<tr>
<td> <textarea rows="3" cols="25" readonly ><?= $this->nettoyer($_SESSION['nomClient_C']) ?></textarea> </td>
</tr>
<tr>
<td><INPUT TYPE="button" id="numeroPolice_C" NAME="numeroPolice_C" value="Pol. <?= $this->nettoyer($_SESSION['numeroPolice_C']) ?>" onclick="javascript:afficher_police_id();"></td>
</tr>
<tr>
<td><INPUT TYPE="button" id="codeGcAssureur_C" NAME="codeGcAssureur_C" value="Garant : <?= $this->nettoyer($_SESSION['codeGcAssureur_C']) ?>" onclick="javascript:afficher_garant('<?=$this->nettoyer($_SESSION['codeGcAssureur_C']);?>');"></td>
</tr>
<tr>
<td><INPUT style="font-size:8pt; background-color: yellow;" TYPE="text" value="<?= $this->nettoyer(format_N($_SESSION['ndAdh_C'])) . " > " . $this->nettoyer(format_N($_SESSION['ndDep_C'])) . " > " . $this->nettoyer(format_N($_SESSION['ndActif_C'])) ?>" readonly ></td>
</tr>
<tr>
<td> <INPUT TYPE="button" id="numeroAdherent_C" NAME="numeroAdherent_C" value="Fam. <?= $this->nettoyer($_SESSION['numeroAdherent_C']) ?>" onclick="javascript:afficher_adherent_id();"></td>
</tr>
<tr>
<td> <INPUT TYPE="button" id="adherent_C" NAME="adherent_C" value="<?= substr($this->nettoyer($_SESSION['adherent_C']), 0, 25) ?>" onclick="javascript:afficher_adherent_id();"></td>
</tr>
<tr>
<td> <INPUT TYPE="button" id="numeroBeneficiaire_C" NAME="numeroBeneficiaire_C" value="<?= _('Dép').' : '.$this->nettoyer($_SESSION['numeroBeneficiaire_C']) ?>" onclick="javascript:afficher_beneficiaire_id();"></td>
</tr>
<tr>
<td> <INPUT TYPE="button" id="beneficiaire_C" NAME="beneficiaire_C" value="<?= substr($this->nettoyer($_SESSION['beneficiaire_C']), 0, 25) ?>" onclick="javascript:afficher_beneficiaire_id();"></td>
</tr>
<tr>
<td>
<?php if ($_SESSION['lienPhoto_C']>" " ): ?>
<img src="<?= $_SESSION['dossierSociete'].'/Photos/'.$_SESSION['lienPhoto_C'] ?>" style="width: 100px;" data-toggle="modal" data-target="#pop_photo">
<?php endif; ?>
</td>
</tr>
<tr>
<td> <a href="Changermotpass/"><img src="Bootstrap/images/cle.png" alt="Changer mot de passe"> </a> </td>
</tr>
<tr>
<td><INPUT style="font-size:8pt;" TYPE="button" TYPE="button" value="Lang : <?= $this->nettoyer($_SESSION['libelleLang']) ?>" ></td>
</tr>
<tr>
<td> <INPUT class="btn btn-warning" style="font-size:8pt;" TYPE="button" value="Chang Lang" onclick="javascript:changer_langue();" > </td>
</tr>
<tr>
<td> <INPUT class="btn btn-info" style="font-size:8pt;" TYPE="button" value="<?= _('Test Connexion?') ?>" onclick="javascript:test_online();" > </td>
</tr>
<tr>
<td><INPUT id="test_connexion" NAME="test_connexion" style="font-size:11pt; background-color: green;" TYPE="text" value="<?= _('Etat Connexion') ?>" readonly ></td>
</tr>
</tbody>
</table>
<?php if ($_SESSION['modeDevis']=="1"): ?>
<table class="table table-responsive table-condensed" style="font-size:6pt;" >
<thead>
<tr>
<th> <?= _("Devis") ?> </th>
</tr>
</thead>
<tbody>
<tr>
<td> <INPUT TYPE="button" id="numeroClient_d_C" NAME="numeroClient_d_C" value="Prosp : <?= $this->nettoyer($_SESSION['numeroClient_d_C']) ?>" onclick="javascript:afficher_client_d_id();"></td>
</tr>
<tr>
<td> <INPUT TYPE="button" id="nomClient_d_C" NAME="nomClient_d_C" value="<?= $this->nettoyer($_SESSION['nomClient_d_C']) ?>" onclick="javascript:afficher_client_d_id();"></td>
</tr>
<tr>
<td><INPUT TYPE="button" id="numeroPolice_d_C" NAME="numeroPolice_d_C" value="<?= $this->nettoyer($_SESSION['numeroPolice_d_C']) ?>" onclick="javascript:afficher_police_d_id_init();"></td>
</tr>
</tbody>
</table>
<?php endif; ?>
<footer class="container-fluid text-center" style="padding-left:0px; padding-top:0px; padding-right:0px;padding-bottom:5px; font-size:10pt;">
Messages
<div id="nbMessagesNonLus" name="nbMessagesNonLus">
<INPUT class='form-control timer' id="timer" NAME="timer" TYPE="button" value="0" onclick="javascript:pop_messagerie();" >
</div>
<INPUT class="form-control btn btn-primary" style="font-size:7pt;" TYPE="button" value="<?= _("Gérer Messages") ?>" onclick="javascript:gerer_messagerie();" >
</footer>
</div>
</div>
<button id="btn_pop_messagerie" NAME="btn_pop_messagerie" type="button" class="sr-only" data-toggle="modal" data-target="#popmessagerie"> <?= _("Afficher les messages non lus...") ?> </button>
<div class="modal fade" id="popmessagerie" role="dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"> <?= _("Fermer") ?> </button>
<h4 class="modal-title"> <?= _("Messages non lus") ?> </h4>
</div>
<div class="modal-body">
<div id="div_messagerie">
</div>
</div>
<div class="modal-footer">
<button id="btn_close_messagerie" NAME="btn_close_messagerie" type="button" class="btn btn-default" data-dismiss="modal"> <?= _("Fermer") ?> </button>
</div>
</div>
</div>
</div>
<script src="Bootstrap/js/jquery.min.js"></script>
<script src="Bootstrap/js/jquery-ui.js"></script>
<script src="Bootstrap/js/timer.jquery.js"></script>
<script src="Bootstrap/js/bootstrap.min.js"></script>
<?php if (est_anglophone()) : ?>
<script src="Js/datepicker-eng.js"></script>
<?php else: ?>
<script src="Js/datepicker-fr.js"></script>
<?php endif; ?>
<script src="Js/fonctions.js?ver=2021.10.25.09"></script>
<script src="<?= $_SESSION['dossierSociete'].'/Js/societe.js' ?>"></script>
<script src="Bootstrap/js/jquery.timer.js"></script>
<script src="Bootstrap/js/ajaxmask.js"></script>
<script src="Bootstrap/js/custom.js"></script>
<script src="Bootstrap/js/datatables.min.js"></script>
<script src="Bootstrap/js/select2.min.js"></script>
<script src="Bootstrap/js/bootstrap-select.min.js"></script>
<div id="div_ajaxgabarit">
</div>
<div class="modal fade" id="pop_photo" role="dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button id="btn_close_pop" name="btn_close_pop" type="button" class="close" data-dismiss="modal"> <?= _("Fermer") ?> </button>
<h4 class="modal-title"> <?= _("Photo") ?> </h4>
</div>
<div class="modal-body">
<img src="<?= $_SESSION['dossierSociete'].'/Photos/'.$_SESSION['lienPhoto_C'] ?>" style="width: 350px;">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal"> <?= _("Fermer") ?> </button>
</div>
</div>
</div>
</div>
<script type="text/javascript">
raffraichier_gabarit();
</script>
<script type="text/javascript">
$('#timer').timer({
// duration: '1m',
duration: '10s',
callback: function() {
raffraichier_messagerie();
},
repeat: true
});
</script>
<div id="div_gettext" class="sr-only">
<?= _("Retour") ?>
</div>
</body>
</html>

View File

@ -48120,13 +48120,11 @@ function filtreTableReference(numeroTable) {
const racineWeb = $("#racineWeb").val();
const $divListe = $("#div_listetables");
// 1. DESTRUCTION TOTALE de l'existant
// Nettoyage radical
if ($("#listetables").length) {
$("#listetables").selectpicker('destroy'); // Tue l'instance JS
$("#listetables").selectpicker('destroy');
}
// Supprime physiquement tous les menus détachés du body
$('.bootstrap-select.bs-container').remove();
// Vide le conteneur pour repartir de zéro
$divListe.empty();
$.ajax({
@ -48134,35 +48132,30 @@ function filtreTableReference(numeroTable) {
type : 'post',
data: { numeroTable: numeroTable },
success: function(data) {
// 1. On injecte le HTML brut
$divListe.html(data);
// Injection du HTML
$divListe.html(data);
const $select = $("#listetables");
const $select = $("#listetables");
// 2. NETTOYAGE CHIRURGICAL des options
// On force le texte à être propre et on supprime l'attribut title
// qui cause souvent le doublon dans le rendu du plugin
$select.find('option').each(function() {
const propre = $(this).text().trim();
$(this).text(propre); // Nettoie le texte interne
$(this).attr('data-content', ''); // Supprime d'éventuels attributs parasites
$(this).removeAttr('title'); // Supprime le titre qui double le rendu
});
// On retire la classe 'selectpicker' temporairement pour éviter
// que le script global ne l'attrape avant nous
$select.removeClass('selectpicker');
// 3. INITIALISATION avec paramètres de sécurité
$select.selectpicker({
liveSearch: true,
size: 10,
container: 'body',
style: 'btn-form-select', // Utilise votre classe de style
noneSelectedText: (typeof _ !== 'undefined') ? _("-- Sélectionner --") : "-- Sélectionner --"
});
setTimeout(function() {
$select.selectpicker({
liveSearch: true,
size: 10,
container: 'body',
width: '100%'
});
// On remet la classe après initialisation si nécessaire pour le CSS
$select.addClass('selectpicker');
// 4. Focus UX
setTimeout(function() {
$divListe.find('.dropdown-toggle').focus();
}, 200);
}
// Focus sur le bouton généré
$divListe.find('.dropdown-toggle').focus();
}, 100);
}
});
}

View File

@ -2,7 +2,7 @@
/*
* INTER SANTÉ gabarit.php
* Point d'entrée principal Structure modulaire SaaS Premium
* Refonte UI/UX v2025
* Refonte UI/UX v2026
*/
require_once 'gabarit_queries.php';

View File

@ -96,9 +96,15 @@
});
}
/* --- Bootstrap Select global --- */
/* --- Bootstrap Select global (Version Corrigée) --- */
if ($.fn.selectpicker) {
$('select.selectpicker').selectpicker('refresh');
// On n'utilise plus 'refresh' à l'aveugle sur tout ce qui bouge
// On laisse les fonctions spécifiques gérer leurs propres instances
$('.selectpicker').each(function() {
if (!$(this).parent().hasClass('bootstrap-select')) {
$(this).selectpicker();
}
});
}
/* --- Sidebar toggle ---
@ -151,94 +157,5 @@
}); // end document.ready
</script>
<!-- Styles sidebar toggle + ligne sélectionnée -->
<style>
/* ── Ligne DataTable sélectionnée ── */
.table tbody tr.row-selected > td {
background: rgba(26, 107, 74, 0.08) !important;
border-left: 3px solid var(--color-accent, #0abf7c);
}
/* ── Transitions fluides (doivent être déclarées ici, APRÈS le CSS du template,
pour ne pas être écrasées par Bootstrap/css/style.css) ── */
#sidebar {
transition: width 0.3s cubic-bezier(.4,0,.2,1),
transform 0.3s cubic-bezier(.4,0,.2,1) !important;
overflow: hidden !important;
will-change: width;
}
#main {
transition: margin-left 0.3s cubic-bezier(.4,0,.2,1) !important;
will-change: margin-left;
}
/* ── Mode réduit (icônes seules) — desktop ── */
body.toggle-sidebar #sidebar {
width: 68px !important;
min-width: 68px !important;
}
body.toggle-sidebar #main {
margin-left: 68px !important;
}
/* Masquer textes et chevrons */
body.toggle-sidebar #sidebar .nav-link span,
body.toggle-sidebar #sidebar .nav-link .bi-chevron-down,
body.toggle-sidebar #sidebar .sidebar-section-label {
opacity: 0;
width: 0;
overflow: hidden;
white-space: nowrap;
display: inline-block; /* garder dans le flux mais invisible — évite le reflow brutal */
transition: opacity 0.2s ease, width 0.2s ease;
}
body:not(.toggle-sidebar) #sidebar .nav-link span,
body:not(.toggle-sidebar) #sidebar .nav-link .bi-chevron-down {
opacity: 1;
width: auto;
transition: opacity 0.25s ease 0.05s, width 0.25s ease;
}
/* Centrer les icônes et agrandir légèrement */
body.toggle-sidebar #sidebar .nav-link {
justify-content: center !important;
padding: 11px 0 !important;
}
body.toggle-sidebar #sidebar .nav-link i:first-child {
font-size: 1.25rem !important;
width: auto !important;
margin: 0 !important;
}
/* Fermer les sous-menus */
body.toggle-sidebar #sidebar .nav-content {
display: none !important;
}
/* Tooltip natif au survol en mode réduit */
body.toggle-sidebar #sidebar .nav-link {
position: relative;
}
/* ── Mobile : slide depuis la gauche ── */
@media (max-width: 1199px) {
#sidebar {
transform: translateX(-100%);
width: var(--sidebar-width, 240px) !important;
}
#sidebar.sidebar-mobile-open {
transform: translateX(0);
}
/* Overlay semi-transparent derrière le sidebar mobile */
#sidebar.sidebar-mobile-open::after {
content: '';
position: fixed;
inset: 0;
background: rgba(0,0,0,0.35);
z-index: -1;
}
#main {
margin-left: 0 !important;
}
}
</style>
</body>
</html>