Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15422308
D12163.id29257.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
30 KB
Referenced Files
None
Subscribers
None
D12163.id29257.diff
View Options
diff --git a/resources/celerity/map.php b/resources/celerity/map.php
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -353,7 +353,7 @@
'rsrc/js/application/auth/behavior-persona-login.js' => '9414ff18',
'rsrc/js/application/config/behavior-reorder-fields.js' => '14a827de',
'rsrc/js/application/conpherence/ConpherenceThreadManager.js' => 'bb928342',
- 'rsrc/js/application/conpherence/behavior-durable-column.js' => 'eedc463c',
+ 'rsrc/js/application/conpherence/behavior-durable-column.js' => '70787038',
'rsrc/js/application/conpherence/behavior-menu.js' => 'de5579b4',
'rsrc/js/application/conpherence/behavior-pontificate.js' => '21ba5861',
'rsrc/js/application/conpherence/behavior-quicksand-blacklist.js' => '7927a7d3',
@@ -583,7 +583,7 @@
'javelin-behavior-diffusion-locate-file' => '6d3e1947',
'javelin-behavior-diffusion-pull-lastmodified' => '2b228192',
'javelin-behavior-doorkeeper-tag' => 'e5822781',
- 'javelin-behavior-durable-column' => 'eedc463c',
+ 'javelin-behavior-durable-column' => '70787038',
'javelin-behavior-error-log' => '6882e80a',
'javelin-behavior-fancy-datepicker' => 'c51ae228',
'javelin-behavior-global-drag-and-drop' => 'bbdf75ca',
@@ -1324,6 +1324,16 @@
'6f7a9da8' => array(
'javelin-install',
),
+ 70787038 => array(
+ 'javelin-behavior',
+ 'javelin-dom',
+ 'javelin-stratcom',
+ 'javelin-behavior-device',
+ 'javelin-scrollbar',
+ 'javelin-quicksand',
+ 'phabricator-keyboard-shortcut',
+ 'conpherence-thread-manager',
+ ),
'70baed2f' => array(
'javelin-install',
'javelin-dom',
@@ -1899,16 +1909,6 @@
'phabricator-phtize',
'javelin-dom',
),
- 'eedc463c' => array(
- 'javelin-behavior',
- 'javelin-dom',
- 'javelin-stratcom',
- 'javelin-behavior-device',
- 'javelin-scrollbar',
- 'javelin-quicksand',
- 'phabricator-keyboard-shortcut',
- 'conpherence-thread-manager',
- ),
'efe49472' => array(
'javelin-install',
'javelin-util',
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -249,14 +249,17 @@
'ConpherenceQueryTransactionConduitAPIMethod' => 'applications/conpherence/conduit/ConpherenceQueryTransactionConduitAPIMethod.php',
'ConpherenceReplyHandler' => 'applications/conpherence/mail/ConpherenceReplyHandler.php',
'ConpherenceRoomListController' => 'applications/conpherence/controller/ConpherenceRoomListController.php',
+ 'ConpherenceRoomTestCase' => 'applications/conpherence/__tests__/ConpherenceRoomTestCase.php',
'ConpherenceSchemaSpec' => 'applications/conpherence/storage/ConpherenceSchemaSpec.php',
'ConpherenceSettings' => 'applications/conpherence/constants/ConpherenceSettings.php',
+ 'ConpherenceTestCase' => 'applications/conpherence/__tests__/ConpherenceTestCase.php',
'ConpherenceThread' => 'applications/conpherence/storage/ConpherenceThread.php',
'ConpherenceThreadIndexer' => 'applications/conpherence/search/ConpherenceThreadIndexer.php',
'ConpherenceThreadListView' => 'applications/conpherence/view/ConpherenceThreadListView.php',
'ConpherenceThreadMailReceiver' => 'applications/conpherence/mail/ConpherenceThreadMailReceiver.php',
'ConpherenceThreadQuery' => 'applications/conpherence/query/ConpherenceThreadQuery.php',
'ConpherenceThreadSearchEngine' => 'applications/conpherence/query/ConpherenceThreadSearchEngine.php',
+ 'ConpherenceThreadTestCase' => 'applications/conpherence/__tests__/ConpherenceThreadTestCase.php',
'ConpherenceTransaction' => 'applications/conpherence/storage/ConpherenceTransaction.php',
'ConpherenceTransactionComment' => 'applications/conpherence/storage/ConpherenceTransactionComment.php',
'ConpherenceTransactionQuery' => 'applications/conpherence/query/ConpherenceTransactionQuery.php',
@@ -3414,8 +3417,10 @@
'ConpherenceQueryTransactionConduitAPIMethod' => 'ConpherenceConduitAPIMethod',
'ConpherenceReplyHandler' => 'PhabricatorMailReplyHandler',
'ConpherenceRoomListController' => 'ConpherenceController',
+ 'ConpherenceRoomTestCase' => 'ConpherenceTestCase',
'ConpherenceSchemaSpec' => 'PhabricatorConfigSchemaSpec',
'ConpherenceSettings' => 'ConpherenceConstants',
+ 'ConpherenceTestCase' => 'PhabricatorTestCase',
'ConpherenceThread' => array(
'ConpherenceDAO',
'PhabricatorPolicyInterface',
@@ -3425,6 +3430,7 @@
'ConpherenceThreadMailReceiver' => 'PhabricatorObjectMailReceiver',
'ConpherenceThreadQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'ConpherenceThreadSearchEngine' => 'PhabricatorApplicationSearchEngine',
+ 'ConpherenceThreadTestCase' => 'ConpherenceTestCase',
'ConpherenceTransaction' => 'PhabricatorApplicationTransaction',
'ConpherenceTransactionComment' => 'PhabricatorApplicationTransactionComment',
'ConpherenceTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
diff --git a/src/applications/conpherence/__tests__/ConpherenceRoomTestCase.php b/src/applications/conpherence/__tests__/ConpherenceRoomTestCase.php
new file mode 100644
--- /dev/null
+++ b/src/applications/conpherence/__tests__/ConpherenceRoomTestCase.php
@@ -0,0 +1,144 @@
+<?php
+
+final class ConpherenceRoomTestCase extends ConpherenceTestCase {
+
+ protected function getPhabricatorTestCaseConfiguration() {
+ return array(
+ self::PHABRICATOR_TESTCONFIG_BUILD_STORAGE_FIXTURES => true,
+ );
+ }
+
+ public function testOneUserRoomCreate() {
+ $creator = $this->generateNewTestUser();
+ $participant_phids = array($creator->getPHID());
+
+ $conpherence = $this->createRoom($creator, $participant_phids);
+
+ $this->assertTrue((bool)$conpherence->getID());
+ $this->assertEqual(1, count($conpherence->getParticipants()));
+ $this->assertEqual(
+ $participant_phids,
+ $conpherence->getRecentParticipantPHIDs());
+ }
+
+ public function testNUserRoomCreate() {
+ $creator = $this->generateNewTestUser();
+ $friend_1 = $this->generateNewTestUser();
+ $friend_2 = $this->generateNewTestUser();
+ $friend_3 = $this->generateNewTestUser();
+
+ $participant_phids = array(
+ $creator->getPHID(),
+ $friend_1->getPHID(),
+ $friend_2->getPHID(),
+ $friend_3->getPHID(),
+ );
+
+ $conpherence = $this->createRoom($creator, $participant_phids);
+
+ $this->assertTrue((bool)$conpherence->getID());
+ $this->assertEqual(4, count($conpherence->getParticipants()));
+ $this->assertEqual(
+ $participant_phids,
+ $conpherence->getRecentParticipantPHIDs());
+ }
+
+ public function testRoomParticipantAddition() {
+ $creator = $this->generateNewTestUser();
+ $friend_1 = $this->generateNewTestUser();
+ $friend_2 = $this->generateNewTestUser();
+ $friend_3 = $this->generateNewTestUser();
+
+ $participant_phids = array(
+ $creator->getPHID(),
+ $friend_1->getPHID(),
+ );
+
+ $conpherence = $this->createRoom($creator, $participant_phids);
+
+ $this->assertTrue((bool)$conpherence->getID());
+ $this->assertEqual(2, count($conpherence->getParticipants()));
+ $this->assertEqual(
+ $participant_phids,
+ $conpherence->getRecentParticipantPHIDs());
+
+ // test add by creator
+ $participant_phids[] = $friend_2->getPHID();
+ $this->addParticipants($creator, $conpherence, array($friend_2->getPHID()));
+ $this->assertEqual(
+ $participant_phids,
+ $conpherence->getRecentParticipantPHIDs());
+
+ // test policy error as another user tries to add
+ $caught = null;
+ try {
+ $this->addParticipants(
+ $friend_2,
+ $conpherence,
+ array($friend_3->getPHID()));
+ } catch (PhabricatorPolicyException $ex) {
+ $caught = $ex;
+ }
+ $this->assertTrue($caught instanceof PhabricatorPolicyException);
+
+ // update edit policy so user has a chance
+ $this->changeEditPolicy($creator, $conpherence, 'users');
+ // test add by other participant, so recent participation should
+ // meaningfully change
+ $participant_phids = array(
+ $friend_2->getPHID(), // actor
+ $creator->getPHID(), // last actor
+ $friend_1->getPHID(),
+ $friend_3->getPHID(), // new addition
+ );
+ $this->addParticipants(
+ $friend_2,
+ $conpherence,
+ array($friend_3->getPHID()));
+ $this->assertEqual(
+ $participant_phids,
+ $conpherence->getRecentParticipantPHIDs());
+ }
+
+ private function createRoom(
+ PhabricatorUser $creator,
+ array $participant_phids) {
+
+ $conpherence = ConpherenceThread::initializeNewRoom($creator);
+
+ $xactions = array();
+ $xactions[] = id(new ConpherenceTransaction())
+ ->setTransactionType(ConpherenceTransactionType::TYPE_PARTICIPANTS)
+ ->setNewValue(array('+' => $participant_phids));
+ $xactions[] = id(new ConpherenceTransaction())
+ ->setTransactionType(ConpherenceTransactionType::TYPE_TITLE)
+ ->setNewValue('Test');
+
+ id(new ConpherenceEditor())
+ ->setActor($creator)
+ ->setContentSource(PhabricatorContentSource::newConsoleSource())
+ ->setContinueOnNoEffect(true)
+ ->applyTransactions($conpherence, $xactions);
+
+ return $conpherence;
+ }
+
+ private function changeEditPolicy(
+ PhabricatorUser $actor,
+ ConpherenceThread $room,
+ $policy) {
+
+ $xactions = array();
+ $xactions[] = id(new ConpherenceTransaction())
+ ->setTransactionType(PhabricatorTransactions::TYPE_EDIT_POLICY)
+ ->setNewValue($policy);
+
+ id(new ConpherenceEditor())
+ ->setActor($actor)
+ ->setContentSource(PhabricatorContentSource::newConsoleSource())
+ ->setContinueOnNoEffect(true)
+ ->applyTransactions($room, $xactions);
+ }
+
+
+}
diff --git a/src/applications/conpherence/__tests__/ConpherenceTestCase.php b/src/applications/conpherence/__tests__/ConpherenceTestCase.php
new file mode 100644
--- /dev/null
+++ b/src/applications/conpherence/__tests__/ConpherenceTestCase.php
@@ -0,0 +1,20 @@
+<?php
+
+abstract class ConpherenceTestCase extends PhabricatorTestCase {
+
+ protected function addParticipants(
+ PhabricatorUser $actor,
+ ConpherenceThread $conpherence,
+ array $participant_phids) {
+
+ $xactions = array(id(new ConpherenceTransaction())
+ ->setTransactionType(ConpherenceTransactionType::TYPE_PARTICIPANTS)
+ ->setNewValue(array('+' => $participant_phids)),);
+ $editor = id(new ConpherenceEditor())
+ ->setActor($actor)
+ ->setContentSource(PhabricatorContentSource::newConsoleSource())
+ ->applyTransactions($conpherence, $xactions);
+
+ }
+
+}
diff --git a/src/applications/conpherence/__tests__/ConpherenceThreadTestCase.php b/src/applications/conpherence/__tests__/ConpherenceThreadTestCase.php
new file mode 100644
--- /dev/null
+++ b/src/applications/conpherence/__tests__/ConpherenceThreadTestCase.php
@@ -0,0 +1,102 @@
+<?php
+
+final class ConpherenceThreadTestCase extends ConpherenceTestCase {
+
+ protected function getPhabricatorTestCaseConfiguration() {
+ return array(
+ self::PHABRICATOR_TESTCONFIG_BUILD_STORAGE_FIXTURES => true,
+ );
+ }
+
+ public function testOneUserThreadCreate() {
+ $creator = $this->generateNewTestUser();
+ $participant_phids = array($creator->getPHID());
+
+ $conpherence = $this->createThread($creator, $participant_phids);
+
+ $this->assertTrue((bool)$conpherence->getID());
+ $this->assertEqual(1, count($conpherence->getParticipants()));
+ $this->assertEqual(
+ $participant_phids,
+ $conpherence->getRecentParticipantPHIDs());
+ }
+
+ public function testNUserThreadCreate() {
+ $creator = $this->generateNewTestUser();
+ $friend_1 = $this->generateNewTestUser();
+ $friend_2 = $this->generateNewTestUser();
+ $friend_3 = $this->generateNewTestUser();
+
+ $participant_phids = array(
+ $creator->getPHID(),
+ $friend_1->getPHID(),
+ $friend_2->getPHID(),
+ $friend_3->getPHID(),
+ );
+
+ $conpherence = $this->createThread($creator, $participant_phids);
+
+ $this->assertTrue((bool)$conpherence->getID());
+ $this->assertEqual(4, count($conpherence->getParticipants()));
+ $this->assertEqual(
+ $participant_phids,
+ $conpherence->getRecentParticipantPHIDs());
+ }
+
+ public function testThreadParticipantAddition() {
+ $creator = $this->generateNewTestUser();
+ $friend_1 = $this->generateNewTestUser();
+ $friend_2 = $this->generateNewTestUser();
+ $friend_3 = $this->generateNewTestUser();
+
+ $participant_phids = array(
+ $creator->getPHID(),
+ $friend_1->getPHID(),
+ );
+
+ $conpherence = $this->createThread($creator, $participant_phids);
+
+ $this->assertTrue((bool)$conpherence->getID());
+ $this->assertEqual(2, count($conpherence->getParticipants()));
+ $this->assertEqual(
+ $participant_phids,
+ $conpherence->getRecentParticipantPHIDs());
+
+ // test add by creator
+ $participant_phids[] = $friend_2->getPHID();
+ $this->addParticipants($creator, $conpherence, array($friend_2->getPHID()));
+ $this->assertEqual(
+ $participant_phids,
+ $conpherence->getRecentParticipantPHIDs());
+
+ // test add by other participant, so recent participation should
+ // meaningfully change
+ $participant_phids = array(
+ $friend_2->getPHID(), // actor
+ $creator->getPHID(), // last actor
+ $friend_1->getPHID(),
+ $friend_3->getPHID(), // new addition
+ );
+ $this->addParticipants(
+ $friend_2,
+ $conpherence,
+ array($friend_3->getPHID()));
+ $this->assertEqual(
+ $participant_phids,
+ $conpherence->getRecentParticipantPHIDs());
+ }
+
+ private function createThread(
+ PhabricatorUser $creator,
+ array $participant_phids) {
+
+ list($errors, $conpherence) = ConpherenceEditor::createThread(
+ $creator,
+ $participant_phids,
+ 'Test',
+ 'Test',
+ PhabricatorContentSource::newConsoleSource());
+ return $conpherence;
+ }
+
+}
diff --git a/src/applications/conpherence/controller/ConpherenceController.php b/src/applications/conpherence/controller/ConpherenceController.php
--- a/src/applications/conpherence/controller/ConpherenceController.php
+++ b/src/applications/conpherence/controller/ConpherenceController.php
@@ -74,11 +74,21 @@
return $crumbs;
}
- protected function buildHeaderPaneContent(ConpherenceThread $conpherence) {
+ protected function buildHeaderPaneContent(
+ ConpherenceThread $conpherence,
+ array $policy_objects) {
+ assert_instances_of($policy_objects, 'PhabricatorPolicy');
+
$crumbs = $this->buildApplicationCrumbs();
$title = $this->getConpherenceTitle($conpherence);
+ if ($conpherence->getID()) {
+ $icon = $conpherence->getPolicyIconName($policy_objects);
+ } else {
+ $icon = null;
+ }
$crumbs->addCrumb(
id(new PHUICrumbView())
+ ->setIcon($icon)
->setName($title)
->setHref($this->getApplicationURI('update/'.$conpherence->getID().'/'))
->setWorkflow(true));
diff --git a/src/applications/conpherence/controller/ConpherenceListController.php b/src/applications/conpherence/controller/ConpherenceListController.php
--- a/src/applications/conpherence/controller/ConpherenceListController.php
+++ b/src/applications/conpherence/controller/ConpherenceListController.php
@@ -157,13 +157,20 @@
->setThreadView($thread_view)
->setRole('list');
if ($conpherence) {
- $layout->setHeader($this->buildHeaderPaneContent($conpherence));
+ $policy_objects = id(new PhabricatorPolicyQuery())
+ ->setViewer($user)
+ ->setObject($conpherence)
+ ->execute();
+ $layout->setHeader($this->buildHeaderPaneContent(
+ $conpherence,
+ $policy_objects));
$layout->setThread($conpherence);
} else {
$layout->setHeader(
$this->buildHeaderPaneContent(
id(new ConpherenceThread())
- ->makeEphemeral()));
+ ->makeEphemeral(),
+ array()));
}
$response = $this->buildApplicationPage(
$layout,
diff --git a/src/applications/conpherence/controller/ConpherenceUpdateController.php b/src/applications/conpherence/controller/ConpherenceUpdateController.php
--- a/src/applications/conpherence/controller/ConpherenceUpdateController.php
+++ b/src/applications/conpherence/controller/ConpherenceUpdateController.php
@@ -377,7 +377,11 @@
$file_widget = null;
switch ($action) {
case ConpherenceUpdateActions::METADATA:
- $header = $this->buildHeaderPaneContent($conpherence);
+ $policy_objects = id(new PhabricatorPolicyQuery())
+ ->setViewer($user)
+ ->setObject($conpherence)
+ ->execute();
+ $header = $this->buildHeaderPaneContent($conpherence, $policy_objects);
$nav_item = id(new ConpherenceThreadListView())
->setUser($user)
->setBaseURI($this->getApplicationURI())
diff --git a/src/applications/conpherence/controller/ConpherenceViewController.php b/src/applications/conpherence/controller/ConpherenceViewController.php
--- a/src/applications/conpherence/controller/ConpherenceViewController.php
+++ b/src/applications/conpherence/controller/ConpherenceViewController.php
@@ -47,7 +47,11 @@
$form = null;
$content = array('messages' => $messages);
} else {
- $header = $this->buildHeaderPaneContent($conpherence);
+ $policy_objects = id(new PhabricatorPolicyQuery())
+ ->setViewer($user)
+ ->setObject($conpherence)
+ ->execute();
+ $header = $this->buildHeaderPaneContent($conpherence, $policy_objects);
$form = $this->renderFormContent();
$content = array(
'header' => $header,
diff --git a/src/applications/conpherence/editor/ConpherenceEditor.php b/src/applications/conpherence/editor/ConpherenceEditor.php
--- a/src/applications/conpherence/editor/ConpherenceEditor.php
+++ b/src/applications/conpherence/editor/ConpherenceEditor.php
@@ -13,7 +13,7 @@
return pht('Conpherence Threads');
}
- public static function createConpherence(
+ public static function createThread(
PhabricatorUser $creator,
array $participant_phids,
$title,
@@ -28,8 +28,6 @@
} else {
$participant_phids[] = $creator->getPHID();
$participant_phids = array_unique($participant_phids);
- $conpherence->setRecentParticipantPHIDs(
- array_slice($participant_phids, 0, 10));
}
if (empty($message)) {
@@ -70,9 +68,9 @@
->setConpherencePHID($conpherence->getPHID()));
id(new ConpherenceEditor())
+ ->setActor($creator)
->setContentSource($source)
->setContinueOnNoEffect(true)
- ->setActor($creator)
->applyTransactions($conpherence, $xactions);
}
@@ -177,13 +175,15 @@
/**
* We need to apply initial effects IFF the conpherence is new. We must
- * save the conpherence first thing to make sure we have an id and a phid.
+ * save the conpherence first thing to make sure we have an id and a phid, as
+ * well as create the initial set of participants so that we pass policy
+ * checks.
*/
protected function shouldApplyInitialEffects(
PhabricatorLiskDAO $object,
array $xactions) {
- return !$object->getID();
+ return $this->getIsNewObject();
}
protected function applyInitialEffects(
@@ -191,28 +191,19 @@
array $xactions) {
$object->save();
- }
- protected function applyCustomInternalTransaction(
- PhabricatorLiskDAO $object,
- PhabricatorApplicationTransaction $xaction) {
- switch ($xaction->getTransactionType()) {
- case PhabricatorTransactions::TYPE_COMMENT:
- $object->setMessageCount((int)$object->getMessageCount() + 1);
- break;
- case ConpherenceTransactionType::TYPE_TITLE:
- $object->setTitle($xaction->getNewValue());
- break;
- case ConpherenceTransactionType::TYPE_PARTICIPANTS:
- // If this is a new ConpherenceThread, we have to create the
- // participation data asap to pass policy checks. For existing
- // ConpherenceThreads, the existing participation is correct
- // at this stage. Note that later in applyCustomExternalTransaction
- // this participation data will be updated, particularly the
- // behindTransactionPHID which is just a generated dummy for now.
- if ($this->getIsNewObject()) {
+ foreach ($xactions as $xaction) {
+ switch ($xaction->getTransactionType()) {
+ case ConpherenceTransactionType::TYPE_PARTICIPANTS:
+ // Since this is a new ConpherenceThread, we have to create the
+ // participation data asap to pass policy checks. For existing
+ // ConpherenceThreads, the existing participation is correct
+ // at this stage. Note that later in applyCustomExternalTransaction
+ // this participation data will be updated, particularly the
+ // behindTransactionPHID which is just a generated dummy for now.
$participants = array();
- foreach ($xaction->getNewValue() as $phid) {
+ $phids = $this->getPHIDTransactionNewValue($xaction, array());
+ foreach ($phids as $phid) {
if ($phid == $this->getActor()->getPHID()) {
$status = ConpherenceParticipationStatus::UP_TO_DATE;
$message_count = 1;
@@ -230,6 +221,35 @@
->setSeenMessageCount($message_count)
->save();
$object->attachParticipants($participants);
+ $object->setRecentParticipantPHIDs(array_keys($participants));
+ }
+ break;
+ }
+ }
+ }
+
+ protected function applyCustomInternalTransaction(
+ PhabricatorLiskDAO $object,
+ PhabricatorApplicationTransaction $xaction) {
+
+ switch ($xaction->getTransactionType()) {
+ case PhabricatorTransactions::TYPE_COMMENT:
+ $object->setMessageCount((int)$object->getMessageCount() + 1);
+ break;
+ case ConpherenceTransactionType::TYPE_TITLE:
+ $object->setTitle($xaction->getNewValue());
+ break;
+ case ConpherenceTransactionType::TYPE_PARTICIPANTS:
+ if (!$this->getIsNewObject()) {
+ // if we added people, add them to the end of "recent" participants
+ $old_map = array_fuse($xaction->getOldValue());
+ $new_map = array_fuse($xaction->getNewValue());
+ $add = array_keys(array_diff_key($new_map, $old_map));
+ if ($add) {
+ $participants = $object->getRecentParticipantPHIDs();
+ $participants = array_merge($participants, $add);
+ $participants = array_slice(array_unique($participants), 0, 10);
+ $object->setRecentParticipantPHIDs($participants);
}
}
break;
@@ -275,6 +295,9 @@
$editor->save();
break;
case ConpherenceTransactionType::TYPE_PARTICIPANTS:
+ if ($this->getIsNewObject()) {
+ continue;
+ }
$participants = $object->getParticipants();
$old_map = array_fuse($xaction->getOldValue());
@@ -289,28 +312,22 @@
$add = array_keys(array_diff_key($new_map, $old_map));
foreach ($add as $phid) {
- if ($this->getIsNewObject()) {
- $participants[$phid]
- ->setBehindTransactionPHID($xaction->getPHID())
- ->save();
+ if ($phid == $this->getActor()->getPHID()) {
+ $status = ConpherenceParticipationStatus::UP_TO_DATE;
+ $message_count = $object->getMessageCount();
} else {
- if ($phid == $this->getActor()->getPHID()) {
- $status = ConpherenceParticipationStatus::UP_TO_DATE;
- $message_count = $object->getMessageCount();
- } else {
- $status = ConpherenceParticipationStatus::BEHIND;
- $message_count = 0;
- }
- $participants[$phid] =
- id(new ConpherenceParticipant())
- ->setConpherencePHID($object->getPHID())
- ->setParticipantPHID($phid)
- ->setParticipationStatus($status)
- ->setDateTouched(time())
- ->setBehindTransactionPHID($xaction->getPHID())
- ->setSeenMessageCount($message_count)
- ->save();
+ $status = ConpherenceParticipationStatus::BEHIND;
+ $message_count = 0;
}
+ $participants[$phid] =
+ id(new ConpherenceParticipant())
+ ->setConpherencePHID($object->getPHID())
+ ->setParticipantPHID($phid)
+ ->setParticipationStatus($status)
+ ->setDateTouched(time())
+ ->setBehindTransactionPHID($xaction->getPHID())
+ ->setSeenMessageCount($message_count)
+ ->save();
}
$object->attachParticipants($participants);
break;
@@ -349,6 +366,7 @@
$participant->setDateTouched($time);
} else {
$participant->setSeenMessageCount($object->getMessageCount());
+ $participant->setBehindTransactionPHID($xaction_phid);
$participant->setParticipationStatus($up_to_date);
$participant->setDateTouched($time);
}
diff --git a/src/applications/conpherence/storage/ConpherenceThread.php b/src/applications/conpherence/storage/ConpherenceThread.php
--- a/src/applications/conpherence/storage/ConpherenceThread.php
+++ b/src/applications/conpherence/storage/ConpherenceThread.php
@@ -31,7 +31,6 @@
}
public static function initializeNewRoom(PhabricatorUser $creator) {
- $participant_phids = array($creator->getPHID());
return id(new ConpherenceThread())
->setIsRoom(1)
@@ -41,8 +40,7 @@
->attachFilePHIDs(array())
->setViewPolicy(PhabricatorPolicies::POLICY_USER)
->setEditPolicy($creator->getPHID())
- ->setJoinPolicy(PhabricatorPolicies::POLICY_USER)
- ->setRecentParticipantPHIDs($participant_phids);
+ ->setJoinPolicy(PhabricatorPolicies::POLICY_USER);
}
protected function getConfiguration() {
@@ -277,4 +275,17 @@
}
}
+ public function getPolicyIconName(array $policy_objects) {
+ assert_instances_of($policy_objects, 'PhabricatorPolicy');
+
+ if ($this->getIsRoom()) {
+ $icon = $policy_objects[$this->getViewPolicy()]->getIcon();
+ } else if (count($this->getRecentParticipantPHIDs()) > 2) {
+ $icon = 'fa-users';
+ } else {
+ $icon = 'fa-user';
+ }
+ return $icon;
+ }
+
}
diff --git a/src/applications/conpherence/view/ConpherenceDurableColumnView.php b/src/applications/conpherence/view/ConpherenceDurableColumnView.php
--- a/src/applications/conpherence/view/ConpherenceDurableColumnView.php
+++ b/src/applications/conpherence/view/ConpherenceDurableColumnView.php
@@ -8,6 +8,7 @@
private $transactions;
private $visible;
private $initialLoad = false;
+ private $policyObjects;
public function setConpherences(array $conpherences) {
assert_instances_of($conpherences, 'ConpherenceThread');
@@ -66,6 +67,17 @@
return $this->initialLoad;
}
+ public function setPolicyObjects(array $objects) {
+ assert_instances_of($objects, 'PhabricatorPolicy');
+
+ $this->policyObjects = $objects;
+ return $this;
+ }
+
+ public function getPolicyObjects() {
+ return $this->policyObjects;
+ }
+
protected function getTagAttributes() {
if ($this->getVisible()) {
$style = null;
@@ -96,6 +108,23 @@
'settingsURI' => '/settings/adjust/?key='.$column_key,
));
+ $policies = array();
+ $conpherences = $this->getConpherences();
+ foreach ($conpherences as $conpherence) {
+ if (!$conpherence->getIsRoom()) {
+ continue;
+ }
+ $policies[] = $conpherence->getViewPolicy();
+ }
+ $policy_objects = array();
+ if ($policies) {
+ $policy_objects = id(new PhabricatorPolicyQuery())
+ ->setViewer($this->getUser())
+ ->withPHIDs($policies)
+ ->execute();
+ }
+ $this->setPolicyObjects($policy_objects);
+
$classes = array();
$classes[] = 'conpherence-durable-column-header';
$classes[] = 'sprite-main-header';
@@ -178,6 +207,18 @@
);
}
+ private function getPolicyIcon(
+ ConpherenceThread $conpherence,
+ array $policy_objects) {
+
+ assert_instances_of($policy_objects, 'PhabricatorPolicy');
+
+ $icon = $conpherence->getPolicyIconName($policy_objects);
+ return id(new PHUIIconView())
+ ->addClass('mmr')
+ ->setIconFont($icon.' lightgreytext');
+ }
+
private function buildIconBar() {
$icons = array();
$selected_conpherence = $this->getSelectedConpherence();
@@ -189,6 +230,14 @@
$classes[] = 'selected';
}
$data = $conpherence->getDisplayData($this->getUser());
+ $icon = $this->getPolicyIcon($conpherence, $this->getPolicyObjects());
+ $thread_title = phutil_tag(
+ 'span',
+ array(),
+ array(
+ $icon,
+ $data['js_title'],
+ ));
$image = $data['image'];
Javelin::initBehavior('phabricator-tooltips');
$icons[] =
@@ -200,7 +249,7 @@
'sigil' => 'conpherence-durable-column-thread-icon has-tooltip',
'meta' => array(
'threadID' => $conpherence->getID(),
- 'threadTitle' => $data['js_title'],
+ 'threadTitle' => hsprintf('%s', $thread_title),
'tip' => $data['js_title'],
'align' => 'S',
),
@@ -220,7 +269,7 @@
if (!$conpherence) {
- $title = null;
+ $header = null;
$settings_button = null;
$settings_menu = null;
@@ -282,6 +331,13 @@
if (!$title) {
$title = pht('[No Title]');
}
+ $header = phutil_tag(
+ 'span',
+ array(),
+ array(
+ $this->getPolicyIcon($conpherence, $this->getPolicyObjects()),
+ $title,
+ ));
}
return
@@ -297,7 +353,7 @@
'sigil' => 'conpherence-durable-column-header-text',
'class' => 'conpherence-durable-column-header-text',
),
- $title),
+ $header),
$settings_button,
$settings_menu,));
diff --git a/webroot/rsrc/js/application/conpherence/behavior-durable-column.js b/webroot/rsrc/js/application/conpherence/behavior-durable-column.js
--- a/webroot/rsrc/js/application/conpherence/behavior-durable-column.js
+++ b/webroot/rsrc/js/application/conpherence/behavior-durable-column.js
@@ -183,7 +183,7 @@
'selected',
cdata.threadID == data.threadID);
}
- JX.DOM.setContent(_getColumnTitleNode(), data.threadTitle);
+ JX.DOM.setContent(_getColumnTitleNode(), JX.$H(data.threadTitle));
threadManager.loadThreadByID(data.threadID);
});
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Mar 23, 7:09 AM (2 w, 3 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7463501
Default Alt Text
D12163.id29257.diff (30 KB)
Attached To
Mode
D12163: Conpherence - Differentiate audience of Threads/Rooms with icon
Attached
Detach File
Event Timeline
Log In to Comment