Commit 12910a76 authored by Przemyslaw Kaminski's avatar Przemyslaw Kaminski

[forest] rewrite graph explorer to new forest/sidebar/topbar layout

NOTE: This still doesn't work fully
parent ee654ac1
...@@ -5,49 +5,70 @@ import Data.Maybe (Maybe(..)) ...@@ -5,49 +5,70 @@ import Data.Maybe (Maybe(..))
import Toestand as T import Toestand as T
import Gargantext.AsyncTasks as GAT import Gargantext.AsyncTasks as GAT
import Gargantext.Components.GraphExplorer.Sidebar.Types as GEST
import Gargantext.Components.Nodes.Lists.Types as ListsT
import Gargantext.Components.Nodes.Texts.Types as TextsT
import Gargantext.Ends (Backend) import Gargantext.Ends (Backend)
import Gargantext.Routes (AppRoute(Home)) import Gargantext.Routes (AppRoute(Home))
import Gargantext.Sessions as Sessions import Gargantext.Sessions as Sessions
import Gargantext.Sessions (OpenNodes, Sessions) import Gargantext.Sessions (OpenNodes, Sessions)
import Gargantext.Types (Handed(RightHanded)) import Gargantext.Types (Handed(RightHanded), SidePanelState(..))
import Gargantext.Utils.Toestand as T2 import Gargantext.Utils.Toestand as T2
type App = type App =
{ backend :: Maybe Backend { backend :: Maybe Backend
, forestOpen :: OpenNodes , forestOpen :: OpenNodes
, handed :: Handed , graphVersion :: T2.Reload
, reloadForest :: Int , handed :: Handed
, reloadRoot :: Int , reloadForest :: Int
, route :: AppRoute , reloadRoot :: Int
, sessions :: Sessions , route :: AppRoute
, showCorpus :: Boolean , sessions :: Sessions
, showLogin :: Boolean , showCorpus :: Boolean
, tasks :: GAT.Storage , showLogin :: Boolean
, showTree :: Boolean
, sidePanelGraph :: Maybe (Record GEST.SidePanel)
, sidePanelLists :: Maybe (Record ListsT.SidePanel)
, sidePanelTexts :: Maybe (Record TextsT.SidePanel)
, sidePanelState :: SidePanelState
, tasks :: GAT.Storage
} }
emptyApp :: App emptyApp :: App
emptyApp = emptyApp =
{ backend: Nothing { backend : Nothing
, forestOpen: Set.empty , forestOpen : Set.empty
, handed: RightHanded , graphVersion : T2.newReload
, reloadForest: T2.newReload , handed : RightHanded
, reloadRoot: T2.newReload , reloadForest : T2.newReload
, route: Home , reloadRoot : T2.newReload
, sessions: Sessions.empty , route : Home
, showCorpus: false , sessions : Sessions.empty
, showLogin: false , showCorpus : false
, tasks: GAT.empty , showLogin : false
, showTree : true
, sidePanelGraph : GEST.initialSidePanel
, sidePanelLists : ListsT.initialSidePanel
, sidePanelTexts : TextsT.initialSidePanel
, sidePanelState : InitialClosed
, tasks : GAT.empty
} }
type Boxes = type Boxes =
{ backend :: T.Box (Maybe Backend) { backend :: T.Box (Maybe Backend)
, forestOpen :: T.Box OpenNodes , forestOpen :: T.Box OpenNodes
, handed :: T.Box Handed , graphVersion :: T2.ReloadS
, reloadForest :: T.Box T2.Reload , handed :: T.Box Handed
, reloadRoot :: T.Box T2.Reload , reloadForest :: T.Box T2.Reload
, route :: T.Box AppRoute , reloadRoot :: T.Box T2.Reload
, sessions :: T.Box Sessions , route :: T.Box AppRoute
, showCorpus :: T.Box Boolean , sessions :: T.Box Sessions
, showLogin :: T.Box Boolean , showCorpus :: T.Box Boolean
, tasks :: T.Box GAT.Storage , showLogin :: T.Box Boolean
, showTree :: T.Box Boolean
, sidePanelGraph :: T.Box (Maybe (Record GEST.SidePanel))
, sidePanelLists :: T.Box (Maybe (Record ListsT.SidePanel))
, sidePanelTexts :: T.Box (Maybe (Record TextsT.SidePanel))
, sidePanelState :: T.Box SidePanelState
, tasks :: T.Box GAT.Storage
} }
...@@ -15,11 +15,11 @@ import Data.Set (Set) ...@@ -15,11 +15,11 @@ import Data.Set (Set)
import Data.Set as Set import Data.Set as Set
import Data.String as Str import Data.String as Str
import Data.Symbol (SProxy(..)) import Data.Symbol (SProxy(..))
import Data.Tuple (Tuple(..), fst) import Data.Tuple (Tuple(..))
import Data.Tuple.Nested ((/\)) import DOM.Simple.Console (log2)
import DOM.Simple.Event as DE import DOM.Simple.Event as DE
import Effect (Effect) import Effect (Effect)
import Effect.Aff (Aff) import Effect.Aff (Aff, launchAff_)
import Effect.Class (liftEffect) import Effect.Class (liftEffect)
import Reactix as R import Reactix as R
import Reactix.DOM.HTML as H import Reactix.DOM.HTML as H
...@@ -31,14 +31,14 @@ import Gargantext.Components.DocsTable.Types ...@@ -31,14 +31,14 @@ import Gargantext.Components.DocsTable.Types
( DocumentsView(..), Hyperdata(..), LocalUserScore, Query, Response(..), sampleData ) ( DocumentsView(..), Hyperdata(..), LocalUserScore, Query, Response(..), sampleData )
import Gargantext.Components.Table.Types as TT import Gargantext.Components.Table.Types as TT
import Gargantext.Components.Nodes.Lists.Types as NT import Gargantext.Components.Nodes.Lists.Types as NT
import Gargantext.Components.Nodes.Texts.Types (SidePanelTriggers) import Gargantext.Components.Nodes.Texts.Types as TextsT
import Gargantext.Components.Table as TT import Gargantext.Components.Table as TT
import Gargantext.Ends (Frontends, url) import Gargantext.Ends (Frontends, url)
import Gargantext.Hooks.Loader (useLoader, useLoaderWithCacheAPI, HashedResponse(..)) import Gargantext.Hooks.Loader (useLoader, useLoaderWithCacheAPI, HashedResponse(..))
import Gargantext.Routes as Routes import Gargantext.Routes as Routes
import Gargantext.Routes (SessionRoute(NodeAPI)) import Gargantext.Routes (SessionRoute(NodeAPI))
import Gargantext.Sessions (Session, sessionId, get, delete) import Gargantext.Sessions (Session, sessionId, get, delete)
import Gargantext.Types (ListId, NodeID, NodeType(..), OrderBy(..), TableResult, TabSubType, TabType, showTabType') import Gargantext.Types (ListId, NodeID, NodeType(..), OrderBy(..), SidePanelState(..), TableResult, TabSubType, TabType, showTabType')
import Gargantext.Utils (sortWith) import Gargantext.Utils (sortWith)
import Gargantext.Utils.CacheAPI as GUC import Gargantext.Utils.CacheAPI as GUC
import Gargantext.Utils.QueryString (joinQueryStrings, mQueryParamS, queryParam, queryParamS) import Gargantext.Utils.QueryString (joinQueryStrings, mQueryParamS, queryParam, queryParamS)
...@@ -58,36 +58,35 @@ type Path a = ...@@ -58,36 +58,35 @@ type Path a =
, tabType :: TabSubType a , tabType :: TabSubType a
) )
type LayoutProps = type CommonProps =
( cacheState :: T.Box NT.CacheState ( cacheState :: T.Box NT.CacheState
, frontends :: Frontends , frontends :: Frontends
, chart :: R.Element , listId :: Int
, listId :: Int , mCorpusId :: Maybe Int
, mCorpusId :: Maybe Int , nodeId :: Int
, nodeId :: Int , session :: Session
-- , path :: Record (Path a) , sidePanel :: T.Box (Maybe (Record TextsT.SidePanel))
, session :: Session , sidePanelState :: T.Box SidePanelState
, showSearch :: Boolean , tabType :: TabType
, sidePanelTriggers :: Record SidePanelTriggers
, tabType :: TabType
-- ^ tabType is not ideal here since it is too much entangled with tabs and -- ^ tabType is not ideal here since it is too much entangled with tabs and
-- ngramtable. Let's see how this evolves. ) -- ngramtable. Let's see how this evolves. )
, totalRecords :: Int , totalRecords :: Int
)
type LayoutProps =
(
chart :: R.Element
, showSearch :: Boolean
| CommonProps
-- , path :: Record (Path a)
) )
type PageLayoutProps = type PageLayoutProps =
( cacheState :: T.Box NT.CacheState (
, frontends :: Frontends key :: String -- NOTE Necessary to clear the component when cache state changes
, key :: String -- NOTE Necessary to clear the component when cache state changes , params :: TT.Params
, listId :: Int , query :: Query
, mCorpusId :: Maybe Int | CommonProps
, nodeId :: Int
, params :: TT.Params
, query :: Query
, session :: Session
, sidePanelTriggers :: Record SidePanelTriggers
, tabType :: TabType
, totalRecords :: Int
) )
_documentIdsDeleted = prop (SProxy :: SProxy "documentIdsDeleted") _documentIdsDeleted = prop (SProxy :: SProxy "documentIdsDeleted")
...@@ -123,7 +122,8 @@ docViewCpt = here.component "docView" cpt where ...@@ -123,7 +122,8 @@ docViewCpt = here.component "docView" cpt where
, nodeId , nodeId
, session , session
, showSearch , showSearch
, sidePanelTriggers , sidePanel
, sidePanelState
, tabType , tabType
, totalRecords , totalRecords
} }
...@@ -147,7 +147,8 @@ docViewCpt = here.component "docView" cpt where ...@@ -147,7 +147,8 @@ docViewCpt = here.component "docView" cpt where
, params , params
, query: query' , query: query'
, session , session
, sidePanelTriggers , sidePanel
, sidePanelState
, tabType , tabType
, totalRecords , totalRecords
} ] ] ] } ] ] ]
...@@ -259,7 +260,7 @@ pageLayoutCpt = here.component "pageLayout" cpt where ...@@ -259,7 +260,7 @@ pageLayoutCpt = here.component "pageLayout" cpt where
, params , params
, query , query
, session , session
, sidePanelTriggers , sidePanel
, tabType } _ = do , tabType } _ = do
cacheState' <- T.useLive T.unequal cacheState cacheState' <- T.useLive T.unequal cacheState
...@@ -373,7 +374,8 @@ pagePaintRawCpt = here.component "pagePaintRawCpt" cpt where ...@@ -373,7 +374,8 @@ pagePaintRawCpt = here.component "pagePaintRawCpt" cpt where
, mCorpusId , mCorpusId
, nodeId , nodeId
, session , session
, sidePanelTriggers: sidePanelTriggers@{ currentDocIdRef } , sidePanel
, sidePanelState
, totalRecords } , totalRecords }
, localCategories , localCategories
, params } _ = do , params } _ = do
...@@ -381,13 +383,15 @@ pagePaintRawCpt = here.component "pagePaintRawCpt" cpt where ...@@ -381,13 +383,15 @@ pagePaintRawCpt = here.component "pagePaintRawCpt" cpt where
reload <- T.useBox T2.newReload reload <- T.useBox T2.newReload
localCategories' <- T.useLive T.unequal localCategories localCategories' <- T.useLive T.unequal localCategories
sidePanel' <- T.useLive T.unequal sidePanel
let mCurrentDocId = maybe Nothing (_.mCurrentDocId) sidePanel'
pure $ TT.table pure $ TT.table
{ syncResetButton : [ H.div {} [] ] { colNames
, colNames
, container: TT.defaultContainer { title: "Documents" } , container: TT.defaultContainer { title: "Documents" }
, params , params
, rows: rows reload localCategories' , rows: rows reload localCategories' mCurrentDocId
, syncResetButton : [ H.div {} [] ]
, totalRecords , totalRecords
, wrapColElts , wrapColElts
} }
...@@ -403,14 +407,20 @@ pagePaintRawCpt = here.component "pagePaintRawCpt" cpt where ...@@ -403,14 +407,20 @@ pagePaintRawCpt = here.component "pagePaintRawCpt" cpt where
| otherwise = Routes.Document sid listId | otherwise = Routes.Document sid listId
colNames = TT.ColumnName <$> [ "Show", "Tag", "Date", "Title", "Source", "Score" ] colNames = TT.ColumnName <$> [ "Show", "Tag", "Date", "Title", "Source", "Score" ]
wrapColElts = const identity wrapColElts = const identity
rows reload localCategories' = row <$> A.toUnfoldable documents rows reload localCategories' mCurrentDocId = row <$> A.toUnfoldable documents
where where
row dv@(DocumentsView r@{ _id, category }) = row dv@(DocumentsView r@{ _id, category }) =
{ row: { row:
TT.makeRow [ -- H.div {} [ H.a { className, style, on: {click: click Favorite} } [] ] TT.makeRow [ -- H.div {} [ H.a { className, style, on: {click: click Favorite} } [] ]
H.div { className: "" } H.div { className: "" }
[ docChooser { listId, mCorpusId, nodeId: r._id, selected, sidePanelTriggers, tableReload: reload } [] [ docChooser { listId
] , mCorpusId
, nodeId: r._id
, selected
, sidePanel
, sidePanelState
, tableReload: reload } []
]
--, H.div { className: "column-tag flex" } [ caroussel { category: cat, nodeId, row: dv, session, setLocalCategories } [] ] --, H.div { className: "column-tag flex" } [ caroussel { category: cat, nodeId, row: dv, session, setLocalCategories } [] ]
, H.div { className: "column-tag flex" } , H.div { className: "column-tag flex" }
[ rating { nodeId [ rating { nodeId
...@@ -434,15 +444,16 @@ pagePaintRawCpt = here.component "pagePaintRawCpt" cpt where ...@@ -434,15 +444,16 @@ pagePaintRawCpt = here.component "pagePaintRawCpt" cpt where
-- checked = Star_1 == cat -- checked = Star_1 == cat
tClassName = trashClassName cat selected tClassName = trashClassName cat selected
className = gi cat className = gi cat
selected = R.readRef currentDocIdRef == Just r._id selected = mCurrentDocId == Just r._id
type DocChooser = ( type DocChooser = (
listId :: ListId listId :: ListId
, mCorpusId :: Maybe NodeID , mCorpusId :: Maybe NodeID
, nodeId :: NodeID , nodeId :: NodeID
, selected :: Boolean , selected :: Boolean
, sidePanelTriggers :: Record SidePanelTriggers , sidePanel :: T.Box (Maybe (Record TextsT.SidePanel))
, tableReload :: T2.ReloadS , sidePanelState :: T.Box SidePanelState
, tableReload :: T2.ReloadS
) )
docChooser :: R2.Component DocChooser docChooser :: R2.Component DocChooser
...@@ -458,7 +469,8 @@ docChooserCpt = here.component "docChooser" cpt ...@@ -458,7 +469,8 @@ docChooserCpt = here.component "docChooser" cpt
, mCorpusId: Just corpusId , mCorpusId: Just corpusId
, nodeId , nodeId
, selected , selected
, sidePanelTriggers: { triggerAnnotatedDocIdChange } , sidePanel
, sidePanelState
, tableReload } _ = do , tableReload } _ = do
let eyeClass = if selected then "fa-eye" else "fa-eye-slash" let eyeClass = if selected then "fa-eye" else "fa-eye-slash"
...@@ -472,8 +484,14 @@ docChooserCpt = here.component "docChooser" cpt ...@@ -472,8 +484,14 @@ docChooserCpt = here.component "docChooser" cpt
-- log2 "[docChooser] onClick, listId" listId -- log2 "[docChooser] onClick, listId" listId
-- log2 "[docChooser] onClick, corpusId" corpusId -- log2 "[docChooser] onClick, corpusId" corpusId
-- log2 "[docChooser] onClick, nodeId" nodeId -- log2 "[docChooser] onClick, nodeId" nodeId
R2.callTrigger triggerAnnotatedDocIdChange { corpusId, listId, nodeId } -- R2.callTrigger triggerAnnotatedDocIdChange { corpusId, listId, nodeId }
T2.reload tableReload -- T2.reload tableReload
T.write_ (Just { corpusId: corpusId
, listId: listId
, mCurrentDocId: Nothing
, nodeId: nodeId }) sidePanel
T.write_ Opened sidePanelState
log2 "[docChooser] sidePanel opened" sidePanelState
newtype SearchQuery = SearchQuery { newtype SearchQuery = SearchQuery {
......
...@@ -24,10 +24,12 @@ import Gargantext.Components.GraphExplorer.Button (centerButton, cameraButton) ...@@ -24,10 +24,12 @@ import Gargantext.Components.GraphExplorer.Button (centerButton, cameraButton)
import Gargantext.Components.GraphExplorer.RangeControl (edgeConfluenceControl, edgeWeightControl, nodeSizeControl) import Gargantext.Components.GraphExplorer.RangeControl (edgeConfluenceControl, edgeWeightControl, nodeSizeControl)
import Gargantext.Components.GraphExplorer.SlideButton (labelSizeButton, mouseSelectorSizeButton) import Gargantext.Components.GraphExplorer.SlideButton (labelSizeButton, mouseSelectorSizeButton)
import Gargantext.Components.GraphExplorer.ToggleButton (multiSelectEnabledButton, edgesToggleButton, louvainToggleButton, pauseForceAtlasButton) import Gargantext.Components.GraphExplorer.ToggleButton (multiSelectEnabledButton, edgesToggleButton, louvainToggleButton, pauseForceAtlasButton)
import Gargantext.Components.GraphExplorer.Sidebar.Types as GEST
import Gargantext.Components.GraphExplorer.Types as GET import Gargantext.Components.GraphExplorer.Types as GET
import Gargantext.Hooks.Sigmax as Sigmax import Gargantext.Hooks.Sigmax as Sigmax
import Gargantext.Hooks.Sigmax.Types as SigmaxT import Gargantext.Hooks.Sigmax.Types as SigmaxT
import Gargantext.Sessions (Session) import Gargantext.Sessions (Session)
import Gargantext.Types as GT
import Gargantext.Utils.Range as Range import Gargantext.Utils.Range as Range
import Gargantext.Utils.Reactix as R2 import Gargantext.Utils.Reactix as R2
...@@ -51,7 +53,7 @@ type Controls = ...@@ -51,7 +53,7 @@ type Controls =
, showControls :: T.Box Boolean , showControls :: T.Box Boolean
, showEdges :: T.Box SigmaxT.ShowEdgesState , showEdges :: T.Box SigmaxT.ShowEdgesState
, showLouvain :: T.Box Boolean , showLouvain :: T.Box Boolean
, showSidePanel :: T.Box GET.SidePanelState , sidePanelState :: T.Box GT.SidePanelState
, showTree :: T.Box Boolean , showTree :: T.Box Boolean
, sigmaRef :: R.Ref Sigmax.Sigma , sigmaRef :: R.Ref Sigmax.Sigma
) )
...@@ -85,14 +87,14 @@ controlsCpt = here.component "controls" cpt ...@@ -85,14 +87,14 @@ controlsCpt = here.component "controls" cpt
, showControls , showControls
, showEdges , showEdges
, showLouvain , showLouvain
, showSidePanel
, showTree , showTree
, sidePanelState
, sigmaRef } _ = do , sigmaRef } _ = do
forceAtlasState' <- T.useLive T.unequal forceAtlasState forceAtlasState' <- T.useLive T.unequal forceAtlasState
graphStage' <- T.useLive T.unequal graphStage graphStage' <- T.useLive T.unequal graphStage
selectedNodeIds' <- T.useLive T.unequal selectedNodeIds selectedNodeIds' <- T.useLive T.unequal selectedNodeIds
showControls' <- T.useLive T.unequal showControls showControls' <- T.useLive T.unequal showControls
showSidePanel' <- T.useLive T.unequal showSidePanel sidePanelState' <- T.useLive T.unequal sidePanelState
localControls <- initialLocalControls localControls <- initialLocalControls
-- ref to track automatic FA pausing -- ref to track automatic FA pausing
...@@ -115,8 +117,8 @@ controlsCpt = here.component "controls" cpt ...@@ -115,8 +117,8 @@ controlsCpt = here.component "controls" cpt
-- Automatic opening of sidebar when a node is selected (but only first time). -- Automatic opening of sidebar when a node is selected (but only first time).
R.useEffect' $ do R.useEffect' $ do
if showSidePanel' == GET.InitialClosed && (not Set.isEmpty selectedNodeIds') then if sidePanelState' == GT.InitialClosed && (not Set.isEmpty selectedNodeIds') then
T.write_ (GET.Opened GET.SideTabData) showSidePanel T.write_ GT.Opened sidePanelState
else else
pure unit pure unit
...@@ -221,15 +223,19 @@ useGraphControls :: { forceAtlasS :: SigmaxT.ForceAtlasState ...@@ -221,15 +223,19 @@ useGraphControls :: { forceAtlasS :: SigmaxT.ForceAtlasState
, graph :: SigmaxT.SGraph , graph :: SigmaxT.SGraph
, graphId :: GET.GraphId , graphId :: GET.GraphId
, hyperdataGraph :: GET.HyperdataGraph , hyperdataGraph :: GET.HyperdataGraph
, reloadForest :: Unit -> Effect Unit
, session :: Session , session :: Session
, reloadForest :: Unit -> Effect Unit } , sidePanel :: T.Box (Maybe (Record GEST.SidePanel))
, sidePanelState :: T.Box GT.SidePanelState }
-> R.Hooks (Record Controls) -> R.Hooks (Record Controls)
useGraphControls { forceAtlasS useGraphControls { forceAtlasS
, graph , graph
, graphId , graphId
, hyperdataGraph , hyperdataGraph
, reloadForest
, session , session
, reloadForest } = do , sidePanel
, sidePanelState } = do
edgeConfluence <- T.useBox $ Range.Closed { min: 0.0, max: 1.0 } edgeConfluence <- T.useBox $ Range.Closed { min: 0.0, max: 1.0 }
edgeWeight <- T.useBox $ Range.Closed { edgeWeight <- T.useBox $ Range.Closed {
min: 0.0 min: 0.0
...@@ -237,18 +243,20 @@ useGraphControls { forceAtlasS ...@@ -237,18 +243,20 @@ useGraphControls { forceAtlasS
} }
forceAtlasState <- T.useBox forceAtlasS forceAtlasState <- T.useBox forceAtlasS
graphStage <- T.useBox Graph.Init graphStage <- T.useBox Graph.Init
multiSelectEnabled <- T.useBox false -- multiSelectEnabled <- T.useBox false
nodeSize <- T.useBox $ Range.Closed { min: 0.0, max: 100.0 } nodeSize <- T.useBox $ Range.Closed { min: 0.0, max: 100.0 }
removedNodeIds <- T.useBox SigmaxT.emptyNodeIds -- removedNodeIds <- T.useBox SigmaxT.emptyNodeIds
selectedNodeIds <- T.useBox SigmaxT.emptyNodeIds -- selectedNodeIds <- T.useBox SigmaxT.emptyNodeIds
showControls <- T.useBox false -- showControls <- T.useBox false
showEdges <- T.useBox SigmaxT.EShow showEdges <- T.useBox SigmaxT.EShow
showLouvain <- T.useBox false showLouvain <- T.useBox false
showSidePanel <- T.useBox GET.InitialClosed -- sidePanelState <- T.useBox GT.InitialClosed
showTree <- T.useBox false showTree <- T.useBox false
sigma <- Sigmax.initSigma sigma <- Sigmax.initSigma
sigmaRef <- R.useRef sigma sigmaRef <- R.useRef sigma
{ multiSelectEnabled, removedNodeIds, selectedNodeIds, showControls } <- GEST.focusedSidePanel sidePanel
pure { edgeConfluence pure { edgeConfluence
, edgeWeight , edgeWeight
, forceAtlasState , forceAtlasState
...@@ -264,7 +272,7 @@ useGraphControls { forceAtlasS ...@@ -264,7 +272,7 @@ useGraphControls { forceAtlasS
, showControls , showControls
, showEdges , showEdges
, showLouvain , showLouvain
, showSidePanel , sidePanelState
, showTree , showTree
, sigmaRef , sigmaRef
, reloadForest , reloadForest
......
...@@ -23,13 +23,12 @@ import Toestand as T ...@@ -23,13 +23,12 @@ import Toestand as T
import Gargantext.Prelude import Gargantext.Prelude
import Gargantext.Components.Lang (Lang(..)) import Gargantext.Components.Lang (Lang(..))
import Gargantext.Components.Search (SearchType(..), SearchQuery(..)) import Gargantext.Components.GraphExplorer.Types as GET
import Gargantext.Components.GraphExplorer.Types as GET
import Gargantext.Components.GraphExplorer.Types (SidePanelState(..), SideTab(..))
import Gargantext.Components.GraphExplorer.Legend as Legend import Gargantext.Components.GraphExplorer.Legend as Legend
import Gargantext.Components.NgramsTable.Core as NTC import Gargantext.Components.NgramsTable.Core as NTC
import Gargantext.Components.Nodes.Corpus.Graph.Tabs (tabs) as CGT import Gargantext.Components.Nodes.Corpus.Graph.Tabs (tabs) as CGT
import Gargantext.Components.RandomText (words) import Gargantext.Components.RandomText (words)
import Gargantext.Components.Search (SearchType(..), SearchQuery(..))
import Gargantext.Data.Array (mapMaybe) import Gargantext.Data.Array (mapMaybe)
import Gargantext.Ends (Frontends) import Gargantext.Ends (Frontends)
import Gargantext.Hooks.Sigmax.Types as SigmaxT import Gargantext.Hooks.Sigmax.Types as SigmaxT
...@@ -54,38 +53,34 @@ type Props = ( ...@@ -54,38 +53,34 @@ type Props = (
frontends :: Frontends frontends :: Frontends
, graph :: SigmaxT.SGraph , graph :: SigmaxT.SGraph
, graphVersion :: T2.ReloadS , graphVersion :: T2.ReloadS
, showSidePanel :: T.Box GET.SidePanelState , sideTab :: T.Box GET.SideTab
| Common | Common
) )
sidebar :: Record Props -> R.Element sidebar :: R2.Component Props
sidebar props = R.createElement sidebarCpt props [] sidebar = R.createElement sidebarCpt
sidebarCpt :: R.Component Props sidebarCpt :: R.Component Props
sidebarCpt = here.component "sidebar" cpt sidebarCpt = here.component "sidebar" cpt
where where
cpt props@{ metaData, showSidePanel } _ = do cpt props@{ metaData, sideTab } _ = do
showSidePanel' <- T.useLive T.unequal showSidePanel sideTab' <- T.useLive T.unequal sideTab
case showSidePanel' of let sideTabLegend' = case sideTab' of
GET.Closed -> pure $ RH.div {} [] GET.SideTabLegend -> sideTabLegend sideTabProps []
GET.InitialClosed -> pure $ RH.div {} [] GET.SideTabData -> sideTabData sideTabProps []
GET.Opened sideTabT -> do GET.SideTabCommunity -> sideTabCommunity sideTabProps []
let sideTab' = case sideTabT of pure $ RH.div { id: "sp-container" }
SideTabLegend -> sideTabLegend sideTabProps [] [ sideTabNav { sideTab
SideTabData -> sideTabData sideTabProps [] , sideTabs: [GET.SideTabLegend, GET.SideTabData, GET.SideTabCommunity] } []
SideTabCommunity -> sideTabCommunity sideTabProps [] , sideTabLegend'
pure $ RH.div { id: "sp-container" } ]
[ sideTabNav { sidePanel: showSidePanel
, sideTabs: [SideTabLegend, SideTabData, SideTabCommunity] } []
, sideTab'
]
where where
sideTabProps = RX.pick props :: Record SideTabProps sideTabProps = RX.pick props :: Record SideTabProps
type SideTabNavProps = ( type SideTabNavProps = (
sidePanel :: T.Box GET.SidePanelState sideTab :: T.Box GET.SideTab
, sideTabs :: Array SideTab , sideTabs :: Array GET.SideTab
) )
sideTabNav :: R2.Component SideTabNavProps sideTabNav :: R2.Component SideTabNavProps
...@@ -94,23 +89,21 @@ sideTabNav = R.createElement sideTabNavCpt ...@@ -94,23 +89,21 @@ sideTabNav = R.createElement sideTabNavCpt
sideTabNavCpt :: R.Component SideTabNavProps sideTabNavCpt :: R.Component SideTabNavProps
sideTabNavCpt = here.component "sideTabNav" cpt sideTabNavCpt = here.component "sideTabNav" cpt
where where
cpt { sidePanel cpt { sideTab, sideTabs } _ = do
, sideTabs } _ = do sideTab' <- T.useLive T.unequal sideTab
sidePanel' <- T.useLive T.unequal sidePanel
pure $ R.fragment [ H.div { className: "text-primary center"} [H.text ""] pure $ R.fragment [ H.div { className: "text-primary center"} [H.text ""]
, H.div { className: "nav nav-tabs"} (liItem sidePanel' <$> sideTabs) , H.div { className: "nav nav-tabs"} (liItem sideTab' <$> sideTabs)
-- , H.div {className: "center"} [ H.text "Doc sideTabs"] -- , H.div {className: "center"} [ H.text "Doc sideTabs"]
] ]
where where
liItem :: GET.SidePanelState -> SideTab -> R.Element liItem :: GET.SideTab -> GET.SideTab -> R.Element
liItem sidePanel' tab = liItem sideTab' tab =
H.div { className : "nav-item nav-link" H.div { className : "nav-item nav-link"
<> if (Opened tab) == sidePanel' <> if tab == sideTab'
then " active" then " active"
else "" else ""
, on: { click: \_ -> T.write (Opened tab) sidePanel , on: { click: \_ -> T.write_ tab sideTab }
}
} [ H.text $ show tab ] } [ H.text $ show tab ]
type SideTabProps = Props type SideTabProps = Props
......
module Gargantext.Components.GraphExplorer.Sidebar.Types where
import Data.Maybe (Maybe(..), maybe)
import Data.Set as Set
import Reactix as R
import Toestand as T
import Gargantext.Prelude
import Gargantext.Components.GraphExplorer.Types as GET
import Gargantext.Hooks.Sigmax.Types as SigmaxT
type SidePanel =
(
mGraph :: Maybe SigmaxT.SGraph
, mMetaData :: Maybe GET.MetaData
, multiSelectEnabled :: Boolean
, removedNodeIds :: SigmaxT.NodeIds
, selectedNodeIds :: SigmaxT.NodeIds
, showControls :: Boolean
, sideTab :: GET.SideTab
)
initialSidePanel :: Maybe (Record SidePanel)
initialSidePanel = Nothing
focusedSidePanel :: T.Box (Maybe (Record SidePanel))
-> R.Hooks { mGraph :: T.Box (Maybe SigmaxT.SGraph)
, mMetaData :: T.Box (Maybe GET.MetaData)
, multiSelectEnabled :: T.Box Boolean
, removedNodeIds :: T.Box SigmaxT.NodeIds
, selectedNodeIds :: T.Box SigmaxT.NodeIds
, showControls :: T.Box Boolean
, sideTab :: T.Box GET.SideTab }
focusedSidePanel sidePanel = do
mGraph <- T.useFocused
(maybe Nothing (_.mGraph))
(\val -> maybe Nothing (\sp -> Just $ sp { mGraph = val })) sidePanel
mMetaData <- T.useFocused
(maybe Nothing (_.mMetaData))
(\val -> maybe Nothing (\sp -> Just $ sp { mMetaData = val })) sidePanel
multiSelectEnabled <- T.useFocused
(maybe false (_.multiSelectEnabled))
(\val -> maybe Nothing (\sp -> Just $ sp { multiSelectEnabled = val })) sidePanel
removedNodeIds <- T.useFocused
(maybe Set.empty (_.removedNodeIds))
(\val -> maybe Nothing (\sp -> Just $ sp { removedNodeIds = val })) sidePanel
selectedNodeIds <- T.useFocused
(maybe Set.empty (_.selectedNodeIds))
(\val -> maybe Nothing (\sp -> Just $ sp { selectedNodeIds = val })) sidePanel
showControls <- T.useFocused
(maybe false (_.showControls))
(\val -> maybe Nothing (\sp -> Just $ sp { showControls = val })) sidePanel
sideTab <- T.useFocused
(maybe GET.SideTabLegend (_.sideTab))
(\val -> maybe Nothing (\sp -> Just $ sp { sideTab = val })) sidePanel
pure $ {
mGraph
, mMetaData
, multiSelectEnabled
, removedNodeIds
, selectedNodeIds
, showControls
, sideTab
}
...@@ -18,8 +18,8 @@ import Reactix as R ...@@ -18,8 +18,8 @@ import Reactix as R
import Reactix.DOM.HTML as H import Reactix.DOM.HTML as H
import Toestand as T import Toestand as T
import Gargantext.Components.GraphExplorer.Types as GET
import Gargantext.Hooks.Sigmax.Types as SigmaxTypes import Gargantext.Hooks.Sigmax.Types as SigmaxTypes
import Gargantext.Types as GT
import Gargantext.Utils.Reactix as R2 import Gargantext.Utils.Reactix as R2
here :: R2.Here here :: R2.Here
...@@ -185,7 +185,7 @@ treeToggleButtonCpt = here.component "treeToggleButton" cpt ...@@ -185,7 +185,7 @@ treeToggleButtonCpt = here.component "treeToggleButton" cpt
} [] } []
type SidebarToggleButtonProps = ( type SidebarToggleButtonProps = (
state :: T.Box GET.SidePanelState state :: T.Box GT.SidePanelState
) )
sidebarToggleButton :: R2.Component SidebarToggleButtonProps sidebarToggleButton :: R2.Component SidebarToggleButtonProps
...@@ -201,17 +201,18 @@ sidebarToggleButtonCpt = here.component "sidebarToggleButton" cpt ...@@ -201,17 +201,18 @@ sidebarToggleButtonCpt = here.component "sidebarToggleButton" cpt
, on: { click: onClick state } , on: { click: onClick state }
} [ R2.small {} [ H.text (text onMessage offMessage state') ] ] } [ R2.small {} [ H.text (text onMessage offMessage state') ] ]
cls (GET.Opened _) = "active" cls GT.Opened = "active"
cls _ = "" cls _ = ""
onMessage = "Hide Sidebar" onMessage = "Hide Sidebar"
offMessage = "Show Sidebar" offMessage = "Show Sidebar"
text on _off (GET.Opened _) = on text on _off GT.Opened = on
text _on off GET.InitialClosed = off text _on off GT.InitialClosed = off
text _on off GET.Closed = off text _on off GT.Closed = off
onClick state = \_ -> onClick state = \_ ->
T.modify_ (\s -> case s of T.modify_ GT.toggleSidePanelState state
GET.InitialClosed -> GET.Opened GET.SideTabLegend -- case s of
GET.Closed -> GET.Opened GET.SideTabLegend -- GET.InitialClosed -> GET.Opened GET.SideTabLegend
(GET.Opened _) -> GET.Closed) state -- GET.Closed -> GET.Opened GET.SideTabLegend
-- (GET.Opened _) -> GET.Closed) state
...@@ -114,9 +114,9 @@ type State = ( ...@@ -114,9 +114,9 @@ type State = (
--, legendData :: R.State (Array Legend) --, legendData :: R.State (Array Legend)
--, multiNodeSelection :: R.State Boolean --, multiNodeSelection :: R.State Boolean
--, selectedNodes :: R.State (Set SelectedNode) --, selectedNodes :: R.State (Set SelectedNode)
--, showSidePanel :: R.State Boolean
--, showControls :: T.Box Boolean --, showControls :: T.Box Boolean
--, showTree :: R.State Boolean --, showTree :: R.State Boolean
--, sidePanelState :: R.State Boolean
--, sigmaGraphData :: R.State (Maybe SigmaxTypes.SGraph) --, sigmaGraphData :: R.State (Maybe SigmaxTypes.SGraph)
--, sigmaSettings :: R.State ({|Graph.SigmaSettings}) --, sigmaSettings :: R.State ({|Graph.SigmaSettings})
--treeId :: R.State (Maybe TreeId) --treeId :: R.State (Maybe TreeId)
...@@ -281,10 +281,6 @@ defaultPalette = ["#5fa571","#ab9ba2","#da876d","#bdd3ff","#b399df","#ffdfed","# ...@@ -281,10 +281,6 @@ defaultPalette = ["#5fa571","#ab9ba2","#da876d","#bdd3ff","#b399df","#ffdfed","#
intColor :: Int -> String intColor :: Int -> String
intColor i = unsafePartial $ fromJust $ defaultPalette !! (i `mod` length defaultPalette) intColor i = unsafePartial $ fromJust $ defaultPalette !! (i `mod` length defaultPalette)
data SidePanelState = InitialClosed | Opened SideTab | Closed
derive instance eqSidePanelState :: Eq SidePanelState
data SideTab = SideTabLegend | SideTabData | SideTabCommunity data SideTab = SideTabLegend | SideTabData | SideTabCommunity
derive instance eqSideTab :: Eq SideTab derive instance eqSideTab :: Eq SideTab
......
...@@ -261,7 +261,6 @@ type CommonProps = ( ...@@ -261,7 +261,6 @@ type CommonProps = (
afterSync :: Unit -> Aff Unit afterSync :: Unit -> Aff Unit
, reloadForest :: T.Box T2.Reload , reloadForest :: T.Box T2.Reload
, reloadRoot :: T.Box T2.Reload , reloadRoot :: T.Box T2.Reload
, sidePanelTriggers :: Record NT.SidePanelTriggers
, tabNgramType :: CTabNgramType , tabNgramType :: CTabNgramType
, tasks :: T.Box GAT.Storage , tasks :: T.Box GAT.Storage
, withAutoUpdate :: Boolean , withAutoUpdate :: Boolean
...@@ -287,7 +286,6 @@ loadedNgramsTableCpt = here.component "loadedNgramsTable" cpt where ...@@ -287,7 +286,6 @@ loadedNgramsTableCpt = here.component "loadedNgramsTable" cpt where
, path , path
, reloadForest , reloadForest
, reloadRoot , reloadRoot
, sidePanelTriggers
, state , state
, tabNgramType , tabNgramType
, tasks , tasks
...@@ -300,9 +298,6 @@ loadedNgramsTableCpt = here.component "loadedNgramsTable" cpt where ...@@ -300,9 +298,6 @@ loadedNgramsTableCpt = here.component "loadedNgramsTable" cpt where
searchQuery <- T.useFocused (_.searchQuery) (\a b -> b { searchQuery = a }) path searchQuery <- T.useFocused (_.searchQuery) (\a b -> b { searchQuery = a }) path
searchQuery' <- T.useLive T.unequal searchQuery searchQuery' <- T.useLive T.unequal searchQuery
-- R.useEffectOnce' $ do
-- T.listen (\_ -> TT.changePage 1 params) searchQuery
let ngramsTable = applyNgramsPatches state' initTable let ngramsTable = applyNgramsPatches state' initTable
roots = rootsOf ngramsTable roots = rootsOf ngramsTable
...@@ -351,8 +346,7 @@ loadedNgramsTableCpt = here.component "loadedNgramsTable" cpt where ...@@ -351,8 +346,7 @@ loadedNgramsTableCpt = here.component "loadedNgramsTable" cpt where
, ngramsLocalPatch , ngramsLocalPatch
, ngramsParent , ngramsParent
, ngramsSelection , ngramsSelection
, ngramsTable , ngramsTable } []
, sidePanelTriggers } []
, delete: false , delete: false
} }
...@@ -550,7 +544,6 @@ mainNgramsTableCpt = here.component "mainNgramsTable" cpt ...@@ -550,7 +544,6 @@ mainNgramsTableCpt = here.component "mainNgramsTable" cpt
, path , path
, reloadForest , reloadForest
, reloadRoot , reloadRoot
, sidePanelTriggers
, tabNgramType , tabNgramType
, tasks , tasks
, withAutoUpdate } _ = do , withAutoUpdate } _ = do
...@@ -566,7 +559,6 @@ mainNgramsTableCpt = here.component "mainNgramsTable" cpt ...@@ -566,7 +559,6 @@ mainNgramsTableCpt = here.component "mainNgramsTable" cpt
, path , path
, reloadForest , reloadForest
, reloadRoot , reloadRoot
, sidePanelTriggers
, tabNgramType , tabNgramType
, tasks , tasks
, versioned , versioned
...@@ -585,7 +577,6 @@ mainNgramsTableCpt = here.component "mainNgramsTable" cpt ...@@ -585,7 +577,6 @@ mainNgramsTableCpt = here.component "mainNgramsTable" cpt
, path , path
, reloadForest , reloadForest
, reloadRoot , reloadRoot
, sidePanelTriggers
, tabNgramType , tabNgramType
, tasks , tasks
, versionedWithCount , versionedWithCount
...@@ -655,7 +646,6 @@ mainNgramsTablePaintCpt = here.component "mainNgramsTablePaint" cpt ...@@ -655,7 +646,6 @@ mainNgramsTablePaintCpt = here.component "mainNgramsTablePaint" cpt
, path , path
, reloadForest , reloadForest
, reloadRoot , reloadRoot
, sidePanelTriggers
, tabNgramType , tabNgramType
, tasks , tasks
, versioned , versioned
...@@ -668,7 +658,6 @@ mainNgramsTablePaintCpt = here.component "mainNgramsTablePaint" cpt ...@@ -668,7 +658,6 @@ mainNgramsTablePaintCpt = here.component "mainNgramsTablePaint" cpt
, path , path
, reloadForest , reloadForest
, reloadRoot , reloadRoot
, sidePanelTriggers
, state , state
, tabNgramType , tabNgramType
, tasks , tasks
...@@ -694,7 +683,6 @@ mainNgramsTablePaintNoCacheCpt = here.component "mainNgramsTablePaintNoCache" cp ...@@ -694,7 +683,6 @@ mainNgramsTablePaintNoCacheCpt = here.component "mainNgramsTablePaintNoCache" cp
, path , path
, reloadForest , reloadForest
, reloadRoot , reloadRoot
, sidePanelTriggers
, tabNgramType , tabNgramType
, tasks , tasks
, versionedWithCount , versionedWithCount
...@@ -710,7 +698,6 @@ mainNgramsTablePaintNoCacheCpt = here.component "mainNgramsTablePaintNoCache" cp ...@@ -710,7 +698,6 @@ mainNgramsTablePaintNoCacheCpt = here.component "mainNgramsTablePaintNoCache" cp
, path: path , path: path
, reloadForest , reloadForest
, reloadRoot , reloadRoot
, sidePanelTriggers
, state , state
, tabNgramType , tabNgramType
, tasks , tasks
......
...@@ -211,7 +211,6 @@ type RenderNgramsItem = ( ...@@ -211,7 +211,6 @@ type RenderNgramsItem = (
, ngramsParent :: Maybe NgramsTerm , ngramsParent :: Maybe NgramsTerm
, ngramsSelection :: Set NgramsTerm , ngramsSelection :: Set NgramsTerm
, ngramsTable :: NgramsTable , ngramsTable :: NgramsTable
, sidePanelTriggers :: Record NT.SidePanelTriggers
) )
renderNgramsItem :: R2.Component RenderNgramsItem renderNgramsItem :: R2.Component RenderNgramsItem
...@@ -227,7 +226,6 @@ renderNgramsItemCpt = here.component "renderNgramsItem" cpt ...@@ -227,7 +226,6 @@ renderNgramsItemCpt = here.component "renderNgramsItem" cpt
, ngramsParent , ngramsParent
, ngramsSelection , ngramsSelection
, ngramsTable , ngramsTable
, sidePanelTriggers: { toggleSidePanel }
} _ = do } _ = do
pure $ Tbl.makeRow [ pure $ Tbl.makeRow [
H.div { className: "ngrams-selector" } [ H.div { className: "ngrams-selector" } [
...@@ -254,8 +252,9 @@ renderNgramsItemCpt = here.component "renderNgramsItem" cpt ...@@ -254,8 +252,9 @@ renderNgramsItemCpt = here.component "renderNgramsItem" cpt
a (ngramsStyle <> [DOM.onClick $ const effect]) a (ngramsStyle <> [DOM.onClick $ const effect])
Nothing -> Nothing ->
span ngramsStyle span ngramsStyle
onClick _ = do onClick _ = pure unit :: Effect Unit
R2.callTrigger toggleSidePanel unit -- onClick _ = do
-- R2.callTrigger toggleSidePanel unit
termList = ngramsElement ^. _NgramsElement <<< _list termList = ngramsElement ^. _NgramsElement <<< _list
ngramsStyle = [termStyle termList ngramsOpacity] ngramsStyle = [termStyle termList ngramsOpacity]
ngramsEdit = Just <<< dispatch <<< SetParentResetChildren <<< Just <<< view _ngrams ngramsEdit = Just <<< dispatch <<< SetParentResetChildren <<< Just <<< view _ngrams
......
...@@ -17,13 +17,14 @@ import Gargantext.AsyncTasks as GAT ...@@ -17,13 +17,14 @@ import Gargantext.AsyncTasks as GAT
import Gargantext.Components.DocsTable as DT import Gargantext.Components.DocsTable as DT
import Gargantext.Components.NgramsTable as NT import Gargantext.Components.NgramsTable as NT
import Gargantext.Components.NgramsTable.Core as NTC import Gargantext.Components.NgramsTable.Core as NTC
import Gargantext.Components.Nodes.Texts.Types as TextsT
import Gargantext.Components.Tab as Tab import Gargantext.Components.Tab as Tab
import Gargantext.Components.Nodes.Annuaire.User.Contacts.Types (ContactData) import Gargantext.Components.Nodes.Annuaire.User.Contacts.Types (ContactData)
import Gargantext.Components.Nodes.Lists.Types as LTypes import Gargantext.Components.Nodes.Lists.Types as LTypes
import Gargantext.Components.Nodes.Texts.Types as TTypes import Gargantext.Components.Nodes.Texts.Types as TTypes
import Gargantext.Ends (Frontends) import Gargantext.Ends (Frontends)
import Gargantext.Sessions (Session) import Gargantext.Sessions (Session)
import Gargantext.Types (CTabNgramType(..), PTabNgramType(..), TabType(..), TabSubType(..)) import Gargantext.Types (CTabNgramType(..), PTabNgramType(..), SidePanelState, TabType(..), TabSubType(..))
import Gargantext.Utils.Reactix as R2 import Gargantext.Utils.Reactix as R2
import Gargantext.Utils.Toestand as T2 import Gargantext.Utils.Toestand as T2
...@@ -51,15 +52,16 @@ modeTabType' Books = CTabAuthors ...@@ -51,15 +52,16 @@ modeTabType' Books = CTabAuthors
modeTabType' Communication = CTabAuthors modeTabType' Communication = CTabAuthors
type TabsProps = type TabsProps =
( cacheState :: T.Box LTypes.CacheState ( cacheState :: T.Box LTypes.CacheState
, contactData :: ContactData , contactData :: ContactData
, frontends :: Frontends , frontends :: Frontends
, nodeId :: Int , nodeId :: Int
, reloadForest :: T.Box T2.Reload , reloadForest :: T.Box T2.Reload
, reloadRoot :: T.Box T2.Reload , reloadRoot :: T.Box T2.Reload
, session :: Session , session :: Session
, sidePanelTriggers :: Record LTypes.SidePanelTriggers , sidePanel :: T.Box (Maybe (Record TextsT.SidePanel))
, tasks :: T.Box GAT.Storage , sidePanelState :: T.Box SidePanelState
, tasks :: T.Box GAT.Storage
) )
tabs :: R2.Leaf TabsProps tabs :: R2.Leaf TabsProps
...@@ -69,19 +71,18 @@ tabsCpt :: R.Component TabsProps ...@@ -69,19 +71,18 @@ tabsCpt :: R.Component TabsProps
tabsCpt = here.component "tabs" cpt where tabsCpt = here.component "tabs" cpt where
cpt props _ = do cpt props _ = do
active <- R.useState' 0 active <- R.useState' 0
triggers <- TTypes.emptySidePanelTriggers pure $ Tab.tabs { selected: fst active, tabs: tabs' props }
pure $ Tab.tabs { selected: fst active, tabs: tabs' props triggers } tabs' props@{ sidePanel, sidePanelState } =
tabs' props trg = [ "Documents" /\ docs
[ "Documents" /\ docs trg
, "Patents" /\ ngramsView (viewProps Patents) , "Patents" /\ ngramsView (viewProps Patents)
, "Books" /\ ngramsView (viewProps Books) , "Books" /\ ngramsView (viewProps Books)
, "Communication" /\ ngramsView (viewProps Communication) , "Communication" /\ ngramsView (viewProps Communication)
, "Trash" /\ docs trg -- TODO pass-in trash mode , "Trash" /\ docs -- TODO pass-in trash mode
] where ] where
viewProps mode = Record.merge props { defaultListId: props.contactData.defaultListId viewProps mode = Record.merge props { defaultListId: props.contactData.defaultListId
, mode } , mode }
totalRecords = 4736 -- TODO lol totalRecords = 4736 -- TODO lol
docs sidePanelTriggers = DT.docViewLayout (Record.merge { sidePanelTriggers } $ Record.merge dtCommon dtExtra) docs = DT.docViewLayout (Record.merge { sidePanel, sidePanelState } $ Record.merge dtCommon dtExtra)
dtCommon = RX.pick props :: Record DTCommon dtCommon = RX.pick props :: Record DTCommon
dtExtra = dtExtra =
{ chart: mempty { chart: mempty
...@@ -98,7 +99,7 @@ type DTCommon = ...@@ -98,7 +99,7 @@ type DTCommon =
, frontends :: Frontends , frontends :: Frontends
, nodeId :: Int , nodeId :: Int
, session :: Session , session :: Session
-- , sidePanelTriggers :: Record LTypes.SidePanelTriggers -- , sidePanel :: T.Box (Record SidePanel)
) )
type NgramsViewTabsProps = type NgramsViewTabsProps =
...@@ -119,22 +120,21 @@ ngramsViewCpt = here.component "ngramsView" cpt where ...@@ -119,22 +120,21 @@ ngramsViewCpt = here.component "ngramsView" cpt where
pure $ NT.mainNgramsTable (props' path) [] where pure $ NT.mainNgramsTable (props' path) [] where
most = RX.pick props :: Record NTCommon most = RX.pick props :: Record NTCommon
props' path = props' path =
Record.merge most (Record.merge most
{ afterSync { afterSync
, path , path
, tabType: TabPairing (TabNgramType $ modeTabType mode) , tabType: TabPairing (TabNgramType $ modeTabType mode)
, tabNgramType: modeTabType' mode , tabNgramType: modeTabType' mode
, withAutoUpdate: false } , withAutoUpdate: false }) :: Record NT.MainNgramsTableProps
where where
afterSync :: Unit -> Aff Unit afterSync :: Unit -> Aff Unit
afterSync _ = pure unit afterSync _ = pure unit
type NTCommon = type NTCommon =
( cacheState :: T.Box LTypes.CacheState ( cacheState :: T.Box LTypes.CacheState
, defaultListId :: Int , defaultListId :: Int
, reloadForest :: T.Box T2.Reload , reloadForest :: T.Box T2.Reload
, reloadRoot :: T.Box T2.Reload , reloadRoot :: T.Box T2.Reload
, session :: Session , session :: Session
, sidePanelTriggers :: Record LTypes.SidePanelTriggers , tasks :: T.Box GAT.Storage
, tasks :: T.Box GAT.Storage
) )
...@@ -23,11 +23,12 @@ import Gargantext.Components.InputWithEnter (inputWithEnter) ...@@ -23,11 +23,12 @@ import Gargantext.Components.InputWithEnter (inputWithEnter)
import Gargantext.Components.Nodes.Annuaire.User.Contacts.Types (Contact(..), ContactData, ContactTouch(..), ContactWhere(..), ContactWho(..), HyperdataContact(..), HyperdataUser(..), _city, _country, _firstName, _labTeamDeptsJoinComma, _lastName, _mail, _office, _organizationJoinComma, _ouFirst, _phone, _role, _shared, _touch, _who, defaultContactTouch, defaultContactWhere, defaultContactWho, defaultHyperdataContact, defaultHyperdataUser) import Gargantext.Components.Nodes.Annuaire.User.Contacts.Types (Contact(..), ContactData, ContactTouch(..), ContactWhere(..), ContactWho(..), HyperdataContact(..), HyperdataUser(..), _city, _country, _firstName, _labTeamDeptsJoinComma, _lastName, _mail, _office, _organizationJoinComma, _ouFirst, _phone, _role, _shared, _touch, _who, defaultContactTouch, defaultContactWhere, defaultContactWho, defaultHyperdataContact, defaultHyperdataUser)
import Gargantext.Components.Nodes.Annuaire.Tabs as Tabs import Gargantext.Components.Nodes.Annuaire.Tabs as Tabs
import Gargantext.Components.Nodes.Lists.Types as LT import Gargantext.Components.Nodes.Lists.Types as LT
import Gargantext.Components.Nodes.Texts.Types as TT
import Gargantext.Ends (Frontends) import Gargantext.Ends (Frontends)
import Gargantext.Hooks.Loader (useLoader) import Gargantext.Hooks.Loader (useLoader)
import Gargantext.Routes as Routes import Gargantext.Routes as Routes
import Gargantext.Sessions (WithSession, WithSessionContext, Session, get, put, sessionId) import Gargantext.Sessions (WithSession, WithSessionContext, Session, get, put, sessionId)
import Gargantext.Types (NodeType(..)) import Gargantext.Types (NodeType(..), SidePanelState)
import Gargantext.Utils.Reactix as R2 import Gargantext.Utils.Reactix as R2
import Gargantext.Utils.Toestand as T2 import Gargantext.Utils.Toestand as T2
...@@ -151,11 +152,13 @@ listElement :: Array R.Element -> R.Element ...@@ -151,11 +152,13 @@ listElement :: Array R.Element -> R.Element
listElement = H.li { className: "list-group-item justify-content-between" } listElement = H.li { className: "list-group-item justify-content-between" }
type LayoutNoSessionProps = type LayoutNoSessionProps =
( frontends :: Frontends ( frontends :: Frontends
, nodeId :: Int , nodeId :: Int
, reloadForest :: T.Box T2.Reload , reloadForest :: T.Box T2.Reload
, reloadRoot :: T.Box T2.Reload , reloadRoot :: T.Box T2.Reload
, tasks :: T.Box GAT.Storage , sidePanel :: T.Box (Maybe (Record TT.SidePanel))
, sidePanelState :: T.Box SidePanelState
, tasks :: T.Box GAT.Storage
) )
type LayoutProps = WithSession LayoutNoSessionProps type LayoutProps = WithSession LayoutNoSessionProps
...@@ -184,7 +187,14 @@ userLayout = R.createElement userLayoutCpt ...@@ -184,7 +187,14 @@ userLayout = R.createElement userLayoutCpt
userLayoutCpt :: R.Component LayoutProps userLayoutCpt :: R.Component LayoutProps
userLayoutCpt = here.component "userLayout" cpt userLayoutCpt = here.component "userLayout" cpt
where where
cpt { frontends, nodeId, reloadForest, reloadRoot, session, tasks } _ = do cpt { frontends
, nodeId
, reloadForest
, reloadRoot
, session
, sidePanel
, sidePanelState
, tasks } _ = do
let sid = sessionId session let sid = sessionId session
pure $ userLayoutWithKey { pure $ userLayoutWithKey {
...@@ -194,6 +204,8 @@ userLayoutCpt = here.component "userLayout" cpt ...@@ -194,6 +204,8 @@ userLayoutCpt = here.component "userLayout" cpt
, reloadForest , reloadForest
, reloadRoot , reloadRoot
, session , session
, sidePanel
, sidePanelState
, tasks , tasks
} }
...@@ -203,14 +215,19 @@ userLayoutWithKey props = R.createElement userLayoutWithKeyCpt props [] ...@@ -203,14 +215,19 @@ userLayoutWithKey props = R.createElement userLayoutWithKeyCpt props []
userLayoutWithKeyCpt :: R.Component KeyLayoutProps userLayoutWithKeyCpt :: R.Component KeyLayoutProps
userLayoutWithKeyCpt = here.component "userLayoutWithKey" cpt userLayoutWithKeyCpt = here.component "userLayoutWithKey" cpt
where where
cpt { frontends, nodeId, reloadForest, reloadRoot, session, tasks } _ = do cpt { frontends
, nodeId
, reloadForest
, reloadRoot
, session
, sidePanel
, sidePanelState
, tasks } _ = do
reload <- T.useBox T2.newReload reload <- T.useBox T2.newReload
reload' <- T.useLive T.unequal reload reload' <- T.useLive T.unequal reload
cacheState <- T.useBox LT.CacheOn cacheState <- T.useBox LT.CacheOn
sidePanelTriggers <- LT.emptySidePanelTriggers
useLoader {nodeId, reload: reload', session} getUserWithReload $ useLoader {nodeId, reload: reload', session} getUserWithReload $
\contactData@{contactNode: Contact {name, hyperdata}} -> \contactData@{contactNode: Contact {name, hyperdata}} ->
H.ul { className: "col-md-12 list-group" } [ H.ul { className: "col-md-12 list-group" } [
...@@ -224,7 +241,8 @@ userLayoutWithKeyCpt = here.component "userLayoutWithKey" cpt ...@@ -224,7 +241,8 @@ userLayoutWithKeyCpt = here.component "userLayoutWithKey" cpt
, reloadForest , reloadForest
, reloadRoot , reloadRoot
, session , session
, sidePanelTriggers , sidePanel
, sidePanelState
, tasks , tasks
} }
] ]
......
...@@ -26,11 +26,12 @@ import Gargantext.Components.Nodes.Annuaire.User.Contacts.Types ...@@ -26,11 +26,12 @@ import Gargantext.Components.Nodes.Annuaire.User.Contacts.Types
, _shared, _touch, _who, defaultContactTouch, defaultContactWhere , _shared, _touch, _who, defaultContactTouch, defaultContactWhere
, defaultContactWho, defaultHyperdataContact, defaultHyperdataUser ) , defaultContactWho, defaultHyperdataContact, defaultHyperdataUser )
import Gargantext.Components.Nodes.Lists.Types as LT import Gargantext.Components.Nodes.Lists.Types as LT
import Gargantext.Components.Nodes.Texts.Types as TT
import Gargantext.Ends (Frontends) import Gargantext.Ends (Frontends)
import Gargantext.Hooks.Loader (useLoader) import Gargantext.Hooks.Loader (useLoader)
import Gargantext.Routes as Routes import Gargantext.Routes as Routes
import Gargantext.Sessions (Session, get, put, sessionId) import Gargantext.Sessions (Session, get, put, sessionId)
import Gargantext.Types (NodeType(..)) import Gargantext.Types (NodeType(..), SidePanelState)
import Gargantext.Utils.Reactix as R2 import Gargantext.Utils.Reactix as R2
import Gargantext.Utils.Toestand as T2 import Gargantext.Utils.Toestand as T2
...@@ -139,9 +140,11 @@ listElement :: Array R.Element -> R.Element ...@@ -139,9 +140,11 @@ listElement :: Array R.Element -> R.Element
listElement = H.li { className: "list-group-item justify-content-between" } listElement = H.li { className: "list-group-item justify-content-between" }
type BasicProps = type BasicProps =
( frontends :: Frontends ( frontends :: Frontends
, nodeId :: Int , nodeId :: Int
, tasks :: T.Box GAT.Storage , sidePanelState :: T.Box SidePanelState
, sidePanel :: T.Box (Maybe (Record TT.SidePanel))
, tasks :: T.Box GAT.Storage
) )
type ReloadProps = type ReloadProps =
...@@ -166,13 +169,30 @@ contactLayout = R.createElement contactLayoutCpt ...@@ -166,13 +169,30 @@ contactLayout = R.createElement contactLayoutCpt
contactLayoutCpt :: R.Component AnnuaireLayoutProps contactLayoutCpt :: R.Component AnnuaireLayoutProps
contactLayoutCpt = here.component "contactLayout" cpt where contactLayoutCpt = here.component "contactLayout" cpt where
cpt { annuaireId, frontends, nodeId, reloadForest, reloadRoot, session, tasks } _ = do cpt { annuaireId
, frontends
, nodeId
, reloadForest
, reloadRoot
, session
, sidePanel
, sidePanelState
, tasks } _ = do
s <- R.useContext session s <- R.useContext session
let key = show (sessionId s) <> "-" <> show nodeId let key = show (sessionId s) <> "-" <> show nodeId
pure $ pure $
contactLayoutWithKey contactLayoutWithKey
{ annuaireId, tasks, frontends, key, nodeId { annuaireId
, session: s, reloadForest, reloadRoot } , frontends
, key
, nodeId
, reloadForest
, reloadRoot
, session: s
, sidePanel
, sidePanelState
, tasks
}
contactLayoutWithKey :: R2.Leaf AnnuaireKeyLayoutProps contactLayoutWithKey :: R2.Leaf AnnuaireKeyLayoutProps
contactLayoutWithKey props = R.createElement contactLayoutWithKeyCpt props [] contactLayoutWithKey props = R.createElement contactLayoutWithKeyCpt props []
...@@ -185,11 +205,12 @@ contactLayoutWithKeyCpt = here.component "contactLayoutWithKey" cpt where ...@@ -185,11 +205,12 @@ contactLayoutWithKeyCpt = here.component "contactLayoutWithKey" cpt where
, reloadRoot , reloadRoot
, nodeId , nodeId
, session , session
, sidePanel
, sidePanelState
, tasks } _ = do , tasks } _ = do
reload <- T.useBox T2.newReload reload <- T.useBox T2.newReload
_ <- T.useLive T.unequal reload _ <- T.useLive T.unequal reload
cacheState <- T.useBox LT.CacheOn cacheState <- T.useBox LT.CacheOn
sidePanelTriggers <- LT.emptySidePanelTriggers
useLoader nodeId (getAnnuaireContact session annuaireId) $ useLoader nodeId (getAnnuaireContact session annuaireId) $
\contactData@{contactNode: Contact' {name, hyperdata}} -> \contactData@{contactNode: Contact' {name, hyperdata}} ->
H.ul { className: "col-md-12 list-group" } H.ul { className: "col-md-12 list-group" }
...@@ -201,7 +222,8 @@ contactLayoutWithKeyCpt = here.component "contactLayoutWithKey" cpt where ...@@ -201,7 +222,8 @@ contactLayoutWithKeyCpt = here.component "contactLayoutWithKey" cpt where
, frontends , frontends
, nodeId , nodeId
, session , session
, sidePanelTriggers , sidePanel
, sidePanelState
, reloadForest , reloadForest
, reloadRoot , reloadRoot
, tasks } ] , tasks } ]
......
...@@ -20,7 +20,7 @@ import Gargantext.Components.Nodes.Lists.Types as LTypes ...@@ -20,7 +20,7 @@ import Gargantext.Components.Nodes.Lists.Types as LTypes
import Gargantext.Components.Nodes.Texts.Types as TTypes import Gargantext.Components.Nodes.Texts.Types as TTypes
import Gargantext.Ends (Frontends) import Gargantext.Ends (Frontends)
import Gargantext.Sessions (Session) import Gargantext.Sessions (Session)
import Gargantext.Types (CTabNgramType(..), PTabNgramType(..), TabType(..), TabSubType(..)) import Gargantext.Types (CTabNgramType(..), PTabNgramType(..), SidePanelState, TabType(..), TabSubType(..))
import Gargantext.Utils.Reactix as R2 import Gargantext.Utils.Reactix as R2
import Gargantext.Utils.Toestand as T2 import Gargantext.Utils.Toestand as T2
...@@ -49,15 +49,16 @@ modeTabType' Books = CTabAuthors ...@@ -49,15 +49,16 @@ modeTabType' Books = CTabAuthors
modeTabType' Communication = CTabAuthors modeTabType' Communication = CTabAuthors
type TabsProps = ( type TabsProps = (
cacheState :: T.Box LTypes.CacheState cacheState :: T.Box LTypes.CacheState
, contactData :: ContactData' , contactData :: ContactData'
, frontends :: Frontends , frontends :: Frontends
, nodeId :: Int , nodeId :: Int
, reloadForest :: T.Box T2.Reload , reloadForest :: T.Box T2.Reload
, reloadRoot :: T.Box T2.Reload , reloadRoot :: T.Box T2.Reload
, session :: Session , session :: Session
, sidePanelTriggers :: Record LTypes.SidePanelTriggers , sidePanel :: T.Box (Maybe (Record TTypes.SidePanel))
, tasks :: T.Box GAT.Storage , sidePanelState :: T.Box SidePanelState
, tasks :: T.Box GAT.Storage
) )
tabs :: Record TabsProps -> R.Element tabs :: Record TabsProps -> R.Element
...@@ -73,13 +74,13 @@ tabsCpt = here.component "tabs" cpt ...@@ -73,13 +74,13 @@ tabsCpt = here.component "tabs" cpt
, frontends , frontends
, nodeId , nodeId
, session , session
, sidePanelTriggers , sidePanel
, sidePanelState
, reloadForest } _ = do , reloadForest } _ = do
active <- R.useState' 0 active <- R.useState' 0
textsSidePanelTriggers <- TTypes.emptySidePanelTriggers pure $ Tab.tabs { selected: fst active, tabs: tabs' }
pure $ Tab.tabs { selected: fst active, tabs: tabs' textsSidePanelTriggers }
where where
tabs' trg = tabs' =
[ "Documents" /\ docs [ "Documents" /\ docs
, "Patents" /\ ngramsView patentsView [] , "Patents" /\ ngramsView patentsView []
, "Books" /\ ngramsView booksView [] , "Books" /\ ngramsView booksView []
...@@ -93,26 +94,23 @@ tabsCpt = here.component "tabs" cpt ...@@ -93,26 +94,23 @@ tabsCpt = here.component "tabs" cpt
, defaultListId , defaultListId
, mode: Patents , mode: Patents
, nodeId , nodeId
, session , reloadForest
, sidePanelTriggers , session }
, reloadForest }
booksView = { reloadRoot booksView = { reloadRoot
, tasks , tasks
, cacheState , cacheState
, defaultListId , defaultListId
, mode: Books , mode: Books
, nodeId , nodeId
, session , reloadForest
, sidePanelTriggers , session }
, reloadForest }
commView = { reloadRoot, tasks commView = { reloadRoot, tasks
, cacheState , cacheState
, defaultListId , defaultListId
, mode: Communication , mode: Communication
, nodeId , nodeId
, session , reloadForest
, sidePanelTriggers , session }
, reloadForest }
chart = mempty chart = mempty
totalRecords = 4736 -- TODO totalRecords = 4736 -- TODO
docs = DT.docViewLayout docs = DT.docViewLayout
...@@ -124,22 +122,22 @@ tabsCpt = here.component "tabs" cpt ...@@ -124,22 +122,22 @@ tabsCpt = here.component "tabs" cpt
, nodeId , nodeId
, session , session
, showSearch: true , showSearch: true
, sidePanelTriggers: trg , sidePanel
, sidePanelState
, tabType: TabPairing TabDocs , tabType: TabPairing TabDocs
, totalRecords , totalRecords
} }
type NgramsViewTabsProps = ( type NgramsViewTabsProps = (
cacheState :: T.Box LTypes.CacheState cacheState :: T.Box LTypes.CacheState
, defaultListId :: Int , defaultListId :: Int
, mode :: Mode , mode :: Mode
, nodeId :: Int , nodeId :: Int
, reloadForest :: T.Box T2.Reload , reloadForest :: T.Box T2.Reload
, reloadRoot :: T.Box T2.Reload , reloadRoot :: T.Box T2.Reload
, session :: Session , session :: Session
, sidePanelTriggers :: Record LTypes.SidePanelTriggers , tasks :: T.Box GAT.Storage
, tasks :: T.Box GAT.Storage
) )
ngramsView :: R2.Component NgramsViewTabsProps ngramsView :: R2.Component NgramsViewTabsProps
...@@ -155,7 +153,6 @@ ngramsViewCpt = here.component "ngramsView" cpt ...@@ -155,7 +153,6 @@ ngramsViewCpt = here.component "ngramsView" cpt
, mode , mode
, nodeId , nodeId
, session , session
, sidePanelTriggers
, tasks } _ = do , tasks } _ = do
path <- T.useBox $ NTC.initialPageParams session nodeId [defaultListId] (TabDocument TabDocs) path <- T.useBox $ NTC.initialPageParams session nodeId [defaultListId] (TabDocument TabDocs)
...@@ -167,7 +164,6 @@ ngramsViewCpt = here.component "ngramsView" cpt ...@@ -167,7 +164,6 @@ ngramsViewCpt = here.component "ngramsView" cpt
, reloadForest , reloadForest
, reloadRoot , reloadRoot
, session , session
, sidePanelTriggers
, tabNgramType , tabNgramType
, tabType , tabType
, tasks , tasks
......
module Gargantext.Components.Nodes.Lists where module Gargantext.Components.Nodes.Lists where
import DOM.Simple.Console (log, log2)
import Data.Maybe (Maybe(..)) import Data.Maybe (Maybe(..))
import Data.Tuple (fst, snd) import Data.Tuple (fst, snd)
import Data.Tuple.Nested ((/\)) import Data.Tuple.Nested ((/\))
import Effect (Effect) import Effect (Effect)
import Effect.Aff (launchAff_) import Effect.Aff (launchAff_)
import Gargantext.AsyncTasks as GAT import Gargantext.AsyncTasks as GAT
import Gargantext.Components.Forest as Forest
import Gargantext.Components.NgramsTable.Loader (clearCache) import Gargantext.Components.NgramsTable.Loader (clearCache)
import Gargantext.Components.Node (NodePoly(..)) import Gargantext.Components.Node (NodePoly(..))
import Gargantext.Components.Nodes.Corpus (loadCorpusWithChild) import Gargantext.Components.Nodes.Corpus (loadCorpusWithChild)
import Gargantext.Components.Nodes.Corpus.Types (getCorpusInfo, CorpusInfo(..), Hyperdata(..)) import Gargantext.Components.Nodes.Corpus.Types (getCorpusInfo, CorpusInfo(..), Hyperdata(..))
import Gargantext.Components.Nodes.Lists.Tabs as Tabs import Gargantext.Components.Nodes.Lists.Tabs as Tabs
import Gargantext.Components.Nodes.Lists.Types (CacheState(..), ListsLayoutControls, SidePanelState(..), initialControls, toggleSidePanelState) import Gargantext.Components.Nodes.Lists.Types (CacheState(..), SidePanel)
import Gargantext.Components.Table as Table import Gargantext.Components.Table as Table
import Gargantext.Hooks.Loader (useLoader) import Gargantext.Hooks.Loader (useLoader)
import Gargantext.Prelude (Unit, bind, const, discard, pure, show, unit, ($), (<>)) import Gargantext.Prelude (Unit, bind, const, discard, pure, show, unit, ($), (<>))
...@@ -24,7 +22,6 @@ import Gargantext.Utils.Toestand as T2 ...@@ -24,7 +22,6 @@ import Gargantext.Utils.Toestand as T2
import Reactix as R import Reactix as R
import Reactix.DOM.HTML as H import Reactix.DOM.HTML as H
import Record as Record import Record as Record
import Record.Extra as REX
import Toestand as T import Toestand as T
here :: R2.Here here :: R2.Here
...@@ -35,31 +32,26 @@ listsWithSessionContext = R.createElement listsWithSessionContextCpt ...@@ -35,31 +32,26 @@ listsWithSessionContext = R.createElement listsWithSessionContextCpt
listsWithSessionContextCpt :: R.Component CommonPropsSessionContext listsWithSessionContextCpt :: R.Component CommonPropsSessionContext
listsWithSessionContextCpt = here.component "listsWithSessionContext" cpt where listsWithSessionContextCpt = here.component "listsWithSessionContext" cpt where
cpt props@{ session } _ = do cpt props@{ session, sidePanel, sidePanelState } _ = do
session' <- R.useContext session session' <- R.useContext session
controls <- initialControls
pure $ R.fragment [ pure $ listsLayout (Record.merge { session: session', sidePanel, sidePanelState } props) []
-- topBar { controls } []
listsLayout (Record.merge { controls, session: session' } props) []
, H.div { className: "side-panel" } [ sidePanel { controls, session: session' } [] ]
]
-------------------------------------------------------- --------------------------------------------------------
type CommonPropsNoSession = type CommonPropsNoSession =
( nodeId :: Int ( nodeId :: Int
, reloadForest :: T.Box T2.Reload , reloadForest :: T.Box T2.Reload
, reloadRoot :: T.Box T2.Reload , reloadRoot :: T.Box T2.Reload
, sessionUpdate :: Session -> Effect Unit , sessionUpdate :: Session -> Effect Unit
, tasks :: T.Box GAT.Storage , sidePanel :: T.Box (Maybe (Record SidePanel))
, sidePanelState :: T.Box GT.SidePanelState
, tasks :: T.Box GAT.Storage
) )
type CommonProps = WithSession CommonPropsNoSession type Props = WithSession CommonPropsNoSession
type CommonPropsSessionContext = WithSessionContext CommonPropsNoSession type CommonPropsSessionContext = WithSessionContext CommonPropsNoSession
type Props = ( controls :: Record ListsLayoutControls | CommonProps )
type WithTreeProps = ( handed :: GT.Handed | Props ) type WithTreeProps = ( handed :: GT.Handed | Props )
listsLayout :: R2.Component Props listsLayout :: R2.Component Props
...@@ -69,58 +61,65 @@ listsLayoutCpt :: R.Component Props ...@@ -69,58 +61,65 @@ listsLayoutCpt :: R.Component Props
listsLayoutCpt = here.component "listsLayout" cpt where listsLayoutCpt = here.component "listsLayout" cpt where
cpt props@{ nodeId, session } _ = do cpt props@{ nodeId, session } _ = do
let sid = sessionId session let sid = sessionId session
pure $ listsLayoutWithKey $ Record.merge props { key: show sid <> "-" <> show nodeId } pure $ listsLayoutWithKey (Record.merge props { key: show sid <> "-" <> show nodeId }) []
type KeyProps = ( key :: String | Props ) type KeyProps = ( key :: String | Props )
listsLayoutWithKey :: Record KeyProps -> R.Element listsLayoutWithKey :: R2.Component KeyProps
listsLayoutWithKey props = R.createElement listsLayoutWithKeyCpt props [] listsLayoutWithKey = R.createElement listsLayoutWithKeyCpt
listsLayoutWithKeyCpt :: R.Component KeyProps listsLayoutWithKeyCpt :: R.Component KeyProps
listsLayoutWithKeyCpt = here.component "listsLayoutWithKey" cpt where listsLayoutWithKeyCpt = here.component "listsLayoutWithKey" cpt where
cpt { controls, nodeId, reloadForest, reloadRoot, session, sessionUpdate, tasks } _ = do cpt { nodeId
let path = { nodeId, session } , reloadForest
, reloadRoot
cacheState <- T.useBox $ getCacheState CacheOn session nodeId , session
cacheState' <- T.useLive T.unequal cacheState , sessionUpdate
, sidePanel
R.useEffectOnce' $ do , sidePanelState
T.listen (\{ new } -> afterCacheStateChange new) cacheState , tasks } _ = do
let path = { nodeId, session }
useLoader path loadCorpusWithChild $
\corpusData@{ corpusId, corpusNode: NodePoly poly, defaultListId } -> cacheState <- T.useBox $ getCacheState CacheOn session nodeId
let { date, hyperdata : Hyperdata h, name } = poly cacheState' <- T.useLive T.unequal cacheState
CorpusInfo { authors, desc, query } = getCorpusInfo h.fields
in R.useEffectOnce' $ do
R.fragment [ T.listen (\{ new } -> afterCacheStateChange new) cacheState
Table.tableHeaderLayout {
cacheState useLoader path loadCorpusWithChild $
, date \corpusData@{ corpusId, corpusNode: NodePoly poly, defaultListId } ->
, desc let { date, hyperdata : Hyperdata h, name } = poly
, key: "listsLayoutWithKey-header-" <> (show cacheState') CorpusInfo { authors, desc, query } = getCorpusInfo h.fields
, query in
, title: "Corpus " <> name R.fragment [
, user: authors } [] Table.tableHeaderLayout {
, Tabs.tabs { cacheState
cacheState , date
, corpusData , desc
, corpusId , key: "listsLayoutWithKey-header-" <> (show cacheState')
, key: "listsLayoutWithKey-tabs-" <> (show cacheState') , query
, reloadForest , title: "Corpus " <> name
, reloadRoot , user: authors } []
, session , Tabs.tabs {
, sidePanelTriggers: controls.triggers cacheState
, tasks , corpusData
} , corpusId
] , key: "listsLayoutWithKey-tabs-" <> (show cacheState')
where , reloadForest
afterCacheStateChange cacheState = do , reloadRoot
launchAff_ $ clearCache unit , session
sessionUpdate $ setCacheState session nodeId cacheState , tasks
}
]
where
afterCacheStateChange cacheState = do
launchAff_ $ clearCache unit
sessionUpdate $ setCacheState session nodeId cacheState
type SidePanelProps = type SidePanelProps =
( controls :: Record ListsLayoutControls ( session :: Session
, session :: Session , sidePanel :: T.Box (Maybe (Record SidePanel))
, sidePanelState :: T.Box GT.SidePanelState
) )
sidePanel :: R2.Component SidePanelProps sidePanel :: R2.Component SidePanelProps
...@@ -129,29 +128,17 @@ sidePanel = R.createElement sidePanelCpt ...@@ -129,29 +128,17 @@ sidePanel = R.createElement sidePanelCpt
sidePanelCpt :: R.Component SidePanelProps sidePanelCpt :: R.Component SidePanelProps
sidePanelCpt = here.component "sidePanel" cpt sidePanelCpt = here.component "sidePanel" cpt
where where
cpt { controls: { triggers: { toggleSidePanel cpt { session
, triggerSidePanel , sidePanel
} } , sidePanelState } _ = do
, session } _ = do
showSidePanel <- R.useState' InitialClosed
R.useEffect' $ do
let toggleSidePanel' _ = snd showSidePanel toggleSidePanelState
triggerSidePanel' _ = snd showSidePanel $ const Opened
R2.setTrigger toggleSidePanel toggleSidePanel'
R2.setTrigger triggerSidePanel triggerSidePanel'
(mCorpusId /\ setMCorpusId) <- R.useState' Nothing sidePanelState' <- T.useLive T.unequal sidePanelState
(mListId /\ setMListId ) <- R.useState' Nothing
(mNodeId /\ setMNodeId ) <- R.useState' Nothing
let mainStyle = case fst showSidePanel of let mainStyle = case sidePanelState' of
Opened -> { display: "block" } GT.Opened -> { display: "block" }
_ -> { display: "none" } _ -> { display: "none" }
let closeSidePanel _ = do let closeSidePanel _ = T.write_ GT.Closed sidePanelState
snd showSidePanel $ const Closed
pure $ H.div { style: mainStyle } [ pure $ H.div { style: mainStyle } [
H.div { className: "header" } [ H.div { className: "header" } [
......
...@@ -40,7 +40,6 @@ type Props = ( ...@@ -40,7 +40,6 @@ type Props = (
, reloadForest :: T.Box T2.Reload , reloadForest :: T.Box T2.Reload
, reloadRoot :: T.Box T2.Reload , reloadRoot :: T.Box T2.Reload
, session :: Session , session :: Session
, sidePanelTriggers :: Record SidePanelTriggers
, tasks :: T.Box GAT.Storage , tasks :: T.Box GAT.Storage
) )
...@@ -76,7 +75,6 @@ ngramsViewCpt = here.component "ngramsView" cpt where ...@@ -76,7 +75,6 @@ ngramsViewCpt = here.component "ngramsView" cpt where
, reloadRoot , reloadRoot
, mode , mode
, session , session
, sidePanelTriggers
, tasks } _ = do , tasks } _ = do
chartsReload <- T.useBox T2.newReload chartsReload <- T.useBox T2.newReload
...@@ -104,7 +102,6 @@ ngramsViewCpt = here.component "ngramsView" cpt where ...@@ -104,7 +102,6 @@ ngramsViewCpt = here.component "ngramsView" cpt where
, reloadForest , reloadForest
, reloadRoot , reloadRoot
, session , session
, sidePanelTriggers
, tabNgramType , tabNgramType
, tabType , tabType
, tasks , tasks
......
module Gargantext.Components.Nodes.Lists.Types where module Gargantext.Components.Nodes.Lists.Types where
import Data.Argonaut (class DecodeJson, decodeJson, class EncodeJson, encodeJson, (~>), (:=)) import Data.Argonaut (class DecodeJson, class EncodeJson, decodeJson, encodeJson)
import Data.Argonaut.Decode.Error (JsonDecodeError(..)) import Data.Argonaut.Decode.Error (JsonDecodeError(..))
import Data.Maybe (Maybe(..))
import Data.Either (Either(..)) import Data.Either (Either(..))
import Data.Generic.Rep (class Generic) import Data.Generic.Rep (class Generic)
import Data.Generic.Rep.Eq (genericEq) import Data.Generic.Rep.Eq (genericEq)
import Data.Generic.Rep.Show (genericShow) import Data.Generic.Rep.Show (genericShow)
import Data.Maybe (Maybe(..))
import Reactix as R
import Gargantext.Prelude import Gargantext.Prelude
import Gargantext.Types (ListId, NodeID) import Gargantext.Types (ListId, NodeID)
...@@ -34,45 +33,7 @@ instance encodeJsonCacheState :: EncodeJson CacheState where ...@@ -34,45 +33,7 @@ instance encodeJsonCacheState :: EncodeJson CacheState where
instance showCacheState :: Show CacheState where instance showCacheState :: Show CacheState where
show = genericShow show = genericShow
type SidePanel = ()
data SidePanelState = InitialClosed | Opened | Closed initialSidePanel :: Maybe (Record SidePanel)
derive instance eqSidePanelState :: Eq SidePanelState initialSidePanel = Nothing
toggleSidePanelState :: SidePanelState -> SidePanelState
toggleSidePanelState InitialClosed = Opened
toggleSidePanelState Closed = Opened
toggleSidePanelState Opened = Closed
type TriggerAnnotatedDocIdChangeParams = (
corpusId :: NodeID
, listId :: ListId
, nodeId :: NodeID
)
type SidePanelTriggers = (
toggleSidePanel :: R2.Trigger Unit -- toggles side panel
, triggerSidePanel :: R2.Trigger Unit -- opens side panel
)
emptySidePanelTriggers :: R.Hooks (Record SidePanelTriggers)
emptySidePanelTriggers = do
toggleSidePanel <- R.useRef Nothing
triggerSidePanel <- R.useRef Nothing
pure $ {
toggleSidePanel
, triggerSidePanel
}
type ListsLayoutControls = (
triggers :: Record SidePanelTriggers
)
initialControls :: R.Hooks (Record ListsLayoutControls)
initialControls = do
triggers <- emptySidePanelTriggers
pure $ {
triggers
}
This diff is collapsed.
module Gargantext.Components.Nodes.Texts.Types where module Gargantext.Components.Nodes.Texts.Types where
import Data.Maybe (Maybe(..)) import Data.Maybe (Maybe(..))
import Effect (Effect)
import Reactix as R import Reactix as R
import Gargantext.Prelude import Gargantext.Prelude
...@@ -56,3 +55,15 @@ initialControls = do ...@@ -56,3 +55,15 @@ initialControls = do
pure $ { pure $ {
triggers triggers
} }
type SidePanel =
(
corpusId :: NodeID
, listId :: ListId
, mCurrentDocId :: Maybe Int
, nodeId :: NodeID
)
initialSidePanel :: Maybe (Record SidePanel)
initialSidePanel = Nothing
This diff is collapsed.
...@@ -52,9 +52,9 @@ tab = R.createElement tabCpt ...@@ -52,9 +52,9 @@ tab = R.createElement tabCpt
-- | A tab only shows its contents if it is currently selected -- | A tab only shows its contents if it is currently selected
tabCpt :: R.Component TabProps tabCpt :: R.Component TabProps
tabCpt = R.staticComponent "G.C.Tab.tab" cpt tabCpt = here.component "tab" cpt
where where
cpt { selected, index } children = H.div { className } children' cpt { selected, index } children = pure $ H.div { className } children'
where where
same = selected == index same = selected == index
className = "tab-pane" <> (if same then "show active" else "fade") className = "tab-pane" <> (if same then "show active" else "fade")
......
...@@ -139,10 +139,10 @@ tableCpt = here.component "table" cpt ...@@ -139,10 +139,10 @@ tableCpt = here.component "table" cpt
Just (DESC d) | c == d -> [lnk (Just (ASC c)) "DESC ", lnk Nothing (columnName c)] Just (DESC d) | c == d -> [lnk (Just (ASC c)) "DESC ", lnk Nothing (columnName c)]
_ -> [lnk (Just (ASC c)) (columnName c)] _ -> [lnk (Just (ASC c)) (columnName c)]
pure $ container pure $ container
{ syncResetButton { pageSizeControl: sizeDD { params }
, pageSizeControl: sizeDD { params }
, pageSizeDescription: textDescription state.page state.pageSize totalRecords , pageSizeDescription: textDescription state.page state.pageSize totalRecords
, paginationLinks: pagination { params, totalPages } , paginationLinks: pagination { params, totalPages }
, syncResetButton
, tableBody: map _.row $ A.fromFoldable rows , tableBody: map _.row $ A.fromFoldable rows
, tableHead: H.tr {} (colHeader <$> colNames) , tableHead: H.tr {} (colHeader <$> colNames)
} }
......
...@@ -23,7 +23,7 @@ topBar = R.createElement topBarCpt ...@@ -23,7 +23,7 @@ topBar = R.createElement topBarCpt
topBarCpt :: R.Component TopBarProps topBarCpt :: R.Component TopBarProps
topBarCpt = here.component "topBar" cpt topBarCpt = here.component "topBar" cpt
where where
cpt { handed } _children = do cpt { handed } children = do
handed' <- T.useLive T.unequal handed handed' <- T.useLive T.unequal handed
pure $ H.div { className: "navbar navbar-expand-lg navbar-dark bg-dark fixed-top" pure $ H.div { className: "navbar navbar-expand-lg navbar-dark bg-dark fixed-top"
...@@ -34,13 +34,13 @@ topBarCpt = here.component "topBar" cpt ...@@ -34,13 +34,13 @@ topBarCpt = here.component "topBar" cpt
-- https://stackoverflow.com/questions/19733447/bootstrap-navbar-with-left-center-or-right-aligned-items -- https://stackoverflow.com/questions/19733447/bootstrap-navbar-with-left-center-or-right-aligned-items
-- In practice: only apply "ml-auto" to the last element of this list, if handed == LeftHanded -- In practice: only apply "ml-auto" to the last element of this list, if handed == LeftHanded
logo logo
, H.ul { className: "navbar-nav " <> if handed' == LeftHanded then "ml-auto" else "" } $ reverseHanded handed' [ , H.ul { className: "navbar-nav " <> if handed' == LeftHanded then "ml-auto" else "" } $ reverseHanded handed'
divDropdownLeft {} [] ([ divDropdownLeft {} []
, handButton handed' , handButton handed'
, smiley , smiley
, H.li { className: "nav-item" } [ themeSwitcher { theme: defaultTheme , H.li { className: "nav-item" } [ themeSwitcher { theme: defaultTheme
, themes: allThemes } [] ] , themes: allThemes } [] ]
] ] <> children)
] ]
where where
handButton handed' = H.li { title: "If you are Left Handed you can change\n" handButton handed' = H.li { title: "If you are Left Handed you can change\n"
......
...@@ -19,7 +19,10 @@ import Gargantext.Types as GT ...@@ -19,7 +19,10 @@ import Gargantext.Types as GT
newtype Graph n e = Graph { edges :: Seq.Seq {|e}, nodes :: Seq.Seq {|n} } newtype Graph n e = Graph { edges :: Seq.Seq {|e}, nodes :: Seq.Seq {|n} }
--derive instance eqGraph :: Eq Graph derive instance genericGraph :: Generic (Graph n e) _
instance eqGraphInst :: (Eq (Record n), Eq (Record e)) => Eq (Graph n e) where
eq = genericEq
--instance eqGraph :: Eq Graph where --instance eqGraph :: Eq Graph where
-- eq (Graph {nodes: n1, edges: e1}) (Graph {nodes: n2, edges: e2}) = n1 == n2 && e1 == e2 -- eq (Graph {nodes: n1, edges: e1}) (Graph {nodes: n2, edges: e2}) = n1 == n2 && e1 == e2
......
...@@ -773,6 +773,14 @@ prettyNodeType nt = S.replace (S.Pattern "Node") (S.Replacement " ") ...@@ -773,6 +773,14 @@ prettyNodeType nt = S.replace (S.Pattern "Node") (S.Replacement " ")
$ S.replace (S.Pattern "Folder") (S.Replacement " ") $ S.replace (S.Pattern "Folder") (S.Replacement " ")
$ show nt $ show nt
---------------------------------------------------------------------------
data SidePanelState = InitialClosed | Opened | Closed
derive instance genericSidePanelState :: Generic SidePanelState _
instance eqSidePanelState :: Eq SidePanelState where
eq = genericEq
toggleSidePanelState :: SidePanelState -> SidePanelState
toggleSidePanelState InitialClosed = Opened
toggleSidePanelState Closed = Opened
toggleSidePanelState Opened = Closed
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