diff --git a/resources/celerity/map.php b/resources/celerity/map.php --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -342,7 +342,7 @@ 'rsrc/js/application/conpherence/behavior-menu.js' => 'd3782c93', 'rsrc/js/application/conpherence/behavior-pontificate.js' => '21ba5861', 'rsrc/js/application/conpherence/behavior-quicksand-blacklist.js' => '7927a7d3', - 'rsrc/js/application/conpherence/behavior-widget-pane.js' => '93568464', + 'rsrc/js/application/conpherence/behavior-widget-pane.js' => 'cafc59ab', 'rsrc/js/application/countdown/timer.js' => 'e4cc26b3', 'rsrc/js/application/daemon/behavior-bulk-job-reload.js' => 'edf8a145', 'rsrc/js/application/dashboard/behavior-dashboard-async-panel.js' => '469c0d9e', @@ -550,7 +550,7 @@ 'javelin-behavior-conpherence-drag-and-drop-photo' => 'cf86d16a', 'javelin-behavior-conpherence-menu' => 'd3782c93', 'javelin-behavior-conpherence-pontificate' => '21ba5861', - 'javelin-behavior-conpherence-widget-pane' => '93568464', + 'javelin-behavior-conpherence-widget-pane' => 'cafc59ab', 'javelin-behavior-countdown-timer' => 'e4cc26b3', 'javelin-behavior-dark-console' => 'f411b6ae', 'javelin-behavior-dashboard-async-panel' => '469c0d9e', @@ -1501,19 +1501,6 @@ 'javelin-dom', 'javelin-stratcom', ), - 93568464 => array( - 'javelin-behavior', - 'javelin-dom', - 'javelin-stratcom', - 'javelin-workflow', - 'javelin-util', - 'phabricator-notification', - 'javelin-behavior-device', - 'phuix-dropdown-menu', - 'phuix-action-list-view', - 'phuix-action-view', - 'conpherence-thread-manager', - ), '93d0c9e3' => array( 'javelin-behavior', 'javelin-stratcom', @@ -1768,6 +1755,19 @@ 'javelin-stratcom', 'phabricator-phtize', ), + 'cafc59ab' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-util', + 'phabricator-notification', + 'javelin-behavior-device', + 'phuix-dropdown-menu', + 'phuix-action-list-view', + 'phuix-action-view', + 'conpherence-thread-manager', + ), 'ccf1cbf8' => array( 'javelin-install', 'javelin-dom', diff --git a/resources/sql/autopatches/20150619.conpherencerooms.1.sql b/resources/sql/autopatches/20150619.conpherencerooms.1.sql new file mode 100644 --- /dev/null +++ b/resources/sql/autopatches/20150619.conpherencerooms.1.sql @@ -0,0 +1,6 @@ +UPDATE {$NAMESPACE}_conpherence.conpherence_thread + SET + viewPolicy = 'obj.conpherence.members', + editPolicy = 'obj.conpherence.members', + joinPolicy = 'obj.conpherence.members' + WHERE isRoom = 0; diff --git a/resources/sql/autopatches/20150619.conpherencerooms.2.sql b/resources/sql/autopatches/20150619.conpherencerooms.2.sql new file mode 100644 --- /dev/null +++ b/resources/sql/autopatches/20150619.conpherencerooms.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_conpherence.conpherence_thread + DROP KEY `key_room`; diff --git a/resources/sql/autopatches/20150619.conpherencerooms.3.sql b/resources/sql/autopatches/20150619.conpherencerooms.3.sql new file mode 100644 --- /dev/null +++ b/resources/sql/autopatches/20150619.conpherencerooms.3.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_conpherence.conpherence_thread + DROP COLUMN isRoom; 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 @@ -238,7 +238,6 @@ 'ConpherenceLayoutView' => 'applications/conpherence/view/ConpherenceLayoutView.php', 'ConpherenceListController' => 'applications/conpherence/controller/ConpherenceListController.php', 'ConpherenceMenuItemView' => 'applications/conpherence/view/ConpherenceMenuItemView.php', - 'ConpherenceNewController' => 'applications/conpherence/controller/ConpherenceNewController.php', 'ConpherenceNewRoomController' => 'applications/conpherence/controller/ConpherenceNewRoomController.php', 'ConpherenceNotificationPanelController' => 'applications/conpherence/controller/ConpherenceNotificationPanelController.php', 'ConpherenceParticipant' => 'applications/conpherence/storage/ConpherenceParticipant.php', @@ -263,7 +262,6 @@ 'ConpherenceThreadQuery' => 'applications/conpherence/query/ConpherenceThreadQuery.php', 'ConpherenceThreadRemarkupRule' => 'applications/conpherence/remarkup/ConpherenceThreadRemarkupRule.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', @@ -3609,7 +3607,6 @@ 'ConpherenceLayoutView' => 'AphrontView', 'ConpherenceListController' => 'ConpherenceController', 'ConpherenceMenuItemView' => 'AphrontTagView', - 'ConpherenceNewController' => 'ConpherenceController', 'ConpherenceNewRoomController' => 'ConpherenceController', 'ConpherenceNotificationPanelController' => 'ConpherenceController', 'ConpherenceParticipant' => 'ConpherenceDAO', @@ -3640,7 +3637,6 @@ 'ConpherenceThreadQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'ConpherenceThreadRemarkupRule' => 'PhabricatorObjectRemarkupRule', '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 --- a/src/applications/conpherence/__tests__/ConpherenceRoomTestCase.php +++ b/src/applications/conpherence/__tests__/ConpherenceRoomTestCase.php @@ -69,20 +69,6 @@ $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( @@ -129,7 +115,6 @@ public function testAddMessageWithFileAttachments() { $creator = $this->generateNewTestUser(); $friend_1 = $this->generateNewTestUser(); - $join_via_add = $this->generateNewTestUser(); $participant_map = array( $creator->getPHID() => $creator, @@ -144,9 +129,6 @@ $xactions = $this->addMessageWithFile($user, $conpherence); $this->assertEqual(2, count($xactions)); } - - $xactions = $this->addMessageWithFile($join_via_add, $conpherence); - $this->assertEqual(2, count($xactions)); } private function createRoom( diff --git a/src/applications/conpherence/__tests__/ConpherenceThreadTestCase.php b/src/applications/conpherence/__tests__/ConpherenceThreadTestCase.php deleted file mode 100644 --- a/src/applications/conpherence/__tests__/ConpherenceThreadTestCase.php +++ /dev/null @@ -1,169 +0,0 @@ - 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()); - } - - public function testThreadParticipantDeletion() { - $creator = $this->generateNewTestUser(); - $friend_1 = $this->generateNewTestUser(); - $friend_2 = $this->generateNewTestUser(); - $friend_3 = $this->generateNewTestUser(); - - $participant_map = array( - $creator->getPHID() => $creator, - $friend_1->getPHID() => $friend_1, - $friend_2->getPHID() => $friend_2, - $friend_3->getPHID() => $friend_3, - ); - - $conpherence = $this->createThread( - $creator, - array_keys($participant_map)); - - foreach ($participant_map as $phid => $user) { - $this->removeParticipants($user, $conpherence, array($phid)); - unset($participant_map[$phid]); - $this->assertEqual( - count($participant_map), - count($conpherence->getParticipants())); - } - } - - public function testAddMessageWithFileAttachments() { - $creator = $this->generateNewTestUser(); - $friend_1 = $this->generateNewTestUser(); - $policy_exception_user = $this->generateNewTestUser(); - - $participant_map = array( - $creator->getPHID() => $creator, - $friend_1->getPHID() => $friend_1, - ); - - $conpherence = $this->createThread( - $creator, - array_keys($participant_map)); - - foreach ($participant_map as $phid => $user) { - $xactions = $this->addMessageWithFile($user, $conpherence); - $this->assertEqual(2, count($xactions), pht('hi')); - } - - $caught = null; - try { - $xactions = $this->addMessageWithFile( - $policy_exception_user, - $conpherence); - } catch (PhabricatorPolicyException $ex) { - $caught = $ex; - } - $this->assertTrue( - $caught instanceof PhabricatorPolicyException, - pht( - 'User not participating in thread should get policy exception '. - 'trying to add message.')); - $this->assertTrue( - $conpherence->establishConnection('w')->isReadLocking(), - pht( - 'Conpherence object should still be read locked from policy '. - 'exception.')); - $conpherence->endReadLocking(); - $conpherence->killTransaction(); - } - - private function createThread( - PhabricatorUser $creator, - array $participant_phids) { - - list($errors, $conpherence) = ConpherenceEditor::createThread( - $creator, - $participant_phids, - pht('Test'), - pht('Test'), - PhabricatorContentSource::newConsoleSource()); - return $conpherence; - } - -} diff --git a/src/applications/conpherence/application/PhabricatorConpherenceApplication.php b/src/applications/conpherence/application/PhabricatorConpherenceApplication.php --- a/src/applications/conpherence/application/PhabricatorConpherenceApplication.php +++ b/src/applications/conpherence/application/PhabricatorConpherenceApplication.php @@ -11,7 +11,7 @@ } public function getShortDescription() { - return pht('Send Messages'); + return pht('Chat with Others'); } public function getFontIcon() { @@ -44,8 +44,7 @@ '(?P[1-9]\d*)/(?P[1-9]\d*)/' => 'ConpherenceViewController', 'columnview/' => 'ConpherenceColumnViewController', - 'new/' => 'ConpherenceNewController', - 'room/new/' => 'ConpherenceNewRoomController', + 'new/' => 'ConpherenceNewRoomController', 'search/(?:query/(?P[^/]+)/)?' => 'ConpherenceRoomListController', 'panel/' => 'ConpherenceNotificationPanelController', @@ -59,7 +58,7 @@ $items = array(); $item = id(new PHUIListItemView()) - ->setName(pht('Conpherence Thread')) + ->setName(pht('Conpherence Room')) ->setIcon('fa-comments') ->setWorkflow(true) ->setHref($this->getBaseURI().'new/'); diff --git a/src/applications/conpherence/conduit/ConpherenceQueryTransactionConduitAPIMethod.php b/src/applications/conpherence/conduit/ConpherenceQueryTransactionConduitAPIMethod.php --- a/src/applications/conpherence/conduit/ConpherenceQueryTransactionConduitAPIMethod.php +++ b/src/applications/conpherence/conduit/ConpherenceQueryTransactionConduitAPIMethod.php @@ -10,15 +10,15 @@ public function getMethodDescription() { return pht( 'Query for transactions for the logged in user within a specific '. - 'Conpherence thread. You can specify the thread by ID or PHID. '. + 'Conpherence room. You can specify the room by ID or PHID. '. 'Otherwise, specify limit and offset to query the most recent '. - 'transactions within the Conpherence for the logged in user.'); + 'transactions within the Conpherence room for the logged in user.'); } protected function defineParamTypes() { return array( - 'threadID' => 'optional int', - 'threadPHID' => 'optional phid', + 'roomID' => 'optional int', + 'roomPHID' => 'optional phid', 'limit' => 'optional int', 'offset' => 'optional int', ); @@ -30,28 +30,28 @@ protected function defineErrorTypes() { return array( - 'ERR_USAGE_NO_THREAD_ID' => pht( - 'You must specify a thread id or thread PHID to query transactions '. + 'ERR_USAGE_NO_ROOM_ID' => pht( + 'You must specify a room id or room PHID to query transactions '. 'from.'), ); } protected function execute(ConduitAPIRequest $request) { $user = $request->getUser(); - $thread_id = $request->getValue('threadID'); - $thread_phid = $request->getValue('threadPHID'); + $room_id = $request->getValue('roomID'); + $room_phid = $request->getValue('roomPHID'); $limit = $request->getValue('limit'); $offset = $request->getValue('offset'); $query = id(new ConpherenceThreadQuery()) ->setViewer($user); - if ($thread_id) { - $query->withIDs(array($thread_id)); - } else if ($thread_phid) { - $query->withPHIDs(array($thread_phid)); + if ($room_id) { + $query->withIDs(array($room_id)); + } else if ($room_phid) { + $query->withPHIDs(array($room_phid)); } else { - throw new ConduitException('ERR_USAGE_NO_THREAD_ID'); + throw new ConduitException('ERR_USAGE_NO_ROOM_ID'); } $conpherence = $query->executeOne(); @@ -87,8 +87,8 @@ 'transactionMetadata' => $transaction->getMetadata(), 'authorPHID' => $transaction->getAuthorPHID(), 'dateCreated' => $transaction->getDateCreated(), - 'conpherenceID' => $conpherence->getID(), - 'conpherencePHID' => $conpherence->getPHID(), + 'roomID' => $conpherence->getID(), + 'roomPHID' => $conpherence->getPHID(), ); } return $data; diff --git a/src/applications/conpherence/conduit/ConpherenceUpdateThreadConduitAPIMethod.php b/src/applications/conpherence/conduit/ConpherenceUpdateThreadConduitAPIMethod.php --- a/src/applications/conpherence/conduit/ConpherenceUpdateThreadConduitAPIMethod.php +++ b/src/applications/conpherence/conduit/ConpherenceUpdateThreadConduitAPIMethod.php @@ -8,7 +8,7 @@ } public function getMethodDescription() { - return pht('Update an existing conpherence thread.'); + return pht('Update an existing conpherence room.'); } protected function defineParamTypes() { @@ -28,13 +28,13 @@ protected function defineErrorTypes() { return array( - 'ERR_USAGE_NO_THREAD_ID' => pht( - 'You must specify a thread id or thread phid to query transactions '. + 'ERR_USAGE_NO_ROOM_ID' => pht( + 'You must specify a room id or room phid to query transactions '. 'from.'), - 'ERR_USAGE_THREAD_NOT_FOUND' => pht( - 'Thread does not exist or logged in user can not see it.'), + 'ERR_USAGE_ROOM_NOT_FOUND' => pht( + 'room does not exist or logged in user can not see it.'), 'ERR_USAGE_ONLY_SELF_REMOVE' => pht( - 'Only a user can remove themselves from a thread.'), + 'Only a user can remove themselves from a room.'), 'ERR_USAGE_NO_UPDATES' => pht( 'You must specify data that actually updates the conpherence.'), ); @@ -52,11 +52,11 @@ } else if ($phid) { $query->withPHIDs(array($phid)); } else { - throw new ConduitException('ERR_USAGE_NO_THREAD_ID'); + throw new ConduitException('ERR_USAGE_NO_ROOM_ID'); } $conpherence = $query->executeOne(); if (!$conpherence) { - throw new ConduitException('ERR_USAGE_THREAD_NOT_FOUND'); + throw new ConduitException('ERR_USAGE_ROOM_NOT_FOUND'); } $source = PhabricatorContentSource::newFromConduitRequest($request); 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 @@ -16,7 +16,7 @@ $nav = new PHUIListView(); $nav->newLink( - pht('New Message'), + pht('New Room'), $this->getApplicationURI('new/')); $nav->addMenuItem( @@ -51,20 +51,20 @@ ->addAction( id(new PHUIListItemView()) ->setName(pht('New Room')) - ->setHref($this->getApplicationURI('room/new/')) + ->setHref($this->getApplicationURI('new/')) ->setIcon('fa-plus-square') ->setWorkflow(true)); } else { $crumbs ->addAction( id(new PHUIListItemView()) - ->setName(pht('New Message')) + ->setName(pht('New Room')) ->setHref($this->getApplicationURI('new/')) ->setIcon('fa-plus-square') ->setWorkflow(true)) ->addAction( id(new PHUIListItemView()) - ->setName(pht('Thread')) + ->setName(pht('Room')) ->setHref('#') ->setIcon('fa-bars') ->setStyle('display: none;') @@ -81,14 +81,8 @@ $crumbs = $this->buildApplicationCrumbs(); $data = $conpherence->getDisplayData($this->getViewer()); - if ($conpherence->getID() && $conpherence->getIsRoom()) { - $icon = $conpherence->getPolicyIconName($policy_objects); - } else { - $icon = null; - } $crumbs->addCrumb( id(new PHUICrumbView()) - ->setIcon($icon) ->setName($data['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 @@ -34,7 +34,7 @@ $title = pht('Conpherence'); $conpherence = null; - $limit = ConpherenceThreadListView::SEE_MORE_LIMIT * 5; + $limit = (ConpherenceThreadListView::SEE_MORE_LIMIT * 2) + 1; $all_participation = array(); $mode = $this->determineMode(); @@ -62,9 +62,28 @@ } else { $menu_participation = $cursor; } - $all_participation = - array($conpherence->getPHID() => $menu_participation) + - $all_participation; + + // check to see if the loaded conpherence is going to show up + // within the SEE_MORE_LIMIT amount of conpherences. + // If its not there, then we just pre-pend it as the "first" + // conpherence so folks have a navigation item in the menu. + $count = 0; + $found = false; + foreach ($all_participation as $phid => $curr_participation) { + if ($conpherence->getPHID() == $phid) { + $found = true; + break; + } + $count++; + if ($count > ConpherenceThreadListView::SEE_MORE_LIMIT) { + break; + } + } + if (!$found) { + $all_participation = + array($conpherence->getPHID() => $menu_participation) + + $all_participation; + } break; case self::UNSELECTED_MODE: default: @@ -93,22 +112,21 @@ ->setThreadView($thread_view) ->setRole('list'); if ($conpherence) { - $policy_objects = id(new PhabricatorPolicyQuery()) - ->setViewer($user) - ->setObject($conpherence) - ->execute(); - $layout->setHeader($this->buildHeaderPaneContent( - $conpherence, - $policy_objects)); $layout->setThread($conpherence); } else { - $thread = ConpherenceThread::initializeNewThread($user); - $thread->attachHandles(array()); - $thread->attachTransactions(array()); - $thread->makeEphemeral(); - $layout->setHeader( - $this->buildHeaderPaneContent($thread, array())); + // make a dummy conpherence so we can render something + $conpherence = ConpherenceThread::initializeNewRoom($user); + $conpherence->attachHandles(array()); + $conpherence->attachTransactions(array()); + $conpherence->makeEphemeral(); } + $policy_objects = id(new PhabricatorPolicyQuery()) + ->setViewer($user) + ->setObject($conpherence) + ->execute(); + $layout->setHeader($this->buildHeaderPaneContent( + $conpherence, + $policy_objects)); $response = $this->buildApplicationPage( $layout, array( diff --git a/src/applications/conpherence/controller/ConpherenceNewController.php b/src/applications/conpherence/controller/ConpherenceNewController.php deleted file mode 100644 --- a/src/applications/conpherence/controller/ConpherenceNewController.php +++ /dev/null @@ -1,90 +0,0 @@ -getUser(); - - $title = pht('New Message'); - $participants = array(); - $participant_prefill = null; - $message = ''; - $e_participants = null; - $e_message = null; - $errors = array(); - - // this comes from ajax requests from all over. should be a single phid. - - if ($request->isFormPost()) { - $participants = $request->getArr('participants'); - $message = $request->getStr('message'); - list($error_codes, $conpherence) = ConpherenceEditor::createThread( - $user, - $participants, - $conpherence_title = null, - $message, - PhabricatorContentSource::newFromRequest($request)); - - if ($error_codes) { - foreach ($error_codes as $error_code) { - switch ($error_code) { - case ConpherenceEditor::ERROR_EMPTY_MESSAGE: - $e_message = pht('Required'); - $errors[] = pht( - 'You can not send an empty message.'); - break; - case ConpherenceEditor::ERROR_EMPTY_PARTICIPANTS: - $e_participants = pht('Required'); - $errors[] = pht( - 'You must choose at least one recipient for your '. - 'message.'); - break; - } - } - } else { - return id(new AphrontRedirectResponse()) - ->setURI('/'.$conpherence->getMonogram()); - } - } else { - $participant_prefill = $request->getStr('participant'); - if ($participant_prefill) { - $participants[] = $participant_prefill; - } - } - - $submit_uri = $this->getApplicationURI('new/'); - $cancel_uri = $this->getApplicationURI(); - - $dialog = id(new AphrontDialogView()) - ->setWidth(AphrontDialogView::WIDTH_FORM) - ->setErrors($errors) - ->setUser($user) - ->setTitle($title) - ->addCancelButton($cancel_uri) - ->addSubmitButton(pht('Send Message')); - - $form = id(new AphrontFormView()) - ->setUser($user) - ->setFullWidth(true) - ->appendControl( - id(new AphrontFormTokenizerControl()) - ->setName('participants') - ->setValue($participants) - ->setUser($user) - ->setDatasource(new PhabricatorPeopleDatasource()) - ->setLabel(pht('To')) - ->setError($e_participants)) - ->appendChild( - id(new PhabricatorRemarkupControl()) - ->setUser($user) - ->setName('message') - ->setValue($message) - ->setLabel(pht('Message')) - ->setError($e_message)); - - $dialog->appendForm($form); - - return id(new AphrontDialogResponse())->setDialog($dialog); - } - -} diff --git a/src/applications/conpherence/controller/ConpherenceNewRoomController.php b/src/applications/conpherence/controller/ConpherenceNewRoomController.php --- a/src/applications/conpherence/controller/ConpherenceNewRoomController.php +++ b/src/applications/conpherence/controller/ConpherenceNewRoomController.php @@ -10,12 +10,18 @@ $validation_exception = null; $conpherence = ConpherenceThread::initializeNewRoom($user); + $participants = array(); if ($request->isFormPost()) { - + $editor = new ConpherenceEditor(); $xactions = array(); + + $participants = $request->getArr('participants'); + $participants[] = $user->getPHID(); + $participants = array_unique($participants); $xactions[] = id(new ConpherenceTransaction()) ->setTransactionType(ConpherenceTransaction::TYPE_PARTICIPANTS) - ->setNewValue(array('+' => array($user->getPHID()))); + ->setNewValue(array('+' => $participants)); + $xactions[] = id(new ConpherenceTransaction()) ->setTransactionType(ConpherenceTransaction::TYPE_TITLE) ->setNewValue($request->getStr('title')); @@ -29,8 +35,17 @@ ->setTransactionType(PhabricatorTransactions::TYPE_JOIN_POLICY) ->setNewValue($request->getStr('joinPolicy')); + $message = $request->getStr('message'); + if ($message) { + $message_xactions = $editor->generateTransactionsFromText( + $user, + $conpherence, + $message); + $xactions = array_merge($xactions, $message_xactions); + } + try { - id(new ConpherenceEditor()) + $editor ->setContentSourceFromRequest($request) ->setContinueOnNoEffect(true) ->setActor($user) @@ -47,6 +62,10 @@ $conpherence->setEditPolicy($request->getStr('editPolicy')); $conpherence->setJoinPolicy($request->getStr('joinPolicy')); } + } else { + if ($request->getStr('participant')) { + $participants[] = $request->getStr('participant'); + } } $policies = id(new PhabricatorPolicyQuery()) @@ -54,7 +73,7 @@ ->setObject($conpherence) ->execute(); - $submit_uri = $this->getApplicationURI('room/new/'); + $submit_uri = $this->getApplicationURI('new/'); $cancel_uri = $this->getApplicationURI('search/'); $dialog = $this->newDialog() @@ -67,14 +86,20 @@ $form = id(new PHUIFormLayoutView()) ->setUser($user) - ->setFullWidth(true) ->appendChild( id(new AphrontFormTextControl()) ->setError($e_title) - ->setLabel(pht('Title')) + ->setLabel(pht('Name')) ->setName('title') ->setValue($request->getStr('title'))) ->appendChild( + id(new AphrontFormTokenizerControl()) + ->setName('participants') + ->setUser($user) + ->setDatasource(new PhabricatorPeopleDatasource()) + ->setValue($participants) + ->setLabel(pht('Other Participants'))) + ->appendChild( id(new AphrontFormPolicyControl()) ->setName('viewPolicy') ->setPolicyObject($conpherence) @@ -91,7 +116,12 @@ ->setName('joinPolicy') ->setPolicyObject($conpherence) ->setCapability(PhabricatorPolicyCapability::CAN_JOIN) - ->setPolicies($policies)); + ->setPolicies($policies)) + ->appendChild( + id(new PhabricatorRemarkupControl()) + ->setUser($user) + ->setName('message') + ->setLabel(pht('First Message'))); $dialog->appendChild($form); diff --git a/src/applications/conpherence/controller/ConpherenceNotificationPanelController.php b/src/applications/conpherence/controller/ConpherenceNotificationPanelController.php --- a/src/applications/conpherence/controller/ConpherenceNotificationPanelController.php +++ b/src/applications/conpherence/controller/ConpherenceNotificationPanelController.php @@ -83,7 +83,7 @@ array( 'href' => '/conpherence/', ), - pht('Messages')), + pht('Rooms')), $content); $unread = id(new ConpherenceParticipantCountQuery()) diff --git a/src/applications/conpherence/controller/ConpherenceRoomListController.php b/src/applications/conpherence/controller/ConpherenceRoomListController.php --- a/src/applications/conpherence/controller/ConpherenceRoomListController.php +++ b/src/applications/conpherence/controller/ConpherenceRoomListController.php @@ -33,7 +33,7 @@ $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); if ($for_app) { - $nav->addFilter('room/new/', pht('Create Room')); + $nav->addFilter('new/', pht('Create Room')); } id(new ConpherenceThreadSearchEngine()) 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 @@ -188,17 +188,15 @@ $xactions[] = id(new ConpherenceTransaction()) ->setTransactionType(ConpherenceTransaction::TYPE_TITLE) ->setNewValue($title); - if ($conpherence->getIsRoom()) { - $xactions[] = id(new ConpherenceTransaction()) - ->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY) - ->setNewValue($request->getStr('viewPolicy')); - $xactions[] = id(new ConpherenceTransaction()) - ->setTransactionType(PhabricatorTransactions::TYPE_EDIT_POLICY) - ->setNewValue($request->getStr('editPolicy')); - $xactions[] = id(new ConpherenceTransaction()) - ->setTransactionType(PhabricatorTransactions::TYPE_JOIN_POLICY) - ->setNewValue($request->getStr('joinPolicy')); - } + $xactions[] = id(new ConpherenceTransaction()) + ->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY) + ->setNewValue($request->getStr('viewPolicy')); + $xactions[] = id(new ConpherenceTransaction()) + ->setTransactionType(PhabricatorTransactions::TYPE_EDIT_POLICY) + ->setNewValue($request->getStr('editPolicy')); + $xactions[] = id(new ConpherenceTransaction()) + ->setTransactionType(PhabricatorTransactions::TYPE_JOIN_POLICY) + ->setNewValue($request->getStr('joinPolicy')); if (!$request->getExists('force_ajax')) { $response_mode = 'redirect'; } @@ -245,8 +243,11 @@ ->setContent($content); break; case 'go-home': - return id(new AphrontRedirectResponse()) - ->setURI($this->getApplicationURI()); + $content = array( + 'href' => $this->getApplicationURI(), + ); + return id(new AphrontAjaxResponse()) + ->setContent($content); break; case 'redirect': default: @@ -323,18 +324,21 @@ $user = $request->getUser(); $remove_person = $request->getStr('remove_person'); $participants = $conpherence->getParticipants(); - if ($conpherence->getIsRoom()) { - $message = pht( - 'Are you sure you want to remove yourself from this room?'); - } else { - $message = pht( - 'Are you sure you want to remove yourself from this thread?'); + + $message = pht( + 'Are you sure you want to leave this room?'); + $test_conpherence = clone $conpherence; + $test_conpherence->attachParticipants(array()); + if (!PhabricatorPolicyFilter::hasCapability( + $user, + $test_conpherence, + PhabricatorPolicyCapability::CAN_VIEW)) { if (count($participants) == 1) { $message .= pht( - 'The thread will be inaccessible forever and ever.'); + ' The room will be inaccessible forever and ever.'); } else { $message .= pht( - 'Someone else in the thread can add you back later.'); + ' Someone else in the room can add you back later.'); } } $body = phutil_tag( @@ -345,7 +349,7 @@ require_celerity_resource('conpherence-update-css'); return id(new AphrontDialogView()) - ->setTitle(pht('Remove Participants')) + ->setTitle(pht('Leave Room')) ->addHiddenInput('action', 'remove_person') ->addHiddenInput('remove_person', $remove_person) ->addHiddenInput( @@ -362,6 +366,7 @@ $request = $this->getRequest(); $user = $request->getUser(); + $title = pht('Update Room'); $form = id(new PHUIFormLayoutView()) ->appendChild($error_view) ->appendChild( @@ -399,14 +404,13 @@ ->setLabel(pht('Image'))); } - if ($conpherence->getIsRoom()) { - $title = pht('Update Room'); - $policies = id(new PhabricatorPolicyQuery()) - ->setViewer($user) - ->setObject($conpherence) - ->execute(); + $policies = id(new PhabricatorPolicyQuery()) + ->setViewer($user) + ->setObject($conpherence) + ->execute(); - $form->appendChild( + $form + ->appendChild( id(new AphrontFormPolicyControl()) ->setName('viewPolicy') ->setPolicyObject($conpherence) @@ -424,9 +428,6 @@ ->setPolicyObject($conpherence) ->setCapability(PhabricatorPolicyCapability::CAN_JOIN) ->setPolicies($policies)); - } else { - $title = pht('Update Thread'); - } require_celerity_resource('conpherence-update-css'); $view = id(new AphrontDialogView()) @@ -520,7 +521,7 @@ $nav_item = id(new ConpherenceThreadListView()) ->setUser($user) ->setBaseURI($this->getApplicationURI()) - ->renderSingleThread($conpherence); + ->renderSingleThread($conpherence, $policy_objects); $nav_item = hsprintf('%s', $nav_item); break; case ConpherenceUpdateActions::MESSAGE: 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 @@ -10,7 +10,7 @@ } public function getEditorObjectsDescription() { - return pht('Conpherence Threads'); + return pht('Conpherence Rooms'); } public static function createThread( @@ -20,7 +20,7 @@ $message, PhabricatorContentSource $source) { - $conpherence = ConpherenceThread::initializeNewThread($creator); + $conpherence = ConpherenceThread::initializeNewRoom($creator); $files = array(); $errors = array(); if (empty($participant_phids)) { @@ -456,7 +456,7 @@ $is_leave = (($rem === array($actor_phid)) && !$add); if ($is_join) { - // You need CAN_JOIN to join a thread / room. + // You need CAN_JOIN to join a room. PhabricatorPolicyFilter::requireCapability( $this->requireActor(), $object, @@ -583,11 +583,7 @@ $href = PhabricatorEnv::getProductionURI( '/'.$object->getMonogram().'?settings'); - if ($object->getIsRoom()) { - $label = pht('EMAIL PREFERENCES FOR THIS ROOM'); - } else { - $label = pht('EMAIL PREFERENCES FOR THIS MESSAGE'); - } + $label = pht('EMAIL PREFERENCES FOR THIS ROOM'); $body->addLinkSection($label, $href); } @@ -644,19 +640,15 @@ switch ($type) { case ConpherenceTransaction::TYPE_TITLE: - if (!$object->getIsRoom()) { - continue; + if (empty($xactions)) { + break; } $missing = $this->validateIsEmptyTextField( $object->getTitle(), $xactions); if ($missing) { - if ($object->getIsRoom()) { - $detail = pht('Room title is required.'); - } else { - $detail = pht('Thread title can not be blank.'); - } + $detail = pht('Room title is required.'); $error = new PhabricatorApplicationTransactionValidationError( $type, pht('Required'), @@ -704,7 +696,7 @@ $errors[] = new PhabricatorApplicationTransactionValidationError( $type, pht('Invalid'), - pht('New thread member "%s" is not a valid user.', $phid), + pht('New room participant "%s" is not a valid user.', $phid), $xaction); } } diff --git a/src/applications/conpherence/events/ConpherenceHovercardEventListener.php b/src/applications/conpherence/events/ConpherenceHovercardEventListener.php --- a/src/applications/conpherence/events/ConpherenceHovercardEventListener.php +++ b/src/applications/conpherence/events/ConpherenceHovercardEventListener.php @@ -30,8 +30,8 @@ return; } - $conpherence_uri = new PhutilURI( - '/conpherence/new/?participant='.$user->getPHID()); + $conpherence_uri = id(new PhutilURI('/conpherence/new/')) + ->setQueryParam('participant', $user->getPHID()); $name = pht('Send a Message'); $hovercard->addAction($name, $conpherence_uri, true); diff --git a/src/applications/conpherence/mail/ConpherenceCreateThreadMailReceiver.php b/src/applications/conpherence/mail/ConpherenceCreateThreadMailReceiver.php --- a/src/applications/conpherence/mail/ConpherenceCreateThreadMailReceiver.php +++ b/src/applications/conpherence/mail/ConpherenceCreateThreadMailReceiver.php @@ -53,7 +53,7 @@ $phids = mpull($users, 'getPHID'); $conpherence = id(new ConpherenceReplyHandler()) - ->setMailReceiver(ConpherenceThread::initializeNewThread($sender)) + ->setMailReceiver(ConpherenceThread::initializeNewRoom($sender)) ->setMailAddedParticipantPHIDs($phids) ->setActor($sender) ->setExcludeMailRecipientPHIDs($mail->loadExcludeMailRecipientPHIDs()) diff --git a/src/applications/conpherence/phid/PhabricatorConpherenceThreadPHIDType.php b/src/applications/conpherence/phid/PhabricatorConpherenceThreadPHIDType.php --- a/src/applications/conpherence/phid/PhabricatorConpherenceThreadPHIDType.php +++ b/src/applications/conpherence/phid/PhabricatorConpherenceThreadPHIDType.php @@ -5,7 +5,7 @@ const TYPECONST = 'CONP'; public function getTypeName() { - return pht('Conpherence Thread'); + return pht('Conpherence Room'); } public function newObject() { diff --git a/src/applications/conpherence/policyrule/ConpherenceThreadMembersPolicyRule.php b/src/applications/conpherence/policyrule/ConpherenceThreadMembersPolicyRule.php --- a/src/applications/conpherence/policyrule/ConpherenceThreadMembersPolicyRule.php +++ b/src/applications/conpherence/policyrule/ConpherenceThreadMembersPolicyRule.php @@ -8,15 +8,19 @@ } public function getObjectPolicyName() { - return pht('Thread Members'); + return pht('Room Participants'); } public function getPolicyExplanation() { - return pht('Members of this thread can take this action.'); + return pht('Participants in this room can take this action.'); } public function getRuleDescription() { - return pht('thread members'); + return pht('room participants'); + } + + public function getObjectPolicyIcon() { + return 'fa-comments'; } public function canApplyToObject(PhabricatorPolicyInterface $object) { diff --git a/src/applications/conpherence/query/ConpherenceThreadQuery.php b/src/applications/conpherence/query/ConpherenceThreadQuery.php --- a/src/applications/conpherence/query/ConpherenceThreadQuery.php +++ b/src/applications/conpherence/query/ConpherenceThreadQuery.php @@ -8,7 +8,6 @@ private $phids; private $ids; private $participantPHIDs; - private $isRoom; private $needParticipants; private $needWidgetData; private $needCropPics; @@ -71,11 +70,6 @@ return $this; } - public function withIsRoom($bool) { - $this->isRoom = $bool; - return $this; - } - public function setAfterTransactionID($id) { $this->afterTransactionID = $id; return $this; @@ -166,16 +160,6 @@ id(new ConpherenceParticipant())->getTableName()); } - $viewer = $this->getViewer(); - if ($this->shouldJoinForViewer($viewer)) { - $joins[] = qsprintf( - $conn_r, - 'LEFT JOIN %T v ON v.conpherencePHID = conpherence_thread.phid '. - 'AND v.participantPHID = %s', - id(new ConpherenceParticipant())->getTableName(), - $viewer->getPHID()); - } - if (strlen($this->fulltext)) { $joins[] = qsprintf( $conn_r, @@ -187,15 +171,6 @@ return implode(' ', $joins); } - private function shouldJoinForViewer(PhabricatorUser $viewer) { - if ($viewer->isLoggedIn() && - $this->ids === null && - $this->phids === null) { - return true; - } - return false; - } - protected function buildWhereClause(AphrontDatabaseConnection $conn_r) { $where = array(); @@ -222,13 +197,6 @@ $this->participantPHIDs); } - if ($this->isRoom !== null) { - $where[] = qsprintf( - $conn_r, - 'conpherence_thread.isRoom = %d', - (int)$this->isRoom); - } - if (strlen($this->fulltext)) { $where[] = qsprintf( $conn_r, @@ -236,17 +204,6 @@ $this->fulltext); } - $viewer = $this->getViewer(); - if ($this->shouldJoinForViewer($viewer)) { - $where[] = qsprintf( - $conn_r, - 'conpherence_thread.isRoom = 1 OR v.participantPHID IS NOT NULL'); - } else if ($this->phids === null && $this->ids === null) { - $where[] = qsprintf( - $conn_r, - 'conpherence_thread.isRoom = 1'); - } - return $this->formatWhereClause($where); } diff --git a/src/applications/conpherence/query/ConpherenceThreadSearchEngine.php b/src/applications/conpherence/query/ConpherenceThreadSearchEngine.php --- a/src/applications/conpherence/query/ConpherenceThreadSearchEngine.php +++ b/src/applications/conpherence/query/ConpherenceThreadSearchEngine.php @@ -4,7 +4,7 @@ extends PhabricatorApplicationSearchEngine { public function getResultTypeDescription() { - return pht('Threads'); + return pht('Rooms'); } public function getApplicationClassName() { @@ -20,10 +20,6 @@ $saved->setParameter('fulltext', $request->getStr('fulltext')); - $saved->setParameter( - 'threadType', - $request->getStr('threadType')); - return $saved; } @@ -41,21 +37,6 @@ $query->withFulltext($fulltext); } - $thread_type = $saved->getParameter('threadType'); - if (idx($this->getTypeOptions(), $thread_type)) { - switch ($thread_type) { - case 'rooms': - $query->withIsRoom(true); - break; - case 'messages': - $query->withIsRoom(false); - break; - case 'both': - $query->withIsRoom(null); - break; - } - } - return $query; } @@ -77,13 +58,7 @@ id(new AphrontFormTextControl()) ->setName('fulltext') ->setLabel(pht('Contains Words')) - ->setValue($fulltext)) - ->appendControl( - id(new AphrontFormSelectControl()) - ->setLabel(pht('Type')) - ->setName('threadType') - ->setOptions($this->getTypeOptions()) - ->setValue($saved->getParameter('threadType'))); + ->setValue($fulltext)); } protected function getURI($path) { @@ -99,7 +74,6 @@ if ($this->requireViewer()->isLoggedIn()) { $names['participant'] = pht('Joined Rooms'); - $names['messages'] = pht('All Messages'); } return $names; @@ -112,15 +86,8 @@ switch ($query_key) { case 'all': - $query->setParameter('threadType', 'rooms'); return $query; case 'participant': - $query->setParameter('threadType', 'rooms'); - return $query->setParameter( - 'participantPHIDs', - array($this->requireViewer()->getPHID())); - case 'messages': - $query->setParameter('threadType', 'messages'); return $query->setParameter( 'participantPHIDs', array($this->requireViewer()->getPHID())); @@ -145,7 +112,7 @@ $viewer = $this->requireViewer(); - $policy_objects = ConpherenceThread::loadPolicyObjects( + $policy_objects = ConpherenceThread::loadViewPolicyObjects( $viewer, $conpherences); @@ -192,11 +159,7 @@ $title = $conpherence->getDisplayTitle($viewer); $monogram = $conpherence->getMonogram(); - if ($conpherence->getIsRoom()) { - $icon_name = $conpherence->getPolicyIconName($policy_objects); - } else { - $icon_name = 'fa-envelope-o'; - } + $icon_name = $conpherence->getPolicyIconName($policy_objects); $icon = id(new PHUIIconView()) ->setIconFont($icon_name); $item = id(new PHUIObjectItemView()) @@ -256,14 +219,6 @@ return $list; } - private function getTypeOptions() { - return array( - 'rooms' => pht('Rooms'), - 'messages' => pht('Messages'), - 'both' => pht('Both'), - ); - } - private function loadContextMessages(array $threads, $fulltext) { $phids = mpull($threads, 'getPHID'); 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 @@ -9,7 +9,6 @@ protected $title; protected $imagePHIDs = array(); - protected $isRoom = 0; protected $messageCount; protected $recentParticipantPHIDs = array(); protected $mailKey; @@ -24,30 +23,18 @@ private $widgetData = self::ATTACHABLE; private $images = self::ATTACHABLE; - public static function initializeNewThread(PhabricatorUser $sender) { + public static function initializeNewRoom(PhabricatorUser $sender) { + $default_policy = id(new ConpherenceThreadMembersPolicyRule()) + ->getObjectPolicyFullKey(); return id(new ConpherenceThread()) ->setMessageCount(0) ->setTitle('') ->attachParticipants(array()) ->attachFilePHIDs(array()) ->attachImages(array()) - ->setViewPolicy(PhabricatorPolicies::POLICY_USER) - ->setEditPolicy(PhabricatorPolicies::POLICY_USER) - ->setJoinPolicy(PhabricatorPolicies::POLICY_USER); - } - - public static function initializeNewRoom(PhabricatorUser $creator) { - - return id(new ConpherenceThread()) - ->setIsRoom(1) - ->setMessageCount(0) - ->setTitle('') - ->attachParticipants(array()) - ->attachFilePHIDs(array()) - ->attachImages(array()) - ->setViewPolicy(PhabricatorPolicies::POLICY_USER) - ->setEditPolicy($creator->getPHID()) - ->setJoinPolicy(PhabricatorPolicies::POLICY_USER); + ->setViewPolicy($default_policy) + ->setEditPolicy($default_policy) + ->setJoinPolicy($default_policy); } protected function getConfiguration() { @@ -59,15 +46,11 @@ ), self::CONFIG_COLUMN_SCHEMA => array( 'title' => 'text255?', - 'isRoom' => 'bool', 'messageCount' => 'uint64', 'mailKey' => 'text20', 'joinPolicy' => 'policy', ), self::CONFIG_KEY_SCHEMA => array( - 'key_room' => array( - 'columns' => array('isRoom', 'dateModified'), - ), 'key_phid' => null, 'phid' => array( 'columns' => array('phid'), @@ -214,7 +197,7 @@ return $title; } - return pht('Private Correspondence'); + return pht('Private Room'); } /** @@ -382,15 +365,13 @@ } public function getPolicy($capability) { - if ($this->getIsRoom()) { - switch ($capability) { - case PhabricatorPolicyCapability::CAN_VIEW: - return $this->getViewPolicy(); - case PhabricatorPolicyCapability::CAN_EDIT: - return $this->getEditPolicy(); - case PhabricatorPolicyCapability::CAN_JOIN: - return $this->getJoinPolicy(); - } + switch ($capability) { + case PhabricatorPolicyCapability::CAN_VIEW: + return $this->getViewPolicy(); + case PhabricatorPolicyCapability::CAN_EDIT: + return $this->getEditPolicy(); + case PhabricatorPolicyCapability::CAN_JOIN: + return $this->getJoinPolicy(); } return PhabricatorPolicies::POLICY_NOONE; } @@ -401,12 +382,10 @@ return true; } - if ($this->getIsRoom()) { - switch ($capability) { - case PhabricatorPolicyCapability::CAN_EDIT: - case PhabricatorPolicyCapability::CAN_JOIN: - return false; - } + switch ($capability) { + case PhabricatorPolicyCapability::CAN_EDIT: + case PhabricatorPolicyCapability::CAN_JOIN: + return false; } $participants = $this->getParticipants(); @@ -414,35 +393,28 @@ } public function describeAutomaticCapability($capability) { - if ($this->getIsRoom()) { - switch ($capability) { - case PhabricatorPolicyCapability::CAN_VIEW: - return pht('Participants in a room can always view it.'); - break; - } - } else { - return pht('Participants in a thread can always view and edit it.'); + switch ($capability) { + case PhabricatorPolicyCapability::CAN_VIEW: + return pht('Participants in a room can always view it.'); + break; } } - public static function loadPolicyObjects( + public static function loadViewPolicyObjects( PhabricatorUser $viewer, array $conpherences) { assert_instances_of($conpherences, __CLASS__); - $grouped = mgroup($conpherences, 'getIsRoom'); - $rooms = idx($grouped, 1, array()); - $policies = array(); - foreach ($rooms as $room) { - $policies[] = $room->getViewPolicy(); + foreach ($conpherences as $room) { + $policies[$room->getViewPolicy()] = 1; } $policy_objects = array(); if ($policies) { $policy_objects = id(new PhabricatorPolicyQuery()) ->setViewer($viewer) - ->withPHIDs($policies) + ->withPHIDs(array_keys($policies)) ->execute(); } @@ -452,13 +424,7 @@ 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'; - } + $icon = $policy_objects[$this->getViewPolicy()]->getIcon(); return $icon; } diff --git a/src/applications/conpherence/storage/ConpherenceTransaction.php b/src/applications/conpherence/storage/ConpherenceTransaction.php --- a/src/applications/conpherence/storage/ConpherenceTransaction.php +++ b/src/applications/conpherence/storage/ConpherenceTransaction.php @@ -63,11 +63,7 @@ case PhabricatorTransactions::TYPE_EDIT_POLICY: case PhabricatorTransactions::TYPE_JOIN_POLICY: case self::TYPE_PICTURE: - if ($this->getObject()->getIsRoom()) { - return $this->getRoomTitle(); - } else { - return $this->getThreadTitle(); - } + return $this->getRoomTitle(); break; case self::TYPE_FILES: $add = array_diff($new, $old); @@ -180,62 +176,6 @@ } } - private function getThreadTitle() { - $author_phid = $this->getAuthorPHID(); - - $old = $this->getOldValue(); - $new = $this->getNewValue(); - - switch ($this->getTransactionType()) { - case self::TYPE_TITLE: - if ($old && $new) { - $title = pht( - '%s renamed this thread from "%s" to "%s".', - $this->renderHandleLink($author_phid), - $old, - $new); - } else if ($old) { - $title = pht( - '%s deleted the thread name "%s".', - $this->renderHandleLink($author_phid), - $old); - } else { - $title = pht( - '%s named this thread "%s".', - $this->renderHandleLink($author_phid), - $new); - } - return $title; - break; - case self::TYPE_PICTURE: - return pht( - '%s updated the room image.', - $this->renderHandleLink($author_phid)); - break; - case PhabricatorTransactions::TYPE_VIEW_POLICY: - return pht( - '%s changed the visibility of this thread from "%s" to "%s".', - $this->renderHandleLink($author_phid), - $this->renderPolicyName($old, 'old'), - $this->renderPolicyName($new, 'new')); - break; - case PhabricatorTransactions::TYPE_EDIT_POLICY: - return pht( - '%s changed the edit policy of this thread from "%s" to "%s".', - $this->renderHandleLink($author_phid), - $this->renderPolicyName($old, 'old'), - $this->renderPolicyName($new, 'new')); - break; - case PhabricatorTransactions::TYPE_JOIN_POLICY: - return pht( - '%s changed the join policy of this thread from "%s" to "%s".', - $this->renderHandleLink($author_phid), - $this->renderPolicyName($old, 'old'), - $this->renderPolicyName($new, 'new')); - break; - } - } - public function getRequiredHandlePHIDs() { $phids = parent::getRequiredHandlePHIDs(); 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 @@ -119,21 +119,9 @@ 'quicksandConfig' => $this->getQuicksandConfig(), )); - $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(); - } + $policy_objects = ConpherenceThread::loadViewPolicyObjects( + $this->getUser(), + $this->getConpherences()); $this->setPolicyObjects($policy_objects); $classes = array(); @@ -224,13 +212,10 @@ assert_instances_of($policy_objects, 'PhabricatorPolicy'); - $icon = null; - if ($conpherence->getIsRoom()) { - $icon = $conpherence->getPolicyIconName($policy_objects); - $icon = id(new PHUIIconView()) - ->addClass('mmr') - ->setIconFont($icon); - } + $icon = $conpherence->getPolicyIconName($policy_objects); + $icon = id(new PHUIIconView()) + ->addClass('mmr') + ->setIconFont($icon); return $icon; } @@ -391,11 +376,6 @@ } private function getHeaderActionsConfig(ConpherenceThread $conpherence) { - if ($conpherence->getIsRoom()) { - $rename_label = pht('Edit Room'); - } else { - $rename_label = pht('Rename Thread'); - } $can_edit = PhabricatorPolicyFilter::hasCapability( $this->getUser(), $conpherence, @@ -410,7 +390,7 @@ 'key' => ConpherenceUpdateActions::ADD_PERSON, ), array( - 'name' => $rename_label, + 'name' => pht('Edit Room'), 'disabled' => !$can_edit, 'href' => '/conpherence/update/'.$conpherence->getID().'/?nopic', 'icon' => 'fa-pencil', @@ -445,7 +425,7 @@ array( 'class' => 'mmb', ), - pht('You do not have any messages yet.')), + pht('You are not in any rooms yet.')), javelin_tag( 'a', array( @@ -453,7 +433,7 @@ 'class' => 'button grey', 'sigil' => 'workflow', ), - pht('Send a Message')), + pht('Create a Room')), ); } diff --git a/src/applications/conpherence/view/ConpherenceLayoutView.php b/src/applications/conpherence/view/ConpherenceLayoutView.php --- a/src/applications/conpherence/view/ConpherenceLayoutView.php +++ b/src/applications/conpherence/view/ConpherenceLayoutView.php @@ -147,7 +147,7 @@ array( 'class' => 'text', ), - pht('You do not have any messages yet.')), + pht('You are not in any rooms yet.')), javelin_tag( 'a', array( @@ -155,7 +155,7 @@ 'class' => 'button grey', 'sigil' => 'workflow', ), - pht('Send a Message')), + pht('Create a Room')), )), javelin_tag( 'div', diff --git a/src/applications/conpherence/view/ConpherenceThreadListView.php b/src/applications/conpherence/view/ConpherenceThreadListView.php --- a/src/applications/conpherence/view/ConpherenceThreadListView.php +++ b/src/applications/conpherence/view/ConpherenceThreadListView.php @@ -2,7 +2,7 @@ final class ConpherenceThreadListView extends AphrontView { - const SEE_MORE_LIMIT = 5; + const SEE_MORE_LIMIT = 15; private $baseURI; private $threads; @@ -25,40 +25,25 @@ ->addClass('conpherence-menu') ->setID('conpherence-menu'); - $policy_objects = ConpherenceThread::loadPolicyObjects( + $policy_objects = ConpherenceThread::loadViewPolicyObjects( $this->getUser(), $this->threads); - $grouped = mgroup($this->threads, 'getIsRoom'); - $rooms = idx($grouped, 1, array()); - $this->addRoomsToMenu($menu, $rooms, $policy_objects); - $messages = idx($grouped, 0, array()); - $this->addMessagesToMenu($menu, $messages); + $this->addRoomsToMenu($menu, $this->threads, $policy_objects); return $menu; } - public function renderSingleThread(ConpherenceThread $thread) { - $policy_objects = id(new PhabricatorPolicyQuery()) - ->setViewer($this->getUser()) - ->setObject($thread) - ->execute(); + public function renderSingleThread( + ConpherenceThread $thread, + array $policy_objects) { + assert_instances_of($policy_objects, 'PhabricatorPolicy'); return $this->renderThread($thread, $policy_objects); } - public function renderThreadsHTML() { - $thread_html = array(); - - foreach ($this->threads as $thread) { - $thread_html[] = $this->renderSingleThread($thread); - } - - return phutil_implode_html('', $thread_html); - } - private function renderThreadItem( ConpherenceThread $thread, - $policy_objects = array()) { + array $policy_objects) { return id(new PHUIListItemView()) ->setType(PHUIListItemView::TYPE_CUSTOM) ->setName($this->renderThread($thread, $policy_objects)); @@ -72,12 +57,9 @@ $uri = '/'.$thread->getMonogram(); $data = $thread->getDisplayData($user); - $icon = null; - if ($thread->getIsRoom()) { - $icon = id(new PHUIIconView()) - ->addClass('msr') - ->setIconFont($thread->getPolicyIconName($policy_objects)); - } + $icon = id(new PHUIIconView()) + ->addClass('msr') + ->setIconFont($thread->getPolicyIconName($policy_objects)); $title = phutil_tag( 'span', array(), @@ -141,7 +123,7 @@ $create_item = id(new PHUIListItemView()) ->setType(PHUIListItemView::TYPE_LINK) - ->setHref('/conpherence/room/new/') + ->setHref('/conpherence/new/') ->setWorkflow(true) ->setName(pht('Create a Room')); $menu->addMenuItem($create_item); @@ -153,25 +135,6 @@ return $menu; } - private function addMessagesToMenu( - PHUIListView $menu, - array $conpherences) { - - $header = $this->renderMenuItemHeader( - pht('Messages'), - 'conpherence-message-list-header'); - $menu->addMenuItem($header); - - if (empty($conpherences)) { - $menu->addMenuItem($this->getNoMessagesMenuItem()); - return $menu; - } - - $this->addThreadsToMenu($menu, $conpherences, array()); - - return $menu; - } - private function addThreadsToMenu( PHUIListView $menu, array $threads, @@ -187,21 +150,14 @@ $more_threads = array_slice($threads, self::SEE_MORE_LIMIT); } - $is_room = false; foreach ($show_threads as $thread) { $item = $this->renderThreadItem($thread, $policy_objects); $menu->addMenuItem($item); - $is_room = $thread->getIsRoom(); } if ($more_threads) { - if ($is_room) { - $search_uri = '/conpherence/search/query/participant/'; - $sigil = 'more-room'; - } else { - $search_uri = '/conpherence/search/query/messages/'; - $sigil = 'more-message'; - } + $search_uri = '/conpherence/search/query/participant/'; + $sigil = 'more-room'; $more_item = id(new PHUIListItemView()) ->setType(PHUIListItemView::TYPE_LINK) @@ -251,19 +207,6 @@ return $item; } - private function getNoMessagesMenuItem() { - $message = phutil_tag( - 'div', - array( - 'class' => 'no-conpherences-menu-item', - ), - pht('No Messages')); - - return id(new PHUIListItemView()) - ->setType(PHUIListItemView::TYPE_CUSTOM) - ->setName($message); - } - private function getNoRoomsMenuItem() { $message = phutil_tag( 'div', diff --git a/src/applications/people/controller/PhabricatorPeopleProfileController.php b/src/applications/people/controller/PhabricatorPeopleProfileController.php --- a/src/applications/people/controller/PhabricatorPeopleProfileController.php +++ b/src/applications/people/controller/PhabricatorPeopleProfileController.php @@ -136,7 +136,8 @@ $class = 'PhabricatorConpherenceApplication'; if (PhabricatorApplication::isClassInstalledForViewer($class, $viewer)) { - $href = '/conpherence/new/?participant='.$user->getPHID(); + $href = id(new PhutilURI('/conpherence/new/')) + ->setQueryParam('participant', $user->getPHID()); $image = id(new PHUIIconView()) ->setIconFont('fa-comments'); $button = id(new PHUIButtonView()) diff --git a/webroot/rsrc/js/application/conpherence/behavior-widget-pane.js b/webroot/rsrc/js/application/conpherence/behavior-widget-pane.js --- a/webroot/rsrc/js/application/conpherence/behavior-widget-pane.js +++ b/webroot/rsrc/js/application/conpherence/behavior-widget-pane.js @@ -321,6 +321,7 @@ }); } }); + threadManager.syncWorkflow(workflow, 'submit'); } ); @@ -331,9 +332,25 @@ function (e) { var href = config.widgetBaseUpdateURI + _loadedWidgetsID + '/'; var data = e.getNodeData('remove-person'); - // we end up re-directing to conpherence home + + // While the user is removing themselves, disable the notification + // update behavior. If we don't do this, the user can get an error + // when they remove themselves about permissions as the notification + // code tries to load what jist happened. + var threadManager = JX.ConpherenceThreadManager.getInstance(); + var loadedPhid = threadManager.getLoadedThreadPHID(); + threadManager.setLoadedThreadPHID(null); + new JX.Workflow(href, data) - .start(); + .setCloseHandler(function() { + threadManager.setLoadedThreadPHID(loadedPhid); + }) + // we re-direct to conpherence home so the thread manager will + // fix itself there + .setHandler(function(r) { + JX.$U(r.href).go(); + }) + .start(); } );