{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE NoImplicitPrelude #-} module Datarekisteri.Frontend.Handlers.Apply where import Relude hiding (id) import Data.Morpheus.Client (raw, declareLocalTypesInline) import Data.Time (Day) import Yesod hiding (emailField) import Yesod.Auth import Datarekisteri.Core.Types import Datarekisteri.Frontend.ApiRequests import Datarekisteri.Frontend.FormFields import Datarekisteri.Frontend.Types import Datarekisteri.Frontend.Widgets declareLocalTypesInline "schema.gql" [raw| mutation Apply($name: String!, $nickname: String, $homeplace: String!, $birthdate: Date!, $email: Email!, $phoneNumber: PhoneNumber!, $password: String!, $application: String!) { apply(email: $email, password: $password, name: $name, nickname: $nickname, birthdate: $birthdate, homeplace: $homeplace, application: $application, phoneNumber: $phoneNumber) { id } } |] applyForm :: Html -> MForm Handler (FormResult ApplyArgs, Widget) applyForm = renderDivs $ ApplyArgs <$> areq textField nameSettings Nothing <*> aopt textField nicknameSettings Nothing <*> areq textField homeplaceSettings Nothing <*> areq dayField' birthdateSettings Nothing <*> areq emailField emailSettings Nothing <*> areq telephoneField phoneSettings Nothing <*> areq verifiedPasswordField "Salasana" Nothing <*> areq textareaField' applicationSettings Nothing where dayField' :: Field Handler Date dayField' = checkMMap (pure . Right . Date :: Day -> Handler (Either Text Date)) (\(Date x) -> x) dayField nameSettings = "Nimi" {fsAttrs = [("placeholder","Erkki Juhani Esimerkki")]} nicknameSettings = "Kutsumanimi" {fsAttrs = [("placeholder","Juhani")]} homeplaceSettings = "Kotipaikka" {fsAttrs = [("placeholder","Espoo")]} birthdateSettings = "Syntymäaika" {fsAttrs = [("placeholder","2000-01-01")]} emailSettings = "Sähköposti" {fsAttrs = [("placeholder","erkki.juhani@esimerkki.fi")]} phoneSettings = "Puhelinnumero" {fsAttrs = [("placeholder","+358 12 34567890")]} applicationSettings = "Hakemus (eli miksi olet data)" {fsAttrs = [("placeholder","Aloitin opiskelun Otaniemen datalla vuonna 2020.")]} applyW :: (Widget, Enctype) -> Widget applyW (applyWidget, applyEnctype) = do setTitle "Jäsenhakemus" let formContent = [whamlet| ^{applyWidget} <p> Lähettämällä jäsenhakemuksen vakuutat antamiesi tietojen oikeellisuuden ja puuttettomuuden sekä sitoudut pitämään ne ajan tasalla. Rekisteriin kirjattuja tietoja käsitellään <a href="https://datat.fi/rekisteriseloste">rekisteriselosteen</a> mukaisesti. ^{submitButton "Hae Jäseneksi"} |] [whamlet| <h1> Jäsenhakemus ^{form ApplyR applyEnctype formContent} |] getApplyR :: (YesodAuth DataIdClient, AuthId DataIdClient ~ Text) => Handler Html getApplyR = do applyForm <- liftHandler $ generateFormPost applyForm defaultLayout $ applyW applyForm postApplyR :: (YesodAuth DataIdClient, AuthId DataIdClient ~ Text) => Handler Html postApplyR = do ((result, widget), enctype) <- runFormPost applyForm case result of FormSuccess application -> apiRequest @Apply False application >> redirect VerifyEmailR -- TODO: Automatically log in _ -> do defaultLayout $ applyW (widget, enctype)