Commit eb395150 authored by Przemyslaw Kaminski's avatar Przemyslaw Kaminski

[ngrams table] fix pagination in ngrams table

However, still I see too many pages reported wrt the results
returned (i.e. couple last pages are empty).
parent afb7c223
...@@ -21,28 +21,26 @@ import Data.Sequence (Seq, length) as Seq ...@@ -21,28 +21,26 @@ import Data.Sequence (Seq, length) as Seq
import Data.Set (Set) import Data.Set (Set)
import Data.Set as Set import Data.Set as Set
import Data.Symbol (SProxy(..)) import Data.Symbol (SProxy(..))
import Data.Tuple (Tuple(..), fst, snd) import Data.Tuple (Tuple(..), fst)
import Data.Tuple.Nested ((/\)) import Data.Tuple.Nested ((/\))
import DOM.Simple.Console (log, log2) import DOM.Simple.Console (log2)
import Effect (Effect) import Effect (Effect)
import Effect.Aff (Aff, launchAff_) import Effect.Aff (Aff)
import Effect.Class (liftEffect) import Reactix (Component, Element, Ref, State, createElement, fragment, hooksComponentWithModule, unsafeEventValue, useEffect', useState') as R
import Reactix as R
import Reactix.DOM.HTML as H import Reactix.DOM.HTML as H
import Record as Record
import Unsafe.Coerce (unsafeCoerce) import Unsafe.Coerce (unsafeCoerce)
import Gargantext.Prelude import Gargantext.Prelude (class Show, Unit, bind, const, discard, identity, map, mempty, not, otherwise, pure, read, show, unit, (#), ($), (&&), (/=), (<$>), (<<<), (<>), (=<<), (==), (||))
import Gargantext.AsyncTasks as GAT import Gargantext.AsyncTasks as GAT
import Gargantext.Components.AutoUpdate (autoUpdateElt) import Gargantext.Components.AutoUpdate (autoUpdateElt)
import Gargantext.Hooks.Loader (useLoader) import Gargantext.Hooks.Loader (useLoader)
import Gargantext.Components.Table.Types as T import Gargantext.Components.Table.Types (ColumnName(..), Rows, TableContainerProps) as T
import Gargantext.Components.NgramsTable.Components as NTC import Gargantext.Components.NgramsTable.Components as NTC
import Gargantext.Components.NgramsTable.Core import Gargantext.Components.NgramsTable.Core (Action(..), CoreAction(..), CoreState, Dispatch, NgramsElement(..), NgramsPatch(..), NgramsTable, NgramsTerm, PageParams, PatchMap(..), Version, Versioned(..), VersionedNgramsTable, VersionedWithCountNgramsTable, _NgramsElement, _NgramsRepoElement, _NgramsTable, _children, _list, _ngrams, _ngrams_repo_elements, _ngrams_scores, _occurrences, _root, addNewNgramA, applyNgramsPatches, applyPatchSet, chartsAfterSync, commitPatch, convOrderBy, coreDispatch, filterTermSize, fromNgramsPatches, ngramsRepoElementToNgramsElement, ngramsTermText, normNgram, patchSetFromMap, replace, rootsOf, singletonNgramsTablePatch, syncResetButtons, toVersioned)
import Gargantext.Components.NgramsTable.Loader (useLoaderWithCacheAPI) import Gargantext.Components.NgramsTable.Loader (useLoaderWithCacheAPI)
import Gargantext.Components.Nodes.Lists.Types as NT import Gargantext.Components.Nodes.Lists.Types as NT
import Gargantext.Components.Table as T import Gargantext.Components.Table (filterRows, table) as T
import Gargantext.Routes (SessionRoute(..)) as R import Gargantext.Routes (SessionRoute(..)) as R
import Gargantext.Sessions (Session, get) import Gargantext.Sessions (Session, get)
import Gargantext.Types (CTabNgramType, OrderBy(..), SearchQuery, TabType, TermList(..), TermSize, termLists, termSizes) import Gargantext.Types (CTabNgramType, OrderBy(..), SearchQuery, TabType, TermList(..), TermSize, termLists, termSizes)
...@@ -55,35 +53,12 @@ import Gargantext.Utils.Seq (mapMaybe) as Seq ...@@ -55,35 +53,12 @@ import Gargantext.Utils.Seq (mapMaybe) as Seq
thisModule :: String thisModule :: String
thisModule = "Gargantext.Components.NgramsTable" thisModule = "Gargantext.Components.NgramsTable"
type State' =
CoreState
( ngramsParent :: Maybe NgramsTerm -- Nothing means we are not currently grouping terms
, ngramsChildren :: Map NgramsTerm Boolean
-- ^ Used only when grouping.
-- This updates the children of `ngramsParent`,
-- ngrams set to `true` are to be added, and `false` to
-- be removed.
, ngramsSelection :: Set NgramsTerm
-- ^ The set of selected checkboxes of the first column.
)
_ngramsChildren :: forall row. Lens' { ngramsChildren :: Map NgramsTerm Boolean | row } (Map NgramsTerm Boolean) _ngramsChildren :: forall row. Lens' { ngramsChildren :: Map NgramsTerm Boolean | row } (Map NgramsTerm Boolean)
_ngramsChildren = prop (SProxy :: SProxy "ngramsChildren") _ngramsChildren = prop (SProxy :: SProxy "ngramsChildren")
_ngramsSelection :: forall row. Lens' { ngramsSelection :: Set NgramsTerm | row } (Set NgramsTerm) _ngramsSelection :: forall row. Lens' { ngramsSelection :: Set NgramsTerm | row } (Set NgramsTerm)
_ngramsSelection = prop (SProxy :: SProxy "ngramsSelection") _ngramsSelection = prop (SProxy :: SProxy "ngramsSelection")
initialState' :: VersionedNgramsTable -> State'
initialState' (Versioned {version}) =
{ ngramsChildren: mempty
, ngramsLocalPatch: mempty
, ngramsParent: Nothing
, ngramsSelection: mempty
, ngramsStagePatch: mempty
, ngramsValidPatch: mempty
, ngramsVersion: version
}
type State = type State =
CoreState ( CoreState (
ngramsChildren :: Map NgramsTerm Boolean ngramsChildren :: Map NgramsTerm Boolean
...@@ -290,7 +265,8 @@ type CommonProps = ( ...@@ -290,7 +265,8 @@ type CommonProps = (
) )
type Props = ( type Props = (
mTotalRows :: Maybe Int cacheState :: NT.CacheState
, mTotalRows :: Maybe Int
, path :: R.State PageParams , path :: R.State PageParams
, state :: R.State State , state :: R.State State
, versioned :: VersionedNgramsTable , versioned :: VersionedNgramsTable
...@@ -303,21 +279,22 @@ loadedNgramsTable = R.createElement loadedNgramsTableCpt ...@@ -303,21 +279,22 @@ loadedNgramsTable = R.createElement loadedNgramsTableCpt
loadedNgramsTableCpt :: R.Component Props loadedNgramsTableCpt :: R.Component Props
loadedNgramsTableCpt = R.hooksComponentWithModule thisModule "loadedNgramsTable" cpt loadedNgramsTableCpt = R.hooksComponentWithModule thisModule "loadedNgramsTable" cpt
cpt { afterSync cpt props@{ afterSync
, appReload , appReload
, asyncTasksRef , asyncTasksRef
, mTotalRows , cacheState
, path: path@(path'@{ listIds, nodeId, params, searchQuery, scoreType, termListFilter, termSizeFilter } /\ setPath) , mTotalRows
, sidePanelTriggers , path: path@(path'@{ listIds, nodeId, params, searchQuery, scoreType, termListFilter, termSizeFilter } /\ setPath)
, state: (state@{ ngramsChildren , sidePanelTriggers
, ngramsLocalPatch , state: (state@{ ngramsChildren
, ngramsParent , ngramsLocalPatch
, ngramsSelection , ngramsParent
, ngramsVersion } /\ setState) , ngramsSelection
, tabNgramType , ngramsVersion } /\ setState)
, treeReloadRef , tabNgramType
, versioned: Versioned { data: initTable } , treeReloadRef
, withAutoUpdate } _ = do , versioned: Versioned { data: initTable }
, withAutoUpdate } _ = do
pure $ R.fragment $ pure $ R.fragment $
autoUpdate <> [ autoUpdate <> [
...@@ -327,19 +304,19 @@ loadedNgramsTable = R.createElement loadedNgramsTableCpt ...@@ -327,19 +304,19 @@ loadedNgramsTable = R.createElement loadedNgramsTableCpt
] ]
, search ] , search ]
<> <>
[ T.table { syncResetButton: [ syncResetButton ] [ T.table { colNames
, colNames
, container: tableContainer { dispatch: performAction , container: tableContainer { dispatch: performAction
, ngramsChildren , ngramsChildren
, ngramsParent , ngramsParent
, ngramsSelection , ngramsSelection
, ngramsTable , ngramsTable
, path , path
, tabNgramType
, syncResetButton: [ syncResetButton ] , syncResetButton: [ syncResetButton ]
, tabNgramType
} }
, params: params /\ setParams -- TODO-LENS , params: params /\ setParams -- TODO-LENS
, rows: filteredConvertedRows , rows: filteredConvertedRows
, syncResetButton: [ syncResetButton ]
, totalRecords , totalRecords
, wrapColElts: wrapColElts { allNgramsSelected , wrapColElts: wrapColElts { allNgramsSelected
, dispatch: performAction , dispatch: performAction
...@@ -349,13 +326,16 @@ loadedNgramsTable = R.createElement loadedNgramsTableCpt ...@@ -349,13 +326,16 @@ loadedNgramsTable = R.createElement loadedNgramsTableCpt
, syncResetButton ] , syncResetButton ]
where where
afterSync = chartsAfterSync path' asyncTasksRef nodeId treeReloadRef afterSync' _ = do
chartsAfterSync path' asyncTasksRef nodeId treeReloadRef unit
afterSync unit
performAction = mkDispatch { filteredRows, path: path', state: state /\ setState }
syncResetButton = syncResetButtons { afterSync syncResetButton = syncResetButtons { afterSync: afterSync'
, ngramsLocalPatch , ngramsLocalPatch
, performAction: performAction <<< CoreAction } , performAction: performAction <<< CoreAction }
autoUpdate :: Array R.Element autoUpdate :: Array R.Element
autoUpdate = if withAutoUpdate then autoUpdate = if withAutoUpdate then
[ R2.buff [ R2.buff
...@@ -363,49 +343,17 @@ loadedNgramsTable = R.createElement loadedNgramsTableCpt ...@@ -363,49 +343,17 @@ loadedNgramsTable = R.createElement loadedNgramsTableCpt
{ duration: 5000 { duration: 5000
, effect: performAction , effect: performAction
$ CoreAction $ CoreAction
$ Synchronize { afterSync } $ Synchronize { afterSync: afterSync' }
} }
] ]
else [] else []
setParentResetChildren :: Maybe NgramsTerm -> State -> State
setParentResetChildren p = _ { ngramsParent = p, ngramsChildren = mempty }
performAction :: Action -> Effect Unit
performAction (SetParentResetChildren p) =
setState $ setParentResetChildren p
performAction (ToggleChild b c) =
setState $ \s@{ ngramsChildren: nc } -> s { ngramsChildren = newNC nc }
where
newNC nc = Map.alter (maybe (Just b) (const Nothing)) c nc
performAction (ToggleSelect c) =
setState $ \s@{ ngramsSelection: ns } -> s { ngramsSelection = toggleSet c ns }
performAction ToggleSelectAll =
setState toggler
where
toggler s =
if allNgramsSelected then
s { ngramsSelection = Set.empty :: Set NgramsTerm }
else
s { ngramsSelection = selectNgramsOnFirstPage filteredRows }
performAction AddTermChildren =
case ngramsParent of
Nothing ->
-- impossible but harmless
pure unit
Just parent -> do
let pc = patchSetFromMap ngramsChildren
pe = NgramsPatch { patch_list: mempty, patch_children: pc }
pt = singletonNgramsTablePatch parent pe
setState $ setParentResetChildren Nothing
commitPatch (Versioned {version: ngramsVersion, data: pt}) (state /\ setState)
performAction (CoreAction a) = coreDispatch path' (state /\ setState) a
totalRecords = fromMaybe (Seq.length rows) mTotalRows totalRecords = fromMaybe (Seq.length rows) mTotalRows
filteredConvertedRows :: T.Rows filteredConvertedRows :: T.Rows
filteredConvertedRows = convertRow <$> filteredRows filteredConvertedRows = convertRow <$> filteredRows
filteredRows :: PreConversionRows filteredRows :: PreConversionRows
filteredRows = T.filterRows { params } rows -- no need to filter offset if cache is off
filteredRows = if cacheState == NT.CacheOn then T.filterRows { params } rows else rows
ng_scores :: Map NgramsTerm (Additive Int) ng_scores :: Map NgramsTerm (Additive Int)
ng_scores = ngramsTable ^. _NgramsTable <<< _ngrams_scores ng_scores = ngramsTable ^. _NgramsTable <<< _ngrams_scores
rows :: PreConversionRows rows :: PreConversionRows
...@@ -471,6 +419,56 @@ loadedNgramsTable = R.createElement loadedNgramsTableCpt ...@@ -471,6 +419,56 @@ loadedNgramsTable = R.createElement loadedNgramsTableCpt
setSearchQuery :: String -> Effect Unit setSearchQuery :: String -> Effect Unit
setSearchQuery x = setPath $ _ { searchQuery = x } setSearchQuery x = setPath $ _ { searchQuery = x }
type MkDispatchProps = (
filteredRows :: PreConversionRows
, path :: PageParams
, state :: R.State State
)
mkDispatch :: Record MkDispatchProps -> (Action -> Effect Unit)
mkDispatch { filteredRows
, path
, state: (state@{ ngramsChildren
, ngramsLocalPatch
, ngramsParent
, ngramsSelection
, ngramsVersion } /\ setState) } = performAction
where
allNgramsSelected = allNgramsSelectedOnFirstPage ngramsSelection filteredRows
setParentResetChildren :: Maybe NgramsTerm -> State -> State
setParentResetChildren p = _ { ngramsParent = p, ngramsChildren = mempty }
performAction :: Action -> Effect Unit
performAction (SetParentResetChildren p) =
setState $ setParentResetChildren p
performAction (ToggleChild b c) =
setState $ \s@{ ngramsChildren: nc } -> s { ngramsChildren = newNC nc }
where
newNC nc = Map.alter (maybe (Just b) (const Nothing)) c nc
performAction (ToggleSelect c) =
setState $ \s@{ ngramsSelection: ns } -> s { ngramsSelection = toggleSet c ns }
performAction ToggleSelectAll =
setState toggler
where
toggler s =
if allNgramsSelected then
s { ngramsSelection = Set.empty :: Set NgramsTerm }
else
s { ngramsSelection = selectNgramsOnFirstPage filteredRows }
performAction AddTermChildren =
case ngramsParent of
Nothing ->
-- impossible but harmless
pure unit
Just parent -> do
let pc = patchSetFromMap ngramsChildren
pe = NgramsPatch { patch_list: mempty, patch_children: pc }
pt = singletonNgramsTablePatch parent pe
setState $ setParentResetChildren Nothing
commitPatch (Versioned {version: ngramsVersion, data: pt}) (state /\ setState)
performAction (CoreAction a) = coreDispatch path (state /\ setState) a
displayRow :: State -> SearchQuery -> NgramsTable -> Maybe NgramsTerm -> Maybe TermList -> Maybe TermSize -> NgramsElement -> Boolean displayRow :: State -> SearchQuery -> NgramsTable -> Maybe NgramsTerm -> Maybe TermList -> Maybe TermSize -> NgramsElement -> Boolean
displayRow state@{ ngramsChildren displayRow state@{ ngramsChildren
...@@ -549,6 +547,7 @@ mainNgramsTable = R.createElement mainNgramsTableCpt ...@@ -549,6 +547,7 @@ mainNgramsTable = R.createElement mainNgramsTableCpt
let render versioned = mainNgramsTablePaint { afterSync let render versioned = mainNgramsTablePaint { afterSync
, appReload , appReload
, asyncTasksRef , asyncTasksRef
, cacheState: fst cacheState
, path: fst pathS , path: fst pathS
, sidePanelTriggers , sidePanelTriggers
, tabNgramType , tabNgramType
...@@ -567,6 +566,7 @@ mainNgramsTable = R.createElement mainNgramsTableCpt ...@@ -567,6 +566,7 @@ mainNgramsTable = R.createElement mainNgramsTableCpt
let render versionedWithCount = mainNgramsTablePaintNoCache { afterSync let render versionedWithCount = mainNgramsTablePaintNoCache { afterSync
, appReload , appReload
, asyncTasksRef , asyncTasksRef
, cacheState: fst cacheState
, pathS , pathS
, sidePanelTriggers , sidePanelTriggers
, tabNgramType , tabNgramType
...@@ -621,7 +621,8 @@ mainNgramsTable = R.createElement mainNgramsTableCpt ...@@ -621,7 +621,8 @@ mainNgramsTable = R.createElement mainNgramsTableCpt
handleResponse v = v handleResponse v = v
type MainNgramsTablePaintProps = ( type MainNgramsTablePaintProps = (
path :: PageParams cacheState :: NT.CacheState
, path :: PageParams
, versioned :: VersionedNgramsTable , versioned :: VersionedNgramsTable
| CommonProps | CommonProps
) )
...@@ -635,6 +636,7 @@ mainNgramsTablePaint = R.createElement mainNgramsTablePaintCpt ...@@ -635,6 +636,7 @@ mainNgramsTablePaint = R.createElement mainNgramsTablePaintCpt
cpt props@{ afterSync cpt props@{ afterSync
, appReload , appReload
, asyncTasksRef , asyncTasksRef
, cacheState
, path , path
, sidePanelTriggers , sidePanelTriggers
, tabNgramType , tabNgramType
...@@ -646,6 +648,7 @@ mainNgramsTablePaint = R.createElement mainNgramsTablePaintCpt ...@@ -646,6 +648,7 @@ mainNgramsTablePaint = R.createElement mainNgramsTablePaintCpt
pure $ loadedNgramsTable { afterSync pure $ loadedNgramsTable { afterSync
, appReload , appReload
, asyncTasksRef , asyncTasksRef
, cacheState
, mTotalRows: Nothing , mTotalRows: Nothing
, path: pathS , path: pathS
, sidePanelTriggers , sidePanelTriggers
...@@ -656,8 +659,9 @@ mainNgramsTablePaint = R.createElement mainNgramsTablePaintCpt ...@@ -656,8 +659,9 @@ mainNgramsTablePaint = R.createElement mainNgramsTablePaintCpt
, withAutoUpdate , withAutoUpdate
} [] } []
type MainNgramsTablePaintNoCacheProps = type MainNgramsTablePaintNoCacheProps = (
( pathS :: R.State PageParams cacheState :: NT.CacheState
, pathS :: R.State PageParams
, versionedWithCount :: VersionedWithCountNgramsTable , versionedWithCount :: VersionedWithCountNgramsTable
| CommonProps | CommonProps
) )
...@@ -671,6 +675,7 @@ mainNgramsTablePaintNoCache = R.createElement mainNgramsTablePaintNoCacheCpt ...@@ -671,6 +675,7 @@ mainNgramsTablePaintNoCache = R.createElement mainNgramsTablePaintNoCacheCpt
cpt props@{ afterSync cpt props@{ afterSync
, appReload , appReload
, asyncTasksRef , asyncTasksRef
, cacheState
, pathS , pathS
, sidePanelTriggers , sidePanelTriggers
, tabNgramType , tabNgramType
...@@ -685,6 +690,7 @@ mainNgramsTablePaintNoCache = R.createElement mainNgramsTablePaintNoCacheCpt ...@@ -685,6 +690,7 @@ mainNgramsTablePaintNoCache = R.createElement mainNgramsTablePaintNoCacheCpt
afterSync afterSync
, appReload , appReload
, asyncTasksRef , asyncTasksRef
, cacheState
, mTotalRows: Just count , mTotalRows: Just count
, path: pathS , path: pathS
, sidePanelTriggers , sidePanelTriggers
......
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