Layout changes

demo-mode
Wes Holland 12 months ago
parent ba0a6c88fb
commit a22a052c99

@ -50,7 +50,7 @@ pub async fn item(State(db): State<SqlitePool>,
Path(id): Path<i64>, Path(id): Path<i64>,
user: SessionUser user: SessionUser
) -> Result<Response, AppError> { ) -> Result<Response, AppError> {
let mut item: ItemDisplayItem = inventory_item_get_by_id_with_unit(&db, id).await?.into(); let item: ItemDisplayItem = inventory_item_get_by_id_with_unit(&db, id).await?.into();
Ok(ItemTemplate { item_id: id, item }.into_response()) Ok(ItemTemplate { item_id: id, item }.into_response())
} }
@ -67,16 +67,13 @@ pub async fn item_count(State(db): State<SqlitePool>, Path(id): Path<i64>) -> Re
#[template(path = "item-stats-fragment.html")] #[template(path = "item-stats-fragment.html")]
struct ItemStatsTemplate { struct ItemStatsTemplate {
pub item_id: i64, pub item_id: i64,
pub amount: String, pub item: ItemDisplayItem,
pub unit_abbreviation: String,
pub value: String, pub value: String,
} }
pub async fn item_stats(State(db): State<SqlitePool>, Path(id): Path<i64>) -> Result<Response, AppError> { pub async fn item_stats(State(db): State<SqlitePool>, Path(id): Path<i64>) -> Result<Response, AppError> {
//TODO This is pretty chatty with the database. Might could cut down the //TODO This is pretty chatty with the database. Might could cut down the
// number of queries // number of queries
let amount = sum_all_adjustments_for_item(&db, id).await?.to_string(); let item: ItemDisplayItem = inventory_item_get_by_id_with_unit(&db, id).await?.into();
let unit_abbreviation = inventory_item_get_unit_abbreviation(&db, id).await?;
let value = get_item_adjustment_valuation_weighted_mean(&db, id) let value = get_item_adjustment_valuation_weighted_mean(&db, id)
.await? .await?
@ -86,5 +83,5 @@ pub async fn item_stats(State(db): State<SqlitePool>, Path(id): Path<i64>) -> Re
let value = int_cents_to_dollars_string(value); let value = int_cents_to_dollars_string(value);
Ok(ItemStatsTemplate { item_id: id, amount, unit_abbreviation, value }.into_response()) Ok(ItemStatsTemplate { item_id: id, item, value }.into_response())
} }

@ -1,30 +1,43 @@
<form hx-post="/item/{{item_id}}/adjustment/new-stock" hx-target="this" hx-swap="outerHTML" > <form hx-post="/item/{{item_id}}/adjustment/new-stock" hx-target="this" hx-swap="outerHTML" >
<div class="mb-3"> <div class="row">
<label for="amount" class="form-label">Amount</label> <div class="col">
<input id="amount" class="form-control" name="amount" type="number" required <input type="number"
{% if !amount_error.is_empty() -%} id="amount"
aria-invalid="true" name="amount"
aria-describedby="invalid-amount" step="0.01"
{% endif -%} class="form-control"
/> placeholder="Amount"
{% if !amount_error.is_empty() -%} aria-label="amount"
<small id="invalid-amount" class="invalid-feedback">{{ amount_error }}</small> required
{% endif -%} {% if !amount_error.is_empty() -%}
</div> aria-invalid="true"
<div class="mb-3"> aria-describedby="invalid-amount"
<label for="price" class="form-label">Price</label> {% endif -%}
<input id="price" class="form-control" name="price" required />
{% if !price_error.is_empty() -%} {% if !amount_error.is_empty() -%}
aria-invalid="true" <small id="invalid-amount" class="invalid-feedback">{{ amount_error }}</small>
aria-describedby="invalid-price" {% endif -%}
{% endif -%} </div>
/> <div class="col">
{% if !price_error.is_empty() -%} <input type="text"
<small id="invalid-price" class="invalid-feedback">{{ price_error }}</small> id="price"
{% endif -%} name="price"
</div> placeholder="Price"
<div class="mb-3"> class="form-control"
<button class="btn btn-primary">Add Stock</button> aria-label="price"
required
{% if !price_error.is_empty() -%}
aria-invalid="true"
aria-describedby="invalid-price"
{% endif -%}
/>
{% if !price_error.is_empty() -%}
<small id="invalid-price" class="invalid-feedback">{{ price_error }}</small>
{% endif -%}
</div>
<div class="col">
<button class="btn btn-primary">Add</button>
</div>
</div> </div>
</form> </form>

