Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 50
n/a
0 / 0
CRAP
n/a
0 / 0
1<!DOCTYPE html>
2<html lang="fr">
3<head>
4    <meta charset="UTF-8">
5    <meta name="viewport" content="width=device-width, initial-scale=1">
6
7    <title><?= $title ?? 'Tableau de bord CRM' ?></title>
8
9    <meta name="description" content="Tableau de bord CRM">
10    <meta name="robots" content="noindex, nofollow">
11
12    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
13    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css">
14    <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
15
16    <style>
17        :root {
18            --s-primary: #1a56db;
19        }
20
21        body {
22            background-color: #f4f6f9;
23            font-family: system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;
24        }
25
26        /* ====================== SIDEBAR ====================== */
27        .sidebar {
28            width: 260px;
29            height: 100vh;
30            position: fixed;
31            top: 0;
32            left: 0;
33            background: #111827;
34            color: #fff;
35            padding: 20px 15px;
36            overflow-x: hidden;
37            transition: width 0.25s ease;
38            z-index: 100;
39        }
40
41        .sidebar.collapsed {
42            width: 70px;
43        }
44
45        .sidebar a {
46            color: #cbd5e1;
47            text-decoration: none;
48            display: flex;
49            align-items: center;
50            gap: 10px;
51            padding: 12px 14px;
52            border-radius: 8px;
53            white-space: nowrap;
54            transition: all 0.2s;
55        }
56
57        .sidebar a:hover {
58            background: #1f2937;
59            color: #fff;
60        }
61
62        .sidebar.collapsed a {
63            justify-content: center;
64        }
65
66        .sidebar.collapsed a span,
67        .sidebar.collapsed .text-uppercase {
68            display: none;
69        }
70
71        /* Logo */
72        .logo-full { width: 215px; }
73        .logo-icon { display: none; width: 32px; height: 32px; object-fit: contain; }
74
75        .sidebar.collapsed .logo-full { display: none; }
76        .sidebar.collapsed .logo-icon { display: block; }
77
78        /* ====================== MAIN CONTENT ====================== */
79        .content {
80            margin-left: 260px;
81            padding: 25px 30px;
82            transition: margin-left 0.25s ease;
83            min-height: 100vh;
84        }
85
86        .content.expanded {
87            margin-left: 70px;
88        }
89
90        /* ====================== TOPBAR ====================== */
91        .topbar {
92            background: #fff;
93            padding: 14px 24px;
94            border-radius: 14px;
95            margin-bottom: 24px;
96            box-shadow: 0 4px 14px rgba(0, 0, 0, 0.04);
97            border: 1px solid #f0f2f7;
98        }
99
100        /* ====================== MONITOR WRAP (pour vues enfants) ====================== */
101        .monitor-wrap {
102            max-width: 1800px;
103            margin: 0 auto;
104            padding: 0;
105        }
106
107        /* Scrollbar invisible */
108        .sidebar::-webkit-scrollbar { width: 0; }
109        .sidebar { scrollbar-width: none; }
110    </style>
111</head>
112<body>
113
114<!-- SIDEBAR -->
115<div class="sidebar p-3" id="sidebar">
116
117    <div class="d-flex align-items-center gap-2 mb-4 sidebar-brand">
118        <img src="<?= base_url('assets/img/logo.png') ?>" class="logo-full" alt="logo">
119        <img src="<?= base_url('assets/img/logo-icon.png') ?>" class="logo-icon" alt="icon">
120    </div>
121
122    <!-- DASHBOARD -->
123    <div class="menu-group mb-3">
124        <a href="<?= base_url('dashboard') ?>">
125            <i class="bi bi-speedometer2"></i><span>Tableau de bord</span>
126        </a>
127    </div>
128
129    <!-- GESTION DES ENVOIS -->
130    <div class="menu-group mb-3">
131        <div class="text-uppercase text-secondary small mb-2 px-2">Gestion des envois</div>
132
133        <a data-bs-toggle="collapse" href="#menu-envois">
134            <i class="bi bi-send"></i><span>Envois</span>
135        </a>
136        <div class="collapse ps-4 mt-1" id="menu-envois">
137            <a href="<?= base_url('dashboard/envoi/unique') ?>">Unique</a>
138            <a href="<?= base_url('dashboard/envoi/unique/brouillons') ?>">Brouillons</a>
139            <a href="<?= base_url('dashboard/envoi/unique/envoyes') ?>">Envoyés</a>
140        </div>
141
142        <a data-bs-toggle="collapse" href="#menu-masse">
143            <i class="bi bi-stack"></i><span>Masse</span>
144        </a>
145        <div class="collapse ps-4 mt-1" id="menu-masse">
146            <a href="<?= base_url('dashboard/envoi/masse') ?>">Composer</a>
147            <a href="<?= base_url('dashboard/envoi/masse/brouillons') ?>">Brouillons</a>
148            <a href="<?= base_url('dashboard/envoi/masse/envoyes') ?>">Envoyés</a>
149        </div>
150
151        <a data-bs-toggle="collapse" href="#menu-campagne">
152            <i class="bi bi-megaphone"></i><span>Campagne</span>
153        </a>
154        <div class="collapse ps-4 mt-1" id="menu-campagne">
155            <a href="<?= base_url('dashboard/campagnes/lancer') ?>">Lancer</a>
156            <a href="<?= base_url('dashboard/campagnes') ?>">Liste</a>
157            <a href="<?= base_url('dashboard/campagne/statistiques') ?>">Statistiques</a>
158        </div>
159    </div>
160
161    <!-- GESTION DES CONTACTS -->
162    <div class="menu-group mb-3">
163        <div class="text-uppercase text-secondary small mb-2 px-2">Gestion des contacts</div>
164        <a href="<?= base_url('dashboard/contacts') ?>"><i class="bi bi-person-lines-fill"></i><span>Contacts</span></a>
165        <a href="<?= base_url('dashboard/segments') ?>"><i class="bi bi-diagram-2"></i><span>Segments</span></a>
166        <a href="<?= base_url('dashboard/contact-listes') ?>"><i class="bi bi-list-ul"></i><span>Listes</span></a>
167        <a href="<?= base_url('dashboard/expediteurs') ?>"><i class="bi bi-hdd-network"></i><span>Expéditeurs</span></a>
168    </div>
169
170    <!-- COMMUNICATION -->
171    <div class="menu-group mb-3">
172        <div class="text-uppercase text-secondary small mb-2 px-2">Communication</div>
173        <a href="<?= base_url('dashboard/notification/regles/liste') ?>"><i class="bi bi-diagram-3"></i><span>Règles</span></a>
174        <a href="<?= base_url('dashboard/notification/regles') ?>"><i class="bi bi-bezier2"></i><span>Rule Builder</span></a>
175        <a href="<?= base_url('dashboard/templates') ?>"><i class="bi bi-file-earmark-text"></i><span>Templates</span></a>
176    </div>
177
178    <!-- MONITORING -->
179    <div class="menu-group mb-3">
180        <div class="text-uppercase text-secondary small mb-2 px-2">Monitoring</div>
181        <a href="<?= base_url('dashboard/monitoring/overview') ?>"><i class="bi bi-activity"></i><span>Vue globale</span></a>
182        <a href="<?= base_url('dashboard/monitoring/queue') ?>"><i class="bi bi-hourglass"></i><span>File</span></a>
183        <a href="<?= base_url('dashboard/monitoring/success') ?>"><i class="bi bi-check2-circle"></i><span>Succès</span></a>
184        <a href="<?= base_url('dashboard/monitoring/failed') ?>"><i class="bi bi-x-circle"></i><span>Échecs</span></a>
185        <a href="<?= base_url('dashboard/monitoring/stats') ?>"><i class="bi bi-bar-chart-line"></i><span>Statistiques</span></a>
186        <a href="<?= base_url('dashboard/monitoring/logs') ?>"><i class="bi bi-journal-text"></i><span>Logs</span></a>
187    </div>
188
189    <!-- SYSTEM ACTIONS -->
190    <div class="mt-auto pt-3 border-top">
191        <a href="<?= base_url('dashboard/system') ?>" class="btn btn-dark w-100 mb-2 d-flex align-items-center justify-content-center gap-2">
192            <i class="bi bi-gear-fill"></i><span>Système</span>
193        </a>
194        <a href="<?= base_url('dashboard/updater') ?>" class="btn btn-primary w-100 mb-2 d-flex align-items-center justify-content-center gap-2">
195            <i class="bi bi-arrow-repeat"></i><span>Mise à jour</span>
196        </a>
197        <a href="<?= base_url('dashboard/support') ?>" class="btn btn-success w-100 d-flex align-items-center justify-content-center gap-2">
198            <i class="bi bi-life-preserver"></i><span>Support</span>
199        </a>
200    </div>
201
202</div>
203
204<!-- CONTENT -->
205<div class="content" id="content">
206
207<!-- TOPBAR -->
208<div class="topbar d-flex justify-content-between align-items-center">
209
210    <div class="d-flex align-items-center gap-3">
211        <button class="btn btn-light border px-3 py-2" id="toggleSidebar" style="border-radius: 10px;">
212            <i class="bi bi-list fs-5"></i>
213        </button>
214        <h5 class="mb-0 fw-semibold text-dark"><?= $title ?? 'Tableau de bord' ?></h5>
215    </div>
216
217    <div class="dropdown">
218        <button class="btn btn-light border dropdown-toggle d-flex align-items-center gap-2 px-3 py-2" 
219                data-bs-toggle="dropdown" style="border-radius: 10px;">
220            <i class="bi bi-person-circle fs-5"></i>
221            <span class="fw-medium">Administrateur</span>
222        </button>
223
224        <ul class="dropdown-menu dropdown-menu-end shadow" style="border-radius: 12px; min-width: 280px;">
225
226            <li class="dropdown-header">Paramètres globaux</li>
227            <li>
228                <a class="dropdown-item" href="<?= base_url('dashboard/profile') ?>">
229                    <i class="bi bi-people"></i> Profil
230                </a>
231            </li>
232            <li>
233                <a class="dropdown-item" href="<?= base_url('dashboard/canaux') ?>">
234                    <i class="bi bi-gear-wide-connected"></i> Canaux
235                </a>
236            </li>
237
238            <li class="dropdown-divider"></li>
239            <li class="dropdown-header">Providers</li>
240
241            <li>
242                <a class="dropdown-item" href="<?= base_url('dashboard/fournisseurs/sms') ?>">
243                    <i class="bi bi-chat-text"></i> SMS / OTP
244                </a>
245            </li>
246            <li>
247                <a class="dropdown-item" href="<?= base_url('dashboard/fournisseurs/whatsapp') ?>">
248                    <i class="bi bi-whatsapp"></i> WhatsApp
249                </a>
250            </li>
251            <li>
252                <a class="dropdown-item" href="<?= base_url('dashboard/fournisseurs/email') ?>">
253                    <i class="bi bi-envelope-at"></i> Email
254                </a>
255            </li>
256
257            <li class="dropdown-divider"></li>
258            <li class="dropdown-header">Intégrations</li>
259            <li>
260                <a class="dropdown-item" href="<?= base_url('dashboard/integrations') ?>">
261                    <i class="bi bi-plug"></i> Liste des intégrations
262                </a>
263            </li>
264
265            <li class="dropdown-divider"></li>
266            <li class="dropdown-header fw-bold">Orchestration système</li>
267            <li class="px-3 py-2">
268                <a href="<?= base_url('dashboard/lancer/cron') ?>
269                   class="btn btn-dark btn-sm w-100 mb-2 d-flex align-items-center justify-content-center gap-2">
270                    <i class="bi bi-clock-history"></i> Exécuter le Cron
271                </a>
272                <a href="<?= base_url('dashboard/stream/file') ?>
273                   class="btn btn-primary btn-sm w-100 mb-2 d-flex align-items-center justify-content-center gap-2">
274                    <i class="bi bi-cpu"></i> Supervision
275                </a>
276                <a href="<?= base_url('dashboard/system/queue') ?>
277                   class="btn btn-warning btn-sm w-100 d-flex align-items-center justify-content-center gap-2">
278                    <i class="bi bi-list-check"></i> File de traitement
279                </a>
280            </li>
281
282            <li class="dropdown-divider"></li>
283            <li class="dropdown-header fw-bold">Partager</li>
284            <li class="px-3 py-2">
285                <button type="button" data-bs-toggle="modal" data-bs-target="#shareAppModal"
286                        class="btn btn-warning btn-sm w-100 d-flex align-items-center justify-content-center gap-2">
287                    <i class="bi bi-share"></i> Partager l’application
288                </button>
289            </li>
290
291            <li class="dropdown-divider"></li>
292            <li>
293                <form action="/logout" method="post">
294                    <?= csrf_field() ?>
295                    <button class="dropdown-item text-danger" type="submit">
296                        <i class="bi bi-box-arrow-right"></i> Déconnexion
297                    </button>
298                </form>
299            </li>
300        </ul>
301    </div>
302</div>
303
304<!-- Modal Partager -->
305<div class="modal fade" id="shareAppModal" tabindex="-1">
306    <div class="modal-dialog modal-dialog-centered">
307        <div class="modal-content">
308            <div class="modal-header">
309                <h5 class="modal-title">Partager l’application</h5>
310                <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
311            </div>
312            <div class="modal-body text-center">
313                <?php $url = base_url(); ?>
314                <p class="small text-muted"><?= $url ?></p>
315                <div class="d-grid gap-2">
316                    <a class="btn btn-success" href="https://wa.me/?text=<?= urlencode('Application : ' . $url) ?>" target="_blank">
317                        WhatsApp
318                    </a>
319                    <button class="btn btn-secondary" onclick="copyLink()">Copier le lien</button>
320                </div>
321            </div>
322        </div>
323    </div>
324</div>
325
326    <!-- CONTENU DES VUES ENFANTS -->
327    <?= $this->renderSection('content') ?>
328
329</div>
330
331<!-- JS -->
332<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
333
334<script>
335    const sidebar = document.getElementById('sidebar');
336    const content = document.getElementById('content');
337    const toggleBtn = document.getElementById('toggleSidebar');
338
339    toggleBtn.addEventListener('click', () => {
340        sidebar.classList.toggle('collapsed');
341        content.classList.toggle('expanded');
342    });
343</script>
344
345</body>
346</html>