subtree(users/wpcarro): docking briefcase at '24f5a642'
git-subtree-dir: users/wpcarro git-subtree-mainline:464bbcb15cgit-subtree-split:24f5a642afChange-Id: I6105b3762b79126b3488359c95978cadb3efa789
This commit is contained in:
commit
019f8fd211
766 changed files with 175420 additions and 0 deletions
245
users/wpcarro/assessments/tt/client/src/User.elm
Normal file
245
users/wpcarro/assessments/tt/client/src/User.elm
Normal file
|
|
@ -0,0 +1,245 @@
|
|||
module User exposing (render)
|
||||
|
||||
import Common
|
||||
import Date
|
||||
import DatePicker
|
||||
import Html exposing (..)
|
||||
import Html.Attributes exposing (..)
|
||||
import Html.Events exposing (..)
|
||||
import Maybe.Extra as ME
|
||||
import RemoteData
|
||||
import State
|
||||
import Tailwind
|
||||
import UI
|
||||
import Utils
|
||||
|
||||
|
||||
createTrip : State.Model -> Html State.Msg
|
||||
createTrip model =
|
||||
div []
|
||||
[ UI.header 3 "Plan Upcoming Trip"
|
||||
, UI.textField
|
||||
{ pholder = "Where are you going?"
|
||||
, inputId = "destination"
|
||||
, handleInput = State.UpdateTripDestination
|
||||
, inputValue = model.tripDestination
|
||||
}
|
||||
, div [ [ "flex" ] |> Tailwind.use |> class ]
|
||||
[ UI.datePicker
|
||||
{ mDate = model.tripStartDate
|
||||
, prompt = "Set departure date"
|
||||
, prefix = "Departure: "
|
||||
, picker = model.startDatePicker
|
||||
, onUpdate = State.UpdateTripStartDate
|
||||
}
|
||||
, UI.datePicker
|
||||
{ mDate = model.tripEndDate
|
||||
, prompt = "Set return date"
|
||||
, prefix = "Return: "
|
||||
, picker = model.endDatePicker
|
||||
, onUpdate = State.UpdateTripEndDate
|
||||
}
|
||||
]
|
||||
, UI.textField
|
||||
{ pholder = "Comments?"
|
||||
, inputId = "comment"
|
||||
, handleInput = State.UpdateTripComment
|
||||
, inputValue = model.tripComment
|
||||
}
|
||||
, UI.baseButton
|
||||
{ enabled =
|
||||
List.all
|
||||
identity
|
||||
[ String.length model.tripDestination > 0
|
||||
, String.length model.tripComment > 0
|
||||
, ME.isJust model.tripStartDate
|
||||
, ME.isJust model.tripEndDate
|
||||
]
|
||||
, extraClasses = [ "my-4" ]
|
||||
, handleClick =
|
||||
case ( model.tripStartDate, model.tripEndDate ) of
|
||||
( Nothing, _ ) ->
|
||||
State.DoNothing
|
||||
|
||||
( _, Nothing ) ->
|
||||
State.DoNothing
|
||||
|
||||
( Just startDate, Just endDate ) ->
|
||||
State.AttemptCreateTrip startDate endDate
|
||||
, label = "Schedule trip"
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
renderEditTrip : State.Model -> State.Trip -> Html State.Msg
|
||||
renderEditTrip model trip =
|
||||
li []
|
||||
[ div []
|
||||
[ UI.textField
|
||||
{ handleInput = State.UpdateEditTripDestination
|
||||
, inputId = "edit-trip-destination"
|
||||
, inputValue = model.editTripDestination
|
||||
, pholder = "Destination"
|
||||
}
|
||||
, UI.textField
|
||||
{ handleInput = State.UpdateEditTripComment
|
||||
, inputId = "edit-trip-comment"
|
||||
, inputValue = model.editTripComment
|
||||
, pholder = "Comment"
|
||||
}
|
||||
]
|
||||
, div []
|
||||
[ UI.baseButton
|
||||
{ enabled =
|
||||
case model.updateTripStatus of
|
||||
RemoteData.Loading ->
|
||||
False
|
||||
|
||||
_ ->
|
||||
True
|
||||
, extraClasses = []
|
||||
, label =
|
||||
case model.updateTripStatus of
|
||||
RemoteData.Loading ->
|
||||
"Saving..."
|
||||
|
||||
_ ->
|
||||
"Save"
|
||||
, handleClick =
|
||||
State.AttemptUpdateTrip
|
||||
{ username = trip.username
|
||||
, destination = trip.destination
|
||||
, startDate = trip.startDate
|
||||
}
|
||||
{ username = trip.username
|
||||
, destination = model.editTripDestination
|
||||
, startDate = trip.startDate
|
||||
, endDate = trip.endDate
|
||||
, comment = model.editTripComment
|
||||
}
|
||||
}
|
||||
, UI.simpleButton
|
||||
{ label = "Cancel"
|
||||
, handleClick = State.CancelEditTrip
|
||||
}
|
||||
]
|
||||
]
|
||||
|
||||
|
||||
renderTrip : Date.Date -> State.Trip -> Html State.Msg
|
||||
renderTrip today trip =
|
||||
li
|
||||
[ [ "py-2" ]
|
||||
|> Tailwind.use
|
||||
|> class
|
||||
]
|
||||
[ if Date.compare today trip.startDate == GT then
|
||||
UI.paragraph
|
||||
(String.fromInt (Date.diff Date.Days trip.startDate today)
|
||||
++ " days until you're travelling to "
|
||||
++ trip.destination
|
||||
++ " for "
|
||||
++ String.fromInt
|
||||
(Date.diff
|
||||
Date.Days
|
||||
trip.startDate
|
||||
trip.endDate
|
||||
)
|
||||
++ " days."
|
||||
)
|
||||
|
||||
else
|
||||
UI.paragraph
|
||||
(String.fromInt (Date.diff Date.Days today trip.endDate)
|
||||
++ " days ago you returned from your trip to "
|
||||
++ trip.destination
|
||||
)
|
||||
, UI.paragraph ("\"" ++ trip.comment ++ "\"")
|
||||
, UI.wrapNoPrint
|
||||
(UI.textButton
|
||||
{ label = "Edit"
|
||||
, handleClick = State.EditTrip trip
|
||||
}
|
||||
)
|
||||
, UI.wrapNoPrint
|
||||
(UI.textButton
|
||||
{ label = "Delete"
|
||||
, handleClick = State.AttemptDeleteTrip trip
|
||||
}
|
||||
)
|
||||
]
|
||||
|
||||
|
||||
trips : State.Model -> Html State.Msg
|
||||
trips model =
|
||||
div []
|
||||
[ UI.header 3 "Your Trips"
|
||||
, case model.trips of
|
||||
RemoteData.NotAsked ->
|
||||
UI.paragraph "Somehow we've reached the user home page without requesting your trips data. Please report this to our engineering team at bugs@tripplaner.tld"
|
||||
|
||||
RemoteData.Loading ->
|
||||
UI.paragraph "Loading your trips..."
|
||||
|
||||
RemoteData.Failure e ->
|
||||
UI.paragraph ("Error: " ++ Utils.explainHttpError e)
|
||||
|
||||
RemoteData.Success xs ->
|
||||
case model.todaysDate of
|
||||
Nothing ->
|
||||
text ""
|
||||
|
||||
Just today ->
|
||||
div [ [ "mb-10" ] |> Tailwind.use |> class ]
|
||||
[ ul [ [ "my-4" ] |> Tailwind.use |> class ]
|
||||
(xs
|
||||
|> List.sortWith (\x y -> Date.compare y.startDate x.startDate)
|
||||
|> List.map
|
||||
(\trip ->
|
||||
case model.editingTrip of
|
||||
Nothing ->
|
||||
renderTrip today trip
|
||||
|
||||
Just x ->
|
||||
if x == trip then
|
||||
renderEditTrip model trip
|
||||
|
||||
else
|
||||
renderTrip today trip
|
||||
)
|
||||
)
|
||||
, UI.wrapNoPrint
|
||||
(UI.simpleButton
|
||||
{ label = "Print iternary"
|
||||
, handleClick = State.PrintPage
|
||||
}
|
||||
)
|
||||
]
|
||||
]
|
||||
|
||||
|
||||
render : State.Model -> Html State.Msg
|
||||
render model =
|
||||
Common.withSession model
|
||||
(\session ->
|
||||
div
|
||||
[ class
|
||||
([ "container"
|
||||
, "mx-auto"
|
||||
, "text-center"
|
||||
]
|
||||
|> Tailwind.use
|
||||
)
|
||||
]
|
||||
[ UI.wrapNoPrint (UI.header 2 ("Welcome, " ++ session.username ++ "!"))
|
||||
, UI.wrapNoPrint (createTrip model)
|
||||
, trips model
|
||||
, UI.wrapNoPrint
|
||||
(UI.textButton
|
||||
{ label = "Logout"
|
||||
, handleClick = State.AttemptLogout
|
||||
}
|
||||
)
|
||||
, Common.allErrors model
|
||||
]
|
||||
)
|
||||
Loading…
Add table
Add a link
Reference in a new issue