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.