76 lines
2 KiB
Plaintext
76 lines
2 KiB
Plaintext
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
|