1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-26 08:42:41 +01:00

First stab at day view

Summary: Ref T4393, First stab at day view.

Test Plan: Open Calendar Advanced Search, select "Day View (beta)", see rough day view of selected day.

Reviewers: chad, epriestley, #blessed_reviewers

Reviewed By: epriestley, #blessed_reviewers

Subscribers: Korvin, epriestley

Maniphest Tasks: T4393

Differential Revision: https://secure.phabricator.com/D12685
This commit is contained in:
lkassianik 2015-05-03 16:57:18 -07:00
parent 1ab919544c
commit ee2af90455
6 changed files with 262 additions and 4 deletions

View file

@ -119,7 +119,7 @@ return array(
'rsrc/css/layout/phabricator-hovercard-view.css' => '44394670',
'rsrc/css/layout/phabricator-side-menu-view.css' => 'c1db9e9c',
'rsrc/css/layout/phabricator-source-code-view.css' => '2ceee894',
'rsrc/css/phui/calendar/phui-calendar-day.css' => 'de035c8a',
'rsrc/css/phui/calendar/phui-calendar-day.css' => 'a00b748d',
'rsrc/css/phui/calendar/phui-calendar-list.css' => 'c1d0ca59',
'rsrc/css/phui/calendar/phui-calendar-month.css' => 'a92e47d2',
'rsrc/css/phui/calendar/phui-calendar.css' => '8675968e',
@ -780,7 +780,7 @@ return array(
'phui-box-css' => '7b3a2eed',
'phui-button-css' => 'de610129',
'phui-calendar-css' => '8675968e',
'phui-calendar-day-css' => 'de035c8a',
'phui-calendar-day-css' => 'a00b748d',
'phui-calendar-list-css' => 'c1d0ca59',
'phui-calendar-month-css' => 'a92e47d2',
'phui-crumbs-view-css' => '594d719e',

View file

@ -102,6 +102,7 @@ phutil_register_library_map(array(
'AphrontApplicationConfiguration' => 'aphront/configuration/AphrontApplicationConfiguration.php',
'AphrontBarView' => 'view/widget/bars/AphrontBarView.php',
'AphrontCSRFException' => 'aphront/exception/AphrontCSRFException.php',
'AphrontCalendarDayEventView' => 'applications/calendar/view/AphrontCalendarDayEventView.php',
'AphrontCalendarEventView' => 'applications/calendar/view/AphrontCalendarEventView.php',
'AphrontController' => 'aphront/AphrontController.php',
'AphrontCursorPagerView' => 'view/control/AphrontCursorPagerView.php',
@ -1159,6 +1160,7 @@ phutil_register_library_map(array(
'PHUIButtonBarView' => 'view/phui/PHUIButtonBarView.php',
'PHUIButtonExample' => 'applications/uiexample/examples/PHUIButtonExample.php',
'PHUIButtonView' => 'view/phui/PHUIButtonView.php',
'PHUICalendarDayView' => 'view/phui/calendar/PHUICalendarDayView.php',
'PHUICalendarListView' => 'view/phui/calendar/PHUICalendarListView.php',
'PHUICalendarMonthView' => 'view/phui/calendar/PHUICalendarMonthView.php',
'PHUICalendarWidgetView' => 'view/phui/calendar/PHUICalendarWidgetView.php',
@ -1498,7 +1500,6 @@ phutil_register_library_map(array(
'PhabricatorCalendarEventEditController' => 'applications/calendar/controller/PhabricatorCalendarEventEditController.php',
'PhabricatorCalendarEventEditor' => 'applications/calendar/editor/PhabricatorCalendarEventEditor.php',
'PhabricatorCalendarEventEmailCommand' => 'applications/calendar/command/PhabricatorCalendarEventEmailCommand.php',
'PhabricatorCalendarEventInvalidEpochException' => 'applications/calendar/exception/PhabricatorCalendarEventInvalidEpochException.php',
'PhabricatorCalendarEventInvitee' => 'applications/calendar/storage/PhabricatorCalendarEventInvitee.php',
'PhabricatorCalendarEventInviteeQuery' => 'applications/calendar/query/PhabricatorCalendarEventInviteeQuery.php',
'PhabricatorCalendarEventJoinController' => 'applications/calendar/controller/PhabricatorCalendarEventJoinController.php',
@ -3349,6 +3350,7 @@ phutil_register_library_map(array(
'AphrontAjaxResponse' => 'AphrontResponse',
'AphrontBarView' => 'AphrontView',
'AphrontCSRFException' => 'AphrontException',
'AphrontCalendarDayEventView' => 'AphrontView',
'AphrontCalendarEventView' => 'AphrontView',
'AphrontController' => 'Phobject',
'AphrontCursorPagerView' => 'AphrontView',
@ -4483,6 +4485,7 @@ phutil_register_library_map(array(
'PHUIButtonBarView' => 'AphrontTagView',
'PHUIButtonExample' => 'PhabricatorUIExample',
'PHUIButtonView' => 'AphrontTagView',
'PHUICalendarDayView' => 'AphrontView',
'PHUICalendarListView' => 'AphrontTagView',
'PHUICalendarMonthView' => 'AphrontView',
'PHUICalendarWidgetView' => 'AphrontTagView',
@ -4848,7 +4851,6 @@ phutil_register_library_map(array(
'PhabricatorCalendarEventEditController' => 'PhabricatorCalendarController',
'PhabricatorCalendarEventEditor' => 'PhabricatorApplicationTransactionEditor',
'PhabricatorCalendarEventEmailCommand' => 'MetaMTAEmailTransactionCommand',
'PhabricatorCalendarEventInvalidEpochException' => 'Exception',
'PhabricatorCalendarEventInvitee' => array(
'PhabricatorCalendarDAO',
'PhabricatorPolicyInterface',

View file

@ -5,6 +5,7 @@ final class PhabricatorCalendarEventSearchEngine
private $calendarYear;
private $calendarMonth;
private $calendarDay;
public function getResultTypeDescription() {
return pht('Calendar Events');
@ -144,6 +145,7 @@ final class PhabricatorCalendarEventSearchEngine
);
$display_options = array(
'month' => pht('Month View'),
'day' => pht('Day View (beta)'),
'list' => pht('List View'),
);
@ -249,6 +251,8 @@ final class PhabricatorCalendarEventSearchEngine
if ($query->getParameter('display') == 'month') {
return $this->buildCalendarView($events, $query, $handles);
} else if ($query->getParameter('display') == 'day') {
return $this->buildCalendarDayView($events, $query, $handles);
}
assert_instances_of($events, 'PhabricatorCalendarEvent');
@ -349,6 +353,34 @@ final class PhabricatorCalendarEventSearchEngine
return $month_view;
}
private function buildCalendarDayView(
array $statuses,
PhabricatorSavedQuery $query,
array $handles) {
$viewer = $this->requireViewer();
list($start_month, $start_year, $start_day) =
$this->getDisplayMonthAndYearAndDay($query);
$day_view = new PHUICalendarDayView(
$start_month,
$start_year,
$start_day);
$day_view->setUser($viewer);
$phids = mpull($statuses, 'getUserPHID');
foreach ($statuses as $status) {
$event = new AphrontCalendarDayEventView();
$event->setEpochRange($status->getDateFrom(), $status->getDateTo());
$event->setName($status->getName());
$day_view->addEvent($event);
}
return $day_view;
}
private function getDisplayMonthAndYear(
PhabricatorSavedQuery $query) {
$viewer = $this->requireViewer();
@ -372,6 +404,28 @@ final class PhabricatorCalendarEventSearchEngine
return array($start_month, $start_year);
}
private function getDisplayMonthAndYearAndDay(
PhabricatorSavedQuery $query) {
$viewer = $this->requireViewer();
if ($this->calendarYear && $this->calendarMonth && $this->calendarDay) {
$start_year = $this->calendarYear;
$start_month = $this->calendarMonth;
$start_day = $this->calendarDay;
} else {
$epoch = $query->getParameter('rangeStart');
if (!$epoch) {
$epoch = $query->getParameter('rangeEnd');
if (!$epoch) {
$epoch = time();
}
}
$start_year = phabricator_format_local_time($epoch, $viewer, 'Y');
$start_month = phabricator_format_local_time($epoch, $viewer, 'm');
$start_day = phabricator_format_local_time($epoch, $viewer, 'd');
}
return array($start_year, $start_month, $start_day);
}
public function getPageSize(PhabricatorSavedQuery $saved) {
return $saved->getParameter('limit', 1000);
}

View file

@ -0,0 +1,39 @@
<?php
final class AphrontCalendarDayEventView extends AphrontView {
private $event;
private $epochStart;
private $epochEnd;
private $name;
public function setName($name) {
$this->name = $name;
return $this;
}
public function getName() {
return $this->name;
}
public function setEpochRange($start, $end) {
$this->epochStart = $start;
$this->epochEnd = $end;
return $this;
}
public function getEpochStart() {
return $this->epochStart;
}
public function getEpochEnd() {
return $this->epochEnd;
}
public function render() {
$box = new PHUIObjectBoxView();
$box->setHeaderText($this->name);
return $box;
}
}

View file

@ -0,0 +1,131 @@
<?php
final class PHUICalendarDayView extends AphrontView {
private $day;
private $month;
private $year;
private $events = array();
public function addEvent(AphrontCalendarDayEventView $event) {
$this->events[] = $event;
return $this;
}
public function __construct($year, $month, $day = null) {
$this->day = $day;
$this->month = $month;
$this->year = $year;
}
public function render() {
require_celerity_resource('phui-calendar-day-css');
$day_box = new PHUIObjectBoxView();
$day_of_week = $this->getDayOfWeek();
$header_text = $this->getDateTime()->format('F j, Y');
$header_text = $day_of_week.', '.$header_text;
$day_box->setHeaderText($header_text);
$hours = $this->getHoursOfDay();
$rows = array();
foreach ($hours as $hour) {
// time slot
$cell_time = phutil_tag(
'td',
array('class' => 'phui-calendar-day-hour'),
$hour->format('g:i A'));
$event_boxes = array();
foreach ($this->events as $event) {
if ($event->getEpochStart() >= $hour->format('U')
&& $event->getEpochStart() < $hour->modify('+1 hour')->format('U')) {
$event_boxes[] = $this->drawEvent($event);
}
}
// events starting in time slot
$cell_event = phutil_tag(
'td',
array(),
$event_boxes);
$row = phutil_tag(
'tr',
array(),
array($cell_time, $cell_event));
$rows[] = $row;
}
$table = phutil_tag(
'table',
array('class' => 'phui-calendar-day-view'),
array(
'',
$rows,
));
$day_box->appendChild($table);
return $day_box;
}
private function drawEvent(AphrontCalendarDayEventView $event) {
$name = phutil_tag(
'div',
array(),
$event->getName());
$div = phutil_tag(
'div',
array('class' => 'phui-calendar-day-event'),
$name);
return $div;
}
private function getDayOfWeek() {
$date = $this->getDateTime();
$day_of_week = $date->format('l');
return $day_of_week;
}
// returns DateTime of each hour in the day
private function getHoursOfDay() {
$included_datetimes = array();
$day_datetime = $this->getDateTime();
$day_epoch = $day_datetime->format('U');
$day_datetime->modify('+1 day');
$next_day_epoch = $day_datetime->format('U');
$included_time = $day_epoch;
$included_datetime = $this->getDateTime();
while ($included_time < $next_day_epoch) {
$included_datetimes[] = clone $included_datetime;
$included_datetime->modify('+1 hour');
$included_time = $included_datetime->format('U');
}
return $included_datetimes;
}
private function getDateTime() {
$user = $this->user;
$timezone = new DateTimeZone($user->getTimezoneIdentifier());
$day = $this->day;
$month = $this->month;
$year = $this->year;
$date = new DateTime("{$year}-{$month}-{$day} ", $timezone);
return $date;
}
}

View file

@ -1,3 +1,35 @@
/**
* @provides phui-calendar-day-css
*/
.phui-calendar-day-view {
overflow: scroll;
width: 100%;
}
.phui-calendar-day-hour {
width: 60px;
font-size: 10px;
}
.phui-calendar-day-view tr {
width: 100%;
height: 60px;
border: 1px solid {$lightgreyborder};
}
.phui-calendar-day-view td {
position: relative;
}
.phui-calendar-day-view td div.phui-calendar-day-event {
width: 100%;
background-color: {$darkgreybackground};
position: absolute;
top: 0;
bottom: 0;
}
.phui-calendar-day-view td div.phui-calendar-day-event div {
padding: 4px;
}