on develop help sign in
Add dynamicAttributesToModifyAttributesWithInitial
2a473aeAli Abrar
src/Reflex/Dom/Builder/Class.hs+3
@@ -166,6 +166,9 @@ data TextNode d t = TextNode
166
166
167data AttributeName = AttributeName !(Maybe Namespace) !Text deriving (Show, Read, Eq, Ord)
167data AttributeName = AttributeName !(Maybe Namespace) !Text deriving (Show, Read, Eq, Ord)
168
168
169+mapKeysToAttributeName :: Map Text v -> Map AttributeName v
170+mapKeysToAttributeName = Map.mapKeysMonotonic (AttributeName Nothing)
171+
169-- | By default, AttributeNames are unnamespaced
172-- | By default, AttributeNames are unnamespaced
170instance IsString AttributeName where
173instance IsString AttributeName where
171 fromString = AttributeName Nothing . fromString
174 fromString = AttributeName Nothing . fromString
src/Reflex/Dom/Old.hs+1−1
@@ -145,7 +145,7 @@ instance PostBuild t m => Attributes m (Dynamic t (Map Text Text)) t where
145addDynamicAttributes :: PostBuild t m => Dynamic t (Map Text Text) -> ElementConfig er t m -> m (ElementConfig er t m)
145addDynamicAttributes :: PostBuild t m => Dynamic t (Map Text Text) -> ElementConfig er t m -> m (ElementConfig er t m)
146addDynamicAttributes attrs cfg = do
146addDynamicAttributes attrs cfg = do
147 modifyAttrs <- dynamicAttributesToModifyAttributes attrs
147 modifyAttrs <- dynamicAttributesToModifyAttributes attrs
148− return $ cfg & elementConfig_modifyAttributes .~ modifyAttrs
148+ return $ cfg & elementConfig_modifyAttributes .~ fmap mapKeysToAttributeName modifyAttrs
149
149
150buildElementCommon :: MonadWidget t m => Text -> m a -> ElementConfig er t m -> m (Element er (DomBuilderSpace m) t, a)
150buildElementCommon :: MonadWidget t m => Text -> m a -> ElementConfig er t m -> m (Element er (DomBuilderSpace m) t, a)
151buildElementCommon elementTag child cfg = element elementTag cfg child
151buildElementCommon elementTag child cfg = element elementTag cfg child
src/Reflex/Dom/Widget/Basic.hs+11−6
@@ -262,19 +262,24 @@ elDynAttrNS' mns elementTag attrs child = do
262 modifyAttrs <- dynamicAttributesToModifyAttributes attrs
262 modifyAttrs <- dynamicAttributesToModifyAttributes attrs
263 let cfg = def
263 let cfg = def
264 & elementConfig_namespace .~ mns
264 & elementConfig_namespace .~ mns
265− & modifyAttributes .~ modifyAttrs
265+ & modifyAttributes .~ fmap mapKeysToAttributeName modifyAttrs
266 element elementTag cfg child
266 element elementTag cfg child
267
267
268−dynamicAttributesToModifyAttributes :: PostBuild t m => Dynamic t (Map Text Text) -> m (Event t (Map AttributeName (Maybe Text)))
268+dynamicAttributesToModifyAttributes :: (Ord k, PostBuild t m) => Dynamic t (Map k Text) -> m (Event t (Map k (Maybe Text)))
269−dynamicAttributesToModifyAttributes d = do
269+dynamicAttributesToModifyAttributes = dynamicAttributesToModifyAttributesWithInitial mempty
270+
271+dynamicAttributesToModifyAttributesWithInitial :: (Ord k, PostBuild t m) => Map k Text -> Dynamic t (Map k Text) -> m (Event t (Map k (Maybe Text)))
272+dynamicAttributesToModifyAttributesWithInitial attrs0 d = do
270 postBuild <- getPostBuild
273 postBuild <- getPostBuild
271 let modificationsNeeded = flip pushAlways (align postBuild $ updated d) $ \case
274 let modificationsNeeded = flip pushAlways (align postBuild $ updated d) $ \case
275+ This () -> do
272− This () -> fmap (fmap Just) $ sample $ current d
276+ new <- sample $ current d
277+ return $ diffMap attrs0 new
273− These () new -> return $ fmap Just new
278+ These () new -> return $ diffMap attrs0 new
274 That new -> do
279 That new -> do
275 old <- sample $ current d
280 old <- sample $ current d
276 return $ diffMap old new
281 return $ diffMap old new
277− return $ Map.fromList . fmap (first (AttributeName Nothing)) . Map.toList <$> modificationsNeeded
282+ return modificationsNeeded
278
283
279--------------------------------------------------------------------------------
284--------------------------------------------------------------------------------
280-- Copied and pasted from Reflex.Widget.Class
285-- Copied and pasted from Reflex.Widget.Class
src/Reflex/Dom/Widget/Input.hs+7−7
@@ -90,7 +90,7 @@ textInput (TextInputConfig inputType initial eSetValue dAttrs) = do
90 i <- inputElement $ def
90 i <- inputElement $ def
91 & inputElementConfig_initialValue .~ initial
91 & inputElementConfig_initialValue .~ initial
92 & inputElementConfig_setValue .~ eSetValue
92 & inputElementConfig_setValue .~ eSetValue
93− & inputElementConfig_elementConfig . elementConfig_modifyAttributes .~ modifyAttrs
93+ & inputElementConfig_elementConfig . elementConfig_modifyAttributes .~ fmap mapKeysToAttributeName modifyAttrs
94 return $ TextInput
94 return $ TextInput
95 { _textInput_value = _inputElement_value i
95 { _textInput_value = _inputElement_value i
96 , _textInput_input = _inputElement_input i
96 , _textInput_input = _inputElement_input i
@@ -140,7 +140,7 @@ rangeInput (RangeInputConfig initial eSetValue dAttrs) = do
140 i <- inputElement $ def
140 i <- inputElement $ def
141 & inputElementConfig_initialValue .~ (T.pack . show $ initial)
141 & inputElementConfig_initialValue .~ (T.pack . show $ initial)
142 & inputElementConfig_setValue .~ (T.pack . show <$> eSetValue)
142 & inputElementConfig_setValue .~ (T.pack . show <$> eSetValue)
143− & inputElementConfig_elementConfig . elementConfig_modifyAttributes .~ modifyAttrs
143+ & inputElementConfig_elementConfig . elementConfig_modifyAttributes .~ fmap mapKeysToAttributeName modifyAttrs
144 return $ RangeInput
144 return $ RangeInput
145 { _rangeInput_value = read . T.unpack <$> _inputElement_value i
145 { _rangeInput_value = read . T.unpack <$> _inputElement_value i
146 , _rangeInput_input = read . T.unpack <$> _inputElement_input i
146 , _rangeInput_input = read . T.unpack <$> _inputElement_input i
@@ -177,7 +177,7 @@ textArea (TextAreaConfig initial eSet attrs) = do
177 i <- textAreaElement $ def
177 i <- textAreaElement $ def
178 & textAreaElementConfig_initialValue .~ initial
178 & textAreaElementConfig_initialValue .~ initial
179 & textAreaElementConfig_setValue .~ eSet
179 & textAreaElementConfig_setValue .~ eSet
180− & textAreaElementConfig_elementConfig . elementConfig_modifyAttributes .~ modifyAttrs
180+ & textAreaElementConfig_elementConfig . elementConfig_modifyAttributes .~ fmap mapKeysToAttributeName modifyAttrs
181 return $ TextArea
181 return $ TextArea
182 { _textArea_value = _textAreaElement_value i
182 { _textArea_value = _textAreaElement_value i
183 , _textArea_input = _textAreaElement_input i
183 , _textArea_input = _textAreaElement_input i
@@ -214,7 +214,7 @@ checkbox checked config = do
214 & inputElementConfig_initialChecked .~ checked
214 & inputElementConfig_initialChecked .~ checked
215 & inputElementConfig_setChecked .~ _checkboxConfig_setValue config
215 & inputElementConfig_setChecked .~ _checkboxConfig_setValue config
216 & inputElementConfig_elementConfig . elementConfig_initialAttributes .~ Map.mapKeys (AttributeName Nothing) permanentAttrs
216 & inputElementConfig_elementConfig . elementConfig_initialAttributes .~ Map.mapKeys (AttributeName Nothing) permanentAttrs
217− & inputElementConfig_elementConfig . elementConfig_modifyAttributes .~ modifyAttrs
217+ & inputElementConfig_elementConfig . elementConfig_modifyAttributes .~ fmap mapKeysToAttributeName modifyAttrs
218 return $ Checkbox
218 return $ Checkbox
219 { _checkbox_value = _inputElement_checked i
219 { _checkbox_value = _inputElement_checked i
220 , _checkbox_change = _inputElement_checkedChange i
220 , _checkbox_change = _inputElement_checkedChange i
@@ -289,7 +289,7 @@ checkboxView dAttrs dValue = do
289 return $ (,) preventDefault $ return $ Just $ CheckboxViewEventResult b
289 return $ (,) preventDefault $ return $ Just $ CheckboxViewEventResult b
290 elementConfig :: ElementConfig CheckboxViewEventResult t m
290 elementConfig :: ElementConfig CheckboxViewEventResult t m
291 elementConfig = (def :: ElementConfig EventResult t m)
291 elementConfig = (def :: ElementConfig EventResult t m)
292− { _elementConfig_modifyAttributes = modifyAttrs
292+ { _elementConfig_modifyAttributes = fmap mapKeysToAttributeName modifyAttrs
293 , _elementConfig_initialAttributes = Map.mapKeys (AttributeName Nothing) permanentAttrs
293 , _elementConfig_initialAttributes = Map.mapKeys (AttributeName Nothing) permanentAttrs
294 , _elementConfig_eventSpec = GhcjsEventSpec
294 , _elementConfig_eventSpec = GhcjsEventSpec
295 { _ghcjsEventSpec_filters = filters
295 { _ghcjsEventSpec_filters = filters
@@ -330,7 +330,7 @@ fileInput config = do
330 let filters = DMap.singleton Change . GhcjsEventFilter $ \_ -> do
330 let filters = DMap.singleton Change . GhcjsEventFilter $ \_ -> do
331 return . (,) mempty $ return . Just $ EventResult ()
331 return . (,) mempty $ return . Just $ EventResult ()
332 elCfg = (def :: ElementConfig EventResult t m)
332 elCfg = (def :: ElementConfig EventResult t m)
333− & modifyAttributes .~ modifyAttrs
333+ & modifyAttributes .~ fmap mapKeysToAttributeName modifyAttrs
334 & elementConfig_eventSpec . ghcjsEventSpec_filters .~ filters
334 & elementConfig_eventSpec . ghcjsEventSpec_filters .~ filters
335 cfg = (def :: InputElementConfig EventResult t m) & inputElementConfig_elementConfig .~ elCfg
335 cfg = (def :: InputElementConfig EventResult t m) & inputElementConfig_elementConfig .~ elCfg
336 eRaw <- inputElement cfg
336 eRaw <- inputElement cfg
@@ -427,7 +427,7 @@ dropdown k0 options (DropdownConfig setK attrs) = do
427 in (Map.fromList $ map snd xs, Bimap.fromList $ map fst xs)
427 in (Map.fromList $ map snd xs, Bimap.fromList $ map fst xs)
428 modifyAttrs <- dynamicAttributesToModifyAttributes attrs
428 modifyAttrs <- dynamicAttributesToModifyAttributes attrs
429 let cfg = def
429 let cfg = def
430− & selectElementConfig_elementConfig . elementConfig_modifyAttributes .~ modifyAttrs
430+ & selectElementConfig_elementConfig . elementConfig_modifyAttributes .~ fmap mapKeysToAttributeName modifyAttrs
431 & selectElementConfig_setValue .~ fmap (T.pack . show) (attachPromptlyDynWithMaybe (flip Bimap.lookupR) ixKeys setK)
431 & selectElementConfig_setValue .~ fmap (T.pack . show) (attachPromptlyDynWithMaybe (flip Bimap.lookupR) ixKeys setK)
432 (eRaw, _) <- selectElement cfg $ listWithKey indexedOptions $ \(ix, k) v -> do
432 (eRaw, _) <- selectElement cfg $ listWithKey indexedOptions $ \(ix, k) v -> do
433 let optionAttrs = fmap (\dk -> "value" =: T.pack (show ix) <> if dk == k then "selected" =: "selected" else mempty) defaultKey
433 let optionAttrs = fmap (\dk -> "value" =: T.pack (show ix) <> if dk == k then "selected" =: "selected" else mempty) defaultKey