From 34352a7ee87f8c8db28316852e4c6871efecd388 Mon Sep 17 00:00:00 2001 From: Przemek Kaminski <pk@intrepidus.pl> Date: Wed, 8 Jan 2020 10:16:44 +0100 Subject: [PATCH] [Graph] node removal works now However, graph still needs to be refreshed after this is done. --- .../Components/GraphExplorer/Sidebar.purs | 52 +++++++++++++------ .../Components/GraphExplorer/Types.purs | 19 ++++--- .../Components/NgramsTable/Core.purs | 5 +- 3 files changed, 53 insertions(+), 23 deletions(-) diff --git a/src/Gargantext/Components/GraphExplorer/Sidebar.purs b/src/Gargantext/Components/GraphExplorer/Sidebar.purs index 9ed41c22..af405433 100644 --- a/src/Gargantext/Components/GraphExplorer/Sidebar.purs +++ b/src/Gargantext/Components/GraphExplorer/Sidebar.purs @@ -8,14 +8,19 @@ import DOM.Simple.Console (log2) import Data.Array (head) import Data.Int (fromString) import Data.Map as Map -import Data.Maybe (Maybe(..)) +import Data.Maybe (Maybe(..), fromJust) import Data.Sequence as Seq import Data.Set as Set import Data.Traversable (traverse_) import Data.Tuple.Nested ((/\)) import Effect (Effect) import Effect.Aff (Aff, launchAff_) +import Partial.Unsafe (unsafePartial) +import Reactix as R +import Reactix.DOM.HTML as RH + import Gargantext.Components.GraphExplorer.Types as GET +import Gargantext.Components.NgramsTable.Core as NTC import Gargantext.Components.Nodes.Corpus.Graph.Tabs as GT import Gargantext.Components.RandomText (words) import Gargantext.Data.Array (mapMaybe) @@ -23,10 +28,8 @@ import Gargantext.Ends (Frontends) import Gargantext.Hooks.Sigmax.Types as SigmaxTypes import Gargantext.Routes (SessionRoute(NodeAPI)) import Gargantext.Sessions (Session, delete) -import Gargantext.Types (NodeType(..), TermList(..)) +import Gargantext.Types (CTabNgramType(..), NodeType(..), TabSubType(..), TabType(..), TermList(..), modeTabType) import Gargantext.Utils.Reactix as R2 -import Reactix as R -import Reactix.DOM.HTML as RH type Props = ( frontends :: Frontends @@ -63,10 +66,10 @@ sidebarCpt = R.hooksComponent "Sidebar" cpt , RH.div { className: "tab-content" } [ RH.button { className: "btn btn-danger" - , on: { click: onClickRemove CandidateTerm props.session props.selectedNodeIds }} + , on: { click: onClickRemove CandidateTerm props.session props.metaData nodesMap props.selectedNodeIds }} [ RH.text "Remove candidate" ] , RH.button { className: "btn btn-danger" - , on: { click: onClickRemove StopTerm props.session props.selectedNodeIds }} + , on: { click: onClickRemove StopTerm props.session props.metaData nodesMap props.selectedNodeIds }} [ RH.text "Remove stop" ] ] , RH.li { className: "nav-item" } @@ -109,10 +112,10 @@ sidebarCpt = R.hooksComponent "Sidebar" cpt , checked: true , title: "Mark as completed" } ] - onClickRemove rType session (selectedNodeIds /\ _) e = do + onClickRemove rType session metaData nodesMap (selectedNodeIds /\ _) e = do log2 "[onClickRemove] selectedNodeIds" selectedNodeIds - let nodeIds = mapMaybe fromString $ Set.toUnfoldable selectedNodeIds - deleteNodes rType session nodeIds + let nodes = mapMaybe (\id -> Map.lookup id nodesMap) $ Set.toUnfoldable selectedNodeIds + deleteNodes rType session metaData nodes @@ -133,12 +136,31 @@ neighbourBadges graph (selectedNodeIds /\ _) = SigmaxTypes.neighbours graph sele where selectedNodes = SigmaxTypes.graphNodes $ SigmaxTypes.nodesById graph selectedNodeIds -deleteNodes :: TermList -> Session -> Array Int -> Effect Unit -deleteNodes termList session nodeIds = do - traverse_ (launchAff_ <<< deleteNode termList session) nodeIds +deleteNodes :: TermList -> Session -> GET.MetaData -> Array (Record SigmaxTypes.Node) -> Effect Unit +deleteNodes termList session metaData nodes = do + traverse_ (launchAff_ <<< deleteNode termList session metaData) nodes -deleteNode :: TermList -> Session -> Int -> Aff Int -deleteNode termList session nodeId = delete session $ NodeAPI Node (Just nodeId) "" +deleteNode :: TermList -> Session -> GET.MetaData -> Record SigmaxTypes.Node -> Aff NTC.VersionedNgramsPatches +deleteNode termList session (GET.MetaData metaData) node = NTC.putNgramsPatches coreParams versioned + where + nodeId :: Int + nodeId = unsafePartial $ fromJust $ fromString node.id + versioned :: NTC.VersionedNgramsPatches + versioned = NTC.Versioned {version: metaData.list.version, data: np} + coreParams :: NTC.CoreParams () + coreParams = {session, nodeId: nodeId, listIds: [metaData.list.listId], tabType} + tabNgramType :: CTabNgramType + tabNgramType = modeTabType node.gargType + tabType :: TabType + tabType = TabCorpus (TabNgramType tabNgramType) + term :: NTC.NgramsTerm + term = NTC.normNgram tabNgramType node.label + pt :: NTC.NgramsTablePatch + pt = NTC.fromNgramsPatches np + np :: NTC.NgramsPatches + np = NTC.singletonPatchMap term $ NTC.NgramsPatch { patch_children: mempty, patch_list } + patch_list :: NTC.Replace TermList + patch_list = NTC.Replace { new: termList, old: GraphTerm } query :: Frontends -> GET.MetaData -> Session -> SigmaxTypes.NodesMap -> R.State SigmaxTypes.SelectedNodeIds -> R.Element @@ -154,6 +176,6 @@ query frontends (GET.MetaData metaData) session nodesMap (selectedNodeIds /\ _) Just n -> words n.label side corpusId = GET.GraphSideCorpus { corpusId - , listId: metaData.listId + , listId: metaData.list.listId , corpusLabel: metaData.title } diff --git a/src/Gargantext/Components/GraphExplorer/Types.purs b/src/Gargantext/Components/GraphExplorer/Types.purs index 7610dafc..a7bdbfa8 100644 --- a/src/Gargantext/Components/GraphExplorer/Types.purs +++ b/src/Gargantext/Components/GraphExplorer/Types.purs @@ -37,6 +37,7 @@ derive instance newtypeEdge :: Newtype Edge _ type InclusiveRange t = { min :: t, max :: t } type ListId = Int +type Version = Int type CorpusId = Int type CorpusLabel = String @@ -61,8 +62,10 @@ newtype MetaData = MetaData title :: String , legend :: Array Legend , corpusId :: Array Int - , listId :: ListId - , version :: Int + , list :: { + listId :: ListId + , version :: Version + } } getLegend :: GraphData -> Maybe (Array Legend) @@ -97,7 +100,7 @@ initialGraphData = GraphData { nodes: [] , edges: [] , sides: [] - , metaData : Just $ MetaData {title : "", legend : [], corpusId : [], listId : 0, version : 0} + , metaData : Just $ MetaData {title : "", legend : [], corpusId : [], list: {listId : 0, version : 0}} } instance decodeJsonGraphData :: DecodeJson GraphData where @@ -108,7 +111,8 @@ instance decodeJsonGraphData :: DecodeJson GraphData where -- TODO: sides metadata <- obj .: "metadata" corpusIds <- metadata .: "corpusId" - listId' <- metadata .: "listId" + list <- metadata .: "list" + listId' <- list .: "listId" metaData <- obj .: "metadata" let side x = GraphSideCorpus { corpusId: x, corpusLabel: "Publications", listId : listId'} let sides = side <$> corpusIds @@ -133,9 +137,10 @@ instance decodeJsonMetaData :: DecodeJson MetaData where title <- obj .: "title" legend <- obj .: "legend" corpusId <- obj .: "corpusId" - listId <- obj .: "listId" - version <- obj .: "version" - pure $ MetaData { title, legend, corpusId, listId, version} + list <- obj .: "list" + listId <- list .: "listId" + version <- list .: "version" + pure $ MetaData { title, legend, corpusId, list: {listId, version}} instance decodeJsonLegend :: DecodeJson Legend where diff --git a/src/Gargantext/Components/NgramsTable/Core.purs b/src/Gargantext/Components/NgramsTable/Core.purs index defbb567..82fc6e8c 100644 --- a/src/Gargantext/Components/NgramsTable/Core.purs +++ b/src/Gargantext/Components/NgramsTable/Core.purs @@ -15,6 +15,7 @@ module Gargantext.Components.NgramsTable.Core , findNgramTermList , Version , Versioned(..) + , VersionedNgramsPatches , VersionedNgramsTable , CoreState , highlightNgrams @@ -42,6 +43,7 @@ module Gargantext.Components.NgramsTable.Core , _parent , _root , commitPatch + , putNgramsPatches , syncPatches , addNewNgram ) @@ -507,6 +509,7 @@ applyPatchMap applyPatchValue (PatchMap p) = mapWithIndex f Just pv -> applyPatchValue pv v type NgramsPatches = PatchMap NgramsTerm NgramsPatch +type VersionedNgramsPatches = Versioned NgramsPatches type NewElems = Map NgramsTerm TermList @@ -618,7 +621,7 @@ addNewNgram ngrams list = { ngramsPatches: mempty , ngramsNewElems: Map.singleton ngrams list } -putNgramsPatches :: forall s. CoreParams s -> Versioned NgramsPatches -> Aff (Versioned NgramsPatches) +putNgramsPatches :: forall s. CoreParams s -> VersionedNgramsPatches -> Aff VersionedNgramsPatches putNgramsPatches {session, nodeId, listIds, tabType} = put session putNgrams where putNgrams = PutNgrams tabType (head listIds) Nothing (Just nodeId) -- 2.21.0