module Yesod.Crud.Simple where import Prelude import Data.Monoid import Lens.Micro import Lens.Micro.TH import Yesod.Core import Yesod.Form import Yesod.Persist import Database.Persist.Sql import Data.Text (Text) import Control.Monad import Data.Proxy import Yesod.Crud data SimpleCrud site p c = SimpleCrud { _scAdd :: WidgetT site IO () -> HandlerT site IO Html , _scIndex :: p -> HandlerT site IO Html , _scView :: Key c -> HandlerT site IO Html , _scEdit :: WidgetT site IO () -> HandlerT site IO Html , _scDelete :: WidgetT site IO () -> HandlerT site IO Html , _scDeleteForm :: WidgetT site IO () , _scForm :: Either p c -> Html -> MForm (HandlerT site IO) (FormResult c, WidgetT site IO ()) , _scFormWrap :: Enctype -> Route site -> WidgetT site IO () -> WidgetT site IO () , _scDeleteDb :: Key c -> YesodDB site p , _scAddDb :: p -> c -> YesodDB site (Key c) , _scEditDb :: Key c -> c -> YesodDB site p , _scMessageWrap :: Html -> Html , _scEditParent :: EditParent , _scPromoteRoute :: CrudRoute p c -> Route site } makeLenses ''SimpleCrud emptyParentlessSimpleCrud :: PersistCrudEntity site c => (CrudRoute () c -> Route site) -> SimpleCrud site () c emptyParentlessSimpleCrud tp = SimpleCrud (const $ return mempty) -- add (const $ return mempty) -- index (const $ return mempty) -- view (const $ return mempty) -- edit (const $ return mempty) -- delete mempty (const $ const $ return (FormMissing,mempty)) -- delete form (const $ const $ const mempty) -- form wrapper delete -- default deletion, assumes no FK constraints (const insert) -- default DB add replace -- default DB edit id -- default message wrap EditParentIndex tp emptyChildSimpleCrud :: PersistCrudEntity site c => (CrudRoute p c -> Route site) -> (Key c -> YesodDB site p) -> SimpleCrud site p c emptyChildSimpleCrud tp getParent = SimpleCrud (const $ return mempty) -- add (const $ return mempty) -- index (const $ return mempty) -- view (const $ return mempty) -- edit (const $ return mempty) -- delete mempty (const $ const $ return (FormMissing,mempty)) -- delete form (const $ const $ const mempty) -- form wrapper del -- default deletion, assumes no FK constraints (const insert) -- default DB add edit -- default DB edit id -- default message wrap EditParentIndex tp where del k = do p <- getParent k delete k return p edit k v = do replace k v getParent k applyBasicLayoutsAndForms :: PersistCrudEntity site a => SimpleCrud site p a -> SimpleCrud site p a applyBasicLayoutsAndForms initial = initial & scIndex .~ basicSimpleCrudIndex (_scPromoteRoute initial) (toWidget . toHtml . toPathPiece . entityKey) & scAdd .~ defaultLayout & scEdit .~ defaultLayout & scDelete .~ defaultLayout & scDeleteForm .~ [whamlet|