public function processRequest()
 {
     $request = $this->getRequest();
     $repository = id(new PhabricatorRepository())->load($this->id);
     if (!$repository) {
         return new Aphront404Response();
     }
     $views = array('basic' => 'Basics', 'tracking' => 'Tracking');
     $this->repository = $repository;
     if (!isset($views[$this->view])) {
         $this->view = head_key($views);
     }
     $nav = new AphrontSideNavView();
     foreach ($views as $view => $name) {
         $nav->addNavItem(phutil_render_tag('a', array('class' => $view == $this->view ? 'aphront-side-nav-selected' : null, 'href' => '/repository/edit/' . $repository->getID() . '/' . $view . '/'), phutil_escape_html($name)));
     }
     $nav->appendChild($this->renderDaemonNotice());
     $this->sideNav = $nav;
     switch ($this->view) {
         case 'basic':
             return $this->processBasicRequest();
         case 'tracking':
             return $this->processTrackingRequest();
         default:
             throw new Exception("Unknown view.");
     }
 }
 public function processRequest()
 {
     $classes = id(new PhutilSymbolLoader())->setAncestorClass('PhabricatorUIExample')->selectAndLoadSymbols();
     $classes = ipull($classes, 'name', 'name');
     $selected = null;
     foreach ($classes as $class => $ignored) {
         $classes[$class] = newv($class, array());
         if ($this->class == $classes[$class]->getName()) {
             $selected = $class;
         }
     }
     if (!$selected) {
         reset($classes);
         $selected = key($classes);
     }
     $nav = new AphrontSideNavView();
     foreach ($classes as $class => $obj) {
         $name = $obj->getName();
         $nav->addNavItem(phutil_render_tag('a', array('href' => '/uiexample/view/' . $name . '/', 'class' => $selected == $class ? 'aphront-side-nav-selected' : null), phutil_escape_html($obj->getName())));
     }
     require_celerity_resource('phabricator-ui-example-css');
     $example = $classes[$selected];
     $example->setRequest($this->getRequest());
     $nav->appendChild('<div class="phabricator-ui-example-header">' . '<h1 class="phabricator-ui-example-name">' . phutil_escape_html($example->getName()) . ' (' . get_class($example) . ')' . '</h1>' . '<p class="phabricator-ui-example-description">' . $example->getDescription() . '</p>' . '</div>');
     $nav->appendChild($example->renderExample());
     return $this->buildStandardPageResponse($nav, array('title' => 'UI Example'));
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $nav = new AphrontSideNavView();
     $links = array('calls' => 'All Calls');
     if (empty($links[$this->view])) {
         $this->view = key($links);
     }
     foreach ($links as $slug => $name) {
         $nav->addNavItem(phutil_render_tag('a', array('href' => '/conduit/log/view/' . $slug . '/', 'class' => $slug == $this->view ? 'aphront-side-nav-selected' : null), phutil_escape_html($name)));
     }
     $conn_table = new PhabricatorConduitConnectionLog();
     $call_table = new PhabricatorConduitMethodCallLog();
     $conn_r = $call_table->establishConnection('r');
     $pager = new AphrontPagerView();
     $pager->setOffset($request->getInt('page'));
     $calls = $call_table->loadAllWhere('1 = 1 ORDER BY id DESC LIMIT %d, %d', $pager->getOffset(), $pager->getPageSize() + 1);
     $calls = $pager->sliceResults($calls);
     $pager->setURI(new PhutilURI('/conduit/log/view/' . $this->view . '/'), 'page');
     $pager->setEnableKeyboardShortcuts(true);
     $min = $pager->getOffset() + 1;
     $max = $min + count($calls) - 1;
     $conn_ids = array_filter(mpull($calls, 'getConnectionID'));
     $conns = array();
     if ($conn_ids) {
         $conns = $conn_table->loadAllWhere('id IN (%Ld)', $conn_ids);
     }
     $table = $this->renderCallTable($calls, $conns);
     $panel = new AphrontPanelView();
     $panel->setHeader('Conduit Method Calls (' . $min . '-' . $max . ')');
     $panel->appendChild($table);
     $panel->appendChild($pager);
     $nav->appendChild($panel);
     return $this->buildStandardPageResponse($nav, array('title' => 'Conduit Logs', 'tab' => 'logs'));
 }
 private function renderSideNav()
 {
     $sidenav = new AphrontSideNavView();
     foreach ($this->pages as $page => $name) {
         $sidenav->addNavItem(phutil_render_tag('a', array('href' => '/settings/page/' . $page . '/', 'class' => $page == $this->page ? 'aphront-side-nav-selected' : null), phutil_escape_html($name)));
     }
     return $sidenav;
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $package = id(new PhabricatorOwnersPackage())->load($this->id);
     if (!$package) {
         return new Aphront404Response();
     }
     $paths = $package->loadPaths();
     $owners = $package->loadOwners();
     $phids = array();
     foreach ($paths as $path) {
         $phids[$path->getRepositoryPHID()] = true;
     }
     foreach ($owners as $owner) {
         $phids[$owner->getUserPHID()] = true;
     }
     $phids = array_keys($phids);
     $handles = id(new PhabricatorObjectHandleData($phids))->loadHandles();
     $rows = array();
     $rows[] = array('Name', phutil_escape_html($package->getName()));
     $rows[] = array('Description', phutil_escape_html($package->getDescription()));
     $primary_owner = null;
     $primary_phid = $package->getPrimaryOwnerPHID();
     if ($primary_phid && isset($handles[$primary_phid])) {
         $primary_owner = '<strong>' . $handles[$primary_phid]->renderLink() . '</strong>';
     }
     $rows[] = array('Primary Owner', $primary_owner);
     $owner_links = array();
     foreach ($owners as $owner) {
         $owner_links[] = $handles[$owner->getUserPHID()]->renderLink();
     }
     $owner_links = implode('<br />', $owner_links);
     $rows[] = array('Owners', $owner_links);
     $rows[] = array('Auditing', $package->getAuditingEnabled() ? 'Enabled' : 'Disabled');
     $rows[] = array('Related Commits', phutil_render_tag('a', array('href' => '/owners/related/view/all/?phid=' . $package->getPHID()), phutil_escape_html('Related Commits')));
     $path_links = array();
     foreach ($paths as $path) {
         $callsign = $handles[$path->getRepositoryPHID()]->getName();
         $repo = phutil_escape_html('r' . $callsign);
         $path_link = phutil_render_tag('a', array('href' => '/diffusion/' . $callsign . '/browse/:' . $path->getPath()), phutil_escape_html($path->getPath()));
         $path_links[] = $repo . ' ' . $path_link;
     }
     $path_links = implode('<br />', $path_links);
     $rows[] = array('Paths', $path_links);
     $table = new AphrontTableView($rows);
     $table->setColumnClasses(array('header', 'wide'));
     $panel = new AphrontPanelView();
     $panel->setHeader('Package Details for "' . phutil_escape_html($package->getName()) . '"');
     $panel->addButton(javelin_render_tag('a', array('href' => '/owners/delete/' . $package->getID() . '/', 'class' => 'button grey', 'sigil' => 'workflow'), 'Delete Package'));
     $panel->addButton(phutil_render_tag('a', array('href' => '/owners/edit/' . $package->getID() . '/', 'class' => 'button'), 'Edit Package'));
     $panel->appendChild($table);
     $nav = new AphrontSideNavView();
     $nav->appendChild($panel);
     $nav->addNavItem(phutil_render_tag('a', array('href' => '/owners/package/' . $package->getID() . '/', 'class' => 'aphront-side-nav-selected'), 'Package Details'));
     return $this->buildStandardPageResponse($nav, array('title' => "Package '" . $package->getName() . "'"));
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $admin = $request->getUser();
     if ($this->id) {
         $user = id(new PhabricatorUser())->load($this->id);
         if (!$user) {
             return new Aphront404Response();
         }
     } else {
         $user = new PhabricatorUser();
     }
     $views = array('basic' => 'Basic Information', 'role' => 'Edit Role', 'cert' => 'Conduit Certificate');
     if (!$user->getID()) {
         $view = 'basic';
     } else {
         if (isset($views[$this->view])) {
             $view = $this->view;
         } else {
             $view = 'basic';
         }
     }
     $content = array();
     if ($request->getStr('saved')) {
         $notice = new AphrontErrorView();
         $notice->setSeverity(AphrontErrorView::SEVERITY_NOTICE);
         $notice->setTitle('Changes Saved');
         $notice->appendChild('<p>Your changes were saved.</p>');
         $content[] = $notice;
     }
     switch ($view) {
         case 'basic':
             $response = $this->processBasicRequest($user);
             break;
         case 'role':
             $response = $this->processRoleRequest($user);
             break;
         case 'cert':
             $response = $this->processCertificateRequest($user);
             break;
     }
     if ($response instanceof AphrontResponse) {
         return $response;
     }
     $content[] = $response;
     if ($user->getID()) {
         $side_nav = new AphrontSideNavView();
         $side_nav->appendChild($content);
         foreach ($views as $key => $name) {
             $side_nav->addNavItem(phutil_render_tag('a', array('href' => '/people/edit/' . $user->getID() . '/' . $key . '/', 'class' => $key == $view ? 'aphront-side-nav-selected' : null), phutil_escape_html($name)));
         }
         $content = $side_nav;
     }
     return $this->buildStandardPageResponse($content, array('title' => 'Edit User'));
 }
 protected final function buildSideNav($selected, $has_change_view)
 {
     $nav = new AphrontSideNavView();
     $navs = array('history' => 'History View', 'browse' => 'Browse View', 'change' => 'Change View');
     if (!$has_change_view) {
         unset($navs['change']);
     }
     $drequest = $this->getDiffusionRequest();
     foreach ($navs as $action => $name) {
         $href = $drequest->generateURI(array('action' => $action));
         $nav->addNavItem(phutil_render_tag('a', array('href' => $href, 'class' => $action == $selected ? 'aphront-side-nav-selected' : null), $name));
     }
     // TODO: URI encoding might need to be sorted out for this link.
     $nav->addNavItem(phutil_render_tag('a', array('href' => '/owners/view/search/' . '?repository=' . phutil_escape_uri($drequest->getCallsign()) . '&path=' . phutil_escape_uri('/' . $drequest->getPath())), 'Search Owners'));
     return $nav;
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $this->viewPHID = nonempty($request->getStr('phid'), null);
     if ($request->isFormPost()) {
         $phid_arr = $request->getArr('view_user');
         $view_target = head($phid_arr);
         return id(new AphrontRedirectResponse())->setURI($request->getRequestURI()->alter('phid', $view_target));
     }
     $map = HeraldContentTypeConfig::getContentTypeMap();
     if (empty($map[$this->view])) {
         reset($map);
         $this->view = key($map);
     }
     $offset = $request->getInt('offset', 0);
     $pager = new AphrontPagerView();
     $pager->setPageSize(50);
     $pager->setOffset($offset);
     $pager->setURI($request->getRequestURI(), 'offset');
     list($rules, $handles) = $this->queryRules($pager);
     if (!$this->viewPHID) {
         $view_users = array();
     } else {
         $view_users = array($this->viewPHID => $handles[$this->viewPHID]->getFullName());
     }
     $filter_form = id(new AphrontFormView())->setUser($user)->appendChild(id(new AphrontFormTokenizerControl())->setDatasource('/typeahead/common/users/')->setLabel('View User')->setName('view_user')->setValue($view_users)->setLimit(1));
     $filter_view = new AphrontListFilterView();
     $filter_view->appendChild($filter_form);
     $list_view = id(new HeraldRuleListView())->setRules($rules)->setHandles($handles)->setMap($map)->setAllowCreation(false)->setView($this->view);
     $panel = $list_view->render();
     $panel->appendChild($pager);
     $sidenav = new AphrontSideNavView();
     $sidenav->appendChild($filter_view);
     $sidenav->appendChild($panel);
     $query = '';
     if ($this->viewPHID) {
         $query = '?phid=' . $this->viewPHID;
     }
     foreach ($map as $key => $value) {
         $sidenav->addNavItem(phutil_render_tag('a', array('href' => '/herald/all/view/' . $key . '/' . $query, 'class' => $key == $this->view ? 'aphront-side-nav-selected' : null), phutil_escape_html($value)));
     }
     return $this->buildStandardPageResponse(array($filter_view, $panel), array('title' => 'Herald', 'tab' => 'all'));
 }
 public function render()
 {
     $selected_filter = $this->getSelectedFilter();
     if (!$selected_filter) {
         throw new Exception("Call setFilter() before render()!");
     }
     $filters = array('Files' => array(), 'upload' => array('name' => 'Upload File', 'href' => '/file/filter/upload/'), 'my' => array('name' => 'My Files', 'href' => '/file/filter/my/'), 'all' => array('name' => 'All Files', 'href' => '/file/filter/all/'), '<br />' => null, '<div style="font-weight: normal; font-size: smaller; ' . 'white-space: normal;">NOTE: Macros have moved to a separate ' . 'application. Use the "Search" field to jump to it or choose ' . 'More Stuff &raquo; Macros from the home page.</span>' => null);
     $side_nav = new AphrontSideNavView();
     foreach ($filters as $filter_key => $filter) {
         // more of a label than a filter
         if (empty($filter)) {
             $side_nav->addNavItem(phutil_render_tag('span', array(), $filter_key));
             continue;
         }
         $selected = $filter_key == $selected_filter;
         $side_nav->addNavItem(phutil_render_tag('a', array('href' => $filter['href'], 'class' => $selected ? 'aphront-side-nav-selected' : null), $filter['name']));
     }
     $side_nav->appendChild($this->renderChildren());
     return $side_nav->render();
 }
 public function render()
 {
     $selected_filter = $this->getSelectedFilter();
     if (!$selected_filter) {
         throw new Exception("Call setFilter() before render()!");
     }
     $filters = array('Files' => array(), 'upload' => array('name' => 'Upload File', 'href' => '/file/filter/upload/'), 'my' => array('name' => 'My Files', 'href' => '/file/filter/my/'), 'all' => array('name' => 'All Files', 'href' => '/file/filter/all/'), '<hr />' => array(), 'Image Macros' => array(), 'create_macro' => array('name' => 'Create Image Macro', 'href' => '/file/macro/edit/'), 'all_macros' => array('name' => 'All Image Macros', 'href' => '/file/macro/'));
     $side_nav = new AphrontSideNavView();
     foreach ($filters as $filter_key => $filter) {
         // more of a label than a filter
         if (empty($filter)) {
             $side_nav->addNavItem(phutil_render_tag('span', array(), $filter_key));
             continue;
         }
         $selected = $filter_key == $selected_filter;
         $side_nav->addNavItem(phutil_render_tag('a', array('href' => $filter['href'], 'class' => $selected ? 'aphront-side-nav-selected' : null), $filter['name']));
     }
     $side_nav->appendChild($this->renderChildren());
     return $side_nav->render();
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $repository = id(new PhabricatorRepository())->load($this->id);
     if (!$repository) {
         return new Aphront404Response();
     }
     $views = array('basic' => 'Basics', 'tracking' => 'Tracking');
     $vcs = $repository->getVersionControlSystem();
     if ($vcs == DifferentialRevisionControlSystem::GIT) {
         if (!$repository->getDetail('github-token')) {
             $token = substr(base64_encode(Filesystem::readRandomBytes(8)), 0, 8);
             $repository->setDetail('github-token', $token);
             $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites();
             $repository->save();
             unset($unguarded);
         }
         $views['github'] = 'GitHub';
     }
     $this->repository = $repository;
     if (!isset($views[$this->view])) {
         reset($views);
         $this->view = key($views);
     }
     $nav = new AphrontSideNavView();
     foreach ($views as $view => $name) {
         $nav->addNavItem(phutil_render_tag('a', array('class' => $view == $this->view ? 'aphront-side-nav-selected' : null, 'href' => '/repository/edit/' . $repository->getID() . '/' . $view . '/'), phutil_escape_html($name)));
     }
     $this->sideNav = $nav;
     switch ($this->view) {
         case 'basic':
             return $this->processBasicRequest();
         case 'tracking':
             return $this->processTrackingRequest();
         case 'github':
             return $this->processGithubRequest();
         default:
             throw new Exception("Unknown view.");
     }
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $methods = $this->getAllMethods();
     if (empty($methods[$this->method])) {
         $this->method = key($methods);
     }
     $method_class = $methods[$this->method];
     PhutilSymbolLoader::loadClass($method_class);
     $method_object = newv($method_class, array());
     $error_description = array();
     $error_types = $method_object->defineErrorTypes();
     if ($error_types) {
         $error_description[] = '<ul>';
         foreach ($error_types as $error => $meaning) {
             $error_description[] = '<li>' . '<strong>' . phutil_escape_html($error) . ':</strong> ' . phutil_escape_html($meaning) . '</li>';
         }
         $error_description[] = '</ul>';
         $error_description = implode("\n", $error_description);
     } else {
         $error_description = "This method does not raise any specific errors.";
     }
     $form = new AphrontFormView();
     $form->setUser($request->getUser())->setAction('/api/' . $this->method)->appendChild(id(new AphrontFormStaticControl())->setLabel('Description')->setValue($method_object->getMethodDescription()))->appendChild(id(new AphrontFormStaticControl())->setLabel('Returns')->setValue($method_object->defineReturnType()))->appendChild(id(new AphrontFormMarkupControl())->setLabel('Errors')->setValue($error_description))->appendChild('<p class="aphront-form-instructions">Enter parameters using ' . '<strong>JSON</strong>. For instance, to enter a list, type: ' . '<tt>["apple", "banana", "cherry"]</tt>');
     $params = $method_object->defineParamTypes();
     foreach ($params as $param => $desc) {
         $form->appendChild(id(new AphrontFormTextControl())->setLabel($param)->setName("params[{$param}]")->setCaption(phutil_escape_html($desc)));
     }
     $form->appendChild(id(new AphrontFormSelectControl())->setLabel('Output Format')->setName('output')->setOptions(array('human' => 'Human Readable', 'json' => 'JSON')))->appendChild(id(new AphrontFormSubmitControl())->setValue('Call Method'));
     $panel = new AphrontPanelView();
     $panel->setHeader('Conduit API: ' . phutil_escape_html($this->method));
     $panel->appendChild($form);
     $panel->setWidth(AphrontPanelView::WIDTH_WIDE);
     $view = new AphrontSideNavView();
     foreach ($this->buildNavItems() as $item) {
         $view->addNavItem($item);
     }
     $view->appendChild($panel);
     return $this->buildStandardPageResponse(array($view), array('title' => 'Conduit Console', 'tab' => 'console'));
 }
 protected final function buildSideNav($selected, $has_change_view)
 {
     $nav = new AphrontSideNavView();
     $navs = array('history' => 'History View', 'browse' => 'Browse View', 'change' => 'Change View');
     if (!$has_change_view) {
         unset($navs['change']);
     }
     $drequest = $this->getDiffusionRequest();
     $repository = $drequest->getRepository();
     $callsign = $repository->getCallsign();
     $branch_uri = $drequest->getBranchURIComponent($drequest->getBranch());
     $path_uri = $branch_uri . $drequest->getPath();
     $commit_uri = null;
     $raw_commit = $drequest->getRawCommit();
     if ($raw_commit) {
         $commit_uri = ';' . $drequest->getCommitURIComponent($raw_commit);
     }
     foreach ($navs as $uri => $name) {
         $nav->addNavItem(phutil_render_tag('a', array('href' => "/diffusion/{$callsign}/{$uri}/{$path_uri}{$commit_uri}", 'class' => $uri == $selected ? 'aphront-side-nav-selected' : null), $name));
     }
     return $nav;
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $map = HeraldContentTypeConfig::getContentTypeMap();
     if (empty($map[$this->view])) {
         reset($map);
         $this->view = key($map);
     }
     $rules = id(new HeraldRule())->loadAllWhere('contentType = %s AND authorPHID = %s', $this->view, $user->getPHID());
     $need_phids = mpull($rules, 'getAuthorPHID');
     $handles = id(new PhabricatorObjectHandleData($need_phids))->loadHandles();
     $type = 'differential';
     $rows = array();
     foreach ($rules as $rule) {
         $owner = $handles[$rule->getAuthorPHID()]->renderLink();
         $name = phutil_render_tag('a', array('href' => '/herald/rule/' . $rule->getID() . '/'), phutil_escape_html($rule->getName()));
         $delete = 'delete';
         $delete = javelin_render_tag('a', array('href' => '/herald/delete/' . $rule->getID() . '/', 'sigil' => 'workflow', 'class' => 'button small grey'), 'Delete');
         $rows[] = array($map[$rule->getContentType()], $owner, $name, $delete);
     }
     $rules_for = phutil_escape_html($map[$this->view]);
     $table = new AphrontTableView($rows);
     $table->setNoDataString("No matching subscription rules for {$rules_for}.");
     $table->setHeaders(array('Type', 'Owner', 'Rule Name', ''));
     $table->setColumnClasses(array('', '', 'wide wrap pri', 'action'));
     $panel = new AphrontPanelView();
     $panel->setHeader("Herald Rules for {$rules_for}");
     $panel->setCreateButton('Create New Herald Rule', '/herald/new/' . $this->view . '/');
     $panel->appendChild($table);
     $sidenav = new AphrontSideNavView();
     $sidenav->appendChild($panel);
     foreach ($map as $key => $value) {
         $sidenav->addNavItem(phutil_render_tag('a', array('href' => '/herald/view/' . $key . '/', 'class' => $key == $this->view ? 'aphront-side-nav-selected' : null), phutil_escape_html($value)));
     }
     return $this->buildStandardPageResponse($sidenav, array('title' => 'Herald', 'tab' => 'rules'));
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $views = array('all' => 'All Documents', 'updates' => 'Recently Updated');
     if (empty($views[$this->view])) {
         $this->view = 'all';
     }
     $nav = new AphrontSideNavView();
     foreach ($views as $view => $name) {
         $nav->addNavItem(phutil_render_tag('a', array('href' => '/phriction/list/' . $view . '/', 'class' => $this->view == $view ? 'aphront-side-nav-selected' : null), phutil_escape_html($name)));
     }
     $pager = new AphrontPagerView();
     $pager->setURI($request->getRequestURI(), 'page');
     $pager->setOffset($request->getInt('page'));
     $documents = $this->loadDocuments($pager);
     $content = mpull($documents, 'getContent');
     $phids = mpull($content, 'getAuthorPHID');
     $handles = $this->loadViewerHandles($phids);
     $rows = array();
     foreach ($documents as $document) {
         $content = $document->getContent();
         $rows[] = array($handles[$content->getAuthorPHID()]->renderLink(), phutil_render_tag('a', array('href' => PhrictionDocument::getSlugURI($document->getSlug())), phutil_escape_html($content->getTitle())), phabricator_date($content->getDateCreated(), $user), phabricator_time($content->getDateCreated(), $user));
     }
     $document_table = new AphrontTableView($rows);
     $document_table->setHeaders(array('Last Editor', 'Title', 'Last Update', 'Time'));
     $document_table->setColumnClasses(array('', 'wide pri', 'right', 'right'));
     $view_headers = array('all' => 'All Documents', 'updates' => 'Recently Updated Documents');
     $view_header = $view_headers[$this->view];
     $panel = new AphrontPanelView();
     $panel->setHeader($view_header);
     $panel->appendChild($document_table);
     $panel->appendChild($pager);
     $nav->appendChild($panel);
     return $this->buildStandardPageResponse($nav, array('title' => 'Phriction Main'));
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $this->feedOffset = $request->getInt('off');
     $this->questionOffset = $request->getInt('qoff');
     $this->answerOffset = $request->getInt('aoff');
     $side_nav = new AphrontSideNavView();
     foreach (self::$pages as $pagename => $pagetitle) {
         $class = "";
         if ($pagename == $this->page) {
             $class = 'aphront-side-nav-selected';
         }
         $linky = phutil_render_tag('a', array('href' => '/ponder/' . $pagename . '/', 'class' => $class), phutil_escape_html($pagetitle));
         $side_nav->addNavItem($linky);
     }
     switch ($this->page) {
         case self::PAGE_FEED:
             $data = PonderQuestionQuery::loadHottest($user, $this->feedOffset, self::FEED_PAGE_SIZE + 1);
             $phids = array();
             foreach ($data as $question) {
                 $phids[] = $question->getAuthorPHID();
             }
             $handles = id(new PhabricatorObjectHandleData($phids))->loadHandles();
             $side_nav->appendChild(id(new PonderQuestionFeedView())->setUser($user)->setData($data)->setHandles($handles)->setOffset($this->feedOffset)->setPageSize(self::FEED_PAGE_SIZE)->setURI(new PhutilURI("/ponder/feed/"), "off"));
             break;
         case self::PAGE_PROFILE:
             $questions = PonderQuestionQuery::loadByAuthor($user, $user->getPHID(), $this->questionOffset, self::PROFILE_QUESTION_PAGE_SIZE + 1);
             $answers = PonderAnswerQuery::loadByAuthorWithQuestions($user, $user->getPHID(), $this->answerOffset, self::PROFILE_ANSWER_PAGE_SIZE + 1);
             $phids = array($user->getPHID());
             $handles = id(new PhabricatorObjectHandleData($phids))->loadHandles();
             $side_nav->appendChild(id(new PonderUserProfileView())->setUser($user)->setQuestions($questions)->setAnswers($answers)->setHandles($handles)->setQuestionOffset($this->questionOffset)->setAnswerOffset($this->answerOffset)->setPageSize(self::PROFILE_QUESTION_PAGE_SIZE)->setURI(new PhutilURI("/ponder/profile/"), "qoff", "aoff"));
             break;
     }
     return $this->buildStandardPageResponse($side_nav, array('title' => self::$pages[$this->page]));
 }
 public function render()
 {
     if (!$this->baseURI) {
         throw new Exception("Call setBaseURI() before render()!");
     }
     if ($this->selectedFilter === false) {
         throw new Exception("Call selectFilter() before render()!");
     }
     $view = new AphrontSideNavView();
     foreach ($this->items as $item) {
         list($type, $key, $name) = $item;
         switch ($type) {
             case 'spacer':
                 $view->addNavItem('<br />');
                 break;
             case 'label':
                 $view->addNavItem(phutil_render_tag('span', array(), phutil_escape_html($name)));
                 break;
             case 'filter':
                 $class = $key == $this->selectedFilter ? 'aphront-side-nav-selected' : null;
                 if (empty($item['uri'])) {
                     $href = clone $this->baseURI;
                     $href->setPath($href->getPath() . $key . '/');
                     $href = (string) $href;
                 } else {
                     $href = $item['uri'];
                 }
                 $view->addNavItem(phutil_render_tag('a', array('href' => $href, 'class' => $class), phutil_escape_html($name)));
                 break;
             default:
                 throw new Exception("Unknown item type '{$type}'.");
         }
     }
     $view->appendChild($this->renderChildren());
     return $view->render();
 }
 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 &middot; {$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'));
 }
 private function renderSideNav(array $views, $view)
 {
     $side_nav = new AphrontSideNavView();
     foreach ($views as $key => $name) {
         $side_nav->addNavItem(phutil_render_tag('a', array('href' => '/vote/view/' . $key . '/', 'class' => $view == $key ? 'aphront-side-nav-selected' : null), phutil_escape_html($name)));
     }
     return $side_nav;
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $paste_list = array();
     $pager = null;
     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;
             }
             // if we didn't succeed or we weren't trying, load just a few
             // recent pastes with NO pagination
             $this->setOffset(0);
             $this->setPageSize(10);
             list($paste_list, $pager) = $this->loadPasteList();
             break;
         case 'my':
             $this->setAuthor($user->getPHID());
             $this->setOffset($request->getInt('page', 0));
             list($paste_list, $pager) = $this->loadPasteList();
             break;
         case 'all':
             $this->setOffset($request->getInt('page', 0));
             list($paste_list, $pager) = $this->loadPasteList();
             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 &middot; {$see_all}";
             $side_nav->appendChild($this->renderPasteList($paste_list, $header, $pager = null));
             break;
         case 'my':
             $header = 'Your Pastes';
             $side_nav->appendChild($this->renderPasteList($paste_list, $header, $pager));
             break;
         case 'all':
             $header = 'All Pastes';
             $side_nav->appendChild($this->renderPasteList($paste_list, $header, $pager));
             break;
     }
     return $this->buildStandardPageResponse($side_nav, array('title' => 'Paste'));
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $views = array('owned' => 'Owned Packages', 'all' => 'All Packages', 'search' => 'Search Results');
     if (empty($views[$this->view])) {
         reset($views);
         $this->view = key($views);
     }
     if ($this->view != 'search') {
         unset($views['search']);
     }
     $nav = new AphrontSideNavView();
     foreach ($views as $key => $name) {
         $nav->addNavItem(phutil_render_tag('a', array('href' => '/owners/view/' . $key . '/', 'class' => $this->view == $key ? 'aphront-side-nav-selected' : null), phutil_escape_html($name)));
     }
     $package = new PhabricatorOwnersPackage();
     $owner = new PhabricatorOwnersOwner();
     $path = new PhabricatorOwnersPath();
     switch ($this->view) {
         case 'search':
             $packages = array();
             $conn_r = $package->establishConnection('r');
             $where = array('1 = 1');
             $join = array();
             if ($request->getStr('name')) {
                 $where[] = qsprintf($conn_r, 'p.name LIKE %~', $request->getStr('name'));
             }
             if ($request->getStr('path')) {
                 $join[] = qsprintf($conn_r, 'JOIN %T path ON path.packageID = p.id', $path->getTableName());
                 $where[] = qsprintf($conn_r, 'path.path LIKE %~', $request->getStr('path'));
             }
             if ($request->getArr('owner')) {
                 $join[] = qsprintf($conn_r, 'JOIN %T o ON o.packageID = p.id', $owner->getTableName());
                 $where[] = qsprintf($conn_r, 'o.userPHID IN (%Ls)', $request->getArr('owner'));
             }
             $data = queryfx_all($conn_r, 'SELECT p.* FROM %T p %Q WHERE %Q GROUP BY p.id', $package->getTableName(), implode(' ', $join), '(' . implode(') AND (', $where) . ')');
             $packages = $package->loadAllFromArray($data);
             $header = 'Search Results';
             $nodata = 'No packages match your query.';
             break;
         case 'owned':
             $data = queryfx_all($package->establishConnection('r'), 'SELECT p.* FROM %T p JOIN %T o ON p.id = o.packageID
         WHERE o.userPHID = %s GROUP BY p.id', $package->getTableName(), $owner->getTableName(), $user->getPHID());
             $packages = $package->loadAllFromArray($data);
             $header = 'Owned Packages';
             $nodata = 'No owned packages';
             break;
         case 'all':
             $packages = $package->loadAll();
             $header = 'All Packages';
             $nodata = 'There are no defined packages.';
             break;
     }
     $content = $this->renderPackageTable($packages, $header, $nodata);
     $filter = new AphrontListFilterView();
     $filter->addButton(phutil_render_tag('a', array('href' => '/owners/new/', 'class' => 'green button'), 'Create New Package'));
     $owners_search_value = array();
     if ($request->getArr('owner')) {
         $phids = $request->getArr('owner');
         $phid = reset($phids);
         $handles = id(new PhabricatorObjectHandleData(array($phid)))->loadHandles();
         $owners_search_value = array($phid => $handles[$phid]->getFullName());
     }
     $form = id(new AphrontFormView())->setUser($user)->setAction('/owners/view/search/')->appendChild(id(new AphrontFormTextControl())->setName('name')->setLabel('Name')->setValue($request->getStr('name')))->appendChild(id(new AphrontFormTokenizerControl())->setDatasource('/typeahead/common/users/')->setLimit(1)->setName('owner')->setLabel('Owner')->setValue($owners_search_value))->appendChild(id(new AphrontFormTextControl())->setName('path')->setLabel('Path')->setValue($request->getStr('path')))->appendChild(id(new AphrontFormSubmitControl())->setValue('Search for Packages'));
     $filter->appendChild($form);
     $nav->appendChild($filter);
     $nav->appendChild($content);
     return $this->buildStandardPageResponse($nav, array('title' => 'Package Index', 'tab' => 'index'));
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $viewer_is_anonymous = !$user->isLoggedIn();
     $params = array_filter(array('status' => $request->getStr('status'), 'order' => $request->getStr('order')));
     $default_filter = $viewer_is_anonymous ? 'all' : 'active';
     $filters = $this->getFilters();
     $this->filter = $this->selectFilter($filters, $this->filter, $default_filter);
     // Redirect from search to canonical URL.
     $phid_arr = $request->getArr('view_user');
     if ($phid_arr) {
         $view_user = id(new PhabricatorUser())->loadOneWhere('phid = %s', head($phid_arr));
         $base_uri = '/differential/filter/' . $this->filter . '/';
         if ($view_user) {
             // This is a user, so generate a pretty URI.
             $uri = $base_uri . phutil_escape_uri($view_user->getUserName()) . '/';
         } else {
             // We're assuming this is a mailing list, generate an ugly URI.
             $uri = $base_uri;
             $params['phid'] = head($phid_arr);
         }
         $uri = new PhutilURI($uri);
         $uri->setQueryParams($params);
         return id(new AphrontRedirectResponse())->setURI($uri);
     }
     $uri = new PhutilURI('/differential/filter/' . $this->filter . '/');
     $uri->setQueryParams($params);
     $username = '';
     if ($this->username) {
         $view_user = id(new PhabricatorUser())->loadOneWhere('userName = %s', $this->username);
         if (!$view_user) {
             return new Aphront404Response();
         }
         $username = phutil_escape_uri($this->username) . '/';
         $uri->setPath('/differential/filter/' . $this->filter . '/' . $username);
         $params['phid'] = $view_user->getPHID();
     } else {
         $phid = $request->getStr('phid');
         if (strlen($phid)) {
             $params['phid'] = $phid;
         }
     }
     // Fill in the defaults we'll actually use for calculations if any
     // parameters are missing.
     $params += array('phid' => $user->getPHID(), 'status' => 'all', 'order' => 'modified');
     $side_nav = new AphrontSideNavView();
     foreach ($filters as $filter) {
         list($filter_name, $display_name) = $filter;
         if ($filter_name) {
             $href = clone $uri;
             $href->setPath('/differential/filter/' . $filter_name . '/' . $username);
             if ($filter_name == $this->filter) {
                 $class = 'aphront-side-nav-selected';
             } else {
                 $class = null;
             }
             $item = phutil_render_tag('a', array('href' => (string) $href, 'class' => $class), phutil_escape_html($display_name));
         } else {
             $item = phutil_render_tag('span', array(), phutil_escape_html($display_name));
         }
         $side_nav->addNavItem($item);
     }
     $panels = array();
     $handles = array();
     $controls = $this->getFilterControls($this->filter);
     if ($this->getFilterRequiresUser($this->filter) && !$params['phid']) {
         // In the anonymous case, we still want to let you see some user's
         // list, but we don't have a default PHID to provide (normally, we use
         // the viewing user's). Show a warning instead.
         $warning = new AphrontErrorView();
         $warning->setSeverity(AphrontErrorView::SEVERITY_WARNING);
         $warning->setTitle('User Required');
         $warning->appendChild('This filter requires that a user be specified above.');
         $panels[] = $warning;
     } else {
         $query = $this->buildQuery($this->filter, $params['phid']);
         $pager = null;
         if ($this->getFilterAllowsPaging($this->filter)) {
             $pager = new AphrontPagerView();
             $pager->setOffset($request->getInt('page'));
             $pager->setPageSize(1000);
             $pager->setURI($uri, 'page');
             $query->setOffset($pager->getOffset());
             $query->setLimit($pager->getPageSize() + 1);
         }
         foreach ($controls as $control) {
             $this->applyControlToQuery($control, $query, $params);
         }
         $revisions = $query->execute();
         if ($pager) {
             $revisions = $pager->sliceResults($revisions);
         }
         $views = $this->buildViews($this->filter, $params['phid'], $revisions);
         $view_objects = array();
         foreach ($views as $view) {
             if (empty($view['special'])) {
                 $view_objects[] = $view['view'];
             }
         }
         $phids = array_mergev(mpull($view_objects, 'getRequiredHandlePHIDs'));
         $phids[] = $params['phid'];
         $handles = id(new PhabricatorObjectHandleData($phids))->loadHandles();
         foreach ($views as $view) {
             if (empty($view['special'])) {
                 $view['view']->setHandles($handles);
             }
             $panel = new AphrontPanelView();
             $panel->setHeader($view['title']);
             $panel->appendChild($view['view']);
             if ($pager) {
                 $panel->appendChild($pager);
             }
             $panels[] = $panel;
         }
     }
     $filter_form = id(new AphrontFormView())->setMethod('GET')->setAction('/differential/filter/' . $this->filter . '/')->setUser($user);
     foreach ($controls as $control) {
         $control_view = $this->renderControl($control, $handles, $uri, $params);
         $filter_form->appendChild($control_view);
     }
     $filter_form->addHiddenInput('status', $params['status'])->addHiddenInput('order', $params['order'])->appendChild(id(new AphrontFormSubmitControl())->setValue('Filter Revisions'));
     $filter_view = new AphrontListFilterView();
     $filter_view->appendChild($filter_form);
     if (!$viewer_is_anonymous) {
         $create_uri = new PhutilURI('/differential/diff/create/');
         $filter_view->addButton(phutil_render_tag('a', array('href' => (string) $create_uri, 'class' => 'green button'), 'Create Revision'));
     }
     $side_nav->appendChild($filter_view);
     foreach ($panels as $panel) {
         $side_nav->appendChild($panel);
     }
     return $this->buildStandardPageResponse($side_nav, array('title' => 'Differential Home'));
 }
 private function renderSideNav()
 {
     $views = array('all' => 'Related to Package', 'audit' => 'Needs Attention');
     $query = null;
     if ($this->packagePHID) {
         $query = '?phid=' . $this->packagePHID;
     }
     $nav = new AphrontSideNavView();
     foreach ($views as $key => $name) {
         $nav->addNavItem(phutil_render_tag('a', array('href' => '/owners/related/view/' . $key . '/' . $query, 'class' => $this->view === $key ? 'aphront-side-nav-selected' : null), phutil_escape_html($name)));
     }
     return $nav;
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     if ($request->isFormPost()) {
         $phid_arr = $request->getArr('view_user');
         $view_target = head($phid_arr);
         return id(new AphrontRedirectResponse())->setURI($request->getRequestURI()->alter('phid', $view_target));
     }
     $filters = array('User Revisions', 'active' => array('name' => 'Active Revisions', 'queries' => array(array('query' => DifferentialRevisionListData::QUERY_NEED_ACTION_FROM_SELF, 'header' => 'Action Required', 'nodata' => 'You have no revisions requiring action.'), array('query' => DifferentialRevisionListData::QUERY_NEED_ACTION_FROM_OTHERS, 'header' => 'Waiting on Others', 'nodata' => 'You have no revisions waiting on others'))), 'open' => array('name' => 'Open Revisions', 'queries' => array(array('query' => DifferentialRevisionListData::QUERY_OPEN_OWNED, 'header' => 'Your Open Revisions'))), 'reviews' => array('name' => 'Open Reviews', 'queries' => array(array('query' => DifferentialRevisionListData::QUERY_OPEN_REVIEWER, 'header' => 'Your Open Reviews'))), 'all' => array('name' => 'All Revisions', 'queries' => array(array('query' => DifferentialRevisionListData::QUERY_OWNED, 'header' => 'Your Revisions'))), 'related' => array('name' => 'All Revisions and Reviews', 'queries' => array(array('query' => DifferentialRevisionListData::QUERY_OWNED_OR_REVIEWER, 'header' => 'Your Revisions and Reviews'))), 'updates' => array('name' => 'Updates', 'queries' => array(array('query' => DifferentialRevisionListData::QUERY_UPDATED_SINCE, 'header' => 'Diffs that have been updated since you\'ve last viewed them'))), '<hr />', 'All Revisions', 'allopen' => array('name' => 'Open', 'nofilter' => true, 'queries' => array(array('query' => DifferentialRevisionListData::QUERY_ALL_OPEN, 'header' => 'All Open Revisions'))));
     if (empty($filters[$this->filter])) {
         $this->filter = 'active';
     }
     $view_phid = nonempty($request->getStr('phid'), $user->getPHID());
     $queries = array();
     $filter = $filters[$this->filter];
     foreach ($filter['queries'] as $query) {
         $query_object = new DifferentialRevisionListData($query['query'], array($view_phid));
         $queries[] = array('object' => $query_object) + $query;
     }
     $side_nav = new AphrontSideNavView();
     $query = null;
     if ($view_phid) {
         $query = '?phid=' . $view_phid;
     }
     foreach ($filters as $filter_name => $filter_desc) {
         if (is_int($filter_name)) {
             $side_nav->addNavItem(phutil_render_tag('span', array(), $filter_desc));
             continue;
         }
         $selected = $filter_name == $this->filter;
         $side_nav->addNavItem(phutil_render_tag('a', array('href' => '/differential/filter/' . $filter_name . '/' . $query, 'class' => $selected ? 'aphront-side-nav-selected' : null), phutil_escape_html($filter_desc['name'])));
     }
     $phids = array();
     $phids[$view_phid] = true;
     $rev_ids = array();
     foreach ($queries as $key => $query) {
         $revisions = $query['object']->loadRevisions();
         foreach ($revisions as $revision) {
             $phids[$revision->getAuthorPHID()] = true;
             $rev_ids[$revision->getID()] = true;
         }
         $queries[$key]['revisions'] = $revisions;
     }
     $rev = new DifferentialRevision();
     if ($rev_ids) {
         $rev_ids = array_keys($rev_ids);
         $reviewers = queryfx_all($rev->establishConnection('r'), 'SELECT revisionID, objectPHID FROM %T revision JOIN %T relationship
       ON revision.id = relationship.revisionID
       WHERE revision.id IN (%Ld)
         AND relationship.relation = %s
       ORDER BY sequence', $rev->getTableName(), DifferentialRevision::RELATIONSHIP_TABLE, $rev_ids, DifferentialRevision::RELATION_REVIEWER);
         $reviewer_map = array();
         foreach ($reviewers as $reviewer) {
             $reviewer_map[$reviewer['revisionID']][] = $reviewer['objectPHID'];
         }
         foreach ($reviewer_map as $revision_id => $reviewer_ids) {
             $phids[reset($reviewer_ids)] = true;
         }
     } else {
         $reviewer_map = array();
     }
     if ($phids) {
         $phids = array_keys($phids);
         $handles = id(new PhabricatorObjectHandleData($phids))->loadHandles();
     } else {
         $handles = array();
     }
     if (empty($filters[$this->filter]['nofilter'])) {
         $filter_form = id(new AphrontFormView())->setUser($user)->appendChild(id(new AphrontFormTokenizerControl())->setDatasource('/typeahead/common/users/')->setLabel('View User')->setName('view_user')->setValue(array($view_phid => $handles[$view_phid]->getFullName()))->setLimit(1));
         $filter_view = new AphrontListFilterView();
         $filter_view->appendChild($filter_form);
         $side_nav->appendChild($filter_view);
     }
     foreach ($queries as $query) {
         $table = $this->renderRevisionTable($query['revisions'], $query['header'], idx($query, 'nodata'), $handles, $reviewer_map);
         $side_nav->appendChild($table);
     }
     return $this->buildStandardPageResponse($side_nav, array('title' => 'Differential Home', 'tab' => 'revisions'));
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $uri = $request->getRequestURI();
     if ($request->isFormPost()) {
         // Redirect to GET so URIs can be copy/pasted.
         $user_phids = $request->getArr('set_users');
         $proj_phids = $request->getArr('set_projects');
         $user_phids = implode(',', $user_phids);
         $proj_phids = implode(',', $proj_phids);
         $user_phids = nonempty($user_phids, null);
         $proj_phids = nonempty($proj_phids, null);
         $uri = $request->getRequestURI()->alter('users', $user_phids)->alter('projects', $proj_phids);
         return id(new AphrontRedirectResponse())->setURI($uri);
     }
     $views = array('User Tasks', 'action' => 'Assigned', 'created' => 'Created', 'subscribed' => 'Subscribed', 'triage' => 'Need Triage', '<hr />', 'All Tasks', 'alltriage' => 'Need Triage', 'all' => 'All Tasks');
     if (empty($views[$this->view])) {
         $this->view = 'action';
     }
     $has_filter = array('action' => true, 'created' => true, 'subscribed' => true, 'triage' => true);
     $nav = new AphrontSideNavView();
     foreach ($views as $view => $name) {
         if (is_integer($view)) {
             $nav->addNavItem(phutil_render_tag('span', array(), $name));
         } else {
             $uri->setPath('/maniphest/view/' . $view . '/');
             $nav->addNavItem(phutil_render_tag('a', array('href' => $uri->alter('page', null), 'class' => $this->view == $view ? 'aphront-side-nav-selected' : null), phutil_escape_html($name)));
         }
     }
     list($status_map, $status_links) = $this->renderStatusLinks();
     list($grouping, $group_links) = $this->renderGroupLinks();
     list($order, $order_links) = $this->renderOrderLinks();
     $user_phids = $request->getStr('users');
     if (strlen($user_phids)) {
         $user_phids = explode(',', $user_phids);
     } else {
         $user_phids = array($user->getPHID());
     }
     $project_phids = $request->getStr('projects');
     if (strlen($project_phids)) {
         $project_phids = explode(',', $project_phids);
     } else {
         $project_phids = array();
     }
     $page = $request->getInt('page');
     $page_size = self::DEFAULT_PAGE_SIZE;
     list($tasks, $handles, $total_count) = $this->loadTasks($user_phids, $project_phids, array('status' => $status_map, 'group' => $grouping, 'order' => $order, 'offset' => $page, 'limit' => $page_size));
     $form = id(new AphrontFormView())->setUser($user)->setAction($request->getRequestURI());
     if (isset($has_filter[$this->view])) {
         $tokens = array();
         foreach ($user_phids as $phid) {
             $tokens[$phid] = $handles[$phid]->getFullName();
         }
         $form->appendChild(id(new AphrontFormTokenizerControl())->setDatasource('/typeahead/common/searchowner/')->setName('set_users')->setLabel('Users')->setValue($tokens));
     }
     $tokens = array();
     foreach ($project_phids as $phid) {
         $tokens[$phid] = $handles[$phid]->getFullName();
     }
     $form->appendChild(id(new AphrontFormTokenizerControl())->setDatasource('/typeahead/common/projects/')->setName('set_projects')->setLabel('Projects')->setValue($tokens));
     $form->appendChild(id(new AphrontFormToggleButtonsControl())->setLabel('Status')->setValue($status_links))->appendChild(id(new AphrontFormToggleButtonsControl())->setLabel('Group')->setValue($group_links))->appendChild(id(new AphrontFormToggleButtonsControl())->setLabel('Order')->setValue($order_links));
     $form->appendChild(id(new AphrontFormSubmitControl())->setValue('Filter Tasks'));
     $create_uri = new PhutilURI('/maniphest/task/create/');
     if ($project_phids) {
         // If we have project filters selected, use them as defaults for task
         // creation.
         $create_uri->setQueryParam('projects', implode(';', $project_phids));
     }
     $filter = new AphrontListFilterView();
     $filter->addButton(phutil_render_tag('a', array('href' => (string) $create_uri, 'class' => 'green button'), 'Create New Task'));
     $filter->appendChild($form);
     $nav->appendChild($filter);
     $have_tasks = false;
     foreach ($tasks as $group => $list) {
         if (count($list)) {
             $have_tasks = true;
             break;
         }
     }
     require_celerity_resource('maniphest-task-summary-css');
     if (!$have_tasks) {
         $nav->appendChild('<h1 class="maniphest-task-group-header">' . 'No matching tasks.' . '</h1>');
     } else {
         $pager = new AphrontPagerView();
         $pager->setURI($request->getRequestURI(), 'page');
         $pager->setPageSize($page_size);
         $pager->setOffset($page);
         $pager->setCount($total_count);
         $cur = $pager->getOffset() + 1;
         $max = min($pager->getOffset() + $page_size, $total_count);
         $tot = $total_count;
         $cur = number_format($cur);
         $max = number_format($max);
         $tot = number_format($tot);
         $nav->appendChild('<div class="maniphest-total-result-count">' . "Displaying tasks {$cur} - {$max} of {$tot}." . '</div>');
         foreach ($tasks as $group => $list) {
             $task_list = new ManiphestTaskListView();
             $task_list->setUser($user);
             $task_list->setTasks($list);
             $task_list->setHandles($handles);
             $count = number_format(count($list));
             $nav->appendChild('<h1 class="maniphest-task-group-header">' . phutil_escape_html($group) . ' (' . $count . ')' . '</h1>');
             $nav->appendChild($task_list);
         }
         $nav->appendChild($pager);
     }
     return $this->buildStandardPageResponse($nav, array('title' => 'Task List'));
 }
 private function buildSideNav()
 {
     $nav = new AphrontSideNavView();
     $items = array();
     $filters = $this->getFilterMap();
     foreach ($filters as $key => $name) {
         $nav->addNavItem(phutil_render_tag('a', array('href' => '/herald/transcript/' . $this->id . '/' . $key . '/', 'class' => $key == $this->filter ? 'aphront-side-nav-selected' : null), phutil_escape_html($name)));
     }
     return $nav;
 }
 public function render()
 {
     if ($this->items) {
         if (!$this->baseURI) {
             throw new Exception("Call setBaseURI() before render()!");
         }
         if ($this->selectedFilter === false) {
             throw new Exception("Call selectFilter() before render()!");
         }
     }
     $view = new AphrontSideNavView();
     $view->setFlexNav($this->flexNav);
     $view->setFlexible($this->flexible);
     $view->setShowApplicationMenu($this->showApplicationMenu);
     $view->setActive($this->active);
     if ($this->user) {
         $view->setUser($this->user);
     }
     if ($this->currentApplication) {
         $view->setCurrentApplication($this->currentApplication);
     }
     foreach ($this->items as $item) {
         list($type, $key, $name) = $item;
         switch ($type) {
             case 'custom':
                 $view->addNavItem($name);
                 break;
             case 'spacer':
                 $view->addNavItem('<br />');
                 break;
             case 'label':
                 $view->addNavItem(phutil_render_tag('span', array(), phutil_escape_html($name)));
                 break;
             case 'filter':
                 $class = $key == $this->selectedFilter ? 'aphront-side-nav-selected' : null;
                 $class = trim($class . ' ' . idx($item, 'class', ''));
                 if (empty($item['uri'])) {
                     $href = clone $this->baseURI;
                     $href->setPath($href->getPath() . $key . '/');
                     $href = (string) $href;
                 } else {
                     if (empty($item['relative'])) {
                         $href = $item['uri'];
                     } else {
                         $href = clone $this->baseURI;
                         $href->setPath($href->getPath() . $item['uri']);
                         $href = (string) $href;
                     }
                 }
                 $view->addNavItem(phutil_render_tag('a', array('href' => $href, 'class' => $class), phutil_escape_html($name)));
                 break;
             default:
                 throw new Exception("Unknown item type '{$type}'.");
         }
     }
     $view->appendChild($this->renderChildren());
     return $view->render();
 }