Skip to content

Commit 7de59a3

Browse files
committed
Add onUpload, onRemove and onClick props to Upload
1 parent 512c9c7 commit 7de59a3

File tree

3 files changed

+113
-71
lines changed

3 files changed

+113
-71
lines changed

docs/Examples/Upload.example.purs

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ module Lumi.Components.Examples.Upload where
33
import Prelude
44

55
import Control.Coroutine.Aff (close, emit, produceAff)
6-
import Data.Array (head)
6+
import Data.Array as Array
77
import Data.Foldable (foldMap)
88
import Data.Int as Int
99
import Data.Maybe (Maybe(..), fromMaybe, maybe)
10+
import Data.Traversable (traverse_)
1011
import Effect (Effect)
1112
import Effect.Aff (Milliseconds(..), delay, launchAff_)
1213
import Effect.Aff.AVar (AVar)
@@ -17,11 +18,11 @@ import Effect.Random (randomRange)
1718
import Effect.Uncurried (runEffectFn2)
1819
import Lumi.Components.Button (button, primary) as Button
1920
import Lumi.Components.Column (column, column_)
21+
import Lumi.Components.Example (example)
2022
import Lumi.Components.Input as Input
2123
import Lumi.Components.LabeledField (labeledField, RequiredField(..))
2224
import Lumi.Components.Text (h2_)
2325
import Lumi.Components.Upload (FileId(..), FileName(..), UploadVariant(..), defaults, upload)
24-
import Lumi.Components.Example (example)
2526
import React.Basic (Component, JSX, createComponent, make)
2627
import React.Basic.DOM as R
2728
import React.Basic.DOM.Events (targetChecked)
@@ -35,9 +36,12 @@ component = createComponent "UploadExample"
3536
data Action
3637
= NoOp
3738
| SetReadonly Boolean
38-
| ImageEx (Array FileId)
39-
| FileEx (Array FileId)
40-
| AvatarEx (Maybe FileId)
39+
| NewImages (Array FileId)
40+
| RemoveImage FileId
41+
| NewFiles (Array FileId)
42+
| RemoveFile FileId
43+
| NewAvatar FileId
44+
| RemoveAvatar
4145
| StartUpload
4246
| InitializeUploadBuffer (AVar Unit)
4347

@@ -61,21 +65,34 @@ docs = unit # make component { initialState, didMount, render }
6165
SetReadonly readonly ->
6266
self.setState _ { readonly = readonly }
6367

64-
ImageEx value ->
68+
NewImages value ->
69+
self.setStateThen
70+
(\s -> s { images = Array.nub (s.images <> value) })
71+
$ debug "value:" value
72+
73+
RemoveImage value ->
6574
self.setStateThen
66-
(_ { images = value })
75+
(\s -> s { images = Array.delete value s.images })
6776
$ debug "value:" value
6877

69-
FileEx value ->
78+
NewFiles value ->
7079
self.setStateThen
71-
(_ { files = value })
80+
(\s -> s { files = Array.nub (s.files <> value) })
7281
$ debug "value:" value
7382

74-
AvatarEx value ->
83+
RemoveFile value ->
7584
self.setStateThen
76-
(_ { avatar = value })
85+
(\s -> s { files = Array.delete value s.files })
7786
$ debug "value:" value
7887

88+
NewAvatar value ->
89+
self.setStateThen
90+
(_ { avatar = Just value })
91+
$ debug "value:" value
92+
93+
RemoveAvatar ->
94+
self.setState _{ avatar = Nothing }
95+
7996
StartUpload -> do
8097
launchAff_ do
8198
maybe
@@ -113,7 +130,8 @@ docs = unit # make component { initialState, didMount, render }
113130
[ upload defaults
114131
{ value = self.state.images
115132
, variant = Images
116-
, onChange = send self <<< ImageEx
133+
, onUpload = send self <<< NewImages
134+
, onRemove = Just <<< send self <<< RemoveImage
117135
, readonly = self.state.readonly
118136
, backend =
119137
{ fetch: \id@(FileId name) ->
@@ -133,7 +151,9 @@ docs = unit # make component { initialState, didMount, render }
133151
[ upload defaults
134152
{ value = self.state.files
135153
, variant = Files
136-
, onChange = send self <<< FileEx
154+
, onUpload = send self <<< NewFiles
155+
, onRemove = Just <<< send self <<< RemoveFile
156+
, onClick = \(FileId id) -> Just $ log id
137157
, readonly = self.state.readonly
138158
, backend =
139159
{ fetch: \id@(FileId name) ->
@@ -159,7 +179,8 @@ docs = unit # make component { initialState, didMount, render }
159179
[ upload defaults
160180
{ value = maybe [] pure self.state.avatar
161181
, variant = Avatar
162-
, onChange = send self <<< AvatarEx <<< head
182+
, onUpload = traverse_ (send self <<< NewAvatar) <<< Array.head
183+
, onRemove = \_ -> Just $ send self RemoveAvatar
163184
, readonly = self.state.readonly
164185
, backend =
165186
{ fetch: \id@(FileId name) -> do
@@ -178,7 +199,8 @@ docs = unit # make component { initialState, didMount, render }
178199
[ upload defaults
179200
{ value = maybe [] pure self.state.avatar
180201
, variant = Logo
181-
, onChange = send self <<< AvatarEx <<< head
202+
, onUpload = traverse_ (send self <<< NewAvatar) <<< Array.head
203+
, onRemove = \_ -> Just $ send self RemoveAvatar
182204
, readonly = self.state.readonly
183205
, backend =
184206
{ fetch: \id@(FileId name) -> do

src/Lumi/Components/Form.purs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ import Lumi.Components.Column (column)
8181
import Lumi.Components.FetchCache as FetchCache
8282
import Lumi.Components.Form.Defaults (formDefaults) as Defaults
8383
import Lumi.Components.Form.Internal (Forest, FormBuilder'(..), FormBuilder, SeqFormBuilder, Tree(..), formBuilder, formBuilder_, invalidate, pruneTree, sequential)
84-
import Lumi.Components.Form.Internal (Forest(..), FormBuilder', FormBuilder, SeqFormBuilder', SeqFormBuilder, formBuilder, formBuilder_, invalidate, listen, parallel, revalidate, sequential) as Internal
84+
import Lumi.Components.Form.Internal (Forest, FormBuilder', FormBuilder, SeqFormBuilder', SeqFormBuilder, Tree(..), formBuilder, formBuilder_, invalidate, listen, parallel, revalidate, sequential) as Internal
8585
import Lumi.Components.Form.Validation (setModified)
8686
import Lumi.Components.Form.Validation (Validated(..), Validator, _Validated, fromValidated, mustBe, mustEqual, nonEmpty, nonEmptyArray, nonNull, validNumber, validInt, validDate, optional, setFresh, setModified, validated, warn) as Validation
8787
import Lumi.Components.Input (alignToInput)
@@ -520,7 +520,8 @@ file opts = formBuilder_ \{ readonly } value onChange ->
520520
Upload.upload Upload.defaults
521521
{ value = value
522522
, variant = opts.variant
523-
, onChange = onChange
523+
, onUpload = \ids -> onChange $ value <> ids
524+
, onRemove = \id -> Just $ onChange $ Array.delete id value
524525
, readonly = readonly
525526
, backend = opts.backend
526527
}

0 commit comments

Comments
 (0)