public function renderExample()
 {
     $filter = new AphrontListFilterView();
     $form = new AphrontFormView();
     $form->setUser($this->getRequest()->getUser());
     $form->appendChild(id(new AphrontFormTextControl())->setLabel(pht('Query')))->appendChild(id(new AphrontFormSubmitControl())->setValue(pht('Search')));
     $filter->appendChild($form);
     return $filter;
 }
 public function renderExample()
 {
     $filter = new AphrontListFilterView();
     $filter->addButton(phutil_render_tag('a', array('href' => '#', 'class' => 'button green'), 'Create New Thing'));
     $form = new AphrontFormView();
     $form->setUser($this->getRequest()->getUser());
     $form->appendChild(id(new AphrontFormTextControl())->setLabel('Query'))->appendChild(id(new AphrontFormSubmitControl())->setValue('Search'));
     $filter->appendChild($form);
     return $filter;
 }
 public function renderReportFilters(array $tokens, $has_window, $request, $viewer)
 {
     $form = id(new AphrontFormView())->setUser($viewer)->appendControl(id(new AphrontFormTokenizerControl())->setDatasource(new PhabricatorProjectDatasource())->setLabel(pht('Project'))->setLimit(1)->setName('set_project')->setValue(mpull($tokens, 'getPHID')));
     if ($has_window) {
         list($window_str, , $window_error) = $this->getWindow($request);
         $form->appendChild(id(new AphrontFormDividerControl()));
     }
     $form->appendChild(id(new AphrontFormSubmitControl())->setValue(pht('Filter By Project')));
     $filter = new AphrontListFilterView();
     $filter->appendChild($form);
     return $filter;
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $macro_table = new PhabricatorFileImageMacro();
     if ($request->getStr('name') !== null) {
         $macros = $macro_table->loadAllWhere('name LIKE %~', $request->getStr('name'));
     } else {
         $pager = new AphrontPagerView();
         $pager->setOffset($request->getInt('page'));
         $macros = $macro_table->loadAllWhere('1 = 1 ORDER BY id DESC LIMIT %d, %d', $pager->getOffset(), $pager->getPageSize());
         // Get an exact count since the size here is reasonably going to be a few
         // thousand at most in any reasonable case.
         $count = queryfx_one($macro_table->establishConnection('r'), 'SELECT COUNT(*) N FROM %T', $macro_table->getTableName());
         $count = $count['N'];
         $pager->setCount($count);
         $pager->setURI($request->getRequestURI(), 'page');
     }
     $file_phids = mpull($macros, 'getFilePHID');
     $files = array();
     if ($file_phids) {
         $files = id(new PhabricatorFile())->loadAllWhere("phid IN (%Ls)", $file_phids);
         $author_phids = mpull($files, 'getAuthorPHID', 'getPHID');
         $handles = id(new PhabricatorObjectHandleData($author_phids))->loadHandles();
     }
     $files_map = mpull($files, null, 'getPHID');
     $rows = array();
     foreach ($macros as $macro) {
         $file_phid = $macro->getFilePHID();
         $file = idx($files_map, $file_phid);
         $author_link = isset($author_phids[$file_phid]) ? $handles[$author_phids[$file_phid]]->renderLink() : null;
         $rows[] = array(phutil_render_tag('a', array('href' => '/file/macro/edit/' . $macro->getID() . '/'), phutil_escape_html($macro->getName())), $author_link, phutil_render_tag('a', array('href' => $file ? $file->getBestURI() : null, 'target' => '_blank'), phutil_render_tag('img', array('src' => $file ? $file->getBestURI() : null))), javelin_render_tag('a', array('href' => '/file/macro/delete/' . $macro->getID() . '/', 'sigil' => 'workflow', 'class' => 'grey small button'), 'Delete'));
     }
     $table = new AphrontTableView($rows);
     $table->setHeaders(array('Name', 'Author', 'Image', ''));
     $table->setColumnClasses(array('pri', '', 'wide thumb', 'action'));
     $filter_form = id(new AphrontFormView())->setMethod('GET')->setAction('/file/macro/')->setUser($request->getUser())->appendChild(id(new AphrontFormTextControl())->setName('name')->setLabel('Name')->setValue($request->getStr('name')))->appendChild(id(new AphrontFormSubmitControl())->setValue('Filter Image Macros'));
     $filter_view = new AphrontListFilterView();
     $filter_view->appendChild($filter_form);
     $filter_view->addButton(phutil_render_tag('a', array('href' => '/file/macro/edit/', 'class' => 'green button'), 'New Image Macro'));
     $panel = new AphrontPanelView();
     $panel->appendChild($table);
     $panel->setHeader('Image Macros');
     if ($request->getStr('name') === null) {
         $panel->appendChild($pager);
     }
     $side_nav = new PhabricatorFileSideNavView();
     $side_nav->setSelectedFilter('all_macros');
     $side_nav->appendChild($filter_view);
     $side_nav->appendChild($panel);
     return $this->buildStandardPageResponse($side_nav, array('title' => 'Image Macros'));
 }
 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'));
 }
 protected function renderSearchForm($collapsed)
 {
     $drequest = $this->getDiffusionRequest();
     $forms = array();
     $form = id(new AphrontFormView())->setUser($this->getRequest()->getUser())->setMethod('GET');
     switch ($drequest->getRepository()->getVersionControlSystem()) {
         case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
             $forms[] = id(clone $form)->appendChild(pht('Search is not available in Subversion.'));
             break;
         default:
             $forms[] = id(clone $form)->appendChild(id(new AphrontFormTextWithSubmitControl())->setLabel(pht('File Name'))->setSubmitLabel(pht('Search File Names'))->setName('find')->setValue($this->getRequest()->getStr('find')));
             $forms[] = id(clone $form)->appendChild(id(new AphrontFormTextWithSubmitControl())->setLabel(pht('Pattern'))->setSubmitLabel(pht('Grep File Content'))->setName('grep')->setValue($this->getRequest()->getStr('grep')));
             break;
     }
     $filter = new AphrontListFilterView();
     $filter->appendChild($forms);
     if ($collapsed) {
         $filter->setCollapsed(pht('Show Search'), pht('Hide Search'), pht('Search for file names or content in this directory.'), '#');
     }
     return $filter;
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $filter_activity = $request->getStr('activity');
     $filter_ip = $request->getStr('ip');
     $filter_session = $request->getStr('session');
     $filter_user = $request->getArr('user', array());
     $filter_actor = $request->getArr('actor', array());
     $user_value = array();
     $actor_value = array();
     $phids = array_merge($filter_user, $filter_actor);
     if ($phids) {
         $handles = $this->loadViewerHandles($phids);
         if ($filter_user) {
             $filter_user = reset($filter_user);
             $user_value = array($filter_user => $handles[$filter_user]->getFullName());
         }
         if ($filter_actor) {
             $filter_actor = reset($filter_actor);
             $actor_value = array($filter_actor => $handles[$filter_actor]->getFullName());
         }
     }
     $form = new AphrontFormView();
     $form->setUser($user)->appendChild(id(new AphrontFormTokenizerControl())->setLabel('Filter Actor')->setName('actor')->setLimit(1)->setValue($actor_value)->setDatasource('/typeahead/common/accounts/'))->appendChild(id(new AphrontFormTokenizerControl())->setLabel('Filter User')->setName('user')->setLimit(1)->setValue($user_value)->setDatasource('/typeahead/common/accounts/'))->appendChild(id(new AphrontFormSelectControl())->setLabel('Show Activity')->setName('activity')->setValue($filter_activity)->setOptions(array('' => 'All Activity', 'admin' => 'Admin Activity')))->appendChild(id(new AphrontFormTextControl())->setLabel('Filter IP')->setName('ip')->setValue($filter_ip)->setCaption('Enter an IP (or IP prefix) to show only activity by that remote ' . 'address.'))->appendChild(id(new AphrontFormTextControl())->setLabel('Filter Session')->setName('session')->setValue($filter_session))->appendChild(id(new AphrontFormSubmitControl())->setValue('Filter Logs'));
     $log_table = new PhabricatorUserLog();
     $conn_r = $log_table->establishConnection('r');
     $where_clause = array();
     $where_clause[] = '1 = 1';
     if ($filter_user) {
         $where_clause[] = qsprintf($conn_r, 'userPHID = %s', $filter_user);
     }
     if ($filter_actor) {
         $where_clause[] = qsprintf($conn_r, 'actorPHID = %s', $filter_actor);
     }
     if ($filter_activity == 'admin') {
         $where_clause[] = qsprintf($conn_r, 'action NOT IN (%Ls)', array(PhabricatorUserLog::ACTION_LOGIN, PhabricatorUserLog::ACTION_LOGOUT, PhabricatorUserLog::ACTION_LOGIN_FAILURE));
     }
     if ($filter_ip) {
         $where_clause[] = qsprintf($conn_r, 'remoteAddr LIKE %>', $filter_ip);
     }
     if ($filter_session) {
         $where_clause[] = qsprintf($conn_r, 'session = %s', $filter_session);
     }
     $where_clause = '(' . implode(') AND (', $where_clause) . ')';
     $pager = new AphrontPagerView();
     $pager->setURI($request->getRequestURI(), 'page');
     $pager->setOffset($request->getInt('page'));
     $pager->setPageSize(500);
     $logs = $log_table->loadAllWhere('(%Q) ORDER BY dateCreated DESC LIMIT %d, %d', $where_clause, $pager->getOffset(), $pager->getPageSize() + 1);
     $logs = $pager->sliceResults($logs);
     $phids = array();
     foreach ($logs as $log) {
         $phids[$log->getActorPHID()] = true;
         $phids[$log->getUserPHID()] = true;
     }
     $phids = array_keys($phids);
     $handles = $this->loadViewerHandles($phids);
     $rows = array();
     foreach ($logs as $log) {
         $rows[] = array(phabricator_date($log->getDateCreated(), $user), phabricator_time($log->getDateCreated(), $user), $log->getAction(), $log->getActorPHID() ? phutil_escape_html($handles[$log->getActorPHID()]->getName()) : null, phutil_escape_html($handles[$log->getUserPHID()]->getName()), json_encode($log->getOldValue(), true), json_encode($log->getNewValue(), true), phutil_render_tag('a', array('href' => $request->getRequestURI()->alter('ip', $log->getRemoteAddr())), phutil_escape_html($log->getRemoteAddr())), phutil_render_tag('a', array('href' => $request->getRequestURI()->alter('session', $log->getSession())), phutil_escape_html($log->getSession())));
     }
     $table = new AphrontTableView($rows);
     $table->setHeaders(array('Date', 'Time', 'Action', 'Actor', 'User', 'Old', 'New', 'IP', 'Session'));
     $table->setColumnClasses(array('', 'right', '', '', '', 'wrap', 'wrap', '', 'wide'));
     $panel = new AphrontPanelView();
     $panel->setHeader('Activity Logs');
     $panel->appendChild($table);
     $panel->appendChild($pager);
     $filter = new AphrontListFilterView();
     $filter->appendChild($form);
     $nav = $this->buildSideNavView();
     $nav->selectFilter('logs');
     $nav->appendChild(array($filter, $panel));
     return $this->buildApplicationPage($nav, array('title' => 'Activity Logs'));
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $viewer = $request->getUser();
     $macro_table = new PhabricatorFileImageMacro();
     $filter = $request->getStr('name');
     if (strlen($filter)) {
         $macros = $macro_table->loadAllWhere('name LIKE %~', $filter);
         $nodata = pht('There are no macros matching the filter "%s".', phutil_escape_html($filter));
     } else {
         $pager = new AphrontPagerView();
         $pager->setOffset($request->getInt('page'));
         $macros = $macro_table->loadAllWhere('1 = 1 ORDER BY id DESC LIMIT %d, %d', $pager->getOffset(), $pager->getPageSize());
         // Get an exact count since the size here is reasonably going to be a few
         // thousand at most in any reasonable case.
         $count = queryfx_one($macro_table->establishConnection('r'), 'SELECT COUNT(*) N FROM %T', $macro_table->getTableName());
         $count = $count['N'];
         $pager->setCount($count);
         $pager->setURI($request->getRequestURI(), 'page');
         $nodata = pht('There are no image macros yet.');
     }
     $file_phids = mpull($macros, 'getFilePHID');
     $files = array();
     if ($file_phids) {
         $files = id(new PhabricatorFile())->loadAllWhere("phid IN (%Ls)", $file_phids);
         $author_phids = mpull($files, 'getAuthorPHID', 'getPHID');
         $this->loadHandles($author_phids);
     }
     $files_map = mpull($files, null, 'getPHID');
     $filter_form = id(new AphrontFormView())->setMethod('GET')->setUser($request->getUser())->appendChild(id(new AphrontFormTextControl())->setName('name')->setLabel('Name')->setValue($filter))->appendChild(id(new AphrontFormSubmitControl())->setValue('Filter Image Macros'));
     $filter_view = new AphrontListFilterView();
     $filter_view->appendChild($filter_form);
     $nav = $this->buildSideNavView();
     $nav->selectFilter('/');
     $nav->appendChild($filter_view);
     if ($macros) {
         $pinboard = new PhabricatorPinboardView();
         foreach ($macros as $macro) {
             $file_phid = $macro->getFilePHID();
             $file = idx($files_map, $file_phid);
             $item = new PhabricatorPinboardItemView();
             if ($file) {
                 $item->setImageURI($file->getThumb220x165URI());
                 $item->setImageSize(220, 165);
                 if ($file->getAuthorPHID()) {
                     $author_handle = $this->getHandle($file->getAuthorPHID());
                     $item->appendChild('Created by ' . $author_handle->renderLink());
                 }
                 $datetime = phabricator_date($file->getDateCreated(), $viewer);
                 $item->appendChild(phutil_render_tag('div', array(), 'Created on ' . $datetime));
             }
             $item->setURI($this->getApplicationURI('/edit/' . $macro->getID() . '/'));
             $item->setHeader($macro->getName());
             $pinboard->addItem($item);
         }
         $nav->appendChild($pinboard);
     } else {
         $list = new PhabricatorObjectItemListView();
         $list->setNoDataString($nodata);
         $nav->appendChild($list);
     }
     if ($filter === null) {
         $nav->appendChild($pager);
     }
     return $this->buildApplicationPage($nav, array('device' => true, 'title' => 'Image Macros'));
 }
 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 renderReportFilters(array $tokens, $has_window)
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $form = id(new AphrontFormView())->setUser($user)->appendChild(id(new AphrontFormTokenizerControl())->setDatasource('/typeahead/common/searchproject/')->setLabel('Project')->setLimit(1)->setName('set_project')->setValue($tokens));
     if ($has_window) {
         list($window_str, $ignored, $window_error) = $this->getWindow();
         $form->appendChild(id(new AphrontFormTextControl())->setLabel('"Recently" Means')->setName('set_window')->setCaption('Configure the cutoff for the "Recently Closed" column.')->setValue($window_str)->setError($window_error));
     }
     $form->appendChild(id(new AphrontFormSubmitControl())->setValue('Filter By Project'));
     $filter = new AphrontListFilterView();
     $filter->appendChild($form);
     return $filter;
 }
 private function renderAuthorFilter($phid)
 {
     if ($phid) {
         $handle = PhabricatorObjectHandleData::loadOneHandle($phid);
         $tokens = array($phid => $handle->getFullName());
     } else {
         $tokens = array();
     }
     $form = id(new AphrontFormView())->setUser($this->getRequest()->getUser())->appendChild(id(new AphrontFormTokenizerControl())->setName('set_phid')->setValue($tokens)->setLimit(1)->setLabel('Filter Author')->setDataSource('/typeahead/common/accounts/'))->appendChild(id(new AphrontFormSubmitControl())->setValue('Apply Filter'));
     $filter = new AphrontListFilterView();
     $filter->appendChild($form);
     return $filter;
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $uri = clone $request->getRequestURI();
     $uri->setQueryParams(array());
     $pager = new AphrontCursorPagerView();
     $pager->setURI($uri);
     $pager->setPageSize(250);
     $query = id(new PhabricatorChatLogQuery())->setViewer($user)->withChannelIDs(array($this->channelID));
     $channel = id(new PhabricatorChatLogChannelQuery())->setViewer($user)->withIDs(array($this->channelID))->executeOne();
     if (!$channel) {
         return new Aphront404Response();
     }
     list($after, $before, $map) = $this->getPagingParameters($request, $query);
     $pager->setAfterID($after);
     $pager->setBeforeID($before);
     $logs = $query->executeWithCursorPager($pager);
     // Show chat logs oldest-first.
     $logs = array_reverse($logs);
     // Divide all the logs into blocks, where a block is the same author saying
     // several things in a row. A block ends when another user speaks, or when
     // two minutes pass without the author speaking.
     $blocks = array();
     $block = null;
     $last_author = null;
     $last_epoch = null;
     foreach ($logs as $log) {
         $this_author = $log->getAuthor();
         $this_epoch = $log->getEpoch();
         // Decide whether we should start a new block or not.
         $new_block = $this_author !== $last_author || $this_epoch - 60 * 2 > $last_epoch;
         if ($new_block) {
             if ($block) {
                 $blocks[] = $block;
             }
             $block = array('id' => $log->getID(), 'epoch' => $this_epoch, 'author' => $this_author, 'logs' => array($log));
         } else {
             $block['logs'][] = $log;
         }
         $last_author = $this_author;
         $last_epoch = $this_epoch;
     }
     if ($block) {
         $blocks[] = $block;
     }
     // Figure out CSS classes for the blocks. We alternate colors between
     // lines, and highlight the entire block which contains the target ID or
     // date, if applicable.
     foreach ($blocks as $key => $block) {
         $classes = array();
         if ($key % 2) {
             $classes[] = 'alternate';
         }
         $ids = mpull($block['logs'], 'getID', 'getID');
         if (array_intersect_key($ids, $map)) {
             $classes[] = 'highlight';
         }
         $blocks[$key]['class'] = $classes ? implode(' ', $classes) : null;
     }
     require_celerity_resource('phabricator-chatlog-css');
     $out = array();
     foreach ($blocks as $block) {
         $author = $block['author'];
         $author = id(new PhutilUTF8StringTruncator())->setMaximumGlyphs(18)->truncateString($author);
         $author = phutil_tag('td', array('class' => 'author'), $author);
         $href = $uri->alter('at', $block['id']);
         $timestamp = $block['epoch'];
         $timestamp = phabricator_datetime($timestamp, $user);
         $timestamp = phutil_tag('a', array('href' => $href, 'class' => 'timestamp'), $timestamp);
         $message = mpull($block['logs'], 'getMessage');
         $message = implode("\n", $message);
         $message = phutil_tag('td', array('class' => 'message'), array($timestamp, $message));
         $out[] = phutil_tag('tr', array('class' => $block['class']), array($author, $message));
     }
     $links = array();
     $first_uri = $pager->getFirstPageURI();
     if ($first_uri) {
         $links[] = phutil_tag('a', array('href' => $first_uri), "« " . pht('Newest'));
     }
     $prev_uri = $pager->getPrevPageURI();
     if ($prev_uri) {
         $links[] = phutil_tag('a', array('href' => $prev_uri), "‹ " . pht('Newer'));
     }
     $next_uri = $pager->getNextPageURI();
     if ($next_uri) {
         $links[] = phutil_tag('a', array('href' => $next_uri), pht('Older') . " ›");
     }
     $pager_top = phutil_tag('div', array('class' => 'phabricator-chat-log-pager-top'), $links);
     $pager_bottom = phutil_tag('div', array('class' => 'phabricator-chat-log-pager-bottom'), $links);
     $crumbs = $this->buildApplicationCrumbs()->addTextCrumb($channel->getChannelName(), $uri);
     $form = id(new AphrontFormView())->setUser($user)->setMethod('GET')->setAction($uri)->appendChild(id(new AphrontFormTextControl())->setLabel(pht('Date'))->setName('date')->setValue($request->getStr('date')))->appendChild(id(new AphrontFormSubmitControl())->setValue(pht('Jump')));
     $filter = new AphrontListFilterView();
     $filter->appendChild($form);
     $table = phutil_tag('table', array('class' => 'phabricator-chat-log'), $out);
     $log = phutil_tag('div', array('class' => 'phabricator-chat-log-panel'), $table);
     $jump_link = phutil_tag('a', array('href' => '#latest'), pht('Jump to Bottom') . " â–¾");
     $jump = phutil_tag('div', array('class' => 'phabricator-chat-log-jump'), $jump_link);
     $jump_target = phutil_tag('div', array('id' => 'latest'));
     $content = phutil_tag('div', array('class' => 'phabricator-chat-log-wrap'), array($jump, $pager_top, $log, $jump_target, $pager_bottom));
     return $this->buildApplicationPage(array($crumbs, $filter, $content), array('title' => pht('Channel Log')));
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $package = new PhabricatorOwnersPackage();
     $owner = new PhabricatorOwnersOwner();
     $path = new PhabricatorOwnersPath();
     $repository_phid = '';
     if ($request->getStr('repository') != '') {
         $repository_phid = id(new PhabricatorRepository())->loadOneWhere('callsign = %s', $request->getStr('repository'))->getPHID();
     }
     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 ($repository_phid || $request->getStr('path')) {
                 $join[] = qsprintf($conn_r, 'JOIN %T path ON path.packageID = p.id', $path->getTableName());
                 if ($repository_phid) {
                     $where[] = qsprintf($conn_r, 'path.repositoryPHID = %s', $repository_phid);
                 }
                 if ($request->getStr('path')) {
                     $where[] = qsprintf($conn_r, 'path.path LIKE %~ OR %s LIKE CONCAT(path.path, %s)', $request->getStr('path'), $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());
     }
     $callsigns = array('' => '(Any Repository)');
     $repositories = id(new PhabricatorRepository())->loadAllWhere('1 = 1 ORDER BY callsign');
     foreach ($repositories as $repository) {
         $callsigns[$repository->getCallsign()] = $repository->getCallsign() . ': ' . $repository->getName();
     }
     $form = id(new AphrontFormView())->setUser($user)->setAction('/owners/view/search/')->setMethod('GET')->appendChild(id(new AphrontFormTextControl())->setName('name')->setLabel('Name')->setValue($request->getStr('name')))->appendChild(id(new AphrontFormTokenizerControl())->setDatasource('/typeahead/common/usersorprojects/')->setLimit(1)->setName('owner')->setLabel('Owner')->setValue($owners_search_value))->appendChild(id(new AphrontFormSelectControl())->setName('repository')->setLabel('Repository')->setOptions($callsigns)->setValue($request->getStr('repository')))->appendChild(id(new AphrontFormTextControl())->setName('path')->setLabel('Path')->setValue($request->getStr('path')))->appendChild(id(new AphrontFormSubmitControl())->setValue('Search for Packages'));
     $filter->appendChild($form);
     return $this->buildStandardPageResponse(array($filter, $content), array('title' => 'Package Index'));
 }
 private function renderSearchView()
 {
     if ($this->packagePHID) {
         $loader = new PhabricatorObjectHandleData(array($this->packagePHID));
         $handles = $loader->loadHandles();
         $package_handle = $handles[$this->packagePHID];
         $view_packages = array($this->packagePHID => $package_handle->getFullName());
     } else {
         $view_packages = array();
     }
     $search_form = id(new AphrontFormView())->setUser($this->user)->appendChild(id(new AphrontFormTokenizerControl())->setDatasource('/typeahead/common/packages/')->setLabel('Package')->setName('search_packages')->setValue($view_packages)->setLimit(1));
     if ($this->view === 'audit') {
         $select_map = array('needaudit' => 'Needs Audit', 'accepted' => 'Accepted', 'all' => 'All');
         $select = id(new AphrontFormSelectControl())->setLabel('Audit Status')->setName('search_status')->setOptions($select_map)->setValue($this->auditStatus);
         $search_form->appendChild($select);
     }
     $search_form->appendChild(id(new AphrontFormSubmitControl())->setValue('Search'));
     $search_view = new AphrontListFilterView();
     $search_view->appendChild($search_form);
     return $search_view;
 }
 private function buildListFilters(PhabricatorObjectHandle $handle = null)
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $form = new AphrontFormView();
     $form->setUser($user);
     $show_status = false;
     $show_user = false;
     $show_project = false;
     $show_package = false;
     switch ($this->filter) {
         case 'audits':
         case 'commits':
             $show_status = true;
             break;
         case 'active':
             $show_user = true;
             break;
         case 'author':
         case 'user':
             $show_user = true;
             $show_status = true;
             break;
         case 'project':
             $show_project = true;
             $show_status = true;
             break;
         case 'package':
         case 'packagecommits':
             $show_package = true;
             $show_status = true;
             break;
     }
     if ($show_user || $show_project || $show_package) {
         if ($show_user) {
             $uri = '/typeahead/common/users/';
             $label = 'User';
         } else {
             if ($show_project) {
                 $uri = '/typeahead/common/projects/';
                 $label = 'Project';
             } else {
                 if ($show_package) {
                     $uri = '/typeahead/common/packages/';
                     $label = 'Package';
                 }
             }
         }
         $tok_value = null;
         if ($handle) {
             $tok_value = array($handle->getPHID() => $handle->getFullName());
         }
         $form->appendChild(id(new AphrontFormTokenizerControl())->setName('set_phid')->setLabel($label)->setLimit(1)->setDatasource($uri)->setValue($tok_value));
     }
     if ($show_status) {
         $form->appendChild(id(new AphrontFormToggleButtonsControl())->setName('status')->setLabel('Status')->setBaseURI($request->getRequestURI(), 'status')->setValue($this->filterStatus)->setButtons(array('all' => 'All', 'open' => 'Open')));
     }
     $form->appendChild(id(new AphrontFormSubmitControl())->setValue('Filter Audits'));
     $view = new AphrontListFilterView();
     $view->appendChild($form);
     return $view;
 }
 private function renderReportFilters(array $tokens, $has_window)
 {
     $request = $this->getRequest();
     $viewer = $request->getUser();
     $form = id(new AphrontFormView())->setUser($viewer)->appendControl(id(new AphrontFormTokenizerControl())->setDatasource(new PhabricatorProjectDatasource())->setLabel(pht('Project'))->setLimit(1)->setName('set_project')->setValue(mpull($tokens, 'getPHID')));
     if ($has_window) {
         list($window_str, $ignored, $window_error) = $this->getWindow();
         $form->appendChild(id(new AphrontFormTextControl())->setLabel(pht('Recently Means'))->setName('set_window')->setCaption(pht('Configure the cutoff for the "Recently Closed" column.'))->setValue($window_str)->setError($window_error));
     }
     $form->appendChild(id(new AphrontFormSubmitControl())->setValue(pht('Filter By Project')));
     $filter = new AphrontListFilterView();
     $filter->appendChild($form);
     return $filter;
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $package = new PhabricatorOwnersPackage();
     $owner = new PhabricatorOwnersOwner();
     $path = new PhabricatorOwnersPath();
     $repository_phid = '';
     if ($request->getStr('repository') != '') {
         $repository_phid = id(new PhabricatorRepositoryQuery())->setViewer($user)->withCallsigns(array($request->getStr('repository')))->executeOne()->getPHID();
     }
     switch ($this->view) {
         case 'search':
             $packages = array();
             $conn_r = $package->establishConnection('r');
             $where = array('1 = 1');
             $join = array();
             $having = '';
             if ($request->getStr('name')) {
                 $where[] = qsprintf($conn_r, 'p.name LIKE %~', $request->getStr('name'));
             }
             if ($repository_phid || $request->getStr('path')) {
                 $join[] = qsprintf($conn_r, 'JOIN %T path ON path.packageID = p.id', $path->getTableName());
                 if ($repository_phid) {
                     $where[] = qsprintf($conn_r, 'path.repositoryPHID = %s', $repository_phid);
                 }
                 if ($request->getStr('path')) {
                     $where[] = qsprintf($conn_r, '(path.path LIKE %~ AND NOT path.excluded) OR
             %s LIKE CONCAT(REPLACE(path.path, %s, %s), %s)', $request->getStr('path'), $request->getStr('path'), '_', '\\_', '%');
                     $having = 'HAVING MAX(path.excluded) = 0';
                 }
             }
             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 %Q', $package->getTableName(), implode(' ', $join), '(' . implode(') AND (', $where) . ')', $having);
             $packages = $package->loadAllFromArray($data);
             $header = pht('Search Results');
             $nodata = pht('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 = pht('Owned Packages');
             $nodata = pht('No owned packages');
             break;
         case 'projects':
             $projects = id(new PhabricatorProjectQuery())->setViewer($user)->withMemberPHIDs(array($user->getPHID()))->withStatus(PhabricatorProjectQuery::STATUS_ANY)->execute();
             $owner_phids = mpull($projects, 'getPHID');
             if ($owner_phids) {
                 $data = queryfx_all($package->establishConnection('r'), 'SELECT p.* FROM %T p JOIN %T o ON p.id = o.packageID
           WHERE o.userPHID IN (%Ls) GROUP BY p.id', $package->getTableName(), $owner->getTableName(), $owner_phids);
             } else {
                 $data = array();
             }
             $packages = $package->loadAllFromArray($data);
             $header = pht('Owned Packages');
             $nodata = pht('No owned packages');
             break;
         case 'all':
             $packages = $package->loadAll();
             $header = pht('All Packages');
             $nodata = pht('There are no defined packages.');
             break;
     }
     $content = $this->renderPackageTable($packages, $header, $nodata);
     $filter = new AphrontListFilterView();
     $owners_search_value = array();
     if ($request->getArr('owner')) {
         $phids = $request->getArr('owner');
         $phid = reset($phids);
         $handles = $this->loadViewerHandles(array($phid));
         $owners_search_value = array($handles[$phid]);
     }
     $callsigns = array('' => pht('(Any Repository)'));
     $repositories = id(new PhabricatorRepositoryQuery())->setViewer($user)->setOrder(PhabricatorRepositoryQuery::ORDER_CALLSIGN)->execute();
     foreach ($repositories as $repository) {
         $callsigns[$repository->getCallsign()] = $repository->getCallsign() . ': ' . $repository->getName();
     }
     $form = id(new AphrontFormView())->setUser($user)->setAction('/owners/view/search/')->setMethod('GET')->appendChild(id(new AphrontFormTextControl())->setName('name')->setLabel(pht('Name'))->setValue($request->getStr('name')))->appendChild(id(new AphrontFormTokenizerControl())->setDatasource(new PhabricatorProjectOrUserDatasource())->setLimit(1)->setName('owner')->setLabel(pht('Owner'))->setValue($owners_search_value))->appendChild(id(new AphrontFormSelectControl())->setName('repository')->setLabel(pht('Repository'))->setOptions($callsigns)->setValue($request->getStr('repository')))->appendChild(id(new AphrontFormTextControl())->setName('path')->setLabel(pht('Path'))->setValue($request->getStr('path')))->appendChild(id(new AphrontFormSubmitControl())->setValue(pht('Search for Packages')));
     $filter->appendChild($form);
     $nav = $this->buildSideNavView();
     $nav->appendChild($filter);
     $nav->appendChild($content);
     return $this->buildApplicationPage(array($nav), array('title' => pht('Package Index')));
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     if ($request->isFormPost()) {
         // Redirect to GET so URIs can be copy/pasted.
         $task_ids = $request->getStr('set_tasks');
         $task_ids = nonempty($task_ids, null);
         $search_text = $request->getStr('set_search');
         $search_text = nonempty($search_text, null);
         $min_priority = $request->getInt('set_lpriority');
         $min_priority = nonempty($min_priority, null);
         $max_priority = $request->getInt('set_hpriority');
         $max_priority = nonempty($max_priority, null);
         $uri = $request->getRequestURI()->alter('users', $this->getArrToStrList('set_users'))->alter('projects', $this->getArrToStrList('set_projects'))->alter('xprojects', $this->getArrToStrList('set_xprojects'))->alter('owners', $this->getArrToStrList('set_owners'))->alter('authors', $this->getArrToStrList('set_authors'))->alter('lpriority', $min_priority)->alter('hpriority', $max_priority)->alter('tasks', $task_ids)->alter('search', $search_text);
         return id(new AphrontRedirectResponse())->setURI($uri);
     }
     $nav = $this->buildBaseSideNav();
     $has_filter = array('action' => true, 'created' => true, 'subscribed' => true, 'triage' => true, 'projecttriage' => true, 'projectall' => true);
     $query = null;
     $key = $request->getStr('key');
     if (!$key && !$this->view) {
         if ($this->getDefaultQuery()) {
             $key = $this->getDefaultQuery()->getQueryKey();
         }
     }
     if ($key) {
         $query = id(new PhabricatorSearchQuery())->loadOneWhere('queryKey = %s', $key);
     }
     // If the user is running a saved query, load query parameters from that
     // query. Otherwise, build a new query object from the HTTP request.
     if ($query) {
         $nav->selectFilter('Q:' . $query->getQueryKey(), 'custom');
         $this->view = 'custom';
     } else {
         $this->view = $nav->selectFilter($this->view, 'action');
         $query = $this->buildQueryFromRequest();
     }
     // Execute the query.
     list($tasks, $handles, $total_count) = self::loadTasks($query);
     // Extract information we need to render the filters from the query.
     $search_text = $query->getParameter('fullTextSearch');
     $user_phids = $query->getParameter('userPHIDs', array());
     $task_ids = $query->getParameter('taskIDs', array());
     $owner_phids = $query->getParameter('ownerPHIDs', array());
     $author_phids = $query->getParameter('authorPHIDs', array());
     $project_phids = $query->getParameter('projectPHIDs', array());
     $exclude_project_phids = $query->getParameter('excludeProjectPHIDs', array());
     $low_priority = $query->getParameter('lowPriority');
     $high_priority = $query->getParameter('highPriority');
     $page_size = $query->getParameter('limit');
     $page = $query->getParameter('offset');
     $q_status = $query->getParameter('status');
     $q_group = $query->getParameter('group');
     $q_order = $query->getParameter('order');
     $form = id(new AphrontFormView())->setUser($user)->setAction($request->getRequestURI()->alter('key', null)->alter($this->getStatusRequestKey(), $this->getStatusRequestValue($q_status))->alter($this->getOrderRequestKey(), $this->getOrderRequestValue($q_order))->alter($this->getGroupRequestKey(), $this->getGroupRequestValue($q_group)));
     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));
     }
     if ($this->view == 'custom') {
         $form->appendChild(id(new AphrontFormTextControl())->setName('set_search')->setLabel('Search')->setValue($search_text));
         $form->appendChild(id(new AphrontFormTextControl())->setName('set_tasks')->setLabel('Task IDs')->setValue(join(',', $task_ids)));
         $tokens = array();
         foreach ($owner_phids as $phid) {
             $tokens[$phid] = $handles[$phid]->getFullName();
         }
         $form->appendChild(id(new AphrontFormTokenizerControl())->setDatasource('/typeahead/common/searchowner/')->setName('set_owners')->setLabel('Owners')->setValue($tokens));
         $tokens = array();
         foreach ($author_phids as $phid) {
             $tokens[$phid] = $handles[$phid]->getFullName();
         }
         $form->appendChild(id(new AphrontFormTokenizerControl())->setDatasource('/typeahead/common/users/')->setName('set_authors')->setLabel('Authors')->setValue($tokens));
     }
     $tokens = array();
     foreach ($project_phids as $phid) {
         $tokens[$phid] = $handles[$phid]->getFullName();
     }
     if ($this->view != 'projectall' && $this->view != 'projecttriage') {
         $form->appendChild(id(new AphrontFormTokenizerControl())->setDatasource('/typeahead/common/searchproject/')->setName('set_projects')->setLabel('Projects')->setValue($tokens));
     }
     if ($this->view == 'custom') {
         $tokens = array();
         foreach ($exclude_project_phids as $phid) {
             $tokens[$phid] = $handles[$phid]->getFullName();
         }
         $form->appendChild(id(new AphrontFormTokenizerControl())->setDatasource('/typeahead/common/projects/')->setName('set_xprojects')->setLabel('Exclude Projects')->setValue($tokens));
         $priority = ManiphestTaskPriority::getLowestPriority();
         if ($low_priority) {
             $priority = $low_priority;
         }
         $form->appendChild(id(new AphrontFormSelectControl())->setLabel('Min Priority')->setName('set_lpriority')->setValue($priority)->setOptions(array_reverse(ManiphestTaskPriority::getTaskPriorityMap(), true)));
         $priority = ManiphestTaskPriority::getHighestPriority();
         if ($high_priority) {
             $priority = $high_priority;
         }
         $form->appendChild(id(new AphrontFormSelectControl())->setLabel('Max Priority')->setName('set_hpriority')->setValue($priority)->setOptions(ManiphestTaskPriority::getTaskPriorityMap()));
     }
     $form->appendChild($this->renderStatusControl($q_status))->appendChild($this->renderGroupControl($q_group))->appendChild($this->renderOrderControl($q_order));
     $submit = id(new AphrontFormSubmitControl())->setValue('Filter Tasks');
     // Only show "Save..." for novel queries which have some kind of query
     // parameters set.
     if ($this->view === 'custom' && empty($key) && $request->getRequestURI()->getQueryParams()) {
         $submit->addCancelButton('/maniphest/custom/edit/?key=' . $query->getQueryKey(), 'Save Custom Query...');
     }
     $form->appendChild($submit);
     $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'));
     if (empty($key)) {
         $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');
     $list_container = new AphrontNullView();
     $list_container->appendChild('<div class="maniphest-list-container">');
     if (!$have_tasks) {
         $list_container->appendChild('<h1 class="maniphest-task-group-header">' . 'No matching tasks.' . '</h1>');
     } else {
         $pager = new AphrontPagerView();
         $pager->setURI($request->getRequestURI(), 'offset');
         $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);
         $list_container->appendChild('<div class="maniphest-total-result-count">' . "Displaying tasks {$cur} - {$max} of {$tot}." . '</div>');
         $selector = new AphrontNullView();
         $group = $query->getParameter('group');
         $order = $query->getParameter('order');
         $is_draggable = $group == 'priority' || $group == 'none' && $order == 'priority';
         $lists = new AphrontNullView();
         $lists->appendChild('<div class="maniphest-group-container">');
         foreach ($tasks as $group => $list) {
             $task_list = new ManiphestTaskListView();
             $task_list->setShowBatchControls(true);
             if ($is_draggable) {
                 $task_list->setShowSubpriorityControls(true);
             }
             $task_list->setUser($user);
             $task_list->setTasks($list);
             $task_list->setHandles($handles);
             $count = number_format(count($list));
             $lists->appendChild(javelin_render_tag('h1', array('class' => 'maniphest-task-group-header', 'sigil' => 'task-group', 'meta' => array('priority' => head($list)->getPriority())), phutil_escape_html($group) . ' (' . $count . ')'));
             $lists->appendChild($task_list);
         }
         $lists->appendChild('</div>');
         $selector->appendChild($lists);
         $selector->appendChild($this->renderBatchEditor($query));
         $form_id = celerity_generate_unique_node_id();
         $selector = phabricator_render_form($user, array('method' => 'POST', 'action' => '/maniphest/batch/', 'id' => $form_id), $selector->render());
         $list_container->appendChild($selector);
         $list_container->appendChild($pager);
         Javelin::initBehavior('maniphest-subpriority-editor', array('root' => $form_id, 'uri' => '/maniphest/subpriority/'));
     }
     $list_container->appendChild('</div>');
     $nav->appendChild($list_container);
     return $this->buildStandardPageResponse($nav, array('title' => 'Task List'));
 }
 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();
     if ($request->isFormPost()) {
         // Redirect to GET so URIs can be copy/pasted.
         $user_phids = $request->getArr('set_users');
         $proj_phids = $request->getArr('set_projects');
         $task_ids = $request->getStr('set_tasks');
         $user_phids = implode(',', $user_phids);
         $proj_phids = implode(',', $proj_phids);
         $user_phids = nonempty($user_phids, null);
         $proj_phids = nonempty($proj_phids, null);
         $task_ids = nonempty($task_ids, null);
         $uri = $request->getRequestURI()->alter('users', $user_phids)->alter('projects', $proj_phids)->alter('tasks', $task_ids);
         return id(new AphrontRedirectResponse())->setURI($uri);
     }
     $nav = new AphrontSideNavFilterView();
     $nav->setBaseURI(new PhutilURI('/maniphest/view/'));
     $nav->addLabel('User Tasks');
     $nav->addFilter('action', 'Assigned');
     $nav->addFilter('created', 'Created');
     $nav->addFilter('subscribed', 'Subscribed');
     $nav->addFilter('triage', 'Need Triage');
     $nav->addSpacer();
     $nav->addLabel('All Tasks');
     $nav->addFilter('alltriage', 'Need Triage');
     $nav->addFilter('all', 'All Tasks');
     $nav->addSpacer();
     $nav->addFilter('custom', 'Custom');
     $this->view = $nav->selectFilter($this->view, 'action');
     $has_filter = array('action' => true, 'created' => true, 'subscribed' => true, 'triage' => true);
     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();
     }
     $task_ids = $request->getStrList('tasks');
     $page = $request->getInt('page');
     $page_size = self::DEFAULT_PAGE_SIZE;
     list($tasks, $handles, $total_count) = $this->loadTasks($user_phids, $project_phids, $task_ids, 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));
     }
     if ($this->view == 'custom') {
         $form->appendChild(id(new AphrontFormTextControl())->setName('set_tasks')->setLabel('Task IDs')->setValue(join(',', $task_ids)));
     }
     $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'));
 }
 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'));
 }