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'))); }