From 3fd1fa955fca6f96f9fa76dd33a10eb213ef7e00 Mon Sep 17 00:00:00 2001 From: kennyboy55 Date: Sun, 26 May 2024 15:12:56 +0200 Subject: [PATCH] Add easy admin buttons and fix enum usage --- app/components/cards/drink.page.tsx | 64 +++++++++++++++++-- app/routes/admin/edit/cocktail.$id.tsx | 2 +- app/routes/admin/edit/container.$id.tsx | 12 ++-- app/routes/admin/edit/soda.$id.tsx | 2 +- app/routes/admin/edit/wine.$id.tsx | 2 +- app/routes/admin/layout.tsx | 2 +- app/routes/admin/new/container.tsx | 14 ++-- app/routes/inventory/beer.$beerslug.tsx | 15 +++-- .../inventory/cocktail.$cocktailslug.tsx | 32 ++++++---- app/routes/inventory/manufacturer.$id.tsx | 20 +++--- app/routes/inventory/soda.$sodaslug.tsx | 38 ++++++----- app/routes/inventory/stats/route.tsx | 7 +- app/routes/inventory/wine.$wineslug.tsx | 37 ++++++----- 13 files changed, 161 insertions(+), 86 deletions(-) diff --git a/app/components/cards/drink.page.tsx b/app/components/cards/drink.page.tsx index f609b2c..8aec110 100644 --- a/app/components/cards/drink.page.tsx +++ b/app/components/cards/drink.page.tsx @@ -1,11 +1,13 @@ import { Manufacturer } from '@zenstackhq/runtime/models'; -import { Alert, Badge, Col, Container, Image, Row, Table } from 'react-bootstrap'; +import { Alert, Badge, Button, Col, Container, Image, Row, Table } from 'react-bootstrap'; +import { LinkContainer } from 'react-router-bootstrap'; import { ContainerWithSection, DrinkComposite, containerTypeToString, isBeer, isDrinkWithContainersAndSection, isDrinkWithManufacturer, isDrinkWithStyle } from '~/models/types'; import { volume } from '~/utils/conversions'; interface Arguments { drink: DrinkComposite + isAdmin: boolean } function DrinkPage(arg:Arguments) { @@ -44,6 +46,28 @@ function DrinkPage(arg:Arguments) { }) } + var link = (<>); + if(arg.drink.link){ + var href = arg.drink.link; + + var linktitle = "Open link"; + var linkcolor = "#6c757d"; + + if(href.includes("untappd")){ + linkcolor = "#ffc20b"; + linktitle = "Untappd"; + } + if(href.includes("vivino")) { + linkcolor = "#ba1628"; + linktitle = "Vivino"; + } + + link = ( + + ); + + } + return ( {glass ? ( @@ -52,17 +76,29 @@ function DrinkPage(arg:Arguments) { ): ""} + {arg.isAdmin ? ( + + + + + + + ) : ""} +
- +

{arg.drink.name}

0 ? "warning" : "secondary"}>ABV: {arg.drink.abv}% {style} {ibu} {arg.drink.sugar ? "" : Sugar-free} {arg.drink.gluten ? "" : Gluten-free} {arg.drink.organic ? Organic : ""} -

{arg.drink.description}

+

{arg.drink.description}

+ {link} - - + {arg.drink.image ? ( + + + ) : ""}
@@ -82,6 +118,9 @@ function DrinkPage(arg:Arguments) { Container Volume Amount + {arg.isAdmin ? ( + Edit + ) : ""} @@ -91,6 +130,9 @@ function DrinkPage(arg:Arguments) { {containerTypeToString(container.type)} {volume(container.volume)} {container.inventory} + {arg.isAdmin ? ( + + ) : ""} ))} @@ -106,14 +148,24 @@ function DrinkPage(arg:Arguments) { { manufacturer ? ( + {arg.isAdmin ? ( + + + + + + + ) : ""}

{manufacturer.name} ({manufacturer.country_id})

{manufacturer.description}

+ {manufacturer.image ? ( - + + ) : ""}
diff --git a/app/routes/admin/edit/cocktail.$id.tsx b/app/routes/admin/edit/cocktail.$id.tsx index 636698d..4e5dd5d 100644 --- a/app/routes/admin/edit/cocktail.$id.tsx +++ b/app/routes/admin/edit/cocktail.$id.tsx @@ -80,7 +80,7 @@ export default function EditCocktailRoute() {

Edit cocktail ({loaderData.cocktail.id})

-
+ ID diff --git a/app/routes/admin/edit/container.$id.tsx b/app/routes/admin/edit/container.$id.tsx index cbb712a..53a0fe3 100644 --- a/app/routes/admin/edit/container.$id.tsx +++ b/app/routes/admin/edit/container.$id.tsx @@ -75,7 +75,7 @@ export default function EditContainerRoute() {

Edit Container ({loaderData.container.id})

- + ID @@ -111,11 +111,11 @@ export default function EditContainerRoute() { Container type - - - - - + + + + + diff --git a/app/routes/admin/edit/soda.$id.tsx b/app/routes/admin/edit/soda.$id.tsx index 09c880b..3b529c0 100644 --- a/app/routes/admin/edit/soda.$id.tsx +++ b/app/routes/admin/edit/soda.$id.tsx @@ -80,7 +80,7 @@ export default function EditSodaRoute() {

Edit soda ({loaderData.soda.id})

- + ID diff --git a/app/routes/admin/edit/wine.$id.tsx b/app/routes/admin/edit/wine.$id.tsx index 995b3e1..5e223ae 100644 --- a/app/routes/admin/edit/wine.$id.tsx +++ b/app/routes/admin/edit/wine.$id.tsx @@ -98,7 +98,7 @@ export default function EditWineRoute() {

Edit wine ({loaderData.wine.id})

- + ID diff --git a/app/routes/admin/layout.tsx b/app/routes/admin/layout.tsx index ca32d82..0066ea5 100644 --- a/app/routes/admin/layout.tsx +++ b/app/routes/admin/layout.tsx @@ -17,7 +17,7 @@ export async function loader({ } let user = session.get("user"); - if(user.type != UserType.Admin){ + if(user.type != "Admin"){ return redirect("/"); } diff --git a/app/routes/admin/new/container.tsx b/app/routes/admin/new/container.tsx index 7cb74b6..cc2178b 100644 --- a/app/routes/admin/new/container.tsx +++ b/app/routes/admin/new/container.tsx @@ -1,6 +1,6 @@ import type { ActionFunctionArgs } from "@remix-run/node"; import { LoaderFunctionArgs, json, redirect } from "@remix-run/node"; -import { useLoaderData } from "@remix-run/react"; +import { isRouteErrorResponse, useLoaderData, useRouteError } from "@remix-run/react"; import { Container, Row, Button, Form, Col, ListGroup, InputGroup } from "react-bootstrap"; import { enhance } from "~/utils/db.server"; @@ -58,7 +58,7 @@ export default function NewContainerRoute() {

Add Container

- + Drink @@ -84,11 +84,11 @@ export default function NewContainerRoute() { Container type - - - - - + + + + + diff --git a/app/routes/inventory/beer.$beerslug.tsx b/app/routes/inventory/beer.$beerslug.tsx index afc42d3..335ecba 100644 --- a/app/routes/inventory/beer.$beerslug.tsx +++ b/app/routes/inventory/beer.$beerslug.tsx @@ -10,14 +10,15 @@ import { import DrinkPage from "~/components/cards/drink.page"; -import { db } from "~/utils/db.server"; -import { enhance } from "@zenstackhq/runtime"; + import { findIdFromSlug } from "~/models/drinks.server"; +import { enhance } from "~/utils/db.server"; export const loader = async ({ + request, params, }: LoaderFunctionArgs) => { - const dbe = enhance(db); + const {dbe, session} = await enhance(request); const beerid = await findIdFromSlug(params.beerslug); @@ -30,14 +31,18 @@ export const loader = async ({ status: 404, }); } - return json({ beer }); + + let user = session.get("user"); + let isAdmin = user?.type == "Admin"; + + return json({ beer , isAdmin: isAdmin}); }; export default function BeerRoute() { const data = useLoaderData(); return ( - + ); } diff --git a/app/routes/inventory/cocktail.$cocktailslug.tsx b/app/routes/inventory/cocktail.$cocktailslug.tsx index 11cf179..135c0e1 100644 --- a/app/routes/inventory/cocktail.$cocktailslug.tsx +++ b/app/routes/inventory/cocktail.$cocktailslug.tsx @@ -10,34 +10,38 @@ import { import DrinkPage from "~/components/cards/drink.page"; -import { db } from "~/utils/db.server"; -import { enhance } from "@zenstackhq/runtime"; import { findIdFromSlug } from "~/models/drinks.server"; +import { enhance } from "~/utils/db.server"; export const loader = async ({ + request, params, }: LoaderFunctionArgs) => { -const dbe = enhance(db); + const {dbe, session} = await enhance(request); -const cocktailid = await findIdFromSlug(params.cocktailslug); + const cocktailid = await findIdFromSlug(params.cocktailslug); -const cocktail = await dbe.cocktail.findUnique({ - where: { id: cocktailid }, - include: { manufacturer: true, containers: { include: { section: true}}} -}); -if (!cocktail) { - throw new Response("Cocktail not found.", { - status: 404, + const cocktail = await dbe.cocktail.findUnique({ + where: { id: cocktailid }, + include: { manufacturer: true, containers: { include: { section: true}}} }); -} -return json({ cocktail }); + if (!cocktail) { + throw new Response("Cocktail not found.", { + status: 404, + }); + } + + let user = session.get("user"); + let isAdmin = user?.type == "Admin"; + + return json({ cocktail , isAdmin: isAdmin}); }; export default function CocktailRoute() { const data = useLoaderData(); return ( - + ); } diff --git a/app/routes/inventory/manufacturer.$id.tsx b/app/routes/inventory/manufacturer.$id.tsx index 949289c..b2da15d 100644 --- a/app/routes/inventory/manufacturer.$id.tsx +++ b/app/routes/inventory/manufacturer.$id.tsx @@ -13,7 +13,7 @@ import DrinkPage from "~/components/cards/drink.page"; import { db } from "~/utils/db.server"; import { enhance } from "@zenstackhq/runtime"; import { findIdFromSlug } from "~/models/drinks.server"; -import { Image } from "react-bootstrap"; +import { Col, Container, Image, Row } from "react-bootstrap"; export const loader = async ({ params, @@ -37,12 +37,16 @@ export default function ManufacturerRoute() { const data = useLoaderData(); return ( -
-

{data.man.name} ({data.man.country_id})

-

{data.man.description}

- {data.man.image ? ( - - ) : <>} -
+ + + +

{data.man.name} ({data.man.country_id})

+

{data.man.description}

+ {data.man.image ? ( + + ) : <>} + +
+
); } \ No newline at end of file diff --git a/app/routes/inventory/soda.$sodaslug.tsx b/app/routes/inventory/soda.$sodaslug.tsx index c716986..3390236 100644 --- a/app/routes/inventory/soda.$sodaslug.tsx +++ b/app/routes/inventory/soda.$sodaslug.tsx @@ -10,35 +10,39 @@ import { import DrinkPage from "~/components/cards/drink.page"; -import { db } from "~/utils/db.server"; -import { enhance } from "@zenstackhq/runtime"; import { findIdFromSlug } from "~/models/drinks.server"; +import { enhance } from "~/utils/db.server"; export const loader = async ({ + request, params, }: LoaderFunctionArgs) => { -const dbe = enhance(db); + const {dbe, session} = await enhance(request); -const sodaid = await findIdFromSlug(params.sodaslug); + const sodaid = await findIdFromSlug(params.sodaslug); -const soda = await dbe.soda.findUnique({ - where: { id: sodaid }, - include: { manufacturer: true, containers: { include: { section: true}}} -}); -if (!soda) { - throw new Response("Soda not found.", { - status: 404, + const soda = await dbe.soda.findUnique({ + where: { id: sodaid }, + include: { manufacturer: true, containers: { include: { section: true}}} }); -} -return json({ soda }); + if (!soda) { + throw new Response("Soda not found.", { + status: 404, + }); + } + + let user = session.get("user"); + let isAdmin = user?.type == "Admin"; + + return json({ soda , isAdmin: isAdmin}); }; export default function SodaRoute() { -const data = useLoaderData(); + const data = useLoaderData(); -return ( - -); + return ( + + ); } export function ErrorBoundary() { diff --git a/app/routes/inventory/stats/route.tsx b/app/routes/inventory/stats/route.tsx index 6fcbe4d..37074e9 100644 --- a/app/routes/inventory/stats/route.tsx +++ b/app/routes/inventory/stats/route.tsx @@ -1,7 +1,8 @@ import { LoaderFunctionArgs, json } from "@remix-run/node"; -import { useLoaderData } from "@remix-run/react"; +import { Link, useLoaderData } from "@remix-run/react"; import { enhance } from "@zenstackhq/runtime"; -import { Col, Container, Row, Table } from "react-bootstrap"; +import { Button, Col, Container, Row, Table } from "react-bootstrap"; +import { LinkContainer } from "react-router-bootstrap"; import { ContainerWithDrink } from "~/models/types"; import timeAgo from "~/utils/datetime"; @@ -115,6 +116,7 @@ export default function StatsRoute() { Drink + View When Amount left @@ -123,6 +125,7 @@ export default function StatsRoute() { {loadData.history.map((entry) => ( {entry.container.drink.name} + {timeAgo(new Date(entry.checkoutAt))} {entry.inventoryAfter} diff --git a/app/routes/inventory/wine.$wineslug.tsx b/app/routes/inventory/wine.$wineslug.tsx index c102d03..4302006 100644 --- a/app/routes/inventory/wine.$wineslug.tsx +++ b/app/routes/inventory/wine.$wineslug.tsx @@ -10,35 +10,38 @@ import { import DrinkPage from "~/components/cards/drink.page"; -import { db } from "~/utils/db.server"; -import { enhance } from "@zenstackhq/runtime"; import { findIdFromSlug } from "~/models/drinks.server"; +import { enhance } from "~/utils/db.server"; export const loader = async ({ + request, params, }: LoaderFunctionArgs) => { -const dbe = enhance(db); + const {dbe, session} = await enhance(request); -const wineid = await findIdFromSlug(params.wineslug); + const wineid = await findIdFromSlug(params.wineslug); -const wine = await dbe.wine.findUnique({ - where: { id: wineid }, - include: { style: true, manufacturer: true, containers: { include: { section: true}}} -}); -if (!wine) { - throw new Response("Wine not found.", { - status: 404, + const wine = await dbe.wine.findUnique({ + where: { id: wineid }, + include: { style: true, manufacturer: true, containers: { include: { section: true}}} }); -} -return json({ wine }); + if (!wine) { + throw new Response("Wine not found.", { + status: 404, + }); + } + let user = session.get("user"); + let isAdmin = user?.type == "Admin"; + + return json({ wine , isAdmin: isAdmin}); }; export default function WineRoute() { -const data = useLoaderData(); + const data = useLoaderData(); -return ( - -); + return ( + + ); } export function ErrorBoundary() {