Yesod.Form.Option

yesod-form-1.7.9: Form handling support for Yesod Web Framework

Safe Haskell | None
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) #

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

Expand

    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) #

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