aboutsummaryrefslogtreecommitdiff
path: root/webgui/src/Main.hs
diff options
context:
space:
mode:
Diffstat (limited to 'webgui/src/Main.hs')
-rw-r--r--webgui/src/Main.hs78
1 files changed, 78 insertions, 0 deletions
diff --git a/webgui/src/Main.hs b/webgui/src/Main.hs
new file mode 100644
index 0000000..d96083e
--- /dev/null
+++ b/webgui/src/Main.hs
@@ -0,0 +1,78 @@
1module Main (main) where
2
3import qualified Graphics.UI.Threepenny as UI
4import Graphics.UI.Threepenny.Core
5
6import Thermoprint.Client
7
8import qualified Options.Applicative as Opt
9import System.Environment
10
11import Data.ByteString (ByteString)
12import qualified Data.ByteString as BS
13import qualified Data.ByteString.Char8 as CBS
14
15import Control.Applicative
16import Control.Monad
17import Data.Maybe
18import Data.Monoid
19import Text.Read
20
21main :: IO ()
22main = config >>= Opt.execParser . opts >>= flip startGUI setup
23 where
24 opts config = Opt.info (Opt.helper <*> config)
25 ( Opt.fullDesc
26 <> Opt.progDesc "Run a webgui to Thermoprint.Client"
27 )
28
29config :: IO (Opt.Parser Config)
30config = do
31 p <- fromMaybe 8023 . (readMaybe =<<) <$> lookupEnv portEnv
32 a <- fromMaybe "localhost" <$> lookupEnv hostEnv
33 return $ (\port addr -> defaultConfig { jsPort = port, jsAddr = addr })
34 <$> optional (Opt.option Opt.auto $ port p)
35 <*> optional (fmap CBS.pack $ Opt.strOption $ addr a)
36 where
37 port def = Opt.long "port"
38 <> Opt.short 'p'
39 <> Opt.metavar "PORT"
40 <> Opt.help ("Port to bind to; default read from $" <> portEnv)
41 <> Opt.value def
42 <> Opt.showDefault
43 addr def = Opt.long "addr"
44 <> Opt.short 'a'
45 <> Opt.metavar "HOST"
46 <> Opt.help ("Host to listen on; default read from $" <> hostEnv)
47 <> Opt.value def
48 <> Opt.showDefault
49 hostEnv = "ADDR"
50 portEnv = "PORT"
51
52setup :: Window -> UI ()
53setup window = void $ do
54 return window # set UI.title "Thermoprint"
55
56 title <- UI.input
57 # set UI.id_ "title"
58 content <- UI.textarea
59 # set UI.id_ "content"
60 draftTable <- UI.table
61
62 saveBtn <- UI.button #+ [string "Save"]
63 discBtn <- UI.button #+ [string "Discard"]
64 prntBtn <- UI.button #+ [string "Print"]
65
66 getBody window #+ [ row [ column [ UI.h1 #+ [string "Current draft"]
67 , row [UI.label # set text "Title" # set UI.for "title", element title]
68 , element content
69 , row [ element saveBtn
70 , element prntBtn
71 , element discBtn
72 ]
73 ]
74 , column [ UI.h1 #+ [string "Saved drafts"]
75 , element draftTable
76 ]
77 ]
78 ]