@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.

Fix event pagination in month views

Summary: Closes T7927, Fix event pagination in month views.

Test Plan: Querying for events in month view should display max that month's events and min the subset of days selected.

Reviewers: #blessed_reviewers, epriestley

Reviewed By: #blessed_reviewers, epriestley

Subscribers: Korvin, epriestley

Maniphest Tasks: T7927

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

+105 -27
+1 -1
src/applications/calendar/application/PhabricatorCalendarApplication.php
··· 42 42 return array( 43 43 '/E(?P<id>[1-9]\d*)' => 'PhabricatorCalendarEventViewController', 44 44 '/calendar/' => array( 45 - '(?:query/(?P<queryKey>[^/]+)/)?' 45 + '(?:query/(?P<queryKey>[^/]+)/(?:(?P<year>\d+)/(?P<month>\d+)/)?)?' 46 46 => 'PhabricatorCalendarEventListController', 47 47 'event/' => array( 48 48 'create/'
+10 -8
src/applications/calendar/controller/PhabricatorCalendarEventListController.php
··· 3 3 final class PhabricatorCalendarEventListController 4 4 extends PhabricatorCalendarController { 5 5 6 - private $queryKey; 7 - 8 6 public function shouldAllowPublic() { 9 7 return true; 10 8 } 11 9 12 - public function willProcessRequest(array $data) { 13 - $this->queryKey = idx($data, 'queryKey'); 14 - } 10 + public function handleRequest(AphrontRequest $request) { 11 + $year = $request->getURIData('year'); 12 + $month = $request->getURIData('month'); 13 + $engine = new PhabricatorCalendarEventSearchEngine(); 15 14 16 - public function processRequest() { 15 + if ($month && $year) { 16 + $engine->setCalendarYearAndMonth($year, $month); 17 + } 18 + 17 19 $controller = id(new PhabricatorApplicationSearchController()) 18 - ->setQueryKey($this->queryKey) 19 - ->setSearchEngine(new PhabricatorCalendarEventSearchEngine()) 20 + ->setQueryKey($request->getURIData('queryKey')) 21 + ->setSearchEngine($engine) 20 22 ->setNavigation($this->buildSideNav()); 21 23 return $this->delegateToController($controller); 22 24 }
+75 -13
src/applications/calendar/query/PhabricatorCalendarEventSearchEngine.php
··· 3 3 final class PhabricatorCalendarEventSearchEngine 4 4 extends PhabricatorApplicationSearchEngine { 5 5 6 + private $calendarYear; 7 + private $calendarMonth; 8 + 6 9 public function getResultTypeDescription() { 7 10 return pht('Calendar Events'); 8 11 } ··· 47 50 48 51 public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { 49 52 $query = id(new PhabricatorCalendarEventQuery()); 53 + $viewer = $this->requireViewer(); 50 54 51 55 $min_range = null; 52 56 $max_range = null; ··· 59 63 $max_range = $saved->getParameter('rangeEnd'); 60 64 } 61 65 66 + if ($saved->getParameter('display') == 'month') { 67 + list($start_month, $start_year) = $this->getDisplayMonthAndYear($saved); 68 + $start_day = 1; 69 + 70 + $end_year = ($start_month == 12) ? $start_year + 1 : $start_year; 71 + $end_month = ($start_month == 12) ? 1 : $start_month + 1; 72 + $end_day = 1; 73 + 74 + $calendar_start = AphrontFormDateControlValue::newFromParts( 75 + $viewer, 76 + $start_year, 77 + $start_month, 78 + $start_day)->getEpoch(); 79 + $calendar_end = AphrontFormDateControlValue::newFromParts( 80 + $viewer, 81 + $end_year, 82 + $end_month, 83 + $end_day)->getEpoch(); 84 + 85 + if (!$min_range || ($min_range < $calendar_start)) { 86 + $min_range = $calendar_start; 87 + } 88 + if (!$max_range || ($max_range > $calendar_end)) { 89 + $max_range = $calendar_end; 90 + } 91 + } 92 + 62 93 if ($saved->getParameter('upcoming')) { 63 94 if ($min_range) { 64 95 $min_range = max(time(), $min_range); ··· 178 209 return $names; 179 210 } 180 211 212 + public function setCalendarYearAndMonth($year, $month) { 213 + $this->calendarYear = $year; 214 + $this->calendarMonth = $month; 215 + 216 + return $this; 217 + } 218 + 181 219 public function buildSavedQueryFromBuiltin($query_key) { 182 220 $query = $this->newSavedQuery(); 183 221 $query->setQueryKey($query_key); ··· 252 290 $viewer = $this->requireViewer(); 253 291 $now = time(); 254 292 255 - $epoch = $query->getParameter('rangeStart'); 256 - if (!$epoch) { 257 - $epoch = $query->getParameter('rangeEnd'); 258 - if (!$epoch) { 259 - $epoch = time(); 260 - } 261 - } 262 - 263 - $year = phabricator_format_local_time($epoch, $viewer, 'Y'); 264 - $month = phabricator_format_local_time($epoch, $viewer, 'm'); 293 + list($start_month, $start_year) = $this->getDisplayMonthAndYear($query); 265 294 266 295 $now_year = phabricator_format_local_time($now, $viewer, 'Y'); 267 296 $now_month = phabricator_format_local_time($now, $viewer, 'm'); 268 297 $now_day = phabricator_format_local_time($now, $viewer, 'j'); 269 298 270 - if ($month == $now_month && $year == $now_year) { 271 - $month_view = new PHUICalendarMonthView($month, $year, $now_day); 299 + if ($start_month == $now_month && $start_year == $now_year) { 300 + $month_view = new PHUICalendarMonthView( 301 + $start_month, 302 + $start_year, 303 + $now_day); 272 304 } else { 273 - $month_view = new PHUICalendarMonthView($month, $year); 305 + $month_view = new PHUICalendarMonthView( 306 + $start_month, 307 + $start_year); 274 308 } 275 309 276 310 $month_view->setUser($viewer); ··· 309 343 $month_view->addEvent($event); 310 344 } 311 345 346 + $month_view->setBrowseURI( 347 + $this->getURI('query/'.$query->getQueryKey().'/')); 348 + 312 349 return $month_view; 350 + } 313 351 352 + private function getDisplayMonthAndYear( 353 + PhabricatorSavedQuery $query) { 354 + $viewer = $this->requireViewer(); 314 355 356 + // get month/year from url 357 + if ($this->calendarYear && $this->calendarMonth) { 358 + $start_year = $this->calendarYear; 359 + $start_month = $this->calendarMonth; 360 + } else { 361 + $epoch = $query->getParameter('rangeStart'); 362 + if (!$epoch) { 363 + $epoch = $query->getParameter('rangeEnd'); 364 + if (!$epoch) { 365 + $epoch = time(); 366 + } 367 + } 368 + $start_year = phabricator_format_local_time($epoch, $viewer, 'Y'); 369 + $start_month = phabricator_format_local_time($epoch, $viewer, 'm'); 370 + } 371 + 372 + return array($start_month, $start_year); 373 + } 374 + 375 + public function getPageSize(PhabricatorSavedQuery $saved) { 376 + return $saved->getParameter('limit', 1000); 315 377 } 316 378 317 379 }
+17
src/view/form/control/AphrontFormDateControlValue.php
··· 30 30 return ($this->getEpoch() !== null); 31 31 } 32 32 33 + public static function newFromParts( 34 + PhabricatorUser $viewer, 35 + $year, 36 + $month, 37 + $day, 38 + $time = '12:00 AM') { 39 + 40 + $value = new AphrontFormDateControlValue(); 41 + $value->viewer = $viewer; 42 + $value->valueYear = $year; 43 + $value->valueMonth = $month; 44 + $value->valueDay = $day; 45 + $value->valueTime = $time; 46 + 47 + return $value; 48 + } 49 + 33 50 public static function newFromRequest($request, $key) { 34 51 $value = new AphrontFormDateControlValue(); 35 52 $value->viewer = $request->getViewer();
+2 -5
src/view/phui/calendar/PHUICalendarMonthView.php
··· 205 205 // check for a browseURI, which means we need "fancy" prev / next UI 206 206 $uri = $this->getBrowseURI(); 207 207 if ($uri) { 208 - $uri = new PhutilURI($uri); 209 208 list($prev_year, $prev_month) = $this->getPrevYearAndMonth(); 210 - $query = array('year' => $prev_year, 'month' => $prev_month); 211 - $prev_uri = (string) $uri->setQueryParams($query); 209 + $prev_uri = $uri.$prev_year.'/'.$prev_month.'/'; 212 210 213 211 list($next_year, $next_month) = $this->getNextYearAndMonth(); 214 - $query = array('year' => $next_year, 'month' => $next_month); 215 - $next_uri = (string) $uri->setQueryParams($query); 212 + $next_uri = $uri.$next_year.'/'.$next_month.'/'; 216 213 217 214 $button_bar = new PHUIButtonBarView(); 218 215