Page MenuHomePhabricator

D13894.id33542.diff
No OneTemporary

D13894.id33542.diff

diff --git a/resources/sql/autopatches/20150812.ponder.answer.1.sql b/resources/sql/autopatches/20150812.ponder.answer.1.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20150812.ponder.answer.1.sql
@@ -0,0 +1,2 @@
+ALTER TABLE {$NAMESPACE}_ponder.ponder_answer
+ ADD status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT};
diff --git a/resources/sql/autopatches/20150812.ponder.answer.2.sql b/resources/sql/autopatches/20150812.ponder.answer.2.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20150812.ponder.answer.2.sql
@@ -0,0 +1,2 @@
+UPDATE {$NAMESPACE}_ponder.ponder_answer
+ SET status = 'visible' WHERE status = '';
diff --git a/src/applications/ponder/constants/PonderQuestionStatus.php b/src/applications/ponder/constants/PonderQuestionStatus.php
--- a/src/applications/ponder/constants/PonderQuestionStatus.php
+++ b/src/applications/ponder/constants/PonderQuestionStatus.php
@@ -7,6 +7,9 @@
const STATUS_CLOSED_OBSOLETE = 'obsolete';
const STATUS_CLOSED_DUPLICATE = 'duplicate';
+ const ANSWER_STATUS_VISIBLE = 'visible';
+ const ANSWER_STATUS_HIDDEN = 'hidden';
+
public static function getQuestionStatusMap() {
return array(
self::STATUS_OPEN => pht('Open'),
@@ -86,5 +89,20 @@
);
}
+ public static function getAnswerStatusMap() {
+ return array(
+ self::ANSWER_STATUS_VISIBLE => pht('Visible'),
+ self::ANSWER_STATUS_HIDDEN => pht('Hidden'),
+ );
+ }
+
+ public static function getAnswerStatusName($status) {
+ $map = array(
+ self::ANSWER_STATUS_VISIBLE => pht('Visible'),
+ self::ANSWER_STATUS_HIDDEN => pht('Hidden'),
+ );
+ return idx($map, $status, pht('Unknown'));
+ }
+
}
diff --git a/src/applications/ponder/controller/PonderAnswerEditController.php b/src/applications/ponder/controller/PonderAnswerEditController.php
--- a/src/applications/ponder/controller/PonderAnswerEditController.php
+++ b/src/applications/ponder/controller/PonderAnswerEditController.php
@@ -20,6 +20,7 @@
}
$v_content = $answer->getContent();
+ $v_status = $answer->getStatus();
$e_content = true;
@@ -31,6 +32,7 @@
$errors = array();
if ($request->isFormPost()) {
$v_content = $request->getStr('content');
+ $v_status = $request->getStr('status');
if (!strlen($v_content)) {
$errors[] = pht('You must provide some substance in your answer.');
@@ -43,6 +45,10 @@
->setTransactionType(PonderAnswerTransaction::TYPE_CONTENT)
->setNewValue($v_content);
+ $xactions[] = id(new PonderAnswerTransaction())
+ ->setTransactionType(PonderAnswerTransaction::TYPE_STATUS)
+ ->setNewValue($v_status);
+
$editor = id(new PonderAnswerEditor())
->setActor($viewer)
->setContentSourceFromRequest($request)
@@ -64,6 +70,12 @@
->setLabel(pht('Question'))
->setValue($question->getTitle()))
->appendChild(
+ id(new AphrontFormSelectControl())
+ ->setLabel(pht('Status'))
+ ->setName('status')
+ ->setValue($v_status)
+ ->setOptions(PonderQuestionStatus::getAnswerStatusMap()))
+ ->appendChild(
id(new PhabricatorRemarkupControl())
->setUser($viewer)
->setLabel(pht('Answer'))
@@ -73,7 +85,7 @@
->setError($e_content))
->appendChild(
id(new AphrontFormSubmitControl())
- ->setValue(pht('Update Answer'))
+ ->setValue(pht('Submit'))
->addCancelButton($answer_uri));
$crumbs = $this->buildApplicationCrumbs();
diff --git a/src/applications/ponder/editor/PonderAnswerEditor.php b/src/applications/ponder/editor/PonderAnswerEditor.php
--- a/src/applications/ponder/editor/PonderAnswerEditor.php
+++ b/src/applications/ponder/editor/PonderAnswerEditor.php
@@ -12,6 +12,7 @@
$types[] = PhabricatorTransactions::TYPE_COMMENT;
$types[] = PonderAnswerTransaction::TYPE_CONTENT;
+ $types[] = PonderAnswerTransaction::TYPE_STATUS;
$types[] = PonderAnswerTransaction::TYPE_QUESTION_ID;
return $types;
@@ -23,6 +24,7 @@
switch ($xaction->getTransactionType()) {
case PonderAnswerTransaction::TYPE_CONTENT:
+ case PonderAnswerTransaction::TYPE_STATUS:
return $object->getContent();
case PonderAnswerTransaction::TYPE_QUESTION_ID:
return $object->getQuestionID();
@@ -35,6 +37,7 @@
switch ($xaction->getTransactionType()) {
case PonderAnswerTransaction::TYPE_CONTENT:
+ case PonderAnswerTransaction::TYPE_STATUS:
case PonderAnswerTransaction::TYPE_QUESTION_ID:
return $xaction->getNewValue();
}
@@ -48,6 +51,9 @@
case PonderAnswerTransaction::TYPE_CONTENT:
$object->setContent($xaction->getNewValue());
break;
+ case PonderAnswerTransaction::TYPE_STATUS:
+ $object->setStatus($xaction->getNewValue());
+ break;
case PonderAnswerTransaction::TYPE_QUESTION_ID:
$object->setQuestionID($xaction->getNewValue());
break;
diff --git a/src/applications/ponder/storage/PonderAnswer.php b/src/applications/ponder/storage/PonderAnswer.php
--- a/src/applications/ponder/storage/PonderAnswer.php
+++ b/src/applications/ponder/storage/PonderAnswer.php
@@ -17,8 +17,9 @@
protected $content;
protected $mailKey;
-
+ protected $status;
protected $voteCount;
+
private $vote;
private $question = self::ATTACHABLE;
private $comments;
@@ -35,7 +36,8 @@
->setQuestionID(0)
->setContent('')
->setAuthorPHID($actor->getPHID())
- ->setVoteCount(0);
+ ->setVoteCount(0)
+ ->setStatus(PonderQuestionStatus::ANSWER_STATUS_VISIBLE);
}
@@ -84,6 +86,7 @@
self::CONFIG_COLUMN_SCHEMA => array(
'voteCount' => 'sint32',
'content' => 'text',
+ 'status' => 'text32',
'mailKey' => 'bytes20',
),
self::CONFIG_KEY_SCHEMA => array(
@@ -102,6 +105,9 @@
'authorPHID' => array(
'columns' => array('authorPHID'),
),
+ 'status' => array(
+ 'columns' => array('status'),
+ ),
),
) + parent::getConfiguration();
}
diff --git a/src/applications/ponder/storage/PonderAnswerTransaction.php b/src/applications/ponder/storage/PonderAnswerTransaction.php
--- a/src/applications/ponder/storage/PonderAnswerTransaction.php
+++ b/src/applications/ponder/storage/PonderAnswerTransaction.php
@@ -4,6 +4,7 @@
extends PhabricatorApplicationTransaction {
const TYPE_CONTENT = 'ponder.answer:content';
+ const TYPE_STATUS = 'ponder.answer:status';
const TYPE_QUESTION_ID = 'ponder.answer:question-id';
public function getApplicationName() {
@@ -27,6 +28,7 @@
switch ($this->getTransactionType()) {
case self::TYPE_CONTENT:
+ case self::TYPE_STATUS:
$phids[] = $this->getObjectPHID();
break;
}
@@ -39,6 +41,7 @@
switch ($this->getTransactionType()) {
case self::TYPE_CONTENT:
+ case self::TYPE_STATUS:
$blocks[] = $this->getNewValue();
break;
}
@@ -75,6 +78,19 @@
$this->renderHandleLink($object_phid));
}
break;
+ case self::TYPE_STATUS:
+ if ($old === '') {
+ return pht(
+ '%s marked %s as visible.',
+ $this->renderHandleLink($author_phid),
+ $this->renderHandleLink($object_phid));
+ } else {
+ return pht(
+ '%s marked %s as hidden.',
+ $this->renderHandleLink($author_phid),
+ $this->renderHandleLink($object_phid));
+ }
+ break;
}
return parent::getTitle();
@@ -101,6 +117,19 @@
$this->renderHandleLink($object_phid));
}
break;
+ case self::TYPE_STATUS:
+ if ($old === '') {
+ return pht(
+ '%s added %s.',
+ $this->renderHandleLink($author_phid),
+ $this->renderHandleLink($object_phid));
+ } else {
+ return pht(
+ '%s updated %s.',
+ $this->renderHandleLink($author_phid),
+ $this->renderHandleLink($object_phid));
+ }
+ break;
}
return parent::getTitleForFeed();
diff --git a/src/applications/ponder/view/PonderAnswerView.php b/src/applications/ponder/view/PonderAnswerView.php
--- a/src/applications/ponder/view/PonderAnswerView.php
+++ b/src/applications/ponder/view/PonderAnswerView.php
@@ -31,8 +31,37 @@
require_celerity_resource('ponder-view-css');
$answer = $this->answer;
$viewer = $this->getUser();
+ $status = $answer->getStatus();
$author_phid = $answer->getAuthorPHID();
$actions = $this->buildAnswerActions();
+ $id = $answer->getID();
+
+ if ($status == PonderQuestionStatus::ANSWER_STATUS_HIDDEN) {
+ $can_edit = PhabricatorPolicyFilter::hasCapability(
+ $viewer,
+ $answer,
+ PhabricatorPolicyCapability::CAN_EDIT);
+
+ $message = array();
+ $message[] = phutil_tag(
+ 'em',
+ array(),
+ pht('This answer has been hidden.'));
+
+ if ($can_edit) {
+ $message[] = phutil_tag(
+ 'a',
+ array(
+ 'href' => "/ponder/answer/edit/{$id}/",
+ ),
+ pht('Edit Answer'));
+ }
+ $message = phutil_implode_html(' ', $message);
+
+ return id(new PHUIInfoView())
+ ->setSeverity(PHUIInfoView::SEVERITY_NODATA)
+ ->appendChild($message);
+ }
$action_button = id(new PHUIButtonView())
->setTag('a')
@@ -57,7 +86,6 @@
$answer->getMarkupField(),
$viewer));
- $id = $answer->getID();
$anchor = id(new PhabricatorAnchorView())
->setAnchorName("A$id");

File Metadata

Mime Type
text/plain
Expires
Sun, Mar 16, 3:32 AM (3 w, 2 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7705503
Default Alt Text
D13894.id33542.diff (9 KB)

Event Timeline