mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-10 00:42:41 +01:00
Adding a calendar preview panel to people profile
Summary: Ref T9606 Test Plan: Open people profile for a user with events today/tomorrow, see a panel under badges panel with event list Reviewers: chad, epriestley, #blessed_reviewers Reviewed By: epriestley, #blessed_reviewers Subscribers: Korvin Maniphest Tasks: T9606 Differential Revision: https://secure.phabricator.com/D15851
This commit is contained in:
parent
efd001b42f
commit
de645301b5
6 changed files with 195 additions and 92 deletions
|
@ -116,7 +116,7 @@ return array(
|
|||
'rsrc/css/layout/phabricator-side-menu-view.css' => 'dd849797',
|
||||
'rsrc/css/layout/phabricator-source-code-view.css' => 'cbeef983',
|
||||
'rsrc/css/phui/calendar/phui-calendar-day.css' => 'd1cf6f93',
|
||||
'rsrc/css/phui/calendar/phui-calendar-list.css' => 'c1c7f338',
|
||||
'rsrc/css/phui/calendar/phui-calendar-list.css' => 'e0866209',
|
||||
'rsrc/css/phui/calendar/phui-calendar-month.css' => '476be7e0',
|
||||
'rsrc/css/phui/calendar/phui-calendar.css' => 'ccabe893',
|
||||
'rsrc/css/phui/phui-action-list.css' => 'c5eba19d',
|
||||
|
@ -822,7 +822,7 @@ return array(
|
|||
'phui-button-css' => 'a64a8de6',
|
||||
'phui-calendar-css' => 'ccabe893',
|
||||
'phui-calendar-day-css' => 'd1cf6f93',
|
||||
'phui-calendar-list-css' => 'c1c7f338',
|
||||
'phui-calendar-list-css' => 'e0866209',
|
||||
'phui-calendar-month-css' => '476be7e0',
|
||||
'phui-chart-css' => '6bf6f78e',
|
||||
'phui-crumbs-view-css' => '6b813619',
|
||||
|
|
|
@ -1569,6 +1569,7 @@ phutil_register_library_map(array(
|
|||
'PHUICalendarDayView' => 'view/phui/calendar/PHUICalendarDayView.php',
|
||||
'PHUICalendarListView' => 'view/phui/calendar/PHUICalendarListView.php',
|
||||
'PHUICalendarMonthView' => 'view/phui/calendar/PHUICalendarMonthView.php',
|
||||
'PHUICalendarWeekView' => 'view/phui/calendar/PHUICalendarWeekView.php',
|
||||
'PHUICalendarWidgetView' => 'view/phui/calendar/PHUICalendarWidgetView.php',
|
||||
'PHUIColorPalletteExample' => 'applications/uiexample/examples/PHUIColorPalletteExample.php',
|
||||
'PHUICrumbView' => 'view/phui/PHUICrumbView.php',
|
||||
|
@ -5974,6 +5975,7 @@ phutil_register_library_map(array(
|
|||
'PHUICalendarDayView' => 'AphrontView',
|
||||
'PHUICalendarListView' => 'AphrontTagView',
|
||||
'PHUICalendarMonthView' => 'AphrontView',
|
||||
'PHUICalendarWeekView' => 'AphrontView',
|
||||
'PHUICalendarWidgetView' => 'AphrontTagView',
|
||||
'PHUIColorPalletteExample' => 'PhabricatorUIExample',
|
||||
'PHUICrumbView' => 'AphrontView',
|
||||
|
|
|
@ -59,6 +59,7 @@ final class PhabricatorPeopleProfileViewController
|
|||
|
||||
$projects = $this->buildProjectsView($user);
|
||||
$badges = $this->buildBadgesView($user);
|
||||
$calendar = $this->buildCalendarDayView($user);
|
||||
require_celerity_resource('project-view-css');
|
||||
|
||||
$home = id(new PHUITwoColumnView())
|
||||
|
@ -73,6 +74,7 @@ final class PhabricatorPeopleProfileViewController
|
|||
array(
|
||||
$projects,
|
||||
$badges,
|
||||
$calendar,
|
||||
));
|
||||
|
||||
$nav = $this->getProfileMenu();
|
||||
|
@ -172,6 +174,69 @@ final class PhabricatorPeopleProfileViewController
|
|||
return $box;
|
||||
}
|
||||
|
||||
private function buildCalendarDayView(PhabricatorUser $user) {
|
||||
$viewer = $this->getViewer();
|
||||
$class = 'PhabricatorCalendarApplication';
|
||||
|
||||
if (!PhabricatorApplication::isClassInstalledForViewer($class, $viewer)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$midnight = PhabricatorTime::getTodayMidnightDateTime($viewer);
|
||||
$week_end = clone $midnight;
|
||||
$week_end = $week_end->modify('+3 days');
|
||||
|
||||
$range_start = $midnight->format('U');
|
||||
$range_end = $week_end->format('U');
|
||||
|
||||
$query = id(new PhabricatorCalendarEventQuery())
|
||||
->setViewer($viewer)
|
||||
->withDateRange($range_start, $range_end)
|
||||
->withInvitedPHIDs(array($viewer->getPHID()))
|
||||
->withIsCancelled(false);
|
||||
|
||||
$statuses = $query->execute();
|
||||
$phids = mpull($statuses, 'getUserPHID');
|
||||
$events = array();
|
||||
|
||||
foreach ($statuses as $status) {
|
||||
$viewer_is_invited = $status->getIsUserInvited($viewer->getPHID());
|
||||
|
||||
$can_edit = PhabricatorPolicyFilter::hasCapability(
|
||||
$viewer,
|
||||
$status,
|
||||
PhabricatorPolicyCapability::CAN_EDIT);
|
||||
|
||||
$event = new AphrontCalendarEventView();
|
||||
$event->setCanEdit($can_edit);
|
||||
$event->setEventID($status->getID());
|
||||
$event->setEpochRange($status->getDateFrom(), $status->getDateTo());
|
||||
$event->setIsAllDay($status->getIsAllDay());
|
||||
$event->setIcon($status->getIcon());
|
||||
$event->setViewerIsInvited($viewer_is_invited);
|
||||
|
||||
$event->setName($status->getName());
|
||||
$event->setURI($status->getURI());
|
||||
$events[] = $event;
|
||||
}
|
||||
|
||||
$events = msort($events, 'getEpochStart');
|
||||
$day_view = id(new PHUICalendarWeekView())
|
||||
->setViewer($viewer)
|
||||
->setEvents($events)
|
||||
->setWeekLength(3)
|
||||
->render();
|
||||
|
||||
$header = id(new PHUIHeaderView())
|
||||
->setHeader(pht('Calendar'));
|
||||
$box = id(new PHUIObjectBoxView())
|
||||
->setHeader($header)
|
||||
->appendChild($day_view)
|
||||
->setBackground(PHUIObjectBoxView::GREY);
|
||||
|
||||
return $box;
|
||||
}
|
||||
|
||||
private function buildBadgesView(PhabricatorUser $user) {
|
||||
|
||||
$viewer = $this->getViewer();
|
||||
|
|
|
@ -145,7 +145,11 @@ final class PHUICalendarDayView extends AphrontView {
|
|||
}
|
||||
|
||||
$header = $this->renderDayViewHeader();
|
||||
$sidebar = $this->renderSidebar();
|
||||
$sidebar = id(new PHUICalendarWeekView())
|
||||
->setViewer($this->getViewer())
|
||||
->setEvents($this->events)
|
||||
->setDateTime($this->getDateTime())
|
||||
->render();
|
||||
$warnings = $this->getQueryRangeWarning();
|
||||
|
||||
$table_id = celerity_generate_unique_node_id();
|
||||
|
@ -242,91 +246,6 @@ final class PHUICalendarDayView extends AphrontView {
|
|||
return $errors;
|
||||
}
|
||||
|
||||
private function renderSidebar() {
|
||||
$this->events = msort($this->events, 'getEpochStart');
|
||||
$week_of_boxes = $this->getWeekOfBoxes();
|
||||
$filled_boxes = array();
|
||||
|
||||
foreach ($week_of_boxes as $day_box) {
|
||||
$box_start = $day_box['start'];
|
||||
$box_end = id(clone $box_start)->modify('+1 day');
|
||||
|
||||
$box_start = $box_start->format('U');
|
||||
$box_end = $box_end->format('U');
|
||||
|
||||
$box_events = array();
|
||||
|
||||
foreach ($this->events as $event) {
|
||||
$event_start = $event->getEpochStart();
|
||||
$event_end = $event->getEpochEnd();
|
||||
|
||||
if ($event_start < $box_end && $event_end > $box_start) {
|
||||
$box_events[] = $event;
|
||||
}
|
||||
}
|
||||
|
||||
$filled_boxes[] = $this->renderSidebarBox(
|
||||
$box_events,
|
||||
$day_box['title']);
|
||||
}
|
||||
|
||||
return $filled_boxes;
|
||||
}
|
||||
|
||||
private function renderSidebarBox($events, $title) {
|
||||
$widget = id(new PHUICalendarWidgetView())
|
||||
->addClass('calendar-day-view-sidebar');
|
||||
|
||||
$list = id(new PHUICalendarListView())
|
||||
->setUser($this->getViewer())
|
||||
->setView('day');
|
||||
|
||||
if (count($events) == 0) {
|
||||
$list->showBlankState(true);
|
||||
} else {
|
||||
$sorted_events = msort($events, 'getEpochStart');
|
||||
foreach ($sorted_events as $event) {
|
||||
$list->addEvent($event);
|
||||
}
|
||||
}
|
||||
|
||||
$widget
|
||||
->setCalendarList($list)
|
||||
->setHeader($title);
|
||||
return $widget;
|
||||
}
|
||||
|
||||
private function getWeekOfBoxes() {
|
||||
$sidebar_day_boxes = array();
|
||||
|
||||
$display_start_day = $this->getDateTime();
|
||||
$display_end_day = id(clone $display_start_day)->modify('+6 day');
|
||||
|
||||
$box_start_time = clone $display_start_day;
|
||||
|
||||
$today_time = PhabricatorTime::getTodayMidnightDateTime($this->getViewer());
|
||||
$tomorrow_time = clone $today_time;
|
||||
$tomorrow_time->modify('+1 day');
|
||||
|
||||
while ($box_start_time <= $display_end_day) {
|
||||
if ($box_start_time == $today_time) {
|
||||
$title = pht('Today');
|
||||
} else if ($box_start_time == $tomorrow_time) {
|
||||
$title = pht('Tomorrow');
|
||||
} else {
|
||||
$title = $box_start_time->format('l');
|
||||
}
|
||||
|
||||
$sidebar_day_boxes[] = array(
|
||||
'title' => $title,
|
||||
'start' => clone $box_start_time,
|
||||
);
|
||||
|
||||
$box_start_time->modify('+1 day');
|
||||
}
|
||||
return $sidebar_day_boxes;
|
||||
}
|
||||
|
||||
private function renderDayViewHeader() {
|
||||
$button_bar = null;
|
||||
$uri = $this->getBrowseURI();
|
||||
|
|
121
src/view/phui/calendar/PHUICalendarWeekView.php
Normal file
121
src/view/phui/calendar/PHUICalendarWeekView.php
Normal file
|
@ -0,0 +1,121 @@
|
|||
<?php
|
||||
|
||||
final class PHUICalendarWeekView extends AphrontView {
|
||||
private $events;
|
||||
private $dateTime;
|
||||
private $weekLength = 7;
|
||||
|
||||
public function setEvents($events) {
|
||||
$this->events = $events;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setDateTime($date_time) {
|
||||
$this->dateTime = $date_time;
|
||||
return $this;
|
||||
}
|
||||
|
||||
private function getDateTime() {
|
||||
if ($this->dateTime) {
|
||||
return $this->dateTime;
|
||||
}
|
||||
return $this->getDefaultDateTime();
|
||||
}
|
||||
|
||||
public function setWeekLength($week_length) {
|
||||
$this->weekLength = $week_length;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function render() {
|
||||
$this->events = msort($this->events, 'getEpochStart');
|
||||
$week_of_boxes = $this->getWeekOfBoxes();
|
||||
$filled_boxes = array();
|
||||
|
||||
foreach ($week_of_boxes as $day_box) {
|
||||
$box_start = $day_box['start'];
|
||||
$box_end = id(clone $box_start)->modify('+1 day');
|
||||
|
||||
$box_start = $box_start->format('U');
|
||||
$box_end = $box_end->format('U');
|
||||
|
||||
$box_events = array();
|
||||
|
||||
foreach ($this->events as $event) {
|
||||
$event_start = $event->getEpochStart();
|
||||
$event_end = $event->getEpochEnd();
|
||||
|
||||
if ($event_start < $box_end && $event_end > $box_start) {
|
||||
$box_events[] = $event;
|
||||
}
|
||||
}
|
||||
|
||||
$filled_boxes[] = $this->renderSidebarBox(
|
||||
$box_events,
|
||||
$day_box['title']);
|
||||
}
|
||||
|
||||
return $filled_boxes;
|
||||
}
|
||||
|
||||
private function renderSidebarBox($events, $title) {
|
||||
$widget = id(new PHUICalendarWidgetView())
|
||||
->addClass('calendar-day-view-sidebar');
|
||||
|
||||
$list = id(new PHUICalendarListView())
|
||||
->setUser($this->getViewer())
|
||||
->setView('day');
|
||||
|
||||
if (count($events) == 0) {
|
||||
$list->showBlankState(true);
|
||||
} else {
|
||||
$sorted_events = msort($events, 'getEpochStart');
|
||||
foreach ($sorted_events as $event) {
|
||||
$list->addEvent($event);
|
||||
}
|
||||
}
|
||||
|
||||
$widget
|
||||
->setCalendarList($list)
|
||||
->setHeader($title);
|
||||
return $widget;
|
||||
}
|
||||
|
||||
private function getWeekOfBoxes() {
|
||||
$day_boxes = array();
|
||||
$week_length = $this->weekLength - 1;
|
||||
|
||||
$display_start_day = $this->getDateTime();
|
||||
$display_end_day = id(clone $display_start_day)
|
||||
->modify('+'.$week_length.' day');
|
||||
|
||||
$box_start_time = clone $display_start_day;
|
||||
|
||||
$today_time = PhabricatorTime::getTodayMidnightDateTime($this->getViewer());
|
||||
$tomorrow_time = clone $today_time;
|
||||
$tomorrow_time->modify('+1 day');
|
||||
|
||||
while ($box_start_time <= $display_end_day) {
|
||||
if ($box_start_time == $today_time) {
|
||||
$title = pht('Today');
|
||||
} else if ($box_start_time == $tomorrow_time) {
|
||||
$title = pht('Tomorrow');
|
||||
} else {
|
||||
$title = $box_start_time->format('l');
|
||||
}
|
||||
|
||||
$day_boxes[] = array(
|
||||
'title' => $title,
|
||||
'start' => clone $box_start_time,
|
||||
);
|
||||
|
||||
$box_start_time->modify('+1 day');
|
||||
}
|
||||
return $day_boxes;
|
||||
}
|
||||
|
||||
private function getDefaultDateTime() {
|
||||
return PhabricatorTime::getTodayMidnightDateTime($this->getViewer());
|
||||
}
|
||||
|
||||
}
|
|
@ -2,10 +2,6 @@
|
|||
* @provides phui-calendar-list-css
|
||||
*/
|
||||
|
||||
.phui-calendar-list-container {
|
||||
width: 300px;
|
||||
}
|
||||
|
||||
.device-phone .phui-calendar-list-container {
|
||||
width: auto;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue