templates/base.html.twig line 1

Open in your IDE?
  1. <!DOCTYPE html>
  2. {% set userTheme = app.user ? app.user.theme : 'default' %}
  3. {% if userTheme starts with 'system:' %}
  4.     {% set lightTheme = userTheme|slice(7) ?: 'default' %}
  5. <html lang="en" data-theme="{{ lightTheme }}" data-theme-mode="system" data-theme-light="{{ lightTheme }}">
  6. {% else %}
  7. <html lang="en" data-theme="{{ userTheme }}">
  8. {% endif %}
  9.     <head>
  10.         <title>
  11.             Evapi ERP
  12.             {% block title %}{% endblock %}
  13.         </title>
  14.         <meta charset="utf-8"/>
  15.         <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
  16.         <meta
  17.         name="viewport" content="width=device-width, initial-scale=1"/>
  18.         <!-- Favicon -->
  19.         {% set faviconRelativePath = 'https://serveur-images.devil-it-applications.fr/evapi/logo/favicon' %}
  20.         {% block stylesheets %}
  21.             <link rel="shortcut icon" href="{{ faviconRelativePath }}/favicon.ico" type="image/x-icon"/>
  22.             <link rel="apple-touch-icon" sizes="180x180" href="{{ faviconRelativePath }}/apple-touch-icon.png"/>
  23.             <link rel="icon" type="image/png" sizes="192x192" href="{{ faviconRelativePath }}/android-chrome-192x192.png"/>
  24.             <link rel="icon" type="image/png" sizes="512x512" href="{{ faviconRelativePath }}/android-chrome-512x512.png"/>
  25.             <link rel="icon" type="image/png" sizes="32x32" href="{{ faviconRelativePath }}/favicon-32x32.png"/>
  26.             <link rel="icon" type="image/png" sizes="16x16" href="{{ faviconRelativePath }}/favicon-16x16.png"/>
  27.             <link rel="manifest" href="{{ faviconRelativePath }}/site.webmanifest"/>
  28.             <link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/smoothness/jquery-ui.css"/>
  29.             <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined"/>
  30.             <script src="{{ asset('assets/node_modules/jquery/dist/jquery.min.js') }}"></script>
  31.             <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
  32.             <script src="{{ asset('assets/node_modules/js-cookie/dist/js.cookie.min.js') }}"></script>
  33.             <script>
  34.                 // System theme detection - runs immediately to prevent flash
  35.                 (function() {
  36.                     var html = document.documentElement;
  37.                     var themeMode = html.getAttribute('data-theme-mode');
  38.                     if (themeMode === 'system') {
  39.                         var lightTheme = html.getAttribute('data-theme-light') || 'default';
  40.                         var prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
  41.                         html.setAttribute('data-theme', prefersDark ? 'dark' : lightTheme);
  42.                         // Listen for system theme changes
  43.                         window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function(e) {
  44.                             if (html.getAttribute('data-theme-mode') === 'system') {
  45.                                 html.setAttribute('data-theme', e.matches ? 'dark' : lightTheme);
  46.                             }
  47.                         });
  48.                     }
  49.                 })();
  50.             </script>
  51.             <script>
  52.                 // Create a <link> element for each non-critical CSS file
  53. var assetUrl = "{{ asset('') }}"
  54. var cssFiles = [
  55. 'assets/node_modules/dropify/dist/css/dropify.min.css',
  56. 'assets/node_modules/bootstrap/dist/css/bootstrap.min.css',
  57. 'assets/node_modules/perfect-scrollbar/dist/css/perfect-scrollbar.min.css',
  58. 'assets/node_modules/select2/dist/css/select2.min.css',
  59. 'assets/node_modules/bootstrap-select/dist/css/bootstrap-select.min.css',
  60. 'assets/node_modules/magnific-popup/dist/magnific-popup.css',
  61. 'assets/plugins/jquery-asColorPicker-master/dist/css/asColorPicker.min.css',
  62. 'assets/plugins/datatables/media/css/dataTables.bootstrap4.min.css',
  63. 'assets/plugins/html5-editor/bootstrap-wysihtml5.min.css',
  64. 'assets/node_modules/chartist/dist/chartist.min.css',
  65. 'assets/plugins/chartist-plugin-tooltip-master/dist/chartist-plugin-tooltip.min.css',
  66. 'assets/plugins/footable/css/footable.bootstrap.min.css',
  67. 'assets/node_modules/daterangepicker/daterangepicker.css',
  68. 'assets/node_modules/dropzone/dist/min/dropzone.min.css',
  69. 'assets/node_modules/c3/c3.min.css',
  70. 'assets/plugins/toast-master/css/jquery.toast.min.css',
  71. 'assets/plugins/x-editable/dist/bootstrap3-editable/css/bootstrap-editable.min.css',
  72. 'assets/plugins/html5-editor/bootstrap-wysihtml5.min.css',
  73. 'assets/plugins/nestable/nestable.min.css',
  74. 'assets/node_modules/sweetalert2/dist/sweetalert2.min.css'
  75. ]
  76. // Function to asynchronously load CSS files
  77. function loadCSS(url) {
  78. var link = document.createElement('link')
  79. link.rel = 'stylesheet'
  80. link.href = assetUrl + url
  81. document.head.appendChild(link)
  82. }
  83. // Load each CSS file asynchronously
  84. cssFiles.forEach(function (url) {
  85. loadCSS(url)
  86. })
  87.             </script>
  88.             <!-- Custom Style -->
  89.             <link href="{{ asset('assets/css/style.css') }}" rel="stylesheet"/>
  90.             {# <link href="{{ asset('assets/css/pages/tab-page.css') }}" rel="stylesheet" /> #}
  91.             {# <link href="{{ asset('assets/css/pages/dashboard1.css') }}" rel="stylesheet" /> #}
  92.             {# <link href="{{ asset('assets/css/pages/footable-page.css') }}" rel="stylesheet" /> #}
  93.             {# <link href="{{ asset('assets/css/pages/card-page.css') }}" rel="stylesheet" /> #}
  94.             <link
  95.             href="{{ asset('assets/css/colors/default-dark.css') }}" id="theme" rel="stylesheet"/> <!-- Override Style -->
  96.             <link href="{{ asset('assets/css/overrides/stylesheet.css') }}" rel="stylesheet"/>
  97.             <link href="{{ asset('assets/css/overrides/theme.css') }}" rel="stylesheet"/>
  98.             <script src="{{ asset('assets/node_modules/tinymce/tinymce.min.js') }}"></script>
  99.             <script src="{{ asset('assets/node_modules/tinymce-i18n/langs7/fr_FR.js') }}"></script>
  100.             <script src="{{ asset('assets/node_modules/sortablejs/Sortable.min.js') }}"></script>
  101.         {% endblock %}
  102.     </head>
  103.     {% block body %}
  104.         <body id="{{ app.request.get('_route') ? : 'home' }}">
  105.             <script>
  106.                 // Detect if page is loaded in iframe and add class to body
  107.                 if (window.self !== window.top) {
  108.                     document.body.classList.add('in-iframe');
  109.                 }
  110.             </script>
  111.             <div id="main-wrapper" class=" page">
  112.                 {% block sidebar %}
  113.                     {% include 'layout/sidebar.html.twig' %}
  114.                 {% endblock %}
  115.                 {% block topbar %}
  116.                     <header class="topbar">
  117.                         <div class="container">
  118.                             <div class="topbar__content">
  119.                                 <div class="topbar__col">
  120.                                     <div class="topbar__toggler">
  121.                                         <a class="topbar__toggler-mobile nav-toggler hidden-lg-up" href="javascript:void(0)">
  122.                                             <span class="material-symbols-outlined">menu</span>
  123.                                         </a>
  124.                                         <a class="topbar__toggler-desktop sidebartoggler hidden-lg-down" href="javascript:void(0)">
  125.                                             <span class="material-symbols-outlined">menu_open</span>
  126.                                         </a>
  127.                                     </div>
  128.                                     {% block heading %}{% endblock %}
  129.                                 </div>
  130.                                 <div class="topbar__col">
  131.                                     <div class="tab-actions">
  132.                                         <button id="bulkEditBtn" class="btn btn-primary">
  133.                                             <span class="material-symbols-outlined">edit</span>
  134.                                             Modifier en masse</button>
  135.                                         <div class="bulk-btn-group">
  136.                                             <button id="bulkSaveBtn" type="button" class="btn btn-primary">
  137.                                                 <span class="material-symbols-outlined">save</span>
  138.                                                 Enregistrer Tous</a>
  139.                                             <button id="bulkCancelBtn" type="button" class="btn btn-danger">
  140.                                                 <span class="material-symbols-outlined">cancel</span>
  141.                                                 Annuler
  142.                                             </a>
  143.                                         </div>
  144.                                     </div>
  145.                                     <div class="topbar__language dropdown d-none">
  146.                                         <a class="topbar__language-link" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  147.                                             <i class="icon icon__img--fr"></i>
  148.                                         </a>
  149.                                         <div class="dropdown-menu">
  150.                                             <a class="dropdown-item" href="#">
  151.                                                 <i class="icon icon__img--uk"></i>
  152.                                                 English</a>
  153.                                             <a class="dropdown-item" href="#">
  154.                                                 <i class="icon icon__img--fr"></i>
  155.                                                 French</a>
  156.                                         </div>
  157.                                     </div>
  158.                                     <div class="topbar__profile">
  159.                                         {% if app.user %}
  160.                                             {% set initials = (app.user.prenom|first) ~ (app.user.nom|first) %}
  161.                                             <div class="topbar__profile-initials">{{ initials }}</div>
  162.                                             <div class="topbar__profile-text">
  163.                                                 <h5 class="topbar__profile-text__name">
  164.                                                     <span>{{ app.user.prenom }} {{ app.user.nom }}</span>
  165.                                                 </h5>
  166.                                                 <p class="topbar__profile-text__mail">{{ app.user.email }}</p>
  167.                                             </div>
  168.                                             <a class="topbar__logout-btn" href="{{ path('app_logout') }}" title="Déconnexion">
  169.                                                 <span class="material-symbols-outlined">logout</span>
  170.                                             </a>
  171.                                         {% endif %}
  172.                                     </div>
  173.                                 </div>
  174.                             </div>
  175.                         </div>
  176.                     </header>
  177.                     <script src="{{ asset('assets/js/components/layout.js') }}"></script>
  178.                 {% endblock %}
  179.                 <div class="page-wrap">
  180.                     <div class="page-grid">
  181.                         <div class="page-content">
  182.                             <div class="container">
  183.                                 {% block content %}{% endblock %}
  184.                             </div>
  185.                         </div>
  186.                     </div>
  187.                     {% block footer %}
  188.                         {% include 'layout/footer.html.twig' %}
  189.                     {% endblock %}
  190.                 </div>
  191.             </div>
  192.             {% block javascripts %}
  193.                 <!-- npm scripts -->
  194.                 <script src="{{ asset('assets/node_modules/sweetalert2/dist/sweetalert2.min.js') }}"></script>
  195.                 <script src="{{ asset('assets/node_modules/clipboard/dist/clipboard.min.js') }}"></script>
  196.                 <script src="{{ asset('assets/node_modules/sortablejs/Sortable.min.js') }}"></script>
  197.                 <script src="{{ asset('assets/node_modules/mathjs/lib/browser/math.js') }}"></script>
  198.                 <script src="https://cdn.jsdelivr.net/npm/jquery-sortablejs@latest/jquery-sortable.min.js"></script>
  199.                 <!-- Plugin scripts -->
  200.                 <script src="{{ asset('assets/node_modules/popper.js/dist/umd/popper.min.js') }}"></script>
  201.                 <script src="{{ asset('assets/node_modules/bootstrap/dist/js/bootstrap.bundle.min.js') }}"></script>
  202.                 <script src="{{ asset('assets/node_modules/moment/min/moment.min.js') }}"></script>
  203.                 <script src="{{ asset('assets/plugins/footable/js/footable.min.js') }}"></script>
  204.                 <script src="{{ asset('assets/node_modules/dropify/dist/js/dropify.min.js') }}"></script>
  205.                 <script src="{{ asset('assets/plugins/sparkline/jquery.sparkline.min.js') }}"></script>
  206.                 <script src="{{ asset('assets/node_modules/chartist/dist/chartist.min.js') }}"></script>
  207.                 <script src="{{ asset('assets/plugins/chartist-plugin-tooltip-master/dist/chartist-plugin-tooltip.min.js') }}"></script>
  208.                 <script src="{{ asset('assets/plugins/x-editable/dist/bootstrap3-editable/js/bootstrap-editable.min.js') }}"></script>
  209.                 <script src="{{ asset('assets/node_modules/d3/d3.min.js') }}"></script>
  210.                 <script src="{{ asset('assets/node_modules/c3/c3.min.js') }}"></script>
  211.                 <script src="{{ asset('assets/node_modules/dropzone/dist/min/dropzone.min.js') }}"></script>
  212.                 <script src="{{ asset('assets/node_modules/daterangepicker/daterangepicker.js') }}"></script>
  213.                 <script src="{{ asset('assets/node_modules/select2/dist/js/select2.full.min.js') }}"></script>
  214.                 <script src="{{ asset('assets/plugins/multiselect/js/jquery.multi-select.min.js') }}"></script>
  215.                 <script src="{{ asset('assets/node_modules/bootstrap-select/dist/js/bootstrap-select.min.js') }}"></script>
  216.                 <script src="{{ asset('assets/plugins/datatables/datatables.min.js') }}"></script>
  217.                 <script src="{{ asset('assets/node_modules/magnific-popup/dist/jquery.magnific-popup.min.js') }}"></script>
  218.                 <script src="{{ asset('assets/js/plugins/magnific-popup-init.min.js') }}"></script>
  219.                 <script src="{{ asset('assets/plugins/toast-master/js/jquery.toast.min.js') }}"></script>
  220.                 <script src="{{ asset('assets/node_modules/jquery-validation/dist/jquery.validate.min.js') }}"></script>
  221.                 <script src="{{ asset('assets/node_modules/htmx.org/dist/htmx.min.js') }}"></script>
  222.             <!-- Custom scripts -->
  223.                 <script src="{{ asset('assets/js/plugins/perfect-scrollbar.jquery.min.js') }}"></script>
  224.                 <script src="{{ asset('assets/js/plugins/validation.js') }}"></script>
  225.                 <script src="{{ asset('assets/js/components/toastr.js') }}"></script>
  226.                 <script src="{{ asset('assets/js/components/clipboard.js') }}"></script>
  227.                 <script src="{{ asset('assets/js/components/filter-toggle.js') }}"></script>
  228.                 <script src="{{ asset('assets/js/utilities/functions.js') }}"></script>
  229.                 <script src="{{ asset('assets/js/utilities/helpers.js') }}"></script>
  230.                 <script src="{{ asset('assets/js/page/contact.js') }}"></script>
  231.             {% endblock %}
  232.         {{ include('components/modals/_iframe_modal.html.twig') }}
  233.         </body>
  234.     {% endblock %}
  235. </html>