mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-26 16:52: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:
parent
1ab919544c
commit
ee2af90455
6 changed files with 262 additions and 4 deletions
|
@ -119,7 +119,7 @@ return array(
|
||||||
'rsrc/css/layout/phabricator-hovercard-view.css' => '44394670',
|
'rsrc/css/layout/phabricator-hovercard-view.css' => '44394670',
|
||||||
'rsrc/css/layout/phabricator-side-menu-view.css' => 'c1db9e9c',
|
'rsrc/css/layout/phabricator-side-menu-view.css' => 'c1db9e9c',
|
||||||
'rsrc/css/layout/phabricator-source-code-view.css' => '2ceee894',
|
'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-list.css' => 'c1d0ca59',
|
||||||
'rsrc/css/phui/calendar/phui-calendar-month.css' => 'a92e47d2',
|
'rsrc/css/phui/calendar/phui-calendar-month.css' => 'a92e47d2',
|
||||||
'rsrc/css/phui/calendar/phui-calendar.css' => '8675968e',
|
'rsrc/css/phui/calendar/phui-calendar.css' => '8675968e',
|
||||||
|
@ -780,7 +780,7 @@ return array(
|
||||||
'phui-box-css' => '7b3a2eed',
|
'phui-box-css' => '7b3a2eed',
|
||||||
'phui-button-css' => 'de610129',
|
'phui-button-css' => 'de610129',
|
||||||
'phui-calendar-css' => '8675968e',
|
'phui-calendar-css' => '8675968e',
|
||||||
'phui-calendar-day-css' => 'de035c8a',
|
'phui-calendar-day-css' => 'a00b748d',
|
||||||
'phui-calendar-list-css' => 'c1d0ca59',
|
'phui-calendar-list-css' => 'c1d0ca59',
|
||||||
'phui-calendar-month-css' => 'a92e47d2',
|
'phui-calendar-month-css' => 'a92e47d2',
|
||||||
'phui-crumbs-view-css' => '594d719e',
|
'phui-crumbs-view-css' => '594d719e',
|
||||||
|
|
|
@ -102,6 +102,7 @@ phutil_register_library_map(array(
|
||||||
'AphrontApplicationConfiguration' => 'aphront/configuration/AphrontApplicationConfiguration.php',
|
'AphrontApplicationConfiguration' => 'aphront/configuration/AphrontApplicationConfiguration.php',
|
||||||
'AphrontBarView' => 'view/widget/bars/AphrontBarView.php',
|
'AphrontBarView' => 'view/widget/bars/AphrontBarView.php',
|
||||||
'AphrontCSRFException' => 'aphront/exception/AphrontCSRFException.php',
|
'AphrontCSRFException' => 'aphront/exception/AphrontCSRFException.php',
|
||||||
|
'AphrontCalendarDayEventView' => 'applications/calendar/view/AphrontCalendarDayEventView.php',
|
||||||
'AphrontCalendarEventView' => 'applications/calendar/view/AphrontCalendarEventView.php',
|
'AphrontCalendarEventView' => 'applications/calendar/view/AphrontCalendarEventView.php',
|
||||||
'AphrontController' => 'aphront/AphrontController.php',
|
'AphrontController' => 'aphront/AphrontController.php',
|
||||||
'AphrontCursorPagerView' => 'view/control/AphrontCursorPagerView.php',
|
'AphrontCursorPagerView' => 'view/control/AphrontCursorPagerView.php',
|
||||||
|
@ -1159,6 +1160,7 @@ phutil_register_library_map(array(
|
||||||
'PHUIButtonBarView' => 'view/phui/PHUIButtonBarView.php',
|
'PHUIButtonBarView' => 'view/phui/PHUIButtonBarView.php',
|
||||||
'PHUIButtonExample' => 'applications/uiexample/examples/PHUIButtonExample.php',
|
'PHUIButtonExample' => 'applications/uiexample/examples/PHUIButtonExample.php',
|
||||||
'PHUIButtonView' => 'view/phui/PHUIButtonView.php',
|
'PHUIButtonView' => 'view/phui/PHUIButtonView.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',
|
||||||
'PHUICalendarWidgetView' => 'view/phui/calendar/PHUICalendarWidgetView.php',
|
'PHUICalendarWidgetView' => 'view/phui/calendar/PHUICalendarWidgetView.php',
|
||||||
|
@ -1498,7 +1500,6 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorCalendarEventEditController' => 'applications/calendar/controller/PhabricatorCalendarEventEditController.php',
|
'PhabricatorCalendarEventEditController' => 'applications/calendar/controller/PhabricatorCalendarEventEditController.php',
|
||||||
'PhabricatorCalendarEventEditor' => 'applications/calendar/editor/PhabricatorCalendarEventEditor.php',
|
'PhabricatorCalendarEventEditor' => 'applications/calendar/editor/PhabricatorCalendarEventEditor.php',
|
||||||
'PhabricatorCalendarEventEmailCommand' => 'applications/calendar/command/PhabricatorCalendarEventEmailCommand.php',
|
'PhabricatorCalendarEventEmailCommand' => 'applications/calendar/command/PhabricatorCalendarEventEmailCommand.php',
|
||||||
'PhabricatorCalendarEventInvalidEpochException' => 'applications/calendar/exception/PhabricatorCalendarEventInvalidEpochException.php',
|
|
||||||
'PhabricatorCalendarEventInvitee' => 'applications/calendar/storage/PhabricatorCalendarEventInvitee.php',
|
'PhabricatorCalendarEventInvitee' => 'applications/calendar/storage/PhabricatorCalendarEventInvitee.php',
|
||||||
'PhabricatorCalendarEventInviteeQuery' => 'applications/calendar/query/PhabricatorCalendarEventInviteeQuery.php',
|
'PhabricatorCalendarEventInviteeQuery' => 'applications/calendar/query/PhabricatorCalendarEventInviteeQuery.php',
|
||||||
'PhabricatorCalendarEventJoinController' => 'applications/calendar/controller/PhabricatorCalendarEventJoinController.php',
|
'PhabricatorCalendarEventJoinController' => 'applications/calendar/controller/PhabricatorCalendarEventJoinController.php',
|
||||||
|
@ -3349,6 +3350,7 @@ phutil_register_library_map(array(
|
||||||
'AphrontAjaxResponse' => 'AphrontResponse',
|
'AphrontAjaxResponse' => 'AphrontResponse',
|
||||||
'AphrontBarView' => 'AphrontView',
|
'AphrontBarView' => 'AphrontView',
|
||||||
'AphrontCSRFException' => 'AphrontException',
|
'AphrontCSRFException' => 'AphrontException',
|
||||||
|
'AphrontCalendarDayEventView' => 'AphrontView',
|
||||||
'AphrontCalendarEventView' => 'AphrontView',
|
'AphrontCalendarEventView' => 'AphrontView',
|
||||||
'AphrontController' => 'Phobject',
|
'AphrontController' => 'Phobject',
|
||||||
'AphrontCursorPagerView' => 'AphrontView',
|
'AphrontCursorPagerView' => 'AphrontView',
|
||||||
|
@ -4483,6 +4485,7 @@ phutil_register_library_map(array(
|
||||||
'PHUIButtonBarView' => 'AphrontTagView',
|
'PHUIButtonBarView' => 'AphrontTagView',
|
||||||
'PHUIButtonExample' => 'PhabricatorUIExample',
|
'PHUIButtonExample' => 'PhabricatorUIExample',
|
||||||
'PHUIButtonView' => 'AphrontTagView',
|
'PHUIButtonView' => 'AphrontTagView',
|
||||||
|
'PHUICalendarDayView' => 'AphrontView',
|
||||||
'PHUICalendarListView' => 'AphrontTagView',
|
'PHUICalendarListView' => 'AphrontTagView',
|
||||||
'PHUICalendarMonthView' => 'AphrontView',
|
'PHUICalendarMonthView' => 'AphrontView',
|
||||||
'PHUICalendarWidgetView' => 'AphrontTagView',
|
'PHUICalendarWidgetView' => 'AphrontTagView',
|
||||||
|
@ -4848,7 +4851,6 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorCalendarEventEditController' => 'PhabricatorCalendarController',
|
'PhabricatorCalendarEventEditController' => 'PhabricatorCalendarController',
|
||||||
'PhabricatorCalendarEventEditor' => 'PhabricatorApplicationTransactionEditor',
|
'PhabricatorCalendarEventEditor' => 'PhabricatorApplicationTransactionEditor',
|
||||||
'PhabricatorCalendarEventEmailCommand' => 'MetaMTAEmailTransactionCommand',
|
'PhabricatorCalendarEventEmailCommand' => 'MetaMTAEmailTransactionCommand',
|
||||||
'PhabricatorCalendarEventInvalidEpochException' => 'Exception',
|
|
||||||
'PhabricatorCalendarEventInvitee' => array(
|
'PhabricatorCalendarEventInvitee' => array(
|
||||||
'PhabricatorCalendarDAO',
|
'PhabricatorCalendarDAO',
|
||||||
'PhabricatorPolicyInterface',
|
'PhabricatorPolicyInterface',
|
||||||
|
|
|
@ -5,6 +5,7 @@ final class PhabricatorCalendarEventSearchEngine
|
||||||
|
|
||||||
private $calendarYear;
|
private $calendarYear;
|
||||||
private $calendarMonth;
|
private $calendarMonth;
|
||||||
|
private $calendarDay;
|
||||||
|
|
||||||
public function getResultTypeDescription() {
|
public function getResultTypeDescription() {
|
||||||
return pht('Calendar Events');
|
return pht('Calendar Events');
|
||||||
|
@ -144,6 +145,7 @@ final class PhabricatorCalendarEventSearchEngine
|
||||||
);
|
);
|
||||||
$display_options = array(
|
$display_options = array(
|
||||||
'month' => pht('Month View'),
|
'month' => pht('Month View'),
|
||||||
|
'day' => pht('Day View (beta)'),
|
||||||
'list' => pht('List View'),
|
'list' => pht('List View'),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -249,6 +251,8 @@ final class PhabricatorCalendarEventSearchEngine
|
||||||
|
|
||||||
if ($query->getParameter('display') == 'month') {
|
if ($query->getParameter('display') == 'month') {
|
||||||
return $this->buildCalendarView($events, $query, $handles);
|
return $this->buildCalendarView($events, $query, $handles);
|
||||||
|
} else if ($query->getParameter('display') == 'day') {
|
||||||
|
return $this->buildCalendarDayView($events, $query, $handles);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert_instances_of($events, 'PhabricatorCalendarEvent');
|
assert_instances_of($events, 'PhabricatorCalendarEvent');
|
||||||
|
@ -349,6 +353,34 @@ final class PhabricatorCalendarEventSearchEngine
|
||||||
return $month_view;
|
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(
|
private function getDisplayMonthAndYear(
|
||||||
PhabricatorSavedQuery $query) {
|
PhabricatorSavedQuery $query) {
|
||||||
$viewer = $this->requireViewer();
|
$viewer = $this->requireViewer();
|
||||||
|
@ -372,6 +404,28 @@ final class PhabricatorCalendarEventSearchEngine
|
||||||
return array($start_month, $start_year);
|
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) {
|
public function getPageSize(PhabricatorSavedQuery $saved) {
|
||||||
return $saved->getParameter('limit', 1000);
|
return $saved->getParameter('limit', 1000);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
131
src/view/phui/calendar/PHUICalendarDayView.php
Normal file
131
src/view/phui/calendar/PHUICalendarDayView.php
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,35 @@
|
||||||
/**
|
/**
|
||||||
* @provides phui-calendar-day-css
|
* @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;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue