From e18d0a771be1860dcc5107285a0368b4edf30546 Mon Sep 17 00:00:00 2001 From: Burtannia Date: Fri, 13 Nov 2020 18:46:42 +0000 Subject: [PATCH 01/22] Added delete button to Yesod.Form.Multi --- yesod-form-multi/Yesod/Form/MultiInput.hs | 93 ++++++++++++++++++----- 1 file changed, 76 insertions(+), 17 deletions(-) diff --git a/yesod-form-multi/Yesod/Form/MultiInput.hs b/yesod-form-multi/Yesod/Form/MultiInput.hs index 80079947..e6c3e4af 100644 --- a/yesod-form-multi/Yesod/Form/MultiInput.hs +++ b/yesod-form-multi/Yesod/Form/MultiInput.hs @@ -44,6 +44,7 @@ instance ToJavascript Text where toJavascript = toJavascript . toJSON -- @since 1.6.0 data MultiSettings site = MultiSettings { msAddClass :: Text -- ^ Class to be applied to the "add another" button. + , msDelClass :: Text -- ^ Class to be applied to the "delete" button. , msErrWidget :: Maybe (Html -> WidgetFor site ()) -- ^ Only used in applicative forms. Create a widget for displaying errors. } @@ -52,13 +53,14 @@ data MultiView site = MultiView { mvCounter :: FieldView site -- ^ Hidden counter field. , mvFields :: [FieldView site] -- ^ Input fields. , mvAddBtn :: FieldView site -- ^ Button to add another field. + , mvWrapperClass :: Text -- ^ Class applied to a div wrapping each field with it's delete button. } -- | 'MultiSettings' for Bootstrap 3. -- -- @since 1.6.0 bs3Settings :: MultiSettings site -bs3Settings = MultiSettings "btn btn-default" (Just errW) +bs3Settings = MultiSettings "btn btn-default" "btn btn-danger" (Just errW) where errW err = [whamlet| @@ -69,7 +71,7 @@ bs3Settings = MultiSettings "btn btn-default" (Just errW) -- -- @since 1.6.0 bs4Settings :: MultiSettings site -bs4Settings = MultiSettings "btn btn-basic" (Just errW) +bs4Settings = MultiSettings "btn btn-basic" "btn btn-danger" (Just errW) where errW err = [whamlet| @@ -130,11 +132,10 @@ mmulti :: (site ~ HandlerSite m, MonadHandler m, RenderMessage site FormMessage) -> Int -> MultiSettings site -> MForm m (FormResult [a], MultiView site) -mmulti field fs@FieldSettings {..} defs minVals ms = do - fieldClass <- newFormIdent - let fs' = fs {fsAttrs = addClass fieldClass fsAttrs} - minVals' = if minVals < 0 then 0 else minVals - mhelperMulti field fs' fieldClass defs minVals' ms +mmulti field fs defs minVals' ms = do + wrapperClass <- newFormIdent + let minVals = if minVals' < 0 then 0 else minVals' + mhelperMulti field fs wrapperClass defs minVals ms -- Helper function, does most of the work for mmulti. mhelperMulti :: (site ~ HandlerSite m, MonadHandler m, RenderMessage site FormMessage) @@ -145,14 +146,15 @@ mhelperMulti :: (site ~ HandlerSite m, MonadHandler m, RenderMessage site FormMe -> Int -> MultiSettings site -> MForm m (FormResult [a], MultiView site) -mhelperMulti field@Field {..} fs@FieldSettings {..} fieldClass defs minVals MultiSettings {..} = do +mhelperMulti field@Field {..} fs@FieldSettings {..} wrapperClass defs minVals MultiSettings {..} = do mp <- askParams (_, site, langs) <- ask name <- maybe newFormIdent return fsName theId <- maybe newFormIdent return fsId cName <- newFormIdent cid <- newFormIdent - addBtnId <- newFormIdent + addBtnId <- newFormIdent + delBtnPrefix <- newFormIdent let mr2 = renderMessage site langs cDef = length defs @@ -174,7 +176,7 @@ mhelperMulti field@Field {..} fs@FieldSettings {..} fieldClass defs minVals Mult Just p -> mkRes intField cfs p mfs cName onMissingFail FormSuccess -- generate counter view - cView <- mkView intField cfs cr cid cName True + cView <- mkView intField cfs cr Nothing cid cName True let counter = case cRes of FormSuccess c -> c @@ -188,10 +190,40 @@ mhelperMulti field@Field {..} fs@FieldSettings {..} fieldClass defs minVals Mult else [(FormMissing, Right d) | d <- defs] Just p -> mapM (\n -> mkRes field fs p mfs n onMissingSucc (FormSuccess . Just)) (map fst $ mkNames counter) + -- delete button + + -- The delFunction is included down with the add button rather than with + -- each delete button to ensure that the function only gets included once. + let delFunction = toWidget + [julius| + function deleteField(field) { + var numFields = $("." + #{wrapperClass}).length; + + if (numFields == 1) + field.val(""); + else + field.parent().remove(); + } + |] + + mkDelBtn fieldId = do + let delBtnId = delBtnPrefix <> fieldId + [whamlet| +