mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-19 20:10:55 +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-side-menu-view.css' => 'dd849797',
|
||||||
'rsrc/css/layout/phabricator-source-code-view.css' => 'cbeef983',
|
'rsrc/css/layout/phabricator-source-code-view.css' => 'cbeef983',
|
||||||
'rsrc/css/phui/calendar/phui-calendar-day.css' => 'd1cf6f93',
|
'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-month.css' => '476be7e0',
|
||||||
'rsrc/css/phui/calendar/phui-calendar.css' => 'ccabe893',
|
'rsrc/css/phui/calendar/phui-calendar.css' => 'ccabe893',
|
||||||
'rsrc/css/phui/phui-action-list.css' => 'c5eba19d',
|
'rsrc/css/phui/phui-action-list.css' => 'c5eba19d',
|
||||||
|
@ -822,7 +822,7 @@ return array(
|
||||||
'phui-button-css' => 'a64a8de6',
|
'phui-button-css' => 'a64a8de6',
|
||||||
'phui-calendar-css' => 'ccabe893',
|
'phui-calendar-css' => 'ccabe893',
|
||||||
'phui-calendar-day-css' => 'd1cf6f93',
|
'phui-calendar-day-css' => 'd1cf6f93',
|
||||||
'phui-calendar-list-css' => 'c1c7f338',
|
'phui-calendar-list-css' => 'e0866209',
|
||||||
'phui-calendar-month-css' => '476be7e0',
|
'phui-calendar-month-css' => '476be7e0',
|
||||||
'phui-chart-css' => '6bf6f78e',
|
'phui-chart-css' => '6bf6f78e',
|
||||||
'phui-crumbs-view-css' => '6b813619',
|
'phui-crumbs-view-css' => '6b813619',
|
||||||
|
|
|
@ -1569,6 +1569,7 @@ phutil_register_library_map(array(
|
||||||
'PHUICalendarDayView' => 'view/phui/calendar/PHUICalendarDayView.php',
|
'PHUICalendarDayView' => 'view/phui/calendar/PHUICalendarDayView.php',
|
||||||
'PHUICalendarListView' => 'view/phui/calendar/PHUICalendarListView.php',
|
'PHUICalendarListView' => 'view/phui/calendar/PHUICalendarListView.php',
|
||||||
'PHUICalendarMonthView' => 'view/phui/calendar/PHUICalendarMonthView.php',
|
'PHUICalendarMonthView' => 'view/phui/calendar/PHUICalendarMonthView.php',
|
||||||
|
'PHUICalendarWeekView' => 'view/phui/calendar/PHUICalendarWeekView.php',
|
||||||
'PHUICalendarWidgetView' => 'view/phui/calendar/PHUICalendarWidgetView.php',
|
'PHUICalendarWidgetView' => 'view/phui/calendar/PHUICalendarWidgetView.php',
|
||||||
'PHUIColorPalletteExample' => 'applications/uiexample/examples/PHUIColorPalletteExample.php',
|
'PHUIColorPalletteExample' => 'applications/uiexample/examples/PHUIColorPalletteExample.php',
|
||||||
'PHUICrumbView' => 'view/phui/PHUICrumbView.php',
|
'PHUICrumbView' => 'view/phui/PHUICrumbView.php',
|
||||||
|
@ -5974,6 +5975,7 @@ phutil_register_library_map(array(
|
||||||
'PHUICalendarDayView' => 'AphrontView',
|
'PHUICalendarDayView' => 'AphrontView',
|
||||||
'PHUICalendarListView' => 'AphrontTagView',
|
'PHUICalendarListView' => 'AphrontTagView',
|
||||||
'PHUICalendarMonthView' => 'AphrontView',
|
'PHUICalendarMonthView' => 'AphrontView',
|
||||||
|
'PHUICalendarWeekView' => 'AphrontView',
|
||||||
'PHUICalendarWidgetView' => 'AphrontTagView',
|
'PHUICalendarWidgetView' => 'AphrontTagView',
|
||||||
'PHUIColorPalletteExample' => 'PhabricatorUIExample',
|
'PHUIColorPalletteExample' => 'PhabricatorUIExample',
|
||||||
'PHUICrumbView' => 'AphrontView',
|
'PHUICrumbView' => 'AphrontView',
|
||||||
|
|
|
@ -59,6 +59,7 @@ final class PhabricatorPeopleProfileViewController
|
||||||
|
|
||||||
$projects = $this->buildProjectsView($user);
|
$projects = $this->buildProjectsView($user);
|
||||||
$badges = $this->buildBadgesView($user);
|
$badges = $this->buildBadgesView($user);
|
||||||
|
$calendar = $this->buildCalendarDayView($user);
|
||||||
require_celerity_resource('project-view-css');
|
require_celerity_resource('project-view-css');
|
||||||
|
|
||||||
$home = id(new PHUITwoColumnView())
|
$home = id(new PHUITwoColumnView())
|
||||||
|
@ -73,6 +74,7 @@ final class PhabricatorPeopleProfileViewController
|
||||||
array(
|
array(
|
||||||
$projects,
|
$projects,
|
||||||
$badges,
|
$badges,
|
||||||
|
$calendar,
|
||||||
));
|
));
|
||||||
|
|
||||||
$nav = $this->getProfileMenu();
|
$nav = $this->getProfileMenu();
|
||||||
|
@ -172,6 +174,69 @@ final class PhabricatorPeopleProfileViewController
|
||||||
return $box;
|
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) {
|
private function buildBadgesView(PhabricatorUser $user) {
|
||||||
|
|
||||||
$viewer = $this->getViewer();
|
$viewer = $this->getViewer();
|
||||||
|
|
|
@ -145,7 +145,11 @@ final class PHUICalendarDayView extends AphrontView {
|
||||||
}
|
}
|
||||||
|
|
||||||
$header = $this->renderDayViewHeader();
|
$header = $this->renderDayViewHeader();
|
||||||
$sidebar = $this->renderSidebar();
|
$sidebar = id(new PHUICalendarWeekView())
|
||||||
|
->setViewer($this->getViewer())
|
||||||
|
->setEvents($this->events)
|
||||||
|
->setDateTime($this->getDateTime())
|
||||||
|
->render();
|
||||||
$warnings = $this->getQueryRangeWarning();
|
$warnings = $this->getQueryRangeWarning();
|
||||||
|
|
||||||
$table_id = celerity_generate_unique_node_id();
|
$table_id = celerity_generate_unique_node_id();
|
||||||
|
@ -242,91 +246,6 @@ final class PHUICalendarDayView extends AphrontView {
|
||||||
return $errors;
|
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() {
|
private function renderDayViewHeader() {
|
||||||
$button_bar = null;
|
$button_bar = null;
|
||||||
$uri = $this->getBrowseURI();
|
$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
|
* @provides phui-calendar-list-css
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.phui-calendar-list-container {
|
|
||||||
width: 300px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.device-phone .phui-calendar-list-container {
|
.device-phone .phui-calendar-list-container {
|
||||||
width: auto;
|
width: auto;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue