diff --git a/src/applications/phriction/controller/PhrictionDeleteController.php b/src/applications/phriction/controller/PhrictionDeleteController.php --- a/src/applications/phriction/controller/PhrictionDeleteController.php +++ b/src/applications/phriction/controller/PhrictionDeleteController.php @@ -15,6 +15,7 @@ $document = id(new PhrictionDocumentQuery()) ->setViewer($user) ->withIDs(array($this->id)) + ->needContent(true) ->requireCapabilities( array( PhabricatorPolicyCapability::CAN_EDIT, @@ -32,15 +33,24 @@ PhrictionDocumentStatus::STATUS_STUB => true, // How could they? ); if (isset($disallowed_states[$document->getStatus()])) { - $e_text = pht('An already moved or deleted document can not be deleted'); + $e_text = pht( + 'An already moved or deleted document can not be deleted.'); } $document_uri = PhrictionDocument::getSlugURI($document->getSlug()); if (!$e_text && $request->isFormPost()) { - $editor = id(PhrictionDocumentEditor::newForSlug($document->getSlug())) + $xactions = array(); + $xactions[] = id(new PhrictionTransaction()) + ->setTransactionType(PhrictionTransaction::TYPE_DELETE) + ->setNewValue(true); + + $editor = id(new PhrictionTransactionEditor()) ->setActor($user) - ->delete(); + ->setContentSourceFromRequest($request) + ->setContinueOnNoEffect(true) + ->applyTransactions($document, $xactions); + return id(new AphrontRedirectResponse())->setURI($document_uri); } diff --git a/src/applications/phriction/editor/PhrictionTransactionEditor.php b/src/applications/phriction/editor/PhrictionTransactionEditor.php --- a/src/applications/phriction/editor/PhrictionTransactionEditor.php +++ b/src/applications/phriction/editor/PhrictionTransactionEditor.php @@ -48,6 +48,7 @@ $types[] = PhabricatorTransactions::TYPE_COMMENT; $types[] = PhrictionTransaction::TYPE_TITLE; $types[] = PhrictionTransaction::TYPE_CONTENT; + $types[] = PhrictionTransaction::TYPE_DELETE; /* TODO $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; @@ -72,6 +73,8 @@ return null; } return $this->getOldContent()->getContent(); + case PhrictionTransaction::TYPE_DELETE: + return null; } } @@ -82,6 +85,7 @@ switch ($xaction->getTransactionType()) { case PhrictionTransaction::TYPE_TITLE: case PhrictionTransaction::TYPE_CONTENT: + case PhrictionTransaction::TYPE_DELETE: return $xaction->getNewValue(); } } @@ -94,6 +98,7 @@ switch ($xaction->getTransactionType()) { case PhrictionTransaction::TYPE_TITLE: case PhrictionTransaction::TYPE_CONTENT: + case PhrictionTransaction::TYPE_DELETE: return true; } } @@ -131,6 +136,11 @@ case PhrictionTransaction::TYPE_CONTENT: $this->getNewContent()->setContent($xaction->getNewValue()); break; + case PhrictionTransaction::TYPE_DELETE: + $this->getNewContent()->setContent(''); + $this->getNewContent()->setChangeType( + PhrictionChangeType::CHANGE_DELETE); + break; default: break; } @@ -145,6 +155,7 @@ switch ($xaction->getTransactionType()) { case PhrictionTransaction::TYPE_TITLE: case PhrictionTransaction::TYPE_CONTENT: + case PhrictionTransaction::TYPE_DELETE: $save_content = true; break; default: @@ -213,6 +224,8 @@ pht("A document's title changes."), PhrictionTransaction::MAILTAG_CONTENT => pht("A document's content changes."), + PhrictionTransaction::MAILTAG_DELETE => + pht('A document is deleted.'), ); } @@ -279,14 +292,12 @@ private function buildNewContentTemplate( PhrictionDocument $document) { - $new_content = new PhrictionContent(); - $new_content->setSlug($document->getSlug()); - $new_content->setAuthorPHID($this->getActor()->getPHID()); - $new_content->setChangeType(PhrictionChangeType::CHANGE_EDIT); - - $new_content->setTitle($this->getOldContent()->getTitle()); - $new_content->setContent($this->getOldContent()->getContent()); - + $new_content = id(new PhrictionContent()) + ->setSlug($document->getSlug()) + ->setAuthorPHID($this->getActor()->getPHID()) + ->setChangeType(PhrictionChangeType::CHANGE_EDIT) + ->setTitle($this->getOldContent()->getTitle()) + ->setContent($this->getOldContent()->getContent()); if (strlen($this->getDescription())) { $new_content->setDescription($this->getDescription()); } diff --git a/src/applications/phriction/storage/PhrictionTransaction.php b/src/applications/phriction/storage/PhrictionTransaction.php --- a/src/applications/phriction/storage/PhrictionTransaction.php +++ b/src/applications/phriction/storage/PhrictionTransaction.php @@ -5,9 +5,11 @@ const TYPE_TITLE = 'title'; const TYPE_CONTENT = 'content'; + const TYPE_DELETE = 'delete'; const MAILTAG_TITLE = 'phriction-title'; const MAILTAG_CONTENT = 'phriction-content'; + const MAILTAG_DELETE = 'phriction-delete'; public function getApplicationName() { return 'phriction'; @@ -53,6 +55,8 @@ return 1.4; case self::TYPE_CONTENT: return 1.3; + case self::TYPE_DELETE: + return 1.5; } return parent::getActionStrength(); @@ -73,6 +77,9 @@ case self::TYPE_CONTENT: return pht('Edited'); + case self::TYPE_DELETE: + return pht('Deleted'); + } return parent::getActionName(); @@ -86,13 +93,14 @@ case self::TYPE_TITLE: case self::TYPE_CONTENT: return 'fa-pencil'; + case self::TYPE_DELETE: + return 'fa-times'; } return parent::getIcon(); } - public function getTitle() { $author_phid = $this->getAuthorPHID(); @@ -117,6 +125,12 @@ '%s edited the document content.', $this->renderHandleLink($author_phid)); + case self::TYPE_DELETE: + return pht( + '%s deleted this document.', + $this->renderHandleLink($author_phid)); + + } return parent::getTitle(); @@ -151,6 +165,12 @@ $this->renderHandleLink($author_phid), $this->renderHandleLink($object_phid)); + case self::TYPE_DELETE: + return pht( + '%s deleted %s.', + $this->renderHandleLink($author_phid), + $this->renderHandleLink($object_phid)); + } return parent::getTitleForFeed($story); } @@ -179,6 +199,10 @@ case self::TYPE_CONTENT: $tags[] = self::MAILTAG_CONTENT; break; + case self::TYPE_DELETE: + $tags[] = self::MAILTAG_DELETE; + break; + } return $tags; }