@@ -81,12 +81,10 @@ todoMVC = el "div" $ do
81
81
mainHeader
82
82
rec tasks <- foldDyn ($) initialTasks $ mergeWith (.)
83
83
[ fmap insertNew_ newTask
84
- , modifyTasks
85
84
, listModifyTasks
86
85
, fmap (const $ Map. filter $ not . taskCompleted) clearCompleted -- Call out the type and purpose of these things
87
86
]
88
- (modifyTasks, newTask) <- el " header" $
89
- (,) <$> toggleAll tasks <*> taskEntry
87
+ newTask <- taskEntry
90
88
listModifyTasks <- taskList activeFilter tasks
91
89
(activeFilter, clearCompleted) <- controls tasks
92
90
return ()
@@ -107,25 +105,6 @@ stripDescription d =
107
105
keyCodeIs :: Key -> KeyCode -> Bool
108
106
keyCodeIs k c = keyCodeLookup c == k
109
107
110
- toggleAll
111
- :: ( DomBuilder t m
112
- , DomBuilderSpace m ~ GhcjsDomSpace
113
- , MonadFix m
114
- , MonadHold t m
115
- , MonadSample t m
116
- , PostBuild t m
117
- )
118
- => Dynamic t (Map k Task )
119
- -> m (Event t (Map k Task -> Map k Task ))
120
- toggleAll tasks = do
121
- let toggleAllState = (\ els -> not (null els) && all taskCompleted els) . Map. elems <$> tasks
122
- namedCheckmark = toggleInput $ " id" =: " toggle-all"
123
- -- Create "toggle all" button
124
- initialState <- sample $ current toggleAllState
125
- toggleAllClick <- switchDyn <$> widgetHold (namedCheckmark initialState) (namedCheckmark <$> updated toggleAllState)
126
- elAttr " label" (" for" =: " toggle-all" ) $ text " ❯"
127
- pure $ fmap (\ oldAllCompletedState -> fmap (\ t -> t { taskCompleted = not oldAllCompletedState })) $ tag (current toggleAllState) toggleAllClick
128
-
129
108
-- | Display an input field; produce new Tasks when the user creates them
130
109
taskEntry
131
110
:: ( DomBuilder t m
@@ -134,7 +113,7 @@ taskEntry
134
113
, DomBuilderSpace m ~ GhcjsDomSpace
135
114
)
136
115
=> m (Event t Task )
137
- taskEntry = do
116
+ taskEntry = el " header " $ do
138
117
-- Create the textbox; it will be cleared whenever the user presses enter
139
118
rec let newValueEntered = keypress Enter descriptionBox
140
119
descriptionBox <- inputElement $ def
@@ -166,6 +145,10 @@ taskList
166
145
-> Dynamic t (Map k Task )
167
146
-> m (Event t (Map k Task -> Map k Task ))
168
147
taskList activeFilter tasks = elAttr " section" (" class" =: " main" ) $ do
148
+ let toggleAllState = all taskCompleted . Map. elems <$> tasks
149
+ toggleAllAttrs = ffor tasks $ \ t -> " class" =: " toggle-all" <> " name" =: " toggle" <> if Map. null t then " style" =: " visibility:hidden" else mempty
150
+ toggleAll <- toggleInput toggleAllAttrs toggleAllState
151
+ elAttr " label" (" for" =: " toggle-all" ) $ text " Mark all as complete"
169
152
-- Filter the item list
170
153
let visibleTasks = zipDynWith (Map. filter . satisfiesFilter) activeFilter tasks
171
154
-- Hide the item list itself if there are no items
@@ -188,16 +171,20 @@ toggleInput
188
171
, MonadHold t m
189
172
, PostBuild t m
190
173
)
191
- => Map AttributeName Text
192
- -> Bool
174
+ => Dynamic t ( Map AttributeName Text )
175
+ -> Dynamic t Bool
193
176
-> m (Event t () )
194
- toggleInput attrs checked = domEvent Click <$> inputElement (def
195
- & inputElementConfig_initialChecked .~ checked
196
- & inputElementConfig_elementConfig . elementConfig_initialAttributes .~
197
- mconcat [ " class" =: " toggle"
198
- , " type" =: " checkbox"
199
- , attrs
200
- ])
177
+ toggleInput dynAttrs dynChecked = do
178
+ let attrs = (<> " class" =: " toggle" ) . (" type" =: " checkbox" <> ) <$> dynAttrs
179
+ updatedAttrs = fmap Just <$> updated dynAttrs
180
+ updatedChecked = updated dynChecked
181
+ initialAttrs <- sample $ current attrs
182
+ initialChecked <- sample $ current dynChecked
183
+ domEvent Click <$> inputElement (def
184
+ & inputElementConfig_initialChecked .~ initialChecked
185
+ & inputElementConfig_setChecked .~ updatedChecked
186
+ & inputElementConfig_elementConfig . elementConfig_modifyAttributes .~ updatedAttrs
187
+ & inputElementConfig_elementConfig . elementConfig_initialAttributes .~ initialAttrs)
201
188
202
189
buildCompletedCheckbox
203
190
:: ( DomBuilder t m
@@ -212,8 +199,7 @@ buildCompletedCheckbox
212
199
buildCompletedCheckbox todo description = elAttr " div" (" class" =: " view" ) $ do
213
200
-- Display the todo item's completed status, and allow it to be set
214
201
completed <- holdUniqDyn $ fmap taskCompleted todo
215
- initialState <- sample $ taskCompleted <$> current todo
216
- checkboxClicked <- switchDyn <$> widgetHold (toggleInput mempty initialState) (toggleInput mempty . taskCompleted <$> updated todo)
202
+ checkboxClicked <- toggleInput (constDyn mempty ) completed
217
203
let setCompleted = fmap not $ tag (current completed) checkboxClicked
218
204
-- Display the todo item's name for viewing purposes
219
205
(descriptionLabel, _) <- el' " label" $ dynText description
0 commit comments