Files
packager/rust/src/components/trip.rs

308 lines
12 KiB
Rust
Raw Normal View History

2023-05-18 00:11:52 +02:00
use crate::models;
use crate::models::*;
use maud::{html, Markup};
2023-08-29 21:33:59 +02:00
pub struct TripManager;
2023-05-18 00:11:52 +02:00
impl TripManager {
2023-08-29 21:33:59 +02:00
pub fn build(trips: Vec<models::Trip>) -> Markup {
html!(
2023-05-18 00:11:52 +02:00
div ."p-8" {
2023-08-29 21:33:59 +02:00
(TripTable::build(trips))
(NewTrip::build())
2023-05-18 00:11:52 +02:00
}
2023-08-29 21:33:59 +02:00
)
2023-05-18 00:11:52 +02:00
}
}
2023-08-29 21:33:59 +02:00
pub struct TripTable;
2023-05-18 00:11:52 +02:00
impl TripTable {
2023-08-29 21:33:59 +02:00
pub fn build(trips: Vec<models::Trip>) -> Markup {
html!(
2023-05-18 00:11:52 +02:00
h1 ."text-2xl" ."mb-5" {"Trips"}
table
."table"
."table-auto"
."border-collapse"
."border-spacing-0"
."border"
."w-full"
{
thead ."bg-gray-200" {
tr ."h-10" {
th ."border" ."p-2" { "Name" }
th ."border" ."p-2" { "From" }
th ."border" ."p-2" { "To" }
th ."border" ."p-2" { "Nights" }
th ."border" ."p-2" { "State" }
}
}
tbody {
@for trip in trips {
tr ."h-10" ."even:bg-gray-100" ."hover:bg-purple-100" ."h-full" {
td ."border" ."p-0" ."m-0" {
a ."inline-block" ."p-2" ."m-0" ."w-full"
href=(format!("/trip/{id}/", id=trip.id))
{ (trip.name) }
}
td ."border" ."p-0" ."m-0" {
a ."inline-block" ."p-2" ."m-0" ."w-full"
href=(format!("/trip/{id}/", id=trip.id))
{ (trip.start_date) }
}
td ."border" ."p-0" ."m-0" {
a ."inline-block" ."p-2" ."m-0" ."w-full"
href=(format!("/trip/{id}/", id=trip.id))
{ (trip.end_date) }
}
td ."border" ."p-0" ."m-0" {
a ."inline-block" ."p-2" ."m-0" ."w-full"
href=(format!("/trip/{id}/", id=trip.id))
{ ((trip.end_date - trip.start_date).whole_days()) }
}
td ."border" ."p-0" ."m-0" {
a ."inline-block" ."p-2" ."m-0" ."w-full"
href=(format!("/trip/{id}/", id=trip.id))
{ (trip.state.to_string()) }
}
}
}
}
}
2023-08-29 21:33:59 +02:00
)
2023-05-18 00:11:52 +02:00
}
}
2023-08-29 21:33:59 +02:00
pub struct NewTrip;
2023-05-18 00:11:52 +02:00
impl NewTrip {
2023-08-29 21:33:59 +02:00
pub fn build() -> Markup {
html!(
2023-05-18 00:11:52 +02:00
form
name="new_trip"
action="/trip/"
target="_self"
method="post"
."mt-8" ."p-5" ."border-2" ."border-gray-200"
{
div ."mb-5" ."flex" ."flex-row" ."trips-center" {
span ."mdi" ."mdi-playlist-plus" ."text-2xl" ."mr-4" {}
p ."inline" ."text-xl" { "Add new trip" }
}
div ."w-11/12" ."m-auto" {
div ."mx-auto" ."pb-8" {
div ."flex" ."flex-row" ."justify-center" {
label for="trip-name" ."font-bold" ."w-1/2" ."p-2" ."text-center" { "Name" }
span ."w-1/2" {
input
type="text"
id="trip-name"
name="new-trip-name"
."block"
."w-full"
."p-2"
."bg-gray-50"
."border-2"
."rounded"
."focus:outline-none"
."focus:bg-white"
{}
}
}
}
div ."mx-auto" ."pb-8" {
div ."flex" ."flex-row" ."justify-center" {
label for="trip-name" ."font-bold" ."w-1/2" ."p-2" ."text-center" { "Start date" }
span ."w-1/2" {
input
type="date"
id="start-date"
name="new-trip-start-date"
."block"
."w-full"
."p-2"
."bg-gray-50"
."appearance-none"
."border-2"
."border-gray-300"
."rounded"
."focus:outline-none"
."focus:bg-white"
."focus:border-purple-500"
{}
}
}
}
div ."mx-auto" ."pb-8" {
div ."flex" ."flex-row" ."justify-center" {
label for="trip-name" ."font-bold" ."w-1/2" ."p-2" ."text-center" { "Start date" }
span ."w-1/2" {
input
type="date"
id="end-date"
name="new-trip-end-date"
."block"
."w-full"
."p-2"
."bg-gray-50"
."appearance-none"
."border-2"
."border-gray-300"
."rounded"
."focus:outline-none"
."focus:bg-white"
."focus:border-purple-500"
{}
}
}
}
input
type="submit"
value="Add"
."py-2"
."border-2"
."rounded"
."border-gray-300"
."mx-auto"
."w-full"
{}
}
}
2023-08-29 21:33:59 +02:00
)
2023-05-18 00:11:52 +02:00
}
}
2023-08-29 21:33:59 +02:00
pub struct Trip;
2023-05-18 00:11:52 +02:00
impl Trip {
2023-08-29 21:33:59 +02:00
pub fn build(trip: &models::Trip) -> Markup {
html!(
2023-05-18 00:11:52 +02:00
div ."p-8" {
div ."flex" ."flex-row" ."items-center" ."gap-x-3" {
h1 ."text-2xl" ."font-semibold"{ (trip.name) }
}
div ."my-6" {
2023-08-29 21:33:59 +02:00
(TripInfo::build(&trip))
2023-05-18 00:11:52 +02:00
}
}
2023-08-29 21:33:59 +02:00
)
2023-05-18 00:11:52 +02:00
}
}
2023-08-29 21:33:59 +02:00
pub struct TripInfo;
2023-05-18 00:11:52 +02:00
impl TripInfo {
2023-08-29 21:33:59 +02:00
pub fn build(trip: &models::Trip) -> Markup {
html!(
2023-05-18 00:11:52 +02:00
table
."table"
."table-auto"
."border-collapse"
."border-spacing-0"
."border"
."w-full"
{
tbody {
tr {
td ."border" ."p-2" { "State" }
td ."border" ."p-2" { (trip.state.to_string()) }
}
tr {
td ."border" ."p-2" { "Location" }
td ."border" ."p-2" { (trip.location) }
}
tr {
td ."border" ."p-2" { "Start date" }
td ."border" ."p-2" { (trip.start_date) }
}
tr {
td ."border" ."p-2" { "End date" }
td ."border" ."p-2" { (trip.end_date) }
}
tr {
td ."border" ."p-2" { "Temp (min)" }
td ."border" ."p-2" { (trip.temp_min) }
}
tr {
td ."border" ."p-2" { "Temp (max)" }
td ."border" ."p-2" { (trip.temp_max) }
}
tr {
td ."border" ."p-2" { "Types" }
td ."border" ."p-2" {
ul
."flex"
."flex-row"
."flex-wrap"
."gap-2"
."justify-between"
{
@let types = trip.types();
div
."flex"
."flex-row"
."flex-wrap"
."gap-2"
."justify-start"
{
@for triptype in types.iter().filter(|t| t.active) {
a href=(format!("type/{}/remove", triptype.id)) {
li
."border"
."rounded-2xl"
."py-0.5"
."px-2"
."bg-green-100"
."cursor-pointer"
."flex"
."flex-column"
."items-center"
."hover:bg-red-200"
."gap-1"
{
span { (triptype.name) }
span ."mdi" ."mdi-delete" ."text-sm" {}
}
}
}
}
div
."flex"
."flex-row"
."flex-wrap"
."gap-2"
."justify-start"
{
@for triptype in types.iter().filter(|t| !t.active) {
a href=(format!("type/{}/add", triptype.id)) {
li
."border"
."rounded-2xl"
."py-0.5"
."px-2"
."bg-gray-100"
."cursor-pointer"
."flex"
."flex-column"
."items-center"
."hover:bg-green-200"
."gap-1"
."opacity-60"
{
span { (triptype.name) }
span ."mdi" ."mdi-plus" ."text-sm" {}
}
}
}
}
}
}
}
}
}
2023-08-29 21:33:59 +02:00
)
2023-05-18 00:11:52 +02:00
}
}