@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Move Files editing and commenting to EditEngine

Summary:
Ref T11357. This moves editing and commenting (but not creation) to EditEngine.

Since only the name is really editable, this is pretty straightforward.

Test Plan: Renamed files; commented on files.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T11357

Differential Revision: https://secure.phabricator.com/D17611

+98 -186
+2 -2
src/__phutil_library_map__.php
··· 2743 2743 'PhabricatorFileChunk' => 'applications/files/storage/PhabricatorFileChunk.php', 2744 2744 'PhabricatorFileChunkIterator' => 'applications/files/engine/PhabricatorFileChunkIterator.php', 2745 2745 'PhabricatorFileChunkQuery' => 'applications/files/query/PhabricatorFileChunkQuery.php', 2746 - 'PhabricatorFileCommentController' => 'applications/files/controller/PhabricatorFileCommentController.php', 2747 2746 'PhabricatorFileComposeController' => 'applications/files/controller/PhabricatorFileComposeController.php', 2748 2747 'PhabricatorFileController' => 'applications/files/controller/PhabricatorFileController.php', 2749 2748 'PhabricatorFileDAO' => 'applications/files/storage/PhabricatorFileDAO.php', ··· 2751 2750 'PhabricatorFileDeleteController' => 'applications/files/controller/PhabricatorFileDeleteController.php', 2752 2751 'PhabricatorFileDropUploadController' => 'applications/files/controller/PhabricatorFileDropUploadController.php', 2753 2752 'PhabricatorFileEditController' => 'applications/files/controller/PhabricatorFileEditController.php', 2753 + 'PhabricatorFileEditEngine' => 'applications/files/editor/PhabricatorFileEditEngine.php', 2754 2754 'PhabricatorFileEditField' => 'applications/transactions/editfield/PhabricatorFileEditField.php', 2755 2755 'PhabricatorFileEditor' => 'applications/files/editor/PhabricatorFileEditor.php', 2756 2756 'PhabricatorFileExternalRequest' => 'applications/files/storage/PhabricatorFileExternalRequest.php', ··· 7860 7860 'Iterator', 7861 7861 ), 7862 7862 'PhabricatorFileChunkQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 7863 - 'PhabricatorFileCommentController' => 'PhabricatorFileController', 7864 7863 'PhabricatorFileComposeController' => 'PhabricatorFileController', 7865 7864 'PhabricatorFileController' => 'PhabricatorController', 7866 7865 'PhabricatorFileDAO' => 'PhabricatorLiskDAO', ··· 7868 7867 'PhabricatorFileDeleteController' => 'PhabricatorFileController', 7869 7868 'PhabricatorFileDropUploadController' => 'PhabricatorFileController', 7870 7869 'PhabricatorFileEditController' => 'PhabricatorFileController', 7870 + 'PhabricatorFileEditEngine' => 'PhabricatorEditEngine', 7871 7871 'PhabricatorFileEditField' => 'PhabricatorEditField', 7872 7872 'PhabricatorFileEditor' => 'PhabricatorApplicationTransactionEditor', 7873 7873 'PhabricatorFileExternalRequest' => array(
+2 -1
src/applications/files/application/PhabricatorFilesApplication.php
··· 78 78 'comment/(?P<id>[1-9]\d*)/' => 'PhabricatorFileCommentController', 79 79 'thread/(?P<phid>[^/]+)/' => 'PhabricatorFileLightboxController', 80 80 'delete/(?P<id>[1-9]\d*)/' => 'PhabricatorFileDeleteController', 81 - 'edit/(?P<id>[1-9]\d*)/' => 'PhabricatorFileEditController', 81 + $this->getEditRoutePattern('edit/') 82 + => 'PhabricatorFileEditController', 82 83 'info/(?P<phid>[^/]+)/' => 'PhabricatorFileInfoController', 83 84 'imageproxy/' => 'PhabricatorFileImageProxyController', 84 85 'transforms/(?P<id>[1-9]\d*)/' =>
-62
src/applications/files/controller/PhabricatorFileCommentController.php
··· 1 - <?php 2 - 3 - final class PhabricatorFileCommentController extends PhabricatorFileController { 4 - 5 - public function handleRequest(AphrontRequest $request) { 6 - $viewer = $request->getViewer(); 7 - $id = $request->getURIData('id'); 8 - 9 - if (!$request->isFormPost()) { 10 - return new Aphront400Response(); 11 - } 12 - 13 - $file = id(new PhabricatorFileQuery()) 14 - ->setViewer($viewer) 15 - ->withIDs(array($id)) 16 - ->executeOne(); 17 - if (!$file) { 18 - return new Aphront404Response(); 19 - } 20 - 21 - $is_preview = $request->isPreviewRequest(); 22 - $draft = PhabricatorDraft::buildFromRequest($request); 23 - 24 - $view_uri = $file->getInfoURI(); 25 - 26 - $xactions = array(); 27 - $xactions[] = id(new PhabricatorFileTransaction()) 28 - ->setTransactionType(PhabricatorTransactions::TYPE_COMMENT) 29 - ->attachComment( 30 - id(new PhabricatorFileTransactionComment()) 31 - ->setContent($request->getStr('comment'))); 32 - 33 - $editor = id(new PhabricatorFileEditor()) 34 - ->setActor($viewer) 35 - ->setContinueOnNoEffect($request->isContinueRequest()) 36 - ->setContentSourceFromRequest($request) 37 - ->setIsPreview($is_preview); 38 - 39 - try { 40 - $xactions = $editor->applyTransactions($file, $xactions); 41 - } catch (PhabricatorApplicationTransactionNoEffectException $ex) { 42 - return id(new PhabricatorApplicationTransactionNoEffectResponse()) 43 - ->setCancelURI($view_uri) 44 - ->setException($ex); 45 - } 46 - 47 - if ($draft) { 48 - $draft->replaceOrDelete(); 49 - } 50 - 51 - if ($request->isAjax() && $is_preview) { 52 - return id(new PhabricatorApplicationTransactionResponse()) 53 - ->setViewer($viewer) 54 - ->setTransactions($xactions) 55 - ->setIsPreview($is_preview); 56 - } else { 57 - return id(new AphrontRedirectResponse()) 58 - ->setURI($view_uri); 59 - } 60 - } 61 - 62 - }
+5 -107
src/applications/files/controller/PhabricatorFileEditController.php
··· 1 1 <?php 2 2 3 - final class PhabricatorFileEditController extends PhabricatorFileController { 3 + final class PhabricatorFileEditController 4 + extends PhabricatorFileController { 4 5 5 6 public function handleRequest(AphrontRequest $request) { 6 - $viewer = $request->getViewer(); 7 - $id = $request->getURIData('id'); 8 - 9 - $file = id(new PhabricatorFileQuery()) 10 - ->setViewer($viewer) 11 - ->withIDs(array($id)) 12 - ->requireCapabilities( 13 - array( 14 - PhabricatorPolicyCapability::CAN_VIEW, 15 - PhabricatorPolicyCapability::CAN_EDIT, 16 - )) 17 - ->executeOne(); 18 - if (!$file) { 19 - return new Aphront404Response(); 20 - } 21 - 22 - $title = pht('Edit File: %s', $file->getName()); 23 - $file_name = $file->getName(); 24 - $header_icon = 'fa-pencil'; 25 - $view_uri = '/'.$file->getMonogram(); 26 - $error_name = true; 27 - $validation_exception = null; 28 - 29 - if ($request->isFormPost()) { 30 - $can_view = $request->getStr('canView'); 31 - $file_name = $request->getStr('name'); 32 - $errors = array(); 33 - 34 - $type_name = PhabricatorFileNameTransaction::TRANSACTIONTYPE; 35 - 36 - $xactions = array(); 37 - 38 - $xactions[] = id(new PhabricatorFileTransaction()) 39 - ->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY) 40 - ->setNewValue($can_view); 41 - 42 - $xactions[] = id(new PhabricatorFileTransaction()) 43 - ->setTransactionType($type_name) 44 - ->setNewValue($file_name); 45 - 46 - $editor = id(new PhabricatorFileEditor()) 47 - ->setActor($viewer) 48 - ->setContentSourceFromRequest($request) 49 - ->setContinueOnNoEffect(true); 50 - 51 - try { 52 - $editor->applyTransactions($file, $xactions); 53 - return id(new AphrontRedirectResponse())->setURI($view_uri); 54 - } catch (PhabricatorApplicationTransactionValidationException $ex) { 55 - $validation_exception = $ex; 56 - $error_name = $ex->getShortMessage($type_name); 57 - 58 - $file->setViewPolicy($can_view); 59 - } 60 - } 61 - 62 - 63 - $policies = id(new PhabricatorPolicyQuery()) 64 - ->setViewer($viewer) 65 - ->setObject($file) 66 - ->execute(); 67 - 68 - $form = id(new AphrontFormView()) 69 - ->setUser($viewer) 70 - ->appendChild( 71 - id(new AphrontFormTextControl()) 72 - ->setName('name') 73 - ->setValue($file_name) 74 - ->setLabel(pht('Name')) 75 - ->setError($error_name)) 76 - ->appendChild( 77 - id(new AphrontFormPolicyControl()) 78 - ->setUser($viewer) 79 - ->setCapability(PhabricatorPolicyCapability::CAN_VIEW) 80 - ->setPolicyObject($file) 81 - ->setPolicies($policies) 82 - ->setName('canView')) 83 - ->appendChild( 84 - id(new AphrontFormSubmitControl()) 85 - ->addCancelButton($view_uri) 86 - ->setValue(pht('Save Changes'))); 87 - 88 - $crumbs = $this->buildApplicationCrumbs() 89 - ->addTextCrumb($file->getMonogram(), $view_uri) 90 - ->addTextCrumb(pht('Edit')) 91 - ->setBorder(true); 92 - 93 - $box = id(new PHUIObjectBoxView()) 94 - ->setHeaderText($title) 95 - ->setValidationException($validation_exception) 96 - ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 97 - ->appendChild($form); 98 - 99 - $header = id(new PHUIHeaderView()) 100 - ->setHeader($title) 101 - ->setHeaderIcon($header_icon); 102 - 103 - $view = id(new PHUITwoColumnView()) 104 - ->setHeader($header) 105 - ->setFooter($box); 106 - 107 - return $this->newPage() 108 - ->setTitle($title) 109 - ->setCrumbs($crumbs) 110 - ->appendChild($view); 111 - 7 + return id(new PhabricatorFileEditEngine()) 8 + ->setController($this) 9 + ->buildResponse(); 112 10 } 113 11 114 12 }
+7 -14
src/applications/files/controller/PhabricatorFileInfoController.php
··· 94 94 $file, 95 95 new PhabricatorFileTransactionQuery()); 96 96 97 - $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business'); 97 + $comment_view = id(new PhabricatorFileEditEngine()) 98 + ->setViewer($viewer) 99 + ->buildEditEngineCommentView($file); 98 100 99 - $add_comment_header = $is_serious 100 - ? pht('Add Comment') 101 - : pht('Question File Integrity'); 101 + $monogram = $file->getMonogram(); 102 102 103 - $draft = PhabricatorDraft::newFromUserAndKey($viewer, $file->getPHID()); 104 - 105 - $add_comment_form = id(new PhabricatorApplicationTransactionCommentView()) 106 - ->setUser($viewer) 107 - ->setObjectPHID($file->getPHID()) 108 - ->setDraft($draft) 109 - ->setHeaderText($add_comment_header) 110 - ->setAction($this->getApplicationURI('/comment/'.$file->getID().'/')) 111 - ->setSubmitButtonName(pht('Add Comment')); 103 + $timeline->setQuoteRef($monogram); 104 + $comment_view->setTransactionTimeline($timeline); 112 105 113 106 return array( 114 107 $timeline, 115 - $add_comment_form, 108 + $comment_view, 116 109 ); 117 110 } 118 111
+79
src/applications/files/editor/PhabricatorFileEditEngine.php
··· 1 + <?php 2 + 3 + final class PhabricatorFileEditEngine 4 + extends PhabricatorEditEngine { 5 + 6 + const ENGINECONST = 'files.file'; 7 + 8 + public function getEngineName() { 9 + return pht('Files'); 10 + } 11 + 12 + protected function supportsEditEngineConfiguration() { 13 + return false; 14 + } 15 + 16 + protected function getCreateNewObjectPolicy() { 17 + // TODO: For now, this EditEngine can only edit objects, since there is 18 + // a lot of complexity in dealing with file data during file creation. 19 + return PhabricatorPolicies::POLICY_NOONE; 20 + } 21 + 22 + public function getSummaryHeader() { 23 + return pht('Configure Files Forms'); 24 + } 25 + 26 + public function getSummaryText() { 27 + return pht('Configure creation and editing forms in Files.'); 28 + } 29 + 30 + public function getEngineApplicationClass() { 31 + return 'PhabricatorFilesApplication'; 32 + } 33 + 34 + protected function newEditableObject() { 35 + return PhabricatorFile::initializeNewFile(); 36 + } 37 + 38 + protected function newObjectQuery() { 39 + return new PhabricatorFileQuery(); 40 + } 41 + 42 + protected function getObjectCreateTitleText($object) { 43 + return pht('Create New File'); 44 + } 45 + 46 + protected function getObjectEditTitleText($object) { 47 + return pht('Edit File: %s', $object->getName()); 48 + } 49 + 50 + protected function getObjectEditShortText($object) { 51 + return $object->getMonogram(); 52 + } 53 + 54 + protected function getObjectCreateShortText() { 55 + return pht('Create File'); 56 + } 57 + 58 + protected function getObjectName() { 59 + return pht('File'); 60 + } 61 + 62 + protected function getObjectViewURI($object) { 63 + return $object->getURI(); 64 + } 65 + 66 + protected function buildCustomEditFields($object) { 67 + return array( 68 + id(new PhabricatorTextEditField()) 69 + ->setKey('name') 70 + ->setLabel(pht('Name')) 71 + ->setTransactionType(PhabricatorFileNameTransaction::TRANSACTIONTYPE) 72 + ->setDescription(pht('The name of the file.')) 73 + ->setConduitDescription(pht('Rename the file.')) 74 + ->setConduitTypeDescription(pht('New file name.')) 75 + ->setValue($object->getName()), 76 + ); 77 + } 78 + 79 + }
+3
src/applications/files/storage/PhabricatorFile.php
··· 774 774 return $format->newReadIterator($raw_iterator); 775 775 } 776 776 777 + public function getURI() { 778 + return $this->getInfoURI(); 779 + } 777 780 778 781 public function getViewURI() { 779 782 if (!$this->getPHID()) {