Renameable.purs 3.23 KB
Newer Older
1 2 3 4 5 6 7
module Gargantext.Components.Renameable where

import Data.Tuple (Tuple(..), fst, snd)
import Data.Tuple.Nested ((/\))
import Effect (Effect)
import Reactix as R
import Reactix.DOM.HTML as H
8
import Toestand as T
9 10 11 12 13 14 15

import Gargantext.Prelude

import Gargantext.Components.InputWithEnter (inputWithEnter)
import Gargantext.Utils.Reactix as R2


16 17
here :: R2.Here
here = R2.here "Gargantext.Components.Renameable"
18 19 20 21

type RenameableProps =
  (
    onRename :: String -> Effect Unit
22
  , text     :: String
23 24
  )

25 26
renameable :: R2.Component RenameableProps
renameable = R.createElement renameableCpt
27 28

renameableCpt :: R.Component RenameableProps
29
renameableCpt = here.component "renameableCpt" cpt
30
  where
31 32 33
    cpt { onRename, text } _ = do
      isEditing <- T.useBox false
      state <- T.useBox text
34 35 36 37 38 39 40 41
      textRef <- R.useRef text

      -- handle props change of text
      R.useEffect1' text $ do
        if R.readRef textRef == text then
          pure unit
        else do
          R.setRef textRef text
42
          T.write_ text state
43 44

      pure $ H.div { className: "renameable" } [
45
        renameableText { isEditing, onRename, state } []
46 47 48 49
      ]

type RenameableTextProps =
  (
50 51 52
    isEditing :: T.Box Boolean
  , onRename  :: String -> Effect Unit
  , state     :: T.Box String
53 54
  )

55 56
renameableText :: R2.Component RenameableTextProps
renameableText = R.createElement renameableTextCpt
57 58

renameableTextCpt :: R.Component RenameableTextProps
59
renameableTextCpt = here.component "renameableText" cpt
60
  where
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
    cpt props@{ isEditing, state } _ = do
      isEditing' <- T.useLive T.unequal isEditing

      pure $ if isEditing' then
               notEditing props []
             else
               editing props []


notEditing :: R2.Component RenameableTextProps
notEditing = R.createElement notEditingCpt

notEditingCpt :: R.Component RenameableTextProps
notEditingCpt = here.component "notEditing" cpt
  where
    cpt props@{ isEditing, state } _ = do
      state' <- T.useLive T.unequal state

79 80
      pure $ H.div { className: "input-group" }
        [ H.input { className: "form-control"
81
                  , defaultValue: state'
82 83 84
                  , disabled: 1
                  , type: "text" }
        , H.div { className: "btn input-group-append"
85
                , on: { click: \_ -> T.write_ true isEditing } }
86 87 88
          [ H.span { className: "fa fa-pencil" } []
          ]
        ]
89 90 91 92 93 94 95 96 97 98 99


editing :: R2.Component RenameableTextProps
editing = R.createElement editingCpt

editingCpt :: R.Component RenameableTextProps
editingCpt = here.component "editing" cpt
  where
    cpt props@{ isEditing, onRename, state } _ = do
      state' <- T.useLive T.unequal state

100 101 102 103
      pure $ H.div { className: "input-group" }
        [ inputWithEnter {
            autoFocus: false
          , className: "form-control text"
104 105 106 107
          , defaultValue: state'
          , onBlur: \s -> T.write_ s state
          , onEnter: submit state'
          , onValueChanged: \s -> T.write_ s state
108 109 110 111 112 113 114 115 116
          , placeholder: ""
          , type: "text"
          }
        , H.div { className: "btn input-group-append"
                , on: { click: submit } }
          [ H.span { className: "fa fa-floppy-o" } []
          ]
        ]
      where
117 118
        submit text _ = do
          T.write_ false isEditing
119
          onRename text