diff --git a/resources/celerity/map.php b/resources/celerity/map.php --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -148,7 +148,7 @@ 'rsrc/css/phui/phui-curtain-view.css' => '2bdaf026', 'rsrc/css/phui/phui-document-pro.css' => '0e41dd91', 'rsrc/css/phui/phui-document-summary.css' => '9ca48bdf', - 'rsrc/css/phui/phui-document.css' => '552493fa', + 'rsrc/css/phui/phui-document.css' => 'c4ac41f9', 'rsrc/css/phui/phui-feed-story.css' => '44a9c8e9', 'rsrc/css/phui/phui-fontkit.css' => '1320ed01', 'rsrc/css/phui/phui-form-view.css' => 'f808e5be', @@ -813,7 +813,7 @@ 'phui-crumbs-view-css' => '10728aaa', 'phui-curtain-view-css' => '2bdaf026', 'phui-document-summary-view-css' => '9ca48bdf', - 'phui-document-view-css' => '552493fa', + 'phui-document-view-css' => 'c4ac41f9', 'phui-document-view-pro-css' => '0e41dd91', 'phui-feed-story-css' => '44a9c8e9', 'phui-font-icon-base-css' => '870a7360', diff --git a/src/applications/phriction/controller/PhrictionDocumentController.php b/src/applications/phriction/controller/PhrictionDocumentController.php --- a/src/applications/phriction/controller/PhrictionDocumentController.php +++ b/src/applications/phriction/controller/PhrictionDocumentController.php @@ -20,8 +20,6 @@ return id(new AphrontRedirectResponse())->setURI($uri); } - require_celerity_resource('phriction-document-css'); - $version_note = null; $core_content = ''; $move_notice = ''; @@ -29,6 +27,8 @@ $content = null; $toc = null; + $is_draft = false; + $document = id(new PhrictionDocumentQuery()) ->setViewer($viewer) ->withSlugs(array($slug)) @@ -66,8 +66,14 @@ ->addAction($create_button); } else { - $version = $request->getInt('v'); + $draft_content = id(new PhrictionContentQuery()) + ->setViewer($viewer) + ->withDocumentPHIDs(array($document->getPHID())) + ->setLimit(1) + ->executeOne(); + $max_version = (int)$draft_content->getVersion(); + $version = $request->getInt('v'); if ($version) { $content = id(new PhrictionContentQuery()) ->setViewer($viewer) @@ -78,15 +84,111 @@ return new Aphront404Response(); } - if ($content->getPHID() != $document->getContentPHID()) { - $version_note = id(new PHUIInfoView()) - ->setSeverity(PHUIInfoView::SEVERITY_NOTICE) - ->appendChild( - pht( - 'You are viewing an older version of this document, as it '. - 'appeared on %s.', - phabricator_datetime($content->getDateCreated(), $viewer))); + // When the "v" parameter exists, the user is in history mode so we + // show this header even if they're looking at the current version + // of the document. This keeps the next/previous links working. + + $view_version = (int)$content->getVersion(); + $published_version = (int)$document->getContent()->getVersion(); + + if ($view_version < $published_version) { + $version_note = pht( + 'You are viewing an older version of this document, as it '. + 'appeared on %s.', + phabricator_datetime($content->getDateCreated(), $viewer)); + } else if ($view_version > $published_version) { + $is_draft = true; + $version_note = pht( + 'You are viewing an unpublished draft of this document.'); + } else { + $version_note = pht( + 'You are viewing the current published version of this document.'); + } + + $version_note = array( + phutil_tag( + 'strong', + array(), + pht('Version %d of %d: ', $view_version, $max_version)), + ' ', + $version_note, + ); + + $version_note = id(new PHUIInfoView()) + ->setSeverity(PHUIInfoView::SEVERITY_NOTICE) + ->appendChild($version_note); + + $document_uri = new PhutilURI($document->getURI()); + + if ($view_version > 1) { + $previous_uri = $document_uri->alter('v', ($view_version - 1)); + } else { + $previous_uri = null; + } + + if ($view_version !== $published_version) { + $current_uri = $document_uri->alter('v', $published_version); + } else { + $current_uri = null; + } + + if ($view_version < $max_version) { + $next_uri = $document_uri->alter('v', ($view_version + 1)); + } else { + $next_uri = null; + } + + if ($view_version !== $max_version) { + $draft_uri = $document_uri->alter('v', $max_version); + } else { + $draft_uri = null; } + + $button_bar = id(new PHUIButtonBarView()) + ->addButton( + id(new PHUIButtonView()) + ->setTag('a') + ->setColor('grey') + ->setIcon('fa-backward') + ->setDisabled(!$previous_uri) + ->setHref($previous_uri) + ->setText(pht('Previous'))) + ->addButton( + id(new PHUIButtonView()) + ->setTag('a') + ->setColor('grey') + ->setIcon('fa-file-o') + ->setDisabled(!$current_uri) + ->setHref($current_uri) + ->setText(pht('Published'))) + ->addButton( + id(new PHUIButtonView()) + ->setTag('a') + ->setColor('grey') + ->setIcon('fa-forward', false) + ->setDisabled(!$next_uri) + ->setHref($next_uri) + ->setText(pht('Next'))) + ->addButton( + id(new PHUIButtonView()) + ->setTag('a') + ->setColor('grey') + ->setIcon('fa-fast-forward', false) + ->setDisabled(!$draft_uri) + ->setHref($draft_uri) + ->setText(pht('Draft'))); + + require_celerity_resource('phui-document-view-css'); + + $version_note = array( + $version_note, + phutil_tag( + 'div', + array( + 'class' => 'phui-document-version-navigation', + ), + $button_bar), + ); } else { $content = $document->getContent(); } @@ -218,7 +320,15 @@ ->setPolicyObject($document) ->setHeader($page_title); - if ($content) { + if ($is_draft) { + $draft_tag = id(new PHUITagView()) + ->setName(pht('Draft')) + ->setIcon('fa-spinner') + ->setColor('pink') + ->setType(PHUITagView::TYPE_SHADE); + + $header->addTag($draft_tag); + } else if ($content) { $header->setEpoch($content->getDateCreated()); } @@ -299,21 +409,37 @@ ->setIcon('fa-pencil') ->setHref('/phriction/edit/'.$document->getID().'/')); + $curtain->addAction( + id(new PhabricatorActionView()) + ->setName(pht('View History')) + ->setIcon('fa-history') + ->setHref(PhrictionDocument::getSlugURI($slug, 'history'))); + $is_current = false; $content_id = null; + $is_draft = false; if ($content) { if ($content->getPHID() == $document->getContentPHID()) { $is_current = true; } $content_id = $content->getID(); + + $current_version = $document->getContent()->getVersion(); + $is_draft = ($content->getVersion() >= $current_version); } $can_publish = ($can_edit && $content && !$is_current); + if ($is_draft) { + $publish_name = pht('Publish Draft'); + } else { + $publish_name = pht('Publish Revert'); + } + $publish_uri = "/phriction/publish/{$id}/{$content_id}/"; $curtain->addAction( id(new PhabricatorActionView()) - ->setName(pht('Publish')) + ->setName($publish_name) ->setIcon('fa-upload') ->setDisabled(!$can_publish) ->setWorkflow(true) @@ -337,12 +463,6 @@ ->setWorkflow(true)); } - $curtain->addAction( - id(new PhabricatorActionView()) - ->setName(pht('View History')) - ->setIcon('fa-list') - ->setHref(PhrictionDocument::getSlugURI($slug, 'history'))); - $print_uri = PhrictionDocument::getSlugURI($slug).'?__print__=1'; $curtain->addAction( diff --git a/webroot/rsrc/css/phui/phui-document.css b/webroot/rsrc/css/phui/phui-document.css --- a/webroot/rsrc/css/phui/phui-document.css +++ b/webroot/rsrc/css/phui/phui-document.css @@ -100,3 +100,9 @@ .remarkup-code { font: 13px/18px "Menlo", "Consolas", "Monaco", monospace; } + +.phui-document-version-navigation { + text-align: center; + padding: 8px; + background-color: {$lightgreybackground}; +}