Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
Yesod.Form.Option
Synopsis
- optionsFromList' :: MonadHandler m => RenderMessage (HandlerSite m) msg => PathPiece a => [a] -> (a -> msg) -> m (OptionList a)
- optionsEnum' :: MonadHandler m => RenderMessage (HandlerSite m) msg => PathPiece a => Enum a => Bounded a => (a -> msg) -> m (OptionList a)
Documentation
optionsFromList' :: MonadHandler m => RenderMessage (HandlerSite m) msg => PathPiece a => [a] -> (a -> msg) -> m (OptionList a) Source #
Creates an OptionList
from a List
, using the PathPiece
instance for
the external value and a custom function for the user-facing value.
PathPiece instances should provide suitable external values, since path pieces serve to be exposed through URLs or HTML anyway. Show/Read instances are avoided here since they could leak internal representations to forms, query params, javascript etc.
Example usage
data UserRole = URSalesTeam | URSalesHead | URTechTeam | URTechHead instance PathPiece UserDepartment where toPathPiece = \case URSalesTeam -> "sales-team" URSalesHead -> "sales-head" URTechTeam -> "tech-team" URTechHead -> "tech-head" fromPathPiece = \case "sales-team" -> Just URSalesTeam "sales-head" -> Just URSalesHead "tech-team" -> Just URTechTeam "tech-head" -> Just URTechHead _ -> Nothing userRoleOptions :: (MonadHandler m, RenderMessage (HandlerSite m) msg) => m (OptionList UserRole) userRoleOptions = optionsFromList' userRoles toMsg where userRoles = [URSalesTeam, URSalesHead, URTechTeam, URTechHead] toMsg :: UserRole -> Text toMsg = \case URSalesTeam -> "Sales Team" URSalesHead -> "Head of Sales Team" URTechTeam -> "Tech Team" URTechHead -> "Head of Tech Team"
userRoleOptions, will produce an OptionList with the following attributes:
+----------------+----------------+--------------------+ | Internal Value | External Value | User-facing Value | +----------------+----------------+--------------------+ | URSalesTeam | sales-team | Sales Team | +----------------+----------------+--------------------+ | URSalesHead | sales-head | Head of Sales Team | +----------------+----------------+--------------------+ | URTechTeam | tech-team | Tech Team | +----------------+----------------+--------------------+ | URTechHead | tech-head | Head of Tech Team | +----------------+----------------+--------------------+
Note that the type constraint allows localizable messages in place of toMsg (see https://en.wikipedia.org/wiki/Yesod_(web_framework)#Localizable_messages).
Since: 1.7.7
optionsEnum' :: MonadHandler m => RenderMessage (HandlerSite m) msg => PathPiece a => Enum a => Bounded a => (a -> msg) -> m (OptionList a) Source #
Creates an OptionList
from an Enum
.
optionsEnum' == optionsFromList' [minBound..maxBound]
Creates an OptionList
containing every constructor of a
, so that these
constructors do not need to be typed out. Bounded and Enum instances must
exist for a
to use this.
Since: 1.7.7