packages feed

nano-ui-form-0.1.0.0: lib/NanoUI/Form/Unnamed.hs

-- | Form inputs without a label, with automatically numbered field names.
module NanoUI.Form.Unnamed
  ( inputText
  , inputPassword
  , inputTextArea
  , inputCheckbox
  , inputSlider
  , inputSelect
  , inputEnumSelect
  , errors
  , childErrors
  , withErrors
  , withChildErrors
  , withFieldErrors
  )
where

import Data.Text (Text)
import Ditto.Backend (FormError)
import Ditto.Generalized.Unnamed qualified as Unnamed
import NanoUI
  ( NanoUI
  , Response
  , TextInputConfig (..)
  , checkbox'
  , defaultTextInputConfig
  , respChanged
  , respClicked
  , select'
  , slider'
  , textArea'
  , textInput'
  , textInputConfigured'
  )
import NanoUI.Form.Backend (FormInput (..), formInputToText)
import NanoUI.Form.Field
  ( decodeBool
  , decodeFloatInput
  , decodeInt
  , enumField
  , fieldView
  )
import NanoUI.Form.Named
  ( childErrors
  , errors
  , withChildErrors
  , withErrors
  , withFieldErrors
  )
import NanoUI.Form.Types (Form)

-- | Auto-enumerated text input.
inputText :: FormError FormInput err => Text -> Form err Text
inputText = textField textInput'

-- | Auto-enumerated password input.
inputPassword :: FormError FormInput err => Text -> Form err Text
inputPassword = textField (textInputConfigured' defaultTextInputConfig {ticPassword = True})

-- | Auto-enumerated text area input.
inputTextArea :: FormError FormInput err => Text -> Form err Text
inputTextArea = textField textArea'

textField ::
  FormError FormInput err =>
  (Text -> NanoUI (Response, Text)) -> Text -> Form err Text
textField widget =
  Unnamed.input
    (Right . formInputToText)
    (fieldView respChanged FormInputText widget)

-- | Auto-enumerated checkbox toggle.
inputCheckbox :: FormError FormInput err => Text -> Bool -> Form err Bool
inputCheckbox lbl initial =
  Unnamed.input
    (Right . decodeBool initial)
    (fieldView respClicked FormInputBool (checkbox' lbl))
    initial

-- | Auto-enumerated slider input.
inputSlider ::
  FormError FormInput err => Float -> Float -> Float -> Form err Float
inputSlider minV maxV initial =
  Unnamed.input
    (Right . decodeFloatInput initial)
    (fieldView respChanged FormInputFloat (slider' minV maxV))
    initial

-- | Auto-enumerated select dropdown.
inputSelect :: (Foldable f, FormError FormInput err) => f Text -> Int -> Form err Int
inputSelect options initial =
  Unnamed.input
    (Right . decodeInt initial)
    (fieldView respChanged FormInputInt (select' options))
    initial

-- | Auto-enumerated select for bounded enums.
inputEnumSelect ::
  forall a err.
  (Bounded a, Enum a, Show a, FormError FormInput err) => a -> Form err a
inputEnumSelect = enumField inputSelect