diff --git a/src/Gargantext/Components/FacetsTable.purs b/src/Gargantext/Components/FacetsTable.purs index 5429783cb93f249d099f3959e3d9a1a548ca1a37..039a322bd4b19b0b48e3fac4fd1d820d911b9cd1 100644 --- a/src/Gargantext/Components/FacetsTable.purs +++ b/src/Gargantext/Components/FacetsTable.purs @@ -23,6 +23,7 @@ import Gargantext.Ends (url, Frontends) import Gargantext.Hooks.Loader (useLoader) import Gargantext.Components.DocsTable (Category(..), CategoryQuery(..), favCategory, decodeCategory, putCategories) import Gargantext.Components.Table as T +import Gargantext.Components.Search import Gargantext.Routes (SessionRoute(Search, NodeAPI)) import Gargantext.Routes as Routes import Gargantext.Sessions (Session, sessionId, post, deleteWithBody) @@ -32,29 +33,6 @@ import Gargantext.Utils.DecodeMaybe ((.|)) import Gargantext.Utils.Reactix as R2 ------------------------------------------------------------------------ -type TotalRecords = Int - --- Example: --- [["machine","learning"],["artificial","intelligence"]] --- This searches for documents with "machine learning" or "artificial intelligence" -type TextQuery = Array (Array String) - -newtype SearchQuery = SearchQuery { query :: TextQuery } - -instance encodeJsonSearchQuery :: EncodeJson SearchQuery where - encodeJson (SearchQuery {query}) - -- = "query" := query !! 0 -- TODO anoe - = "query" := concat query - ~> jsonEmptyObject - -newtype SearchResults = SearchResults { results :: Array Response } - -instance decodeSearchResults :: DecodeJson SearchResults where - decodeJson json = do - obj <- decodeJson json - results <- obj .: "results" - pure $ SearchResults {results} - type Props = ( chart :: R.Element , container :: Record T.TableContainerProps -> R.Element @@ -107,26 +85,6 @@ derive instance genericDocumentsView :: Generic DocumentsView _ instance showDocumentsView :: Show DocumentsView where show = genericShow -newtype Response = Response - { id :: Int - , created :: String - , hyperdata :: Hyperdata - , category :: Category - , ngramCount :: Int --- , date :: String --- , score :: Int --- , pairs :: Array Pair - } - -newtype Hyperdata = Hyperdata - { authors :: String - , title :: String - , source :: String - , publication_year :: Int - , publication_month :: Int - , publication_day :: Int - } - --instance decodeHyperdata :: DecodeJson Hyperdata where -- decodeJson json = do -- obj <- decodeJson json @@ -152,29 +110,6 @@ instance decodeHyperdata :: DecodeJson Hyperdata where publication_day <- obj .: "publication_day" pure $ Hyperdata { authors, title, source, publication_year, publication_month, publication_day } -{- -instance decodeResponse :: DecodeJson Response where - decodeJson json = do - obj <- decodeJson json - id <- obj .: "id" - -- date <- obj .: "date" -- TODO - date <- pure "2018" - score <- obj .: "score" - hyperdata <- obj .: "hyperdata" - pairs <- obj .: "pairs" - pure $ Response { id, date, score, hyperdata, pairs } --} - -instance decodeResponse :: DecodeJson Response where - decodeJson json = do - obj <- decodeJson json - id <- obj .: "id" - created <- obj .: "created" - hyperdata <- obj .: "hyperdata" - favorite <- obj .: "favorite" - --ngramCount <- obj .: "ngramCount" - let ngramCount = 1 - pure $ Response { id, created, hyperdata, category: decodeCategory favorite, ngramCount} -- | Main layout of the Documents Tab of a Corpus docView :: Record Props -> R.Element @@ -261,8 +196,8 @@ docViewGraphCpt = R.hooksComponent "FacetsDocViewGraph" cpt type PagePath = { nodeId :: Int , listId :: Int - , query :: TextQuery - , params :: T.Params + , query :: TextQuery + , params :: T.Params , session :: Session } @@ -270,34 +205,54 @@ initialPagePath :: {session :: Session, nodeId :: Int, listId :: Int, query :: T initialPagePath {session, nodeId, listId, query} = {session, nodeId, listId, query, params: T.initialParams} loadPage :: PagePath -> Aff (Array DocumentsView) -loadPage {session, nodeId, listId, query, params: {limit, offset, orderBy}} = do +loadPage {session, nodeId, listId, query, params: {limit, offset, orderBy, searchType}} = do let p = Search { listId, offset, limit, orderBy: convOrderBy <$> orderBy } (Just nodeId) - SearchResults res <- post session p $ SearchQuery {query} - pure $ res2corpus <$> res.results - where - res2corpus :: Response -> DocumentsView - res2corpus (Response { id, created: date, ngramCount: score, category - , hyperdata: Hyperdata {authors, title, source, publication_year, publication_month, publication_day} }) = - DocumentsView { id - , date - , title - , source - , score - , authors - , category - , pairs: [] - , delete: false - , publication_year - , publication_month - , publication_day - } - convOrderBy (T.ASC (T.ColumnName "Date")) = DateAsc - convOrderBy (T.DESC (T.ColumnName "Date")) = DateDesc - convOrderBy (T.ASC (T.ColumnName "Title")) = TitleAsc - convOrderBy (T.DESC (T.ColumnName "Title")) = TitleDesc - convOrderBy (T.ASC (T.ColumnName "Source")) = SourceAsc - convOrderBy (T.DESC (T.ColumnName "Source")) = SourceDesc - convOrderBy _ = DateAsc -- TODO + res <- post session p $ SearchQuery {query, expected:searchType} + pure $ res2corpus res + where + convOrderBy (T.ASC (T.ColumnName "Date")) = DateAsc + convOrderBy (T.DESC (T.ColumnName "Date")) = DateDesc + convOrderBy (T.ASC (T.ColumnName "Title")) = TitleAsc + convOrderBy (T.DESC (T.ColumnName "Title")) = TitleDesc + convOrderBy (T.ASC (T.ColumnName "Source")) = SourceAsc + convOrderBy (T.DESC (T.ColumnName "Source")) = SourceDesc + convOrderBy _ = DateAsc -- TODO + + +res2corpus :: SearchResult -> Array DocumentsView + +res2corpus :: Document -> DocumentsView +res2corpus (Document { id + , created: date + , score + , category + , hyperdata: HyperdataDocument { authors + , title + , source + , publication_year + , publication_month + , publication_day + } + } + ) = + DocumentsView { id + , date + , title + , source + , score + , authors + , category + , pairs: [] + , delete: false + , publication_year + , publication_month + , publication_day + } + + -- TODO Contact 2 view + + + type PageLayoutProps = ( frontends :: Frontends diff --git a/src/Gargantext/Components/Nodes/Corpus/Document.purs b/src/Gargantext/Components/Nodes/Corpus/Document.purs index ae8ff4c894cfcec2336ec453facf3b142d2f8c1f..5a105421d3e157d74eff322e86b93b53b1938d92 100644 --- a/src/Gargantext/Components/Nodes/Corpus/Document.purs +++ b/src/Gargantext/Components/Nodes/Corpus/Document.purs @@ -13,6 +13,7 @@ import Reactix as R import Thermite (PerformAction, Render, Spec, simpleSpec, createClass) import Gargantext.Components.AutoUpdate (autoUpdateElt) +import Gargantext.Components.Search (SearchType(..)) import Gargantext.Components.Node (NodePoly(..)) import Gargantext.Components.NgramsTable.Core ( CoreState, NgramsPatch(..), NgramsTerm, Replace, Versioned(..) @@ -389,7 +390,7 @@ loadData {session, nodeId, listIds, tabType} = do { session , nodeId , listIds - , params: { offset : 0, limit : 100, orderBy: Nothing} + , params: { offset : 0, limit : 100, orderBy: Nothing, searchType: SearchDoc} , tabType , searchQuery: "" , termListFilter: Nothing diff --git a/src/Gargantext/Components/Search.purs b/src/Gargantext/Components/Search.purs new file mode 100644 index 0000000000000000000000000000000000000000..e8c5b7e03f1b12683333a6b2f43fe013733e5792 --- /dev/null +++ b/src/Gargantext/Components/Search.purs @@ -0,0 +1,207 @@ +module Gargantext.Components.Search where + +------------------------------------------------------------------------ +import Data.Argonaut as Argonaut +import Data.Generic.Rep (class Generic) +import Data.Generic.Rep.Show (genericShow) +import Gargantext.Utils.Argonaut (genericSumDecodeJson, genericSumEncodeJson, genericEnumDecodeJson, genericEnumEncodeJson) +import Data.Maybe (Maybe(..)) +import Gargantext.Prelude (class Eq, class Read, class Show) + + +-- Example: +-- [["machine","learning"],["artificial","intelligence"]] +-- This searches for documents with "machine learning" or "artificial intelligence" +type TextQuery = Array (Array String) +------------------------------------------------------------------------ +data SearchType = SearchDoc | SearchContact + +derive instance eqSearchType :: Eq SearchType +derive instance genericSearchType :: Generic SearchType _ +instance showSearchType :: Show SearchType where + show = genericShow +instance decodeJsonSearchType :: Argonaut.DecodeJson SearchType where + decodeJson = genericSumDecodeJson +instance encodeJsonSearchType :: Argonaut.EncodeJson SearchType where + encodeJson = genericSumEncodeJson +------------------------------------------------------------------------ + +data SearchQuery = + SearchQuery { query :: String + , expected :: SearchType + } + +derive instance eqSearchQuery :: Eq SearchQuery +derive instance genericSearchQuery :: Generic SearchQuery _ +instance showSearchQuery :: Show SearchQuery where + show = genericShow +instance decodeJsonSearchQuery :: Argonaut.DecodeJson SearchQuery where + decodeJson = genericSumDecodeJson +instance encodeJsonSearchQuery :: Argonaut.EncodeJson SearchQuery where + encodeJson = genericSumEncodeJson + +------------------------------------------------------------------------ +data SearchResult = SearchResultDoc { docs :: Array Document} + | SearchResultContact { contacts :: Array Contact } + | SearchNoResult { message :: String } + +derive instance eqSearchResult :: Eq SearchResult +derive instance genericSearchResult :: Generic SearchResult _ +instance showSearchResult :: Show SearchResult where + show = genericShow +instance decodeJsonSearchResult :: Argonaut.DecodeJson SearchResult where + decodeJson = genericSumDecodeJson +instance encodeJsonSearchResult :: Argonaut.EncodeJson SearchResult where + encodeJson = genericSumEncodeJson + +------------------------------------------------------------------------ + +data Document = + Document { id :: Int + , created :: String + , title :: String + , hyperdata :: HyperdataDocument + , favorite :: Int + , score :: Number + } + +derive instance eqDocument :: Eq Document +derive instance genericDocument :: Generic Document _ +instance showDocument :: Show Document where + show = genericShow +instance decodeJsonDocument :: Argonaut.DecodeJson Document where + decodeJson = genericSumDecodeJson +instance encodeJsonDocument :: Argonaut.EncodeJson Document where + encodeJson = genericSumEncodeJson + +------------------------------------------------------------------------ +data HyperdataDocument = + HyperdataDocument { bdd :: Maybe String + , doi :: Maybe String + , url :: Maybe String + , uniqId :: Maybe String + , uniqIdBdd :: Maybe String + , page :: Maybe Int + , title :: Maybe String + , authors :: Maybe String + , institutes :: Maybe String + , source :: Maybe String + , abstract :: Maybe String + , publication_date :: Maybe String + , publication_year :: Maybe Int + , publication_month :: Maybe Int + , publication_day :: Maybe Int + , publication_hour :: Maybe Int + , publication_minute :: Maybe Int + , publication_second :: Maybe Int + , language_iso2 :: Maybe String + } + +derive instance eqHyperdataDocument :: Eq HyperdataDocument +derive instance genericHyperdataDocument :: Generic HyperdataDocument _ +instance showHyperdataDocument :: Show HyperdataDocument where + show = genericShow +instance decodeJsonHyperdataDocument :: Argonaut.DecodeJson HyperdataDocument where + decodeJson = genericSumDecodeJson +instance encodeJsonHyperdataDocument :: Argonaut.EncodeJson HyperdataDocument where + encodeJson = genericSumEncodeJson + +------------------------------------------------------------------------ +------------------------------------------------------------------------ +------------------------------------------------------------------------ +data Contact = + Contact { id :: Int + , created :: String + , hyperdata :: HyperdataContact + , score :: Number + } + +derive instance eqContact :: Eq Contact +derive instance genericContact :: Generic Contact _ +instance showContact :: Show Contact where + show = genericShow +instance decodeJsonContact :: Argonaut.DecodeJson Contact where + decodeJson = genericSumDecodeJson +instance encodeJsonContact :: Argonaut.EncodeJson Contact where + encodeJson = genericSumEncodeJson + + +data HyperdataContact = + HyperdataContact { bdd :: Maybe String + , who :: Maybe ContactWho + , "where" :: Array ContactWhere + , title :: Maybe String + , source :: Maybe String + , lastValidation :: Maybe String + , uniqIdBdd :: Maybe String + , uniqId :: Maybe String + } +derive instance eqHyperdataContact :: Eq HyperdataContact +derive instance genericHyperdataContact :: Generic HyperdataContact _ +instance showHyperdataContact :: Show HyperdataContact where + show = genericShow +instance decodeJsonHyperdataContact :: Argonaut.DecodeJson HyperdataContact where + decodeJson = genericSumDecodeJson +instance encodeJsonHyperdataContact :: Argonaut.EncodeJson HyperdataContact where + encodeJson = genericSumEncodeJson + +------- + +data ContactWho = + ContactWho { id :: Maybe String + , firstName :: Maybe String + , lastName :: Maybe String + , keywords :: Array String + , freetags :: Array String + } +derive instance eqContactWho :: Eq ContactWho +derive instance genericContactWho :: Generic ContactWho _ +instance showContactWho :: Show ContactWho where + show = genericShow +instance decodeJsonContactWho :: Argonaut.DecodeJson ContactWho where + decodeJson = genericSumDecodeJson +instance encodeJsonContactWho :: Argonaut.EncodeJson ContactWho where + encodeJson = genericSumEncodeJson + + + +data ContactWhere = + ContactWhere { organization :: Array String + , labTeamDepts :: Array String + + , role :: Maybe String + + , office :: Maybe String + , country :: Maybe String + , city :: Maybe String + + , touch :: Maybe ContactTouch + + , entry :: Maybe String + , exit :: Maybe String + } +derive instance eqContactWhere :: Eq ContactWhere +derive instance genericContactWhere :: Generic ContactWhere _ +instance showContactWhere :: Show ContactWhere where + show = genericShow +instance decodeJsonContactWhere :: Argonaut.DecodeJson ContactWhere where + decodeJson = genericSumDecodeJson +instance encodeJsonContactWhere :: Argonaut.EncodeJson ContactWhere where + encodeJson = genericSumEncodeJson + + +data ContactTouch = + ContactTouch { mail :: Maybe String + , phone :: Maybe String + , url :: Maybe String + } +derive instance eqContactTouch :: Eq ContactTouch +derive instance genericContactTouch :: Generic ContactTouch _ +instance showContactTouch :: Show ContactTouch where + show = genericShow +instance decodeJsonContactTouch :: Argonaut.DecodeJson ContactTouch where + decodeJson = genericSumDecodeJson +instance encodeJsonContactTouch :: Argonaut.EncodeJson ContactTouch where + encodeJson = genericSumEncodeJson + + diff --git a/src/Gargantext/Components/Table.purs b/src/Gargantext/Components/Table.purs index abdbd78d2a353b2d0e8746a88688f6b7a5856d9f..b35953a9906b8a4194969d233736b6936a28f977 100644 --- a/src/Gargantext/Components/Table.purs +++ b/src/Gargantext/Components/Table.purs @@ -13,6 +13,7 @@ import Reactix as R import Reactix.DOM.HTML as H import Gargantext.Utils.Reactix as R2 import Gargantext.Utils.Reactix (effectLink) +import Gargantext.Components.Search type TableContainerProps = ( pageSizeControl :: R.Element @@ -27,7 +28,11 @@ type Rows = L.List Row type OrderBy = Maybe (OrderByDirection ColumnName) -type Params = { offset :: Int, limit :: Int, orderBy :: OrderBy } +type Params = { offset :: Int + , limit :: Int + , orderBy :: OrderBy + , searchType :: SearchType + } newtype ColumnName = ColumnName String @@ -64,16 +69,17 @@ type State = { page :: Int , pageSize :: PageSizes , orderBy :: OrderBy + , searchType :: SearchType } paramsState :: Params -> State -paramsState {offset, limit, orderBy} = {pageSize, page, orderBy} +paramsState {offset, limit, orderBy, searchType} = {pageSize, page, orderBy, searchType} where pageSize = int2PageSizes limit page = offset / limit + 1 stateParams :: State -> Params -stateParams {pageSize, page, orderBy} = {offset, limit, orderBy} +stateParams {pageSize, page, orderBy, searchType} = {offset, limit, orderBy, searchType} where limit = pageSizes2Int pageSize offset = limit * (page - 1) @@ -87,7 +93,7 @@ type TableHeaderLayoutProps = ) initialParams :: Params -initialParams = stateParams {page: 1, pageSize: PS10, orderBy: Nothing} +initialParams = stateParams {page: 1, pageSize: PS10, orderBy: Nothing, searchType: SearchDoc} -- TODO: Not sure this is the right place for this tableHeaderLayout :: Record TableHeaderLayoutProps -> R.Element