Support (basic) commenting on Phriction documents
Summary:
Depends on D19659. Fixes T1894. Ref T13077. See PHI840.
  - Add an EditEngine, although it currently supports no fields.
  - Add (basic, top-level-only) commenting (we already had the table in the database).
This will probably create some issues. I'm most concerned about documents accumulating a ton of old, irrelevant comments over time which are hard to keep track of and no longer relevant. But I think this is probably a step forward in almost all cases, and a good thing on the balance.
This also moves us incrementally toward putting all editing on top of EditEngine.
Test Plan: {F5877347}
Reviewers: amckinley
Reviewed By: amckinley
Maniphest Tasks: T13077, T1894
Differential Revision: https://secure.phabricator.com/D19660
			
			
This commit is contained in:
		@@ -146,7 +146,7 @@ return array(
 | 
				
			|||||||
    'rsrc/css/phui/phui-comment-panel.css' => 'f50152ad',
 | 
					    'rsrc/css/phui/phui-comment-panel.css' => 'f50152ad',
 | 
				
			||||||
    'rsrc/css/phui/phui-crumbs-view.css' => '10728aaa',
 | 
					    'rsrc/css/phui/phui-crumbs-view.css' => '10728aaa',
 | 
				
			||||||
    'rsrc/css/phui/phui-curtain-view.css' => '2bdaf026',
 | 
					    'rsrc/css/phui/phui-curtain-view.css' => '2bdaf026',
 | 
				
			||||||
    'rsrc/css/phui/phui-document-pro.css' => '1a08ef4b',
 | 
					    'rsrc/css/phui/phui-document-pro.css' => 'd033e8d5',
 | 
				
			||||||
    'rsrc/css/phui/phui-document-summary.css' => '9ca48bdf',
 | 
					    'rsrc/css/phui/phui-document-summary.css' => '9ca48bdf',
 | 
				
			||||||
    'rsrc/css/phui/phui-document.css' => 'c4ac41f9',
 | 
					    'rsrc/css/phui/phui-document.css' => 'c4ac41f9',
 | 
				
			||||||
    'rsrc/css/phui/phui-feed-story.css' => '44a9c8e9',
 | 
					    'rsrc/css/phui/phui-feed-story.css' => '44a9c8e9',
 | 
				
			||||||
@@ -814,7 +814,7 @@ return array(
 | 
				
			|||||||
    'phui-curtain-view-css' => '2bdaf026',
 | 
					    'phui-curtain-view-css' => '2bdaf026',
 | 
				
			||||||
    'phui-document-summary-view-css' => '9ca48bdf',
 | 
					    'phui-document-summary-view-css' => '9ca48bdf',
 | 
				
			||||||
    'phui-document-view-css' => 'c4ac41f9',
 | 
					    'phui-document-view-css' => 'c4ac41f9',
 | 
				
			||||||
    'phui-document-view-pro-css' => '1a08ef4b',
 | 
					    'phui-document-view-pro-css' => 'd033e8d5',
 | 
				
			||||||
    'phui-feed-story-css' => '44a9c8e9',
 | 
					    'phui-feed-story-css' => '44a9c8e9',
 | 
				
			||||||
    'phui-font-icon-base-css' => '870a7360',
 | 
					    'phui-font-icon-base-css' => '870a7360',
 | 
				
			||||||
    'phui-fontkit-css' => '1320ed01',
 | 
					    'phui-fontkit-css' => '1320ed01',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5021,6 +5021,7 @@ phutil_register_library_map(array(
 | 
				
			|||||||
    'PhrictionDocumentController' => 'applications/phriction/controller/PhrictionDocumentController.php',
 | 
					    'PhrictionDocumentController' => 'applications/phriction/controller/PhrictionDocumentController.php',
 | 
				
			||||||
    'PhrictionDocumentDatasource' => 'applications/phriction/typeahead/PhrictionDocumentDatasource.php',
 | 
					    'PhrictionDocumentDatasource' => 'applications/phriction/typeahead/PhrictionDocumentDatasource.php',
 | 
				
			||||||
    'PhrictionDocumentDeleteTransaction' => 'applications/phriction/xaction/PhrictionDocumentDeleteTransaction.php',
 | 
					    'PhrictionDocumentDeleteTransaction' => 'applications/phriction/xaction/PhrictionDocumentDeleteTransaction.php',
 | 
				
			||||||
 | 
					    'PhrictionDocumentEditEngine' => 'applications/phriction/editor/PhrictionDocumentEditEngine.php',
 | 
				
			||||||
    'PhrictionDocumentFerretEngine' => 'applications/phriction/search/PhrictionDocumentFerretEngine.php',
 | 
					    'PhrictionDocumentFerretEngine' => 'applications/phriction/search/PhrictionDocumentFerretEngine.php',
 | 
				
			||||||
    'PhrictionDocumentFulltextEngine' => 'applications/phriction/search/PhrictionDocumentFulltextEngine.php',
 | 
					    'PhrictionDocumentFulltextEngine' => 'applications/phriction/search/PhrictionDocumentFulltextEngine.php',
 | 
				
			||||||
    'PhrictionDocumentHeraldAdapter' => 'applications/phriction/herald/PhrictionDocumentHeraldAdapter.php',
 | 
					    'PhrictionDocumentHeraldAdapter' => 'applications/phriction/herald/PhrictionDocumentHeraldAdapter.php',
 | 
				
			||||||
@@ -5042,6 +5043,7 @@ phutil_register_library_map(array(
 | 
				
			|||||||
    'PhrictionDocumentVersionTransaction' => 'applications/phriction/xaction/PhrictionDocumentVersionTransaction.php',
 | 
					    'PhrictionDocumentVersionTransaction' => 'applications/phriction/xaction/PhrictionDocumentVersionTransaction.php',
 | 
				
			||||||
    'PhrictionEditConduitAPIMethod' => 'applications/phriction/conduit/PhrictionEditConduitAPIMethod.php',
 | 
					    'PhrictionEditConduitAPIMethod' => 'applications/phriction/conduit/PhrictionEditConduitAPIMethod.php',
 | 
				
			||||||
    'PhrictionEditController' => 'applications/phriction/controller/PhrictionEditController.php',
 | 
					    'PhrictionEditController' => 'applications/phriction/controller/PhrictionEditController.php',
 | 
				
			||||||
 | 
					    'PhrictionEditEngineController' => 'applications/phriction/controller/PhrictionEditEngineController.php',
 | 
				
			||||||
    'PhrictionHistoryConduitAPIMethod' => 'applications/phriction/conduit/PhrictionHistoryConduitAPIMethod.php',
 | 
					    'PhrictionHistoryConduitAPIMethod' => 'applications/phriction/conduit/PhrictionHistoryConduitAPIMethod.php',
 | 
				
			||||||
    'PhrictionHistoryController' => 'applications/phriction/controller/PhrictionHistoryController.php',
 | 
					    'PhrictionHistoryController' => 'applications/phriction/controller/PhrictionHistoryController.php',
 | 
				
			||||||
    'PhrictionInfoConduitAPIMethod' => 'applications/phriction/conduit/PhrictionInfoConduitAPIMethod.php',
 | 
					    'PhrictionInfoConduitAPIMethod' => 'applications/phriction/conduit/PhrictionInfoConduitAPIMethod.php',
 | 
				
			||||||
@@ -11140,6 +11142,7 @@ phutil_register_library_map(array(
 | 
				
			|||||||
    'PhrictionDocumentController' => 'PhrictionController',
 | 
					    'PhrictionDocumentController' => 'PhrictionController',
 | 
				
			||||||
    'PhrictionDocumentDatasource' => 'PhabricatorTypeaheadDatasource',
 | 
					    'PhrictionDocumentDatasource' => 'PhabricatorTypeaheadDatasource',
 | 
				
			||||||
    'PhrictionDocumentDeleteTransaction' => 'PhrictionDocumentVersionTransaction',
 | 
					    'PhrictionDocumentDeleteTransaction' => 'PhrictionDocumentVersionTransaction',
 | 
				
			||||||
 | 
					    'PhrictionDocumentEditEngine' => 'PhabricatorEditEngine',
 | 
				
			||||||
    'PhrictionDocumentFerretEngine' => 'PhabricatorFerretEngine',
 | 
					    'PhrictionDocumentFerretEngine' => 'PhabricatorFerretEngine',
 | 
				
			||||||
    'PhrictionDocumentFulltextEngine' => 'PhabricatorFulltextEngine',
 | 
					    'PhrictionDocumentFulltextEngine' => 'PhabricatorFulltextEngine',
 | 
				
			||||||
    'PhrictionDocumentHeraldAdapter' => 'HeraldAdapter',
 | 
					    'PhrictionDocumentHeraldAdapter' => 'HeraldAdapter',
 | 
				
			||||||
@@ -11161,6 +11164,7 @@ phutil_register_library_map(array(
 | 
				
			|||||||
    'PhrictionDocumentVersionTransaction' => 'PhrictionDocumentTransactionType',
 | 
					    'PhrictionDocumentVersionTransaction' => 'PhrictionDocumentTransactionType',
 | 
				
			||||||
    'PhrictionEditConduitAPIMethod' => 'PhrictionConduitAPIMethod',
 | 
					    'PhrictionEditConduitAPIMethod' => 'PhrictionConduitAPIMethod',
 | 
				
			||||||
    'PhrictionEditController' => 'PhrictionController',
 | 
					    'PhrictionEditController' => 'PhrictionController',
 | 
				
			||||||
 | 
					    'PhrictionEditEngineController' => 'PhrictionController',
 | 
				
			||||||
    'PhrictionHistoryConduitAPIMethod' => 'PhrictionConduitAPIMethod',
 | 
					    'PhrictionHistoryConduitAPIMethod' => 'PhrictionConduitAPIMethod',
 | 
				
			||||||
    'PhrictionHistoryController' => 'PhrictionController',
 | 
					    'PhrictionHistoryController' => 'PhrictionController',
 | 
				
			||||||
    'PhrictionInfoConduitAPIMethod' => 'PhrictionConduitAPIMethod',
 | 
					    'PhrictionInfoConduitAPIMethod' => 'PhrictionConduitAPIMethod',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -63,6 +63,9 @@ final class PhabricatorPhrictionApplication extends PhabricatorApplication {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        'preview/(?P<slug>.*/)' => 'PhrictionMarkupPreviewController',
 | 
					        'preview/(?P<slug>.*/)' => 'PhrictionMarkupPreviewController',
 | 
				
			||||||
        'diff/(?P<id>[1-9]\d*)/' => 'PhrictionDiffController',
 | 
					        'diff/(?P<id>[1-9]\d*)/' => 'PhrictionDiffController',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->getEditRoutePattern('document/edit/')
 | 
				
			||||||
 | 
					          => 'PhrictionEditEngineController',
 | 
				
			||||||
      ),
 | 
					      ),
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -352,6 +352,13 @@ final class PhrictionDocumentController
 | 
				
			|||||||
      $document,
 | 
					      $document,
 | 
				
			||||||
      new PhrictionTransactionQuery());
 | 
					      new PhrictionTransactionQuery());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $edit_engine = id(new PhrictionDocumentEditEngine())
 | 
				
			||||||
 | 
					      ->setViewer($viewer)
 | 
				
			||||||
 | 
					      ->setTargetObject($document);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $comment_view = $edit_engine
 | 
				
			||||||
 | 
					      ->buildEditEngineCommentView($document);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return $this->newPage()
 | 
					    return $this->newPage()
 | 
				
			||||||
      ->setTitle($page_title)
 | 
					      ->setTitle($page_title)
 | 
				
			||||||
      ->setCrumbs($crumbs)
 | 
					      ->setCrumbs($crumbs)
 | 
				
			||||||
@@ -368,6 +375,7 @@ final class PhrictionDocumentController
 | 
				
			|||||||
            array(
 | 
					            array(
 | 
				
			||||||
              $children,
 | 
					              $children,
 | 
				
			||||||
              $timeline,
 | 
					              $timeline,
 | 
				
			||||||
 | 
					              $comment_view,
 | 
				
			||||||
            )),
 | 
					            )),
 | 
				
			||||||
        ));
 | 
					        ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					final class PhrictionEditEngineController
 | 
				
			||||||
 | 
					  extends PhrictionController {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public function handleRequest(AphrontRequest $request) {
 | 
				
			||||||
 | 
					    // NOTE: For now, this controller is only used to handle comments.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return id(new PhrictionDocumentEditEngine())
 | 
				
			||||||
 | 
					      ->setController($this)
 | 
				
			||||||
 | 
					      ->buildResponse();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,85 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					final class PhrictionDocumentEditEngine
 | 
				
			||||||
 | 
					  extends PhabricatorEditEngine {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const ENGINECONST = 'phriction.document';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public function isEngineConfigurable() {
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public function getEngineName() {
 | 
				
			||||||
 | 
					    return pht('Phriction Document');
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public function getSummaryHeader() {
 | 
				
			||||||
 | 
					    return pht('Edit Phriction Document Configurations');
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public function getSummaryText() {
 | 
				
			||||||
 | 
					    return pht('This engine is used to edit Phriction documents.');
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public function getEngineApplicationClass() {
 | 
				
			||||||
 | 
					    return 'PhabricatorPhrictionApplication';
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  protected function newEditableObject() {
 | 
				
			||||||
 | 
					    $viewer = $this->getViewer();
 | 
				
			||||||
 | 
					    return PhrictionDocument::initializeNewDocument(
 | 
				
			||||||
 | 
					      $viewer,
 | 
				
			||||||
 | 
					      '/');
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  protected function newObjectQuery() {
 | 
				
			||||||
 | 
					    return id(new PhrictionDocumentQuery())
 | 
				
			||||||
 | 
					      ->needContent(true);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  protected function getObjectCreateTitleText($object) {
 | 
				
			||||||
 | 
					    return pht('Create Document');
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  protected function getObjectCreateButtonText($object) {
 | 
				
			||||||
 | 
					    return pht('Create Document');
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  protected function getObjectEditTitleText($object) {
 | 
				
			||||||
 | 
					    return pht('Edit Document: %s', $object->getContent()->getTitle());
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  protected function getObjectEditShortText($object) {
 | 
				
			||||||
 | 
					    return pht('Edit Document');
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  protected function getObjectCreateShortText() {
 | 
				
			||||||
 | 
					    return pht('Create Document');
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  protected function getObjectName() {
 | 
				
			||||||
 | 
					    return pht('Document');
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  protected function getEditorURI() {
 | 
				
			||||||
 | 
					    return '/phriction/document/edit/';
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  protected function getObjectCreateCancelURI($object) {
 | 
				
			||||||
 | 
					    return '/phriction/document/';
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  protected function getObjectViewURI($object) {
 | 
				
			||||||
 | 
					    return $object->getURI();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  protected function getCreateNewObjectPolicy() {
 | 
				
			||||||
 | 
					    // NOTE: For now, this engine is only to support commenting.
 | 
				
			||||||
 | 
					    return PhabricatorPolicies::POLICY_NOONE;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  protected function buildCustomEditFields($object) {
 | 
				
			||||||
 | 
					    return array();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -243,6 +243,7 @@ class PhabricatorApplicationTransactionCommentView extends AphrontView {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    $comment_box = id(new PHUIObjectBoxView())
 | 
					    $comment_box = id(new PHUIObjectBoxView())
 | 
				
			||||||
      ->setFlush(true)
 | 
					      ->setFlush(true)
 | 
				
			||||||
 | 
					      ->setNoBorder(true)
 | 
				
			||||||
      ->addClass('phui-comment-form-view')
 | 
					      ->addClass('phui-comment-form-view')
 | 
				
			||||||
      ->addSigil('phui-comment-form')
 | 
					      ->addSigil('phui-comment-form')
 | 
				
			||||||
      ->appendChild(
 | 
					      ->appendChild(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,6 +25,7 @@ final class PHUIObjectBoxView extends AphrontTagView {
 | 
				
			|||||||
  private $showHideHref;
 | 
					  private $showHideHref;
 | 
				
			||||||
  private $showHideContent;
 | 
					  private $showHideContent;
 | 
				
			||||||
  private $showHideOpen;
 | 
					  private $showHideOpen;
 | 
				
			||||||
 | 
					  private $noBorder;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private $propertyLists = array();
 | 
					  private $propertyLists = array();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -147,6 +148,11 @@ final class PHUIObjectBoxView extends AphrontTagView {
 | 
				
			|||||||
    return $this;
 | 
					    return $this;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public function setNoBorder($no_border) {
 | 
				
			||||||
 | 
					    $this->noBorder = $no_border;
 | 
				
			||||||
 | 
					    return $this;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public function setValidationException(
 | 
					  public function setValidationException(
 | 
				
			||||||
    PhabricatorApplicationTransactionValidationException $ex = null) {
 | 
					    PhabricatorApplicationTransactionValidationException $ex = null) {
 | 
				
			||||||
    $this->validationException = $ex;
 | 
					    $this->validationException = $ex;
 | 
				
			||||||
@@ -156,7 +162,9 @@ final class PHUIObjectBoxView extends AphrontTagView {
 | 
				
			|||||||
  protected function getTagAttributes() {
 | 
					  protected function getTagAttributes() {
 | 
				
			||||||
    $classes = array();
 | 
					    $classes = array();
 | 
				
			||||||
    $classes[] = 'phui-box';
 | 
					    $classes[] = 'phui-box';
 | 
				
			||||||
    $classes[] = 'phui-box-border';
 | 
					    if (!$this->noBorder) {
 | 
				
			||||||
 | 
					      $classes[] = 'phui-box-border';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    $classes[] = 'phui-object-box';
 | 
					    $classes[] = 'phui-object-box';
 | 
				
			||||||
    $classes[] = 'mlt mll mlr';
 | 
					    $classes[] = 'mlt mll mlr';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -241,10 +241,13 @@ body.printable {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.phui-document-view-pro-box {
 | 
				
			||||||
 | 
					  margin-bottom: 24px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.phui-document-view-pro-box .phui-timeline-view {
 | 
					.phui-document-view-pro-box .phui-timeline-view {
 | 
				
			||||||
  padding: 16px 0 0 0;
 | 
					  padding: 16px 0 0 0;
 | 
				
			||||||
  background: none;
 | 
					  background: none;
 | 
				
			||||||
  border-top: 1px solid rgba({$alphablue}, 0.20);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.phui-document-view-pro-box .phui-timeline-wedge {
 | 
					.phui-document-view-pro-box .phui-timeline-wedge {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user