public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $pager = new AphrontIDPagerView(); $pager->readFromRequest($request); $query = new PhabricatorPasteQuery(); $query->setViewer($user); switch ($this->getFilter()) { case 'create': default: // if we successfully create a paste, we redirect to view it $created_paste_redirect = $this->processCreateRequest(); if ($created_paste_redirect) { return $created_paste_redirect; } $query->setLimit(10); $paste_list = $query->execute(); $pager = null; break; case 'my': $query->withAuthorPHIDs(array($user->getPHID())); $paste_list = $query->executeWithPager($pager); break; case 'all': $paste_list = $query->executeWithPager($pager); break; } $filters = array('create' => array('name' => 'Create Paste'), 'my' => array('name' => 'My Pastes'), 'all' => array('name' => 'All Pastes')); $side_nav = new AphrontSideNavView(); foreach ($filters as $filter_key => $filter) { $selected = $filter_key == $this->getFilter(); $side_nav->addNavItem(phutil_render_tag('a', array('href' => '/paste/filter/' . $filter_key . '/', 'class' => $selected ? 'aphront-side-nav-selected' : null), $filter['name'])); } if ($this->getErrorView()) { $side_nav->appendChild($this->getErrorView()); } switch ($this->getFilter()) { case 'create': default: $side_nav->appendChild($this->renderCreatePaste()); $see_all = phutil_render_tag('a', array('href' => '/paste/filter/all'), 'See all Pastes'); $header = "Recent Pastes · {$see_all}"; break; case 'my': $header = 'Your Pastes'; break; case 'all': $header = 'All Pastes'; break; } $side_nav->appendChild($this->renderPasteList($paste_list, $header, $pager)); return $this->buildStandardPageResponse($side_nav, array('title' => 'Paste')); }
public final function executeWithPager(AphrontIDPagerView $pager) { $this->setLimit($pager->getPageSize() + 1); if ($pager->getAfterID()) { $this->setAfterID($pager->getAfterID()); } else { if ($pager->getBeforeID()) { $this->setBeforeID($pager->getBeforeID()); } } $results = $this->execute(); $sliced_results = $pager->sliceResults($results); if ($this->beforeID || count($results) > $pager->getPageSize()) { $pager->setNextPageID($this->getPagingValue(last($sliced_results))); } if ($this->afterID || $this->beforeID && count($results) > $pager->getPageSize()) { $pager->setPrevPageID($this->getPagingValue(head($sliced_results))); } return $sliced_results; }
private function buildFeedView(array $phids) { $request = $this->getRequest(); $user = $request->getUser(); $user_phid = $user->getPHID(); $feed_query = new PhabricatorFeedQuery(); $feed_query->setViewer($user); if ($phids) { $feed_query->setFilterPHIDs($phids); } $pager = new AphrontIDPagerView(); $pager->readFromRequest($request); $pager->setPageSize(200); $feed = $feed_query->executeWithPager($pager); $builder = new PhabricatorFeedBuilder($feed); $builder->setUser($user); $feed_view = $builder->buildView(); return '<div style="padding: 1em 3em;">' . '<div style="margin: 0 1em;">' . '<h1 style="font-size: 18px; ' . 'border-bottom: 1px solid #aaaaaa; ' . 'padding: 0;">Feed</h1>' . '</div>' . $feed_view->render() . '<div class="phabricator-feed-frame">' . $pager->render() . '</div>' . '</div>'; }
public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $uri = clone $request->getRequestURI(); $uri->setQueryParams(array()); $pager = new AphrontIDPagerView(); $pager->setURI($uri); $pager->setPageSize(250); $query = id(new PhabricatorChatLogQuery())->setViewer($user)->withChannels(array($this->channel)); list($after, $before, $map) = $this->getPagingParameters($request, $query); $pager->setAfterID($after); $pager->setBeforeID($before); $logs = $query->executeWithPager($pager); // Show chat logs oldest-first. $logs = array_reverse($logs); // Divide all the logs into blocks, where a block is the same author saying // several things in a row. A block ends when another user speaks, or when // two minutes pass without the author speaking. $blocks = array(); $block = null; $last_author = null; $last_epoch = null; foreach ($logs as $log) { $this_author = $log->getAuthor(); $this_epoch = $log->getEpoch(); // Decide whether we should start a new block or not. $new_block = $this_author !== $last_author || $this_epoch - 60 * 2 > $last_epoch; if ($new_block) { if ($block) { $blocks[] = $block; } $block = array('id' => $log->getID(), 'epoch' => $this_epoch, 'author' => $this_author, 'logs' => array($log)); } else { $block['logs'][] = $log; } $last_author = $this_author; $last_epoch = $this_epoch; } if ($block) { $blocks[] = $block; } // Figure out CSS classes for the blocks. We alternate colors between // lines, and highlight the entire block which contains the target ID or // date, if applicable. foreach ($blocks as $key => $block) { $classes = array(); if ($key % 2) { $classes[] = 'alternate'; } $ids = mpull($block['logs'], 'getID', 'getID'); if (array_intersect_key($ids, $map)) { $classes[] = 'highlight'; } $blocks[$key]['class'] = $classes ? implode(' ', $classes) : null; } require_celerity_resource('phabricator-chatlog-css'); $out = array(); $out[] = '<table class="phabricator-chat-log">'; foreach ($blocks as $block) { $author = $block['author']; $author = phutil_utf8_shorten($author, 18); $author = phutil_escape_html($author); $author = phutil_render_tag('td', array('class' => 'author'), $author); $message = mpull($block['logs'], 'getMessage'); $message = implode("\n", $message); $message = phutil_escape_html($message); $message = phutil_render_tag('td', array('class' => 'message'), $message); $href = $uri->alter('at', $block['id']); $timestamp = $block['epoch']; $timestamp = phabricator_datetime($timestamp, $user); $timestamp = phutil_render_tag('a', array('href' => $href), $timestamp); $timestamp = phutil_render_tag('td', array('class' => 'timestamp'), $timestamp); $out[] = phutil_render_tag('tr', array('class' => $block['class']), $author . $message . $timestamp); } $out[] = '</table>'; $form = id(new AphrontFormView())->setUser($user)->setMethod('GET')->setAction($uri)->appendChild(id(new AphrontFormTextControl())->setLabel('Date')->setName('date')->setValue($request->getStr('date')))->appendChild(id(new AphrontFormSubmitControl())->setValue('Jump')); return $this->buildStandardPageResponse(array('<div class="phabricator-chat-log-panel">', $form, '<br />', implode("\n", $out), $pager, '</div>'), array('title' => 'Channel Log')); }