module Main where import Data.List import Network.NewCGI hiding (Html) import Text.XHtml import Album import Config import EditAlbum import Util import View uploadPageUrl :: String uploadPageUrl = "?action=upload" makeUploadPage :: Album -> Html makeUploadPage album = thehtml << ((header << hdr) +++ (body ! [strAttr "onload" "init()"] << bdy)) where hdr = cssLink (albumStyleSheet album) +++ uploadInitScript album bdy = form ! [theclass "multifileform"] << (hiddenFields +++ noscript) hiddenFields = hidden "action" "upload" +++ hidden "album" (albumName album) noscript = thediv ! [theclass "noscript"] << "Your browser does not have the necessary javascript support." uploadInitScript :: Album -> Html uploadInitScript album = javascript << ("function init() {" ++ "initMultiFileForms();" ++ "return true;" ++ "}") +++ javascriptUrl (albumScript album "multifileform.js") saveFile :: Album -> String -> CGI () saveFile album var = do -- FIXME: what does fail do? should we make up a name? name <- getInputFilename var `err` fail "No filename given" cont <- getInput var `err` fail ("No value for field " ++ var) liftIO $ saveImage album name cont logCGI $ "Saved " ++ name doView :: Album -> CGI CGIResult doView album = do mf <- getInput "image" case mf of Nothing -> albumIndexPage album Just f -> imagePage album f doUpload :: Album -> CGI CGIResult doUpload album = do vs <- getInputNames let fs = filter ("file" `isPrefixOf`) vs mapM (saveFile album) fs outputHtml $ makeUploadPage album adminMain :: Album -> CGI CGIResult adminMain album = do ma <- getInput "action" case ma of Nothing -> doView album Just "upload" -> doUpload album Just x -> fail $ "Unknown action " ++ x main = runAlbum adminMain