{- |
Module      : Htmx.Lucid.Extra
Description : Provides extra htmx tags

This module defines additional attributes that can be used to get additional
behaviour
<https://htmx.org/reference/#attributes-additional>
-}
module Htmx.Lucid.Extra where

import Data.Foldable
import Data.List (intersperse)
import Data.Text (Text, pack)
import Htmx.Extension
import Htmx.Render
import Lucid (Html, HtmlT, script_, src_)
import Lucid.Base (Attribute, makeAttribute)

-- | <https://htmx.org/attributes/hx-boost/>
-- add progressive enhancement for links and forms
hxBoost_ :: Text -> Attribute
hxBoost_ :: Text -> Attribute
hxBoost_ = Text -> Text -> Attribute
makeAttribute Text
"hx-boost"

-- | <https://htmx.org/attributes/hx-confirm/>
-- shows a confirm() dialog before issuing a request
hxConfirm_ :: Text -> Attribute
hxConfirm_ :: Text -> Attribute
hxConfirm_ = Text -> Text -> Attribute
makeAttribute Text
"hx-confirm"

-- | <https://htmx.org/attributes/hx-delete/>
-- issues a DELETE to the specified URL
hxDelete_ :: Text -> Attribute
hxDelete_ :: Text -> Attribute
hxDelete_ = Text -> Text -> Attribute
makeAttribute Text
"hx-delete"

-- | <https://htmx.org/attributes/hx-disable/>
-- disables htmx processing for the given node and any children nodes
hxDisable_ :: Attribute
hxDisable_ :: Attribute
hxDisable_ = Text -> Text -> Attribute
makeAttribute Text
"hx-disable" Text
forall a. Monoid a => a
mempty

-- | <https://htmx.org/attributes/hx-disabled-elt/>
-- adds the disabled attribute to the specified elements while a request is in flight
hxDisabledElt_ :: Text -> Attribute
hxDisabledElt_ :: Text -> Attribute
hxDisabledElt_ = Text -> Text -> Attribute
makeAttribute Text
"hx-disabled-elt"

-- | <https://htmx.org/attributes/hx-disinherit/>
-- control and disable automatic attribute inheritance for child nodes
hxDisinherit_ :: Text -> Attribute
hxDisinherit_ :: Text -> Attribute
hxDisinherit_ = Text -> Text -> Attribute
makeAttribute Text
"hx-disinherit"

-- | <https://htmx.org/attributes/hx-encoding/>
-- changes the request encoding type
hxEncoding_ :: Text -> Attribute
hxEncoding_ :: Text -> Attribute
hxEncoding_ = Text -> Text -> Attribute
makeAttribute Text
"hx-encoding"

-- | <https://htmx.org/attributes/hx-ext/>
-- extensions to use for this element
hxExt_ :: Text -> Attribute
hxExt_ :: Text -> Attribute
hxExt_ = Text -> Text -> Attribute
makeAttribute Text
"hx-ext"

-- | A typesafe version of 'hxExt_' that works with the "included" extensions
-- that the htmx codebase is tested against
hxExtension_ :: HtmxExtension -> Attribute
hxExtension_ :: HtmxExtension -> Attribute
hxExtension_ = Text -> Text -> Attribute
makeAttribute Text
"hx-ext" (Text -> Attribute)
-> (HtmxExtension -> Text) -> HtmxExtension -> Attribute
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HtmxExtension -> Text
forall a. Render a => a -> Text
render

-- | Include multiple extensions in one declaration
hxExtensions_ :: [HtmxExtension] -> Attribute
hxExtensions_ :: [HtmxExtension] -> Attribute
hxExtensions_ = Text -> Text -> Attribute
makeAttribute Text
"hx-ext" (Text -> Attribute)
-> ([HtmxExtension] -> Text) -> [HtmxExtension] -> Attribute
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Text] -> Text
forall m. Monoid m => [m] -> m
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold ([Text] -> Text)
-> ([HtmxExtension] -> [Text]) -> [HtmxExtension] -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
intersperse Text
"," ([Text] -> [Text])
-> ([HtmxExtension] -> [Text]) -> [HtmxExtension] -> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HtmxExtension -> Text) -> [HtmxExtension] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap HtmxExtension -> Text
forall a. Render a => a -> Text
render

-- | <https://htmx.org/attributes/hx-headers/>
-- adds to the headers that will be submitted with the request
hxHeaders_ :: Text -> Attribute
hxHeaders_ :: Text -> Attribute
hxHeaders_ = Text -> Text -> Attribute
makeAttribute Text
"hx-headers"

