Commit f4e6ba80 authored by arturo's avatar arturo

>>> continue

parent 7113e8a2
Pipeline #3332 canceled with stage
...@@ -2,24 +2,90 @@ module Gargantext.Components.App (app) where ...@@ -2,24 +2,90 @@ module Gargantext.Components.App (app) where
import Gargantext.Prelude import Gargantext.Prelude
import Data.Tuple.Nested ((/\))
import Gargantext.AsyncTasks as GAT import Gargantext.AsyncTasks as GAT
import Gargantext.Components.App.Store as AppStore import Gargantext.Components.App.Store as AppStore
import Gargantext.Components.Router (router) import Gargantext.Components.Router (router)
import Gargantext.Hooks (useHashRouter) import Gargantext.Hooks (useHashRouter)
import Gargantext.Hooks.FirstEffect (useFirstEffect')
import Gargantext.Router as Router import Gargantext.Router as Router
import Gargantext.Sessions as Sessions import Gargantext.Sessions as Sessions
import Gargantext.Types (CacheParams, defaultCacheParams)
import Gargantext.Utils (getter)
import Gargantext.Utils.Reactix as R2 import Gargantext.Utils.Reactix as R2
import Reactix as R import Reactix as R
import Record as Record
import Toestand as T import Toestand as T
here :: R2.Here here :: R2.Here
here = R2.here "Gargantext.Components.App" here = R2.here "Gargantext.Components.App"
app :: R2.Component ()
app = R.createElement appCpt app :: R2.Leaf ()
app = R2.leaf appCpt
appCpt :: R.Component () appCpt :: R.Component ()
appCpt = here.component "app" cpt where appCpt = here.component "container" cpt where
cpt _ _ = do
-- | States
-- |
cache' /\ cache <- R2.useBox' (defaultCacheParams :: CacheParams)
-- | Hooks
-- |
-- load Local Storage cache (if exists)
useFirstEffect' $
R2.loadLocalStorageState R2.appParamsKey cache
-- | Render
-- |
pure $
hydrateStore
{ cacheParams: cache'
}
--------------------------------------------------------------
type HydrateStoreProps =
( cacheParams :: CacheParams
)
hydrateStore :: R2.Leaf HydrateStoreProps
hydrateStore = R2.leaf hydrateStoreCpt
hydrateStoreCpt :: R.Component HydrateStoreProps
hydrateStoreCpt = here.component "hydrateStore" cpt where
cpt { cacheParams
} _ = do
-- | Computed
-- |
(state :: Record AppStore.State) <- pure $
-- (cache options)
{ expandTableEdition: getter _.expandTableEdition cacheParams
-- (default options)
} `Record.merge` AppStore.options
-- | Render
-- |
pure $
AppStore.provide
state
[
mainApp
{}
]
--------------------------------------------------------------
mainApp :: R2.Leaf ()
mainApp = R2.leaf mainAppCpt
mainAppCpt :: R.Component ()
mainAppCpt = here.component "main" cpt where
cpt _ _ = do cpt _ _ = do
boxes <- AppStore.use boxes <- AppStore.use
-- tasks <- T.useBox Nothing -- storage for asynchronous tasks reductor -- tasks <- T.useBox Nothing -- storage for asynchronous tasks reductor
......
...@@ -38,6 +38,7 @@ here = R2.here "Gargantext.Components.App.Store" ...@@ -38,6 +38,7 @@ here = R2.here "Gargantext.Components.App.Store"
type Store = type Store =
( backend :: T.Box (Maybe Backend) ( backend :: T.Box (Maybe Backend)
, errors :: T.Box (Array FrontendError) , errors :: T.Box (Array FrontendError)
, expandTableEdition :: T.Box Boolean
, forestOpen :: T.Box OpenNodes , forestOpen :: T.Box OpenNodes
, graphVersion :: T2.ReloadS , graphVersion :: T2.ReloadS
, handed :: T.Box Handed , handed :: T.Box Handed
...@@ -63,6 +64,7 @@ type Store = ...@@ -63,6 +64,7 @@ type Store =
type State = type State =
( backend :: Maybe Backend ( backend :: Maybe Backend
, errors :: Array FrontendError , errors :: Array FrontendError
, expandTableEdition :: Boolean
, forestOpen :: OpenNodes , forestOpen :: OpenNodes
, graphVersion :: T2.Reload , graphVersion :: T2.Reload
, handed :: Handed , handed :: Handed
...@@ -89,6 +91,7 @@ options :: Record State ...@@ -89,6 +91,7 @@ options :: Record State
options = options =
{ backend : Nothing { backend : Nothing
, errors : [] , errors : []
, expandTableEdition : false
, forestOpen : OpenNodes $ Set.empty , forestOpen : OpenNodes $ Set.empty
, graphVersion : T2.newReload , graphVersion : T2.newReload
, handed : RightHanded , handed : RightHanded
......
...@@ -11,6 +11,7 @@ import Data.Tuple.Nested ((/\)) ...@@ -11,6 +11,7 @@ import Data.Tuple.Nested ((/\))
import Effect (Effect) import Effect (Effect)
import Effect.Aff (launchAff_) import Effect.Aff (launchAff_)
import Effect.Class (liftEffect) import Effect.Class (liftEffect)
import Gargantext.Components.App.Store as AppStore
import Gargantext.Components.Bootstrap as B import Gargantext.Components.Bootstrap as B
import Gargantext.Components.Bootstrap.Types (ButtonVariant(..), ComponentStatus(..), Variant(..)) import Gargantext.Components.Bootstrap.Types (ButtonVariant(..), ComponentStatus(..), Variant(..))
import Gargantext.Components.FolderView as FV import Gargantext.Components.FolderView as FV
...@@ -21,9 +22,10 @@ import Gargantext.Components.Nodes.Lists.Types as NT ...@@ -21,9 +22,10 @@ import Gargantext.Components.Nodes.Lists.Types as NT
import Gargantext.Components.Nodes.Types (FTFieldList) import Gargantext.Components.Nodes.Types (FTFieldList)
import Gargantext.Components.Search (SearchType(..)) import Gargantext.Components.Search (SearchType(..))
import Gargantext.Components.Table.Types (ColumnName(..), OrderBy, OrderByDirection(..), Params, Props, TableContainerProps, columnName) import Gargantext.Components.Table.Types (ColumnName(..), OrderBy, OrderByDirection(..), Params, Props, TableContainerProps, columnName)
import Gargantext.Hooks.FirstEffect (useFirstEffect')
import Gargantext.Sessions.Types (Session) import Gargantext.Sessions.Types (Session)
import Gargantext.Types (NodeID) import Gargantext.Types (NodeID, defaultCacheParams)
import Gargantext.Utils ((?)) import Gargantext.Utils (setter, (?))
import Gargantext.Utils.Reactix (effectLink) import Gargantext.Utils.Reactix (effectLink)
import Gargantext.Utils.Reactix as R2 import Gargantext.Utils.Reactix as R2
import Reactix as R import Reactix as R
...@@ -118,8 +120,10 @@ tableHeaderWithRenameBoxedLayoutCpt = here.component "tableHeaderWithRenameBoxed ...@@ -118,8 +120,10 @@ tableHeaderWithRenameBoxedLayoutCpt = here.component "tableHeaderWithRenameBoxed
cacheState' <- T.useLive T.unequal cacheState cacheState' <- T.useLive T.unequal cacheState
CorpusInfo {title, desc, query, authors} <- T.read corpusInfoS CorpusInfo {title, desc, query, authors} <- T.read corpusInfoS
expandEditionBlock' /\ expandEditionBlock { expandTableEdition
<- R2.useBox' false } <- AppStore.use
expandTableEdition' <- R2.useLive' expandTableEdition
-- | Hooks -- | Hooks
-- | -- |
...@@ -128,10 +132,17 @@ tableHeaderWithRenameBoxedLayoutCpt = here.component "tableHeaderWithRenameBoxed ...@@ -128,10 +132,17 @@ tableHeaderWithRenameBoxedLayoutCpt = here.component "tableHeaderWithRenameBoxed
mTopBarHost <- R.unsafeHooksEffect $ R2.getElementById "portal-topbar" mTopBarHost <- R.unsafeHooksEffect $ R2.getElementById "portal-topbar"
-- | Effects
-- |
-- transfer local Component change to Local Storage cache
useFirstEffect' $
flip T.listen expandTableEdition onExpandTableEditionChange
-- | Behaviors -- | Behaviors
-- | -- |
let let
onExpandClick _ = T.modify_ (not) expandEditionBlock onExpandClick _ = T.modify_ (not) expandTableEdition
-- | Render -- | Render
-- | -- |
...@@ -171,7 +182,7 @@ tableHeaderWithRenameBoxedLayoutCpt = here.component "tableHeaderWithRenameBoxed ...@@ -171,7 +182,7 @@ tableHeaderWithRenameBoxedLayoutCpt = here.component "tableHeaderWithRenameBoxed
{ className: "table-header-rename__title__line" } { className: "table-header-rename__title__line" }
, ,
B.iconButton B.iconButton
{ name: expandEditionBlock' ? { name: expandTableEdition' ?
"caret-up" $ "caret-up" $
"caret-down" "caret-down"
, className: "table-header-rename__title__expand" , className: "table-header-rename__title__expand"
...@@ -179,7 +190,7 @@ tableHeaderWithRenameBoxedLayoutCpt = here.component "tableHeaderWithRenameBoxed ...@@ -179,7 +190,7 @@ tableHeaderWithRenameBoxedLayoutCpt = here.component "tableHeaderWithRenameBoxed
} }
] ]
, ,
R2.when expandEditionBlock' $ R2.when expandTableEdition' $
tableHeaderEditionBlock tableHeaderEditionBlock
{ hyperdata: p.hyperdata { hyperdata: p.hyperdata
...@@ -205,6 +216,12 @@ tableHeaderWithRenameBoxedLayoutCpt = here.component "tableHeaderWithRenameBoxed ...@@ -205,6 +216,12 @@ tableHeaderWithRenameBoxedLayoutCpt = here.component "tableHeaderWithRenameBoxed
cacheStateToggle NT.CacheOn = NT.CacheOff cacheStateToggle NT.CacheOn = NT.CacheOff
cacheStateToggle NT.CacheOff = NT.CacheOn cacheStateToggle NT.CacheOff = NT.CacheOn
onExpandTableEditionChange :: T.Change Boolean -> Effect Unit
onExpandTableEditionChange { new } = do
cache <- R2.loadLocalStorageState' R2.appParamsKey defaultCacheParams
let update = setter (_ { expandTableEdition = new }) cache
R2.setLocalStorageState R2.appParamsKey update
---------------------------------------------------------- ----------------------------------------------------------
type TableHeaderEditionBlockDefaultData = type TableHeaderEditionBlockDefaultData =
......
...@@ -814,3 +814,24 @@ data FrontendError = ...@@ -814,3 +814,24 @@ data FrontendError =
derive instance Generic FrontendError _ derive instance Generic FrontendError _
instance Eq FrontendError where eq = genericEq instance Eq FrontendError where eq = genericEq
-----------------------------------------------------------------------
newtype CacheParams = CacheParams
{ expandTableEdition :: Boolean
}
derive instance Newtype CacheParams _
derive instance Generic CacheParams _
derive instance Eq CacheParams
instance Show CacheParams where show = genericShow
derive newtype instance JSON.ReadForeign CacheParams
derive newtype instance JSON.WriteForeign CacheParams
-- (!) in case cache storage (ie. JavaScript Local Storage) returns an invalid
-- objects (eg. possible data migration), this will safely set new default
-- values
defaultCacheParams :: CacheParams
defaultCacheParams = CacheParams
{ expandTableEdition : false
}
...@@ -397,6 +397,9 @@ getls = window >>= localStorage ...@@ -397,6 +397,9 @@ getls = window >>= localStorage
openNodesKey :: LocalStorageKey openNodesKey :: LocalStorageKey
openNodesKey = "garg-open-nodes" openNodesKey = "garg-open-nodes"
appParamsKey :: LocalStorageKey
appParamsKey = "garg-app-params"
graphParamsKey :: LocalStorageKey graphParamsKey :: LocalStorageKey
graphParamsKey = "garg-graph-params" graphParamsKey = "garg-graph-params"
......
...@@ -6,8 +6,7 @@ import Data.Maybe (Maybe(..)) ...@@ -6,8 +6,7 @@ import Data.Maybe (Maybe(..))
import Data.Nullable (toMaybe) import Data.Nullable (toMaybe)
import Effect (Effect) import Effect (Effect)
import FFI.Simple ((...)) import FFI.Simple ((...))
import Gargantext.Components.App (app) import Gargantext.Components.App as App
import Gargantext.Components.App.Store as AppStore
import Gargantext.Utils.Reactix as R2 import Gargantext.Utils.Reactix as R2
import Prelude (Unit, ($)) import Prelude (Unit, ($))
...@@ -19,12 +18,6 @@ main = paint $ toMaybe (document ... "getElementById" $ [ "app" ]) ...@@ -19,12 +18,6 @@ main = paint $ toMaybe (document ... "getElementById" $ [ "app" ])
paint :: Maybe Element -> Effect Unit paint :: Maybe Element -> Effect Unit
paint Nothing = here.error "[main] Container not found" paint Nothing = here.error "[main] Container not found"
paint (Just c) = R2.render app' c paint (Just c) = R2.render app c
where where
state = AppStore.options app = App.app {}
app' =
AppStore.provide
state
[
app {} []
]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment