You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2012/11/11 21:11:19 UTC
[3/9] git commit: Only allow a single popup at a time Fix the order
of the days to match DatePicker's expectation
Only allow a single popup at a time
Fix the order of the days to match DatePicker's expectation
Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/96043af2
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/96043af2
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/96043af2
Branch: refs/heads/5.4-js-rewrite
Commit: 96043af2855e42f790e3e65f522d21ceb6289475
Parents: facdf5d
Author: Howard M. Lewis Ship <hl...@apache.org>
Authored: Sun Nov 11 11:50:30 2012 -0800
Committer: Howard M. Lewis Ship <hl...@apache.org>
Committed: Sun Nov 11 11:50:30 2012 -0800
----------------------------------------------------------------------
.../META-INF/modules/core/datefield.coffee | 73 +++++++++++----
1 files changed, 54 insertions(+), 19 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/96043af2/tapestry-core/src/main/coffeescript/META-INF/modules/core/datefield.coffee
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/coffeescript/META-INF/modules/core/datefield.coffee b/tapestry-core/src/main/coffeescript/META-INF/modules/core/datefield.coffee
index 33cd0aa..16390a2 100644
--- a/tapestry-core/src/main/coffeescript/META-INF/modules/core/datefield.coffee
+++ b/tapestry-core/src/main/coffeescript/META-INF/modules/core/datefield.coffee
@@ -16,8 +16,9 @@
#
# Provides support for the `core/DateField` component.
define ["core/dom", "core/events", "core/messages", "core/builder", "core/ajax",
- "core/alert", "_"],
- (dom, events, messages, builder, ajax, alert, _) ->
+ "_", "core/alert", "core/fields"],
+ (dom, events, messages, builder, ajax, _, alert) ->
+
# Translate from the provided order (SUNDAY = 0, MONDAY = 1), to
# the order needed by the DatePicker component (MONDAY = 0 ... SUNDAY = 6)
@@ -27,8 +28,18 @@ define ["core/dom", "core/events", "core/messages", "core/builder", "core/ajax",
# Loalize a few other things.
DatePicker.months = (messages "date-symbols.months").split ","
days = (messages "date-symbols.days").split ","
+
+ # Shuffle sunday to the end, so that monday is first.
+
+ days.push days.shift()
+
DatePicker.days = _.map days, (name) -> name.substr(0, 1).toLowerCase()
+ # Track the active popup; only one allowed at a time. May look to rework this
+ # later so that there's just one popup and it is moved around the viewport, or
+ # around the DOM.
+ activePopup = null
+
class Controller
constructor: (@container) ->
@field = @container.findFirst "input"
@@ -38,20 +49,32 @@ define ["core/dom", "core/events", "core/messages", "core/builder", "core/ajax",
@doTogglePopup()
false
+ showPopup: ->
+ if activePopup and activePopup isnt @popup
+ activePopup.hide()
+
+ @popup.show()
+ activePopup = @popup
+
+ hidePopup: ->
+ @popup.hide()
+ activePopup = null
+
doTogglePopup: ->
return if @field.element.disabled
unless @popup
@createPopup()
+ activePopup?.hide()
else if @popup.visible()
- @popup.hide()
+ @hidePopup()
return
value = @field.value()
if value is ""
@datePicker.setDate null
- @popup.show()
+ @showPopup()
return
@field.addClass "ajax-wait"
@@ -59,58 +82,70 @@ define ["core/dom", "core/events", "core/messages", "core/builder", "core/ajax",
ajax (@container.attribute "data-parse-url"),
parameters:
input: value
- onerror: =>
+ onerror: (message) =>
@field.removeClass "ajax-wait"
- @field.focus()
+ @fieldError message
onsuccess: (response) =>
@field.removeClass "ajax-wait"
reply = response.responseJSON
if reply.result
+ @clearFieldError()
+
date = new Date()
date.setTime reply.result
@datePicker.setDate date
- @popup.show()
+ @showPopup()
return
- @field.focus()
-
@fieldError reply.error
+ # Because the popup overlays where the error message appears, we
+ # show it as an alert, too.
+ alert { message: reply.error }
+
+ @datePicker.setDate null
+ @showPopup()
+
fieldError: (message) ->
- alert { message }
+ @field.focus().trigger events.field.showValidationError, { message }
+
+ clearFieldError: ->
+ @field.trigger events.field.clearValidationError
createPopup: ->
@datePicker = new DatePicker()
+ @datePicker.setFirstWeekDay datePickerFirstDay
@popup = builder "div.t-datefield-popup"
@popup.append dom @datePicker.create()
- @trigger.insertAfter @popup
+ @container.append @popup
@datePicker.onselect = _.bind @onSelect, this
onSelect: ->
- @field.addClass "t-ajax-wait"
-
date = @datePicker.getDate()
if date is null
- @popup.hide()
+ @hidePopup()
+ @clearFieldError()
@field.value ""
return
+ @field.addClass "ajax-wait"
+
+
ajax (@container.attribute "data-format-url"),
parameters:
input: date.getTime()
onerror: (message) =>
- @field.removeClass "t-ajax-wait"
+ @field.removeClass "ajax-wait"
@fieldError message
- @popup.hide()
onsuccess: (response) =>
- @field.removeClass "t-ajax-wait"
+ @field.removeClass "ajax-wait"
+ @clearFieldError()
@field.value response.responseJSON.result
- @popup.hide()
-
+ @hidePopup()
scan = (root) ->