<!DOCTYPE html>
{% set userTheme = app.user ? app.user.theme : 'default' %}
{% if userTheme starts with 'system:' %}
{% set lightTheme = userTheme|slice(7) ?: 'default' %}
<html lang="en" data-theme="{{ lightTheme }}" data-theme-mode="system" data-theme-light="{{ lightTheme }}">
{% else %}
<html lang="en" data-theme="{{ userTheme }}">
{% endif %}
<head>
<title>
Evapi ERP
{% block title %}{% endblock %}
</title>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta
name="viewport" content="width=device-width, initial-scale=1"/>
<!-- Favicon -->
{% set faviconRelativePath = 'https://serveur-images.devil-it-applications.fr/evapi/logo/favicon' %}
{% block stylesheets %}
<link rel="shortcut icon" href="{{ faviconRelativePath }}/favicon.ico" type="image/x-icon"/>
<link rel="apple-touch-icon" sizes="180x180" href="{{ faviconRelativePath }}/apple-touch-icon.png"/>
<link rel="icon" type="image/png" sizes="192x192" href="{{ faviconRelativePath }}/android-chrome-192x192.png"/>
<link rel="icon" type="image/png" sizes="512x512" href="{{ faviconRelativePath }}/android-chrome-512x512.png"/>
<link rel="icon" type="image/png" sizes="32x32" href="{{ faviconRelativePath }}/favicon-32x32.png"/>
<link rel="icon" type="image/png" sizes="16x16" href="{{ faviconRelativePath }}/favicon-16x16.png"/>
<link rel="manifest" href="{{ faviconRelativePath }}/site.webmanifest"/>
<link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/smoothness/jquery-ui.css"/>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined"/>
<script src="{{ asset('assets/node_modules/jquery/dist/jquery.min.js') }}"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<script src="{{ asset('assets/node_modules/js-cookie/dist/js.cookie.min.js') }}"></script>
<script>
// System theme detection - runs immediately to prevent flash
(function() {
var html = document.documentElement;
var themeMode = html.getAttribute('data-theme-mode');
if (themeMode === 'system') {
var lightTheme = html.getAttribute('data-theme-light') || 'default';
var prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
html.setAttribute('data-theme', prefersDark ? 'dark' : lightTheme);
// Listen for system theme changes
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function(e) {
if (html.getAttribute('data-theme-mode') === 'system') {
html.setAttribute('data-theme', e.matches ? 'dark' : lightTheme);
}
});
}
})();
</script>
<script>
// Create a <link> element for each non-critical CSS file
var assetUrl = "{{ asset('') }}"
var cssFiles = [
'assets/node_modules/dropify/dist/css/dropify.min.css',
'assets/node_modules/bootstrap/dist/css/bootstrap.min.css',
'assets/node_modules/perfect-scrollbar/dist/css/perfect-scrollbar.min.css',
'assets/node_modules/select2/dist/css/select2.min.css',
'assets/node_modules/bootstrap-select/dist/css/bootstrap-select.min.css',
'assets/node_modules/magnific-popup/dist/magnific-popup.css',
'assets/plugins/jquery-asColorPicker-master/dist/css/asColorPicker.min.css',
'assets/plugins/datatables/media/css/dataTables.bootstrap4.min.css',
'assets/plugins/html5-editor/bootstrap-wysihtml5.min.css',
'assets/node_modules/chartist/dist/chartist.min.css',
'assets/plugins/chartist-plugin-tooltip-master/dist/chartist-plugin-tooltip.min.css',
'assets/plugins/footable/css/footable.bootstrap.min.css',
'assets/node_modules/daterangepicker/daterangepicker.css',
'assets/node_modules/dropzone/dist/min/dropzone.min.css',
'assets/node_modules/c3/c3.min.css',
'assets/plugins/toast-master/css/jquery.toast.min.css',
'assets/plugins/x-editable/dist/bootstrap3-editable/css/bootstrap-editable.min.css',
'assets/plugins/html5-editor/bootstrap-wysihtml5.min.css',
'assets/plugins/nestable/nestable.min.css',
'assets/node_modules/sweetalert2/dist/sweetalert2.min.css'
]
// Function to asynchronously load CSS files
function loadCSS(url) {
var link = document.createElement('link')
link.rel = 'stylesheet'
link.href = assetUrl + url
document.head.appendChild(link)
}
// Load each CSS file asynchronously
cssFiles.forEach(function (url) {
loadCSS(url)
})
</script>
<!-- Custom Style -->
<link href="{{ asset('assets/css/style.css') }}" rel="stylesheet"/>
{# <link href="{{ asset('assets/css/pages/tab-page.css') }}" rel="stylesheet" /> #}
{# <link href="{{ asset('assets/css/pages/dashboard1.css') }}" rel="stylesheet" /> #}
{# <link href="{{ asset('assets/css/pages/footable-page.css') }}" rel="stylesheet" /> #}
{# <link href="{{ asset('assets/css/pages/card-page.css') }}" rel="stylesheet" /> #}
<link
href="{{ asset('assets/css/colors/default-dark.css') }}" id="theme" rel="stylesheet"/> <!-- Override Style -->
<link href="{{ asset('assets/css/overrides/stylesheet.css') }}" rel="stylesheet"/>
<link href="{{ asset('assets/css/overrides/theme.css') }}" rel="stylesheet"/>
<script src="{{ asset('assets/node_modules/tinymce/tinymce.min.js') }}"></script>
<script src="{{ asset('assets/node_modules/tinymce-i18n/langs7/fr_FR.js') }}"></script>
<script src="{{ asset('assets/node_modules/sortablejs/Sortable.min.js') }}"></script>
{% endblock %}
</head>
{% block body %}
<body id="{{ app.request.get('_route') ? : 'home' }}">
<script>
// Detect if page is loaded in iframe and add class to body
if (window.self !== window.top) {
document.body.classList.add('in-iframe');
}
</script>
<div id="main-wrapper" class=" page">
{% block sidebar %}
{% include 'layout/sidebar.html.twig' %}
{% endblock %}
{% block topbar %}
<header class="topbar">
<div class="container">
<div class="topbar__content">
<div class="topbar__col">
<div class="topbar__toggler">
<a class="topbar__toggler-mobile nav-toggler hidden-lg-up" href="javascript:void(0)">
<span class="material-symbols-outlined">menu</span>
</a>
<a class="topbar__toggler-desktop sidebartoggler hidden-lg-down" href="javascript:void(0)">
<span class="material-symbols-outlined">menu_open</span>
</a>
</div>
{% block heading %}{% endblock %}
</div>
<div class="topbar__col">
<div class="tab-actions">
<button id="bulkEditBtn" class="btn btn-primary">
<span class="material-symbols-outlined">edit</span>
Modifier en masse</button>
<div class="bulk-btn-group">
<button id="bulkSaveBtn" type="button" class="btn btn-primary">
<span class="material-symbols-outlined">save</span>
Enregistrer Tous</a>
<button id="bulkCancelBtn" type="button" class="btn btn-danger">
<span class="material-symbols-outlined">cancel</span>
Annuler
</a>
</div>
</div>
<div class="topbar__language dropdown d-none">
<a class="topbar__language-link" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="icon icon__img--fr"></i>
</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="#">
<i class="icon icon__img--uk"></i>
English</a>
<a class="dropdown-item" href="#">
<i class="icon icon__img--fr"></i>
French</a>
</div>
</div>
<div class="topbar__profile">
{% if app.user %}
{% set initials = (app.user.prenom|first) ~ (app.user.nom|first) %}
<div class="topbar__profile-initials">{{ initials }}</div>
<div class="topbar__profile-text">
<h5 class="topbar__profile-text__name">
<span>{{ app.user.prenom }} {{ app.user.nom }}</span>
</h5>
<p class="topbar__profile-text__mail">{{ app.user.email }}</p>
</div>
<a class="topbar__logout-btn" href="{{ path('app_logout') }}" title="Déconnexion">
<span class="material-symbols-outlined">logout</span>
</a>
{% endif %}
</div>
</div>
</div>
</div>
</header>
<script src="{{ asset('assets/js/components/layout.js') }}"></script>
{% endblock %}
<div class="page-wrap">
<div class="page-grid">
<div class="page-content">
<div class="container">
{% block content %}{% endblock %}
</div>
</div>
</div>
{% block footer %}
{% include 'layout/footer.html.twig' %}
{% endblock %}
</div>
</div>
{% block javascripts %}
<!-- npm scripts -->
<script src="{{ asset('assets/node_modules/sweetalert2/dist/sweetalert2.min.js') }}"></script>
<script src="{{ asset('assets/node_modules/clipboard/dist/clipboard.min.js') }}"></script>
<script src="{{ asset('assets/node_modules/sortablejs/Sortable.min.js') }}"></script>
<script src="{{ asset('assets/node_modules/mathjs/lib/browser/math.js') }}"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery-sortablejs@latest/jquery-sortable.min.js"></script>
<!-- Plugin scripts -->
<script src="{{ asset('assets/node_modules/popper.js/dist/umd/popper.min.js') }}"></script>
<script src="{{ asset('assets/node_modules/bootstrap/dist/js/bootstrap.bundle.min.js') }}"></script>
<script src="{{ asset('assets/node_modules/moment/min/moment.min.js') }}"></script>
<script src="{{ asset('assets/plugins/footable/js/footable.min.js') }}"></script>
<script src="{{ asset('assets/node_modules/dropify/dist/js/dropify.min.js') }}"></script>
<script src="{{ asset('assets/plugins/sparkline/jquery.sparkline.min.js') }}"></script>
<script src="{{ asset('assets/node_modules/chartist/dist/chartist.min.js') }}"></script>
<script src="{{ asset('assets/plugins/chartist-plugin-tooltip-master/dist/chartist-plugin-tooltip.min.js') }}"></script>
<script src="{{ asset('assets/plugins/x-editable/dist/bootstrap3-editable/js/bootstrap-editable.min.js') }}"></script>
<script src="{{ asset('assets/node_modules/d3/d3.min.js') }}"></script>
<script src="{{ asset('assets/node_modules/c3/c3.min.js') }}"></script>
<script src="{{ asset('assets/node_modules/dropzone/dist/min/dropzone.min.js') }}"></script>
<script src="{{ asset('assets/node_modules/daterangepicker/daterangepicker.js') }}"></script>
<script src="{{ asset('assets/node_modules/select2/dist/js/select2.full.min.js') }}"></script>
<script src="{{ asset('assets/plugins/multiselect/js/jquery.multi-select.min.js') }}"></script>
<script src="{{ asset('assets/node_modules/bootstrap-select/dist/js/bootstrap-select.min.js') }}"></script>
<script src="{{ asset('assets/plugins/datatables/datatables.min.js') }}"></script>
<script src="{{ asset('assets/node_modules/magnific-popup/dist/jquery.magnific-popup.min.js') }}"></script>
<script src="{{ asset('assets/js/plugins/magnific-popup-init.min.js') }}"></script>
<script src="{{ asset('assets/plugins/toast-master/js/jquery.toast.min.js') }}"></script>
<script src="{{ asset('assets/node_modules/jquery-validation/dist/jquery.validate.min.js') }}"></script>
<script src="{{ asset('assets/node_modules/htmx.org/dist/htmx.min.js') }}"></script>
<!-- Custom scripts -->
<script src="{{ asset('assets/js/plugins/perfect-scrollbar.jquery.min.js') }}"></script>
<script src="{{ asset('assets/js/plugins/validation.js') }}"></script>
<script src="{{ asset('assets/js/components/toastr.js') }}"></script>
<script src="{{ asset('assets/js/components/clipboard.js') }}"></script>
<script src="{{ asset('assets/js/components/filter-toggle.js') }}"></script>
<script src="{{ asset('assets/js/utilities/functions.js') }}"></script>
<script src="{{ asset('assets/js/utilities/helpers.js') }}"></script>
<script src="{{ asset('assets/js/page/contact.js') }}"></script>
{% endblock %}
{{ include('components/modals/_iframe_modal.html.twig') }}
</body>
{% endblock %}
</html>