Commit 771e7ec0 authored by Alexandre Delanoë's avatar Alexandre Delanoë

[FEAT] Connecting Phylo 1 click with Frontend

parent 0afcba5e
......@@ -13,7 +13,7 @@ import Gargantext.Components.Bootstrap.Types (ComponentStatus(..))
import Gargantext.Components.Forest.Tree.Node.Action.Types (Action(..))
import Gargantext.Components.Forest.Tree.Node.Tools (formChoiceSafe, submitButton, panel)
import Gargantext.Components.PhyloExplorer.API as Phylo
import Gargantext.Components.PhyloExplorer.ConfigForm as PhyloForm
import Gargantext.Components.PhyloExplorer.Config.ConfigForm as PhyloForm
import Gargantext.Components.PhyloExplorer.ConfigFormParser as PhyloHook
import Gargantext.Config.REST (RESTError, AffRESTError)
import Gargantext.Routes as GR
......@@ -119,12 +119,12 @@ updateGraphCpt = here.component "updateGraph" cpt where
, callback: \val -> T.write_ val methodGraphNodeType1
, print: show } []
--}
, H.text "Ngrams ?"
, formChoiceSafe { items: [GT.CTabTerms, GT.CTabSources, GT.CTabAuthors, GT.CTabInstitutes]
, default: methodGraphNodeType2'
, callback: \val -> T.write_ val methodGraphNodeType2
, print: show } []
--}
{-
, H.text "Show Strong (expected) links or weak (maybe unexpected) links?"
......@@ -164,7 +164,8 @@ updatePhyloCpt = here.component "updatePhylo" cpt where
-- @NOTE #219: use a config property returned by GET phylo route
defaultData :: Phylo.UpdateData
defaultData = Phylo.UpdateData
{ proximity: 0.5
{ defaultMode: true
, proximity: 0.5
, synchrony: 0.5
, quality: 0.8
, exportFilter: 3.0
......
......@@ -116,7 +116,7 @@ settingsBox FolderPrivate =
, Annuaire
, NodeFrameWrite
, NodeFrameCalc
, NodeFrameNotebook
-- , NodeFrameNotebook
]
]
}
......@@ -130,7 +130,7 @@ settingsBox Team =
, Annuaire
, NodeFrameWrite
, NodeFrameCalc
, NodeFrameNotebook
-- , NodeFrameNotebook
, Team
, FolderShared
, NodeFrameVisio
......@@ -166,7 +166,7 @@ settingsBox Folder =
, Annuaire
, NodeFrameWrite
, NodeFrameCalc
, NodeFrameNotebook
-- , NodeFrameNotebook
]
, Move moveParameters
, Delete
......@@ -188,7 +188,7 @@ settingsBox Corpus =
, NodeFrameWrite
, NodeFrameCalc
, Phylo
, NodeFrameNotebook
-- , NodeFrameNotebook
]
, Link (linkParams Annuaire)
, Move moveParameters
......@@ -348,7 +348,7 @@ settingsBox NodeFrameNotebook =
, doc : Documentation NodeFrameNotebook
, buttons : [ Add [ NodeFrameCalc
, NodeFrameWrite
, NodeFrameNotebook
-- , NodeFrameNotebook
]
, Move moveFrameParameters
, Delete
......
......@@ -39,7 +39,8 @@ get session nodeId = request >>= (_ <#> parseToPhyloSet) >>> pure
----------------------------------------------------------
newtype UpdateData = UpdateData
{ proximity :: Number
{ defaultMode :: Boolean
, proximity :: Number
, synchrony :: Number
, quality :: Number
, timeUnit :: TimeUnit
......@@ -57,6 +58,9 @@ instance JSON.WriteForeign UpdateData where
where
rename
= Record.rename
(Proxy :: Proxy "defaultMode")
(Proxy :: Proxy "_sc_defaultMode")
>>> Record.rename
(Proxy :: Proxy "proximity")
(Proxy :: Proxy "_sc_phyloProximity")
>>> Record.rename
......
module Gargantext.Components.PhyloExplorer.ConfigForm
module Gargantext.Components.PhyloExplorer.Config.ConfigForm
( configForm
, FormData
) where
......@@ -13,6 +13,7 @@ import Gargantext.Components.Bootstrap as B
import Gargantext.Components.Bootstrap.Types (ButtonVariant(..), ComponentStatus(..), Variant(..))
import Gargantext.Components.PhyloExplorer.API (CliqueFilter(..), ReflexiveClique(..), ReflexiveTimeUnit(..))
import Gargantext.Hooks.FormValidation (VForm, useFormValidation)
import Gargantext.Components.Forest.Tree.Node.Tools (formChoiceSafe, panel)
import Gargantext.Hooks.FormValidation.Unboxed as FV
import Gargantext.Hooks.StateRecord (useStateRecord)
import Gargantext.Hooks.StateRecord.Behaviors (setter)
......@@ -61,394 +62,291 @@ component = R.hooksComponent "configForm" cpt where
Left err -> log3 "configForm validation error" state err
Right _ -> props.callback state
-- Render
pure $
H.form
{ className: "phylo-config-form" }
[
H.div
{ className: "phylo-config-form__group" }
[
H.div
{ className: "phylo-config-form__row" }
let modeChoice =
B.fieldset
{ className: "phylo-config-form__group"
, titleSlot: H.text "Mode Choice"
}
[
H.div
{ className: "phylo-config-form__col" }
{ className: "phylo-config-form__row" }
[
-- Proximity
H.div
{ className: intercalate " "
[ "form-group"
, (fv.hasError' "proximity") ?
"form-group--error" $
mempty
]
}
{ className: "phylo-config-form__col" }
[
-- Clique type
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Proximity" ]
]
,
H.div
{ className: "form-group__field" }
[
B.formInput $
{ type: "number"
} `merge` bindStateKey "proximity"
,
R2.when (fv.hasError' "proximity") $
H.div
{ className: "form-group__error" }
[
H.text "Please enter a `Double` value (eg. 0.5)"
{ className: intercalate " "
[ "form-group"
]
]
]
]
,
H.div
{ className: "phylo-config-form__col" }
[
-- Synchrony
H.div
{ className: intercalate " "
[ "form-group"
, (fv.hasError' "synchrony") ?
"form-group--error" $
mempty
]
}
[
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Synchrony" ]
]
,
H.div
{ className: "form-group__field" }
}
[
B.formInput $
{ type: "number"
} `merge` bindStateKey "synchrony"
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Easy or Advanced:" ]
]
,
R2.when (fv.hasError' "synchrony") $
H.div
{ className: "form-group__field" }
[
H.div
{ className: "form-group__error" }
{ className: "btn-group"
, role: "group"
}
[
H.text "Please enter a `Double` value (eg. 0.5)"
B.button
{ callback: \_ -> setter stateBox "defaultMode" $ show true
-- , variant: OutlinedButtonVariant Secondary
, variant: ButtonVariant Light
, className: state.cliqueType == show false ?
"active" $
""
}
[
H.text "Automatic"
]
,
B.button
{ callback: \_ -> setter stateBox "defaultMode" $ show false
-- , variant: OutlinedButtonVariant Secondary
, variant: ButtonVariant Light
, className: state.cliqueType == show true ?
"active" $
""
}
[
H.text "Expert"
]
]
]
]
]
]
]
,
H.div
{ className: "phylo-config-form__row" }
]
]
-- Render
let
form =
H.form
{ className: "phylo-config-form" }
[ H.div
{ className: "phylo-config-form__group" }
[
H.div
{ className: "phylo-config-form__col" }
{ className: "phylo-config-form__row" }
[
-- Quality
H.div
{ className: intercalate " "
[ "form-group"
, (fv.hasError' "quality") ?
"form-group--error" $
mempty
]
}
{ className: "phylo-config-form__col" }
[
-- Proximity
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Quality" ]
]
,
H.div
{ className: "form-group__field" }
[
B.formInput $
{ type: "number"
} `merge` bindStateKey "quality"
,
R2.when (fv.hasError' "quality") $
H.div
{ className: "form-group__error" }
[
H.text "Please enter a `Double` value (eg. 0.5)"
{ className: intercalate " "
[ "form-group"
, (fv.hasError' "proximity") ?
"form-group--error" $
mempty
]
]
]
]
,
H.div
{ className: "phylo-config-form__col" }
[
-- Export filter
H.div
{ className: intercalate " "
[ "form-group"
, (fv.hasError' "exportFilter") ?
"form-group--error" $
mempty
]
}
[
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Minimum branch size" ]
]
,
H.div
{ className: "form-group__field" }
}
[
B.formInput $
{ type: "number"
} `merge` bindStateKey "exportFilter"
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Proximity" ]
]
,
R2.when (fv.hasError' "exportFilter") $
H.div
{ className: "form-group__error" }
[
H.text "Please enter a `Double` value (eg. 3.0)"
]
H.div
{ className: "form-group__field" }
[
B.formInput $
{ type: "number"
} `merge` bindStateKey "proximity"
,
R2.when (fv.hasError' "proximity") $
H.div
{ className: "form-group__error" }
[
H.text "Please enter a `Double` value (eg. 0.5)"
]
]
]
]
]
]
]
,
-- Time Unit
B.fieldset
{ className: "phylo-config-form__group"
, titleSlot: H.text "Time unit"
}
[
H.div
{ className: "phylo-config-form__row" }
[
H.div
{ className: "phylo-config-form__col" }
[
-- Granularity
,
H.div
{ className: intercalate " "
[ "form-group"
]
}
{ className: "phylo-config-form__col" }
[
-- Synchrony
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Granularity" ]
]
,
H.div
{ className: "form-group__field" }
{ className: intercalate " "
[ "form-group"
, (fv.hasError' "synchrony") ?
"form-group--error" $
mempty
]
}
[
B.formSelect
(bindStateKey "granularity")
H.div
{ className: "form-group__label" }
[
H.option
{ value: show Year_ }
[ H.text "Year" ]
,
H.option
{ value: show Month_ }
[ H.text "Month" ]
,
H.option
{ value: show Week_ }
[ H.text "Week" ]
H.label {} [ H.text "Synchrony" ]
]
,
H.div
{ className: "form-group__field" }
[
B.formInput $
{ type: "number"
} `merge` bindStateKey "synchrony"
,
H.option
{ value: show Day_ }
[ H.text "Day" ]
R2.when (fv.hasError' "synchrony") $
H.div
{ className: "form-group__error" }
[
H.text "Please enter a `Double` value (eg. 0.5)"
]
]
]
]
]
,
H.div
{ className: "phylo-config-form__col" }
{ className: "phylo-config-form__row" }
[
-- Period
H.div
{ className: intercalate " "
[ "form-group"
, (fv.hasError' "period") ?
"form-group--error" $
mempty
]
}
{ className: "phylo-config-form__col" }
[
-- Quality
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Period" ]
]
,
H.div
{ className: "form-group__field" }
[
B.formInput $
{ type: "number"
} `merge` bindStateKey "period"
,
R2.when (fv.hasError' "period") $
H.div
{ className: "form-group__error" }
[
H.text "Please enter an `Int` value (eg. 3)"
{ className: intercalate " "
[ "form-group"
, (fv.hasError' "quality") ?
"form-group--error" $
mempty
]
]
]
,
-- Step
H.div
{ className: intercalate " "
[ "form-group"
, (fv.hasError' "step") ?
"form-group--error" $
mempty
]
}
[
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Step" ]
]
,
H.div
{ className: "form-group__field" }
}
[
B.formInput $
{ type: "number"
} `merge` bindStateKey "step"
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Quality" ]
]
,
R2.when (fv.hasError' "step") $
H.div
{ className: "form-group__error" }
[
H.text "Please enter an `Int` value (eg. 3)"
]
H.div
{ className: "form-group__field" }
[
B.formInput $
{ type: "number"
} `merge` bindStateKey "quality"
,
R2.when (fv.hasError' "quality") $
H.div
{ className: "form-group__error" }
[
H.text "Please enter a `Double` value (eg. 0.5)"
]
]
]
]
,
-- Matching frame
H.div
{ className: intercalate " "
[ "form-group"
, (fv.hasError' "matchingFrame") ?
"form-group--error" $
mempty
]
}
{ className: "phylo-config-form__col" }
[
-- Export filter
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Matching frame" ]
]
,
H.div
{ className: "form-group__field" }
{ className: intercalate " "
[ "form-group"
, (fv.hasError' "exportFilter") ?
"form-group--error" $
mempty
]
}
[
B.formInput $
{ type: "number"
} `merge` bindStateKey "matchingFrame"
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Minimum branch size" ]
]
,
R2.when (fv.hasError' "matchingFrame") $
H.div
{ className: "form-group__error" }
[
H.text "Please enter an `Int` value (eg. 3)"
]
H.div
{ className: "form-group__field" }
[
B.formInput $
{ type: "number"
} `merge` bindStateKey "exportFilter"
,
R2.when (fv.hasError' "exportFilter") $
H.div
{ className: "form-group__error" }
[
H.text "Please enter a `Double` value (eg. 3.0)"
]
]
]
]
]
]
]
,
-- Clique
B.fieldset
{ className: "phylo-config-form__group"
, titleSlot: H.text "Clique algorithm"
}
[
H.div
{ className: "phylo-config-form__row" }
,
-- Time Unit
B.fieldset
{ className: "phylo-config-form__group"
, titleSlot: H.text "Time unit"
}
[
H.div
{ className: "phylo-config-form__col" }
{ className: "phylo-config-form__row" }
[
-- Clique type
H.div
{ className: intercalate " "
[ "form-group"
]
}
{ className: "phylo-config-form__col" }
[
-- Granularity
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Type" ]
]
,
H.div
{ className: "form-group__field" }
{ className: intercalate " "
[ "form-group"
]
}
[
H.div
{ className: "btn-group"
, role: "group"
}
{ className: "form-group__label" }
[
B.button
{ callback: \_ -> setter stateBox "cliqueType" $ show FIS_
-- , variant: OutlinedButtonVariant Secondary
, variant: ButtonVariant Light
, className: state.cliqueType == show FIS_ ?
"active" $
""
}
[
H.text "FIS"
]
,
B.button
{ callback: \_ -> setter stateBox "cliqueType" $ show MaxClique_
-- , variant: OutlinedButtonVariant Secondary
, variant: ButtonVariant Light
, className: state.cliqueType == show MaxClique_ ?
"active" $
""
}
H.label {} [ H.text "Granularity" ]
]
,
H.div
{ className: "form-group__field" }
[
B.formSelect
(bindStateKey "granularity")
[
H.text "MaxClique"
H.option
{ value: show Year_ }
[ H.text "Year" ]
,
H.option
{ value: show Month_ }
[ H.text "Month" ]
,
H.option
{ value: show Week_ }
[ H.text "Week" ]
,
H.option
{ value: show Day_ }
[ H.text "Day" ]
]
]
]
]
]
,
-- TYPE::FIS_
R2.when (state.cliqueType == show FIS_) $
,
H.div
{ className: "phylo-config-form__col" }
[
-- Support
-- Period
H.div
{ className: intercalate " "
[ "form-group"
, (fv.hasError' "support") ?
, (fv.hasError' "period") ?
"form-group--error" $
mempty
]
......@@ -457,16 +355,17 @@ component = R.hooksComponent "configForm" cpt where
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Support" ]
H.label {} [ H.text "Period" ]
]
,
H.div
{ className: "form-group__field" }
[
B.formInput $
bindStateKey "support"
{ type: "number"
} `merge` bindStateKey "period"
,
R2.when (fv.hasError' "support") $
R2.when (fv.hasError' "period") $
H.div
{ className: "form-group__error" }
[
......@@ -475,11 +374,11 @@ component = R.hooksComponent "configForm" cpt where
]
]
,
-- Size
-- Step
H.div
{ className: intercalate " "
[ "form-group"
, (fv.hasError' "size") ?
, (fv.hasError' "step") ?
"form-group--error" $
mempty
]
......@@ -488,16 +387,17 @@ component = R.hooksComponent "configForm" cpt where
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Size" ]
H.label {} [ H.text "Step" ]
]
,
H.div
{ className: "form-group__field" }
[
B.formInput $
bindStateKey "size"
{ type: "number"
} `merge` bindStateKey "step"
,
R2.when (fv.hasError' "sjze") $
R2.when (fv.hasError' "step") $
H.div
{ className: "form-group__error" }
[
......@@ -505,19 +405,12 @@ component = R.hooksComponent "configForm" cpt where
]
]
]
]
,
-- TYPE::MaxClique_
R2.when (state.cliqueType == show MaxClique_) $
H.div
{ className: "phylo-config-form__col" }
[
-- Size
,
-- Matching frame
H.div
{ className: intercalate " "
[ "form-group"
, (fv.hasError' "size") ?
, (fv.hasError' "matchingFrame") ?
"form-group--error" $
mempty
]
......@@ -526,7 +419,7 @@ component = R.hooksComponent "configForm" cpt where
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Size" ]
H.label {} [ H.text "Matching frame" ]
]
,
H.div
......@@ -534,9 +427,9 @@ component = R.hooksComponent "configForm" cpt where
[
B.formInput $
{ type: "number"
} `merge` bindStateKey "size"
} `merge` bindStateKey "matchingFrame"
,
R2.when (fv.hasError' "size") $
R2.when (fv.hasError' "matchingFrame") $
H.div
{ className: "form-group__error" }
[
......@@ -544,94 +437,270 @@ component = R.hooksComponent "configForm" cpt where
]
]
]
,
-- Treshold
]
]
]
,
-- Clique
B.fieldset
{ className: "phylo-config-form__group"
, titleSlot: H.text "Clique algorithm"
}
[
H.div
{ className: "phylo-config-form__row" }
[
H.div
{ className: "phylo-config-form__col" }
[
-- Clique type
H.div
{ className: intercalate " "
[ "form-group"
, (fv.hasError' "threshold") ?
"form-group--error" $
mempty
]
}
[
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Treshold" ]
H.label {} [ H.text "Type" ]
]
,
H.div
{ className: "form-group__field" }
[
B.formInput $
{ type: "number"
} `merge` bindStateKey "threshold"
,
R2.when (fv.hasError' "threshold") $
H.div
{ className: "form-group__error" }
H.div
{ className: "btn-group"
, role: "group"
}
[
B.button
{ callback: \_ -> setter stateBox "cliqueType" $ show FIS_
-- , variant: OutlinedButtonVariant Secondary
, variant: ButtonVariant Light
, className: state.cliqueType == show FIS_ ?
"active" $
""
}
[
H.text "Please enter a `Double` value (eg. 0.5)"
H.text "FIS"
]
,
B.button
{ callback: \_ -> setter stateBox "cliqueType" $ show MaxClique_
-- , variant: OutlinedButtonVariant Secondary
, variant: ButtonVariant Light
, className: state.cliqueType == show MaxClique_ ?
"active" $
""
}
[
H.text "MaxClique"
]
]
]
]
,
-- Clique filter
]
,
-- TYPE::FIS_
R2.when (state.cliqueType == show FIS_) $
H.div
{ className: intercalate " "
[ "form-group"
{ className: "phylo-config-form__col" }
[
-- Support
H.div
{ className: intercalate " "
[ "form-group"
, (fv.hasError' "support") ?
"form-group--error" $
mempty
]
}
[
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Support" ]
]
}
,
H.div
{ className: "form-group__field" }
[
B.formInput $
bindStateKey "support"
,
R2.when (fv.hasError' "support") $
H.div
{ className: "form-group__error" }
[
H.text "Please enter an `Int` value (eg. 3)"
]
]
]
,
-- Size
H.div
{ className: intercalate " "
[ "form-group"
, (fv.hasError' "size") ?
"form-group--error" $
mempty
]
}
[
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Size" ]
]
,
H.div
{ className: "form-group__field" }
[
B.formInput $
bindStateKey "size"
,
R2.when (fv.hasError' "sjze") $
H.div
{ className: "form-group__error" }
[
H.text "Please enter an `Int` value (eg. 3)"
]
]
]
]
,
-- TYPE::MaxClique_
R2.when (state.cliqueType == show MaxClique_) $
H.div
{ className: "phylo-config-form__col" }
[
-- Size
H.div
{ className: "form-group__label" }
{ className: intercalate " "
[ "form-group"
, (fv.hasError' "size") ?
"form-group--error" $
mempty
]
}
[
H.label {} [ H.text "Filter type" ]
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Size" ]
]
,
H.div
{ className: "form-group__field" }
[
B.formInput $
{ type: "number"
} `merge` bindStateKey "size"
,
R2.when (fv.hasError' "size") $
H.div
{ className: "form-group__error" }
[
H.text "Please enter an `Int` value (eg. 3)"
]
]
]
,
-- Treshold
H.div
{ className: "form-group__field" }
{ className: intercalate " "
[ "form-group"
, (fv.hasError' "threshold") ?
"form-group--error" $
mempty
]
}
[
B.formSelect
( bindStateKey "cliqueFilter" )
H.div
{ className: "form-group__label" }
[
H.option
{ value: show ByThreshold }
[ H.text "By threshold" ]
H.label {} [ H.text "Treshold" ]
]
,
H.div
{ className: "form-group__field" }
[
B.formInput $
{ type: "number"
} `merge` bindStateKey "threshold"
,
H.option
{ value: show ByNeighbours }
[ H.text "By neighbours" ]
R2.when (fv.hasError' "threshold") $
H.div
{ className: "form-group__error" }
[
H.text "Please enter a `Double` value (eg. 0.5)"
]
]
]
,
-- Clique filter
H.div
{ className: intercalate " "
[ "form-group"
]
}
[
H.div
{ className: "form-group__label" }
[
H.label {} [ H.text "Filter type" ]
]
,
H.div
{ className: "form-group__field" }
[
B.formSelect
( bindStateKey "cliqueFilter" )
[
H.option
{ value: show ByThreshold }
[ H.text "By threshold" ]
,
H.option
{ value: show ByNeighbours }
[ H.text "By neighbours" ]
]
]
]
]
]
]
]
]
,
-- Submit
H.div { className: "phylo-config-form__submit" }
[
B.button
{ callback: \_ -> onSubmit
, status: props.status == Deferred ? Deferred $ Enabled
, variant: ButtonVariant Primary
, type: "submit"
}
let submit =
H.div { className: "phylo-config-form__submit" }
[
B.icon { name: "refresh" }
,
H.text $ nbsp 1
,
H.text "Update!"
B.button
{ callback: \_ -> onSubmit
, status: props.status == Deferred ? Deferred $ Enabled
, variant: ButtonVariant Primary
, type: "submit"
}
[
B.icon { name: "refresh" }
,
H.text $ nbsp 1
,
H.text "Update!"
]
]
]
]
pure $ H.div {} [ modeChoice
, R2.when (state.defaultMode == show false) form
, submit
]
type FormData =
( proximity :: String
( defaultMode :: String
, proximity :: String
, synchrony :: String
, quality :: String
, exportFilter :: String
......@@ -650,7 +719,8 @@ type FormData =
defaultData :: Record FormData
defaultData =
{ proximity : "1.0"
{ defaultMode : show true
, proximity : "1.0"
, synchrony : "1.0"
, quality : "1.0"
, exportFilter : "3.0"
......
......@@ -10,7 +10,7 @@ import Data.Maybe (Maybe(..))
import Data.Newtype (unwrap)
import Data.Number as Number
import Gargantext.Components.PhyloExplorer.API (Clique(..), CliqueFilter, ReflexiveClique(..), ReflexiveTimeUnit, TimeUnitCriteria(..), UpdateData(..), extractCriteria, fromReflexiveTimeUnit, toReflexiveTimeUnit)
import Gargantext.Components.PhyloExplorer.ConfigForm (FormData)
import Gargantext.Components.PhyloExplorer.Config.ConfigForm (FormData)
import Gargantext.Types (FrontendError(..))
import Gargantext.Utils (getter)
import Reactix as R
......@@ -49,7 +49,8 @@ toFormData :: UpdateData -> Record ()
toFormData nt =
let r = unwrap nt
in unsafeCoerce $
{ proximity:
{ defaultMode : show r.defaultMode
, proximity:
show r.proximity
, synchrony:
show r.synchrony
......@@ -85,6 +86,9 @@ toFormData nt =
fromFormData :: Record FormData -> Either String UpdateData
fromFormData r = do
-- Common params
defaultMode <-
read r.defaultMode `orDie` "Invalid defaultMode"
proximity <-
Number.fromString r.proximity `orDie` "Invalid proximity"
synchrony <-
......@@ -118,7 +122,8 @@ fromFormData r = do
-- Constructor
pure $ UpdateData
{ proximity
{ defaultMode
, proximity
, synchrony
, quality
, exportFilter
......
......@@ -7,6 +7,7 @@ import Effect.Console (log)
import Effect.Class (class MonadEffect, liftEffect)
import Effect.Exception (catchException, throwException)
import Effect.Unsafe (unsafePerformEffect)
import Data.Maybe (Maybe(..))
-- | JL: Astonishingly, not in the prelude
-- AD: recent Preludes in Haskell much prefer identity
......@@ -19,6 +20,12 @@ id a = a
class Read a where
read :: String -> Maybe a
instance Read Boolean where
read :: String -> Maybe Boolean
read "true" = Just true
read "false" = Just false
read _ = Nothing
logs:: forall message effect.
(MonadEffect effect)
=> Show message
......
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