@@ -18,13 +18,15 @@ module Functora.Miso.Widgets.Field
18
18
)
19
19
where
20
20
21
+ import qualified Data.Text as T
21
22
import qualified Functora.Miso.Css as Css
22
23
import qualified Functora.Miso.Jsm as Jsm
23
24
import Functora.Miso.Prelude
24
25
import Functora.Miso.Types
25
26
import qualified Functora.Miso.Widgets.Dialog as Dialog
26
27
import qualified Functora.Miso.Widgets.Grid as Grid
27
28
import qualified Functora.Miso.Widgets.Qr as Qr
29
+ import qualified Functora.Prelude as Prelude
28
30
import qualified Language.Javascript.JSaddle as JS
29
31
import qualified Material.Button as Button
30
32
import qualified Material.IconButton as IconButton
@@ -123,7 +125,7 @@ data ViewerArgs model action t f = ViewerArgs
123
125
data ViewerOpts model = ViewerOpts
124
126
{ viewerOptsQrOptic :: Maybe (ATraversal' model OpenedOrClosed ),
125
127
viewerOptsTruncateOptic :: Maybe (ATraversal' model OpenedOrClosed ),
126
- viewerOptsTruncateLimit :: Natural
128
+ viewerOptsTruncateLimit :: Int
127
129
}
128
130
deriving stock (Generic )
129
131
@@ -770,19 +772,18 @@ fieldViewer ::
770
772
ViewerArgs model action t f ->
771
773
ViewerOpts model ->
772
774
[View action ]
773
- fieldViewer args _ =
775
+ fieldViewer args opts =
774
776
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
778
780
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
782
784
where
783
785
value = args ^. # viewerArgsModel . viewerArgsOptic args
784
786
input = fold1 $ value ^. # fieldInput
785
- action = args ^. # viewerArgsAction
786
787
787
788
header :: MisoString -> [View action ]
788
789
header txt =
@@ -801,11 +802,11 @@ header txt =
801
802
genericFieldViewer ::
802
803
( Foldable1 f
803
804
) =>
804
- (( model -> JSM model ) -> action ) ->
805
- Field t f ->
805
+ ViewerArgs model action t f ->
806
+ ViewerOpts model ->
806
807
(MisoString -> View action ) ->
807
808
[View action ]
808
- genericFieldViewer action value widget =
809
+ genericFieldViewer args opts widget =
809
810
if input == mempty
810
811
then mempty
811
812
else
@@ -828,7 +829,8 @@ genericFieldViewer action value widget =
828
829
]
829
830
]
830
831
[ div_ mempty
831
- $ [ widget $ toMisoString input
832
+ $ [ widget
833
+ $ truncateFieldViewer (args ^. # viewerArgsModel) opts input
832
834
]
833
835
<> ( if not allowCopy
834
836
then mempty
@@ -854,5 +856,34 @@ genericFieldViewer action value widget =
854
856
]
855
857
]
856
858
where
859
+ value = args ^. # viewerArgsModel . viewerArgsOptic args
857
860
input = fold1 $ value ^. # fieldInput
861
+ action = args ^. # viewerArgsAction
858
862
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