diff --git a/resources/sql/autopatches/20150620.diviner.status.sql b/resources/sql/autopatches/20150620.diviner.status.sql new file mode 100644 --- /dev/null +++ b/resources/sql/autopatches/20150620.diviner.status.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_diviner.diviner_livebook + ADD COLUMN isArchived BOOL NOT NULL AFTER repositoryPHID; diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -648,6 +648,7 @@ 'DivinerAtomSearchIndexer' => 'applications/diviner/search/DivinerAtomSearchIndexer.php', 'DivinerAtomizeWorkflow' => 'applications/diviner/workflow/DivinerAtomizeWorkflow.php', 'DivinerAtomizer' => 'applications/diviner/atomizer/DivinerAtomizer.php', + 'DivinerBookArchiveController' => 'applications/diviner/controller/DivinerBookArchiveController.php', 'DivinerBookController' => 'applications/diviner/controller/DivinerBookController.php', 'DivinerBookDatasource' => 'applications/diviner/typeahead/DivinerBookDatasource.php', 'DivinerBookEditController' => 'applications/diviner/controller/DivinerBookEditController.php', @@ -2531,6 +2532,7 @@ 'PhabricatorSearchApplicationStorageEnginePanel' => 'applications/search/applicationpanel/PhabricatorSearchApplicationStorageEnginePanel.php', 'PhabricatorSearchAttachController' => 'applications/search/controller/PhabricatorSearchAttachController.php', 'PhabricatorSearchBaseController' => 'applications/search/controller/PhabricatorSearchBaseController.php', + 'PhabricatorSearchBooksField' => 'applications/diviner/search/field/PhabricatorSearchBooksField.php', 'PhabricatorSearchCheckboxesField' => 'applications/search/field/PhabricatorSearchCheckboxesField.php', 'PhabricatorSearchConfigOptions' => 'applications/search/config/PhabricatorSearchConfigOptions.php', 'PhabricatorSearchController' => 'applications/search/controller/PhabricatorSearchController.php', @@ -2562,6 +2564,7 @@ 'PhabricatorSearchPreferencesSettingsPanel' => 'applications/settings/panel/PhabricatorSearchPreferencesSettingsPanel.php', 'PhabricatorSearchProjectsField' => 'applications/search/field/PhabricatorSearchProjectsField.php', 'PhabricatorSearchRelationship' => 'applications/search/constants/PhabricatorSearchRelationship.php', + 'PhabricatorSearchRepositoryField' => 'applications/repository/search/field/PhabricatorSearchRepositoryField.php', 'PhabricatorSearchResultView' => 'applications/search/view/PhabricatorSearchResultView.php', 'PhabricatorSearchSelectController' => 'applications/search/controller/PhabricatorSearchSelectController.php', 'PhabricatorSearchSelectField' => 'applications/search/field/PhabricatorSearchSelectField.php', @@ -4016,6 +4019,7 @@ 'DivinerAtomSearchIndexer' => 'PhabricatorSearchDocumentIndexer', 'DivinerAtomizeWorkflow' => 'DivinerWorkflow', 'DivinerAtomizer' => 'Phobject', + 'DivinerBookArchiveController' => 'DivinerController', 'DivinerBookController' => 'DivinerController', 'DivinerBookDatasource' => 'PhabricatorTypeaheadDatasource', 'DivinerBookEditController' => 'DivinerController', @@ -6256,6 +6260,7 @@ 'PhabricatorSearchApplicationStorageEnginePanel' => 'PhabricatorApplicationConfigurationPanel', 'PhabricatorSearchAttachController' => 'PhabricatorSearchBaseController', 'PhabricatorSearchBaseController' => 'PhabricatorController', + 'PhabricatorSearchBooksField' => 'PhabricatorSearchTokenizerField', 'PhabricatorSearchCheckboxesField' => 'PhabricatorSearchField', 'PhabricatorSearchConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorSearchController' => 'PhabricatorSearchBaseController', @@ -6287,6 +6292,7 @@ 'PhabricatorSearchPreferencesSettingsPanel' => 'PhabricatorSettingsPanel', 'PhabricatorSearchProjectsField' => 'PhabricatorSearchTokenizerField', 'PhabricatorSearchRelationship' => 'Phobject', + 'PhabricatorSearchRepositoryField' => 'PhabricatorSearchTokenizerField', 'PhabricatorSearchResultView' => 'AphrontView', 'PhabricatorSearchSelectController' => 'PhabricatorSearchBaseController', 'PhabricatorSearchSelectField' => 'PhabricatorSearchField', diff --git a/src/applications/diviner/application/PhabricatorDivinerApplication.php b/src/applications/diviner/application/PhabricatorDivinerApplication.php --- a/src/applications/diviner/application/PhabricatorDivinerApplication.php +++ b/src/applications/diviner/application/PhabricatorDivinerApplication.php @@ -39,6 +39,7 @@ 'find/' => 'DivinerFindController', ), '/book/(?P[^/]+)/' => 'DivinerBookController', + '/book/(?P[^/]+)/archive/' => 'DivinerBookArchiveController', '/book/(?P[^/]+)/edit/' => 'DivinerBookEditController', '/book/'. '(?P[^/]+)/'. diff --git a/src/applications/diviner/controller/DivinerBookArchiveController.php b/src/applications/diviner/controller/DivinerBookArchiveController.php new file mode 100644 --- /dev/null +++ b/src/applications/diviner/controller/DivinerBookArchiveController.php @@ -0,0 +1,64 @@ +getViewer(); + + $book = id(new DivinerBookQuery()) + ->setViewer($viewer) + ->requireCapabilities( + array( + PhabricatorPolicyCapability::CAN_VIEW, + PhabricatorPolicyCapability::CAN_EDIT, + )) + ->withNames(array($request->getURIData('book'))) + ->executeOne(); + + if (!$book) { + return new Aphront404Response(); + } + + $view_uri = '/book/'.$book->getName().'/'; + + if ($request->isFormPost()) { + if ($book->getIsArchived()) { + $is_archived = false; + } else { + $is_archived = true; + } + + $xactions = array(); + + $xactions[] = id(new DivinerLiveBookTransaction()) + ->setTransactionType(DivinerLiveBookTransaction::TYPE_ARCHIVED) + ->setNewValue($is_archived); + + id(new DivinerLiveBookEditor()) + ->setActor($viewer) + ->setContentSourceFromRequest($request) + ->setContinueOnNoEffect(true) + ->setContinueOnMissingFields(true) + ->applyTransactions($book, $xactions); + + return id(new AphrontRedirectResponse())->setURI($view_uri); + } + + if ($book->getIsArchived()) { + $title = pht('Really activate book?'); + $body = pht('This book will become active again.'); + $button = pht('Activate Book'); + } else { + $title = pht('Really archive book?'); + $body = pht('This book will be moved to the archive.'); + $button = pht('Archive Book'); + } + + return $this->newDialog() + ->setTitle($title) + ->appendChild($body) + ->addCancelButton($view_uri) + ->addSubmitButton($button); + } + +} diff --git a/src/applications/diviner/controller/DivinerBookController.php b/src/applications/diviner/controller/DivinerBookController.php --- a/src/applications/diviner/controller/DivinerBookController.php +++ b/src/applications/diviner/controller/DivinerBookController.php @@ -53,6 +53,12 @@ ->setName($book->getRepository()->getMonogram())); } + if ($book->getIsArchived()) { + $header->setStatus('fa-ban', 'red', pht('Archived')); + } else { + $header->setStatus('fa-check', 'bluegrey', pht('Active')); + } + $document = new PHUIDocumentView(); $document->setHeader($header); $document->addClass('diviner-view'); @@ -136,6 +142,24 @@ ->setHref('/book/'.$book->getName().'/edit/') ->setDisabled(!$can_edit)); + if ($book->getIsArchived()) { + $action_view->addAction( + id(new PhabricatorActionView()) + ->setName(pht('Activate Book')) + ->setIcon('fa-check') + ->setHref('/book/'.$book->getName().'/archive/') + ->setDisabled(!$can_edit) + ->setWorkflow(true)); + } else { + $action_view->addAction( + id(new PhabricatorActionView()) + ->setName(pht('Archive Book')) + ->setIcon('fa-ban') + ->setHref('/book/'.$book->getName().'/archive/') + ->setDisabled(!$can_edit) + ->setWorkflow(true)); + } + return $action_view; } diff --git a/src/applications/diviner/controller/DivinerMainController.php b/src/applications/diviner/controller/DivinerMainController.php --- a/src/applications/diviner/controller/DivinerMainController.php +++ b/src/applications/diviner/controller/DivinerMainController.php @@ -11,6 +11,7 @@ $books = id(new DivinerBookQuery()) ->setViewer($viewer) + ->withIsArchived(false) ->execute(); $crumbs = $this->buildApplicationCrumbs(); diff --git a/src/applications/diviner/editor/DivinerLiveBookEditor.php b/src/applications/diviner/editor/DivinerLiveBookEditor.php --- a/src/applications/diviner/editor/DivinerLiveBookEditor.php +++ b/src/applications/diviner/editor/DivinerLiveBookEditor.php @@ -17,7 +17,61 @@ $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; + $types[] = DivinerLiveBookTransaction::TYPE_ARCHIVED; + return $types; } + protected function getCustomTransactionOldValue( + PhabricatorLiskDAO $object, + PhabricatorApplicationTransaction $xaction) { + + switch ($xaction->getTransactionType()) { + case DivinerLiveBookTransaction::TYPE_ARCHIVED: + return $object->getIsArchived(); + default: + return parent::getCustomTransactionOldValue($object, $xaction); + } + } + + protected function getCustomTransactionNewValue( + PhabricatorLiskDAO $object, + PhabricatorApplicationTransaction $xaction) { + + switch ($xaction->getTransactionType()) { + case DivinerLiveBookTransaction::TYPE_ARCHIVED: + return $xaction->getNewValue(); + default: + return parent::getCustomTransactionNewValue($object, $xaction); + } + } + + protected function applyCustomInternalTransaction( + PhabricatorLiskDAO $object, + PhabricatorApplicationTransaction $xaction) { + + switch ($xaction->getTransactionType()) { + case DivinerLiveBookTransaction::TYPE_ARCHIVED: + $object->setIsArchived((int)$xaction->getNewValue()); + return; + default: + return parent::applyCustomInternalTransaction($object, $xaction); + } + } + + protected function applyCustomExternalTransaction( + PhabricatorLiskDAO $object, + PhabricatorApplicationTransaction $xaction) { + + $old = $xaction->getOldValue(); + $new = $xaction->getNewValue(); + + switch ($xaction->getTransactionType()) { + case DivinerLiveBookTransaction::TYPE_ARCHIVED: + return; + default: + return parent::applyCustomExternalTransaction($object, $xaction); + } + } + } diff --git a/src/applications/diviner/query/DivinerAtomQuery.php b/src/applications/diviner/query/DivinerAtomQuery.php --- a/src/applications/diviner/query/DivinerAtomQuery.php +++ b/src/applications/diviner/query/DivinerAtomQuery.php @@ -122,18 +122,7 @@ } protected function loadPage() { - $table = new DivinerLiveSymbol(); - $conn_r = $table->establishConnection('r'); - - $data = queryfx_all( - $conn_r, - 'SELECT * FROM %T %Q %Q %Q', - $table->getTableName(), - $this->buildWhereClause($conn_r), - $this->buildOrderClause($conn_r), - $this->buildLimitClause($conn_r)); - - return $table->loadAllFromArray($data); + return $this->loadStandardPage(new DivinerLiveSymbol()); } protected function willFilterPage(array $atoms) { @@ -299,40 +288,40 @@ return $atoms; } - protected function buildWhereClause(AphrontDatabaseConnection $conn_r) { - $where = array(); + protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) { + $where = parent::buildWhereClauseParts($conn); if ($this->ids) { $where[] = qsprintf( - $conn_r, + $conn, 'id IN (%Ld)', $this->ids); } if ($this->phids) { $where[] = qsprintf( - $conn_r, + $conn, 'phid IN (%Ls)', $this->phids); } if ($this->bookPHIDs) { $where[] = qsprintf( - $conn_r, + $conn, 'bookPHID IN (%Ls)', $this->bookPHIDs); } if ($this->types) { $where[] = qsprintf( - $conn_r, + $conn, 'type IN (%Ls)', $this->types); } if ($this->names) { $where[] = qsprintf( - $conn_r, + $conn, 'name IN (%Ls)', $this->names); } @@ -347,7 +336,7 @@ } $where[] = qsprintf( - $conn_r, + $conn, 'titleSlugHash in (%Ls)', $hashes); } @@ -366,46 +355,46 @@ if ($contexts && $with_null) { $where[] = qsprintf( - $conn_r, + $conn, 'context IN (%Ls) OR context IS NULL', $contexts); } else if ($contexts) { $where[] = qsprintf( - $conn_r, + $conn, 'context IN (%Ls)', $contexts); } else if ($with_null) { $where[] = qsprintf( - $conn_r, + $conn, 'context IS NULL'); } } if ($this->indexes) { $where[] = qsprintf( - $conn_r, + $conn, 'atomIndex IN (%Ld)', $this->indexes); } if ($this->isDocumentable !== null) { $where[] = qsprintf( - $conn_r, + $conn, 'isDocumentable = %d', (int)$this->isDocumentable); } if ($this->isGhost !== null) { if ($this->isGhost) { - $where[] = qsprintf($conn_r, 'graphHash IS NULL'); + $where[] = qsprintf($conn, 'graphHash IS NULL'); } else { - $where[] = qsprintf($conn_r, 'graphHash IS NOT NULL'); + $where[] = qsprintf($conn, 'graphHash IS NOT NULL'); } } if ($this->nodeHashes) { $where[] = qsprintf( - $conn_r, + $conn, 'nodeHash IN (%Ls)', $this->nodeHashes); } @@ -415,21 +404,21 @@ // the column has binary collation. Eventually, this should move into // fulltext. $where[] = qsprintf( - $conn_r, + $conn, 'CONVERT(name USING utf8) LIKE %~', $this->nameContains); } if ($this->repositoryPHIDs) { $where[] = qsprintf( - $conn_r, + $conn, 'repositoryPHID IN (%Ls)', $this->repositoryPHIDs); } - $where[] = $this->buildPagingClause($conn_r); + $where[] = $this->buildPagingClause($conn); - return $this->formatWhereClause($where); + return $where; } /** diff --git a/src/applications/diviner/query/DivinerAtomSearchEngine.php b/src/applications/diviner/query/DivinerAtomSearchEngine.php --- a/src/applications/diviner/query/DivinerAtomSearchEngine.php +++ b/src/applications/diviner/query/DivinerAtomSearchEngine.php @@ -10,92 +10,52 @@ return 'PhabricatorDivinerApplication'; } - public function buildSavedQueryFromRequest(AphrontRequest $request) { - $saved = new PhabricatorSavedQuery(); - - $saved->setParameter( - 'bookPHIDs', - $this->readPHIDsFromRequest($request, 'bookPHIDs')); - $saved->setParameter( - 'repositoryPHIDs', - $this->readPHIDsFromRequest($request, 'repositoryPHIDs')); - $saved->setParameter('name', $request->getStr('name')); - $saved->setParameter( - 'types', - $this->readListFromRequest($request, 'types')); - - return $saved; + public function newResultObject() { + return new DivinerLiveAtom(); } - public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { + protected function buildCustomSearchFields() { + return array( + id(new PhabricatorSearchTextField()) + ->setKey('name') + ->setLabel(pht('Name Contains')), + id(new PhabricatorSearchCheckboxesField()) + ->setKey('types') + ->setLabel(pht('Types')) + ->setOptions(DivinerAtom::getAllTypes()), + id(new PhabricatorSearchBooksField()) + ->setKey('bookPHIDs') + ->setAliases(array('books')) + ->setLabel(pht('Books')), + id(new PhabricatorSearchRepositoryField()) + ->setKey('repositoryPHIDs') + ->setAliases(array('repositories')) + ->setLabel(pht('Repositories')), + ); + } + + protected function buildQueryFromParameters(array $map) { $query = id(new DivinerAtomQuery()); - $books = $saved->getParameter('bookPHIDs'); - if ($books) { - $query->withBookPHIDs($books); + if ($map['bookPHIDs']) { + $query->withBookPHIDs($map['bookPHIDs']); } - $repository_phids = $saved->getParameter('repositoryPHIDs'); - if ($repository_phids) { - $query->withRepositoryPHIDs($repository_phids); + if ($map['repositoryPHIDs']) { + $query->withRepositoryPHIDs($map['repositoryPHIDs']); } - $name = $saved->getParameter('name'); - if ($name) { - $query->withNameContains($name); + if ($map['name']) { + $query->withNameContains($map['name']); } - $types = $saved->getParameter('types'); - if ($types) { - $query->withTypes($types); + if ($map['types']) { + $query->withTypes($map['types']); } return $query; } - public function buildSearchForm( - AphrontFormView $form, - PhabricatorSavedQuery $saved) { - - $form->appendChild( - id(new AphrontFormTextControl()) - ->setLabel(pht('Name Contains')) - ->setName('name') - ->setValue($saved->getParameter('name'))); - - $all_types = array(); - foreach (DivinerAtom::getAllTypes() as $type) { - $all_types[$type] = DivinerAtom::getAtomTypeNameString($type); - } - asort($all_types); - - $types = $saved->getParameter('types', array()); - $types = array_fuse($types); - $type_control = id(new AphrontFormCheckboxControl()) - ->setLabel(pht('Types')); - foreach ($all_types as $type => $name) { - $type_control->addCheckbox( - 'types[]', - $type, - $name, - isset($types[$type])); - } - $form->appendChild($type_control); - - $form->appendControl( - id(new AphrontFormTokenizerControl()) - ->setDatasource(new DivinerBookDatasource()) - ->setName('bookPHIDs') - ->setLabel(pht('Books')) - ->setValue($saved->getParameter('bookPHIDs'))); - - $form->appendControl( - id(new AphrontFormTokenizerControl()) - ->setLabel(pht('Repositories')) - ->setName('repositoryPHIDs') - ->setDatasource(new DiffusionRepositoryDatasource()) - ->setValue($saved->getParameter('repositoryPHIDs'))); - } protected function getURI($path) { return '/diviner/'.$path; diff --git a/src/applications/diviner/query/DivinerBookQuery.php b/src/applications/diviner/query/DivinerBookQuery.php --- a/src/applications/diviner/query/DivinerBookQuery.php +++ b/src/applications/diviner/query/DivinerBookQuery.php @@ -8,6 +8,7 @@ private $nameLike; private $namePrefix; private $repositoryPHIDs; + private $isArchived; private $needProjectPHIDs; private $needRepositories; @@ -42,6 +43,11 @@ return $this; } + public function withIsArchived($is_archived) { + $this->isArchived = $is_archived; + return $this; + } + public function needProjectPHIDs($need_phids) { $this->needProjectPHIDs = $need_phids; return $this; @@ -53,18 +59,7 @@ } protected function loadPage() { - $table = new DivinerLiveBook(); - $conn_r = $table->establishConnection('r'); - - $data = queryfx_all( - $conn_r, - 'SELECT * FROM %T %Q %Q %Q', - $table->getTableName(), - $this->buildWhereClause($conn_r), - $this->buildOrderClause($conn_r), - $this->buildLimitClause($conn_r)); - - return $table->loadAllFromArray($data); + return $this->loadStandardPage(new DivinerLiveBook()); } protected function didFilterPage(array $books) { @@ -116,54 +111,61 @@ return $books; } - protected function buildWhereClause(AphrontDatabaseConnection $conn_r) { - $where = array(); + protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) { + $where = parent::buildWhereClauseParts($conn); if ($this->ids) { $where[] = qsprintf( - $conn_r, + $conn, 'id IN (%Ld)', $this->ids); } if ($this->phids) { $where[] = qsprintf( - $conn_r, + $conn, 'phid IN (%Ls)', $this->phids); } if (strlen($this->nameLike)) { $where[] = qsprintf( - $conn_r, + $conn, 'name LIKE %~', $this->nameLike); } if ($this->names !== null) { $where[] = qsprintf( - $conn_r, + $conn, 'name IN (%Ls)', $this->names); } if (strlen($this->namePrefix)) { $where[] = qsprintf( - $conn_r, + $conn, 'name LIKE %>', $this->namePrefix); } if ($this->repositoryPHIDs !== null) { $where[] = qsprintf( - $conn_r, + $conn, 'repositoryPHID IN (%Ls)', $this->repositoryPHIDs); } - $where[] = $this->buildPagingClause($conn_r); + if ($this->isArchived !== null) { + $where[] = qsprintf( + $conn, + 'isArchived = %d', + (int)$this->isArchived); + } + + $where[] = $this->buildPagingClause($conn); - return $this->formatWhereClause($where); + return $where; } public function getQueryApplicationClass() { diff --git a/src/applications/diviner/search/DivinerBookSearchIndexer.php b/src/applications/diviner/search/DivinerBookSearchIndexer.php --- a/src/applications/diviner/search/DivinerBookSearchIndexer.php +++ b/src/applications/diviner/search/DivinerBookSearchIndexer.php @@ -19,6 +19,14 @@ $book->getPreface()); $doc->addRelationship( + $book->isArchived() + ? PhabricatorSearchRelationship::RELATIONSHIP_CLOSED + : PhabricatorSearchRelationship::RELATIONSHIP_OPEN, + $book->getPHID(), + DivinerBookPHIDType::TYPECONST, + PhabricatorTime::getNow()); + + $doc->addRelationship( PhabricatorSearchRelationship::RELATIONSHIP_REPOSITORY, $book->getRepositoryPHID(), PhabricatorRepositoryRepositoryPHIDType::TYPECONST, diff --git a/src/applications/diviner/search/field/PhabricatorSearchBooksField.php b/src/applications/diviner/search/field/PhabricatorSearchBooksField.php new file mode 100644 --- /dev/null +++ b/src/applications/diviner/search/field/PhabricatorSearchBooksField.php @@ -0,0 +1,18 @@ +readPHIDsFromRequest($request, $key); + } + + protected function newDatasource() { + return new DivinerBookDatasource(); + } + +} diff --git a/src/applications/diviner/storage/DivinerLiveBook.php b/src/applications/diviner/storage/DivinerLiveBook.php --- a/src/applications/diviner/storage/DivinerLiveBook.php +++ b/src/applications/diviner/storage/DivinerLiveBook.php @@ -9,6 +9,7 @@ protected $name; protected $repositoryPHID; + protected $isArchived = false; protected $viewPolicy; protected $editPolicy; protected $configurationData = array(); @@ -25,6 +26,7 @@ self::CONFIG_COLUMN_SCHEMA => array( 'name' => 'text64', 'repositoryPHID' => 'phid?', + 'isArchived' => 'bool', ), self::CONFIG_KEY_SCHEMA => array( 'key_phid' => null, diff --git a/src/applications/diviner/storage/DivinerLiveBookTransaction.php b/src/applications/diviner/storage/DivinerLiveBookTransaction.php --- a/src/applications/diviner/storage/DivinerLiveBookTransaction.php +++ b/src/applications/diviner/storage/DivinerLiveBookTransaction.php @@ -3,6 +3,8 @@ final class DivinerLiveBookTransaction extends PhabricatorApplicationTransaction { + const TYPE_ARCHIVED = 'diviner:book:archived'; + public function getApplicationName() { return 'diviner'; } @@ -15,4 +17,86 @@ return null; } + public function getColor() { + $old = $this->getOldValue(); + $new = $this->getNewValue(); + + switch ($this->getTransactionType()) { + case self::TYPE_ARCHIVED: + if ($new) { + return 'red'; + } else { + return 'green'; + } + default: + return parent::getColor(); + } + } + + public function getIcon() { + $old = $this->getOldValue(); + $new = $this->getNewValue(); + + switch ($this->getTransactionType()) { + case self::TYPE_ARCHIVED: + if ($new) { + return 'fa-ban'; + } else { + return 'fa-check'; + } + default: + return parent::getIcon(); + } + } + + public function getTitle() { + $old = $this->getOldValue(); + $new = $this->getNewValue(); + $author_handle = $this->renderHandleLink($this->getAuthorPHID()); + + switch ($this->getTransactionType()) { + case self::TYPE_ARCHIVED: + if ($new) { + return pht( + '%s archived this book.', + $author_handle); + } else { + return pht( + '%s activated this book.', + $author_handle); + } + break; + + default: + return parent::getTitle(); + } + } + + public function getTitleForFeed() { + $author_phid = $this->getAuthorPHID(); + $object_phid = $this->getObjectPHID(); + $author_handle = $this->renderHandleLink($author_phid); + $object_handle = $this->renderHandleLink($object_phid); + + $old = $this->getOldValue(); + $new = $this->getNewValue(); + + switch ($this->getTransactionType()) { + case self::TYPE_ARCHIVED: + if ($new) { + return pht( + '%s archived %s.', + $author_handle, + $object_handle); + } else { + return pht( + '%s activated %s.', + $author_handle, + $object_handle); + } + default: + return parent::getTitleForFeed(); + } + } + } diff --git a/src/applications/repository/search/field/PhabricatorSearchRepositoryField.php b/src/applications/repository/search/field/PhabricatorSearchRepositoryField.php new file mode 100644 --- /dev/null +++ b/src/applications/repository/search/field/PhabricatorSearchRepositoryField.php @@ -0,0 +1,18 @@ +readPHIDsFromRequest($request, $key); + } + + protected function newDatasource() { + return new DiffusionRepositoryDatasource(); + } + +}