public function testTimestampsAtMidnight() { $u = new PhabricatorUser(); $u->setTimezoneIdentifier('America/Los_Angeles'); $days = $this->getAllDays(); foreach ($days as $day) { $data = CalendarTimeUtil::getCalendarWidgetTimestamps($u, $day); $this->assertEqual('000000', $data['epoch_stamps'][0]->format('His')); } }
private function renderCalendarWidgetPaneContent() { $user = $this->getRequest()->getUser(); $conpherence = $this->getConpherence(); $participants = $conpherence->getParticipants(); $widget_data = $conpherence->getWidgetData(); // TODO: This panel is built around an outdated notion of events and isn't // invitee-aware. $statuses = $widget_data['events']; $handles = $conpherence->getHandles(); $content = array(); $layout = id(new AphrontMultiColumnView())->setFluidLayout(true); $timestamps = CalendarTimeUtil::getCalendarWidgetTimestamps($user); $today = $timestamps['today']; $epoch_stamps = $timestamps['epoch_stamps']; $one_day = 24 * 60 * 60; $is_today = false; $calendar_columns = 0; $list_days = 0; foreach ($epoch_stamps as $day) { // build a header for the new day if ($day->format('Ymd') == $today->format('Ymd')) { $active_class = 'today'; $is_today = true; } else { $active_class = ''; $is_today = false; } $should_draw_list = $list_days < 7; $list_days++; if ($should_draw_list) { $content[] = phutil_tag('div', array('class' => 'day-header ' . $active_class), array(phutil_tag('div', array('class' => 'day-name'), $day->format('l')), phutil_tag('div', array('class' => 'day-date'), $day->format('m/d/y')))); } $week_day_number = $day->format('w'); $epoch_start = $day->format('U'); $next_day = clone $day; $next_day->modify('+1 day'); $epoch_end = $next_day->format('U'); $first_status_of_the_day = true; $statuses_of_the_day = array(); // keep looking through statuses where we last left off foreach ($statuses as $status) { if ($status->getDateFrom() >= $epoch_end) { // This list is sorted, so we can stop looking. break; } if ($status->getDateFrom() < $epoch_end && $status->getDateTo() > $epoch_start) { $statuses_of_the_day[$status->getUserPHID()] = $status; if ($should_draw_list) { $top_border = ''; if (!$first_status_of_the_day) { $top_border = ' top-border'; } $timespan = $status->getDateTo() - $status->getDateFrom(); if ($timespan > $one_day) { $time_str = 'm/d'; } else { $time_str = 'h:i A'; } $epoch_range = phabricator_format_local_time($status->getDateFrom(), $user, $time_str) . ' - ' . phabricator_format_local_time($status->getDateTo(), $user, $time_str); if (isset($handles[$status->getUserPHID()])) { $secondary_info = pht('%s, %s', $handles[$status->getUserPHID()]->getName(), $epoch_range); } else { $secondary_info = $epoch_range; } $content[] = phutil_tag('div', array('class' => 'user-status ' . $top_border), array(phutil_tag('div', array('class' => 'icon'), ''), phutil_tag('div', array('class' => 'description'), array($status->getName(), phutil_tag('div', array('class' => 'participant'), $secondary_info))))); } $first_status_of_the_day = false; } } // we didn't get a status on this day so add a spacer if ($first_status_of_the_day && $should_draw_list) { $content[] = phutil_tag('div', array('class' => 'no-events pm'), pht('No Events Scheduled.')); } if ($is_today || $calendar_columns && $calendar_columns < 3) { $active_class = ''; if ($is_today) { $active_class = '-active'; } $inner_layout = array(); foreach ($participants as $phid => $participant) { $status = idx($statuses_of_the_day, $phid, false); if ($status) { $inner_layout[] = phutil_tag('div', array(), ''); } else { $inner_layout[] = phutil_tag('div', array('class' => 'present'), ''); } } $layout->addColumn(phutil_tag('div', array('class' => 'day-column' . $active_class), array(phutil_tag('div', array('class' => 'day-name'), $day->format('D')), phutil_tag('div', array('class' => 'day-number'), $day->format('j')), $inner_layout))); $calendar_columns++; } } return array($layout, $content); }