Skip to content

Commit c9294aa

Browse files
committed
can truncate field viewer
1 parent c66f778 commit c9294aa

File tree

1 file changed

+44
-13
lines changed
  • ghcjs/miso-widgets/src/Functora/Miso/Widgets

1 file changed

+44
-13
lines changed

ghcjs/miso-widgets/src/Functora/Miso/Widgets/Field.hs

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,15 @@ module Functora.Miso.Widgets.Field
1818
)
1919
where
2020

21+
import qualified Data.Text as T
2122
import qualified Functora.Miso.Css as Css
2223
import qualified Functora.Miso.Jsm as Jsm
2324
import Functora.Miso.Prelude
2425
import Functora.Miso.Types
2526
import qualified Functora.Miso.Widgets.Dialog as Dialog
2627
import qualified Functora.Miso.Widgets.Grid as Grid
2728
import qualified Functora.Miso.Widgets.Qr as Qr
29+
import qualified Functora.Prelude as Prelude
2830
import qualified Language.Javascript.JSaddle as JS
2931
import qualified Material.Button as Button
3032
import qualified Material.IconButton as IconButton
@@ -123,7 +125,7 @@ data ViewerArgs model action t f = ViewerArgs
123125
data ViewerOpts model = ViewerOpts
124126
{ viewerOptsQrOptic :: Maybe (ATraversal' model OpenedOrClosed),
125127
viewerOptsTruncateOptic :: Maybe (ATraversal' model OpenedOrClosed),
126-
viewerOptsTruncateLimit :: Natural
128+
viewerOptsTruncateLimit :: Int
127129
}
128130
deriving stock (Generic)
129131

@@ -770,19 +772,18 @@ fieldViewer ::
770772
ViewerArgs model action t f ->
771773
ViewerOpts model ->
772774
[View action]
773-
fieldViewer args _ =
775+
fieldViewer args opts =
774776
case value ^. #fieldType of
775-
FieldTypeNumber -> genericFieldViewer action value text
776-
FieldTypePercent -> genericFieldViewer action value $ text . (<> "%")
777-
FieldTypeText -> genericFieldViewer action value text
777+
FieldTypeNumber -> genericFieldViewer args opts text
778+
FieldTypePercent -> genericFieldViewer args opts $ text . (<> "%")
779+
FieldTypeText -> genericFieldViewer args opts text
778780
FieldTypeTitle -> header input
779-
FieldTypeHtml -> genericFieldViewer action value rawHtml
780-
FieldTypePassword -> genericFieldViewer action value $ const "*****"
781-
FieldTypeQrCode -> Qr.qr input <> genericFieldViewer action value text
781+
FieldTypeHtml -> genericFieldViewer args opts rawHtml
782+
FieldTypePassword -> genericFieldViewer args opts $ const "*****"
783+
FieldTypeQrCode -> Qr.qr input <> genericFieldViewer args opts text
782784
where
783785
value = args ^. #viewerArgsModel . viewerArgsOptic args
784786
input = fold1 $ value ^. #fieldInput
785-
action = args ^. #viewerArgsAction
786787

787788
header :: MisoString -> [View action]
788789
header txt =
@@ -801,11 +802,11 @@ header txt =
801802
genericFieldViewer ::
802803
( Foldable1 f
803804
) =>
804-
((model -> JSM model) -> action) ->
805-
Field t f ->
805+
ViewerArgs model action t f ->
806+
ViewerOpts model ->
806807
(MisoString -> View action) ->
807808
[View action]
808-
genericFieldViewer action value widget =
809+
genericFieldViewer args opts widget =
809810
if input == mempty
810811
then mempty
811812
else
@@ -828,7 +829,8 @@ genericFieldViewer action value widget =
828829
]
829830
]
830831
[ div_ mempty
831-
$ [ widget $ toMisoString input
832+
$ [ widget
833+
$ truncateFieldViewer (args ^. #viewerArgsModel) opts input
832834
]
833835
<> ( if not allowCopy
834836
then mempty
@@ -854,5 +856,34 @@ genericFieldViewer action value widget =
854856
]
855857
]
856858
where
859+
value = args ^. #viewerArgsModel . viewerArgsOptic args
857860
input = fold1 $ value ^. #fieldInput
861+
action = args ^. #viewerArgsAction
858862
allowCopy = value ^. #fieldAllowCopy
863+
864+
truncateFieldViewer :: model -> ViewerOpts model -> MisoString -> MisoString
865+
truncateFieldViewer st opts raw =
866+
if limit >= 0 && state == Closed
867+
then truncateFieldViewer' limit raw
868+
else raw
869+
where
870+
limit =
871+
opts ^. #viewerOptsTruncateLimit
872+
state =
873+
fromMaybe Closed
874+
$ st
875+
^? maybe
876+
(to $ const Closed)
877+
cloneTraversal
878+
(viewerOptsTruncateOptic opts)
879+
880+
truncateFieldViewer' :: Int -> MisoString -> MisoString
881+
truncateFieldViewer' limit raw =
882+
if T.length full <= limit
883+
then raw
884+
else toMisoString $ T.take half full <> "..." <> T.takeEnd half full
885+
where
886+
full :: Prelude.Text
887+
full = fromMisoString raw
888+
half :: Int
889+
half = limit `div` 2

0 commit comments

Comments
 (0)