-- | <https://htmx.org/attributes/hx-history/>
-- prevent sensitive data being saved to the history cache
hxHistory_ :: Text -> Attribute
hxHistory_ :: Text -> Attribute
hxHistory_ = Text -> Text -> Attribute
makeAttribute Text
"hx-history"

-- | <https://htmx.org/attributes/hx-history-elt/>
-- the element to snapshot and restore during history navigation
hxHistoryElt_ :: Attribute
hxHistoryElt_ :: Attribute
hxHistoryElt_ = Text -> Text -> Attribute
makeAttribute Text
"hx-history-elt" Text
forall a. Monoid a => a
mempty

-- | <https://htmx.org/attributes/hx-include/>
-- include additional data in requests
hxInclude_ :: Text -> Attribute
hxInclude_ :: Text -> Attribute
hxInclude_ = Text -> Text -> Attribute
makeAttribute Text
"hx-include"

-- | <https://htmx.org/attributes/hx-indicator/>
-- the element to put the htmx-request class on during the request
hxIndicator_ :: Text -> Attribute
hxIndicator_ :: Text -> Attribute
hxIndicator_ = Text -> Text -> Attribute
makeAttribute Text
"hx-indicator"

data ParamsFilter
    = -- | Include all parameters (default)
      All
    | -- | Include no parameters
      None
    | -- | Include all except the list of parameter names
      Exclude [Text]
    | -- | Include all the list of parameter names
      Include [Text]

-- | <https://htmx.org/attributes/hx-params/>
-- filters the parameters that will be submitted with a request
hxParams_ :: ParamsFilter -> Attribute
hxParams_ :: ParamsFilter -> Attribute
hxParams_ = \case
    ParamsFilter
All -> Text -> Text -> Attribute
makeAttribute Text
"hx-params" Text
"*"
    ParamsFilter
None -> Text -> Text -> Attribute
makeAttribute Text
"hx-params" Text
"none"
    Exclude [Text]
ps -> Text -> Text -> Attribute
makeAttribute Text
"hx-params" (Text -> Attribute) -> Text -> Attribute
forall a b. (a -> b) -> a -> b
$ Text
"not " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> ([Text] -> Text
forall m. Monoid m => [m] -> m
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold ([Text] -> Text) -> ([Text] -> [Text]) -> [Text] -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
intersperse Text
"," ([Text] -> Text) -> [Text] -> Text
forall a b. (a -> b) -> a -> b
$ [Text]
ps)
    Include [Text]
ps -> Text -> Text -> Attribute
makeAttribute Text
"hx-params" (Text -> Attribute) -> Text -> Attribute
forall a b. (a -> b) -> a -> b
$ [Text] -> Text
forall m. Monoid m => [m] -> m
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold ([Text] -> Text) -> ([Text] -> [Text]) -> [Text] -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
intersperse Text
"," ([Text] -> Text) -> [Text] -> Text
forall a b. (a -> b) -> a -> b
$ [Text]
ps

-- | <https://htmx.org/attributes/hx-patch/>
-- issues a PATCH to the specified URL
hxPatch_ :: Text -> Attribute
hxPatch_ :: Text -> Attribute
hxPatch_ = Text -> Text -> Attribute
makeAttribute Text
"hx-patch"

-- | <https://htmx.org/attributes/hx-preserve/>
-- specifies elements to keep unchanged between requests
hxPreserve_ :: Attribute
hxPreserve_ :: Attribute
hxPreserve_ = Text -> Text -> Attribute
makeAttribute Text
"hx-preserve" Text
forall a. Monoid a => a
mempty

-- | <https://htmx.org/attributes/hx-prompt/>
-- shows a prompt() before submitting a request
hxPrompt_ :: Text -> Attribute
hxPrompt_ :: Text -> Attribute
hxPrompt_ = Text -> Text -> Attribute
makeAttribute Text
"hx-prompt"

-- | <https://htmx.org/attributes/hx-put/>
-- issues a PUT to the specified URL
hxPut_ :: Text -> Attribute
hxPut_ :: Text -> Attribute
hxPut_ = Text -> Text -> Attribute
makeAttribute Text
"hx-put"

-- | <https://htmx.org/attributes/hx-replace-url/>
-- replace the URL in the browser location bar
hxReplaceUrl_ :: Text -> Attribute
hxReplaceUrl_ :: Text -> Attribute
hxReplaceUrl_ = Text -> Text -> Attribute
makeAttribute Text
"hx-replace-url"

