prevent scroll position from being lost when updating servings
This commit is contained in:
parent
e05a4d0ccd
commit
12a040fe87
4 changed files with 45 additions and 9 deletions
BIN
foods.db
BIN
foods.db
Binary file not shown.
40
src/main.rs
40
src/main.rs
|
|
@ -1,6 +1,6 @@
|
|||
use std::sync::{Arc, Mutex};
|
||||
|
||||
use axum::{extract::{Path, State}, response::{Html, Redirect}, routing::{get, post}, Router};
|
||||
use axum::{extract::{Path, State}, response::Html, routing::{get, post}, Router};
|
||||
use rusqlite::Connection;
|
||||
use askama::Template;
|
||||
|
||||
|
|
@ -11,6 +11,12 @@ struct IndexTemplate {
|
|||
sum: i32,
|
||||
}
|
||||
|
||||
#[derive(Template)]
|
||||
#[template(path = "food.html")]
|
||||
struct FoodTemplate {
|
||||
food: Food,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq)]
|
||||
struct Food {
|
||||
id: i32,
|
||||
|
|
@ -64,18 +70,42 @@ async fn root(
|
|||
async fn increase(
|
||||
State(conn): State<Arc<Mutex<Connection>>>,
|
||||
Path(id): Path<i32>
|
||||
) -> Redirect{
|
||||
) -> Html<String>{
|
||||
let conn = conn.lock().unwrap();
|
||||
let mut stmt = conn.prepare("UPDATE food SET actual_servings = (SELECT actual_servings FROM food WHERE id = ?1) + 1 WHERE id = ?1").unwrap();
|
||||
stmt.execute((id,)).unwrap();
|
||||
Redirect::to("/")
|
||||
let mut stmt = conn.prepare("SELECT id, portion, name, kc_per_serving, target_servings, actual_servings FROM food WHERE id = ?1").unwrap();
|
||||
let food = stmt.query_one((id,), |row| Ok(Food {
|
||||
id: row.get(0).unwrap(),
|
||||
portion: row.get(1).unwrap(),
|
||||
name: row.get(2).unwrap(),
|
||||
kc_per_serving: row.get(3).unwrap(),
|
||||
target_servings: row.get(4).unwrap(),
|
||||
actual_servings: row.get(5).unwrap(),
|
||||
})).unwrap();
|
||||
let food = FoodTemplate {food};
|
||||
Html(
|
||||
food.render().unwrap()
|
||||
)
|
||||
}
|
||||
async fn decrease(
|
||||
State(conn): State<Arc<Mutex<Connection>>>,
|
||||
Path(id): Path<i32>
|
||||
) -> Redirect{
|
||||
) -> Html<String>{
|
||||
let conn = conn.lock().unwrap();
|
||||
let mut stmt = conn.prepare("UPDATE food SET actual_servings = MAX((SELECT actual_servings FROM food WHERE id = ?1) - 1, 0) WHERE id = ?1").unwrap();
|
||||
stmt.execute((id,)).unwrap();
|
||||
Redirect::to("/")
|
||||
let mut stmt = conn.prepare("SELECT id, portion, name, kc_per_serving, target_servings, actual_servings FROM food WHERE id = ?1").unwrap();
|
||||
let food = stmt.query_one((id,), |row| Ok(Food {
|
||||
id: row.get(0).unwrap(),
|
||||
portion: row.get(1).unwrap(),
|
||||
name: row.get(2).unwrap(),
|
||||
kc_per_serving: row.get(3).unwrap(),
|
||||
target_servings: row.get(4).unwrap(),
|
||||
actual_servings: row.get(5).unwrap(),
|
||||
})).unwrap();
|
||||
let food = FoodTemplate {food};
|
||||
Html(
|
||||
food.render().unwrap()
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<div style="border: 1px solid black; margin: 1em; padding: 1em;">
|
||||
<div style="border: 1px solid black; margin: 1em; padding: 1em;" id="food-{{ food.id }}">
|
||||
<div style="text-align: center;">
|
||||
<p>
|
||||
<b>{{ food.name }}</b>
|
||||
|
|
@ -15,9 +15,14 @@
|
|||
<br>
|
||||
<form method="post">
|
||||
<div style="text-align: center;">
|
||||
<button formaction="/decrease/{{ food.id }}" style="width: 40%; height: 3em;" {% if food.actual_servings <=0 %}
|
||||
disabled {% endif %}>-</button>
|
||||
<button formaction="/increase/{{ food.id }}" style="width: 40%; height: 3em;">+</button>
|
||||
<button hx-post="/decrease/{{ food.id }}" hx-target="#food-{{ food.id }}" hx-swap="outerHTML"
|
||||
style="width: 40%; height: 3em;" {% if food.actual_servings <=0 %} disabled {% endif %}>
|
||||
-
|
||||
</button>
|
||||
<button hx-post="/increase/{{ food.id }}" hx-target="#food-{{ food.id }}" hx-swap="outerHTML"
|
||||
style="width: 40%; height: 3em;">
|
||||
+
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
|
@ -2,6 +2,7 @@
|
|||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.7/dist/htmx.min.js"></script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue