Page MenuHomePhabricator

D10763.diff
No OneTemporary

D10763.diff

diff --git a/src/applications/phriction/controller/PhrictionMoveController.php b/src/applications/phriction/controller/PhrictionMoveController.php
--- a/src/applications/phriction/controller/PhrictionMoveController.php
+++ b/src/applications/phriction/controller/PhrictionMoveController.php
@@ -16,6 +16,7 @@
$document = id(new PhrictionDocumentQuery())
->setViewer($user)
->withIDs(array($this->id))
+ ->needContent(true)
->requireCapabilities(
array(
PhabricatorPolicyCapability::CAN_VIEW,
@@ -32,6 +33,7 @@
$document = id(new PhrictionDocumentQuery())
->setViewer($user)
->withSlugs(array($slug))
+ ->needContent(true)
->requireCapabilities(
array(
PhabricatorPolicyCapability::CAN_VIEW,
@@ -74,50 +76,46 @@
return id(new AphrontDialogResponse())->setDialog($error_dialog);
}
- $content = id(new PhrictionContent())->load($document->getContentID());
+ $content = $document->getContent();
if ($request->isFormPost() && !count($errors)) {
- if (!count($errors)) { // First check if the target document exists
- // NOTE: We use the ominpotent user because we can't let users overwrite
- // documents even if they can't see them.
- $target_document = id(new PhrictionDocumentQuery())
- ->setViewer(PhabricatorUser::getOmnipotentUser())
- ->withSlugs(array($target_slug))
- ->executeOne();
-
- // Considering to overwrite existing docs? Nuke this!
- if ($target_document && $target_document->getStatus() ==
- PhrictionDocumentStatus::STATUS_EXISTS) {
+ // NOTE: We use the ominpotent user because we can't let users overwrite
+ // documents even if they can't see them.
+ $target_document = id(new PhrictionDocumentQuery())
+ ->setViewer(PhabricatorUser::getOmnipotentUser())
+ ->withSlugs(array($target_slug))
+ ->needContent(true)
+ ->executeOne();
- $errors[] = pht('Can not overwrite existing target document.');
- $e_url = pht('Already exists.');
- }
+ // Considering to overwrite existing docs? Nuke this!
+ $exists = PhrictionDocumentStatus::STATUS_EXISTS;
+ if ($target_document && $target_document->getStatus() == $exists) {
+ $errors[] = pht('Can not overwrite existing target document.');
+ $e_url = pht('Already exists.');
}
- if (!count($errors)) { // I like to move it, move it!
- $from_editor = id(PhrictionDocumentEditor::newForSlug($slug))
- ->setActor($user)
- ->setTitle($content->getTitle())
- ->setContent($content->getContent())
- ->setDescription($content->getDescription());
+ if (!count($errors)) {
- $target_editor = id(PhrictionDocumentEditor::newForSlug(
- $target_slug))
+ $editor = id(new PhrictionTransactionEditor())
->setActor($user)
- ->setTitle($content->getTitle())
- ->setContent($content->getContent())
- ->setDescription($content->getDescription());
-
- // Move it!
- $target_editor->moveHere($document->getID(), $document->getPHID());
-
- // Retrieve the target doc directly from the editor
- // No need to load it per Sql again
- $target_document = $target_editor->getDocument();
- $from_editor->moveAway($target_document->getID());
+ ->setContentSourceFromRequest($request)
+ ->setContinueOnNoEffect(true)
+ ->setDescription($request->getStr('description'));
+
+ $xactions = array();
+ $xactions[] = id(new PhrictionTransaction())
+ ->setTransactionType(PhrictionTransaction::TYPE_MOVE_TO)
+ ->setNewValue($document);
+ if (!$target_document) {
+ $target_document = PhrictionDocument::initializeNewDocument(
+ $user,
+ $target_slug);
+ }
+ $editor->applyTransactions($target_document, $xactions);
- $redir_uri = PhrictionDocument::getSlugURI($target_document->getSlug());
+ $redir_uri = PhrictionDocument::getSlugURI(
+ $target_document->getSlug());
return id(new AphrontRedirectResponse())->setURI($redir_uri);
}
}
@@ -131,21 +129,21 @@
->setUser($user)
->appendChild(
id(new AphrontFormStaticControl())
- ->setLabel(pht('Title'))
- ->setValue($content->getTitle()))
+ ->setLabel(pht('Title'))
+ ->setValue($content->getTitle()))
->appendChild(
id(new AphrontFormTextControl())
- ->setLabel(pht('New URI'))
- ->setValue($target_slug)
- ->setError($e_url)
- ->setName('new-slug')
- ->setCaption(pht('The new location of the document.')))
+ ->setLabel(pht('New URI'))
+ ->setValue($target_slug)
+ ->setError($e_url)
+ ->setName('new-slug')
+ ->setCaption(pht('The new location of the document.')))
->appendChild(
id(new AphrontFormTextControl())
- ->setLabel(pht('Edit Notes'))
- ->setValue($content->getDescription())
- ->setError(null)
- ->setName('description'));
+ ->setLabel(pht('Edit Notes'))
+ ->setValue($content->getDescription())
+ ->setError(null)
+ ->setName('description'));
$dialog = id(new AphrontDialogView())
->setUser($user)
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
@@ -6,6 +6,7 @@
private $description;
private $oldContent;
private $newContent;
+ private $moveAwayDocument;
public function setDescription($description) {
$this->description = $description;
@@ -49,6 +50,8 @@
$types[] = PhrictionTransaction::TYPE_TITLE;
$types[] = PhrictionTransaction::TYPE_CONTENT;
$types[] = PhrictionTransaction::TYPE_DELETE;
+ $types[] = PhrictionTransaction::TYPE_MOVE_TO;
+ $types[] = PhrictionTransaction::TYPE_MOVE_AWAY;
/* TODO
$types[] = PhabricatorTransactions::TYPE_VIEW_POLICY;
@@ -74,6 +77,8 @@
}
return $this->getOldContent()->getContent();
case PhrictionTransaction::TYPE_DELETE:
+ case PhrictionTransaction::TYPE_MOVE_TO:
+ case PhrictionTransaction::TYPE_MOVE_AWAY:
return null;
}
}
@@ -87,6 +92,22 @@
case PhrictionTransaction::TYPE_CONTENT:
case PhrictionTransaction::TYPE_DELETE:
return $xaction->getNewValue();
+ case PhrictionTransaction::TYPE_MOVE_TO:
+ $document = $xaction->getNewValue();
+ // grab the real object now for the sub-editor to come
+ $this->moveAwayDocument = $document;
+ $dict = array(
+ 'id' => $document->getID(),
+ 'phid' => $document->getPHID(),
+ 'content' => $document->getContent()->getContent(),);
+ return $dict;
+ case PhrictionTransaction::TYPE_MOVE_AWAY:
+ $document = $xaction->getNewValue();
+ $dict = array(
+ 'id' => $document->getID(),
+ 'phid' => $document->getPHID(),
+ 'content' => $document->getContent()->getContent(),);
+ return $dict;
}
}
@@ -99,6 +120,8 @@
case PhrictionTransaction::TYPE_TITLE:
case PhrictionTransaction::TYPE_CONTENT:
case PhrictionTransaction::TYPE_DELETE:
+ case PhrictionTransaction::TYPE_MOVE_TO:
+ case PhrictionTransaction::TYPE_MOVE_AWAY:
return true;
}
}
@@ -120,8 +143,12 @@
switch ($xaction->getTransactionType()) {
case PhrictionTransaction::TYPE_TITLE:
case PhrictionTransaction::TYPE_CONTENT:
+ case PhrictionTransaction::TYPE_MOVE_TO:
$object->setStatus(PhrictionDocumentStatus::STATUS_EXISTS);
return;
+ case PhrictionTransaction::TYPE_MOVE_AWAY:
+ $object->setStatus(PhrictionDocumentStatus::STATUS_MOVED);
+ return;
}
}
@@ -141,6 +168,20 @@
$this->getNewContent()->setChangeType(
PhrictionChangeType::CHANGE_DELETE);
break;
+ case PhrictionTransaction::TYPE_MOVE_TO:
+ $dict = $xaction->getNewValue();
+ $this->getNewContent()->setContent($dict['content']);
+ $this->getNewContent()->setChangeType(
+ PhrictionChangeType::CHANGE_MOVE_HERE);
+ $this->getNewContent()->setChangeRef($dict['id']);
+ break;
+ case PhrictionTransaction::TYPE_MOVE_AWAY:
+ $dict = $xaction->getNewValue();
+ $this->getNewContent()->setContent('');
+ $this->getNewContent()->setChangeType(
+ PhrictionChangeType::CHANGE_MOVE_AWAY);
+ $this->getNewContent()->setChangeRef($dict['id']);
+ break;
default:
break;
}
@@ -156,6 +197,8 @@
case PhrictionTransaction::TYPE_TITLE:
case PhrictionTransaction::TYPE_CONTENT:
case PhrictionTransaction::TYPE_DELETE:
+ case PhrictionTransaction::TYPE_MOVE_AWAY:
+ case PhrictionTransaction::TYPE_MOVE_TO:
$save_content = true;
break;
default:
@@ -196,15 +239,27 @@
}
}
}
+
+ if ($this->moveAwayDocument !== null) {
+ $move_away_xactions = array();
+ $move_away_xactions[] = id(new PhrictionTransaction())
+ ->setTransactionType(PhrictionTransaction::TYPE_MOVE_AWAY)
+ ->setNewValue($object);
+ $sub_editor = id(new PhrictionTransactionEditor())
+ ->setActor($this->getActor())
+ ->setContentSource($this->getContentSource())
+ ->setContinueOnNoEffect($this->getContinueOnNoEffect())
+ ->setDescription($this->getDescription())
+ ->applyTransactions($this->moveAwayDocument, $move_away_xactions);
+ }
+
return $xactions;
}
protected function shouldSendMail(
PhabricatorLiskDAO $object,
array $xactions) {
-
- $xactions = mfilter($xactions, 'shouldHide', true);
- return $xactions;
+ return true;
}
protected function getMailSubjectPrefix() {
@@ -274,8 +329,16 @@
array $xactions) {
$phids = parent::getFeedRelatedPHIDs($object, $xactions);
- // TODO - once the editor supports moves, we'll need to surface the
- // "from document phid" to related phids.
+
+ foreach ($xactions as $xaction) {
+ switch ($xaction->getTransactionType()) {
+ case PhrictionTransaction::TYPE_MOVE_TO:
+ $dict = $xaction->getNewValue();
+ $phids[] = $dict['phid'];
+ break;
+ }
+ }
+
return $phids;
}
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
@@ -6,6 +6,8 @@
const TYPE_TITLE = 'title';
const TYPE_CONTENT = 'content';
const TYPE_DELETE = 'delete';
+ const TYPE_MOVE_TO = 'move-to';
+ const TYPE_MOVE_AWAY = 'move-away';
const MAILTAG_TITLE = 'phriction-title';
const MAILTAG_CONTENT = 'phriction-content';
@@ -23,6 +25,20 @@
return new PhrictionTransactionComment();
}
+ public function getRequiredHandlePHIDs() {
+ $phids = parent::getRequiredHandlePHIDs();
+ $new = $this->getNewValue();
+ switch ($this->getTransactionType()) {
+ case self::TYPE_MOVE_TO:
+ case self::TYPE_MOVE_AWAY:
+ $phids[] = $new['phid'];
+ break;
+ }
+
+
+ return $phids;
+ }
+
public function getRemarkupBlocks() {
$blocks = parent::getRemarkupBlocks();
@@ -49,6 +65,24 @@
return parent::shouldHide();
}
+ public function shouldHideForMail(array $xactions) {
+ switch ($this->getTransactionType()) {
+ case self::TYPE_MOVE_TO:
+ case self::TYPE_MOVE_AWAY:
+ return true;
+ }
+ return parent::shouldHideForMail($xactions);
+ }
+
+ public function shouldHideForFeed() {
+ switch ($this->getTransactionType()) {
+ case self::TYPE_MOVE_TO:
+ case self::TYPE_MOVE_AWAY:
+ return true;
+ }
+ return parent::shouldHideForFeed();
+ }
+
public function getActionStrength() {
switch ($this->getTransactionType()) {
case self::TYPE_TITLE:
@@ -57,6 +91,9 @@
return 1.3;
case self::TYPE_DELETE:
return 1.5;
+ case self::TYPE_MOVE_TO:
+ case self::TYPE_MOVE_AWAY:
+ return 1.0;
}
return parent::getActionStrength();
@@ -80,6 +117,12 @@
case self::TYPE_DELETE:
return pht('Deleted');
+ case self::TYPE_MOVE_TO:
+ return pht('Moved');
+
+ case self::TYPE_MOVE_AWAY:
+ return pht('Moved Away');
+
}
return parent::getActionName();
@@ -95,6 +138,9 @@
return 'fa-pencil';
case self::TYPE_DELETE:
return 'fa-times';
+ case self::TYPE_MOVE_TO:
+ case self::TYPE_MOVE_AWAY:
+ return 'fa-arrows';
}
return parent::getIcon();
@@ -130,6 +176,17 @@
'%s deleted this document.',
$this->renderHandleLink($author_phid));
+ case self::TYPE_MOVE_TO:
+ return pht(
+ '%s moved this document from %s',
+ $this->renderHandleLink($author_phid),
+ $this->renderHandleLink($new['phid']));
+
+ case self::TYPE_MOVE_AWAY:
+ return pht(
+ '%s moved this document to %s',
+ $this->renderHandleLink($author_phid),
+ $this->renderHandleLink($new['phid']));
}

File Metadata

Mime Type
text/plain
Expires
Thu, Mar 6, 6:05 AM (5 d, 18 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7230073
Default Alt Text
D10763.diff (13 KB)

Event Timeline