-- | <https://htmx.org/attributes/hx-request/>
-- configures various aspects of the request
hxRequest_ :: Text -> Attribute
hxRequest_ :: Text -> Attribute
hxRequest_ = Text -> Text -> Attribute
makeAttribute Text
"hx-request"

{-# DEPRECATED
    hxSse_
    "Don't use hx-sse directly, please use the server sent events extension instead https://htmx.org/extensions/server-sent-events/"
    #-}

-- | <https://htmx.org/attributes/hx-sse/>
-- has been moved to an extension. Documentation for older versions
hxSse_ :: Text -> Attribute
hxSse_ :: Text -> Attribute
hxSse_ = Text -> Text -> Attribute
makeAttribute Text
"hx-sse"

data SyncStrategy
    = -- | drop (ignore) this request if an existing request is in flight (the default)
      SyncDrop
    | -- | drop (ignore) this request if an existing request is in flight, and, if
      -- that is not the case, abort this request if another request occurs while it is
      -- still in flight
      SyncAbort
    | -- | abort the current request, if any, and replace it with this request
      SyncReplace
    | -- | queue the first request to show up while a request is in flight
      SyncQueueFirst
    | -- | queue the last request to show up while a request is in flight
      SyncQueueLast
    | -- | queue all requests that show up while a request is in flight
      SyncQueueAll

-- | <https://htmx.org/attributes/hx-sync/>
-- control how requests made by different elements are synchronized
hxSync_ :: Text -> Attribute
hxSync_ :: Text -> Attribute
hxSync_ = Text -> Text -> Attribute
makeAttribute Text
"hx-sync"

-- | <https://htmx.org/attributes/hx-sync/>
-- the same as 'hxSync_' but accepts a strongly typed htmx 'SyncStrategy'
hxSyncStrategy_ :: Text -> SyncStrategy -> Attribute
hxSyncStrategy_ :: Text -> SyncStrategy -> Attribute
hxSyncStrategy_ Text
selector = \case
    SyncStrategy
SyncDrop -> Text -> Text -> Attribute
makeAttribute Text
"hx-sync" (Text -> Attribute) -> Text -> Attribute
forall a b. (a -> b) -> a -> b
$ Text
selector Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
":" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"drop"
    SyncStrategy
SyncAbort -> Text -> Text -> Attribute
makeAttribute Text
"hx-sync" (Text -> Attribute) -> Text -> Attribute
forall a b. (a -> b) -> a -> b
$ Text
selector Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
":" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"abort"
    SyncStrategy
SyncReplace -> Text -> Text -> Attribute
makeAttribute Text
"hx-sync" (Text -> Attribute) -> Text -> Attribute
forall a b. (a -> b) -> a -> b
$ Text
selector Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
":" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"replace"
    SyncStrategy
SyncQueueFirst -> Text -> Text -> Attribute
makeAttribute Text
"hx-sync" (Text -> Attribute) -> Text -> Attribute
forall a b. (a -> b) -> a -> b
$ Text
selector Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
":" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"queue first"
    SyncStrategy
SyncQueueLast -> Text -> Text -> Attribute
makeAttribute Text
"hx-sync" (Text -> Attribute) -> Text -> Attribute
forall a b. (a -> b) -> a -> b
$ Text
selector Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
":" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"queue last"
    SyncStrategy
SyncQueueAll -> Text -> Text -> Attribute
makeAttribute Text
"hx-sync" (Text -> Attribute) -> Text -> Attribute
forall a b. (a -> b) -> a -> b
$ Text
selector Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
":" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"queue all"

-- | <https://htmx.org/attributes/hx-validate/>
-- force elements to validate themselves before a request
hxValidate_ :: Text -> Attribute
hxValidate_ :: Text -> Attribute
hxValidate_ = Text -> Text -> Attribute
makeAttribute Text
"hx-validate"

-- | <https://htmx.org/attributes/hx-vars/>
-- adds values dynamically to the parameters to submit with the request (deprecated, please use hx-vals)
hxVars_ :: Text -> Attribute
hxVars_ :: Text -> Attribute
hxVars_ = Text -> Text -> Attribute
makeAttribute Text
"hx-vars"

{-# DEPRECATED
    hxWs_
    "Don't use hx-ws directly, please use the web sockets extension instead https://htmx.org/extensions/server-sent-events/https://htmx.org/extensions/web-sockets/"
    #-}

-- | <https://htmx.org/attributes/hx-ws/>
-- has been moved to an extension. Documentation for older versions
hxWs_ :: Text -> Attribute
hxWs_ :: Text -> Attribute
hxWs_ = Text -> Text -> Attribute
makeAttribute Text
"hx-ws"