templates/dashboard/dashboard.html.twig line 1

  1. {% extends 'main.html.twig' %}
  2. {% block main %}
  3.     <div class="container-fluid p-0">
  4.         {% if is_granted('ROLE_ADMIN') %}
  5.             <div class="row">
  6.                 <div class="col-md-4 col-12">
  7.                     <div class="card">
  8.                         <div class="card-body">
  9.                             <div class="row">
  10.                                 <div class="col mt-0">
  11.                                     <h5 class="card-title">Jobanzeigen insgesamt</h5>
  12.                                 </div>
  13.                                 <div class="col-auto">
  14.                                     <div class="stat text-primary">
  15.                                         <i class="align-middle" data-feather="users"></i>
  16.                                     </div>
  17.                                 </div>
  18.                             </div>
  19.                             <h1 class="mt-1 mb-3">{{ counts.job.value }}</h1>
  20.                             <div class="mb-0">
  21.                                 <span class="badge badge-success-light"> <i
  22.                                             class="mdi mdi-arrow-bottom-right"></i> {{ counts.job.prog }} </span>
  23.                                 <span class="text-muted">Seit letzter Woche</span>
  24.                             </div>
  25.                         </div>
  26.                     </div>
  27.                 </div>
  28.                 <div class="col-md-4 col-12">
  29.                     <div class="card">
  30.                         <div class="card-body">
  31.                             <div class="row">
  32.                                 <div class="col mt-0">
  33.                                     <h5 class="card-title">Suchanfragen insgesamt</h5>
  34.                                 </div>
  35.                                 <div class="col-auto">
  36.                                     <div class="stat text-primary">
  37.                                         <i class="align-middle" data-feather="search"></i>
  38.                                     </div>
  39.                                 </div>
  40.                             </div>
  41.                             <h1 class="mt-1 mb-3">{{ counts.search.value }}</h1>
  42.                             <div class="mb-0">
  43.                                 <span class="badge {% if counts.search.prog starts with '+' %}badge-success-light{% else %}badge-danger-light{% endif %}"> <i
  44.                                             class="mdi mdi-arrow-bottom-right"></i> {{ counts.search.prog }} </span>
  45.                                 <span class="text-muted">Seit letzter Woche</span>
  46.                             </div>
  47.                         </div>
  48.                     </div>
  49.                 </div>
  50.                 <div class="col-md-4 col-12">
  51.                     <div class="card">
  52.                         <div class="card-body">
  53.                             <div class="row">
  54.                                 <div class="col mt-0">
  55.                                     <h5 class="card-title">Benutzer insgesamt</h5>
  56.                                 </div>
  57.                                 <div class="col-auto">
  58.                                     <div class="stat text-primary">
  59.                                         <i class="align-middle" data-feather="user"></i>
  60.                                     </div>
  61.                                 </div>
  62.                             </div>
  63.                             <h1 class="mt-1 mb-3">{{ counts.user.value }}</h1>
  64.                             <div class="mb-0">
  65.                                 <span class="badge badge-success-light"> <i
  66.                                             class="mdi mdi-arrow-bottom-right"></i> {{ counts.user.prog }} </span>
  67.                                 <span class="text-muted">Seit letzter Woche</span>
  68.                             </div>
  69.                         </div>
  70.                     </div>
  71.                 </div>
  72.             </div>
  73.             <div class="row">
  74.                 <div class="col-md-6 col-12">
  75.                     <div class="card flex-fill">
  76.                         <div class="card-header">
  77.                             <div class="card-actions float-end nav-tabs" role="tablist">
  78.                                 <button class="btn btn-sm btn-light active" id="all-tab" data-bs-toggle="tab"
  79.                                         data-bs-target="#all" type="button" role="tab" aria-controls="all"
  80.                                         aria-selected="true">alle
  81.                                 </button>
  82.                                 <button class="btn btn-sm btn-light" id="day7-tab" data-bs-toggle="tab"
  83.                                         data-bs-target="#day7" type="button" role="tab" aria-controls="day7"
  84.                                         aria-selected="true">7 Tage
  85.                                 </button>
  86.                                 <button class="btn btn-sm btn-light" id="day30-tab" data-bs-toggle="tab"
  87.                                         data-bs-target="#day30" type="button" role="tab" aria-controls="day30"
  88.                                         aria-selected="true">30 Tage
  89.                                 </button>
  90.                                 <button class="btn btn-sm btn-light" id="day120-tab" data-bs-toggle="tab"
  91.                                         data-bs-target="#day120" type="button" role="tab" aria-controls="day120"
  92.                                         aria-selected="true">120 Tage
  93.                                 </button>
  94.                             </div>
  95.                             <h5 class="card-title mb-0">Ergebnisse nach Ort</h5>
  96.                         </div>
  97.                         <div class="card-body tab-content">
  98.                             {% for k,c in city_stats %}
  99.                                 <div class="tab-pane fade{% if k == 'all' %} show active{% endif %}" id="{{ k }}"
  100.                                      role="tabpanel" aria-labelledby="{{ k }}-tab">
  101.                                     <table class="table table-sm table-striped my-0">
  102.                                         <tr>
  103.                                             <th>Ort</th>
  104.                                             <th>Anzahl</th>
  105.                                         </tr>
  106.                                         {% for d in c %}
  107.                                             <tr>
  108.                                                 <td>{{ d.city }}</td>
  109.                                                 <td>{{ d.count }}</td>
  110.                                             </tr>
  111.                                         {% endfor %}
  112.                                     </table>
  113.                                 </div>
  114.                             {% endfor %}
  115.                         </div>
  116.                     </div>
  117.                 </div>
  118.                 <div class="col-md-6 col-12">
  119.                     <div class="card flex-fill w-100">
  120.                         <div class="card-header">
  121.                             <div class="card-actions float-end">
  122.                                 <div class="dropdown position-relative">
  123.                                     <a href="#" data-bs-toggle="dropdown" data-bs-display="static">
  124.                                         <i class="align-middle" data-feather="more-horizontal"></i>
  125.                                     </a>
  126.                                     <div class="dropdown-menu dropdown-menu-end">
  127.                                         <a class="dropdown-item" href="#">Action</a>
  128.                                         <a class="dropdown-item" href="#">Another action</a>
  129.                                         <a class="dropdown-item" href="#">Something else here</a>
  130.                                     </div>
  131.                                 </div>
  132.                             </div>
  133.                             <h5 class="card-title mb-0">Top User</h5>
  134.                         </div>
  135.                         <div class="card-body d-flex">
  136.                             <div class="align-self-center w-100">
  137.                                 <div class="py-3">
  138.                                     <div class="chart chart-xs">
  139.                                         <canvas id="chartjs-dashboard-pie"></canvas>
  140.                                     </div>
  141.                                 </div>
  142.                                 <table class="table mb-0">
  143.                                     <tbody>
  144.                                     {% for u in top_users %}
  145.                                         <tr>
  146.                                             <td><i class="fas fa-circle fa-fw" style="color:{{ u.color }}"></i> {{ u.lastname }}
  147.                                                 , {{ u.firstname }}</td>
  148.                                             <td class="text-end">{{ u.count }}</td>
  149.                                         </tr>
  150.                                     {% endfor %}
  151.                                     </tbody>
  152.                                 </table>
  153.                             </div>
  154.                         </div>
  155.                     </div>
  156.                 </div>
  157.             </div>
  158.             <div class="row">
  159.                 <div class="col-md-4 col-12">
  160.                     <div class="card flex-fill">
  161.                         <div class="card-header">
  162.                             <h5 class="card-title mb-0">Letzte Suchanfragen</h5>
  163.                         </div>
  164.                         <table class="table table-sm table-striped my-0">
  165.                             <thead>
  166.                             <tr>
  167.                                 <th>Suchwort</th>
  168.                             </tr>
  169.                             </thead>
  170.                             <tbody>
  171.                             {% for s in last_searches %}
  172.                                 <tr>
  173.                                     <td>{{ s.search }}</td>
  174.                                 </tr>
  175.                             {% endfor %}
  176.                             </tbody>
  177.                         </table>
  178.                     </div>
  179.                 </div>
  180.                 <div class="col-md-4 col-12">
  181.                     <div class="card flex-fill">
  182.                         <div class="card-header">
  183.                             <h5 class="card-title mb-0">Letzte gefundene Jobs</h5>
  184.                         </div>
  185.                         <table class="table table-sm table-striped my-0">
  186.                             <thead>
  187.                             <tr>
  188.                                 <th>Job</th>
  189.                             </tr>
  190.                             </thead>
  191.                             <tbody>
  192.                             {% for j in last_jobs %}
  193.                                 <tr>
  194.                                     <td>{{ j.title }}</td>
  195.                                 </tr>
  196.                             {% endfor %}
  197.                             </tbody>
  198.                         </table>
  199.                     </div>
  200.                 </div>
  201.                 <div class="col-md-4 col-12">
  202.                     <div class="card flex-fill">
  203.                         <div class="card-header">
  204.                             <h5 class="card-title mb-0">Top Suchbegriffe</h5>
  205.                         </div>
  206.                         <table class="table table-sm table-striped my-0">
  207.                             <thead>
  208.                             <tr>
  209.                                 <th>Suchbegriff</th>
  210.                                 <th>Anzahl</th>
  211.                             </tr>
  212.                             </thead>
  213.                             <tbody>
  214.                             {% for s in most_searchwords %}
  215.                                 <tr>
  216.                                     <td>{{ s.search }}</td>
  217.                                     <td>{{ s.count }}</td>
  218.                                 </tr>
  219.                             {% endfor %}
  220.                             </tbody>
  221.                         </table>
  222.                     </div>
  223.                 </div>
  224.             </div>
  225.         {% else %}
  226.             <div class="row">
  227.                 <div class="col-12 col-lg-8 col-xxl-9 d-flex">
  228.                     <div class="card flex-fill">
  229.                         <div class="card-header">
  230.                             <h5 class="card-title mb-0">Zuletzt gesucht</h5>
  231.                         </div>
  232.                         <table class="table table-hover my-0">
  233.                             <thead>
  234.                             <tr>
  235.                                 <th>Suchbegriff</th>
  236.                                 <th>Ort</th>
  237.                                 <th>Treffer</th>
  238.                             </tr>
  239.                             </thead>
  240.                             <tbody>
  241.                             {% for search in searches %}
  242.                                 <tr>
  243.                                     <td>{{ search.search }}</td>
  244.                                     <td>{{ search.location }}, Umkreis: {{ search.distance }}km</td>
  245.                                     <td><span class="badge bg-success">{{ search.hits }}</span></td>
  246.                                 </tr>
  247.                             {% endfor %}
  248.                             </tbody>
  249.                         </table>
  250.                     </div>
  251.                 </div>
  252.             </div>
  253.         {% endif %}
  254.     </div>
  255.     <script>
  256.         document.addEventListener("DOMContentLoaded", function () {
  257.             // Pie chart
  258.             new Chart(document.getElementById("chartjs-dashboard-pie"), {
  259.                 type: "pie",
  260.                 data: {
  261.                     labels: [
  262.                         {% for u in top_users %}
  263.                         "{{ u.lastname }}, {{ u.firstname }}",
  264.                         {% endfor %}
  265.                     ],
  266.                     datasets: [{
  267.                         data: [
  268.                             {% for u in top_users %}
  269.                             {{ u.count|raw }},
  270.                             {% endfor %}
  271.                         ],
  272.                         backgroundColor: [
  273.                             {% for u in top_users %}
  274.                             "{{ u.color }}",
  275.                             {% endfor %}
  276.                         ],
  277.                         borderWidth: 5,
  278.                         borderColor: window.theme.white
  279.                     }]
  280.                 },
  281.                 options: {
  282.                     responsive: !window.MSInputMethodContext,
  283.                     maintainAspectRatio: false,
  284.                     legend: {
  285.                         display: false
  286.                     },
  287.                     cutoutPercentage: 70
  288.                 }
  289.             });
  290.         });
  291.     </script>
  292. {% endblock %}