espial/purs/src/Component/NList.purs
Jon Schoning 2e3e7097e6 init
2019-01-30 20:54:47 -06:00

76 lines
2 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

module Component.NList where
import Prelude hiding (div)
import Data.Array (drop, foldMap)
import Data.Maybe (Maybe(..), maybe)
import Data.String (null, split, take) as S
import Data.String.Pattern (Pattern(..))
import Data.Tuple (fst, snd)
import Effect.Aff (Aff)
import Globals (app', mmoment8601)
import Halogen as H
import Halogen.HTML (a, br_, div, text)
import Halogen.HTML as HH
import Halogen.HTML.Properties (href, id_, title)
import Model (Note, NoteSlug)
import Util (class_, fromNullableStr)
data NLQuery a
= NLNop a
type NLSlot = NoteSlug
type NLState =
{ notes :: Array Note
, cur :: Maybe NLSlot
, deleteAsk:: Boolean
, edit :: Boolean
}
nlist :: Array Note -> H.Component HH.HTML NLQuery Unit Void Aff
nlist st' =
H.component
{ initialState: const (mkState st')
, render
, eval
, receiver: const Nothing
}
where
app = app' unit
mkState notes' =
{ notes: notes'
, cur: Nothing
, deleteAsk: false
, edit: false
}
render :: NLState -> H.ComponentHTML NLQuery
render st@{ notes } =
HH.div_ (map renderNote notes)
where
renderNote :: Note -> H.ComponentHTML NLQuery
renderNote bm =
div [ id_ (show bm.id) , class_ ("note w-100 mw7 pa1 mb2")] $
[ div [ class_ "display" ] $
[ a [ href (linkToFilterSingle bm.slug), class_ ("link f5 lh-title")]
[ text $ if S.null bm.title then "[no title]" else bm.title ]
, br_
, div [ class_ "description mt1 mid-gray" ] (toTextarea (S.take 200 bm.text))
, a [ class_ "link f7 dib gray w4", title (maybe bm.created snd (mmoment bm)) , href (linkToFilterSingle bm.slug) ]
[ text (maybe " " fst (mmoment bm)) ]
]
]
mmoment bm = mmoment8601 bm.created
linkToFilterSingle slug = fromNullableStr app.userR <> "/notes/" <> slug
toTextarea input =
S.split (Pattern "\n") input
# foldMap (\x -> [br_, text x])
# drop 1
eval :: NLQuery ~> H.ComponentDSL NLState NLQuery Void Aff
eval (NLNop next) = pure next