diff --git a/src/applications/audit/query/PhabricatorCommitSearchEngine.php b/src/applications/audit/query/PhabricatorCommitSearchEngine.php index af0194bc79..b0c5ec1d2c 100644 --- a/src/applications/audit/query/PhabricatorCommitSearchEngine.php +++ b/src/applications/audit/query/PhabricatorCommitSearchEngine.php @@ -1,181 +1,193 @@ needAuditRequests(true) ->needCommitData(true); } protected function buildQueryFromParameters(array $map) { $query = $this->newQuery(); if ($map['needsAuditByPHIDs']) { $query->withNeedsAuditByPHIDs($map['needsAuditByPHIDs']); } if ($map['auditorPHIDs']) { $query->withAuditorPHIDs($map['auditorPHIDs']); } if ($map['commitAuthorPHIDs']) { $query->withAuthorPHIDs($map['commitAuthorPHIDs']); } if ($map['auditStatus']) { $query->withAuditStatus($map['auditStatus']); } if ($map['repositoryPHIDs']) { $query->withRepositoryPHIDs($map['repositoryPHIDs']); } return $query; } protected function buildCustomSearchFields() { return array( id(new PhabricatorSearchDatasourceField()) ->setLabel(pht('Needs Audit By')) ->setKey('needsAuditByPHIDs') ->setAliases(array('needs', 'need')) ->setDatasource(new DiffusionAuditorFunctionDatasource()), id(new PhabricatorSearchDatasourceField()) ->setLabel(pht('Auditors')) ->setKey('auditorPHIDs') ->setAliases(array('auditor', 'auditors')) ->setDatasource(new DiffusionAuditorFunctionDatasource()), id(new PhabricatorUsersSearchField()) ->setLabel(pht('Authors')) ->setKey('commitAuthorPHIDs') ->setAliases(array('author', 'authors')), id(new PhabricatorSearchSelectField()) ->setLabel(pht('Audit Status')) ->setKey('auditStatus') ->setAliases(array('status')) ->setOptions($this->getAuditStatusOptions()), id(new PhabricatorSearchDatasourceField()) ->setLabel(pht('Repositories')) ->setKey('repositoryPHIDs') ->setAliases(array('repository', 'repositories')) ->setDatasource(new DiffusionRepositoryDatasource()), ); } protected function getURI($path) { return '/audit/'.$path; } protected function getBuiltinQueryNames() { $names = array(); if ($this->requireViewer()->isLoggedIn()) { $names['need'] = pht('Needs Audit'); $names['problem'] = pht('Problem Commits'); } $names['open'] = pht('Open Audits'); if ($this->requireViewer()->isLoggedIn()) { $names['authored'] = pht('Authored Commits'); } $names['all'] = pht('All Commits'); return $names; } public function buildSavedQueryFromBuiltin($query_key) { $query = $this->newSavedQuery(); $query->setQueryKey($query_key); $viewer = $this->requireViewer(); $viewer_phid = $viewer->getPHID(); $status_open = DiffusionCommitQuery::AUDIT_STATUS_OPEN; switch ($query_key) { case 'all': return $query; case 'open': $query->setParameter('auditStatus', $status_open); return $query; case 'need': $needs_tokens = array( $viewer_phid, 'projects('.$viewer_phid.')', 'packages('.$viewer_phid.')', ); $query->setParameter('needsAuditByPHIDs', $needs_tokens); $query->setParameter('auditStatus', $status_open); return $query; case 'authored': $query->setParameter('commitAuthorPHIDs', array($viewer->getPHID())); return $query; case 'problem': $query->setParameter('commitAuthorPHIDs', array($viewer->getPHID())); $query->setParameter( 'auditStatus', DiffusionCommitQuery::AUDIT_STATUS_CONCERN); return $query; } return parent::buildSavedQueryFromBuiltin($query_key); } private function getAuditStatusOptions() { return array( DiffusionCommitQuery::AUDIT_STATUS_ANY => pht('Any'), DiffusionCommitQuery::AUDIT_STATUS_OPEN => pht('Open'), DiffusionCommitQuery::AUDIT_STATUS_CONCERN => pht('Concern Raised'), DiffusionCommitQuery::AUDIT_STATUS_ACCEPTED => pht('Accepted'), DiffusionCommitQuery::AUDIT_STATUS_PARTIAL => pht('Partially Audited'), ); } protected function renderResultList( array $commits, PhabricatorSavedQuery $query, array $handles) { assert_instances_of($commits, 'PhabricatorRepositoryCommit'); $viewer = $this->requireViewer(); $nodata = pht('No matching audits.'); $view = id(new PhabricatorAuditListView()) ->setUser($viewer) ->setCommits($commits) ->setAuthorityPHIDs( PhabricatorAuditCommentEditor::loadAuditPHIDsForUser($viewer)) ->setNoDataString($nodata); $phids = $view->getRequiredHandlePHIDs(); if ($phids) { $handles = id(new PhabricatorHandleQuery()) ->setViewer($viewer) ->withPHIDs($phids) ->execute(); } else { $handles = array(); } $view->setHandles($handles); $list = $view->buildList(); $result = new PhabricatorApplicationSearchResultView(); $result->setContent($list); return $result; } + protected function getNewUserBody() { + + $view = id(new PHUIBigInfoView()) + ->setIcon('fa-check-circle-o') + ->setTitle(pht('Welcome to Audit')) + ->setDescription( + pht('Post-commit code review and auditing. Audits you are assigned '. + 'to will appear here.')); + + return $view; + } + } diff --git a/src/applications/differential/query/DifferentialRevisionSearchEngine.php b/src/applications/differential/query/DifferentialRevisionSearchEngine.php index fecc5c2213..e50cab1cb9 100644 --- a/src/applications/differential/query/DifferentialRevisionSearchEngine.php +++ b/src/applications/differential/query/DifferentialRevisionSearchEngine.php @@ -1,337 +1,357 @@ getQueryKey() == 'active') { return 0xFFFF; } return parent::getPageSize($saved); } public function buildSavedQueryFromRequest(AphrontRequest $request) { $saved = new PhabricatorSavedQuery(); $saved->setParameter( 'responsiblePHIDs', $this->readUsersFromRequest($request, 'responsibles')); $saved->setParameter( 'authorPHIDs', $this->readUsersFromRequest($request, 'authors')); $saved->setParameter( 'reviewerPHIDs', $this->readUsersFromRequest( $request, 'reviewers', array( PhabricatorProjectProjectPHIDType::TYPECONST, ))); $saved->setParameter( 'subscriberPHIDs', $this->readSubscribersFromRequest($request, 'subscribers')); $saved->setParameter( 'repositoryPHIDs', $request->getArr('repositories')); $saved->setParameter( 'projects', $this->readProjectsFromRequest($request, 'projects')); $saved->setParameter( 'draft', $request->getBool('draft')); $saved->setParameter( 'order', $request->getStr('order')); $saved->setParameter( 'status', $request->getStr('status')); return $saved; } public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { $query = id(new DifferentialRevisionQuery()) ->needFlags(true) ->needDrafts(true) ->needRelationships(true); $user_datasource = id(new PhabricatorPeopleUserFunctionDatasource()) ->setViewer($this->requireViewer()); $responsible_phids = $saved->getParameter('responsiblePHIDs', array()); $responsible_phids = $user_datasource->evaluateTokens($responsible_phids); if ($responsible_phids) { $query->withResponsibleUsers($responsible_phids); } $this->setQueryProjects($query, $saved); $author_phids = $saved->getParameter('authorPHIDs', array()); $author_phids = $user_datasource->evaluateTokens($author_phids); if ($author_phids) { $query->withAuthors($author_phids); } $reviewer_phids = $saved->getParameter('reviewerPHIDs', array()); if ($reviewer_phids) { $query->withReviewers($reviewer_phids); } $sub_datasource = id(new PhabricatorMetaMTAMailableFunctionDatasource()) ->setViewer($this->requireViewer()); $subscriber_phids = $saved->getParameter('subscriberPHIDs', array()); $subscriber_phids = $sub_datasource->evaluateTokens($subscriber_phids); if ($subscriber_phids) { $query->withCCs($subscriber_phids); } $repository_phids = $saved->getParameter('repositoryPHIDs', array()); if ($repository_phids) { $query->withRepositoryPHIDs($repository_phids); } $draft = $saved->getParameter('draft', false); if ($draft && $this->requireViewer()->isLoggedIn()) { $query->withDraftRepliesByAuthors( array($this->requireViewer()->getPHID())); } $status = $saved->getParameter('status'); if (idx($this->getStatusOptions(), $status)) { $query->withStatus($status); } $order = $saved->getParameter('order'); if (idx($this->getOrderOptions(), $order)) { $query->setOrder($order); } else { $query->setOrder(DifferentialRevisionQuery::ORDER_CREATED); } return $query; } public function buildSearchForm( AphrontFormView $form, PhabricatorSavedQuery $saved) { $responsible_phids = $saved->getParameter('responsiblePHIDs', array()); $author_phids = $saved->getParameter('authorPHIDs', array()); $reviewer_phids = $saved->getParameter('reviewerPHIDs', array()); $subscriber_phids = $saved->getParameter('subscriberPHIDs', array()); $repository_phids = $saved->getParameter('repositoryPHIDs', array()); $only_draft = $saved->getParameter('draft', false); $projects = $saved->getParameter('projects', array()); $form ->appendControl( id(new AphrontFormTokenizerControl()) ->setLabel(pht('Responsible Users')) ->setName('responsibles') ->setDatasource(new PhabricatorPeopleUserFunctionDatasource()) ->setValue($responsible_phids)) ->appendControl( id(new AphrontFormTokenizerControl()) ->setLabel(pht('Authors')) ->setName('authors') ->setDatasource(new PhabricatorPeopleUserFunctionDatasource()) ->setValue($author_phids)) ->appendControl( id(new AphrontFormTokenizerControl()) ->setLabel(pht('Reviewers')) ->setName('reviewers') ->setDatasource(new PhabricatorProjectOrUserDatasource()) ->setValue($reviewer_phids)) ->appendControl( id(new AphrontFormTokenizerControl()) ->setLabel(pht('Subscribers')) ->setName('subscribers') ->setDatasource(new PhabricatorMetaMTAMailableFunctionDatasource()) ->setValue($subscriber_phids)) ->appendControl( id(new AphrontFormTokenizerControl()) ->setLabel(pht('Repositories')) ->setName('repositories') ->setDatasource(new DiffusionRepositoryDatasource()) ->setValue($repository_phids)) ->appendControl( id(new AphrontFormTokenizerControl()) ->setLabel(pht('Projects')) ->setName('projects') ->setDatasource(new PhabricatorProjectLogicalDatasource()) ->setValue($projects)) ->appendChild( id(new AphrontFormSelectControl()) ->setLabel(pht('Status')) ->setName('status') ->setOptions($this->getStatusOptions()) ->setValue($saved->getParameter('status'))); if ($this->requireViewer()->isLoggedIn()) { $form ->appendChild( id(new AphrontFormCheckboxControl()) ->addCheckbox( 'draft', 1, pht('Show only revisions with a draft comment.'), $only_draft)); } $form ->appendChild( id(new AphrontFormSelectControl()) ->setLabel(pht('Order')) ->setName('order') ->setOptions($this->getOrderOptions()) ->setValue($saved->getParameter('order'))); } protected function getURI($path) { return '/differential/'.$path; } protected function getBuiltinQueryNames() { $names = array(); if ($this->requireViewer()->isLoggedIn()) { $names['active'] = pht('Active Revisions'); $names['authored'] = pht('Authored'); } $names['all'] = pht('All Revisions'); return $names; } public function buildSavedQueryFromBuiltin($query_key) { $query = $this->newSavedQuery(); $query->setQueryKey($query_key); $viewer = $this->requireViewer(); switch ($query_key) { case 'active': return $query ->setParameter('responsiblePHIDs', array($viewer->getPHID())) ->setParameter('status', DifferentialRevisionQuery::STATUS_OPEN); case 'authored': return $query ->setParameter('authorPHIDs', array($viewer->getPHID())); case 'all': return $query; } return parent::buildSavedQueryFromBuiltin($query_key); } private function getStatusOptions() { return array( DifferentialRevisionQuery::STATUS_ANY => pht('All'), DifferentialRevisionQuery::STATUS_OPEN => pht('Open'), DifferentialRevisionQuery::STATUS_ACCEPTED => pht('Accepted'), DifferentialRevisionQuery::STATUS_NEEDS_REVIEW => pht('Needs Review'), DifferentialRevisionQuery::STATUS_NEEDS_REVISION => pht('Needs Revision'), DifferentialRevisionQuery::STATUS_CLOSED => pht('Closed'), DifferentialRevisionQuery::STATUS_ABANDONED => pht('Abandoned'), ); } private function getOrderOptions() { return array( DifferentialRevisionQuery::ORDER_CREATED => pht('Created'), DifferentialRevisionQuery::ORDER_MODIFIED => pht('Updated'), ); } protected function renderResultList( array $revisions, PhabricatorSavedQuery $query, array $handles) { assert_instances_of($revisions, 'DifferentialRevision'); $viewer = $this->requireViewer(); $template = id(new DifferentialRevisionListView()) ->setUser($viewer) ->setNoBox($this->isPanelContext()); $views = array(); if ($query->getQueryKey() == 'active') { $split = DifferentialRevisionQuery::splitResponsible( $revisions, $query->getParameter('responsiblePHIDs')); list($blocking, $active, $waiting) = $split; $views[] = id(clone $template) ->setHeader(pht('Blocking Others')) ->setNoDataString( pht('No revisions are blocked on your action.')) ->setHighlightAge(true) ->setRevisions($blocking) ->setHandles(array()); $views[] = id(clone $template) ->setHeader(pht('Action Required')) ->setNoDataString( pht('No revisions require your action.')) ->setHighlightAge(true) ->setRevisions($active) ->setHandles(array()); $views[] = id(clone $template) ->setHeader(pht('Waiting on Others')) ->setNoDataString( pht('You have no revisions waiting on others.')) ->setRevisions($waiting) ->setHandles(array()); } else { $views[] = id(clone $template) ->setRevisions($revisions) ->setHandles(array()); } $phids = array_mergev(mpull($views, 'getRequiredHandlePHIDs')); if ($phids) { $handles = id(new PhabricatorHandleQuery()) ->setViewer($viewer) ->withPHIDs($phids) ->execute(); } else { $handles = array(); } foreach ($views as $view) { $view->setHandles($handles); } if (count($views) == 1) { // Reduce this to a PHUIObjectItemListView so we can get the free // support from ApplicationSearch. $list = head($views)->render(); } else { $list = $views; } $result = new PhabricatorApplicationSearchResultView(); $result->setContent($list); return $result; } + protected function getNewUserBody() { + $create_button = id(new PHUIButtonView()) + ->setTag('a') + ->setText(pht('Create a Diff')) + ->setHref('/differential/diff/create/') + ->setColor(PHUIButtonView::GREEN); + + $icon = $this->getApplication()->getFontIcon(); + $app_name = $this->getApplication()->getName(); + $view = id(new PHUIBigInfoView()) + ->setIcon($icon) + ->setTitle(pht('Welcome to %s', $app_name)) + ->setDescription( + pht('Pre-commit code review. Revisions that are waiting on your input '. + 'will appear here.')) + ->addAction($create_button); + + return $view; + } + } diff --git a/src/applications/files/query/PhabricatorFileSearchEngine.php b/src/applications/files/query/PhabricatorFileSearchEngine.php index 70dfaba23f..31e03f02b9 100644 --- a/src/applications/files/query/PhabricatorFileSearchEngine.php +++ b/src/applications/files/query/PhabricatorFileSearchEngine.php @@ -1,181 +1,200 @@ setKey('authorPHIDs') ->setAliases(array('author', 'authors')) ->setLabel(pht('Authors')), id(new PhabricatorSearchThreeStateField()) ->setKey('explicit') ->setLabel(pht('Upload Source')) ->setOptions( pht('(Show All)'), pht('Show Only Manually Uploaded Files'), pht('Hide Manually Uploaded Files')), id(new PhabricatorSearchDateField()) ->setKey('createdStart') ->setLabel(pht('Created After')), id(new PhabricatorSearchDateField()) ->setKey('createdEnd') ->setLabel(pht('Created Before')), ); } protected function getDefaultFieldOrder() { return array( '...', 'createdStart', 'createdEnd', ); } protected function buildQueryFromParameters(array $map) { $query = $this->newQuery(); if ($map['authorPHIDs']) { $query->withAuthorPHIDs($map['authorPHIDs']); } if ($map['explicit'] !== null) { $query->showOnlyExplicitUploads($map['explicit']); } if ($map['createdStart']) { $query->withDateCreatedAfter($map['createdStart']); } if ($map['createdEnd']) { $query->withDateCreatedBefore($map['createdEnd']); } return $query; } protected function getURI($path) { return '/file/'.$path; } protected function getBuiltinQueryNames() { $names = array(); if ($this->requireViewer()->isLoggedIn()) { $names['authored'] = pht('Authored'); } $names += array( 'all' => pht('All'), ); return $names; } public function buildSavedQueryFromBuiltin($query_key) { $query = $this->newSavedQuery(); $query->setQueryKey($query_key); switch ($query_key) { case 'all': return $query; case 'authored': $author_phid = array($this->requireViewer()->getPHID()); return $query ->setParameter('authorPHIDs', $author_phid) ->setParameter('explicit', true); } return parent::buildSavedQueryFromBuiltin($query_key); } protected function getRequiredHandlePHIDsForResultList( array $files, PhabricatorSavedQuery $query) { return mpull($files, 'getAuthorPHID'); } protected function renderResultList( array $files, PhabricatorSavedQuery $query, array $handles) { assert_instances_of($files, 'PhabricatorFile'); $request = $this->getRequest(); if ($request) { $highlighted_ids = $request->getStrList('h'); } else { $highlighted_ids = array(); } $viewer = $this->requireViewer(); $highlighted_ids = array_fill_keys($highlighted_ids, true); $list_view = id(new PHUIObjectItemListView()) ->setUser($viewer); foreach ($files as $file) { $id = $file->getID(); $phid = $file->getPHID(); $name = $file->getName(); $file_uri = $this->getApplicationURI("/info/{$phid}/"); $date_created = phabricator_date($file->getDateCreated(), $viewer); $author_phid = $file->getAuthorPHID(); if ($author_phid) { $author_link = $handles[$author_phid]->renderLink(); $uploaded = pht('Uploaded by %s on %s', $author_link, $date_created); } else { $uploaded = pht('Uploaded on %s', $date_created); } $item = id(new PHUIObjectItemView()) ->setObject($file) ->setObjectName("F{$id}") ->setHeader($name) ->setHref($file_uri) ->addAttribute($uploaded) ->addIcon('none', phutil_format_bytes($file->getByteSize())); $ttl = $file->getTTL(); if ($ttl !== null) { $item->addIcon('blame', pht('Temporary')); } if ($file->getIsPartial()) { $item->addIcon('fa-exclamation-triangle orange', pht('Partial')); } if (isset($highlighted_ids[$id])) { $item->setEffect('highlighted'); } $list_view->addItem($item); } $list_view->appendChild(id(new PhabricatorGlobalUploadTargetView()) ->setUser($viewer)); $result = new PhabricatorApplicationSearchResultView(); $result->setContent($list_view); return $result; } + protected function getNewUserBody() { + $create_button = id(new PHUIButtonView()) + ->setTag('a') + ->setText(pht('Upload a File')) + ->setHref('/file/upload/') + ->setColor(PHUIButtonView::GREEN); + + $icon = $this->getApplication()->getFontIcon(); + $app_name = $this->getApplication()->getName(); + $view = id(new PHUIBigInfoView()) + ->setIcon($icon) + ->setTitle(pht('Welcome to %s', $app_name)) + ->setDescription( + pht('Just a place for files.')) + ->addAction($create_button); + + return $view; + } + } diff --git a/src/applications/legalpad/query/LegalpadDocumentSearchEngine.php b/src/applications/legalpad/query/LegalpadDocumentSearchEngine.php index 8beb7fa05c..2d94b23193 100644 --- a/src/applications/legalpad/query/LegalpadDocumentSearchEngine.php +++ b/src/applications/legalpad/query/LegalpadDocumentSearchEngine.php @@ -1,219 +1,239 @@ setParameter( 'creatorPHIDs', $this->readUsersFromRequest($request, 'creators')); $saved->setParameter( 'contributorPHIDs', $this->readUsersFromRequest($request, 'contributors')); $saved->setParameter( 'withViewerSignature', $request->getBool('withViewerSignature')); $saved->setParameter('createdStart', $request->getStr('createdStart')); $saved->setParameter('createdEnd', $request->getStr('createdEnd')); return $saved; } public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { $query = id(new LegalpadDocumentQuery()) ->needViewerSignatures(true); $creator_phids = $saved->getParameter('creatorPHIDs', array()); if ($creator_phids) { $query->withCreatorPHIDs($creator_phids); } $contributor_phids = $saved->getParameter('contributorPHIDs', array()); if ($contributor_phids) { $query->withContributorPHIDs($contributor_phids); } if ($saved->getParameter('withViewerSignature')) { $viewer_phid = $this->requireViewer()->getPHID(); if ($viewer_phid) { $query->withSignerPHIDs(array($viewer_phid)); } } $start = $this->parseDateTime($saved->getParameter('createdStart')); $end = $this->parseDateTime($saved->getParameter('createdEnd')); if ($start) { $query->withDateCreatedAfter($start); } if ($end) { $query->withDateCreatedBefore($end); } return $query; } public function buildSearchForm( AphrontFormView $form, PhabricatorSavedQuery $saved_query) { $creator_phids = $saved_query->getParameter('creatorPHIDs', array()); $contributor_phids = $saved_query->getParameter( 'contributorPHIDs', array()); $viewer_signature = $saved_query->getParameter('withViewerSignature'); if (!$this->requireViewer()->getPHID()) { $viewer_signature = false; } $form ->appendChild( id(new AphrontFormCheckboxControl()) ->addCheckbox( 'withViewerSignature', 1, pht('Show only documents I have signed.'), $viewer_signature) ->setDisabled(!$this->requireViewer()->getPHID())) ->appendControl( id(new AphrontFormTokenizerControl()) ->setDatasource(new PhabricatorPeopleDatasource()) ->setName('creators') ->setLabel(pht('Creators')) ->setValue($creator_phids)) ->appendControl( id(new AphrontFormTokenizerControl()) ->setDatasource(new PhabricatorPeopleDatasource()) ->setName('contributors') ->setLabel(pht('Contributors')) ->setValue($contributor_phids)); $this->buildDateRange( $form, $saved_query, 'createdStart', pht('Created After'), 'createdEnd', pht('Created Before')); } protected function getURI($path) { return '/legalpad/'.$path; } protected function getBuiltinQueryNames() { $names = array(); if ($this->requireViewer()->isLoggedIn()) { $names['signed'] = pht('Signed Documents'); } $names['all'] = pht('All Documents'); return $names; } public function buildSavedQueryFromBuiltin($query_key) { $query = $this->newSavedQuery(); $query->setQueryKey($query_key); switch ($query_key) { case 'signed': return $query ->setParameter('withViewerSignature', true); case 'all': return $query; } return parent::buildSavedQueryFromBuiltin($query_key); } protected function getRequiredHandlePHIDsForResultList( array $documents, PhabricatorSavedQuery $query) { return array(); } protected function renderResultList( array $documents, PhabricatorSavedQuery $query, array $handles) { assert_instances_of($documents, 'LegalpadDocument'); $viewer = $this->requireViewer(); $list = new PHUIObjectItemListView(); $list->setUser($viewer); foreach ($documents as $document) { $last_updated = phabricator_date($document->getDateModified(), $viewer); $title = $document->getTitle(); $item = id(new PHUIObjectItemView()) ->setObjectName($document->getMonogram()) ->setHeader($title) ->setHref('/'.$document->getMonogram()) ->setObject($document); $no_signatures = LegalpadDocument::SIGNATURE_TYPE_NONE; if ($document->getSignatureType() == $no_signatures) { $item->addIcon('none', pht('Not Signable')); } else { $type_name = $document->getSignatureTypeName(); $type_icon = $document->getSignatureTypeIcon(); $item->addIcon($type_icon, $type_name); if ($viewer->getPHID()) { $signature = $document->getUserSignature($viewer->getPHID()); } else { $signature = null; } if ($signature) { $item->addAttribute( array( id(new PHUIIconView())->setIconFont('fa-check-square-o', 'green'), ' ', pht( 'Signed on %s', phabricator_date($signature->getDateCreated(), $viewer)), )); } else { $item->addAttribute( array( id(new PHUIIconView())->setIconFont('fa-square-o', 'grey'), ' ', pht('Not Signed'), )); } } $item->addIcon( 'fa-pencil grey', pht('Version %d (%s)', $document->getVersions(), $last_updated)); $list->addItem($item); } $result = new PhabricatorApplicationSearchResultView(); $result->setObjectList($list); $result->setNoDataString(pht('No documents found.')); return $result; } + protected function getNewUserBody() { + $create_button = id(new PHUIButtonView()) + ->setTag('a') + ->setText(pht('Create a Document')) + ->setHref('/legalpad/create/') + ->setColor(PHUIButtonView::GREEN); + + $icon = $this->getApplication()->getFontIcon(); + $app_name = $this->getApplication()->getName(); + $view = id(new PHUIBigInfoView()) + ->setIcon($icon) + ->setTitle(pht('Welcome to %s', $app_name)) + ->setDescription( + pht('Create documents and track signatures. Can also be re-used in '. + 'other areas of Phabricator, like CLAs.')) + ->addAction($create_button); + + return $view; + } + } diff --git a/src/applications/owners/query/PhabricatorOwnersPackageSearchEngine.php b/src/applications/owners/query/PhabricatorOwnersPackageSearchEngine.php index ec84b6793f..8daf7313ff 100644 --- a/src/applications/owners/query/PhabricatorOwnersPackageSearchEngine.php +++ b/src/applications/owners/query/PhabricatorOwnersPackageSearchEngine.php @@ -1,149 +1,170 @@ setLabel(pht('Authority')) ->setKey('authorityPHIDs') ->setAliases(array('authority', 'authorities')) ->setConduitKey('owners') ->setDescription( pht('Search for packages with specific owners.')) ->setDatasource(new PhabricatorProjectOrUserDatasource()), id(new PhabricatorSearchDatasourceField()) ->setLabel(pht('Repositories')) ->setKey('repositoryPHIDs') ->setConduitKey('repositories') ->setAliases(array('repository', 'repositories')) ->setDescription( pht('Search for packages by included repositories.')) ->setDatasource(new DiffusionRepositoryDatasource()), id(new PhabricatorSearchStringListField()) ->setLabel(pht('Paths')) ->setKey('paths') ->setAliases(array('path')) ->setDescription( pht('Search for packages affecting specific paths.')), id(new PhabricatorSearchCheckboxesField()) ->setKey('statuses') ->setLabel(pht('Status')) ->setDescription( pht('Search for active or archived packages.')) ->setOptions( id(new PhabricatorOwnersPackage()) ->getStatusNameMap()), ); } protected function buildQueryFromParameters(array $map) { $query = $this->newQuery(); if ($map['authorityPHIDs']) { $query->withAuthorityPHIDs($map['authorityPHIDs']); } if ($map['repositoryPHIDs']) { $query->withRepositoryPHIDs($map['repositoryPHIDs']); } if ($map['paths']) { $query->withPaths($map['paths']); } if ($map['statuses']) { $query->withStatuses($map['statuses']); } return $query; } protected function getURI($path) { return '/owners/'.$path; } protected function getBuiltinQueryNames() { $names = array(); if ($this->requireViewer()->isLoggedIn()) { $names['authority'] = pht('Owned'); } $names += array( 'active' => pht('Active Packages'), 'all' => pht('All Packages'), ); return $names; } public function buildSavedQueryFromBuiltin($query_key) { $query = $this->newSavedQuery(); $query->setQueryKey($query_key); switch ($query_key) { case 'all': return $query; case 'active': return $query->setParameter( 'statuses', array( PhabricatorOwnersPackage::STATUS_ACTIVE, )); case 'authority': return $query->setParameter( 'authorityPHIDs', array($this->requireViewer()->getPHID())); } return parent::buildSavedQueryFromBuiltin($query_key); } protected function renderResultList( array $packages, PhabricatorSavedQuery $query, array $handles) { assert_instances_of($packages, 'PhabricatorOwnersPackage'); $viewer = $this->requireViewer(); $list = id(new PHUIObjectItemListView()) ->setUser($viewer); foreach ($packages as $package) { $id = $package->getID(); $item = id(new PHUIObjectItemView()) ->setObject($package) ->setObjectName(pht('Package %d', $id)) ->setHeader($package->getName()) ->setHref('/owners/package/'.$id.'/'); if ($package->isArchived()) { $item->setDisabled(true); } $list->addItem($item); } $result = new PhabricatorApplicationSearchResultView(); $result->setObjectList($list); $result->setNoDataString(pht('No packages found.')); return $result; } + + protected function getNewUserBody() { + $create_button = id(new PHUIButtonView()) + ->setTag('a') + ->setText(pht('Create a Package')) + ->setHref('/owners/edit/') + ->setColor(PHUIButtonView::GREEN); + + $icon = $this->getApplication()->getFontIcon(); + $app_name = $this->getApplication()->getName(); + $view = id(new PHUIBigInfoView()) + ->setIcon($icon) + ->setTitle(pht('Welcome to %s', $app_name)) + ->setDescription( + pht('Group sections of a codebase into packages for re-use in other '. + 'areas of Phabricator, like Herald rules.')) + ->addAction($create_button); + + return $view; + } + } diff --git a/src/applications/passphrase/query/PassphraseCredentialSearchEngine.php b/src/applications/passphrase/query/PassphraseCredentialSearchEngine.php index a8a80e3e6b..d6d34baef1 100644 --- a/src/applications/passphrase/query/PassphraseCredentialSearchEngine.php +++ b/src/applications/passphrase/query/PassphraseCredentialSearchEngine.php @@ -1,114 +1,134 @@ setLabel(pht('Status')) ->setKey('isDestroyed') ->setOptions( pht('Show All'), pht('Show Only Destroyed Credentials'), pht('Show Only Active Credentials')), id(new PhabricatorSearchTextField()) ->setLabel(pht('Name Contains')) ->setKey('name'), ); } protected function buildQueryFromParameters(array $map) { $query = $this->newQuery(); if ($map['isDestroyed'] !== null) { $query->withIsDestroyed($map['isDestroyed']); } if (strlen($map['name'])) { $query->withNameContains($map['name']); } return $query; } protected function getURI($path) { return '/passphrase/'.$path; } protected function getBuiltinQueryNames() { return array( 'active' => pht('Active Credentials'), 'all' => pht('All Credentials'), ); } public function buildSavedQueryFromBuiltin($query_key) { $query = $this->newSavedQuery(); $query->setQueryKey($query_key); switch ($query_key) { case 'all': return $query; case 'active': return $query->setParameter('isDestroyed', false); } return parent::buildSavedQueryFromBuiltin($query_key); } protected function renderResultList( array $credentials, PhabricatorSavedQuery $query, array $handles) { assert_instances_of($credentials, 'PassphraseCredential'); $viewer = $this->requireViewer(); $list = new PHUIObjectItemListView(); $list->setUser($viewer); foreach ($credentials as $credential) { $item = id(new PHUIObjectItemView()) ->setObjectName('K'.$credential->getID()) ->setHeader($credential->getName()) ->setHref('/K'.$credential->getID()) ->setObject($credential); $item->addAttribute( pht('Login: %s', $credential->getUsername())); if ($credential->getIsDestroyed()) { $item->addIcon('fa-ban', pht('Destroyed')); $item->setDisabled(true); } $type = PassphraseCredentialType::getTypeByConstant( $credential->getCredentialType()); if ($type) { $item->addIcon('fa-wrench', $type->getCredentialTypeName()); } $list->addItem($item); } $result = new PhabricatorApplicationSearchResultView(); $result->setObjectList($list); $result->setNoDataString(pht('No credentials found.')); return $result; } + protected function getNewUserBody() { + $create_button = id(new PHUIButtonView()) + ->setTag('a') + ->setText(pht('Create a Credential')) + ->setHref('/passphrase/create/') + ->setColor(PHUIButtonView::GREEN); + + $icon = $this->getApplication()->getFontIcon(); + $app_name = $this->getApplication()->getName(); + $view = id(new PHUIBigInfoView()) + ->setIcon($icon) + ->setTitle(pht('Welcome to %s', $app_name)) + ->setDescription( + pht('Credential management for re-use in other areas of Phabricator '. + 'or general storage of shared secrets.')) + ->addAction($create_button); + + return $view; + } + } diff --git a/src/applications/spaces/query/PhabricatorSpacesNamespaceSearchEngine.php b/src/applications/spaces/query/PhabricatorSpacesNamespaceSearchEngine.php index a4f1ed183b..4b469cca1b 100644 --- a/src/applications/spaces/query/PhabricatorSpacesNamespaceSearchEngine.php +++ b/src/applications/spaces/query/PhabricatorSpacesNamespaceSearchEngine.php @@ -1,101 +1,121 @@ setLabel(pht('Active')) ->setKey('active') ->setOptions( pht('(Show All)'), pht('Show Only Active Spaces'), pht('Hide Active Spaces')), ); } protected function buildQueryFromParameters(array $map) { $query = $this->newQuery(); if ($map['active']) { $query->withIsArchived(!$map['active']); } return $query; } protected function getURI($path) { return '/spaces/'.$path; } protected function getBuiltinQueryNames() { $names = array( 'active' => pht('Active Spaces'), 'all' => pht('All Spaces'), ); return $names; } public function buildSavedQueryFromBuiltin($query_key) { $query = $this->newSavedQuery(); $query->setQueryKey($query_key); switch ($query_key) { case 'active': return $query->setParameter('active', true); case 'all': return $query; } return parent::buildSavedQueryFromBuiltin($query_key); } protected function renderResultList( array $spaces, PhabricatorSavedQuery $query, array $handles) { assert_instances_of($spaces, 'PhabricatorSpacesNamespace'); $viewer = $this->requireViewer(); $list = new PHUIObjectItemListView(); $list->setUser($viewer); foreach ($spaces as $space) { $item = id(new PHUIObjectItemView()) ->setObjectName($space->getMonogram()) ->setHeader($space->getNamespaceName()) ->setHref('/'.$space->getMonogram()); if ($space->getIsDefaultNamespace()) { $item->addIcon('fa-certificate', pht('Default Space')); } if ($space->getIsArchived()) { $item->setDisabled(true); } $list->addItem($item); } $result = new PhabricatorApplicationSearchResultView(); $result->setObjectList($list); $result->setNoDataString(pht('No spaces found.')); return $result; } + protected function getNewUserBody() { + $create_button = id(new PHUIButtonView()) + ->setTag('a') + ->setText(pht('Create a Space')) + ->setHref('/spaces/create/') + ->setColor(PHUIButtonView::GREEN); + + $icon = $this->getApplication()->getFontIcon(); + $app_name = $this->getApplication()->getName(); + $view = id(new PHUIBigInfoView()) + ->setIcon($icon) + ->setTitle(pht('Welcome to %s', $app_name)) + ->setDescription( + pht('Policy namespaces to segment object visibility throughout your '. + 'instance.')) + ->addAction($create_button); + + return $view; + } + }