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

Calendar day view and corresponding sidebar should correctly display all all-day events returned from query

Summary: Closes T8085, Calendar day view and corresponding sidebar should correctly display all all-day events returned from query

Test Plan: Open day view with all-day and multi-day events, all events should correctly be drawn in day view in correct order, and sidebar preview should correctly mark future day boxes with all day events.

Reviewers: epriestley, #blessed_reviewers

Reviewed By: epriestley, #blessed_reviewers

Subscribers: Korvin, epriestley

Maniphest Tasks: T8085

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

+79 -30
+5
src/applications/calendar/query/PhabricatorCalendarEventSearchEngine.php
··· 392 392 $phids = mpull($statuses, 'getUserPHID'); 393 393 394 394 foreach ($statuses as $status) { 395 + if ($status->getIsCancelled()) { 396 + continue; 397 + } 398 + 395 399 $event = new AphrontCalendarEventView(); 396 400 $event->setEventID($status->getID()); 397 401 $event->setEpochRange($status->getDateFrom(), $status->getDateTo()); 402 + $event->setIsAllDay($status->getIsAllDay()); 398 403 399 404 $event->setName($status->getName()); 400 405 $event->setURI('/'.$status->getMonogram());
+9 -6
src/applications/calendar/view/AphrontCalendarEventView.php
··· 10 10 private $eventID; 11 11 private $color; 12 12 private $uri; 13 + private $isAllDay; 13 14 14 15 public function setURI($uri) { 15 16 $this->uri = $uri; ··· 81 82 } 82 83 } 83 84 84 - public function getAllDay() { 85 - $time = (60 * 60 * 22); 86 - if (($this->getEpochEnd() - $this->getEpochStart()) >= $time) { 87 - return true; 88 - } 89 - return false; 85 + public function setIsAllDay($is_all_day) { 86 + $this->isAllDay = $is_all_day; 87 + return $this; 90 88 } 89 + 90 + public function getIsAllDay() { 91 + return $this->isAllDay; 92 + } 93 + 91 94 92 95 public function getMultiDay() { 93 96 $nextday = strtotime('12:00 AM Tomorrow', $this->getEpochStart());
+64 -23
src/view/phui/calendar/PHUICalendarDayView.php
··· 7 7 private $year; 8 8 private $browseURI; 9 9 private $events = array(); 10 + private $todayEvents = array(); 11 + 12 + private $allDayEvents = array(); 10 13 11 14 public function addEvent(AphrontCalendarEventView $event) { 12 15 $this->events[] = $event; ··· 34 37 $hourly_events = array(); 35 38 $rows = array(); 36 39 40 + $all_day_events = $this->getAllDayEvents(); 41 + 37 42 // sort events into buckets by their start time 38 43 // pretend no events overlap 39 44 foreach ($hours as $hour) { 40 - $events = array(); 45 + $current_hour_events = array(); 41 46 $hour_start = $hour->format('U'); 42 47 $hour_end = id(clone $hour)->modify('+1 hour')->format('U'); 48 + 49 + if ($hour == $this->getDateTime()) { 50 + foreach ($all_day_events as $all_day_event) { 51 + $all_day_start = $all_day_event->getEpochStart(); 52 + $all_day_end = $all_day_event->getEpochEnd(); 53 + $day_end = id(clone $hour)->modify('+1 day')->format('U') - 1; 54 + 55 + if ($all_day_start < $day_end && $all_day_end > $hour_start) { 56 + 57 + $current_hour_events[] = $all_day_event; 58 + $this->todayEvents[] = $all_day_event; 59 + } 60 + } 61 + } 43 62 foreach ($this->events as $event) { 63 + if ($event->getIsAllDay()) { 64 + continue; 65 + } 44 66 if ($event->getEpochStart() >= $hour_start 45 67 && $event->getEpochStart() < $hour_end) { 46 - $events[] = $event; 68 + $current_hour_events[] = $event; 69 + $this->todayEvents[] = $event; 47 70 } 48 71 } 49 - $count_events = count($events); 50 - $n = 0; 51 - foreach ($events as $event) { 72 + foreach ($current_hour_events as $event) { 52 73 $event_start = $event->getEpochStart(); 53 74 $event_end = $event->getEpochEnd(); 54 75 55 - $top = ((($event_start - $hour_start) / ($hour_end - $hour_start)) 56 - * 100).'%'; 57 - $height = ((($event_end - $event_start) / ($hour_end - $hour_start)) 58 - * 100).'%'; 76 + $top = (($event_start - $hour_start) / ($hour_end - $hour_start)) 77 + * 100; 78 + $top = max(0, $top); 79 + 80 + $height = (($event_end - $event_start) / ($hour_end - $hour_start)) 81 + * 100; 82 + $height = min(2400, $height); 59 83 60 84 $hourly_events[$event->getEventID()] = array( 61 85 'hour' => $hour, 62 86 'event' => $event, 63 87 'offset' => '0', 64 88 'width' => '100%', 65 - 'top' => $top, 66 - 'height' => $height, 89 + 'top' => $top.'%', 90 + 'height' => $height.'%', 67 91 ); 68 - 69 - $n++; 70 92 } 71 93 } 72 94 73 - $clusters = $this->findClusters(); 95 + $clusters = $this->findTodayClusters(); 74 96 foreach ($clusters as $cluster) { 75 97 $hourly_events = $this->updateEventsFromCluster( 76 98 $cluster, ··· 138 160 $layout); 139 161 } 140 162 163 + private function getAllDayEvents() { 164 + $all_day_events = array(); 165 + 166 + foreach ($this->events as $event) { 167 + if ($event->getIsAllDay()) { 168 + $all_day_events[] = $event; 169 + } 170 + } 171 + 172 + $all_day_events = array_values(msort($all_day_events, 'getEpochStart')); 173 + 174 + return $all_day_events; 175 + } 176 + 141 177 private function renderSidebar() { 142 178 $this->events = msort($this->events, 'getEpochStart'); 143 179 $week_of_boxes = $this->getWeekOfBoxes(); 144 180 $filled_boxes = array(); 145 181 146 - foreach ($week_of_boxes as $weekly_box) { 147 - $start = $weekly_box['start']; 148 - $end = id(clone $start)->modify('+1 day'); 182 + foreach ($week_of_boxes as $day_box) { 183 + $box_start = $day_box['start']; 184 + $box_end = id(clone $box_start)->modify('+1 day'); 185 + 186 + $box_start = $box_start->format('U'); 187 + $box_end = $box_end->format('U'); 149 188 150 189 $box_events = array(); 151 190 152 191 foreach ($this->events as $event) { 153 - if ($event->getEpochStart() >= $start->format('U') && 154 - $event->getEpochStart() < $end->format('U')) { 192 + $event_start = $event->getEpochStart(); 193 + $event_end = $event->getEpochEnd(); 194 + 195 + if ($event_start < $box_end && $event_end > $box_start) { 155 196 $box_events[] = $event; 156 197 } 157 198 } 199 + 158 200 $filled_boxes[] = $this->renderSidebarBox( 159 201 $box_events, 160 - $weekly_box['title']); 202 + $day_box['title']); 161 203 } 162 204 163 205 return $filled_boxes; ··· 267 309 268 310 private function updateEventsFromCluster($cluster, $hourly_events) { 269 311 $cluster_size = count($cluster); 270 - 271 312 $n = 0; 272 313 foreach ($cluster as $cluster_member) { 273 314 $event_id = $cluster_member->getEventID(); ··· 375 416 return $date; 376 417 } 377 418 378 - private function findClusters() { 379 - $events = msort($this->events, 'getEpochStart'); 419 + private function findTodayClusters() { 420 + $events = msort($this->todayEvents, 'getEpochStart'); 380 421 $clusters = array(); 381 422 382 423 foreach ($events as $event) {
+1 -1
src/view/phui/calendar/PHUICalendarListView.php
··· 37 37 foreach ($events as $event) { 38 38 $color = $event->getColor(); 39 39 40 - if ($event->getAllDay()) { 40 + if ($event->getIsAllDay()) { 41 41 $timelabel = pht('All Day'); 42 42 } else { 43 43 $timelabel = phabricator_time(