Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
purescript-gargantext
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Grégoire Locqueville
purescript-gargantext
Commits
6ecca031
Commit
6ecca031
authored
Sep 20, 2019
by
James Laver
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactor G.C.Tab
parent
04fb25c1
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
38 additions
and
57 deletions
+38
-57
Tab.purs
src/Gargantext/Components/Tab.purs
+38
-57
No files found.
src/Gargantext/Components/Tab.purs
View file @
6ecca031
...
@@ -3,67 +3,48 @@ module Gargantext.Components.Tab where
...
@@ -3,67 +3,48 @@ module Gargantext.Components.Tab where
import Prelude hiding (div)
import Prelude hiding (div)
import Data.Array (fold)
import Data.Array (fold)
import Data.Lens (Lens', Prism', over, view)
import Data.FunctorWithIndex (mapWithIndex)
import Data.List (List, mapWithIndex, toUnfoldable)
import Data.Tuple (Tuple(..))
import Data.Tuple (Tuple(..))
import React (ReactElement)
import Data.Tuple.Nested ((/\))
import React.DOM (a, div, nav, text)
import Reactix as R
import React.DOM.Props (className, onClick)
import Reactix.DOM.HTML as H
import Thermite ( PerformAction, Render, Spec
, _render, modifyState, focus
, simpleSpec, withState)
type
State = { activeTab :: Int }
type
TabsProps = ( tabs :: Array (Tuple String R.Element), selected :: Int )
data Action = ChangeTab Int
tabs :: Record TabsProps -> R.Element
tabs props = R.createElement tabsCpt props []
tabs :: forall state props action.
-- this is actually just the list of tabs, not the tab contents itself
Lens' state State -> Prism' action Action
tabsCpt :: R.Component TabsProps
-> List (Tuple String (Spec state props action))
tabsCpt = R.hooksComponent "Tabs" cpt
-> Spec state props action
tabs l p ls = withState \st ->
let {activeTab} = view l st in
fold
[ focus l p $ simpleSpec performAction (render activeTab ls)
, wrapper $ fold $ mapWithIndex ( tab activeTab) ls
]
where
where
performAction :: forall props.
cpt props _ = do
PerformAction State props Action
(activeTab /\ setActiveTab) <- R.useState' props.selected
performAction (ChangeTab activeTab) _ _ =
pure $
void $ modifyState $ const {activeTab}
H.div { className: "tab-content" }
wrapper = over _render \render d p s c ->
[ H.nav {}
[div [className "tab-content"] $ render d p s c]
[ H.div { className: "nav nav-tabs" }
(mapWithIndex (item setActiveTab activeTab) props.tabs) ] ]
tab :: forall state props action.
item setActiveTab selected index (name /\ _) =
Int -> Int -> Tuple String (Spec state props action)
H.a { className, on: { click } } [ H.text name ]
-> Spec state props action
tab sid iid (Tuple name spec) = over _render tabRender spec
where
where
tabRender renderer d p s c =
eq = index == selected
[ div [ className $ "tab-pane " <>
className = "nav-item nav-link" <> (if eq then " active" else "")
if sid ==iid
click e = setActiveTab (const index)
then " show active"
else " fade"] $
-- TODO: document what these are (selection, item indices)
if sid == iid
type TabProps = ( selected :: Int, index :: Int )
then renderer d p s c
else []
]
tab :: Record TabProps -> Array R.Element -> R.Element
tab = R.createElement tabCpt
render :: forall state props action.
-- | A tab only shows its contents if it is currently selected
Int -> List (Tuple String (Spec state props action))
tabCpt :: R.Component TabProps
-> Render State props Action
tabCpt = R.staticComponent "Tab" cpt
render at ls d p s c =
[ nav []
[ div [className "nav nav-tabs"]
$ toUnfoldable $ mapWithIndex (item at) ls
]
]
where
where
item :: forall a. Int -> Int -> (Tuple String a) -> ReactElement
cpt { selected, index } children = H.div { className } children'
item sid iid (Tuple name _) =
where
a [className $ "nav-item nav-link" <>
same = selected == index
if sid == iid
className = "tab-pane" <> (if same then "show active" else "fade")
then " active"
children' = if same then children else []
else "", onClick \e -> d $ ChangeTab iid] [text name]
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment