gdritter repos inf-dict / 0f1bd77
Added edit/update functionality for words Getty Ritter 7 years ago
4 changed file(s) with 94 addition(s) and 10 deletion(s). Collapse all Expand all
2424 conn <- getContext
2525 liftIO (mote conn)
2626
27 unwrap :: Maybe a -> (a -> ActionCtxT ctx IO ()) -> ActionCtxT ctx IO ()
28 unwrap Nothing _ = setStatus status404
29 unwrap (Just x) f = f x
30
2731 main :: IO ()
2832 main = do
2933 dbLoc <- maybe "test.db" id `fmap` lookupEnv "DB_LOC"
3135 conn <- open dbLoc
3236 runSpock port $ spockT id $ prehook (return conn) $ do
3337 middleware $ staticPolicy (mempty <> hasPrefix "static")
38
3439 get root $ do
3540 html (rPage "welcome to the dictionary yo")
41
3642 get "add" $ do
3743 ls <- db allLanguages
3844 html (rPage (rAdd ls))
45
3946 get "search" $ do
4047 html (rPage rSearch)
48
4149 get "word" $ do
4250 es <- db getAllWords
4351 respondWith es
4452 post "word" $ do
45 ps <- params
46 case paramsToEntry ps of
47 Nothing -> setStatus status404
48 Just e -> do
49 i <- db (addWord e)
50 redirect (pack ("/word/" ++ show i))
53 ps <- paramsToEntry <$> params
54 unwrap ps $ \ e -> do
55 i <- db (addWord e)
56 redirect (pack ("/word/" ++ show i))
57
5158 get ("word" <//> var) $ \ w -> do
5259 eM <- db (getWordById w)
53 case eM of
54 Just e -> respondWith [e]
55 Nothing -> setStatus status404
60 unwrap eM $ \ e -> respondWith [e]
61 post ("word" <//> var) $ \ w -> do
62 ps <- paramsToEntry <$> params
63 unwrap ps $ \ e -> do
64 db (updateWord w e)
65 redirect (pack ("/word/" ++ show w))
66
67 get ("word" <//> var <//> "edit") $ \ w -> do
68 eM <- db (getWordById w)
69 ls <- db allLanguages
70 unwrap eM $ html . rPage . rEdit w ls
71
5672 get ("word" <//> "search" <//> var) $ \ t -> do
5773 db (searchAll t) >>= respondWith
74
5875 get ("word" <//> "search" <//> "by-word" <//> var) $ \ t -> do
5976 db (searchWord t) >>= respondWith
77
6078 get ("word" <//> "search" <//> "by-meaning" <//> var) $ \ t -> do
6179 db (searchMeaning t) >>= respondWith
4545 div_ [ class_ "meaning" ] $ toHtml (eMeaning e)
4646 when (eNotes e /= "") $
4747 div_ [ class_ "notes" ] $ toHtml (eNotes e)
48 ul_ [ class_ "links" ] $ do
49 li_ $ a_ [ href_ (pack ("/word/" ++ show (eID e) ++ "/edit")) ] "edit"
50 li_ $ a_ [ href_ (pack ("/word/" ++ show (eID e))) ] "link"
4851
4952 rSearch :: Html ()
5053 rSearch = form_ [ name_ "search" ] $ do
5154 input_ [ type_ "text", name_ "query" ]
5255
5356 rAdd :: [Language] -> Html ()
54 rAdd ls = form_ [ name_ "add", action_ "/word", method_ "POST" ] $ do
57 rAdd ls = form_ [ name_ "add", action_ "/word/", method_ "POST" ] $ do
5558 div_ $ do
5659 label_ "Language: "
5760 select_ [ name_ "lang" ] $ sequence_
7174 label_ "Notes: "
7275 textarea_ [ rows_ "4", cols_ "100", name_ "notes" ] ""
7376 div_ $ input_ [ type_ "submit" ]
77
78
79 rEdit :: Integer -> [Language] -> Entry -> Html ()
80 rEdit w ls e = form_ [ name_ "edit"
81 , action_ (pack ("/word/" ++ show w))
82 , method_ "POST"
83 ] $ do
84 div_ $ do
85 label_ "Language: "
86 select_ [ name_ "lang" ] $ sequence_
87 [ option_ [ value_ (pack (show i))
88 , select_ (if i == langId (eLanguage e)
89 then "true"
90 else "false")
91 ] $ toHtml n
92 | Language { langId = i, langName = n } <- ls
93 ]
94 div_ $ do
95 label_ "Word: "
96 input_ [ type_ "text"
97 , name_ "word"
98 , value_ (eWord e)
99 ]
100 div_ $ do
101 label_ "Transliteration: "
102 input_ [ type_ "text"
103 , name_ "translit"
104 , value_ (eTranslit e)
105 ]
106 div_ $ do
107 label_ "Meaning: "
108 textarea_ [ rows_ "4", cols_ "100", name_ "meaning" ] $
109 toHtml (eMeaning e)
110 div_ $ do
111 label_ "Notes: "
112 textarea_ [ rows_ "4", cols_ "100", name_ "notes" ] $
113 toHtml (eNotes e)
114 div_ $ input_ [ type_ "submit" ]
9999 execute conn q entry
100100 fromIntegral <$> lastInsertRowId conn
101101
102 updateWord :: Integer -> Entry -> DB ()
103 updateWord i e conn = do
104 let q = "UPDATE words \
105 \ SET word=?, trans=?, meaning=?, notes=? \
106 \ WHERE id=?"
107 execute conn q ( eWord e
108 , eTranslit e
109 , eMeaning e
110 , eNotes e
111 , i
112 )
113
102114 getWordById :: Integer -> DB (Maybe Entry)
103115 getWordById i conn = do
104116 let q = "SELECT w.id, w.word, w.trans, w.meaning, w.notes, l.id, l.name \
6363 }
6464
6565 .notes {
66 padding-top: 20px;
67 padding-left: 40px;
6668 font-style: italic;
6769 }
6870
116118
117119 textarea {
118120 float: right;
121 }
122
123 .links {
124 text-align: right;
125 }
126
127 .links li {
128 display: inline;
129 list-style-type: none;
130 padding-left: 20px;
131 padding-right: 20px;
119132 }