Tabs.purs 1.67 KB
module Gargantext.Components.Bootstrap.Tabs(tabs) where

import Gargantext.Prelude

import Data.Foldable (intercalate)
import Effect (Effect)
import Gargantext.Utils ((?))
import Gargantext.Utils.Reactix as R2
import Reactix as R
import Reactix.DOM.HTML as H

type Props a =
  ( value     :: a
  , callback  :: a -> Effect Unit
  , list      :: Array a
  | Options
  )

type Options =
  ( className :: String
  )

options :: Record Options
options =
  { className : ""
  }

-- | Structural molecular component to the Bootstrap <nav-tabs> + <nav-item>
-- | simplifying a lot of the available UI/UX possibilites (type, disabled
-- | tabs, etc)
-- |
-- | https://getbootstrap.com/docs/4.6/components/navs/#tabs
tabs :: forall r a.
     Show a
  => Eq a
  => R2.OptLeaf Options (Props a) r
tabs = R2.optLeaf component options

componentName :: String
componentName = "b-tabs"

component :: forall a.
     Show a
  => Eq a
  => R.Component (Props a)
component = R.hooksComponent componentName cpt where
  cpt props@{ list, value, callback } _ = do
    -- Computed
    let
      className = intercalate " "
        -- provided custom className
        [ props.className
        -- BEM classNames
        , componentName
        -- Bootstrap specific classNames
        , "nav nav-tabs"
        ]
    -- Render
    pure $

      H.ul
      { className } $
      flip map list \item ->

        H.li
        { className: "nav-item"
        , on: { click: \_ -> callback item }
        }
        [
          H.a
          { className: intercalate " "
              [ "nav-link"
              , value == item ? "active" $ ""
              ]
          }
          [
            H.text $ show item
          ]
        ]