aboutsummaryrefslogtreecommitdiff
path: root/lib/Server/Frontend/Tracker.hs
diff options
context:
space:
mode:
authorstuebinm2026-04-16 12:35:31 +0200
committerstuebinm2026-04-16 12:35:31 +0200
commitb893f41188eb6fe5bc1de54da7225fc150be7c7d (patch)
tree92f57cd3115e6bcb1f820f6e77801ccfaccff92c /lib/Server/Frontend/Tracker.hs
parent8b6c42d832f26bc277e125f876da8d21931550c6 (diff)
Server.Frontend.Tracker: creation & deletion dialogs
Diffstat (limited to '')
-rw-r--r--lib/Server/Frontend/Tracker.hs69
1 files changed, 62 insertions, 7 deletions
diff --git a/lib/Server/Frontend/Tracker.hs b/lib/Server/Frontend/Tracker.hs
index e3d88ba..a6c3c46 100644
--- a/lib/Server/Frontend/Tracker.hs
+++ b/lib/Server/Frontend/Tracker.hs
@@ -1,7 +1,7 @@
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE QuasiQuotes #-}
-module Server.Frontend.Tracker (getTrackerViewR, getTrackersR) where
+module Server.Frontend.Tracker (getTrackerViewR, getTrackersR, postTrackersR, postTrackerDeleteR) where
import Data.Coerce (coerce)
import Data.Function ((&))
import Data.Functor ((<&>))
@@ -14,7 +14,8 @@ import Database.Esqueleto.Experimental hiding ((<&>))
import Persist
import Server.Frontend.Routes (FrontendMessage (..), Handler,
Route (..), Widget)
-import Yesod hiding (update, (=.), (==.))
+import Yesod hiding (delete, update, (=.),
+ (==.))
import OwnTracks.Status
@@ -28,14 +29,53 @@ getTrackersR = do
pure (t, p)
& fmap associateJoin
+ createWidget <- trackerCreateWidget
+
defaultLayout [whamlet|
<h1> Trackers
- <section>
- <ul>
- $forall (trackerId, (Tracker{..}, status)) <- M.toList trackers
- <li><a href="@{TrackerViewR trackerName}">#{trackerName}</a>
+ <section>
+ <ul>
+ $forall (trackerId, (Tracker{..}, status)) <- M.toList trackers
+ <li><a href="@{TrackerViewR trackerName}">#{trackerName}</a>
+ <section>
+ ^{createWidget}
+ |]
+
+trackerCreateForm
+ :: Html
+ -> MForm Handler (FormResult Tracker, Widget)
+trackerCreateForm = renderDivs $ Tracker
+ <$> areq textField (fieldSettingsLabel MsgTrackerName) Nothing
+ <*> pure False
+ <*> areq textField (fieldSettingsLabel MsgTrackerAgent) Nothing
+ <*> pure Nothing
+
+trackerCreateWidget :: Handler Html
+trackerCreateWidget = do
+ (widget, enctype) <- generateFormPost trackerCreateForm
+ defaultLayout [whamlet|
+ <h2> _{MsgCreateTracker}
+ <form method=post action="@{TrackersR}" enctype=#{enctype}>
+ ^{widget}
+ <button>_{MsgSubmit}
|]
+postTrackersR :: Handler Html
+postTrackersR = do
+ ((result, widget), enctype) <- runFormPost trackerCreateForm
+ case result of
+ FormSuccess ann -> do
+ runDB do
+ insert ann
+ redirect TrackersR
+ _ -> defaultLayout
+ [whamlet|
+ <p>_{MsgInvalidInput}.
+ <form method=post action=@{TrackersR} enctype=#{enctype}>
+ ^{widget}
+ <button>_{MsgSubmit}
+ |]
+
getTrackerViewR :: Text -> Handler Html
getTrackerViewR name =
runDB (selectOne do
@@ -62,7 +102,14 @@ getTrackerViewR name =
-- TODO: leaflet map; auto updates?
defaultLayout [whamlet|
<h1> _{MsgTracker name}
- <em> (#{trackerId})
+ <section>
+ <h1> _{MsgTracker name}
+ <p>
+ Agent: #{trackerAgent} <br>
+ UUID: #{trackerId}
+ <p>
+ <form action=@{TrackerDeleteR trackerName} method="post">
+ <button> _{Msgdelete}
<section>
<h2> _{MsgLastTrackerStatus}
$maybe Entity _ TrackerStatus{..} <- maybeStatus
@@ -83,3 +130,11 @@ getTrackerViewR name =
$nothing
(none)
|]
+
+
+postTrackerDeleteR :: Text -> Handler Html
+postTrackerDeleteR name = do
+ runDB $ delete do
+ tracker <- from (table @Tracker)
+ where_ (tracker ^. TrackerName ==. val name)
+ redirect TrackersR