Add shared UI shell and list component
Co-authored-by: Copilot <[email protected]>
This commit is contained in:
@@ -0,0 +1,69 @@
|
|||||||
|
(function () {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
function compareRows(left, right, key, direction) {
|
||||||
|
const leftValue = left.dataset[key] || "";
|
||||||
|
const rightValue = right.dataset[key] || "";
|
||||||
|
const numericLeft = Number(leftValue);
|
||||||
|
const numericRight = Number(rightValue);
|
||||||
|
const bothNumeric = leftValue !== "" && rightValue !== ""
|
||||||
|
&& Number.isFinite(numericLeft) && Number.isFinite(numericRight);
|
||||||
|
const comparison = bothNumeric
|
||||||
|
? numericLeft - numericRight
|
||||||
|
: leftValue.localeCompare(rightValue, undefined, {
|
||||||
|
numeric: true,
|
||||||
|
sensitivity: "base",
|
||||||
|
});
|
||||||
|
return comparison * direction;
|
||||||
|
}
|
||||||
|
|
||||||
|
function refreshList(list) {
|
||||||
|
const body = list.querySelector("[data-data-list-body]");
|
||||||
|
const table = list.querySelector("[data-data-list-table]");
|
||||||
|
const empty = list.querySelector("[data-data-list-empty]");
|
||||||
|
const hasRows = body && body.children.length > 0;
|
||||||
|
table.hidden = !hasRows;
|
||||||
|
empty.hidden = hasRows;
|
||||||
|
}
|
||||||
|
|
||||||
|
function initializeList(list) {
|
||||||
|
refreshList(list);
|
||||||
|
|
||||||
|
list.addEventListener("click", function (event) {
|
||||||
|
const sortButton = event.target.closest("[data-sort-key]");
|
||||||
|
if (sortButton) {
|
||||||
|
const body = list.querySelector("[data-data-list-body]");
|
||||||
|
const key = sortButton.dataset.sortKey;
|
||||||
|
const ascending = sortButton.dataset.sortDirection !== "asc";
|
||||||
|
const rows = Array.from(body.children);
|
||||||
|
rows.sort(function (left, right) {
|
||||||
|
return compareRows(left, right, key, ascending ? 1 : -1);
|
||||||
|
});
|
||||||
|
rows.forEach(function (row) {
|
||||||
|
body.appendChild(row);
|
||||||
|
});
|
||||||
|
list.querySelectorAll("[data-sort-key]").forEach(function (button) {
|
||||||
|
button.removeAttribute("data-sort-direction");
|
||||||
|
button.closest("th").setAttribute("aria-sort", "none");
|
||||||
|
});
|
||||||
|
sortButton.dataset.sortDirection = ascending ? "asc" : "desc";
|
||||||
|
sortButton.closest("th").setAttribute(
|
||||||
|
"aria-sort",
|
||||||
|
ascending ? "ascending" : "descending"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const confirmButton = event.target.closest("[data-confirm]");
|
||||||
|
if (confirmButton && !window.confirm(confirmButton.dataset.confirm)) {
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopImmediatePropagation();
|
||||||
|
}
|
||||||
|
}, true);
|
||||||
|
|
||||||
|
new MutationObserver(function () {
|
||||||
|
refreshList(list);
|
||||||
|
}).observe(list.querySelector("[data-data-list-body]"), { childList: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
document.querySelectorAll("[data-data-list]").forEach(initializeList);
|
||||||
|
}());
|
||||||
@@ -1 +1,40 @@
|
|||||||
#map { height: 20rem; }
|
#map { height: 20rem; }
|
||||||
|
|
||||||
|
.app-sidebar {
|
||||||
|
color: var(--bs-accordion-btn-focus-border-color);
|
||||||
|
background: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.data-list {
|
||||||
|
min-height: 10rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.data-list-empty {
|
||||||
|
padding: 2.5rem 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.data-list-sort {
|
||||||
|
display: inline-flex;
|
||||||
|
gap: .5rem;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0;
|
||||||
|
color: inherit;
|
||||||
|
font: inherit;
|
||||||
|
font-weight: 700;
|
||||||
|
background: none;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.data-list-sort[data-sort-direction="asc"] .fa-sort::before {
|
||||||
|
content: "\f0de";
|
||||||
|
}
|
||||||
|
|
||||||
|
.data-list-sort[data-sort-direction="desc"] .fa-sort::before {
|
||||||
|
content: "\f0dd";
|
||||||
|
}
|
||||||
|
|
||||||
|
.data-list-actions {
|
||||||
|
display: flex;
|
||||||
|
gap: .5rem;
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html data-bs-theme="light" lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
||||||
|
<title>{% block title %}Yaris OBD{% endblock %}</title>
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='bootstrap/css/bootstrap.min.css') }}">
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='yaris.css') }}">
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='fonts/fontawesome-all.min.css') }}">
|
||||||
|
{% block styles %}{% endblock %}
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body id="page-top">
|
||||||
|
<div id="wrapper">
|
||||||
|
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark app-sidebar">
|
||||||
|
<div class="container-fluid d-flex flex-column p-0">
|
||||||
|
<a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="{{ url_for('index') }}">
|
||||||
|
<div class="sidebar-brand-icon rotate-n-15"><i class="fas fa-car"></i></div>
|
||||||
|
<div id="index-car-model" class="sidebar-brand-text mx-3"><span>{{ car.model }}</span></div>
|
||||||
|
</a>
|
||||||
|
<hr class="sidebar-divider my-0">
|
||||||
|
<ul class="navbar-nav text-light" id="accordionSidebar">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link{% if request.endpoint == 'index' %} active{% endif %}" href="{{ url_for('index') }}">
|
||||||
|
<i class="fas fa-tachometer-alt"></i><span>Dashboard</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link{% if request.endpoint == 'dash' %} active{% endif %}" href="{{ url_for('dash') }}">
|
||||||
|
<i class="fas fa-video"></i><span>Dashcam</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link{% if request.endpoint == 'dtc' %} active{% endif %}" href="{{ url_for('dtc') }}">
|
||||||
|
<i class="fas fa-exclamation-triangle"></i><span>DTC</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div class="text-center d-none d-md-inline">
|
||||||
|
<button class="btn rounded-circle border-0" id="sidebarToggle" type="button" aria-label="Toggle sidebar"></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
<div class="d-flex flex-column" id="content-wrapper">
|
||||||
|
<div id="content">
|
||||||
|
<nav class="navbar navbar-expand bg-white shadow mb-4 topbar static-top navbar-light">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button" aria-label="Toggle sidebar">
|
||||||
|
<i class="fas fa-bars"></i>
|
||||||
|
</button>
|
||||||
|
<div class="ms-auto d-flex align-items-center">
|
||||||
|
<span id="index-pp" class="d-none d-sm-inline me-2 text-gray-600 small">{{ account.name }}</span>
|
||||||
|
<img class="border rounded-circle img-profile" src="{{ url_for('static', filename='img/yaris.png') }}" alt="">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
<main class="container-fluid">
|
||||||
|
{% block content %}{% endblock %}
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
<footer class="bg-white sticky-footer">
|
||||||
|
<div class="container my-auto">
|
||||||
|
<div class="text-center my-auto copyright"><span>Copyright © yaris vroom vroom de course 2023</span></div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
<a class="border rounded d-inline scroll-to-top" href="#page-top" aria-label="Back to top">
|
||||||
|
<i class="fas fa-angle-up"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<script src="{{ url_for('static', filename='bootstrap/js/bootstrap.min.js') }}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='js/bs-init.js') }}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='js/theme.js') }}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='js/data-list.js') }}"></script>
|
||||||
|
{% block scripts %}{% endblock %}
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
{% macro data_table(id, columns, empty_title, empty_message) %}
|
||||||
|
<div class="data-list" id="{{ id }}" data-data-list>
|
||||||
|
<div class="table-responsive data-list-table" data-data-list-table hidden>
|
||||||
|
<table class="table table-hover align-middle mb-0">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
{% for column in columns %}
|
||||||
|
<th scope="col"{% if column.sortable %} aria-sort="none"{% endif %}>
|
||||||
|
{% if column.sortable %}
|
||||||
|
<button class="data-list-sort" type="button" data-sort-key="{{ column.key }}">
|
||||||
|
{{ column.label }}
|
||||||
|
<i class="fas fa-sort" aria-hidden="true"></i>
|
||||||
|
</button>
|
||||||
|
{% else %}
|
||||||
|
{{ column.label }}
|
||||||
|
{% endif %}
|
||||||
|
</th>
|
||||||
|
{% endfor %}
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
{# Each injected row must define data-<column.key> for sortable columns. #}
|
||||||
|
<tbody data-data-list-body></tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="data-list-empty text-center" data-data-list-empty>
|
||||||
|
<i class="fas fa-inbox fa-2x text-gray-300 mb-3" aria-hidden="true"></i>
|
||||||
|
<h6 class="text-dark mb-1">{{ empty_title }}</h6>
|
||||||
|
<p class="text-muted mb-0">{{ empty_message }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endmacro %}
|
||||||
+7
-72
@@ -1,62 +1,8 @@
|
|||||||
<!DOCTYPE html>
|
{% extends "base.html" %}
|
||||||
<html data-bs-theme="light" lang="en">
|
|
||||||
|
|
||||||
<head>
|
{% block title %}Dashcam - Yaris OBD{% endblock %}
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
|
||||||
<title>Dashboard - yaris vroom vroom de course</title>
|
|
||||||
<link rel="stylesheet" href="{{ url_for('static', filename='bootstrap/css/bootstrap.min.css') }}">
|
|
||||||
<link rel="stylesheet" href="{{ url_for('static', filename='yaris.css') }}">
|
|
||||||
<link rel="stylesheet" href="{{ url_for('static', filename='fonts/fontawesome-all.min.css') }}">
|
|
||||||
<link rel="stylesheet" href="{{ url_for('static', filename='vendor/leaflet/leaflet.css') }}">
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body id="page-top">
|
{% block content %}
|
||||||
<div id="wrapper">
|
|
||||||
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark" style="color: var(--bs-accordion-btn-focus-border-color);background: rgb(0,0,0);filter: blur(0px);backdrop-filter: blur(0px) hue-rotate(0deg);">
|
|
||||||
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="#">
|
|
||||||
<div class="sidebar-brand-icon rotate-n-15"><i class="fas fa-car"></i></div>
|
|
||||||
<div id="index-car-model" class="sidebar-brand-text mx-3"><span>{{ car.model }}</span></div>
|
|
||||||
</a>
|
|
||||||
<hr class="sidebar-divider my-0">
|
|
||||||
<ul class="navbar-nav text-light" id="accordionSidebar">
|
|
||||||
<li class="nav-item"><a class="nav-link" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
|
|
||||||
<li class="nav-item"></li>
|
|
||||||
<li class="nav-item"><a class="nav-link active" href="/dash"><i class="fas fa-table"></i><span>Dashcam </span></a></li>
|
|
||||||
<li class="nav-item"></li>
|
|
||||||
<li class="nav-item"><a class="nav-link" href="/dtc"><i class="fas fa-table"></i><span>DTC </span></a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="text-center d-none d-md-inline"><button class="btn rounded-circle border-0" id="sidebarToggle" type="button"></button></div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<div class="d-flex flex-column" id="content-wrapper">
|
|
||||||
<div id="content">
|
|
||||||
<nav class="navbar navbar-expand bg-white shadow mb-4 topbar static-top navbar-light">
|
|
||||||
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
|
|
||||||
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search">
|
|
||||||
<div class="input-group"></div>
|
|
||||||
</form>
|
|
||||||
<ul class="navbar-nav flex-nowrap ms-auto">
|
|
||||||
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
|
|
||||||
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
|
|
||||||
<form class="me-auto navbar-search w-100">
|
|
||||||
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ...">
|
|
||||||
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
<div class="d-none d-sm-block topbar-divider"></div>
|
|
||||||
<li class="nav-item dropdown no-arrow">
|
|
||||||
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span id="index-pp" class="d-none d-lg-inline me-2 text-gray-600 small">{{ account.name }}</span><img class="border rounded-circle img-profile" src="{{ url_for('static', filename='img/yaris.png') }}"></a>
|
|
||||||
</div>
|
|
||||||
<div class="shadow dropdown-list dropdown-menu dropdown-menu-end" aria-labelledby="alertsDropdown"></div>
|
|
||||||
</li>
|
|
||||||
<div class="d-none d-sm-block topbar-divider"></div>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<div class="container-fluid">
|
|
||||||
<h3 class="text-dark mb-4">Dashcam</h3>
|
<h3 class="text-dark mb-4">Dashcam</h3>
|
||||||
<div class="card shadow mb-4">
|
<div class="card shadow mb-4">
|
||||||
<div class="card-header py-3">
|
<div class="card-header py-3">
|
||||||
@@ -97,19 +43,8 @@
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{% endblock %}
|
||||||
</div>
|
|
||||||
<footer class="bg-white sticky-footer">
|
|
||||||
<div class="container my-auto">
|
|
||||||
<div class="text-center my-auto copyright"><span>Copyright © yaris vroom vroom de course 2023</span></div>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
</div><a class="border rounded d-inline scroll-to-top" href="#page-top"><i class="fas fa-angle-up"></i></a>
|
|
||||||
</div>
|
|
||||||
<script src="{{ url_for('static', filename='js/dash.js') }}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='bootstrap/js/bootstrap.min.js') }}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/bs-init.js') }}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/theme.js') }}"></script>
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
{% block scripts %}
|
||||||
|
<script src="{{ url_for('static', filename='js/dash.js') }}"></script>
|
||||||
|
{% endblock %}
|
||||||
+16
-73
@@ -1,82 +1,25 @@
|
|||||||
<!DOCTYPE html>
|
{% extends "base.html" %}
|
||||||
<html data-bs-theme="light" lang="en">
|
{% from "components.html" import data_table %}
|
||||||
|
|
||||||
<head>
|
{% block title %}DTC Codes - Yaris OBD{% endblock %}
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
|
||||||
<title>Dashboard - yaris vroom vroom de course</title>
|
|
||||||
<link rel="stylesheet" href="{{ url_for('static', filename='bootstrap/css/bootstrap.min.css') }}">
|
|
||||||
<link rel="stylesheet" href="{{ url_for('static', filename='yaris.css') }}">
|
|
||||||
<link rel="stylesheet" href="{{ url_for('static', filename='fonts/fontawesome-all.min.css') }}">
|
|
||||||
<link rel="stylesheet" href="{{ url_for('static', filename='vendor/leaflet/leaflet.css') }}">
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body id="page-top">
|
{% block content %}
|
||||||
<div id="wrapper">
|
|
||||||
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark" style="color: var(--bs-accordion-btn-focus-border-color);background: rgb(0,0,0);filter: blur(0px);backdrop-filter: blur(0px) hue-rotate(0deg);">
|
|
||||||
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="#">
|
|
||||||
<div class="sidebar-brand-icon rotate-n-15"><i class="fas fa-car"></i></div>
|
|
||||||
<div id="index-car-model" class="sidebar-brand-text mx-3"><span>{{ car.model }}</span></div>
|
|
||||||
</a>
|
|
||||||
<hr class="sidebar-divider my-0">
|
|
||||||
<ul class="navbar-nav text-light" id="accordionSidebar">
|
|
||||||
<li class="nav-item"><a class="nav-link" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
|
|
||||||
<li class="nav-item"></li>
|
|
||||||
<li class="nav-item"><a class="nav-link" href="/dash"><i class="fas fa-table"></i><span>Dashcam </span></a></li>
|
|
||||||
<li class="nav-item"></li>
|
|
||||||
<li class="nav-item"><a class="nav-link active" href="/dtc"><i class="fas fa-table"></i><span>DTC </span></a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="text-center d-none d-md-inline"><button class="btn rounded-circle border-0" id="sidebarToggle" type="button"></button></div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<div class="d-flex flex-column" id="content-wrapper">
|
|
||||||
<div id="content">
|
|
||||||
<nav class="navbar navbar-expand bg-white shadow mb-4 topbar static-top navbar-light">
|
|
||||||
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
|
|
||||||
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search">
|
|
||||||
<div class="input-group"></div>
|
|
||||||
</form>
|
|
||||||
<ul class="navbar-nav flex-nowrap ms-auto">
|
|
||||||
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
|
|
||||||
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
|
|
||||||
<form class="me-auto navbar-search w-100">
|
|
||||||
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ...">
|
|
||||||
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
<div class="d-none d-sm-block topbar-divider"></div>
|
|
||||||
<li class="nav-item dropdown no-arrow">
|
|
||||||
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span id="index-pp" class="d-none d-lg-inline me-2 text-gray-600 small">{{ account.name }}</span><img class="border rounded-circle img-profile" src="{{ url_for('static', filename='img/yaris.png') }}"></a>
|
|
||||||
</div>
|
|
||||||
<div class="shadow dropdown-list dropdown-menu dropdown-menu-end" aria-labelledby="alertsDropdown"></div>
|
|
||||||
</li>
|
|
||||||
<div class="d-none d-sm-block topbar-divider"></div>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<div class="container-fluid">
|
|
||||||
<h3 class="text-dark mb-4">DTC Codes</h3>
|
<h3 class="text-dark mb-4">DTC Codes</h3>
|
||||||
<div class="card shadow">
|
<div class="card shadow">
|
||||||
<div class="card-header py-3">
|
<div class="card-header py-3">
|
||||||
<p class="text-primary m-0 fw-bold">Output</p>
|
<p class="text-primary m-0 fw-bold">Output</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body"></div>
|
<div class="card-body p-0">
|
||||||
|
{{ data_table(
|
||||||
|
"dtc-list",
|
||||||
|
[
|
||||||
|
{"key": "code", "label": "Code", "sortable": true},
|
||||||
|
{"key": "description", "label": "Description", "sortable": true},
|
||||||
|
{"key": "actions", "label": "Actions", "sortable": false}
|
||||||
|
],
|
||||||
|
"No trouble codes available",
|
||||||
|
"Stored diagnostic trouble codes will appear here once OBD data is connected."
|
||||||
|
) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{% endblock %}
|
||||||
<footer class="bg-white sticky-footer">
|
|
||||||
<div class="container my-auto">
|
|
||||||
<div class="text-center my-auto copyright"><span>Copyright © yaris vroom vroom de course 2023</span></div>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
</div><a class="border rounded d-inline scroll-to-top" href="#page-top"><i class="fas fa-angle-up"></i></a>
|
|
||||||
</div>
|
|
||||||
<script src="{{ url_for('static', filename='js/yaris.js') }}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='bootstrap/js/bootstrap.min.js') }}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/bs-init.js') }}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/theme.js') }}"></script>
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
||||||
+10
-71
@@ -1,63 +1,12 @@
|
|||||||
<!DOCTYPE html>
|
{% extends "base.html" %}
|
||||||
<html data-bs-theme="light" lang="en">
|
|
||||||
|
|
||||||
<head>
|
{% block title %}Dashboard - Yaris OBD{% endblock %}
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
{% block styles %}
|
||||||
<title>Dashboard - yaris vroom vroom de course</title>
|
|
||||||
<link rel="stylesheet" href="{{ url_for('static', filename='bootstrap/css/bootstrap.min.css') }}">
|
|
||||||
<link rel="stylesheet" href="{{ url_for('static', filename='yaris.css') }}">
|
|
||||||
<link rel="stylesheet" href="{{ url_for('static', filename='fonts/fontawesome-all.min.css') }}">
|
|
||||||
<link rel="stylesheet" href="{{ url_for('static', filename='vendor/leaflet/leaflet.css') }}">
|
<link rel="stylesheet" href="{{ url_for('static', filename='vendor/leaflet/leaflet.css') }}">
|
||||||
</head>
|
{% endblock %}
|
||||||
|
|
||||||
<body id="page-top">
|
{% block content %}
|
||||||
<div id="wrapper">
|
|
||||||
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark" style="color: var(--bs-accordion-btn-focus-border-color);background: rgb(0,0,0);filter: blur(0px);backdrop-filter: blur(0px) hue-rotate(0deg);">
|
|
||||||
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="#">
|
|
||||||
<div class="sidebar-brand-icon rotate-n-15"><i class="fas fa-car"></i></div>
|
|
||||||
<div id="index-car-model" class="sidebar-brand-text mx-3"><span>{{ car.model }}</span></div>
|
|
||||||
</a>
|
|
||||||
<hr class="sidebar-divider my-0">
|
|
||||||
<ul class="navbar-nav text-light" id="accordionSidebar">
|
|
||||||
<li class="nav-item"><a class="nav-link active" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
|
|
||||||
<li class="nav-item"></li>
|
|
||||||
<li class="nav-item"><a class="nav-link" href="/dash"><i class="fas fa-table"></i><span>Dashcam </span></a></li>
|
|
||||||
<li class="nav-item"></li>
|
|
||||||
<li class="nav-item"><a class="nav-link" href="/dtc"><i class="fas fa-table"></i><span>DTC </span></a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="text-center d-none d-md-inline"><button class="btn rounded-circle border-0" id="sidebarToggle" type="button"></button></div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<div class="d-flex flex-column" id="content-wrapper">
|
|
||||||
<div id="content">
|
|
||||||
<nav class="navbar navbar-expand bg-white shadow mb-4 topbar static-top navbar-light">
|
|
||||||
<div class="container-fluid"><button class="btn btn-link d-md-none rounded-circle me-3" id="sidebarToggleTop" type="button"><i class="fas fa-bars"></i></button>
|
|
||||||
<form class="d-none d-sm-inline-block me-auto ms-md-3 my-2 my-md-0 mw-100 navbar-search">
|
|
||||||
<div class="input-group"></div>
|
|
||||||
</form>
|
|
||||||
<ul class="navbar-nav flex-nowrap ms-auto">
|
|
||||||
<li class="nav-item dropdown d-sm-none no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><i class="fas fa-search"></i></a>
|
|
||||||
<div class="dropdown-menu dropdown-menu-end p-3 animated--grow-in" aria-labelledby="searchDropdown">
|
|
||||||
<form class="me-auto navbar-search w-100">
|
|
||||||
<div class="input-group"><input class="bg-light form-control border-0 small" type="text" placeholder="Search for ...">
|
|
||||||
<div class="input-group-append"><button class="btn btn-primary py-0" type="button"><i class="fas fa-search"></i></button></div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
<div class="d-none d-sm-block topbar-divider"></div>
|
|
||||||
<li class="nav-item dropdown no-arrow">
|
|
||||||
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span id="index-pp" class="d-none d-lg-inline me-2 text-gray-600 small">{{ account.name }}</span><img class="border rounded-circle img-profile" src="{{ url_for('static', filename='img/yaris.png') }}"></a>
|
|
||||||
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="#"><i class="fas fa-user fa-sm fa-fw me-2 text-gray-400"></i> Profile</a><a class="dropdown-item" href="#"><i class="fas fa-cogs fa-sm fa-fw me-2 text-gray-400"></i> Settings</a><a class="dropdown-item" href="#"><i class="fas fa-list fa-sm fa-fw me-2 text-gray-400"></i> Activity log</a>
|
|
||||||
<div class="dropdown-divider"></div><a class="dropdown-item" href="#"><i class="fas fa-sign-out-alt fa-sm fa-fw me-2 text-gray-400"></i> Logout</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<div class="container-fluid">
|
|
||||||
<div class="d-sm-flex justify-content-between align-items-center mb-4">
|
<div class="d-sm-flex justify-content-between align-items-center mb-4">
|
||||||
<h3 class="text-dark mb-0">Dashboard</h3><a class="btn btn-primary btn-sm d-none d-sm-inline-block" role="button" href="#"><i class="fas fa-download fa-sm text-white-50"></i> Placeholder button</a>
|
<h3 class="text-dark mb-0">Dashboard</h3><a class="btn btn-primary btn-sm d-none d-sm-inline-block" role="button" href="#"><i class="fas fa-download fa-sm text-white-50"></i> Placeholder button</a>
|
||||||
</div>
|
</div>
|
||||||
@@ -170,21 +119,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{% endblock %}
|
||||||
</div>
|
|
||||||
<footer class="bg-white sticky-footer">
|
{% block scripts %}
|
||||||
<div class="container my-auto">
|
|
||||||
<div class="text-center my-auto copyright"><span>Copyright © yaris vroom vroom de course 2023</span></div>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
</div><a class="border rounded d-inline scroll-to-top" href="#page-top"><i class="fas fa-angle-up"></i></a>
|
|
||||||
</div>
|
|
||||||
<script src="{{ url_for('static', filename='js/chart.min.js') }}"></script>
|
<script src="{{ url_for('static', filename='js/chart.min.js') }}"></script>
|
||||||
<script src="{{ url_for('static', filename='vendor/socketio/socket.io.min.js') }}"></script>
|
<script src="{{ url_for('static', filename='vendor/socketio/socket.io.min.js') }}"></script>
|
||||||
<script src="{{ url_for('static', filename='vendor/leaflet/leaflet.js') }}"></script>
|
<script src="{{ url_for('static', filename='vendor/leaflet/leaflet.js') }}"></script>
|
||||||
<script src="{{ url_for('static', filename='js/yaris.js') }}"></script>
|
<script src="{{ url_for('static', filename='js/yaris.js') }}"></script>
|
||||||
<script src="{{ url_for('static', filename='bootstrap/js/bootstrap.min.js') }}"></script>
|
{% endblock %}
|
||||||
<script src="{{ url_for('static', filename='js/bs-init.js') }}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/theme.js') }}"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
Reference in New Issue
Block a user