{-# language TypeApplications #-}

{- |
Helpers for commonly used form patterns.
-}

module FlexTask.FormHelpers (
  anonymousRadioButtons,
  labeledRadioButtons,
  labeledCheckboxes,
  ) where


import Yesod                            (FieldSettings, SomeMessage)

import FlexTask.FormUtil                (showToUniversalLabel, universalLabel)
import FlexTask.Generic.Form (
  Alignment,
  MultipleChoiceSelection,
  SingleChoiceSelection,
  buttons,
  formify,
  )
import FlexTask.YesodConfig             (FlexForm, Rendered, Widget)



{- |
A multiple choice checkbox field.
Checkboxes are labeled with their index number and the provided (monolingual) labels.
-}
labeledCheckboxes
  :: Alignment
  -- ^ vertical or horizontal
  -> FieldSettings FlexForm
  -- ^ FieldSettings of the header label: attributes, label text, etc.
  -> [String]
  -- ^ individual option labels
  -> Rendered Widget
labeledCheckboxes :: Alignment -> FieldSettings FlexForm -> [String] -> Rendered Widget
labeledCheckboxes Alignment
alignment FieldSettings FlexForm
fSettings [String]
labels = Maybe MultipleChoiceSelection -> [[FieldInfo]] -> Rendered Widget
forall a. Formify a => Maybe a -> [[FieldInfo]] -> Rendered Widget
formify
  (forall a. Maybe a
Nothing @MultipleChoiceSelection)
  [[Alignment
-> FieldSettings FlexForm -> [SomeMessage FlexForm] -> FieldInfo
buttons
      Alignment
alignment
      FieldSettings FlexForm
fSettings
      ([SomeMessage FlexForm] -> FieldInfo)
-> [SomeMessage FlexForm] -> FieldInfo
forall a b. (a -> b) -> a -> b
$ (Integer -> String -> SomeMessage FlexForm)
-> [Integer] -> [String] -> [SomeMessage FlexForm]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\Integer
a String
b -> String -> SomeMessage FlexForm
universalLabel (String -> SomeMessage FlexForm) -> String -> SomeMessage FlexForm
forall a b. (a -> b) -> a -> b
$ Integer -> String
forall a. Show a => a -> String
show Integer
a String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
". " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
b) [Integer
1 :: Integer ..] [String]
labels
  ]]


{- |
A single choice radio button field.
Buttons are labeled with just their index number.
-}
anonymousRadioButtons
  :: Integral i
  => Alignment
  -- ^ vertical or horizontal
  -> FieldSettings FlexForm
  -- ^ heading label, attributes, etc.
  -> i
  -- ^ the amount of options to provide
  -> Rendered Widget
anonymousRadioButtons :: forall i.
Integral i =>
Alignment -> FieldSettings FlexForm -> i -> Rendered Widget
anonymousRadioButtons Alignment
alignment FieldSettings FlexForm
fSettings i
amount = Maybe SingleChoiceSelection -> [[FieldInfo]] -> Rendered Widget
forall a. Formify a => Maybe a -> [[FieldInfo]] -> Rendered Widget
formify (forall a. Maybe a
Nothing @SingleChoiceSelection)
  [[Alignment
-> FieldSettings FlexForm -> [SomeMessage FlexForm] -> FieldInfo
buttons
    Alignment
alignment
    FieldSettings FlexForm
fSettings
    ([SomeMessage FlexForm] -> FieldInfo)
-> [SomeMessage FlexForm] -> FieldInfo
forall a b. (a -> b) -> a -> b
$ (Integer -> SomeMessage FlexForm)
-> [Integer] -> [SomeMessage FlexForm]
forall a b. (a -> b) -> [a] -> [b]
map Integer -> SomeMessage FlexForm
forall a. Show a => a -> SomeMessage FlexForm
showToUniversalLabel [Integer
1.. i -> Integer
forall a. Integral a => a -> Integer
toInteger i
amount]
  ]]


{- |
A single choice radio button field.
Buttons are labeled with the given multilingual labels.
-}
labeledRadioButtons
  :: Alignment
  -- ^ vertical or horizontal
  -> FieldSettings FlexForm
  -- ^ heading label, attributes, etc.
  -> [SomeMessage FlexForm]
  -- ^ individual option labels
  -> Rendered Widget
labeledRadioButtons :: Alignment
-> FieldSettings FlexForm
-> [SomeMessage FlexForm]
-> Rendered Widget
labeledRadioButtons Alignment
alignment FieldSettings FlexForm
fSettings [SomeMessage FlexForm]
labels = Maybe SingleChoiceSelection -> [[FieldInfo]] -> Rendered Widget
forall a. Formify a => Maybe a -> [[FieldInfo]] -> Rendered Widget
formify
  (Maybe SingleChoiceSelection
forall a. Maybe a
Nothing :: Maybe SingleChoiceSelection)
  [[Alignment
-> FieldSettings FlexForm -> [SomeMessage FlexForm] -> FieldInfo
buttons Alignment
alignment FieldSettings FlexForm
fSettings [SomeMessage FlexForm]
labels]]