-- SPDX-FileCopyrightText: 2022 Gregor Kleen ,Sarah Vaupel -- -- SPDX-License-Identifier: AGPL-3.0-or-later module Utils.Frontend.Modal ( Modal(..) , customModal , modal, btnModal, msgModal , addMessageModal ) where import ClassyPrelude.Yesod import Control.Lens import Utils.Route import Utils.Message import Utils.Form (ButtonClass()) import Settings (widgetFile) import Control.Monad.Random.Class (uniform) import Control.Monad.Trans.Random (evalRandTIO) data Modal site = Modal { modalTriggerId , modalId :: Maybe Text , modalTrigger :: Maybe Text {- Dynamic URL -} -> Text {- TriggerId -} -> WidgetFor site () , modalContent :: Either (SomeRoute site) (WidgetFor site ()) } customModal :: Modal site -> WidgetFor site () customModal Modal{..} = do triggerId' <- maybe newIdent return modalTriggerId $(widgetFile "widgets/modal/modal") route <- traverse toTextUrl $ modalContent ^? _Left modalTrigger route triggerId' -- | Create a link to a modal modal :: WidgetFor site () -- ^ Widget that represents the link -> Either (SomeRoute site) (WidgetFor site ()) -- ^ Modal contant: either dynamic link or static widget -> WidgetFor site () -- ^ result widget modal modalTrigger' modalContent = customModal Modal{..} where modalTriggerId = Nothing modalId = Nothing modalTrigger mRoute triggerId = $(widgetFile "widgets/modal/trigger") -- | Variant of `modal` that looks like a button btnModal :: (RenderMessage site a, PathPiece (ButtonClass site)) => a -- ^ Button Text -> [ButtonClass site] -- ^ Button class -> Either (SomeRoute site) (WidgetFor site ()) -- ^ Modal contant: either dynamic link or static widget -> WidgetFor site () -- ^ result widget btnModal btl bcs = modal fakeBtn where fakeBtn = [whamlet|