yesod-form-1.7.9: Form handling support for Yesod Web Framework
Safe HaskellSafe-Inferred
LanguageHaskell2010

Yesod.Form.Option

Synopsis

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

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