@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Date controls should respect user time preferences

Summary: Ref T8362, Date controls should respect user time preferences

Test Plan: Set user time preference to 24-hour format, create an event, type 23 in time input, 23:00 should be suggested. Saveing a 24-hour format time should save correctly.

Reviewers: #blessed_reviewers, epriestley

Reviewed By: #blessed_reviewers, epriestley

Subscribers: epriestley, Korvin

Maniphest Tasks: T8362

Differential Revision: https://secure.phabricator.com/D13291

+124 -53
+26 -6
src/view/form/control/AphrontFormDateControl.php
··· 136 136 return $date; 137 137 } 138 138 139 + private function getTimeFormat() { 140 + $viewer = $this->getUser(); 141 + $preferences = $viewer->loadPreferences(); 142 + $pref_time_format = PhabricatorUserPreferences::PREFERENCE_TIME_FORMAT; 143 + 144 + return $preferences->getPreference($pref_time_format, 'g:i A'); 145 + } 146 + 139 147 private function getDateFormat() { 140 148 $viewer = $this->getUser(); 141 149 $preferences = $viewer->loadPreferences(); ··· 233 241 'startTimeID' => $time_id, 234 242 'endTimeID' => $this->endDateID, 235 243 'timeValues' => $values, 244 + 'format' => $this->getTimeFormat(), 236 245 )); 237 246 238 247 ··· 335 344 } 336 345 337 346 private function getTimeTypeaheadValues() { 347 + $time_format = $this->getTimeFormat(); 338 348 $times = array(); 339 - $am_pm_list = array('AM', 'PM'); 340 349 341 - foreach ($am_pm_list as $am_pm) { 342 - for ($hour = 0; $hour < 12; $hour++) { 343 - $actual_hour = ($hour == 0) ? 12 : $hour; 344 - $times[] = $actual_hour.':00 '.$am_pm; 345 - $times[] = $actual_hour.':30 '.$am_pm; 350 + if ($time_format == 'g:i A') { 351 + $am_pm_list = array('AM', 'PM'); 352 + 353 + foreach ($am_pm_list as $am_pm) { 354 + for ($hour = 0; $hour < 12; $hour++) { 355 + $actual_hour = ($hour == 0) ? 12 : $hour; 356 + $times[] = $actual_hour.':00 '.$am_pm; 357 + $times[] = $actual_hour.':30 '.$am_pm; 358 + } 359 + } 360 + } else if ($time_format == 'H:i') { 361 + for ($hour = 0; $hour < 24; $hour++) { 362 + $written_hour = ($hour > 9) ? $hour : '0'.$hour; 363 + $times[] = $written_hour.':00'; 364 + $times[] = $written_hour.':30'; 346 365 } 347 366 } 348 367 349 368 foreach ($times as $key => $time) { 350 369 $times[$key] = array($key, $time); 351 370 } 371 + 352 372 return $times; 353 373 } 354 374
+53 -27
src/view/form/control/AphrontFormDateControlValue.php
··· 66 66 67 67 $value = new AphrontFormDateControlValue(); 68 68 $value->viewer = $viewer; 69 - $value->valueDate = $value->getFormattedDateFromParts( 70 - $year, 71 - $month, 72 - $day, 73 - $value); 74 - $value->valueTime = coalesce($time, '12:00 AM'); 69 + list($value->valueDate, $value->valueTime) = 70 + $value->getFormattedDateFromParts( 71 + $year, 72 + $month, 73 + $day, 74 + coalesce($time, '12:00 AM'), 75 + $value); 75 76 $value->valueEnabled = $enabled; 76 77 77 78 return $value; ··· 81 82 $value = new AphrontFormDateControlValue(); 82 83 $value->viewer = $request->getViewer(); 83 84 84 - $value->valueDate = $value->getFormattedDateFromDate( 85 - $request->getStr($key.'_d'), 86 - $value); 85 + list($value->valueDate, $value->valueTime) = 86 + $value->getFormattedDateFromDate( 87 + $request->getStr($key.'_d'), 88 + $request->getStr($key.'_t'), 89 + $value); 87 90 88 - $value->valueTime = $request->getStr($key.'_t'); 89 91 $value->valueEnabled = $request->getStr($key.'_e'); 90 92 return $value; 91 93 } ··· 99 101 $year = $readable[0]; 100 102 $month = $readable[1]; 101 103 $day = $readable[2]; 102 - 103 - $value->valueDate = $value->getFormattedDateFromParts( 104 - $year, 105 - $month, 106 - $day, 107 - $value); 108 - $value->valueTime = $readable[3]; 104 + $time = $readable[3]; 109 105 106 + list($value->valueDate, $value->valueTime) = 107 + $value->getFormattedDateFromParts( 108 + $year, 109 + $month, 110 + $day, 111 + $time, 112 + $value); 110 113 111 114 return $value; 112 115 } ··· 117 120 $value = new AphrontFormDateControlValue(); 118 121 $value->viewer = $viewer; 119 122 120 - $value->valueDate = $value->getFormattedDateFromDate( 121 - idx($dictionary, 'd'), 122 - $value); 123 + list($value->valueDate, $value->valueTime) = 124 + $value->getFormattedDateFromDate( 125 + idx($dictionary, 'd'), 126 + idx($dictionary, 't'), 127 + $value); 123 128 124 - $value->valueTime = idx($dictionary, 't'); 125 129 $value->valueEnabled = idx($dictionary, 'e'); 126 130 127 131 return $value; ··· 200 204 return $value; 201 205 } 202 206 207 + private function getTimeFormat() { 208 + $preferences = $this->viewer->loadPreferences(); 209 + $pref_time_format = PhabricatorUserPreferences::PREFERENCE_TIME_FORMAT; 210 + 211 + return $preferences->getPreference($pref_time_format, 'g:i A'); 212 + } 213 + 203 214 private function getDateFormat() { 204 215 $preferences = $this->viewer->loadPreferences(); 205 216 $pref_date_format = PhabricatorUserPreferences::PREFERENCE_DATE_FORMAT; ··· 207 218 return $preferences->getPreference($pref_date_format, 'Y-m-d'); 208 219 } 209 220 210 - private function getFormattedDateFromDate($date, $value) { 221 + private function getFormattedDateFromDate($date, $time, $value) { 211 222 $original_input = $date; 212 223 $zone = $value->getTimezone(); 213 224 $separator = $value->getFormatSeparator(); ··· 216 227 $date = id(new DateTime($date, $zone)); 217 228 218 229 if ($date) { 219 - return $date->format($value->getDateFormat()); 230 + $date = $date->format($value->getDateFormat()); 220 231 } else { 221 - return $original_input; 232 + $date = $original_input; 222 233 } 234 + 235 + $date = id(new DateTime("{$date} {$time}", $zone)); 236 + 237 + return array( 238 + $date->format($value->getDateFormat()), 239 + $date->format($value->getTimeFormat()), 240 + ); 223 241 } 224 242 225 - private function getFormattedDateFromParts($year, $month, $day, $value) { 243 + private function getFormattedDateFromParts( 244 + $year, 245 + $month, 246 + $day, 247 + $time, 248 + $value) { 226 249 $zone = $value->getTimezone(); 250 + $date_time = id(new DateTime("{$year}-{$month}-{$day} {$time}", $zone)); 227 251 228 - return id(new DateTime("{$year}-{$month}-{$day}", $zone)) 229 - ->format($value->getDateFormat()); 252 + return array( 253 + $date_time->format($value->getDateFormat()), 254 + $date_time->format($value->getTimeFormat()), 255 + ); 230 256 } 231 257 232 258 private function getFormatSeparator() {
+45 -20
webroot/rsrc/js/core/behavior-time-typeahead.js
··· 11 11 JX.behavior('time-typeahead', function(config) { 12 12 var start_date_control = JX.$(config.startTimeID); 13 13 var end_date_control = config.endTimeID ? JX.$(config.endTimeID) : null; 14 + var format = config.format; 14 15 15 16 var end_date_tampered = false; 16 17 ··· 79 80 80 81 81 82 function getNewValue(time) { 82 - var regex = /^([01]?\d)(?::([0-5]\d))?\s*((am|pm))?$/i; 83 + var regex = /^([0-2]?\d)(?::([0-5]\d))?\s*((am|pm))?$/i; 83 84 84 85 if (!regex.test(time)) { 85 86 return null; ··· 90 91 var minutes = parseInt(results[2], 10) ? parseInt(results[2], 10) : 0; 91 92 92 93 var real_time = 0; 94 + var end_value = ''; 93 95 94 - if (/pm/i.test(results[3])) { 95 - real_time = 12*60; 96 - } else if (/am/i.test(results[3]) && hours == 12) { 97 - hours = 0; 98 - } 96 + var end_hours; 97 + var end_minutes; 99 98 100 - real_time = real_time + (hours * 60) + minutes; 99 + if (format === 'H:i' && hours < 23) { 100 + end_hours = hours + 1; 101 101 102 - var end_time = real_time + 60; 102 + if (end_hours > 9) { 103 + end_hours = end_hours.toString(); 104 + } else { 105 + end_hours = '0' + end_hours.toString(); 106 + } 103 107 104 - var end_meridian = 'AM'; 105 - var end_hours = Math.floor(end_time / 60); 108 + if (minutes > 9) { 109 + end_minutes = minutes.toString(); 110 + } else { 111 + end_minutes = '0' + minutes.toString(); 112 + } 106 113 107 - if (end_hours == 12) { 108 - end_meridian = 'PM'; 109 - } else if (end_hours > 12 && end_hours < 24) { 110 - end_hours = end_hours - 12; 111 - end_meridian = 'PM'; 112 - } else if (end_hours == 24) { 113 - end_hours = end_hours - 12; 114 + end_value = end_hours + ':' + end_minutes; 115 + } else if (format === 'g:i A') { 116 + if (/pm/i.test(results[3])) { 117 + real_time = 12*60; 118 + } else if (/am/i.test(results[3]) && hours == 12) { 119 + hours = 0; 120 + } 121 + 122 + real_time = real_time + (hours * 60) + minutes; 123 + 124 + var end_time = real_time + 60; 125 + 126 + var end_meridian = 'AM'; 127 + end_hours = Math.floor(end_time / 60); 128 + 129 + if (end_hours == 12) { 130 + end_meridian = 'PM'; 131 + } else if (end_hours > 12 && end_hours < 24) { 132 + end_hours = end_hours - 12; 133 + end_meridian = 'PM'; 134 + } else if (end_hours == 24) { 135 + end_hours = end_hours - 12; 136 + } 137 + 138 + end_minutes = end_time%60; 139 + end_minutes = (end_minutes < 9) ? end_minutes : ('0' + end_minutes); 140 + end_value = end_hours + ':' + end_minutes + ' ' + end_meridian; 114 141 } 115 142 116 - var end_minutes = end_time%60; 117 - end_minutes = (end_minutes > 9) ? end_minutes : ('0' + end_minutes); 118 - var end_value = end_hours + ':' + end_minutes + ' ' + end_meridian; 143 + 119 144 return end_value; 120 145 } 121 146