Changeset View
Changeset View
Standalone View
Standalone View
webroot/rsrc/js/core/behavior-fancy-datepicker.js
/** | /** | ||||
* @provides javelin-behavior-fancy-datepicker | * @provides javelin-behavior-fancy-datepicker | ||||
* @requires javelin-behavior | * @requires javelin-behavior | ||||
* javelin-util | * javelin-util | ||||
* javelin-dom | * javelin-dom | ||||
* javelin-stratcom | * javelin-stratcom | ||||
* javelin-vector | * javelin-vector | ||||
*/ | */ | ||||
JX.behavior('fancy-datepicker', function() { | JX.behavior('fancy-datepicker', function(config, statics) { | ||||
if (statics.initialized) { | |||||
return; | |||||
} | |||||
statics.initialized = true; | |||||
var picker; | var picker; | ||||
var root; | var root; | ||||
var value_y; | var value_y; | ||||
var value_m; | var value_m; | ||||
var value_d; | var value_d; | ||||
var get_format_separator = function() { | |||||
var format = get_format(); | |||||
switch (format.toLowerCase()) { | |||||
case 'n/j/y': | |||||
return '/'; | |||||
default: | |||||
return '-'; | |||||
} | |||||
}; | |||||
var get_key_maps = function() { | |||||
var format = get_format(); | |||||
var regex = new RegExp('[./ -]'); | |||||
return format.split(regex); | |||||
epriestley: I think we should split on any reasonable separator (any of `/`, `-`, `.`, ` `, at least).
We… | |||||
}; | |||||
var get_format = function() { | |||||
var format = config.format; | |||||
if (format === null) { | |||||
format = 'Y-m-d'; | |||||
} | |||||
return format; | |||||
}; | |||||
var onopen = function(e) { | var onopen = function(e) { | ||||
e.kill(); | e.kill(); | ||||
// If you click the calendar icon while the date picker is open, close it | // If you click the calendar icon while the date picker is open, close it | ||||
// without writing the change. | // without writing the change. | ||||
if (picker) { | if (picker) { | ||||
if (root == e.getNode('phabricator-date-control')) { | if (root == e.getNode('phabricator-date-control')) { | ||||
▲ Show 20 Lines • Show All 53 Lines • ▼ Show 20 Lines | JX.behavior('fancy-datepicker', function(config, statics) { | ||||
var get_inputs = function() { | var get_inputs = function() { | ||||
return { | return { | ||||
d: JX.DOM.find(root, 'input', 'date-input'), | d: JX.DOM.find(root, 'input', 'date-input'), | ||||
t: JX.DOM.find(root, 'input', 'time-input') | t: JX.DOM.find(root, 'input', 'time-input') | ||||
}; | }; | ||||
}; | }; | ||||
var read_date = function() { | var read_date = function(){ | ||||
var i = get_inputs(); | var inputs = get_inputs(); | ||||
var date = i.d.value; | var date = inputs.d.value; | ||||
var parts = date.split('/'); | var regex = new RegExp('[./ -]'); | ||||
value_y = +parts[2]; | var date_parts = date.split(regex); | ||||
value_m = +parts[0]; | var map = get_key_maps(); | ||||
value_d = +parts[1]; | |||||
for (var i=0; i < date_parts.length; i++) { | |||||
var key = map[i].toLowerCase(); | |||||
switch (key) { | |||||
case 'y': | |||||
value_y = date_parts[i]; | |||||
break; | |||||
case 'm': | |||||
value_m = date_parts[i]; | |||||
break; | |||||
case 'd': | |||||
value_d = date_parts[i]; | |||||
break; | |||||
} | |||||
} | |||||
}; | }; | ||||
var write_date = function() { | var write_date = function() { | ||||
var i = get_inputs(); | var inputs = get_inputs(); | ||||
i.d.value = value_m + '/' + value_d + '/' + value_y; | var map = get_key_maps(); | ||||
var arr_values = []; | |||||
for(var i=0; i < map.length; i++) { | |||||
switch (map[i].toLowerCase()) { | |||||
case 'y': | |||||
arr_values[i] = value_y; | |||||
break; | |||||
case 'm': | |||||
arr_values[i] = value_m; | |||||
break; | |||||
case 'n': | |||||
arr_values[i] = value_m; | |||||
break; | |||||
case 'd': | |||||
arr_values[i] = value_d; | |||||
break; | |||||
case 'j': | |||||
arr_values[i] = value_d; | |||||
break; | |||||
} | |||||
} | |||||
var text_value = ''; | |||||
var separator = get_format_separator(); | |||||
Done Inline ActionsHow can we hit this? epriestley: How can we hit this? | |||||
Not Done Inline ActionsNo, but seems like a reasonable failsafe? lpriestley: No, but seems like a reasonable failsafe? | |||||
for(var j=0; j < arr_values.length; j++) { | |||||
var element = arr_values[j]; | |||||
var format = get_format(); | |||||
Done Inline ActionsI think this is unusual in US dates, at least -- I'd expect 2/28/2015, not 02/28/2015. (But I think it is required by ISO-8601, so it shouldn't just be removed.) epriestley: I think this is unusual in US dates, at least -- I'd expect `2/28/2015`, not `02/28/2015`. | |||||
if ((format.toLowerCase() === 'd-m-y' || | |||||
format.toLowerCase() === 'y-m-d') && | |||||
element < 10) { | |||||
element = '0' + element; | |||||
} | |||||
if (text_value.length === 0) { | |||||
text_value += element; | |||||
} else { | |||||
text_value = text_value + separator + element; | |||||
} | |||||
} | |||||
inputs.d.value = text_value; | |||||
}; | }; | ||||
var render = function() { | var render = function() { | ||||
JX.DOM.setContent( | JX.DOM.setContent( | ||||
picker.firstChild, | picker.firstChild, | ||||
[ | [ | ||||
render_month(), | render_month(), | ||||
render_day() | render_day() | ||||
▲ Show 20 Lines • Show All 200 Lines • Show Last 20 Lines |
I think we should split on any reasonable separator (any of /, -, ., , at least).
We have to choose a separator when rendering or writing a date, but if a user types in 2015.05.23, it's completely unambiguous and there's no reason we can't parse it.