public function handleRequest(AphrontRequest $request)
 {
     $viewer = $request->getViewer();
     $pager = new PHUIPagerView();
     $pager->setURI($request->getRequestURI(), 'page');
     $pager->setOffset($request->getInt('page'));
     $query = id(new PhabricatorTokenReceiverQuery());
     $objects = $query->setViewer($viewer)->executeWithOffsetPager($pager);
     $counts = $query->getTokenCounts();
     $handles = array();
     $phids = array();
     if ($counts) {
         $phids = mpull($objects, 'getPHID');
         $handles = id(new PhabricatorHandleQuery())->setViewer($viewer)->withPHIDs($phids)->execute();
     }
     $list = new PHUIObjectItemListView();
     foreach ($phids as $object) {
         $count = idx($counts, $object, 0);
         $item = id(new PHUIObjectItemView());
         $handle = $handles[$object];
         $item->setHeader($handle->getFullName());
         $item->setHref($handle->getURI());
         $item->addAttribute(pht('Tokens: %s', $count));
         $list->addItem($item);
     }
     $title = pht('Token Leader Board');
     $box = id(new PHUIObjectBoxView())->setHeaderText($title)->setObjectList($list);
     $nav = $this->buildSideNav();
     $nav->setCrumbs($this->buildApplicationCrumbs()->addTextCrumb($title));
     $nav->selectFilter('leaders/');
     $nav->appendChild($box);
     $nav->appendChild($pager);
     return $this->newPage()->setTitle($title)->appendChild($nav);
 }
 public final function executeWithOffsetPager(PHUIPagerView $pager)
 {
     $this->setLimit($pager->getPageSize() + 1);
     $this->setOffset($pager->getOffset());
     $results = $this->execute();
     return $pager->sliceResults($results);
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $viewer = $request->getUser();
     $blueprint = id(new DrydockBlueprintQuery())->setViewer($viewer)->withIDs(array($this->id))->executeOne();
     if (!$blueprint) {
         return new Aphront404Response();
     }
     $title = $blueprint->getBlueprintName();
     $header = id(new PHUIHeaderView())->setHeader($title)->setUser($viewer)->setPolicyObject($blueprint);
     $actions = $this->buildActionListView($blueprint);
     $properties = $this->buildPropertyListView($blueprint, $actions);
     $blueprint_uri = 'blueprint/' . $blueprint->getID() . '/';
     $blueprint_uri = $this->getApplicationURI($blueprint_uri);
     $resources = id(new DrydockResourceQuery())->withBlueprintPHIDs(array($blueprint->getPHID()))->setViewer($viewer)->execute();
     $resource_list = id(new DrydockResourceListView())->setUser($viewer)->setResources($resources)->render();
     $resource_list->setNoDataString(pht('This blueprint has no resources.'));
     $pager = new PHUIPagerView();
     $pager->setURI(new PhutilURI($blueprint_uri), 'offset');
     $pager->setOffset($request->getInt('offset'));
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addTextCrumb(pht('Blueprint %d', $blueprint->getID()));
     $object_box = id(new PHUIObjectBoxView())->setHeader($header)->addPropertyList($properties);
     $field_list = PhabricatorCustomField::getObjectFields($blueprint, PhabricatorCustomField::ROLE_VIEW);
     $field_list->setViewer($viewer)->readFieldsFromStorage($blueprint);
     $field_list->appendFieldsToPropertyList($blueprint, $viewer, $properties);
     $timeline = $this->buildTransactionTimeline($blueprint, new DrydockBlueprintTransactionQuery());
     $timeline->setShouldTerminate(true);
     return $this->buildApplicationPage(array($crumbs, $object_box, $resource_list, $timeline), array('title' => $title));
 }
 public function handleRequest(AphrontRequest $request)
 {
     $viewer = $request->getViewer();
     $id = $request->getURIData('id');
     $resource = id(new DrydockResourceQuery())->setViewer($viewer)->withIDs(array($id))->executeOne();
     if (!$resource) {
         return new Aphront404Response();
     }
     $title = pht('Resource %s %s', $resource->getID(), $resource->getName());
     $header = id(new PHUIHeaderView())->setUser($viewer)->setPolicyObject($resource)->setHeader($title);
     $actions = $this->buildActionListView($resource);
     $properties = $this->buildPropertyListView($resource, $actions);
     $resource_uri = 'resource/' . $resource->getID() . '/';
     $resource_uri = $this->getApplicationURI($resource_uri);
     $pager = new PHUIPagerView();
     $pager->setURI(new PhutilURI($resource_uri), 'offset');
     $pager->setOffset($request->getInt('offset'));
     $logs = id(new DrydockLogQuery())->setViewer($viewer)->withResourceIDs(array($resource->getID()))->executeWithOffsetPager($pager);
     $log_table = id(new DrydockLogListView())->setUser($viewer)->setLogs($logs)->render();
     $log_table->appendChild($pager);
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addTextCrumb(pht('Resource %d', $resource->getID()));
     $locks = $this->buildLocksTab($resource->getPHID());
     $commands = $this->buildCommandsTab($resource->getPHID());
     $object_box = id(new PHUIObjectBoxView())->setHeader($header)->addPropertyList($properties, pht('Properties'))->addPropertyList($locks, pht('Slot Locks'))->addPropertyList($commands, pht('Commands'));
     $lease_box = $this->buildLeaseBox($resource);
     $log_box = id(new PHUIObjectBoxView())->setHeaderText(pht('Resource Logs'))->setTable($log_table);
     return $this->buildApplicationPage(array($crumbs, $object_box, $lease_box, $log_box), array('title' => $title));
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $viewer = $request->getUser();
     $resource = id(new DrydockResourceQuery())->setViewer($viewer)->withIDs(array($this->id))->executeOne();
     if (!$resource) {
         return new Aphront404Response();
     }
     $title = pht('Resource %s %s', $resource->getID(), $resource->getName());
     $header = id(new PHUIHeaderView())->setHeader($title);
     $actions = $this->buildActionListView($resource);
     $properties = $this->buildPropertyListView($resource, $actions);
     $resource_uri = 'resource/' . $resource->getID() . '/';
     $resource_uri = $this->getApplicationURI($resource_uri);
     $leases = id(new DrydockLeaseQuery())->setViewer($viewer)->withResourceIDs(array($resource->getID()))->execute();
     $lease_list = id(new DrydockLeaseListView())->setUser($viewer)->setLeases($leases)->render();
     $lease_list->setNoDataString(pht('This resource has no leases.'));
     $pager = new PHUIPagerView();
     $pager->setURI(new PhutilURI($resource_uri), 'offset');
     $pager->setOffset($request->getInt('offset'));
     $logs = id(new DrydockLogQuery())->setViewer($viewer)->withResourceIDs(array($resource->getID()))->executeWithOffsetPager($pager);
     $log_table = id(new DrydockLogListView())->setUser($viewer)->setLogs($logs)->render();
     $log_table->appendChild($pager);
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addTextCrumb(pht('Resource %d', $resource->getID()));
     $object_box = id(new PHUIObjectBoxView())->setHeader($header)->addPropertyList($properties);
     return $this->buildApplicationPage(array($crumbs, $object_box, $lease_list, $log_table), array('title' => $title));
 }
 protected function processDiffusionRequest(AphrontRequest $request)
 {
     $drequest = $this->diffusionRequest;
     $viewer = $request->getUser();
     $repository = $drequest->getRepository();
     $page_size = $request->getInt('pagesize', 100);
     $offset = $request->getInt('offset', 0);
     $params = array('commit' => $drequest->getCommit(), 'path' => $drequest->getPath(), 'offset' => $offset, 'limit' => $page_size + 1);
     if (!$request->getBool('copies')) {
         $params['needDirectChanges'] = true;
         $params['needChildChanges'] = true;
     }
     $history_results = $this->callConduitWithDiffusionRequest('diffusion.historyquery', $params);
     $history = DiffusionPathChange::newFromConduit($history_results['pathChanges']);
     $pager = new PHUIPagerView();
     $pager->setPageSize($page_size);
     $pager->setOffset($offset);
     $history = $pager->sliceResults($history);
     $pager->setURI($request->getRequestURI(), 'offset');
     $show_graph = !strlen($drequest->getPath());
     $content = array();
     $history_table = new DiffusionHistoryTableView();
     $history_table->setUser($request->getUser());
     $history_table->setDiffusionRequest($drequest);
     $history_table->setHistory($history);
     $history_table->loadRevisions();
     $phids = $history_table->getRequiredHandlePHIDs();
     $handles = $this->loadViewerHandles($phids);
     $history_table->setHandles($handles);
     if ($show_graph) {
         $history_table->setParents($history_results['parents']);
         $history_table->setIsHead($offset == 0);
     }
     $history_panel = new PHUIObjectBoxView();
     $history_panel->setHeaderText(pht('History'));
     $history_panel->setTable($history_table);
     $content[] = $history_panel;
     $header = id(new PHUIHeaderView())->setUser($viewer)->setPolicyObject($repository)->setHeader($this->renderPathLinks($drequest, $mode = 'history'));
     $actions = $this->buildActionView($drequest);
     $properties = $this->buildPropertyView($drequest, $actions);
     $object_box = id(new PHUIObjectBoxView())->setHeader($header)->addPropertyList($properties);
     $crumbs = $this->buildCrumbs(array('branch' => true, 'path' => true, 'view' => 'history'));
     return $this->buildApplicationPage(array($crumbs, $object_box, $content, $pager), array('title' => array(pht('History'), pht('%s Repository', $drequest->getRepository()->getCallsign()))));
 }
 public function handleRequest(AphrontRequest $request)
 {
     $viewer = $request->getViewer();
     $view = $request->getURIData('view');
     if (!$view) {
         $view = 'all';
     }
     $pager = new PHUIPagerView();
     $pager->setOffset($request->getInt('page'));
     switch ($view) {
         case 'sampled':
             $clause = 'sampleRate > 0';
             $show_type = false;
             break;
         case 'my-runs':
             $clause = qsprintf(id(new PhabricatorXHProfSample())->establishConnection('r'), 'sampleRate = 0 AND userPHID = %s', $request->getUser()->getPHID());
             $show_type = false;
             break;
         case 'manual':
             $clause = 'sampleRate = 0';
             $show_type = false;
             break;
         case 'all':
         default:
             $clause = '1 = 1';
             $show_type = true;
             break;
     }
     $samples = id(new PhabricatorXHProfSample())->loadAllWhere('%Q ORDER BY id DESC LIMIT %d, %d', $clause, $pager->getOffset(), $pager->getPageSize() + 1);
     $samples = $pager->sliceResults($samples);
     $pager->setURI($request->getRequestURI(), 'page');
     $list = new PHUIObjectItemListView();
     foreach ($samples as $sample) {
         $file_phid = $sample->getFilePHID();
         $item = id(new PHUIObjectItemView())->setObjectName($sample->getID())->setHeader($sample->getRequestPath())->setHref($this->getApplicationURI('profile/' . $file_phid . '/'))->addAttribute(number_format($sample->getUsTotal()) . " μs");
         if ($sample->getController()) {
             $item->addAttribute($sample->getController());
         }
         $item->addAttribute($sample->getHostName());
         $rate = $sample->getSampleRate();
         if ($rate == 0) {
             $item->addIcon('flag-6', pht('Manual Run'));
         } else {
             $item->addIcon('flag-7', pht('Sampled (1/%d)', $rate));
         }
         $item->addIcon('none', phabricator_datetime($sample->getDateCreated(), $viewer));
         $list->addItem($item);
     }
     $list->setPager($pager);
     $list->setNoDataString(pht('There are no profiling samples.'));
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addTextCrumb(pht('XHProf Samples'));
     $title = pht('XHProf Samples');
     return $this->newPage()->setTitle($title)->setCrumbs($crumbs)->appendChild($list);
 }
 public function handleRequest(AphrontRequest $request)
 {
     $viewer = $request->getViewer();
     $id = $request->getURIData('id');
     $lease = id(new DrydockLeaseQuery())->setViewer($viewer)->withIDs(array($id))->executeOne();
     if (!$lease) {
         return new Aphront404Response();
     }
     $lease_uri = $this->getApplicationURI('lease/' . $lease->getID() . '/');
     $title = pht('Lease %d', $lease->getID());
     $header = id(new PHUIHeaderView())->setHeader($title);
     $actions = $this->buildActionListView($lease);
     $properties = $this->buildPropertyListView($lease, $actions);
     $pager = new PHUIPagerView();
     $pager->setURI(new PhutilURI($lease_uri), 'offset');
     $pager->setOffset($request->getInt('offset'));
     $logs = id(new DrydockLogQuery())->setViewer($viewer)->withLeaseIDs(array($lease->getID()))->executeWithOffsetPager($pager);
     $log_table = id(new DrydockLogListView())->setUser($viewer)->setLogs($logs)->render();
     $log_table->appendChild($pager);
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addTextCrumb($title, $lease_uri);
     $object_box = id(new PHUIObjectBoxView())->setHeader($header)->addPropertyList($properties);
     return $this->buildApplicationPage(array($crumbs, $object_box, $log_table), array('title' => $title));
 }
 private function renderSearchResults()
 {
     $drequest = $this->getDiffusionRequest();
     $repository = $drequest->getRepository();
     $results = array();
     $limit = 100;
     $page = $this->getRequest()->getInt('page', 0);
     $pager = new PHUIPagerView();
     $pager->setPageSize($limit);
     $pager->setOffset($page);
     $pager->setURI($this->getRequest()->getRequestURI(), 'page');
     $search_mode = null;
     switch ($repository->getVersionControlSystem()) {
         case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
             $results = array();
             break;
         default:
             if (strlen($this->getRequest()->getStr('grep'))) {
                 $search_mode = 'grep';
                 $query_string = $this->getRequest()->getStr('grep');
                 $results = $this->callConduitWithDiffusionRequest('diffusion.searchquery', array('grep' => $query_string, 'commit' => $drequest->getStableCommit(), 'path' => $drequest->getPath(), 'limit' => $limit + 1, 'offset' => $page));
             } else {
                 // Filename search.
                 $search_mode = 'find';
                 $query_string = $this->getRequest()->getStr('find');
                 $results = $this->callConduitWithDiffusionRequest('diffusion.querypaths', array('pattern' => $query_string, 'commit' => $drequest->getStableCommit(), 'path' => $drequest->getPath(), 'limit' => $limit + 1, 'offset' => $page));
             }
             break;
     }
     $results = $pager->sliceResults($results);
     if ($search_mode == 'grep') {
         $table = $this->renderGrepResults($results, $query_string);
         $header = pht('File content matching "%s" under "%s"', $query_string, nonempty($drequest->getPath(), '/'));
     } else {
         $table = $this->renderFindResults($results);
         $header = pht('Paths matching "%s" under "%s"', $query_string, nonempty($drequest->getPath(), '/'));
     }
     $box = id(new PHUIObjectBoxView())->setHeaderText($header)->setTable($table);
     $pager_box = id(new PHUIBoxView())->addMargin(PHUI::MARGIN_LARGE)->appendChild($pager);
     return array($box, $pager_box);
 }
 protected function processDiffusionRequest(AphrontRequest $request)
 {
     $drequest = $this->getDiffusionRequest();
     $viewer = $request->getUser();
     $repository = $drequest->getRepository();
     $pager = new PHUIPagerView();
     $pager->setURI($request->getRequestURI(), 'offset');
     $pager->setOffset($request->getInt('offset'));
     $params = array('limit' => $pager->getPageSize() + 1, 'offset' => $pager->getOffset());
     if ($drequest->getSymbolicCommit()) {
         $is_commit = true;
         $params['commit'] = $drequest->getSymbolicCommit();
     } else {
         $is_commit = false;
     }
     switch ($repository->getVersionControlSystem()) {
         case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
             $tags = array();
             break;
         default:
             $conduit_result = $this->callConduitWithDiffusionRequest('diffusion.tagsquery', $params);
             $tags = DiffusionRepositoryTag::newFromConduit($conduit_result);
             break;
     }
     $tags = $pager->sliceResults($tags);
     $content = null;
     if (!$tags) {
         $content = $this->renderStatusMessage(pht('No Tags'), $is_commit ? pht('This commit has no tags.') : pht('This repository has no tags.'));
     } else {
         $commits = id(new DiffusionCommitQuery())->setViewer($viewer)->withRepository($repository)->withIdentifiers(mpull($tags, 'getCommitIdentifier'))->needCommitData(true)->execute();
         $view = id(new DiffusionTagListView())->setTags($tags)->setUser($viewer)->setCommits($commits)->setDiffusionRequest($drequest);
         $phids = $view->getRequiredHandlePHIDs();
         $handles = $this->loadViewerHandles($phids);
         $view->setHandles($handles);
         $panel = id(new PHUIObjectBoxView())->setHeaderText(pht('Tags'))->appendChild($view);
         $content = $panel;
     }
     $crumbs = $this->buildCrumbs(array('tags' => true, 'commit' => $drequest->getSymbolicCommit()));
     return $this->buildApplicationPage(array($crumbs, $content, $pager), array('title' => array(pht('Tags'), pht('%s Repository', $repository->getCallsign()))));
 }
 public function renderExample()
 {
     $request = $this->getRequest();
     $offset = (int) $request->getInt('offset');
     $page_size = 20;
     $item_count = 173;
     $rows = array();
     for ($ii = $offset; $ii < min($item_count, $offset + $page_size); $ii++) {
         $rows[] = array(pht('Item #%d', $ii + 1));
     }
     $table = new AphrontTableView($rows);
     $table->setHeaders(array('Item'));
     $panel = new PHUIObjectBoxView();
     $panel->setHeaderText(pht('Example'));
     $panel->appendChild($table);
     $panel->appendChild(hsprintf('<p class="phabricator-ui-example-note">%s</p>', pht('Use %s to render a pager element.', phutil_tag('tt', array(), 'PHUIPagerView'))));
     $pager = new PHUIPagerView();
     $pager->setPageSize($page_size);
     $pager->setOffset($offset);
     $pager->setCount($item_count);
     $pager->setURI($request->getRequestURI(), 'offset');
     $panel->appendChild($pager);
     $panel->appendChild(hsprintf('<p class="phabricator-ui-example-note">%s</p>', pht('You can show more or fewer pages of surrounding context.')));
     $many_pages_pager = new PHUIPagerView();
     $many_pages_pager->setPageSize($page_size);
     $many_pages_pager->setOffset($offset);
     $many_pages_pager->setCount($item_count);
     $many_pages_pager->setURI($request->getRequestURI(), 'offset');
     $many_pages_pager->setSurroundingPages(7);
     $panel->appendChild($many_pages_pager);
     $panel->appendChild(hsprintf('<p class="phabricator-ui-example-note">%s</p>', pht('When it is prohibitively expensive or complex to attain a complete ' . 'count of the items, you can select one extra item and set ' . '%s if it exists, creating an inexact pager.', phutil_tag('tt', array(), 'hasMorePages(true)'))));
     $inexact_pager = new PHUIPagerView();
     $inexact_pager->setPageSize($page_size);
     $inexact_pager->setOffset($offset);
     $inexact_pager->setHasMorePages($offset < $item_count - $page_size);
     $inexact_pager->setURI($request->getRequestURI(), 'offset');
     $panel->appendChild($inexact_pager);
     return $panel;
 }
 protected function processDiffusionRequest(AphrontRequest $request)
 {
     $drequest = $this->getDiffusionRequest();
     $viewer = $request->getUser();
     $repository = $drequest->getRepository();
     $pager = new PHUIPagerView();
     $pager->setURI($request->getRequestURI(), 'offset');
     $pager->setOffset($request->getInt('offset'));
     // TODO: Add support for branches that contain commit
     $branches = $this->callConduitWithDiffusionRequest('diffusion.branchquery', array('offset' => $pager->getOffset(), 'limit' => $pager->getPageSize() + 1));
     $branches = $pager->sliceResults($branches);
     $branches = DiffusionRepositoryRef::loadAllFromDictionaries($branches);
     $content = null;
     if (!$branches) {
         $content = $this->renderStatusMessage(pht('No Branches'), pht('This repository has no branches.'));
     } else {
         $commits = id(new DiffusionCommitQuery())->setViewer($viewer)->withIdentifiers(mpull($branches, 'getCommitIdentifier'))->withRepository($repository)->execute();
         $view = id(new DiffusionBranchTableView())->setUser($viewer)->setBranches($branches)->setCommits($commits)->setDiffusionRequest($drequest);
         $panel = id(new PHUIObjectBoxView())->setHeaderText(pht('Branches'))->setTable($view);
         $content = $panel;
     }
     $crumbs = $this->buildCrumbs(array('branches' => true));
     return $this->buildApplicationPage(array($crumbs, $content, $pager), array('title' => array(pht('Branches'), $repository->getDisplayName())));
 }
 private function buildBrowseTable($browse_results, $browse_paths, $browse_exception, array $handles, PHUIPagerView $pager)
 {
     require_celerity_resource('diffusion-icons-css');
     $request = $this->getRequest();
     $viewer = $request->getUser();
     $drequest = $this->getDiffusionRequest();
     $repository = $drequest->getRepository();
     if ($browse_exception) {
         if ($repository->isImporting()) {
             // The history table renders a useful message.
             return null;
         } else {
             return $this->renderStatusMessage(pht('Unable to Retrieve Paths'), $browse_exception->getMessage());
         }
     }
     $browse_table = id(new DiffusionBrowseTableView())->setUser($viewer)->setDiffusionRequest($drequest)->setHandles($handles);
     if ($browse_paths) {
         $browse_table->setPaths($browse_paths);
     } else {
         $browse_table->setPaths(array());
     }
     $browse_uri = $drequest->generateURI(array('action' => 'browse'));
     $browse_panel = id(new PHUIObjectBoxView())->setBackground(PHUIObjectBoxView::BLUE_PROPERTY);
     $header = id(new PHUIHeaderView())->setHeader($repository->getName());
     $icon = id(new PHUIIconView())->setIcon('fa-folder-open');
     $button = new PHUIButtonView();
     $button->setText(pht('Browse Repository'));
     $button->setTag('a');
     $button->setIcon($icon);
     $button->setHref($browse_uri);
     $header->addActionLink($button);
     $browse_panel->setHeader($header);
     $browse_panel->setTable($browse_table);
     $pager->setURI($browse_uri, 'offset');
     if ($pager->willShowPagingControls()) {
         $pager_box = $this->renderTablePagerBox($pager);
     } else {
         $pager_box = null;
     }
     return array($browse_panel, $pager_box);
 }
 private function buildBrowseTable($browse_results, $browse_paths, $browse_exception, array $handles, PHUIPagerView $pager)
 {
     require_celerity_resource('diffusion-icons-css');
     $request = $this->getRequest();
     $viewer = $request->getUser();
     $drequest = $this->getDiffusionRequest();
     $repository = $drequest->getRepository();
     if ($browse_exception) {
         if ($repository->isImporting()) {
             // The history table renders a useful message.
             return null;
         } else {
             return $this->renderStatusMessage(pht('Unable to Retrieve Paths'), $browse_exception->getMessage());
         }
     }
     $browse_table = id(new DiffusionBrowseTableView())->setUser($viewer)->setDiffusionRequest($drequest)->setHandles($handles);
     if ($browse_paths) {
         $browse_table->setPaths($browse_paths);
     } else {
         $browse_table->setPaths(array());
     }
     $browse_uri = $drequest->generateURI(array('action' => 'browse'));
     $browse_panel = new PHUIObjectBoxView();
     $header = id(new PHUIHeaderView())->setHeader(pht('Repository'));
     $icon = id(new PHUIIconView())->setIcon('fa-folder-open');
     $button = new PHUIButtonView();
     $button->setText(pht('Browse Repository'));
     $button->setTag('a');
     $button->setIcon($icon);
     $button->setHref($browse_uri);
     $header->addActionLink($button);
     $browse_panel->setHeader($header);
     $locate_panel = null;
     if ($repository->canUsePathTree()) {
         Javelin::initBehavior('diffusion-locate-file', array('controlID' => 'locate-control', 'inputID' => 'locate-input', 'browseBaseURI' => (string) $drequest->generateURI(array('action' => 'browse')), 'uri' => (string) $drequest->generateURI(array('action' => 'pathtree'))));
         $form = id(new AphrontFormView())->setUser($viewer)->appendChild(id(new AphrontFormTypeaheadControl())->setHardpointID('locate-control')->setID('locate-input')->setLabel(pht('Locate File')));
         $form_box = id(new PHUIBoxView())->appendChild($form->buildLayoutView());
         $locate_panel = id(new PHUIObjectBoxView())->setHeaderText('Locate File')->appendChild($form_box);
     }
     $browse_panel->setTable($browse_table);
     $pager->setURI($browse_uri, 'offset');
     if ($pager->willShowPagingControls()) {
         $pager_box = $this->renderTablePagerBox($pager);
     } else {
         $pager_box = null;
     }
     return array($locate_panel, $browse_panel, $pager_box);
 }
 public function handleRequest(AphrontRequest $request)
 {
     $viewer = $request->getViewer();
     $this->slug = $request->getURIData('slug');
     $document = id(new PhrictionDocumentQuery())->setViewer($viewer)->withSlugs(array(PhabricatorSlug::normalize($this->slug)))->needContent(true)->executeOne();
     if (!$document) {
         return new Aphront404Response();
     }
     $current = $document->getContent();
     $pager = new PHUIPagerView();
     $pager->setOffset($request->getInt('page'));
     $pager->setURI($request->getRequestURI(), 'page');
     $history = id(new PhrictionContent())->loadAllWhere('documentID = %d ORDER BY version DESC LIMIT %d, %d', $document->getID(), $pager->getOffset(), $pager->getPageSize() + 1);
     $history = $pager->sliceResults($history);
     $author_phids = mpull($history, 'getAuthorPHID');
     $handles = $this->loadViewerHandles($author_phids);
     $list = new PHUIObjectItemListView();
     $list->setFlush(true);
     foreach ($history as $content) {
         $author = $handles[$content->getAuthorPHID()]->renderLink();
         $slug_uri = PhrictionDocument::getSlugURI($document->getSlug());
         $version = $content->getVersion();
         $diff_uri = new PhutilURI('/phriction/diff/' . $document->getID() . '/');
         $vs_previous = null;
         if ($content->getVersion() != 1) {
             $vs_previous = $diff_uri->alter('l', $content->getVersion() - 1)->alter('r', $content->getVersion());
         }
         $vs_head = null;
         if ($content->getID() != $document->getContentID()) {
             $vs_head = $diff_uri->alter('l', $content->getVersion())->alter('r', $current->getVersion());
         }
         $change_type = PhrictionChangeType::getChangeTypeLabel($content->getChangeType());
         switch ($content->getChangeType()) {
             case PhrictionChangeType::CHANGE_DELETE:
                 $color = 'red';
                 break;
             case PhrictionChangeType::CHANGE_EDIT:
                 $color = 'lightbluetext';
                 break;
             case PhrictionChangeType::CHANGE_MOVE_HERE:
                 $color = 'yellow';
                 break;
             case PhrictionChangeType::CHANGE_MOVE_AWAY:
                 $color = 'orange';
                 break;
             case PhrictionChangeType::CHANGE_STUB:
                 $color = 'green';
                 break;
             default:
                 throw new Exception(pht('Unknown change type!'));
                 break;
         }
         $item = id(new PHUIObjectItemView())->setHeader(pht('%s by %s', $change_type, $author))->setStatusIcon('fa-file ' . $color)->addAttribute(phutil_tag('a', array('href' => $slug_uri . '?v=' . $version), pht('Version %s', $version)))->addAttribute(pht('%s %s', phabricator_date($content->getDateCreated(), $viewer), phabricator_time($content->getDateCreated(), $viewer)));
         if ($content->getDescription()) {
             $item->addAttribute($content->getDescription());
         }
         if ($vs_previous) {
             $item->addIcon('fa-reply', pht('Show Change'), array('href' => $vs_previous));
         } else {
             $item->addIcon('fa-reply grey', phutil_tag('em', array(), pht('No previous change')));
         }
         if ($vs_head) {
             $item->addIcon('fa-reply-all', pht('Show Later Changes'), array('href' => $vs_head));
         } else {
             $item->addIcon('fa-reply-all grey', phutil_tag('em', array(), pht('No later changes')));
         }
         $list->addItem($item);
     }
     $crumbs = $this->buildApplicationCrumbs();
     $crumb_views = $this->renderBreadcrumbs($document->getSlug());
     foreach ($crumb_views as $view) {
         $crumbs->addCrumb($view);
     }
     $crumbs->addTextCrumb(pht('History'), PhrictionDocument::getSlugURI($document->getSlug(), 'history'));
     $header = new PHUIHeaderView();
     $header->setHeader(phutil_tag('a', array('href' => PhrictionDocument::getSlugURI($document->getSlug())), head($history)->getTitle()));
     $header->setSubheader(pht('Document History'));
     $obj_box = id(new PHUIObjectBoxView())->setHeader($header)->setObjectList($list);
     $pager = id(new PHUIBoxView())->addClass('ml')->appendChild($pager);
     return $this->buildApplicationPage(array($crumbs, $obj_box, $pager), array('title' => pht('Document History')));
 }