diff --git a/Yesod/Form.hs b/Yesod/Form.hs index afc32b09..d6f08e4e 100644 --- a/Yesod/Form.hs +++ b/Yesod/Form.hs @@ -101,6 +101,7 @@ import Yesod.Widget import Control.Arrow ((&&&)) import qualified Text.Email.Validate as Email import Data.Char (isSpace) +import Yesod.Urls -- | A form can produce three different results: there was no data available, -- the data was invalid, or there was a successful parse. @@ -427,9 +428,9 @@ jqueryDayFieldProfile = FieldProfile %input#$name$!name=$name$!type=date!:isReq:required!value=$val$ |] , fpWidget = \name -> do - addScriptRemote urlJqueryJs - addScriptRemote urlJqueryUiJs - addStylesheetRemote urlJqueryUiCss + getSetting urlJqueryJs >>= addScriptRemote + getSetting urlJqueryUiJs >>= addScriptRemote + getSetting urlJqueryUiCss >>= addStylesheetRemote addJavaScript [$hamlet| $$(function(){$$("#$name$").datepicker({dateFormat:'yy-mm-dd'})}); |] @@ -460,10 +461,6 @@ parseUTCTime s = Right date -> ifRight (parseTime timeS) (\time -> UTCTime date (timeOfDayToTime time)) --- TODO - integrate with static helpers -jqueryUiDateTimePicker :: String -jqueryUiDateTimePicker = "http://www.projectcodegen.com/jquery.ui.datetimepicker.js.txt" - jqueryDayTimeField :: Html () -> Html () -> FormletField sub y UTCTime jqueryDayTimeField l t = requiredFieldHelper jqueryDayTimeFieldProfile { fpLabel = l , fpTooltip = t } @@ -485,23 +482,23 @@ jqueryDayTimeUTCTime (UTCTime day utcTime) = jqueryDayTimeFieldProfile :: FieldProfile sub y UTCTime jqueryDayTimeFieldProfile = FieldProfile - { fpParse = parseUTCTime + { fpParse = parseUTCTime , fpRender = jqueryDayTimeUTCTime , fpHamlet = \name val isReq -> [$hamlet| %input#$name$!name=$name$!type=date!:isReq:required!value=$val$ |] , fpWidget = \name -> do - addScriptRemote urlJqueryJs - addScriptRemote urlJqueryUiJs - addScriptRemote jqueryUiDateTimePicker -- needs slashes, dashes are broken - addStylesheetRemote urlJqueryUiCss + getSetting urlJqueryJs >>= addScriptRemote + getSetting urlJqueryUiJs >>= addScriptRemote + getSetting urlJqueryUiDateTimePicker >>= addScriptRemote -- needs slashes, dashes are broken + getSetting urlJqueryUiCss >>= addStylesheetRemote addJavaScript [$hamlet| $$(function(){$$("#$name$").datetimepicker({dateFormat : "yyyy/mm/dd h:MM TT"})}); |] , fpName = Nothing , fpLabel = mempty , fpTooltip = mempty - } + } parseTime :: String -> Either String TimeOfDay parseTime (h2:':':m1:m2:[]) = parseTimeHelper ('0', h2, m1, m2, '0', '0') @@ -893,9 +890,9 @@ jqueryAutocompleteFieldProfile src = FieldProfile %input.autocomplete#$name$!name=$name$!type=text!:isReq:required!value=$val$ |] , fpWidget = \name -> do - addScriptRemote urlJqueryJs - addScriptRemote urlJqueryUiJs - addStylesheetRemote urlJqueryUiCss + getSetting urlJqueryJs >>= addScriptRemote + getSetting urlJqueryUiJs >>= addScriptRemote + getSetting urlJqueryUiCss >>= addStylesheetRemote addJavaScript [$hamlet| $$(function(){$$("#$name$").autocomplete({source:"@src@",minLength:2})}); |] diff --git a/Yesod/Urls.hs b/Yesod/Urls.hs new file mode 100644 index 00000000..9b7c41c2 --- /dev/null +++ b/Yesod/Urls.hs @@ -0,0 +1,43 @@ +module Yesod.Urls + ( newSetting + , changeSetting + , getSetting + -- * Default library URLs + , urlJqueryJs + , urlJqueryUiJs + , urlJqueryUiCss + , urlJqueryUiDateTimePicker + ) where + +import Data.IORef (IORef, newIORef, writeIORef, readIORef) +import System.IO.Unsafe (unsafePerformIO) +import Control.Monad.IO.Class + +newSetting :: a -> IORef a +newSetting = unsafePerformIO . newIORef + +changeSetting :: MonadIO m => IORef a -> a -> m () +changeSetting x = liftIO . writeIORef x + +getSetting :: MonadIO m => IORef a -> m a +getSetting = liftIO . readIORef + +-- | The Google-hosted jQuery 1.4.2 file. +urlJqueryJs :: IORef String +urlJqueryJs = newSetting + "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" + +-- | The Google-hosted jQuery UI 1.8.1 javascript file. +urlJqueryUiJs :: IORef String +urlJqueryUiJs = newSetting + "http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/jquery-ui.min.js" + +-- | The Google-hosted jQuery UI 1.8.1 CSS file with cupertino theme. +urlJqueryUiCss :: IORef String +urlJqueryUiCss = newSetting + "http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/themes/cupertino/jquery-ui.css" + +-- TODO - integrate with static helpers +urlJqueryUiDateTimePicker :: IORef String +urlJqueryUiDateTimePicker = newSetting + "http://www.projectcodegen.com/jquery.ui.datetimepicker.js.txt" diff --git a/Yesod/Widget.hs b/Yesod/Widget.hs index ef7491ef..7630f15d 100644 --- a/Yesod/Widget.hs +++ b/Yesod/Widget.hs @@ -27,10 +27,6 @@ module Yesod.Widget -- * Manipulating , wrapWidget , extractBody - -- * Default library URLs - , urlJqueryJs - , urlJqueryUiJs - , urlJqueryUiCss ) where import Data.List (nub) @@ -204,18 +200,3 @@ extractBody (GWidget w) = GWidget $ mapWriterT (fmap go) w where go ((), Body h) = (h, Body mempty) - --- | The Google-hosted jQuery 1.4.2 file. -urlJqueryJs :: String -urlJqueryJs = - "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" - --- | The Google-hosted jQuery UI 1.8.1 javascript file. -urlJqueryUiJs :: String -urlJqueryUiJs = - "http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/jquery-ui.min.js" - --- | The Google-hosted jQuery UI 1.8.1 CSS file with cupertino theme. -urlJqueryUiCss :: String -urlJqueryUiCss = - "http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/themes/cupertino/jquery-ui.css" diff --git a/yesod.cabal b/yesod.cabal index 25372373..03ecbb55 100644 --- a/yesod.cabal +++ b/yesod.cabal @@ -53,6 +53,7 @@ library Yesod.Handler Yesod.Internal Yesod.Json + Yesod.Urls Yesod.Request Yesod.Widget Yesod.Yesod