@ -1,18 +1,27 @@
<form hx-post="/item/{{item_id}}/adjustment/sale" hx-target="this" hx-swap="outerHTML" > <form hx-post="/item/{{item_id}}/adjustment/sale" hx-target="this" hx-swap="outerHTML" >
<div class="mb-3"> <div class="row">
<label for="amount" class="form-label">Amount</label> <div class="col">
<input id="amount" class="form-control" name="amount" type="number" step="0.01" required <!--<label for="amount" class="form-label">Amount</label>-->
{% if !amount_error.is_empty() -%} <input type="number"
aria-invalid="true" id="amount"
aria-describedby="invalid-amount" name="amount"
{% endif -%} step="0.01"
/> class="form-control"
{% if !amount_error.is_empty() -%} placeholder="Amount"
aria-label="amount"
required
{% if !amount_error.is_empty() -%}
aria-invalid="true"
aria-describedby="invalid-amount"
{% endif -%}
/>
{% if !amount_error.is_empty() -%}
<small id="invalid-amount" class="invalid-feedback">{{ amount_error }}</small> <small id="invalid-amount" class="invalid-feedback">{{ amount_error }}</small>
{% endif -%} {% endif -%}
</div> </div>
<div class="mb-3"> <div class="col">
<button class="btn btn-primary">Record Sale</button> <button class="btn btn-primary">Record Sale</button>
</div>
</div> </div>
</form> </form>

@ -1,6 +1,36 @@
<div hx-get="/item/{{item_id}}/stats" hx-trigger="new-adjustment from:body" hx-swap="outerHTML" class="row"> <section hx-get="/item/{{item_id}}/stats" hx-trigger="new-adjustment from:body" hx-swap="outerHTML" class="mb-4">
<div class="col">Amount in stock: {{amount}} {{unit_abbreviation}}</div> <div class="row">
<div class="col">Total Value: {{value}}</div> <div class="col-md-3">
</div> <div class="card text-center mb-1">
<div class="card-header">
<p class="text-bolder text-uppercase">Stock</p>
</div>
<div class="card-body">
<p class="display-6">{{item.amount}} {{item.display_unit_short}}</p>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card text-center mb-1">
<div class="card-header">
<p class="text-bolder text-uppercase">Reorder Point</p>
</div>
<div class="card-body">
<p class="display-6">{{item.reorder_point}} {{item.display_unit_short}}</p>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card text-center mb-1">
<div class="card-header">
<p class="text-bolder text-uppercase">Value</p>
</div>
<div class="card-body">
<p class="display-6">{{value}}</p>
</div>
</div>
</div>
</div>
</section>

@ -4,26 +4,37 @@
{% block content %} {% block content %}
<div class="container mb-5">
<h2>{{item.name}} {% if !item.active %}<span class="badge text-bg-danger">Inactive</span> {% endif %}</h2> <h2>{{item.name}} {% if !item.active %}<span class="badge text-bg-danger">Inactive</span> {% endif %}</h2>
</div>
<section class="container"> <section class="container">
<div hx-get="/item/{{item_id}}/stats" hx-trigger="load" hx-swap="outerHTML"> <div hx-get="/item/{{item_id}}/stats" hx-trigger="load" hx-swap="outerHTML">
</div> </div>
<div class="grid">
<article>Reorder at: {{item.reorder_point}}</article>
</div>
</section> </section>
{% if item.active %} {% if item.active %}
<section class="container-fluid"> <section class="container-fluid">
<div class="row">
<div class="col-sm-6"> <div x-data="{ open: false }" class="mb-3">
<div hx-get="/item/{{item_id}}/adjustment/sale" hx-trigger="load" hx-swap="outerHTML"> <div class="d-flex justify-content-start">
<div class="me-3">
<button class="btn btn-primary" @click="open = ! open">Sale</button>
</div>
<div x-show="open" @click.outside="open = false">
<div hx-get="/item/{{item_id}}/adjustment/sale" hx-trigger="load" hx-swap="outerHTML"></div>
</div> </div>
</div> </div>
<div class="col-sm-6"> </div>
<div hx-get="/item/{{item_id}}/adjustment/new-stock" hx-trigger="load" hx-swap="outerHTML">
<div x-data="{ open: false }" class="mb-3">
<div class="d-flex justify-content-start">
<div class="me-3">
<button class="btn btn-primary" @click="open = ! open">Stock</button>
</div>
<div x-show="open" @click.outside="open = false">
<div hx-get="/item/{{item_id}}/adjustment/new-stock" hx-trigger="load" hx-swap="outerHTML">
</div>
</div> </div>
</div> </div>
</div> </div>

Loading…
Cancel
Save

Powered by TurnKey Linux.