From 6bdbf3c8c204ac1491da151bf62c58abb684b7eb Mon Sep 17 00:00:00 2001 From: epriestley Date: Mon, 11 Jul 2011 15:42:12 -0700 Subject: [PATCH] Basic Phriction list view Summary: Pretty much ripped from D636, but somewhat simplified. Lists all the documents in the system. Test Plan: Looked at both of the views, seems to work correctly. Reviewed By: hsb Reviewers: hsb, codeblock, jungejason, tuomaspelkonen, aran CC: aran, hsb, epriestley Differential Revision: 645 --- src/__phutil_library_map__.php | 2 + ...AphrontDefaultApplicationConfiguration.php | 3 + .../list/PhrictionListController.php | 174 ++++++++++++++++++ .../phriction/controller/list/__init__.php | 24 +++ .../storage/document/PhrictionDocument.php | 14 ++ 5 files changed, 217 insertions(+) create mode 100644 src/applications/phriction/controller/list/PhrictionListController.php create mode 100644 src/applications/phriction/controller/list/__init__.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index b9c0057a34..28688674c8 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -586,6 +586,7 @@ phutil_register_library_map(array( 'PhrictionDocumentController' => 'applications/phriction/controller/document', 'PhrictionEditController' => 'applications/phriction/controller/edit', 'PhrictionHistoryController' => 'applications/phriction/controller/history', + 'PhrictionListController' => 'applications/phriction/controller/list', ), 'function' => array( @@ -1082,6 +1083,7 @@ phutil_register_library_map(array( 'PhrictionDocumentController' => 'PhrictionController', 'PhrictionEditController' => 'PhrictionController', 'PhrictionHistoryController' => 'PhrictionController', + 'PhrictionListController' => 'PhrictionController', ), 'requires_interface' => array( diff --git a/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php b/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php index 5acf39191b..c8bc226d3f 100644 --- a/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php +++ b/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php @@ -347,6 +347,9 @@ class AphrontDefaultApplicationConfiguration '/w/(?P.+/)$' => 'PhrictionDocumentController', '/phriction/' => array( + '$' => 'PhrictionListController', + 'list/(?P[^/]+)/$' => 'PhrictionListController', + 'history(?P/)$' => 'PhrictionHistoryController', 'history/(?P.+/)$' => 'PhrictionHistoryController', diff --git a/src/applications/phriction/controller/list/PhrictionListController.php b/src/applications/phriction/controller/list/PhrictionListController.php new file mode 100644 index 0000000000..b1c377469b --- /dev/null +++ b/src/applications/phriction/controller/list/PhrictionListController.php @@ -0,0 +1,174 @@ +view = idx($data, 'view'); + } + + public function processRequest() { + + $request = $this->getRequest(); + $user = $request->getUser(); + + $views = array( + 'all' => 'All Documents', + 'updates' => 'Recently Updated', + ); + + if (empty($views[$this->view])) { + $this->view = 'all'; + } + + $nav = new AphrontSideNavView(); + foreach ($views as $view => $name) { + $nav->addNavItem( + phutil_render_tag( + 'a', + array( + 'href' => '/phriction/list/'.$view.'/', + 'class' => ($this->view == $view) + ? 'aphront-side-nav-selected' + : null, + ), + phutil_escape_html($name))); + } + + $pager = new AphrontPagerView(); + $pager->setURI($request->getRequestURI(), 'page'); + $pager->setOffset($request->getInt('page')); + + $documents = $this->loadDocuments($pager); + + $content = mpull($documents, 'getContent'); + $phids = mpull($content, 'getAuthorPHID'); + + $handles = id(new PhabricatorObjectHandleData($phids))->loadHandles(); + + + $rows = array(); + foreach ($documents as $document) { + $content = $document->getContent(); + $rows[] = array( + $handles[$content->getAuthorPHID()]->renderLink(), + phutil_render_tag( + 'a', + array( + 'href' => PhrictionDocument::getSlugURI($document->getSlug()), + ), + phutil_escape_html($content->getTitle())), + phabricator_date($content->getDateCreated(), $user), + phabricator_time($content->getDateCreated(), $user), + ); + } + + $document_table = new AphrontTableView($rows); + $document_table->setHeaders( + array( + 'Last Editor', + 'Title', + 'Last Update', + 'Time', + )); + + $document_table->setColumnClasses( + array( + '', + 'wide pri', + '', + 'right', + '', + 'right', + )); + + $view_headers = array( + 'all' => 'All Documents', + 'updates' => 'Recently Updated Documents', + ); + $view_header = $view_headers[$this->view]; + + $panel = new AphrontPanelView(); + $panel->setHeader($view_header); + $panel->appendChild($document_table); + $panel->appendChild($pager); + + $nav->appendChild($panel); + + return $this->buildStandardPageResponse($nav, + array( + 'title' => 'Phriction Main' + )); + } + + private function loadDocuments(AphrontPagerView $pager) { + + // TODO: Do we want/need a query object for this? + + $document_dao = new PhrictionDocument(); + $content_dao = new PhrictionContent(); + $conn = $document_dao->establishConnection('r'); + + switch ($this->view) { + case 'all': + $data = queryfx_all( + $conn, + 'SELECT * FROM %T ORDER BY id DESC LIMIT %d, %d', + $document_dao->getTableName(), + $pager->getOffset(), + $pager->getPageSize() + 1); + break; + case 'updates': + + // TODO: This query is a little suspicious, verify we don't need to key + // or change it once we get more data. + + $data = queryfx_all( + $conn, + 'SELECT d.* FROM %T d JOIN %T c ON c.documentID = d.id + GROUP BY c.documentID + ORDER BY MAX(c.id) DESC LIMIT %d, %d', + $document_dao->getTableName(), + $content_dao->getTableName(), + $pager->getOffset(), + $pager->getPageSize() + 1); + break; + default: + throw new Exception("Unknown view '{$this->view}'!"); + } + + $data = $pager->sliceResults($data); + + $documents = $document_dao->loadAllFromArray($data); + if ($documents) { + $content = $content_dao->loadAllWhere( + 'documentID IN (%Ld)', + mpull($documents, 'getID')); + $content = mpull($content, null, 'getDocumentID'); + foreach ($documents as $document) { + $document->attachContent($content[$document->getID()]); + } + } + + return $documents; + } + +} diff --git a/src/applications/phriction/controller/list/__init__.php b/src/applications/phriction/controller/list/__init__.php new file mode 100644 index 0000000000..62521e8363 --- /dev/null +++ b/src/applications/phriction/controller/list/__init__.php @@ -0,0 +1,24 @@ + true, @@ -76,4 +78,16 @@ class PhrictionDocument extends PhrictionDAO { return $this; } + public function attachContent(PhrictionContent $content) { + $this->contentObject = $content; + return $this; + } + + public function getContent() { + if (!$this->contentObject) { + throw new Exception("Attach content with attachContent() first."); + } + return $this->contentObject; + } + }