|
|
@@ -2,9 +2,9 @@ module Docs.Components.Typeahead where |
|
|
|
|
|
|
|
import Prelude |
|
|
|
|
|
|
|
import Control.Monad.Aff.AVar (AVAR) |
|
|
|
import Control.Monad.Aff.Class (class MonadAff) |
|
|
|
import Control.Monad.Aff.Console (CONSOLE, log) |
|
|
|
import Control.Monad.Aff.AVar (AVAR) |
|
|
|
import DOM (DOM) |
|
|
|
import Data.Array (elemIndex, mapWithIndex, difference, filter, (:)) |
|
|
|
import Data.Foldable (length, traverse_) |
|
|
@@ -14,7 +14,7 @@ import Halogen as H |
|
|
|
import Halogen.HTML as HH |
|
|
|
import Halogen.HTML.Events as HE |
|
|
|
import Halogen.HTML.Properties as HP |
|
|
|
|
|
|
|
import Select (_select) |
|
|
|
import Select as Select |
|
|
|
import Select.Utils.Setters as Setters |
|
|
|
|
|
|
@@ -35,17 +35,19 @@ type State = |
|
|
|
type Input = { items :: Array String, keepOpen :: Boolean } |
|
|
|
data Message = Void |
|
|
|
|
|
|
|
type ChildSlot = Unit |
|
|
|
type ChildQuery eff = Select.Query Query TypeaheadItem eff |
|
|
|
type ChildSlots eff (m :: Type -> Type) = |
|
|
|
( select :: Select.Slot Query TypeaheadItem eff m Unit ) |
|
|
|
|
|
|
|
component :: ∀ m e |
|
|
|
. MonadAff ( Effects e ) m |
|
|
|
=> H.Component HH.HTML Query Input Message m |
|
|
|
component = |
|
|
|
H.parentComponent |
|
|
|
H.component |
|
|
|
{ initialState |
|
|
|
, render |
|
|
|
, eval |
|
|
|
, initializer: Nothing |
|
|
|
, finalizer: Nothing |
|
|
|
, receiver: const Nothing |
|
|
|
} |
|
|
|
where |
|
|
@@ -54,12 +56,12 @@ component = |
|
|
|
|
|
|
|
render |
|
|
|
:: State |
|
|
|
-> H.ParentHTML Query (ChildQuery (Effects e)) ChildSlot m |
|
|
|
-> H.ComponentHTML Query (ChildSlots (Effects e) m) m |
|
|
|
render st = |
|
|
|
HH.div |
|
|
|
[ class_ "w-full" ] |
|
|
|
[ renderSelections st.selected |
|
|
|
, HH.slot unit Select.component input (HE.input HandleInputContainer) |
|
|
|
, Select.select unit input (HE.input HandleInputContainer) |
|
|
|
] |
|
|
|
where |
|
|
|
input = |
|
|
@@ -72,7 +74,7 @@ component = |
|
|
|
|
|
|
|
eval |
|
|
|
:: Query |
|
|
|
~> H.ParentDSL State Query (ChildQuery (Effects e)) ChildSlot Message m |
|
|
|
~> H.HalogenM State Query (ChildSlots (Effects e) m) Message m |
|
|
|
eval = case _ of |
|
|
|
Log str a -> a <$ do |
|
|
|
H.liftAff $ log str |
|
|
@@ -84,8 +86,8 @@ component = |
|
|
|
st <- H.get |
|
|
|
let newItems = difference (filterItems search st.items) st.selected |
|
|
|
index = elemIndex search st.items |
|
|
|
_ <- H.query unit $ H.action $ Select.ReplaceItems newItems |
|
|
|
traverse_ (H.query unit <<< H.action <<< Select.Highlight <<< Select.Index) index |
|
|
|
_ <- H.query _select unit $ H.action $ Select.ReplaceItems newItems |
|
|
|
traverse_ (H.query _select unit <<< H.action <<< Select.Highlight <<< Select.Index) index |
|
|
|
H.liftAff $ log $ "New search: " <> search |
|
|
|
|
|
|
|
Select.Selected item -> do |
|
|
@@ -94,7 +96,7 @@ component = |
|
|
|
_ <- if st.keepOpen |
|
|
|
then pure unit |
|
|
|
else do |
|
|
|
_ <- H.query unit $ H.action $ Select.SetVisibility Select.Off |
|
|
|
_ <- H.query _select unit $ H.action $ Select.SetVisibility Select.Off |
|
|
|
pure unit |
|
|
|
|
|
|
|
if length (filter ((==) item) st.items) > 0 |
|
|
@@ -105,7 +107,7 @@ component = |
|
|
|
|
|
|
|
newSt <- H.get |
|
|
|
let newItems = difference newSt.items newSt.selected |
|
|
|
_ <- H.query unit $ H.action $ Select.ReplaceItems newItems |
|
|
|
_ <- H.query _select unit $ H.action $ Select.ReplaceItems newItems |
|
|
|
H.liftAff $ log $ "New item selected: " <> item |
|
|
|
|
|
|
|
otherwise -> pure unit |
|
|
@@ -115,7 +117,7 @@ component = |
|
|
|
H.modify _ { selected = filter ((/=) item) st.selected } |
|
|
|
newSt <- H.get |
|
|
|
let newItems = difference newSt.items newSt.selected |
|
|
|
_ <- H.query unit $ H.action $ Select.ReplaceItems newItems |
|
|
|
_ <- H.query _select unit $ H.action $ Select.ReplaceItems newItems |
|
|
|
pure a |
|
|
|
|
|
|
|
|
|
|
@@ -128,9 +130,9 @@ class_ = HP.class_ <<< HH.ClassName |
|
|
|
filterItems :: TypeaheadItem -> Array TypeaheadItem -> Array TypeaheadItem |
|
|
|
filterItems str = filter (\i -> contains (Pattern str) i) |
|
|
|
|
|
|
|
renderInputContainer :: ∀ e |
|
|
|
renderInputContainer :: ∀ e m |
|
|
|
. Select.State TypeaheadItem e |
|
|
|
-> Select.ComponentHTML Query TypeaheadItem e |
|
|
|
-> Select.ComponentHTML Query TypeaheadItem e m |
|
|
|
renderInputContainer state = HH.div_ [ renderInput, renderContainer ] |
|
|
|
where |
|
|
|
renderInput = HH.input $ Setters.setInputProps |
|
|
|
0 comments on commit
653ce4b