Skip to content

Commit 485f7d4

Browse files
Update for Halogen 6 and PureScript 0.14 (#73)
1 parent b4c961c commit 485f7d4

34 files changed

+328
-556
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: CI
22

3-
on:
3+
on:
44
push:
55
branches: [main]
66
pull_request:
@@ -11,13 +11,10 @@ jobs:
1111

1212
steps:
1313
- uses: actions/checkout@v2
14-
- uses: thomashoneyman/setup-purescript@main
14+
- uses: purescript-contrib/setup-purescript@main
1515

1616
- name: Build source
1717
run: spago build
1818

19-
- name: Run tests
20-
run: spago test
21-
2219
- name: Build examples
2320
run: spago -x example/example.dhall build

example/App/Home.purs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ render =
3030

3131
-- Component
3232

33-
component :: H.Component HH.HTML (Const Void) Unit Void Aff
33+
component :: H.Component (Const Void) Unit Void Aff
3434
component = H.mkComponent
3535
{ initialState: const unit
3636
, render: const render

example/App/UI/Dropdown.purs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import Prelude
55
import DOM.HTML.Indexed (HTMLbutton)
66
import Data.Array (difference, mapWithIndex, length, (!!))
77
import Data.Maybe (Maybe(..), fromMaybe)
8-
import Data.Symbol (SProxy(..))
98
import Data.Traversable (for_)
109
import Effect.Aff.Class (class MonadAff)
1110
import Example.App.UI.Element (class_)
@@ -15,17 +14,18 @@ import Halogen as H
1514
import Halogen.HTML as HH
1615
import Select as Select
1716
import Select.Setters as Setters
17+
import Type.Proxy (Proxy(..))
1818

1919
type Slot item =
2020
H.Slot (Select.Query Query ()) (Message item)
2121

22-
_dropdown = SProxy :: SProxy "dropdown"
22+
_dropdown = Proxy :: Proxy "dropdown"
2323

24-
data Query a
24+
data Query a
2525
= Clear a
2626

2727
clear :: Select.Query Query () Unit
28-
clear = Select.Query (H.tell Clear)
28+
clear = Select.Query (H.mkTell Clear)
2929

3030
type State item =
3131
( selected :: Maybe item
@@ -55,15 +55,15 @@ data Message item
5555
= Selected item
5656
| Cleared
5757

58-
spec
58+
spec
5959
:: forall item m i
60-
. MonadAff m
60+
. MonadAff m
6161
=> ToText item
6262
=> Eq item
6363
=> Select.Spec (State item) Query Void () i (Message item) m
6464
spec = Select.defaultSpec
65-
{ render = render
66-
, handleQuery = handleQuery
65+
{ render = render
66+
, handleQuery = handleQuery
6767
, handleEvent = handleEvent
6868
}
6969
where
@@ -87,7 +87,7 @@ spec = Select.defaultSpec
8787
H.modify_ _
8888
{ selected = Just item
8989
, available = difference st.items [ item ]
90-
, visibility = Select.Off
90+
, visibility = Select.Off
9191
}
9292
H.raise (Selected item)
9393
_ -> pure unit
@@ -117,13 +117,13 @@ menu st =
117117
[ if st.visibility == Select.Off then HH.text "" else
118118
HH.div
119119
(Setters.setContainerProps [ class_ "dropdown-content" ])
120-
(mapWithIndex
120+
(mapWithIndex
121121
(\ix item ->
122122
HH.span
123123
(Setters.setItemProps ix case Just ix == st.highlightedIndex of
124-
true ->
124+
true ->
125125
[ class_ "dropdown-item has-background-link has-text-white-bis" ]
126-
_ ->
126+
_ ->
127127
[ class_ "dropdown-item" ]
128128
)
129129
[ HH.text (toText item) ]

example/App/UI/Element.purs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import Prelude
55
import DOM.HTML.Indexed (HTMLa, HTMLbutton, HTMLinput, HTMLtextarea)
66
import DOM.HTML.Indexed.InputType (InputType(..))
77
import Data.Either (Either(..), either)
8-
import Data.Maybe (Maybe(..), maybe)
8+
import Data.Maybe (maybe)
99
import Data.Newtype (class Newtype)
10-
import Data.Symbol (class IsSymbol, SProxy(..))
10+
import Data.Symbol (class IsSymbol)
1111
import Data.Variant (Variant)
1212
import Example.App.Validation (class ToText, toText)
1313
import Example.App.Validation as V
@@ -18,6 +18,7 @@ import Halogen.HTML.Events as HE
1818
import Halogen.HTML.Properties as HP
1919
import Prim.Row (class Cons)
2020
import Record.Builder as Builder
21+
import Type.Proxy (Proxy(..))
2122
import Web.Event.Event (Event)
2223
import Web.UIEvent.FocusEvent (FocusEvent)
2324

@@ -125,11 +126,12 @@ type FieldConfig' =
125126

126127
-- Provide a label, help text, placeholder, and symbol to have Formless wire everything
127128
-- up on your behalf.
129+
type FieldConfig :: Symbol -> Type
128130
type FieldConfig sym =
129131
{ label :: String
130132
, help :: String
131133
, placeholder :: String
132-
, sym :: SProxy sym
134+
, sym :: Proxy sym
133135
}
134136

135137
input :: forall i p. FieldConfig' -> Array (HH.IProp HTMLinput p) -> HH.HTML i p
@@ -148,8 +150,8 @@ textarea config props =
148150
field
149151
{ label: config.label, help: config.help }
150152
[ HH.textarea $
151-
[ config.help # either
152-
(const $ class_ "textarea is-danger")
153+
[ config.help # either
154+
(const $ class_ "textarea is-danger")
153155
(const $ class_ "textarea")
154156
, HP.placeholder config.placeholder
155157
] <> props
@@ -177,14 +179,14 @@ formlessField
177179
formlessField fieldType config state = fieldType (Builder.build config' config) props
178180
where
179181
config' =
180-
Builder.delete (SProxy :: SProxy "sym")
181-
>>> Builder.modify (SProxy :: SProxy "help") (const help')
182+
Builder.delete (Proxy :: Proxy "sym")
183+
>>> Builder.modify (Proxy :: Proxy "help") (const help')
182184

183-
help' =
185+
help' =
184186
maybe (Right config.help) (Left <<< toText) (F.getError config.sym state.form)
185187

186188
props =
187189
[ HP.value (F.getInput config.sym state.form)
188-
, HE.onValueInput (Just <<< F.setValidate config.sym)
190+
, HE.onValueInput (F.setValidate config.sym)
189191
]
190192

example/App/UI/Typeahead.purs

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import Prelude
55
import Data.Array (difference, filter, length, (:), (!!))
66
import Data.Maybe (Maybe(..))
77
import Data.String as String
8-
import Data.Symbol (SProxy(..))
98
import Effect.Aff.Class (class MonadAff)
109
import Example.App.UI.Dropdown as Dropdown
1110
import Example.App.UI.Element (class_)
@@ -16,13 +15,14 @@ import Halogen.HTML.Events as HE
1615
import Halogen.HTML.Properties as HP
1716
import Select as Select
1817
import Select.Setters as Setters
18+
import Type.Proxy (Proxy(..))
1919

2020
type Slot f item =
2121
H.Slot (Select.Query (Query item) ()) (Message f item)
2222

23-
_typeahead = SProxy :: SProxy "typeahead"
24-
_typeaheadSingle = SProxy :: SProxy "typeaheadSingle"
25-
_typeaheadMulti = SProxy :: SProxy "typeaheadMulti"
23+
_typeahead = Proxy :: Proxy "typeahead"
24+
_typeaheadSingle = Proxy :: Proxy "typeaheadSingle"
25+
_typeaheadMulti = Proxy :: Proxy "typeaheadMulti"
2626

2727
data Query item a
2828
= GetAvailableItems (Array item -> a)
@@ -35,10 +35,10 @@ clear :: forall item. Select.Query (Query item) () Unit
3535
clear = Select.Query (Clear unit)
3636

3737
data Action item
38-
= Remove item
38+
= Remove item
3939

4040
remove :: forall item. item -> Select.Action (Action item)
41-
remove = Select.Action <<< Remove
41+
remove = Select.Action <<< Remove
4242

4343
type State f item =
4444
( items :: Array item
@@ -64,7 +64,7 @@ input { items, placeholder } =
6464
, placeholder
6565
}
6666

67-
data Message f item
67+
data Message (f :: Type -> Type) item
6868
= SelectionsChanged (f item)
6969

7070
----------
@@ -85,18 +85,18 @@ single = spec' (\i av -> const (av !! i)) (const $ const Nothing) filter' render
8585
render st = case st.selected of
8686
Just item ->
8787
HH.div
88-
[ if st.visibility == Select.On
89-
then class_ "dropdown is-active"
88+
[ if st.visibility == Select.On
89+
then class_ "dropdown is-active"
9090
else class_ "dropdown is-flex" ]
91-
[ Dropdown.toggle
92-
[ HE.onClick \_ -> Just $ remove item ]
91+
[ Dropdown.toggle
92+
[ HE.onClick \_ -> remove item ]
9393
st
9494
, Dropdown.menu st
9595
]
9696
Nothing ->
9797
HH.div
98-
[ if st.visibility == Select.On
99-
then class_ "dropdown is-flex is-active"
98+
[ if st.visibility == Select.On
99+
then class_ "dropdown is-flex is-active"
100100
else class_ "dropdown is-flex" ]
101101
[ HH.input
102102
( Setters.setInputProps
@@ -123,27 +123,27 @@ multi = spec' selectByIndex (filter <<< (/=)) difference render
123123
render st =
124124
HH.div_
125125
[ HH.div
126-
[ if length st.selected > 0
127-
then class_ "panel is-marginless"
128-
else class_ "panel is-hidden"
126+
[ if length st.selected > 0
127+
then class_ "panel is-marginless"
128+
else class_ "panel is-hidden"
129129
]
130130
(st.selected <#> \i ->
131131
HH.div
132132
[ class_ "panel-block has-background-white"
133-
, HE.onClick \_ -> Just $ remove i
133+
, HE.onClick \_ -> remove i
134134
]
135135
[ HH.text $ toText i ]
136136
)
137137
, HH.div
138-
[ if st.visibility == Select.On
139-
then class_ "dropdown is-flex is-active"
140-
else class_ "dropdown is-flex"
138+
[ if st.visibility == Select.On
139+
then class_ "dropdown is-flex is-active"
140+
else class_ "dropdown is-flex"
141141
]
142142
[ HH.input
143-
(Setters.setInputProps
143+
(Setters.setInputProps
144144
[ class_ "input"
145145
, HP.placeholder st.placeholder
146-
, HP.value st.search
146+
, HP.value st.search
147147
]
148148
)
149149
, Dropdown.menu st
@@ -163,12 +163,12 @@ spec'
163163
=> (Int -> Array item -> f item -> f item)
164164
-> (item -> f item -> f item)
165165
-> (Array item -> f item -> Array item)
166-
-> (Select.State (State f item)
166+
-> (Select.State (State f item)
167167
-> H.ComponentHTML (Select.Action (Action item)) () m
168168
)
169169
-> Select.Spec (State f item) (Query item) (Action item) () i (Message f item) m
170170
spec' select' remove' filter' render' = Select.defaultSpec
171-
{ render = render'
171+
{ render = render'
172172
, handleEvent = handleEvent
173173
, handleQuery = handleQuery
174174
, handleAction = handleAction
@@ -183,7 +183,7 @@ spec' select' remove' filter' render' = Select.defaultSpec
183183
Select.Selected ix -> do
184184
st <- H.get
185185
let selected' = select' ix st.available st.selected
186-
H.modify_ _
186+
H.modify_ _
187187
{ selected = selected'
188188
, available = filter' st.available selected'
189189
, visibility = Select.Off
@@ -209,6 +209,6 @@ spec' select' remove' filter' render' = Select.defaultSpec
209209
let selected' = remove' item st.selected
210210
H.modify_ _
211211
{ selected = selected'
212-
, available = filter' st.items selected'
212+
, available = filter' st.items selected'
213213
}
214214
H.raise (SelectionsChanged selected')

example/App/Validation.purs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import Prelude
44

55
import Data.Either (Either(..))
66
import Data.Foldable (length) as Foldable
7-
import Data.Generic.Rep (class Generic)
8-
import Data.Generic.Rep.Show (genericShow)
97
import Data.Int (fromString) as Int
108
import Data.Lens (preview)
119
import Data.Maybe (Maybe, maybe)
@@ -27,10 +25,6 @@ data FieldError
2725
| NotEqual String String
2826
| NotEnoughMoney
2927

30-
derive instance genericFieldError :: Generic FieldError _
31-
instance showFieldError :: Show FieldError where
32-
show = genericShow
33-
3428
instance toTextFieldError :: ToText FieldError where
3529
toText EmptyField = "This field is required."
3630
toText InvalidEmail = "That email is not valid."
@@ -119,4 +113,4 @@ enoughMoney = Validation \_ i -> do
119113
_ <- liftAff $ delay $ Milliseconds 5000.0
120114
pure $ if (i > 1000)
121115
then Left NotEnoughMoney
122-
else pure i
116+
else pure i

0 commit comments

Comments
 (0)