By | Chris Done |
At | 2011-06-11 |
Title | Channel defaulting for new page. |
Description |
Edit file src/Main.hs 33188 → 33188
41 41 ,("/js/",serveDirectory "wwwroot/js")
42 42 ,("",run Home.handle)
43 43 ,("/:id",run Paste.handle)
44 44 ,("/raw/:id",run Raw.handle)
45 45 ,("/new",run New.handle)
+ 46 ,("/new/:channel",run New.handle)
46 47 ,("/browse/page/:page/offset/:offset",run Browse.handle)
47 48 ,("/browse/page/:page",run Browse.handle)
48 49 ,("/browse",run Browse.handle)
49 50 ]
50 51 run = runHandler p cache
… … … … Edit file src/Amelie/View/Paste.hs 33188 → 33188
16 16 import Amelie.View.Hlint (viewHints)
17 17 import Amelie.View.Html
18 18 import Amelie.View.Layout
19 19 20 20 import Control.Applicative ((<$>),(<*>),pure)
+ 21 import Control.Arrow ((&&&))
21 22 import Control.Monad (when)
22 23 import Data.ByteString.UTF8 (toString)
+ 24 import Data.List (find)
23 25 import qualified Data.Map as M
24 26 import Data.Monoid.Operator ((++))
25 27 import Data.Text (Text)
+ 28 import qualified Data.Text as T
26 29 import Data.Text.Lazy (fromStrict)
27 30 import Data.Time.Show (showDateTime)
28 31 import Data.Traversable
29 32 import Prelude hiding ((++))
30 33 import Safe (readMay)
… … … … 62 65 PasteSubmit
63 66 <$> pure (getPasteId pf)
64 67 <*> req (textInput "title" "Title")
65 68 <*> req (textInput "author" "Author")
66 69 <*> parse (traverse lookupLang)
- 67 (opt (dropInput languages "language" "Language" "haskell"))
+ 70 (opt (dropInput languages "language" "Language" (snd defChan)))
68 71 <*> parse (traverse lookupChan)
- 69 (opt (dropInput channels "channel" "Channel" ""))
+ 72 (opt (dropInput channels "channel" "Channel" (fst defChan)))
70 73 <*> req (areaInput "paste" "Paste")
71 74 <*> opt (wrap (H.div ! aClass "spam") (textInput "email" "Email"))
72 75 73 76 where channels = options channelName channelName pfChannels
74 77 languages = options languageName languageTitle pfLanguages
75 78 76 79 lookupLang slug = findOption ((==slug).languageName) pfLanguages languageId
77 80 lookupChan slug = findOption ((==slug).channelName) pfChannels channelId
+ 81 + 82 defChan = maybe ("","haskell")
+ 83 (channelName &&& trim.channelName)
+ 84 (pfDefChan >>= findChan)
+ 85 findChan name = find ((==name).trim.channelName) pfChannels
+ 86 trim = T.dropWhile (=='#')
78 87 79 88 -- | Get the paste id.
80 89 getPasteId :: PasteFormlet -> Maybe PasteId
81 90 getPasteId PasteFormlet{..} =
82 91 M.lookup "paste_id" pfParams >>=
… … … … Edit file src/Amelie/Types/Paste.hs 33188 → 33188
74 74 pfSubmitted :: Bool
75 75 , pfErrors :: [Text]
76 76 , pfParams :: Params
77 77 , pfLanguages :: [Language]
78 78 , pfChannels :: [Channel]
+ 79 , pfDefChan :: Maybe Text
79 80 }
80 81 81 82 data PastePage = PastePage {
82 83 ppPaste :: Paste
83 84 , ppChans :: [Channel]
… … … … Edit file src/Amelie/Controller/Home.hs 33188 → 33188
21 21 handle = do
22 22 html <- cache Key.Home $ do
23 23 pastes <- model $ getLatestPastes
24 24 chans <- model $ getChannels
25 25 langs <- model $ getLanguages
- 26 form <- pasteForm chans langs
+ 26 form <- pasteForm chans langs Nothing
27 27 return $ Just $ page chans langs pastes form
28 28 maybe (return ()) outputText html
… … … … Edit file src/Amelie/Controller/New.hs 33188 → 33188
12 12 import Amelie.Model
13 13 import Amelie.Model.Channel (getChannels)
14 14 import Amelie.Model.Language (getLanguages)
15 15 import Amelie.View.New (page)
16 16 + 17 import Control.Applicative
+ 18 import Data.Text.Encoding (decodeUtf8)
+ 19 import Snap.Types
+ 20 17 21 handle :: Controller ()
18 22 handle = do
19 23 chans <- model $ getChannels
20 24 langs <- model $ getLanguages
- 21 form <- pasteForm chans langs
+ 25 defChan <- fmap decodeUtf8 <$> getParam "channel"
+ 26 form <- pasteForm chans langs defChan
22 27 output $ page form
… … … … Edit file src/Amelie/Controller/Paste.hs 33188 → 33188
24 24 import Control.Monad ((>=>))
25 25 import Data.ByteString.UTF8 (toString)
26 26 import Data.Maybe
27 27 import Data.Monoid.Operator ((++))
28 28 import Data.String (fromString)
+ 29 import Data.Text (Text)
29 30 import Prelude hiding ((++))
30 31 import Safe
31 32 import Snap.Types
32 33 import Text.Blaze.Html5 as H hiding (output)
33 34 import Text.Formlet
… … … … 54 55 , ppPaste = paste
55 56 }
56 57 justOrGoHome html outputText
57 58 58 59 -- | Control paste editing / submission.
- 59 pasteForm :: [Channel] -> [Language] -> Controller Html
- 60 pasteForm channels languages = do
+ 60 pasteForm :: [Channel] -> [Language] -> Maybe Text -> Controller Html
+ 61 pasteForm channels languages defChan = do
61 62 params <- getParams
62 63 submitted <- isJust <$> getParam "submit"
63 64 let formlet = PasteFormlet {
64 65 pfSubmitted = submitted
65 66 , pfErrors = []
66 67 , pfParams = params
67 68 , pfChannels = channels
68 69 , pfLanguages = languages
+ 70 , pfDefChan = defChan
69 71 }
70 72 (getValue,_) = pasteFormlet formlet
71 73 value = formletValue getValue params
72 74 errors = either id (const []) value
73 75 (_,html) = pasteFormlet formlet { pfErrors = errors }
… … … …