Compare commits

..

1 Commits

Author SHA1 Message Date
cfceee1ede Intro 2025-01-31 16:21:18 +01:00
9 changed files with 22 additions and 61 deletions

View File

@ -3,7 +3,8 @@ class DashboardController extends Controller {
public function index() { public function index() {
$vehicle = new Vehicle(); $vehicle = new Vehicle();
$vehicles = $vehicle->getVehiclesByUser($_SESSION['user']['id']); $vehicles = $vehicle->getVehiclesByUser($_SESSION['user']['id']);
$default_car = $vehicle->getDefaultVehicle($_SESSION['user']['id']) ?? null;
$default_car = $vehicle->getDefaultVehicle($_SESSION['user']['id']);
$refuel = new Refuel(); $refuel = new Refuel();
$data = [ $data = [
@ -12,7 +13,7 @@ class DashboardController extends Controller {
"mileage" => [], "mileage" => [],
"liters" => [] "liters" => []
]; ];
$raw_data = $default_car ? $refuel->latest_data($default_car['id'], 5) : []; $raw_data = $refuel->latest_data($default_car['id'], 5);
foreach($raw_data as $one) { foreach($raw_data as $one) {
array_push($data['date'], date('d. m.', strtotime($one['created_at']))); array_push($data['date'], date('d. m.', strtotime($one['created_at'])));
array_push($data['price'], $one['price_per_liter']); array_push($data['price'], $one['price_per_liter']);
@ -20,8 +21,7 @@ class DashboardController extends Controller {
array_push($data['liters'], $one['liters']); array_push($data['liters'], $one['liters']);
} }
$latest_data = $default_car ? $refuel->latest_one($default_car['id']) : []; $latest_record = $refuel->latest_one($_SESSION['user']['id'])[0];
$latest_record = !empty($latest_data) ? $latest_data[0] : null;
$this->view('dashboard/index', [ $this->view('dashboard/index', [
'title' => 'Dashboard', 'title' => 'Dashboard',

View File

@ -30,21 +30,17 @@ class VehicleController extends Controller {
} }
$vehicle = new Vehicle(); $vehicle = new Vehicle();
$default_vehicle = $vehicle->getDefaultVehicle($_SESSION['user']['id']);
$is_default = $default_vehicle ? 0 : 1;
$result = $vehicle->create([ $result = $vehicle->create([
'name' => $name, 'name' => $name,
'registration_plate' => strtoupper($registration_plate), 'registration_plate' => strtoupper($registration_plate),
'fuel_type' => $fuel_type, 'fuel_type' => $fuel_type,
'note' => $note, 'note' => $note,
'user_id' => $_SESSION['user']['id'], 'user_id' => $_SESSION['user']['id'],
'is_default' => $is_default
]); ]);
if ($result === true) { if ($result === true) {
$this->redirect('/'); $this->redirect('/vehicles');
} else { } else {
$this->view('vehicles/create', ['title' => 'Create vehicle', 'error' => $result, 'validationErrors' => []] ); $this->view('vehicles/create', ['title' => 'Create vehicle', 'error' => $result, 'validationErrors' => []] );
} }
@ -76,7 +72,7 @@ class VehicleController extends Controller {
return; return;
} }
header("Location: /vehicles"); $this->view('vehicles/index', ['title' => 'Vehicles', 'vehicles' => $vehicles]);
} }
public function setDefault() { public function setDefault() {
@ -88,7 +84,7 @@ class VehicleController extends Controller {
return; return;
} }
header("Location: /"); $this->view('vehicles/index', ['title' => 'Vehicles', 'vehicles' => $vehicles]);
} }
public function api_get() { public function api_get() {

View File

@ -60,7 +60,7 @@ class Refuel {
} }
} }
public function latest_one($vehicle_id, $record_count = 1) { public function latest_one($user_id, $record_count = 1) {
try { try {
$stmt = $this->db->prepare(" $stmt = $this->db->prepare("
SELECT SELECT
@ -70,16 +70,15 @@ class Refuel {
`r`.`price_per_liter`, `r`.`price_per_liter`,
`r`.`total_price`, `r`.`total_price`,
`r`.`mileage`, `r`.`mileage`,
`r`.`note`,
`r`.`created_at` `r`.`created_at`
FROM `refueling_records` AS `r` FROM `refueling_records` AS `r`
JOIN `vehicles` AS `v` ON `r`.`vehicle_id` = `v`.`id` JOIN `vehicles` AS `v` ON `r`.`vehicle_id` = `v`.`id`
WHERE `r`.`vehicle_id` = ? WHERE `r`.`user_id` = ?
ORDER BY `r`.`created_at` DESC ORDER BY `r`.`created_at` DESC
LIMIT ?; LIMIT ?;
"); ");
$stmt->bind_param("ii", $vehicle_id, $record_count); $stmt->bind_param("ii", $user_id, $record_count);
if ($stmt->execute()) { if ($stmt->execute()) {
$result = $stmt->get_result(); $result = $stmt->get_result();
$data = $result->fetch_all(MYSQLI_ASSOC); $data = $result->fetch_all(MYSQLI_ASSOC);

View File

@ -10,18 +10,17 @@ class Vehicle {
public function create($data) { public function create($data) {
try{ try{
$stmt = $this->db->prepare(" $stmt = $this->db->prepare("
INSERT INTO vehicles (user_id, name, registration_plate, fuel_type, note, is_default, created_at) INSERT INTO vehicles (user_id, name, registration_plate, fuel_type, note, created_at)
VALUES (?, ?, ?, ?, ?, ?, NOW()) VALUES (?, ?, ?, ?, ?, NOW())
"); ");
$stmt->bind_param( $stmt->bind_param(
"issssi", "issss",
$data['user_id'], $data['user_id'],
$data['name'], $data['name'],
$data['registration_plate'], $data['registration_plate'],
$data['fuel_type'], $data['fuel_type'],
$data['note'], $data['note'],
$data['is_default'],
); );
if ($stmt->execute()) { if ($stmt->execute()) {

View File

@ -5,15 +5,16 @@
<section class="dashboard"> <section class="dashboard">
<h1>Welcome, <?= htmlspecialchars($_SESSION['user']['username']) ?>!</h1> <h1>Welcome, <?= htmlspecialchars($_SESSION['user']['username']) ?>!</h1>
<?php if(!isset($data['default_car'])): ?> <?php if(!isset($data['default_car'])) { ?>
<div id="intro"> <div id="intro">
<a href="/vehicles/create">Create your first vehicle</a> <a href="/vehicles/create">Create your first vehicle</a>
</div> </div>
<?php elseif (isset($data['latest_record'])): ?>
<?php } else { ?>
<div id="actions"> <div id="actions">
<a href="/refuel/create" class="btn-green">Add new refuel record</a> <a href="/refuel/create" class="btn-green">Add new refuel record!</a>
<a href="/vehicles" class="btn-primary">List all vehicles</a> <a href="/vehicles" class="btn-primary">List all vehicles</a>
<a class="btn-warning" id="btn-offline-add">Add new offline refuel record</a> <a class="btn-warning" id="btn-offline-add">Add new offline refuel record</a>
</div> </div>
@ -32,10 +33,6 @@
<p><?= $data['latest_record']['total_price'] ?>,-</p> <p><?= $data['latest_record']['total_price'] ?>,-</p>
<b>Mileage:</b> <b>Mileage:</b>
<p><?= $data['latest_record']['mileage'] ?> km</p> <p><?= $data['latest_record']['mileage'] ?> km</p>
<?php if (isset($data['latest_record']['note'])): ?>
<b>Note:</b>
<p><?= $data['latest_record']['note'] ?></p>
<?php endif; ?>
</div> </div>
</section> </section>
@ -66,17 +63,7 @@
<b id="avg-fl-cnsmp"></b> <b id="avg-fl-cnsmp"></b>
</section> </section>
</div> </div>
<?php else: ?> <?php } ?>
<div id="actions">
<a href="/refuel/create" class="btn-green">Add new refuel record</a>
<a href="/vehicles" class="btn-primary">List all vehicles</a>
<a class="btn-warning" id="btn-offline-add">Add new offline refuel record</a>
</div>
<div class="alert-warning">
<p>Default vehicle <b><i><?= $data['default_car']['name'] ?></i></b> doesn't have any refuel record yet.</p>
<p>Select another vehicle or create first refuel record.</p>
</div>
<?php endif; ?>
</section> </section>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script> <script>

View File

@ -4,7 +4,7 @@
<p>No vehicles yet. <a href="/vehicles/create">Add your first vehicle</a>.</p> <p>No vehicles yet. <a href="/vehicles/create">Add your first vehicle</a>.</p>
<?php else: ?> <?php else: ?>
<div class="btn-wrapper"> <div class="btn-wrapper">
<a href="/vehicles/create" class="btn-green">Add new vehicle</a> <a href="/vehicles/create" class="btn-green">Add new vehicle!</a>
</div> </div>
<div class="vehicle-wrapper"> <div class="vehicle-wrapper">
<?php foreach ($this->get('vehicles') as $vehicle): ?> <?php foreach ($this->get('vehicles') as $vehicle): ?>
@ -13,18 +13,15 @@
<p><?= htmlspecialchars($vehicle['registration_plate']) ?></p> <p><?= htmlspecialchars($vehicle['registration_plate']) ?></p>
<p><?= htmlspecialchars($vehicle['fuel_type']) ?></p> <p><?= htmlspecialchars($vehicle['fuel_type']) ?></p>
<p><?= htmlspecialchars($vehicle['note'] ?? "") ?></p> <p><?= htmlspecialchars($vehicle['note'] ?? "") ?></p>
<div class="actions"> <div class="actions">
<br>
<form method="POST" action="/vehicles/delete"> <form method="POST" action="/vehicles/delete">
<input type="number" name="vehicle_id" value="<?= $vehicle['id'] ?>" style="display: none"> <input type="number" name="vehicle_id" value="<?= $vehicle['id'] ?>" style="display: none">
<input type="submit" value="Delete vehicle" class="btn-danger"> <input type="submit" value="Delete vehicle" class="btn-danger">
</form> </form>
<br>
<form method="POST" action="/vehicles/default"> <form method="POST" action="/vehicles/default">
<input type="number" name="vehicle_id" value="<?= $vehicle['id'] ?>" style="display: none"> <input type="number" name="vehicle_id" value="<?= $vehicle['id'] ?>" style="display: none">
<input type="submit" value="Set as default" class="btn-primary"> <input type="submit" value="Set default" class="btn-primary">
</form> </form>
</div> </div>
</div> </div>

View File

@ -6,8 +6,6 @@ services:
MARIADB_ROOT_PASSWORD: root MARIADB_ROOT_PASSWORD: root
ports: ports:
- 3306:3306 - 3306:3306
networks:
- fuelstats-network
profiles: ["prod", "dev"] profiles: ["prod", "dev"]
phpmyadmin: phpmyadmin:
@ -17,11 +15,6 @@ services:
- 8080:80 - 8080:80
environment: environment:
- PMA_ARBITRARY=1 - PMA_ARBITRARY=1
- PMA_HOST=mariadb
depends_on:
- mariadb
networks:
- fuelstats-network
profiles: ["dev"] profiles: ["dev"]
fuelstats: fuelstats:
@ -35,10 +28,4 @@ services:
depends_on: depends_on:
- mariadb - mariadb
restart: on-failure:2 restart: on-failure:2
networks:
- fuelstats-network
profiles: ["prod"] profiles: ["prod"]
networks:
fuelstats-network:
driver: bridge

View File

@ -9,6 +9,7 @@
flex-wrap: wrap; flex-wrap: wrap;
gap: 1rem; gap: 1rem;
justify-content: center; justify-content: center;
margin-top: 2rem;
} }
.card { .card {

View File

@ -52,8 +52,3 @@ h1 {
background-color: var(--clr-warning-muted); background-color: var(--clr-warning-muted);
border: var(--borderWidth-thin) solid var(--clr-border-danger); border: var(--borderWidth-thin) solid var(--clr-border-danger);
} }
#actions {
padding-top: 1rem;
padding-bottom: 2rem;
}