diff --git a/src/applications/phriction/controller/PhrictionListController.php b/src/applications/phriction/controller/PhrictionListController.php index d1e91ef6bf..5768b07e6f 100644 --- a/src/applications/phriction/controller/PhrictionListController.php +++ b/src/applications/phriction/controller/PhrictionListController.php @@ -8,6 +8,9 @@ final class PhrictionListController private $view; + private $documents; + private $handles; + public function willProcessRequest(array $data) { $this->view = idx($data, 'view'); } @@ -64,117 +67,154 @@ final class PhrictionListController throw new Exception("Unknown view '{$this->view}'!"); } - $documents = $query->executeWithCursorPager($pager); + $this->documents = $query->executeWithCursorPager($pager); + + $changeref_docs = array(); + if ($this->view == 'updates') { + // Loading some documents here since they may not appear in the query + // results. + $changeref_ids = array_filter(mpull( + mpull($this->documents, 'getContent'), 'getChangeRef')); + if ($changeref_ids) { + $changeref_docs = id(new PhrictionDocumentQuery()) + ->setViewer($user) + ->withIDs($changeref_ids) + ->execute(); + } + } $phids = array(); - foreach ($documents as $document) { + foreach ($this->documents as $document) { $phids[] = $document->getContent()->getAuthorPHID(); if ($document->hasProject()) { $phids[] = $document->getProject()->getPHID(); } } - $handles = $this->loadViewerHandles($phids); + $this->handles = $this->loadViewerHandles($phids); - $rows = array(); - foreach ($documents as $document) { - $project_link = 'None'; - if ($document->hasProject()) { - $project_phid = $document->getProject()->getPHID(); - $project_link = $handles[$project_phid]->renderLink(); - } + $list = new PhabricatorObjectItemListView(); - $content = $document->getContent(); - - $change_type = null; + foreach ($this->documents as $document) { if ($this->view == 'updates') { - $change_type = $content->getChangeType(); - switch ($content->getChangeType()) { - case PhrictionChangeType::CHANGE_DELETE: - case PhrictionChangeType::CHANGE_EDIT: - $change_type = PhrictionChangeType::getChangeTypeLabel( - $change_type); - break; - case PhrictionChangeType::CHANGE_MOVE_HERE: - case PhrictionChangeType::CHANGE_MOVE_AWAY: - $change_ref = $content->getChangeRef(); - $ref_doc = $documents[$change_ref]; - $ref_doc_slug = PhrictionDocument::getSlugURI( - $ref_doc->getSlug()); - $ref_doc_link = hsprintf('
%s', $ref_doc_slug, - phutil_utf8_shorten($ref_doc_slug, 15)); - - if ($change_type == PhrictionChangeType::CHANGE_MOVE_HERE) { - $change_type = pht('Moved from %s', $ref_doc_link); - } else { - $change_type = pht('Moved to %s', $ref_doc_link); - } - break; - default: - throw new Exception("Unknown change type!"); - break; - } + $list->addItem( + $this->buildItemForUpdates($document, $changeref_docs)); + } else { + $list->addItem( + $this->buildItemTheCasualWay($document)); } - - $rows[] = array( - $handles[$content->getAuthorPHID()]->renderLink(), - $change_type, - phutil_tag( - 'a', - array( - 'href' => PhrictionDocument::getSlugURI($document->getSlug()), - ), - $content->getTitle()), - $project_link, - phabricator_date($content->getDateCreated(), $user), - phabricator_time($content->getDateCreated(), $user), - ); } - $document_table = new AphrontTableView($rows); - $document_table->setHeaders( - array( - pht('Last Editor'), - pht('Change Type'), - pht('Title'), - pht('Project'), - pht('Last Update'), - pht('Time'), - )); - - $document_table->setColumnClasses( - array( - '', - '', - 'wide pri', - '', - 'right', - 'right', - )); - - $document_table->setColumnVisibility( - array( - true, - $this->view == 'updates', - true, - true, - true, - true, - )); - - $panel = new AphrontPanelView(); - $panel->setNoBackground(); - $panel->appendChild($document_table); - $panel->appendChild($pager); - - $nav->appendChild($panel); + $nav->appendChild($list); + $nav->appendChild($pager); return $this->buildApplicationPage( $nav, array( - 'title' => pht('Phriction Main'), + 'title' => pht('Document Index'), 'dust' => true, )); } + private function buildItemTheCasualWay(PhrictionDocument $document) { + $user = $this->getRequest()->getUser(); + + $project_link = null; + if ($document->hasProject()) { + $project_phid = $document->getProject()->getPHID(); + $project_link = $this->handles[$project_phid]->renderLink(); + } + + $content = $document->getContent(); + $author = $this->handles[$content->getAuthorPHID()]->renderLink(); + $title = $content->getTitle(); + + $slug = $document->getSlug(); + $slug_uri = PhrictionDocument::getSlugURI($slug); + $edit_uri = '/phriction/edit/' . $document->getID() . '/'; + $history_uri = PhrictionDocument::getSlugURI($slug, 'history'); + + $item = id(new PhabricatorObjectItemView()) + ->setHeader($title) + ->setHref($slug_uri) + ->addAttribute(pht('By %s', $author)) + ->addAttribute(pht('Updated: %s', + phabricator_datetime($content->getDateCreated(), $user))) + ->addAttribute($slug_uri); + + if ($project_link) { + $item->addAttribute(pht('Project %s', $project_link)); + } + + return $item; + } + + private function buildItemForUpdates(PhrictionDocument $document, + array $docs_from_refs) { + + $user = $this->getRequest()->getUser(); + + $content = $document->getContent(); + $version = $content->getVersion(); + $author = $this->handles[$content->getAuthorPHID()]->renderLink(); + $title = $content->getTitle(); + + $slug = $document->getSlug(); + $slug_uri = PhrictionDocument::getSlugURI($slug); + $document_link = hsprintf('%s', $slug_uri, $title); + + $change_type = $content->getChangeType(); + switch ($content->getChangeType()) { + case PhrictionChangeType::CHANGE_DELETE: + $change_type = pht('%s deleted %s', $author, $document_link); + $color = 'red'; + break; + case PhrictionChangeType::CHANGE_EDIT: + $change_type = pht('%s edited %s', $author, $document_link); + $color = 'blue'; + break; + case PhrictionChangeType::CHANGE_MOVE_HERE: + case PhrictionChangeType::CHANGE_MOVE_AWAY: + $change_ref = $content->getChangeRef(); + $ref_doc = $docs_from_refs[$change_ref]; + $ref_doc_slug = PhrictionDocument::getSlugURI( + $ref_doc->getSlug()); + $ref_doc_link = hsprintf('%1$s', $ref_doc_slug); + + if ($change_type == PhrictionChangeType::CHANGE_MOVE_HERE) { + $change_type = pht('%s moved %s from %s', $author, $document_link, + $ref_doc_link); + $color = 'yellow'; + } else { + $change_type = pht('%s moved %s to %s', $author, $document_link, + $ref_doc_link); + $color = 'orange'; + } + break; + default: + throw new Exception("Unknown change type!"); + break; + } + + $item = id(new PhabricatorObjectItemView()) + ->setHeader($change_type) + ->setBarColor($color) + ->addAttribute(phabricator_datetime($content->getDateCreated(), $user)) + ->addAttribute($slug_uri); + + if ($content->getDescription()) { + $item->addAttribute($content->getDescription()); + } + + if ($version > 1) { + $diff_uri = new PhutilURI('/phriction/diff/'.$document->getID().'/'); + $uri = $diff_uri->alter('l', $version - 1)->alter('r', $version); + $item->addIcon('history', pht('View Change'), $uri); + } else { + $item->addIcon('history', pht('No diff available')); + } + + return $item; + } + } diff --git a/src/applications/phriction/query/PhrictionDocumentQuery.php b/src/applications/phriction/query/PhrictionDocumentQuery.php index d918b3b84f..3cdd0e2abf 100644 --- a/src/applications/phriction/query/PhrictionDocumentQuery.php +++ b/src/applications/phriction/query/PhrictionDocumentQuery.php @@ -135,6 +135,7 @@ final class PhrictionDocumentQuery $conn, 'status NOT IN (%Ld)', array( + PhrictionDocumentStatus::STATUS_MOVED, PhrictionDocumentStatus::STATUS_STUB, )); break;