2023-05-08 22:31:01 +02:00
|
|
|
use maud::{html, Markup};
|
2023-05-08 00:05:45 +02:00
|
|
|
|
|
|
|
|
use crate::models::*;
|
2023-05-10 00:42:42 +02:00
|
|
|
use crate::ClientState;
|
2023-05-11 16:51:57 +02:00
|
|
|
use uuid::{uuid, Uuid};
|
2023-05-08 00:05:45 +02:00
|
|
|
|
|
|
|
|
pub struct Inventory {
|
2023-05-08 22:31:01 +02:00
|
|
|
doc: Markup,
|
2023-05-08 00:05:45 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Inventory {
|
2023-05-10 00:42:42 +02:00
|
|
|
pub async fn build(state: ClientState, categories: Vec<Category>) -> Result<Self, Error> {
|
2023-05-08 00:05:45 +02:00
|
|
|
let doc = html!(
|
2023-05-08 22:31:01 +02:00
|
|
|
div id="pkglist-item-manager" {
|
|
|
|
|
div ."p-8" ."grid" ."grid-cols-4" ."gap-3" {
|
|
|
|
|
div ."col-span-2" {
|
2023-05-17 17:31:48 +02:00
|
|
|
(InventoryCategoryList::build(&state, &categories).into_markup())
|
2023-05-08 22:31:01 +02:00
|
|
|
}
|
|
|
|
|
div ."col-span-2" {
|
|
|
|
|
h1 ."text-2xl" ."mb-5" ."text-center" { "Items" }
|
2023-05-17 17:31:48 +02:00
|
|
|
@if let Some(active_category_id) = state.active_category_id {
|
|
|
|
|
(InventoryItemList::build(&state, categories.iter().find(|category| category.id == active_category_id)
|
|
|
|
|
.ok_or(Error::NotFoundError { description: format!("no category with id {}", active_category_id) })?
|
|
|
|
|
.items())
|
|
|
|
|
.into_markup())
|
2023-05-08 22:31:01 +02:00
|
|
|
}
|
2023-05-17 17:31:48 +02:00
|
|
|
(InventoryNewItemForm::build(&state, &categories).into_markup())
|
2023-05-08 22:31:01 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-05-08 00:05:45 +02:00
|
|
|
);
|
|
|
|
|
|
|
|
|
|
Ok(Self { doc })
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-10 00:48:25 +02:00
|
|
|
impl From<Inventory> for Markup {
|
|
|
|
|
fn from(val: Inventory) -> Self {
|
|
|
|
|
val.doc
|
2023-05-08 00:05:45 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub struct InventoryCategoryList {
|
2023-05-08 22:31:01 +02:00
|
|
|
doc: Markup,
|
2023-05-08 00:05:45 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl InventoryCategoryList {
|
2023-05-17 17:31:48 +02:00
|
|
|
pub fn build(state: &ClientState, categories: &Vec<Category>) -> Self {
|
2023-05-08 00:05:45 +02:00
|
|
|
let biggest_category_weight: u32 = categories
|
|
|
|
|
.iter()
|
2023-05-10 01:02:37 +02:00
|
|
|
.map(Category::total_weight)
|
2023-05-08 00:05:45 +02:00
|
|
|
.max()
|
|
|
|
|
.unwrap_or(1);
|
|
|
|
|
|
|
|
|
|
let doc = html!(
|
2023-05-08 22:31:01 +02:00
|
|
|
div {
|
|
|
|
|
h1 ."text-2xl" ."mb-5" ."text-center" { "Categories" }
|
|
|
|
|
table
|
|
|
|
|
."table"
|
|
|
|
|
."table-auto"
|
|
|
|
|
."border-collapse"
|
|
|
|
|
."border-spacing-0"
|
|
|
|
|
."border"
|
|
|
|
|
."w-full"
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
colgroup {
|
|
|
|
|
col style="width:50%" {}
|
|
|
|
|
col style="width:50%" {}
|
|
|
|
|
}
|
|
|
|
|
thead ."bg-gray-200" {
|
|
|
|
|
tr ."h-10" {
|
2023-05-17 17:31:48 +02:00
|
|
|
th ."border" ."p-2" ."w-3/5" { "Name" }
|
2023-05-08 22:31:01 +02:00
|
|
|
th ."border" ."p-2" { "Weight" }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
tbody {
|
|
|
|
|
@for category in categories {
|
2023-05-17 17:47:26 +02:00
|
|
|
@let active = state.active_category_id.map_or(false, |id| category.id == id);
|
|
|
|
|
tr
|
|
|
|
|
."h-10"
|
|
|
|
|
."hover:bg-purple-100"
|
|
|
|
|
."m-3"
|
|
|
|
|
."h-full"
|
|
|
|
|
."outline"[active]
|
|
|
|
|
."outline-2"[active]
|
|
|
|
|
."outline-indigo-300"[active]
|
|
|
|
|
."pointer-events-none"[active]
|
|
|
|
|
{
|
2023-05-08 22:31:01 +02:00
|
|
|
|
|
|
|
|
td
|
2023-05-17 17:31:48 +02:00
|
|
|
class=@if state.active_category_id.map_or(false, |id| category.id == id) {
|
2023-05-08 22:31:01 +02:00
|
|
|
"border p-0 m-0 font-bold"
|
|
|
|
|
} @else {
|
|
|
|
|
"border p-0 m-0"
|
|
|
|
|
} {
|
|
|
|
|
a
|
2023-05-08 00:05:45 +02:00
|
|
|
id="select-category"
|
2023-05-08 22:31:01 +02:00
|
|
|
href=(
|
2023-05-08 00:05:45 +02:00
|
|
|
format!(
|
|
|
|
|
"/inventory/category/{id}",
|
|
|
|
|
id=category.id
|
|
|
|
|
)
|
2023-05-08 22:31:01 +02:00
|
|
|
)
|
|
|
|
|
// hx-post=(
|
|
|
|
|
// format!(
|
|
|
|
|
// "/inventory/category/{id}/items",
|
|
|
|
|
// id=category.id
|
|
|
|
|
// )
|
|
|
|
|
// )
|
|
|
|
|
// hx-swap="outerHTML"
|
|
|
|
|
// hx-target="#items"
|
|
|
|
|
."inline-block" ."p-2" ."m-0" ."w-full"
|
|
|
|
|
{
|
|
|
|
|
(category.name.clone())
|
2023-05-08 00:05:45 +02:00
|
|
|
}
|
2023-05-08 22:31:01 +02:00
|
|
|
}
|
|
|
|
|
td ."border" ."p-2" ."m-0" style="position:relative;" {
|
|
|
|
|
p {
|
|
|
|
|
(category.total_weight().to_string())
|
|
|
|
|
}
|
|
|
|
|
div ."bg-blue-600" ."h-1.5"
|
|
|
|
|
style=(
|
2023-05-08 00:05:45 +02:00
|
|
|
format!(
|
|
|
|
|
"width: {width}%;position:absolute;left:0;bottom:0;right:0;",
|
|
|
|
|
width=(
|
2023-05-10 01:02:37 +02:00
|
|
|
f64::from(category.total_weight())
|
|
|
|
|
/ f64::from(biggest_category_weight)
|
2023-05-08 00:05:45 +02:00
|
|
|
* 100.0
|
|
|
|
|
)
|
|
|
|
|
)
|
2023-05-08 22:31:01 +02:00
|
|
|
) {}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
tr ."h-10" ."hover:bg-purple-200" ."bg-gray-300" ."font-bold" {
|
|
|
|
|
td ."border" ."p-0" ."m-0" {
|
|
|
|
|
p ."p-2" ."m-2" { "Sum" }
|
|
|
|
|
}
|
|
|
|
|
td ."border" ."p-0" ."m-0" {
|
|
|
|
|
p ."p-2" ."m-2" {
|
2023-05-10 01:02:37 +02:00
|
|
|
(categories.iter().map(Category::total_weight).sum::<u32>().to_string())
|
2023-05-08 22:31:01 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-05-08 00:05:45 +02:00
|
|
|
);
|
|
|
|
|
|
2023-05-10 01:02:37 +02:00
|
|
|
Self { doc }
|
2023-05-08 00:05:45 +02:00
|
|
|
}
|
2023-05-17 17:31:48 +02:00
|
|
|
|
|
|
|
|
fn into_markup(self) -> Markup {
|
|
|
|
|
self.doc
|
|
|
|
|
}
|
2023-05-08 00:05:45 +02:00
|
|
|
}
|
|
|
|
|
|
2023-05-10 00:48:25 +02:00
|
|
|
impl From<InventoryCategoryList> for Markup {
|
|
|
|
|
fn from(val: InventoryCategoryList) -> Self {
|
|
|
|
|
val.doc
|
2023-05-08 00:05:45 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub struct InventoryItemList {
|
2023-05-08 22:31:01 +02:00
|
|
|
doc: Markup,
|
2023-05-08 00:05:45 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl InventoryItemList {
|
2023-05-17 17:31:48 +02:00
|
|
|
pub fn build(state: &ClientState, items: &Vec<Item>) -> Self {
|
2023-05-08 22:31:01 +02:00
|
|
|
let biggest_item_weight: u32 = items.iter().map(|item| item.weight).max().unwrap_or(1);
|
|
|
|
|
let doc = html!(
|
|
|
|
|
div #items {
|
|
|
|
|
@if items.is_empty() {
|
|
|
|
|
p ."text-lg" ."text-center" ."py-5" ."text-gray-400" { "[Empty]" }
|
|
|
|
|
} @else {
|
2023-05-17 17:31:48 +02:00
|
|
|
@if let Some(edit_item) = state.edit_item {
|
2023-05-12 00:31:08 +02:00
|
|
|
form
|
|
|
|
|
name="edit-item"
|
|
|
|
|
id="edit-item"
|
|
|
|
|
action=(format!("/inventory/item/{edit_item}/edit"))
|
|
|
|
|
target="_self"
|
|
|
|
|
method="post"
|
|
|
|
|
{}
|
|
|
|
|
}
|
2023-05-08 22:31:01 +02:00
|
|
|
table
|
|
|
|
|
."table"
|
|
|
|
|
."table-auto"
|
2023-05-17 17:31:48 +02:00
|
|
|
.table-fixed
|
2023-05-08 22:31:01 +02:00
|
|
|
."border-collapse"
|
|
|
|
|
."border-spacing-0"
|
|
|
|
|
."border"
|
|
|
|
|
."w-full"
|
|
|
|
|
{
|
|
|
|
|
thead ."bg-gray-200" {
|
|
|
|
|
tr ."h-10" {
|
2023-05-17 17:31:48 +02:00
|
|
|
th ."border" ."p-2" ."w-3/5" { "Name" }
|
2023-05-08 22:31:01 +02:00
|
|
|
th ."border" ."p-2" { "Weight" }
|
2023-05-17 17:31:48 +02:00
|
|
|
th ."border" ."p-2" ."w-10" {}
|
|
|
|
|
th ."border" ."p-2" ."w-10" {}
|
2023-05-08 22:31:01 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
tbody {
|
|
|
|
|
@for item in items {
|
2023-05-17 17:31:48 +02:00
|
|
|
@if state.edit_item.map_or(false, |edit_item| edit_item == item.id) {
|
2023-05-12 00:31:08 +02:00
|
|
|
tr ."h-10" {
|
2023-05-17 17:47:26 +02:00
|
|
|
td ."border" ."bg-blue-300" ."px-2" ."py-0" {
|
|
|
|
|
div ."h-full" ."w-full" {
|
|
|
|
|
input ."px-1" ."block" ."w-full" ."bg-blue-100" ."hover:bg-white"
|
|
|
|
|
type="text"
|
|
|
|
|
id="edit-item-name"
|
|
|
|
|
name="edit-item-name"
|
|
|
|
|
form="edit-item"
|
|
|
|
|
value=(item.name)
|
|
|
|
|
{}
|
|
|
|
|
}
|
2023-05-12 00:31:08 +02:00
|
|
|
}
|
2023-05-17 17:31:48 +02:00
|
|
|
td ."border" ."bg-blue-300" ."px-2" ."py-0" {
|
2023-05-17 17:47:26 +02:00
|
|
|
div ."h-full" ."w-full" {
|
|
|
|
|
input ."px-1"."block" ."w-full" ."bg-blue-100" ."hover:bg-white"
|
|
|
|
|
type="number"
|
|
|
|
|
id="edit-item-weight"
|
|
|
|
|
name="edit-item-weight"
|
|
|
|
|
form="edit-item"
|
|
|
|
|
value=(item.weight)
|
|
|
|
|
{}
|
|
|
|
|
}
|
2023-05-12 00:31:08 +02:00
|
|
|
}
|
2023-05-17 17:31:48 +02:00
|
|
|
td ."border-none" ."bg-green-100" ."hover:bg-green-200" .flex ."p-0" {
|
|
|
|
|
div .aspect-square .w-full .h-full .flex {
|
|
|
|
|
button type="submit" form="edit-item" .m-auto .w-full .h-full {
|
|
|
|
|
span ."mdi" ."mdi-content-save" ."text-xl" .m-auto {}
|
|
|
|
|
}
|
2023-05-12 00:31:08 +02:00
|
|
|
}
|
|
|
|
|
}
|
2023-05-17 17:31:48 +02:00
|
|
|
td ."border-none" ."bg-red-100" ."hover:bg-red-200" ."p-0" {
|
|
|
|
|
div .aspect-square .flex .w-full .h-full {
|
|
|
|
|
a href=(format!("/inventory/item/{id}/cancel", id = item.id)) .flex .m-auto .w-full .h-full {
|
|
|
|
|
span ."mdi" ."mdi-cancel" ."text-xl" .m-auto {}
|
|
|
|
|
}
|
2023-05-12 00:31:08 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-05-11 16:51:57 +02:00
|
|
|
} @else {
|
|
|
|
|
tr ."h-10" ."even:bg-gray-100" ."hover:bg-purple-100" {
|
|
|
|
|
td ."border" ."p-0" {
|
2023-05-10 00:42:42 +02:00
|
|
|
a
|
2023-05-11 16:51:57 +02:00
|
|
|
."p-2" ."w-full" ."inline-block"
|
|
|
|
|
href=(
|
|
|
|
|
format!("/inventory/item/{id}/", id=item.id)
|
|
|
|
|
) {
|
|
|
|
|
|
|
|
|
|
(item.name.clone())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
td ."border" ."p-2" style="position:relative;" {
|
|
|
|
|
p { (item.weight.to_string()) }
|
|
|
|
|
div ."bg-blue-600" ."h-1.5" style=(format!("
|
|
|
|
|
width: {width}%;
|
|
|
|
|
position:absolute;
|
|
|
|
|
left:0;
|
|
|
|
|
bottom:0;
|
|
|
|
|
right:0;", width=(f64::from(item.weight) / f64::from(biggest_item_weight) * 100.0))) {}
|
|
|
|
|
}
|
|
|
|
|
td
|
2023-05-17 17:47:26 +02:00
|
|
|
."border-none"
|
|
|
|
|
."p-0"
|
2023-05-11 16:51:57 +02:00
|
|
|
."bg-blue-200"
|
|
|
|
|
."hover:bg-blue-400"
|
|
|
|
|
."cursor-pointer"
|
|
|
|
|
."w-8"
|
|
|
|
|
."text-center"
|
|
|
|
|
{
|
2023-05-17 17:31:48 +02:00
|
|
|
div .aspect-square .flex .w-full .h-full {
|
|
|
|
|
a href = (format!("?edit_item={id}", id = item.id)) ."m-auto"
|
|
|
|
|
{
|
|
|
|
|
button {
|
|
|
|
|
span ."mdi" ."mdi-pencil" ."text-xl" {}
|
|
|
|
|
}
|
2023-05-11 16:51:57 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
td
|
2023-05-17 17:47:26 +02:00
|
|
|
."border-none"
|
|
|
|
|
."p-0"
|
2023-05-11 16:51:57 +02:00
|
|
|
."bg-red-200"
|
|
|
|
|
."hover:bg-red-400"
|
|
|
|
|
."cursor-pointer"
|
|
|
|
|
."w-8"
|
|
|
|
|
."text-center"
|
2023-05-10 00:42:42 +02:00
|
|
|
{
|
2023-05-17 17:31:48 +02:00
|
|
|
div .aspect-square .flex .w-full .h-full {
|
|
|
|
|
a href = (format!("/inventory/item/{id}/delete", id = item.id)) ."m-auto"
|
|
|
|
|
{
|
|
|
|
|
button {
|
|
|
|
|
span ."mdi" ."mdi-delete" ."text-xl" {}
|
|
|
|
|
}
|
2023-05-11 16:51:57 +02:00
|
|
|
}
|
2023-05-10 00:42:42 +02:00
|
|
|
}
|
2023-05-11 16:51:57 +02:00
|
|
|
}
|
2023-05-10 00:42:42 +02:00
|
|
|
}
|
2023-05-08 22:31:01 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
2023-05-10 01:02:37 +02:00
|
|
|
Self { doc }
|
2023-05-08 22:31:01 +02:00
|
|
|
}
|
2023-05-17 17:31:48 +02:00
|
|
|
|
|
|
|
|
fn into_markup(self) -> Markup {
|
|
|
|
|
self.doc
|
|
|
|
|
}
|
2023-05-08 22:31:01 +02:00
|
|
|
}
|
|
|
|
|
|
2023-05-10 00:48:25 +02:00
|
|
|
impl From<InventoryItemList> for Markup {
|
|
|
|
|
fn from(val: InventoryItemList) -> Self {
|
|
|
|
|
val.doc
|
2023-05-08 22:31:01 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub struct InventoryNewItemForm {
|
|
|
|
|
doc: Markup,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl InventoryNewItemForm {
|
2023-05-10 01:02:37 +02:00
|
|
|
pub fn build(state: &ClientState, categories: &Vec<Category>) -> Self {
|
2023-05-08 00:05:45 +02:00
|
|
|
let doc = html!(
|
2023-05-08 22:31:01 +02:00
|
|
|
|
|
|
|
|
form
|
|
|
|
|
name="new-item"
|
|
|
|
|
id="new-item"
|
|
|
|
|
action="/inventory/item/"
|
|
|
|
|
target="_self"
|
|
|
|
|
method="post"
|
|
|
|
|
."mt-8" ."p-5" ."border-2" ."border-gray-200" {
|
|
|
|
|
div ."mb-5" ."flex" ."flex-row" ."items-center" {
|
|
|
|
|
span ."mdi" ."mdi-playlist-plus" ."text-2xl" ."mr-4" {}
|
|
|
|
|
p ."inline" ."text-xl" { "Add new item" }
|
|
|
|
|
}
|
|
|
|
|
div ."w-11/12" ."mx-auto" {
|
|
|
|
|
div ."pb-8" {
|
|
|
|
|
div ."flex" ."flex-row" ."justify-center" ."items-start"{
|
2023-05-10 00:42:42 +02:00
|
|
|
label for="name" .font-bold ."w-1/2" ."p-2" ."text-center" { "Name" }
|
2023-05-08 22:31:01 +02:00
|
|
|
span ."w-1/2" {
|
2023-05-10 00:42:42 +02:00
|
|
|
input type="text" id="new-item-name" name="new-item-name"
|
2023-05-08 22:31:01 +02:00
|
|
|
."block"
|
|
|
|
|
."w-full"
|
|
|
|
|
."p-2"
|
|
|
|
|
."bg-gray-50"
|
|
|
|
|
."border-2"
|
|
|
|
|
."rounded"
|
|
|
|
|
."focus:outline-none"
|
|
|
|
|
."focus:bg-white"
|
|
|
|
|
."focus:border-purple-500"
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
div ."flex" ."flex-row" ."justify-center" ."items-center" ."pb-8" {
|
2023-05-10 00:42:42 +02:00
|
|
|
label for="weight" .font-bold ."w-1/2" .text-center { "Weight" }
|
2023-05-08 22:31:01 +02:00
|
|
|
span ."w-1/2" {
|
|
|
|
|
input
|
|
|
|
|
type="text"
|
2023-05-10 00:42:42 +02:00
|
|
|
id="new-item-weight"
|
|
|
|
|
name="new-item-weight"
|
2023-05-08 22:31:01 +02:00
|
|
|
."block"
|
|
|
|
|
."w-full"
|
|
|
|
|
."p-2"
|
|
|
|
|
."bg-gray-50"
|
|
|
|
|
."border-2"
|
|
|
|
|
."border-gray-300"
|
|
|
|
|
."rounded"
|
|
|
|
|
."focus:outline-none"
|
|
|
|
|
."focus:bg-white"
|
|
|
|
|
."focus:border-purple-500"
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
div ."flex" ."flex-row" ."justify-center" ."items-center" ."pb-8" {
|
|
|
|
|
label for="item-category" .font-bold ."w-1/2" .text-center { "Category" }
|
|
|
|
|
span ."w-1/2" {
|
|
|
|
|
select
|
2023-05-10 00:42:42 +02:00
|
|
|
id="new-item-category-id"
|
|
|
|
|
name="new-item-category-id"
|
2023-05-08 22:31:01 +02:00
|
|
|
."block"
|
|
|
|
|
."w-full"
|
|
|
|
|
."p-2"
|
|
|
|
|
."bg-gray-50"
|
|
|
|
|
."border-2"
|
|
|
|
|
."border-gray-300"
|
|
|
|
|
."rounded"
|
|
|
|
|
."focus:outline-none"
|
|
|
|
|
."focus:bg-white"
|
2023-05-17 17:31:48 +02:00
|
|
|
."focus:border-purple-500"
|
|
|
|
|
autocomplete="off" // https://stackoverflow.com/a/10096033
|
|
|
|
|
{
|
2023-05-08 22:31:01 +02:00
|
|
|
@for category in categories {
|
2023-05-17 17:31:48 +02:00
|
|
|
option value=(category.id) selected[state.active_category_id.map_or(false, |id| id == category.id)] {
|
|
|
|
|
(category.name)
|
2023-05-08 22:31:01 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
input type="submit" value="Add"
|
|
|
|
|
."py-2"
|
|
|
|
|
."border-2"
|
|
|
|
|
."rounded"
|
|
|
|
|
."border-gray-300"
|
|
|
|
|
."mx-auto"
|
|
|
|
|
."w-full" {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-05-08 00:05:45 +02:00
|
|
|
);
|
|
|
|
|
|
2023-05-10 01:02:37 +02:00
|
|
|
Self { doc }
|
2023-05-08 00:05:45 +02:00
|
|
|
}
|
2023-05-17 17:31:48 +02:00
|
|
|
|
|
|
|
|
fn into_markup(self) -> Markup {
|
|
|
|
|
self.doc
|
|
|
|
|
}
|
2023-05-08 00:05:45 +02:00
|
|
|
}
|
|
|
|
|
|
2023-05-10 00:48:25 +02:00
|
|
|
impl From<InventoryNewItemForm> for Markup {
|
|
|
|
|
fn from(val: InventoryNewItemForm) -> Self {
|
|
|
|
|
val.doc
|
2023-05-08 00:05:45 +02:00
|
|
|
}
|
|
|
|
|
}
|
2023-05-08 22:31:01 +02:00
|
|
|
// impl InventoryItemList {
|
|
|
|
|
// pub fn to_string(self) -> String {
|
|
|
|
|
// self.doc.into_string()
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
//ItemList
|