diff --git a/src/Gargantext/AsyncTasks.purs b/src/Gargantext/AsyncTasks.purs index 2ab758b601631111de44969ee6037c41c6749e4b..daa2b67179555f136d53674874782ef8f9875331 100644 --- a/src/Gargantext/AsyncTasks.purs +++ b/src/Gargantext/AsyncTasks.purs @@ -55,8 +55,8 @@ removeTaskFromList ts (GT.AsyncTaskWithType { task: GT.AsyncTask { id: id' } }) A.filter (\(GT.AsyncTaskWithType { task: GT.AsyncTask { id: id'' } }) -> id' /= id'') ts type ReductorProps = ( - reloadForest :: T.Box T2.Reload - , reloadRoot :: T.Box T2.Reload + reloadForest :: T2.ReloadS + , reloadRoot :: T2.ReloadS , storage :: Storage ) diff --git a/src/Gargantext/Components/App/Data.purs b/src/Gargantext/Components/App/Data.purs index f252f1f2c095f2b601d3c3bf3262eccb5c780b88..11fc2ff8724bd8e82c4f8bbf38b509a1c5e29379 100644 --- a/src/Gargantext/Components/App/Data.purs +++ b/src/Gargantext/Components/App/Data.purs @@ -20,8 +20,9 @@ type App = , forestOpen :: OpenNodes , graphVersion :: T2.Reload , handed :: Handed - , reloadForest :: Int - , reloadRoot :: Int + , reloadForest :: T2.Reload + , reloadMainPage :: T2.Reload + , reloadRoot :: T2.Reload , route :: AppRoute , sessions :: Sessions , showCorpus :: Boolean @@ -41,6 +42,7 @@ emptyApp = , graphVersion : T2.newReload , handed : RightHanded , reloadForest : T2.newReload + , reloadMainPage : T2.newReload , reloadRoot : T2.newReload , route : Home , sessions : Sessions.empty @@ -59,8 +61,9 @@ type Boxes = , forestOpen :: T.Box OpenNodes , graphVersion :: T2.ReloadS , handed :: T.Box Handed - , reloadForest :: T.Box T2.Reload - , reloadRoot :: T.Box T2.Reload + , reloadForest :: T2.ReloadS + , reloadMainPage :: T2.ReloadS + , reloadRoot :: T2.ReloadS , route :: T.Box AppRoute , sessions :: T.Box Sessions , showCorpus :: T.Box Boolean diff --git a/src/Gargantext/Components/Forest.purs b/src/Gargantext/Components/Forest.purs index c4a14b8df3a13f2f72b0b9e6a4d44a0789cb00b1..215f77a5e1740e4a80171ca29e04263f8b9cf2cc 100644 --- a/src/Gargantext/Components/Forest.purs +++ b/src/Gargantext/Components/Forest.purs @@ -32,16 +32,17 @@ here = R2.here "Gargantext.Components.Forest" -- Shared by components here with Tree type Common = - ( frontends :: Frontends - , handed :: T.Box Handed - , reloadRoot :: T.Box T2.Reload - , route :: T.Box AppRoute + ( frontends :: Frontends + , handed :: T.Box Handed + , reloadMainPage :: T2.ReloadS + , reloadRoot :: T2.ReloadS + , route :: T.Box AppRoute ) type Props = ( backend :: T.Box (Maybe Backend) , forestOpen :: T.Box OpenNodes - , reloadForest :: T.Box T2.Reload + , reloadForest :: T2.ReloadS , sessions :: T.Box Sessions , showLogin :: T.Box Boolean , showTree :: T.Box Boolean @@ -64,6 +65,7 @@ forestCpt = here.component "forest" cpt where , frontends , handed , reloadForest + , reloadMainPage , reloadRoot , route , sessions @@ -103,6 +105,7 @@ forestCpt = here.component "forest" cpt where , frontends , handed: handed' , reload: reloadForest + , reloadMainPage , reloadRoot , root: treeId , route @@ -160,7 +163,8 @@ forestLayoutMain = R.createElement forestLayoutMainCpt forestLayoutMainCpt :: R.Component Props forestLayoutMainCpt = here.component "forestLayoutMain" cpt where - cpt props children = pure $ forestLayoutRaw props [ mainPage {} children ] + cpt props@{ reloadMainPage } children = + pure $ forestLayoutRaw props [ mainPage { reloadMainPage } children ] forestLayoutRaw :: R2.Component Props forestLayoutRaw = R.createElement forestLayoutRawCpt @@ -171,6 +175,7 @@ forestLayoutRawCpt = here.component "forestLayoutRaw" cpt where , forestOpen , frontends , reloadForest + , reloadMainPage , reloadRoot , route , sessions @@ -190,6 +195,7 @@ forestLayoutRawCpt = here.component "forestLayoutRaw" cpt where , forestOpen , handed , reloadForest + , reloadMainPage , reloadRoot , route , sessions @@ -197,15 +203,20 @@ forestLayoutRawCpt = here.component "forestLayoutRaw" cpt where , showLogin , tasks } [] -mainPage :: R2.Component () +type MainPage = + ( reloadMainPage :: T2.ReloadS ) + +mainPage :: R2.Component MainPage mainPage = R.createElement mainPageCpt -- mainPageCpt :: R.Memo () -- mainPageCpt = R.memo (here.component "mainPage" cpt) where -mainPageCpt :: R.Component () +mainPageCpt :: R.Component MainPage mainPageCpt = here.component "mainPage" cpt where - cpt _ children = do + cpt { reloadMainPage } children = do + reloadMainPage' <- T.useLive T.unequal reloadMainPage + pure $ H.div { className: "col-md-10" } [ H.div { id: "page-wrapper" } [ H.div { className: "container-fluid" } children ] diff --git a/src/Gargantext/Components/Forest/Tree.purs b/src/Gargantext/Components/Forest/Tree.purs index e77a2ca4397c448d9572f9b6ff0e5b6d7d7d4d39..0c34a0046525fecff3fb640b1f7e8c1ee12ef170 100644 --- a/src/Gargantext/Components/Forest/Tree.purs +++ b/src/Gargantext/Components/Forest/Tree.purs @@ -6,7 +6,6 @@ import Data.Array as A import Data.Maybe (Maybe(..)) import Data.Set as Set import Data.Traversable (traverse_, traverse) -import Data.Tuple (snd) import DOM.Simple.Console (log, log2) import Effect (Effect) import Effect.Aff (Aff) @@ -47,7 +46,8 @@ here = R2.here "Gargantext.Components.Forest.Tree" -- Shared by every component here + performAction + nodeSpan type Universal = - ( reloadRoot :: T.Box T2.Reload ) + ( reloadMainPage :: T2.ReloadS + , reloadRoot :: T2.ReloadS ) -- Shared by every component here + nodeSpan type Global = @@ -60,7 +60,7 @@ type Global = -- Shared by every component here type Common = ( forestOpen :: T.Box OpenNodes - , reload :: T.Box T2.Reload + , reload :: T2.ReloadS | Global ) @@ -90,7 +90,7 @@ getNodeTree session nodeId = get session $ GR.NodeAPI GT.Tree (Just nodeId) "" getNodeTreeFirstLevel :: Session -> ID -> Aff FTree getNodeTreeFirstLevel session nodeId = get session $ GR.TreeFirstLevel (Just nodeId) "" -type NodeProps = ( reloadTree :: T.Box T2.Reload, session :: Session | Common ) +type NodeProps = ( reloadTree :: T2.ReloadS, session :: Session | Common ) type TreeProps = ( tree :: FTree | NodeProps ) @@ -102,25 +102,18 @@ treeCpt = here.component "tree" cpt where cpt p@{ reload, session, tree: NTree (LNode { id, name, nodeType }) children } _ = do setPopoverRef <- R.useRef Nothing folderOpen <- T2.useMemberBox nodeId p.forestOpen - folderOpen' <- T.useLive T.unequal folderOpen - pure $ H.ul { className: ulClass <> " " <> handedClass } - [ H.li { className: childrenClass children } + pure $ H.ul { className: ulClass } + [ H.li { className: childrenClass children' } [ nodeSpan (nsprops { folderOpen, name, id, nodeType, setPopoverRef, isLeaf }) - (renderChildren folderOpen') + [ renderChildren (Record.merge p { childProps: { children', folderOpen, render: tree } } ) [] ] ] ] where isLeaf = A.null children nodeId = mkNodeId session id - ulClass = switchHanded "ml" "mr" p.handed <> "-auto tree" - handedClass = switchHanded "left" "right" p.handed <> "handed" + ulClass = switchHanded "ml left" "mr right" p.handed <> "-auto tree handed" children' = A.sortWith fTreeID pubChildren pubChildren = if isPublic nodeType then map (map pub) children else children - renderChildren false = [] - renderChildren true = map renderChild children' where - renderChild (NTree (LNode {id: cId}) _) = childLoader props [] where - props = Record.merge nodeProps { id: cId, render: tree } - nodeProps = RecordE.pick p :: Record NodeProps nsprops extra = Record.merge common extra' where common = RecordE.pick p :: Record NSCommon extra' = Record.merge extra { dispatch, reload } where @@ -129,12 +122,49 @@ treeCpt = here.component "tree" cpt where spr = { setPopoverRef: extra.setPopoverRef } pub (LNode n@{ nodeType: t }) = LNode (n { nodeType = publicize t }) childrenClass [] = "no-children" - childrenClass _ = "with-children" + childrenClass _ = "with-children" + + +type ChildrenTreeProps = + ( childProps :: { children' :: Array FTree + , folderOpen :: T.Box Boolean + , render :: R2.Leaf TreeProps } + | TreeProps ) + + +renderChildren :: R2.Component ChildrenTreeProps +renderChildren = R.createElement renderChildrenCpt + +renderChildrenCpt :: R.Component ChildrenTreeProps +renderChildrenCpt = here.component "renderChildren" cpt where + cpt p@{ childProps: { folderOpen } } _ = do + folderOpen' <- T.useLive T.unequal folderOpen + + if folderOpen' then + pure $ renderTreeChildren p [] + else + pure $ H.div {} [] + +renderTreeChildren :: R2.Component ChildrenTreeProps +renderTreeChildren = R.createElement renderTreeChildrenCpt + +renderTreeChildrenCpt :: R.Component ChildrenTreeProps +renderTreeChildrenCpt = here.component "renderTreeChildren" cpt where + cpt p@{ childProps: { children' + , folderOpen + , render } } _ = do + pure $ R.fragment (map renderChild children') + + where + nodeProps = RecordE.pick p :: Record NodeProps + renderChild (NTree (LNode {id: cId}) _) = childLoader props [] where + props = Record.merge nodeProps { id: cId, render } + --- The properties tree shares in common with performAction type PACommon = ( forestOpen :: T.Box OpenNodes - , reloadTree :: T.Box T2.Reload + , reloadTree :: T2.ReloadS , session :: Session , tasks :: T.Box GAT.Storage , tree :: FTree @@ -155,7 +185,7 @@ childLoaderCpt :: R.Component ChildLoaderProps childLoaderCpt = here.component "childLoader" cpt where cpt p@{ render } _ = do reload <- T.useBox T2.newReload - let reloads = [ reload, p.reloadTree, p.reloadRoot ] + let reloads = [ reload, p.reloadRoot, p.reloadTree ] cache <- (A.cons p.id) <$> traverse (T.useLive T.unequal) reloads useLoader cache fetch (paint reload) where diff --git a/src/Gargantext/Components/Forest/Tree/Node.purs b/src/Gargantext/Components/Forest/Tree/Node.purs index 95216394998bcc23dc3be2cc7e41f893d1667578..31bf2c6b13e476a948cf71bd071b44486d59f038 100644 --- a/src/Gargantext/Components/Forest/Tree/Node.purs +++ b/src/Gargantext/Components/Forest/Tree/Node.purs @@ -45,17 +45,18 @@ here = R2.here "Gargantext.Components.Forest.Tree.Node" -- Main Node type NodeMainSpanProps = - ( folderOpen :: T.Box Boolean - , frontends :: Frontends - , id :: ID - , isLeaf :: IsLeaf - , name :: Name - , nodeType :: GT.NodeType - , reload :: T.Box T2.Reload - , reloadRoot :: T.Box T2.Reload - , route :: T.Box Routes.AppRoute - , setPopoverRef :: R.Ref (Maybe (Boolean -> Effect Unit)) - , tasks :: T.Box GAT.Storage + ( folderOpen :: T.Box Boolean + , frontends :: Frontends + , id :: ID + , isLeaf :: IsLeaf + , name :: Name + , nodeType :: GT.NodeType + , reload :: T2.ReloadS + , reloadMainPage :: T2.ReloadS + , reloadRoot :: T2.ReloadS + , route :: T.Box Routes.AppRoute + , setPopoverRef :: R.Ref (Maybe (Boolean -> Effect Unit)) + , tasks :: T.Box GAT.Storage | CommonProps ) @@ -84,7 +85,7 @@ nodeMainSpanCpt = here.component "nodeMainSpan" cpt , isLeaf , name , nodeType - , reload + , reloadMainPage , reloadRoot , route , session @@ -153,7 +154,7 @@ nodeMainSpanCpt = here.component "nodeMainSpan" cpt T2.reload reloadRoot else if GAT.asyncTaskTTriggersTreeReload t then do here.log2 "reloading tree for task" t - T2.reload reload + T2.reload reloadMainPage else do here.log2 "task doesn't trigger a reload" t pure unit diff --git a/src/Gargantext/Components/GraphExplorer/Sidebar.purs b/src/Gargantext/Components/GraphExplorer/Sidebar.purs index 75ec5eeba90587d420ee9f524ccf9a910a5ddaba..542e2cb6894dbfef54901ce1ac811e5156094cba 100644 --- a/src/Gargantext/Components/GraphExplorer/Sidebar.purs +++ b/src/Gargantext/Components/GraphExplorer/Sidebar.purs @@ -43,7 +43,7 @@ here = R2.here "Gargantext.Components.GraphExplorer.Sidebar" type Common = ( graphId :: NodeID , metaData :: GET.MetaData - , reloadForest :: T.Box T2.Reload + , reloadForest :: T2.ReloadS , removedNodeIds :: T.Box SigmaxT.NodeIds , selectedNodeIds :: T.Box SigmaxT.NodeIds , session :: Session @@ -313,7 +313,7 @@ type DeleteNodes = ( graphId :: NodeID , metaData :: GET.MetaData , nodes :: Array (Record SigmaxT.Node) - , reloadForest :: T.Box T2.Reload + , reloadForest :: T2.ReloadS , session :: Session , termList :: TermList ) diff --git a/src/Gargantext/Components/NgramsTable.purs b/src/Gargantext/Components/NgramsTable.purs index a5b03f59f2bde9e22cfd383540cb4358730d7d11..7b8c9d6b8c90bb8fdbe3d3728984e465feeb50af 100644 --- a/src/Gargantext/Components/NgramsTable.purs +++ b/src/Gargantext/Components/NgramsTable.purs @@ -259,8 +259,8 @@ tableContainerCpt { dispatch type CommonProps = ( afterSync :: Unit -> Aff Unit - , reloadForest :: T.Box T2.Reload - , reloadRoot :: T.Box T2.Reload + , reloadForest :: T2.ReloadS + , reloadRoot :: T2.ReloadS , tabNgramType :: CTabNgramType , tasks :: T.Box GAT.Storage , withAutoUpdate :: Boolean diff --git a/src/Gargantext/Components/Nodes/Annuaire/Tabs.purs b/src/Gargantext/Components/Nodes/Annuaire/Tabs.purs index e4792c74bbec8324c1b12ad60d05b49f4a8b656a..47b7f6a7c99a059bfddc9e036e6684d13f40cfcf 100644 --- a/src/Gargantext/Components/Nodes/Annuaire/Tabs.purs +++ b/src/Gargantext/Components/Nodes/Annuaire/Tabs.purs @@ -56,8 +56,8 @@ type TabsProps = , contactData :: ContactData , frontends :: Frontends , nodeId :: Int - , reloadForest :: T.Box T2.Reload - , reloadRoot :: T.Box T2.Reload + , reloadForest :: T2.ReloadS + , reloadRoot :: T2.ReloadS , session :: Session , sidePanel :: T.Box (Maybe (Record TextsT.SidePanel)) , sidePanelState :: T.Box SidePanelState @@ -133,8 +133,8 @@ ngramsViewCpt = here.component "ngramsView" cpt where type NTCommon = ( cacheState :: T.Box LTypes.CacheState , defaultListId :: Int - , reloadForest :: T.Box T2.Reload - , reloadRoot :: T.Box T2.Reload + , reloadForest :: T2.ReloadS + , reloadRoot :: T2.ReloadS , session :: Session , tasks :: T.Box GAT.Storage ) diff --git a/src/Gargantext/Components/Nodes/Annuaire/User.purs b/src/Gargantext/Components/Nodes/Annuaire/User.purs index 283cbc5efd65d617ce98ad9446c4ab7402ccccf2..4c96182fc50b53208a807bbf71b5bd23c01d99ea 100644 --- a/src/Gargantext/Components/Nodes/Annuaire/User.purs +++ b/src/Gargantext/Components/Nodes/Annuaire/User.purs @@ -154,8 +154,8 @@ listElement = H.li { className: "list-group-item justify-content-between" } type LayoutNoSessionProps = ( frontends :: Frontends , nodeId :: Int - , reloadForest :: T.Box T2.Reload - , reloadRoot :: T.Box T2.Reload + , reloadForest :: T2.ReloadS + , reloadRoot :: T2.ReloadS , sidePanel :: T.Box (Maybe (Record TT.SidePanel)) , sidePanelState :: T.Box SidePanelState , tasks :: T.Box GAT.Storage diff --git a/src/Gargantext/Components/Nodes/Annuaire/User/Contact.purs b/src/Gargantext/Components/Nodes/Annuaire/User/Contact.purs index c6cc516befd4b6f0aa79bfb641af093fb40e9b25..c1d344f1361cbb4d5ef11709cdcf5a65abdbc084 100644 --- a/src/Gargantext/Components/Nodes/Annuaire/User/Contact.purs +++ b/src/Gargantext/Components/Nodes/Annuaire/User/Contact.purs @@ -148,8 +148,8 @@ type BasicProps = ) type ReloadProps = - ( reloadForest :: T.Box T2.Reload - , reloadRoot :: T.Box T2.Reload + ( reloadForest :: T2.ReloadS + , reloadRoot :: T2.ReloadS | BasicProps ) @@ -228,7 +228,7 @@ contactLayoutWithKeyCpt = here.component "contactLayoutWithKey" cpt where , reloadRoot , tasks } ] where - onUpdateHyperdata :: T.Box T2.Reload -> HyperdataContact -> Effect Unit + onUpdateHyperdata :: T2.ReloadS -> HyperdataContact -> Effect Unit onUpdateHyperdata reload hd = launchAff_ $ saveContactHyperdata session nodeId hd *> liftEffect (T2.reload reload) diff --git a/src/Gargantext/Components/Nodes/Annuaire/User/Contacts/Tabs.purs b/src/Gargantext/Components/Nodes/Annuaire/User/Contacts/Tabs.purs index ece79b1b9ae9d5ba7268ca7e171869f8a1c186f9..b4be1f447775c0a80fceac347eaf44f1a652e6dc 100644 --- a/src/Gargantext/Components/Nodes/Annuaire/User/Contacts/Tabs.purs +++ b/src/Gargantext/Components/Nodes/Annuaire/User/Contacts/Tabs.purs @@ -53,8 +53,8 @@ type TabsProps = ( , contactData :: ContactData' , frontends :: Frontends , nodeId :: Int - , reloadForest :: T.Box T2.Reload - , reloadRoot :: T.Box T2.Reload + , reloadForest :: T2.ReloadS + , reloadRoot :: T2.ReloadS , session :: Session , sidePanel :: T.Box (Maybe (Record TTypes.SidePanel)) , sidePanelState :: T.Box SidePanelState @@ -134,8 +134,8 @@ type NgramsViewTabsProps = ( , defaultListId :: Int , mode :: Mode , nodeId :: Int - , reloadForest :: T.Box T2.Reload - , reloadRoot :: T.Box T2.Reload + , reloadForest :: T2.ReloadS + , reloadRoot :: T2.ReloadS , session :: Session , tasks :: T.Box GAT.Storage ) diff --git a/src/Gargantext/Components/Nodes/Lists.purs b/src/Gargantext/Components/Nodes/Lists.purs index 5e2a54865e6527ebb02d51422713b7e1f482fe2b..e4ae9d5abce53052a292ee543a4fd9bb9646b213 100644 --- a/src/Gargantext/Components/Nodes/Lists.purs +++ b/src/Gargantext/Components/Nodes/Lists.purs @@ -40,8 +40,8 @@ listsWithSessionContextCpt = here.component "listsWithSessionContext" cpt where type CommonPropsNoSession = ( nodeId :: Int - , reloadForest :: T.Box T2.Reload - , reloadRoot :: T.Box T2.Reload + , reloadForest :: T2.ReloadS + , reloadRoot :: T2.ReloadS , sessionUpdate :: Session -> Effect Unit , sidePanel :: T.Box (Maybe (Record SidePanel)) , sidePanelState :: T.Box GT.SidePanelState diff --git a/src/Gargantext/Components/Nodes/Lists/Tabs.purs b/src/Gargantext/Components/Nodes/Lists/Tabs.purs index 8dc53f889b6c14224f9961ac7f3b3848e5b04dc8..4e49919ab051bbcb9bc48840f3948b2a437b6c62 100644 --- a/src/Gargantext/Components/Nodes/Lists/Tabs.purs +++ b/src/Gargantext/Components/Nodes/Lists/Tabs.purs @@ -37,8 +37,8 @@ type Props = ( cacheState :: T.Box CacheState , corpusData :: CorpusData , corpusId :: Int - , reloadForest :: T.Box T2.Reload - , reloadRoot :: T.Box T2.Reload + , reloadForest :: T2.ReloadS + , reloadRoot :: T2.ReloadS , session :: Session , tasks :: T.Box GAT.Storage ) diff --git a/src/Gargantext/Components/Router.purs b/src/Gargantext/Components/Router.purs index acdcbbdec8a4a989fe645327119d994f3822a009..6583dfb59376d4f40cf595388619bdfee95ce97c 100644 --- a/src/Gargantext/Components/Router.purs +++ b/src/Gargantext/Components/Router.purs @@ -148,6 +148,7 @@ forestCpt = here.component "forest" cpt where , forestOpen , handed , reloadForest + , reloadMainPage , reloadRoot , route , sessions @@ -162,6 +163,7 @@ forestCpt = here.component "forest" cpt where , frontends: defaultFrontends , handed , reloadForest + , reloadMainPage , reloadRoot , route , sessions diff --git a/src/Gargantext/Types.purs b/src/Gargantext/Types.purs index cb46e34db764a907945488891cf4eb96dd500a24..8bed807fc457b471164dc4cb966948ede6a3a716 100644 --- a/src/Gargantext/Types.purs +++ b/src/Gargantext/Types.purs @@ -644,14 +644,6 @@ asyncTaskTypePath UpdateNgramsCharts = "ngrams/async/charts/update/" asyncTaskTypePath UpdateNode = "update/" asyncTaskTypePath UploadFile = "async/file/add/" -asyncTaskTriggersAppReload :: AsyncTaskType -> Boolean -asyncTaskTriggersAppReload _ = true - -asyncTaskTriggersTreeReload :: AsyncTaskType -> Boolean -asyncTaskTriggersTreeReload Form = true -asyncTaskTriggersTreeReload UploadFile = true -asyncTaskTriggersTreeReload _ = false - type AsyncTaskID = String