diff --git a/src/applications/settings/panel/PhabricatorDateTimeSettingsPanel.php b/src/applications/settings/panel/PhabricatorDateTimeSettingsPanel.php --- a/src/applications/settings/panel/PhabricatorDateTimeSettingsPanel.php +++ b/src/applications/settings/panel/PhabricatorDateTimeSettingsPanel.php @@ -19,6 +19,7 @@ $username = $user->getUsername(); $pref_time = PhabricatorUserPreferences::PREFERENCE_TIME_FORMAT; + $pref_date = PhabricatorUserPreferences::PREFERENCE_DATE_FORMAT; $pref_week_start = PhabricatorUserPreferences::PREFERENCE_WEEK_START_DAY; $preferences = $user->loadPreferences(); @@ -31,12 +32,16 @@ $errors[] = pht('The selected timezone is not a valid timezone.'); } - $preferences->setPreference( - $pref_time, - $request->getStr($pref_time)); - $preferences->setPreference( - $pref_week_start, - $request->getStr($pref_week_start)); + $preferences + ->setPreference( + $pref_time, + $request->getStr($pref_time)) + ->setPreference( + $pref_date, + $request->getStr($pref_date)) + ->setPreference( + $pref_week_start, + $request->getStr($pref_week_start)); if (!$errors) { $preferences->save(); @@ -71,6 +76,18 @@ ->setValue($preferences->getPreference($pref_time))) ->appendChild( id(new AphrontFormSelectControl()) + ->setLabel(pht('Date Format')) + ->setName($pref_date) + ->setOptions(array( + 'm/d/Y' => pht('US (2/28/2000)'), + 'd/m/Y' => pht('Little-Endian (28/2/2000)'), + 'Y/m/d' => pht('Big-Endian (2000/2/28)'), + )) + ->setCaption( + pht('Format used when rendering a date.')) + ->setValue($preferences->getPreference($pref_date))) + ->appendChild( + id(new AphrontFormSelectControl()) ->setLabel(pht('Week Starts On')) ->setOptions($this->getWeekDays()) ->setName($pref_week_start) diff --git a/src/applications/settings/storage/PhabricatorUserPreferences.php b/src/applications/settings/storage/PhabricatorUserPreferences.php --- a/src/applications/settings/storage/PhabricatorUserPreferences.php +++ b/src/applications/settings/storage/PhabricatorUserPreferences.php @@ -8,6 +8,7 @@ const PREFERENCE_MULTIEDIT = 'multiedit'; const PREFERENCE_TITLES = 'titles'; const PREFERENCE_MONOSPACED_TEXTAREAS = 'monospaced-textareas'; + const PREFERENCE_DATE_FORMAT = 'date-format'; const PREFERENCE_TIME_FORMAT = 'time-format'; const PREFERENCE_WEEK_START_DAY = 'week-start-day'; diff --git a/src/view/form/control/AphrontFormDateControl.php b/src/view/form/control/AphrontFormDateControl.php --- a/src/view/form/control/AphrontFormDateControl.php +++ b/src/view/form/control/AphrontFormDateControl.php @@ -127,7 +127,21 @@ } private function getDateInputValue() { - return $this->valueDate; + $date_format = $this->getDateFormat(); + $timezone = $this->getTimezone(); + + $datetime = new DateTime("{$this->valueDate}", $timezone); + $date = $datetime->format($date_format); + + return $date; + } + + private function getDateFormat() { + $viewer = $this->getUser(); + $preferences = $viewer->loadPreferences(); + $pref_date_format = PhabricatorUserPreferences::PREFERENCE_DATE_FORMAT; + + return $preferences->getPreference($pref_date_format, 'm/d/Y'); } private function getTimeInputValue() { @@ -242,7 +256,9 @@ ), $time_sel); - Javelin::initBehavior('fancy-datepicker', array()); + Javelin::initBehavior('fancy-datepicker', array( + 'format' => $this->getDateFormat(), + )); $classes = array(); $classes[] = 'aphront-form-date-container'; diff --git a/webroot/rsrc/js/core/behavior-fancy-datepicker.js b/webroot/rsrc/js/core/behavior-fancy-datepicker.js --- a/webroot/rsrc/js/core/behavior-fancy-datepicker.js +++ b/webroot/rsrc/js/core/behavior-fancy-datepicker.js @@ -7,7 +7,11 @@ * javelin-vector */ -JX.behavior('fancy-datepicker', function() { +JX.behavior('fancy-datepicker', function(config, statics) { + if (statics.initialized) { + return; + } + statics.initialized = true; var picker; var root; @@ -16,6 +20,21 @@ var value_m; var value_d; + function getKeyMap() { + var format = getFormat(); + return format.split('/'); + } + + function getFormat() { + var f = config.format; + + if (f === null) { + f = 'm/d/Y'; + } + + return f; + } + var onopen = function(e) { e.kill(); @@ -85,18 +104,60 @@ }; }; - var read_date = function() { - var i = get_inputs(); - var date = i.d.value; - var parts = date.split('/'); - value_y = +parts[2]; - value_m = +parts[0]; - value_d = +parts[1]; + var read_date = function(){ + var inputs = get_inputs(); + var date = inputs.d.value; + var date_parts = date.split('/'); + var map = getKeyMap(); + + 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 i = get_inputs(); - i.d.value = value_m + '/' + value_d + '/' + value_y; + var inputs = get_inputs(); + var map = getKeyMap(); + 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 'd': + arr_values[i] = value_d; + break; + } + } + + var text_value = ''; + + for(var j=0; j < arr_values.length; j++) { + var element = arr_values[j] ? arr_values[j] : ''; + if (text_value.length === 0) { + text_value += element; + } else { + text_value = text_value + '/' + element; + } + } + + inputs.d.value = text_value; }; var render = function() {