Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 51
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"></script>
15
16    <style>
17        body {
18            background-color: #f4f6f9;
19            font-family: system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;
20        }
21
22        /* LOGO */
23        .logo-icon {
24            display: none;
25            width: 32px;
26            height: 32px;
27            object-fit: contain;
28        }
29
30        .logo-full {
31            width: 215px;
32            height: auto;
33            object-fit: contain;
34        }
35
36        /* SIDEBAR */
37        .sidebar {
38            width: 260px;
39            height: 100vh;
40            position: fixed;
41            top: 0;
42            left: 0;
43            background: #111827;
44            color: #fff;
45            padding: 15px;
46            overflow-x: hidden;
47            transition: width 0.25s ease;
48        }
49
50        .sidebar a {
51            color: #cbd5e1;
52            text-decoration: none;
53            display: flex;
54            align-items: center;
55            gap: 10px;
56            padding: 12px 14px;
57            border-radius: 8px;
58            white-space: nowrap;
59        }
60
61        .sidebar a:hover {
62            background: #1f2937;
63            color: #fff;
64        }
65
66        /* COLLAPSED */
67        .sidebar.collapsed {
68            width: 70px;
69        }
70
71        .sidebar.collapsed .sidebar-brand {
72            justify-content: center;
73        }
74
75        .sidebar.collapsed .logo-full {
76            display: none !important;
77        }
78
79        .sidebar.collapsed .logo-icon {
80            display: block !important;
81        }
82
83        .sidebar.collapsed a {
84            justify-content: center;
85        }
86
87        .sidebar.collapsed a span,
88        .sidebar.collapsed h4,
89        .sidebar.collapsed .text-uppercase {
90            display: none;
91        }
92
93        /* CONTENT */
94        .content {
95            margin-left: 260px;
96            padding: 20px;
97            transition: margin-left 0.25s ease;
98        }
99
100        .content.expanded {
101            margin-left: 70px;
102        }
103
104        /* TOPBAR */
105        .topbar {
106            background: #fff;
107            padding: 12px 18px;
108            border-radius: 12px;
109            margin-bottom: 20px;
110            box-shadow: 0 2px 10px rgba(0,0,0,0.04);
111        }
112/* SIDEBAR SCROLL ACTIVÉ MAIS INVISIBLE */
113.sidebar {
114    overflow-y: auto;
115
116    /* Firefox */
117    scrollbar-width: none;
118    scrollbar-color: transparent transparent;
119}
120
121/* Chrome / Edge / Safari */
122.sidebar::-webkit-scrollbar {
123    width: 0px;
124    height: 0px;
125}
126
127.sidebar::-webkit-scrollbar-track {
128    background: transparent;
129}
130
131.sidebar::-webkit-scrollbar-thumb {
132    background: transparent;
133    border: none;
134}
135
136    </style>
137</head>
138
139<body>
140
141<!-- SIDEBAR -->
142<div class="sidebar p-3" id="sidebar">
143
144    <div class="d-flex align-items-center gap-2 mb-4 sidebar-brand">
145
146        <img src="<?= base_url('assets/img/logo.png') ?>"
147             class="logo-full"
148             alt="logo">
149
150        <img src="<?= base_url('assets/img/logo-icon.png') ?>"
151             class="logo-icon"
152             alt="icon">
153
154    </div>
155<!-- DASHBOARD -->
156<div class="menu-group mb-3">
157    <a href="<?= base_url('dashboard') ?>">
158        <i class="bi bi-speedometer2"></i><span>Tableau de bord</span>
159    </a>
160</div>
161
162<div class="menu-group mb-3">
163
164    <div class="text-uppercase text-secondary small mb-2 px-2">
165        Gestion des envois
166    </div>
167
168    <!-- ENVOIS -->
169    <a class="d-flex justify-content-between align-items-center"
170       data-bs-toggle="collapse"
171       href="#menu-envois">
172
173        <span>
174            <i class="bi bi-send"></i>
175            Envois
176        </span>
177
178        <i class="bi bi-chevron-down small"></i>
179    </a>
180
181    <div class="collapse ps-4 mt-2" id="menu-envois">
182        <a href="<?= base_url('dashboard/envoi/unique') ?>">Unique</a>
183        <a href="<?= base_url('dashboard/envoi/unique/brouillons') ?>">Brouillons</a>
184        <a href="<?= base_url('dashboard/envoi/unique/envoyes') ?>">Envoyés</a>
185    </div>
186
187    <!-- MASSE -->
188    <a class="d-flex justify-content-between align-items-center"
189       data-bs-toggle="collapse"
190       href="#menu-masse">
191
192        <span>
193            <i class="bi bi-stack"></i>
194            Masse
195        </span>
196
197        <i class="bi bi-chevron-down small"></i>
198    </a>
199
200    <div class="collapse ps-4 mt-2" id="menu-masse">
201
202        <a href="<?= base_url('dashboard/envoi/masse') ?>">
203            Composer
204        </a>
205
206        <a href="<?= base_url('dashboard/envoi/masse/brouillons') ?>">
207            Brouillons
208        </a>
209
210        <a href="<?= base_url('dashboard/envoi/masse/envoyes') ?>">
211            Envoyés
212        </a>
213
214    </div>
215
216    <!-- CAMPAGNE -->
217    <a class="d-flex justify-content-between align-items-center"
218       data-bs-toggle="collapse"
219       href="#menu-campagne">
220
221        <span>
222            <i class="bi bi-megaphone"></i>
223            Campagne
224        </span>
225
226        <i class="bi bi-chevron-down small"></i>
227    </a>
228
229    <div class="collapse ps-4 mt-2" id="menu-campagne">
230
231        <a href="<?= base_url('dashboard/campagnes/lancer') ?>">
232            Lancer
233        </a>
234        <a href="<?= base_url('dashboard/campagnes') ?>">
235            Liste
236        </a>
237
238        <a href="<?= base_url('dashboard/campagne/statistiques') ?>">
239            Statistiques
240        </a>
241
242    </div>
243
244</div>
245
246<!-- CONTACTS -->
247<div class="menu-group mb-3">
248    <div class="text-uppercase text-secondary small mb-2 px-2">
249        Gestion des contacts
250    </div>
251
252 <a href="<?= base_url('dashboard/contacts') ?>">
253    <i class="bi bi-person-lines-fill"></i><span>Contacts</span>
254</a>
255
256<a href="<?= base_url('dashboard/segments') ?>">
257    <i class="bi bi-diagram-2"></i><span>Segments</span>
258</a>
259
260<a href="<?= base_url('dashboard/contact-listes') ?>">
261    <i class="bi bi-list-ul"></i><span>Liste</span>
262</a>
263
264<a href="<?= base_url('dashboard/expediteurs') ?>">
265    <i class="bi bi-hdd-network"></i><span>Expéditeurs</span>
266</a>
267</div>
268
269<!-- COMMUNICATION -->
270<div class="menu-group mb-3">
271    <div class="text-uppercase text-secondary small mb-2 px-2">
272        Communication
273    </div>
274
275    <a href="<?= base_url('dashboard/notification/regles/liste') ?>">
276        <i class="bi bi-diagram-3"></i><span>Règles</span>
277    </a>
278    
279    <a href="<?= base_url('dashboard/notification/regles') ?>">
280        <i class="bi bi-bezier2"></i><span>Rule Builder</span>
281    </a>
282    
283
284
285    <a href="<?= base_url('dashboard/templates') ?>">
286        <i class="bi bi-file-earmark-text"></i><span>Templates</span>
287    </a>
288
289        <a href="<?= base_url('dashboard/templates') ?>">
290        <i class="bi bi-file-earmark-text"></i><span>Modèles</span>
291    </a>
292</div>
293
294<!-- MONITORING -->
295<div class="menu-group mb-3">
296
297    <div class="text-uppercase text-secondary small mb-2 px-2">
298        Monitoring
299    </div>
300
301    <a href="<?= base_url('dashboard/monitoring/overview') ?>">
302        <i class="bi bi-activity"></i><span>Vue globale</span>
303    </a>
304
305    <a href="<?= base_url('dashboard/monitoring/logs') ?>">
306        <i class="bi bi-journal-text"></i><span>Logs</span>
307    </a>
308
309    <a href="<?= base_url('dashboard/monitoring/queue') ?>">
310        <i class="bi bi-hourglass"></i><span>Queue</span>
311    </a>
312
313    <a href="<?= base_url('dashboard/monitoring/success') ?>">
314        <i class="bi bi-check2-circle"></i><span>Succès</span>
315    </a>
316
317    <a href="<?= base_url('dashboard/monitoring/failed') ?>">
318        <i class="bi bi-x-circle"></i><span>Échecs</span>
319    </a>
320
321    <a href="<?= base_url('dashboard/monitoring/stats') ?>">
322        <i class="bi bi-bar-chart-line"></i><span>Statistiques</span>
323    </a>
324
325</div>
326
327
328<!-- =========================
329     SYSTEM ACTIONS (FOOTER)
330========================= -->
331<div class="mt-auto pt-3 border-top">
332
333    <a href="<?= base_url('dashboard/system') ?>"
334       class="btn btn-dark w-100 mb-2 d-flex align-items-center justify-content-center gap-2">
335
336        <i class="bi bi-gear-fill"></i>
337        <span>Système</span>
338    </a>
339
340    <a href="<?= base_url('dashboard/updater') ?>"
341       class="btn btn-primary w-100 mb-2 d-flex align-items-center justify-content-center gap-2">
342
343        <i class="bi bi-arrow-repeat"></i>
344        <span>Mise à jour</span>
345    </a>
346
347    <a href="<?= base_url('dashboard/support') ?>"
348       class="btn btn-success w-100 d-flex align-items-center justify-content-center gap-2">
349
350        <i class="bi bi-life-preserver"></i>
351        <span>Support</span>
352    </a>
353
354</div>
355
356</div>
357
358<!-- CONTENT -->
359<div class="content" id="content">
360
361    <!-- TOPBAR -->
362    <div class="topbar d-flex justify-content-between align-items-center">
363
364        <div class="d-flex align-items-center gap-2">
365            <button class="btn btn-outline-dark btn-sm" id="toggleSidebar">
366                <i class="bi bi-list"></i>
367            </button>
368
369            <h5 class="mb-0"><?= $title ?? 'Tableau de bord' ?></h5>
370        </div>
371
372        <div class="dropdown">
373            <button class="btn btn-dark btn-sm dropdown-toggle" data-bs-toggle="dropdown">
374                Administrateur
375            </button>
376
377            <ul class="dropdown-menu dropdown-menu-end">
378<li class="dropdown-header">Paramàtres globaux</li>
379 <li>
380    <a class="dropdown-item" href="<?= base_url('dashboard/profile') ?>">
381        <i class="bi bi-people"></i> Profile
382    </a>
383</li>
384 <li>
385    <a class="dropdown-item" href="<?= base_url('dashboard/canaux') ?>">
386        <i class="bi bi-gear-wide-connected"></i> Canaux
387    </a>
388</li>
389<li class="dropdown-header">Providers</li>
390
391<li>
392    <a class="dropdown-item" href="<?= base_url('dashboard/fournisseurs/sms') ?>">
393        <i class="bi bi-chat-text"></i> SMS / OTP
394    </a>
395</li>
396
397<li>
398    <a class="dropdown-item" href="<?= base_url('dashboard/fournisseurs/whatsapp') ?>">
399        <i class="bi bi-whatsapp"></i> WhatsApp
400    </a>
401</li>
402
403<li>
404    <a class="dropdown-item" href="<?= base_url('dashboard/fournisseurs/email') ?>">
405        <i class="bi bi-envelope-at"></i> Email
406    </a>
407</li>
408
409<li class="dropdown-header">Intégrations</li>
410<li>
411    <a class="dropdown-item" href="<?= base_url('dashboard/integrations') ?>">
412        <i class="bi bi-plug"></i> Liste
413    </a>
414</li>
415
416<li class="dropdown-divider"></li>
417
418<li class="dropdown-header fw-bold">
419    Orchestration système
420</li>
421
422<li class="px-2 py-1">
423
424    <a href="<?= base_url('dashboard/lancer/cron') ?>"
425       class="btn btn-dark btn-sm w-100 mb-2 d-flex align-items-center justify-content-center gap-2 shadow-sm">
426
427        <i class="bi bi-clock-history"></i>
428        Executer le Cron
429    </a>
430
431    <a href="<?= base_url('dashboard/stream/file') ?>"
432       class="btn btn-primary btn-sm w-100 mb-2 d-flex align-items-center justify-content-center gap-2 shadow-sm">
433
434   <i class="bi bi-cpu"></i>
435Supervision
436    </a>
437
438    <a href="<?= base_url('dashboard/system/queue') ?>"
439       class="btn btn-warning btn-sm w-100 d-flex align-items-center justify-content-center gap-2 shadow-sm">
440
441        <i class="bi bi-list-check"></i>
442        File de traitement
443    </a>
444
445</li>
446<li class="dropdown-divider"></li>
447
448<li class="dropdown-header fw-bold">
449    Partager
450</li>
451
452<li class="px-2 py-1">
453    <button type="button"
454            data-bs-toggle="modal"
455            data-bs-target="#shareAppModal"
456            class="btn btn-warning btn-sm w-100 d-flex align-items-center justify-content-center gap-2 shadow-sm">
457
458        <i class="bi bi-share"></i>
459        Partager l’application
460    </button>
461</li>
462
463<div class="modal fade" id="shareAppModal" tabindex="-1">
464    <div class="modal-dialog modal-dialog-centered">
465        <div class="modal-content">
466
467            <div class="modal-header">
468                <h5 class="modal-title">Partager l’application</h5>
469                <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
470            </div>
471
472            <div class="modal-body text-center">
473
474                <?php $url = base_url(); ?>
475
476                <p class="small text-muted"><?= $url ?></p>
477
478                <div class="d-grid gap-2">
479
480                    <a class="btn btn-success"
481                       href="https://wa.me/?text=<?= urlencode('Application : ' . $url) ?>"
482                       target="_blank">
483                        WhatsApp
484                    </a>
485
486                    <button class="btn btn-secondary" onclick="copyLink()">
487                        Copier le lien
488                    </button>
489
490                </div>
491
492            </div>
493
494        </div>
495    </div>
496</div>
497
498                <li><hr class="dropdown-divider"></li>
499
500                <li>
501                    <form action="/logout" method="post">
502                        <?= csrf_field() ?>
503                        <button class="dropdown-item text-danger" type="submit">
504                            <i class="bi bi-box-arrow-right"></i> Déconnexion
505                        </button>
506                    </form>
507                </li>
508
509            </ul>
510        </div>
511
512    </div>
513
514    <?= $this->renderSection('content') ?>
515
516</div>
517
518<!-- JS -->
519<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
520
521<script>
522    const sidebar = document.getElementById('sidebar');
523    const content = document.getElementById('content');
524    const toggleBtn = document.getElementById('toggleSidebar');
525
526    toggleBtn.addEventListener('click', () => {
527        sidebar.classList.toggle('collapsed');
528        content.classList.toggle('expanded');
529    });
530</script>
531
532</body>
533</html>