diff --git a/resources/celerity/map.php b/resources/celerity/map.php --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -116,7 +116,7 @@ '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 @@ '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', diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -1569,6 +1569,7 @@ '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 @@ 'PHUICalendarDayView' => 'AphrontView', 'PHUICalendarListView' => 'AphrontTagView', 'PHUICalendarMonthView' => 'AphrontView', + 'PHUICalendarWeekView' => 'AphrontView', 'PHUICalendarWidgetView' => 'AphrontTagView', 'PHUIColorPalletteExample' => 'PhabricatorUIExample', 'PHUICrumbView' => 'AphrontView', diff --git a/src/applications/people/controller/PhabricatorPeopleProfileViewController.php b/src/applications/people/controller/PhabricatorPeopleProfileViewController.php --- a/src/applications/people/controller/PhabricatorPeopleProfileViewController.php +++ b/src/applications/people/controller/PhabricatorPeopleProfileViewController.php @@ -59,6 +59,7 @@ $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 @@ array( $projects, $badges, + $calendar, )); $nav = $this->getProfileMenu(); @@ -172,6 +174,69 @@ 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(); diff --git a/src/view/phui/calendar/PHUICalendarDayView.php b/src/view/phui/calendar/PHUICalendarDayView.php --- a/src/view/phui/calendar/PHUICalendarDayView.php +++ b/src/view/phui/calendar/PHUICalendarDayView.php @@ -145,7 +145,11 @@ } $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 @@ 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(); diff --git a/src/view/phui/calendar/PHUICalendarWeekView.php b/src/view/phui/calendar/PHUICalendarWeekView.php new file mode 100644 --- /dev/null +++ b/src/view/phui/calendar/PHUICalendarWeekView.php @@ -0,0 +1,121 @@ +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()); + } + +} diff --git a/webroot/rsrc/css/phui/calendar/phui-calendar-list.css b/webroot/rsrc/css/phui/calendar/phui-calendar-list.css --- a/webroot/rsrc/css/phui/calendar/phui-calendar-list.css +++ b/webroot/rsrc/css/phui/calendar/phui-calendar-list.css @@ -2,10 +2,6 @@ * @provides phui-calendar-list-css */ -.phui-calendar-list-container { - width: 300px; -} - .device-phone .phui-calendar-list-container { width: auto; }