Page MenuHomePhabricator

D12222.id29366.diff
No OneTemporary

D12222.id29366.diff

diff --git a/resources/celerity/map.php b/resources/celerity/map.php
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -45,7 +45,7 @@
'rsrc/css/application/config/setup-issue.css' => '22270af2',
'rsrc/css/application/config/unhandled-exception.css' => '37d4f9a2',
'rsrc/css/application/conpherence/durable-column.css' => 'caa12d4a',
- 'rsrc/css/application/conpherence/menu.css' => 'beef0920',
+ 'rsrc/css/application/conpherence/menu.css' => '7c900089',
'rsrc/css/application/conpherence/message-pane.css' => '44154798',
'rsrc/css/application/conpherence/notification.css' => '04a6e10a',
'rsrc/css/application/conpherence/update.css' => '1099a660',
@@ -355,7 +355,7 @@
'rsrc/js/application/config/behavior-reorder-fields.js' => '14a827de',
'rsrc/js/application/conpherence/ConpherenceThreadManager.js' => 'bb928342',
'rsrc/js/application/conpherence/behavior-durable-column.js' => 'c81c2bba',
- 'rsrc/js/application/conpherence/behavior-menu.js' => 'de5579b4',
+ 'rsrc/js/application/conpherence/behavior-menu.js' => 'cda6de80',
'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' => '1ec93bcf',
@@ -515,7 +515,7 @@
'config-options-css' => '7fedf08b',
'config-welcome-css' => '6abd79be',
'conpherence-durable-column-view' => 'caa12d4a',
- 'conpherence-menu-css' => 'beef0920',
+ 'conpherence-menu-css' => '7c900089',
'conpherence-message-pane-css' => '44154798',
'conpherence-notification-css' => '04a6e10a',
'conpherence-thread-manager' => 'bb928342',
@@ -557,7 +557,7 @@
'javelin-behavior-boards-dropdown' => '0ec56e1d',
'javelin-behavior-choose-control' => '6153c708',
'javelin-behavior-config-reorder-fields' => '14a827de',
- 'javelin-behavior-conpherence-menu' => 'de5579b4',
+ 'javelin-behavior-conpherence-menu' => 'cda6de80',
'javelin-behavior-conpherence-pontificate' => '21ba5861',
'javelin-behavior-conpherence-widget-pane' => '1ec93bcf',
'javelin-behavior-countdown-timer' => 'e4cc26b3',
@@ -1755,6 +1755,18 @@
'javelin-stratcom',
'phabricator-phtize',
),
+ 'cda6de80' => array(
+ 'javelin-behavior',
+ 'javelin-dom',
+ 'javelin-util',
+ 'javelin-stratcom',
+ 'javelin-workflow',
+ 'javelin-behavior-device',
+ 'javelin-history',
+ 'javelin-vector',
+ 'phabricator-shaped-request',
+ 'conpherence-thread-manager',
+ ),
'd19198c8' => array(
'javelin-install',
'javelin-dom',
@@ -1807,18 +1819,6 @@
'javelin-typeahead-ondemand-source',
'javelin-dom',
),
- 'de5579b4' => array(
- 'javelin-behavior',
- 'javelin-dom',
- 'javelin-util',
- 'javelin-stratcom',
- 'javelin-workflow',
- 'javelin-behavior-device',
- 'javelin-history',
- 'javelin-vector',
- 'phabricator-shaped-request',
- 'conpherence-thread-manager',
- ),
'e10f8e18' => array(
'javelin-behavior',
'javelin-dom',
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
@@ -80,8 +80,8 @@
assert_instances_of($policy_objects, 'PhabricatorPolicy');
$crumbs = $this->buildApplicationCrumbs();
- $title = $this->getConpherenceTitle($conpherence);
- if ($conpherence->getID()) {
+ $data = $conpherence->getDisplayData($this->getViewer());
+ if ($conpherence->getID() && $conpherence->getIsRoom()) {
$icon = $conpherence->getPolicyIconName($policy_objects);
} else {
$icon = null;
@@ -89,7 +89,7 @@
$crumbs->addCrumb(
id(new PHUICrumbView())
->setIcon($icon)
- ->setName($title)
+ ->setName($data['title'])
->setHref($this->getApplicationURI('update/'.$conpherence->getID().'/'))
->setWorkflow(true));
@@ -106,13 +106,4 @@
));
}
- protected function getConpherenceTitle(ConpherenceThread $conpherence) {
- if ($conpherence->getTitle()) {
- $title = $conpherence->getTitle();
- } else {
- $title = pht('[No Title]');
- }
- return $title;
- }
-
}
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
@@ -4,14 +4,12 @@
const SELECTED_MODE = 'selected';
const UNSELECTED_MODE = 'unselected';
- const PAGING_MODE = 'paging';
/**
- * Three main modes of operation...
+ * Two main modes of operation...
*
* 1 - /conpherence/ - UNSELECTED_MODE
* 2 - /conpherence/<id>/ - SELECTED_MODE
- * 3 - /conpherence/?direction='up'&... - PAGING_MODE
*
* UNSELECTED_MODE is not an Ajax request while the other two are Ajax
* requests.
@@ -21,11 +19,7 @@
$mode = self::UNSELECTED_MODE;
if ($request->isAjax()) {
- if ($request->getStr('direction')) {
- $mode = self::PAGING_MODE;
- } else {
- $mode = self::SELECTED_MODE;
- }
+ $mode = self::SELECTED_MODE;
}
return $mode;
@@ -36,9 +30,7 @@
$title = pht('Conpherence');
$conpherence = null;
- $scroll_up_participant = $this->getEmptyParticipant();
- $scroll_down_participant = $this->getEmptyParticipant();
- $too_many = ConpherenceParticipantQuery::LIMIT + 1;
+ $limit = ConpherenceThreadListView::SEE_MORE_LIMIT * 5;
$all_participation = array();
$mode = $this->determineMode();
@@ -56,60 +48,24 @@
$title = $conpherence->getTitle();
}
$cursor = $conpherence->getParticipantIfExists($user->getPHID());
- if (!$cursor || $conpherence->getIsRoom()) {
- $data = $this->loadDefaultParticipation($too_many);
- $all_participation = $data['all_participation'];
- $scroll_down_participant = $data['scroll_down_participant'];
- $menu_participation = $this->getEmptyParticipant()
+ $data = $this->loadDefaultParticipation($limit);
+ $all_participation = $data['all_participation'];
+ if (!$cursor) {
+ $menu_participation = id(new ConpherenceParticipant())
+ ->makeEphemeral()
->setConpherencePHID($conpherence->getPHID())
->setParticipantPHID($user->getPHID());
- $all_participation =
- array($conpherence->getPHID() => $menu_participation) +
- $all_participation;
-
- } else {
- $data = $this->loadParticipationWithMidCursor($cursor);
- $all_participation = $data['all_participation'];
- $scroll_up_participant = $data['scroll_up_participant'];
- $scroll_down_participant = $data['scroll_down_participant'];
- }
- break;
- case self::PAGING_MODE:
- $direction = $request->getStr('direction');
- $id = $request->getInt('participant_id');
- $date_touched = $request->getInt('date_touched');
- $conpherence_phid = $request->getStr('conpherence_phid');
- if ($direction == 'up') {
- $order = ConpherenceParticipantQuery::ORDER_NEWER;
} else {
- $order = ConpherenceParticipantQuery::ORDER_OLDER;
- }
- $scroller_participant = id(new ConpherenceParticipant())
- ->makeEphemeral()
- ->setID($id)
- ->setDateTouched($date_touched)
- ->setConpherencePHID($conpherence_phid);
- $participation = id(new ConpherenceParticipantQuery())
- ->withParticipantPHIDs(array($user->getPHID()))
- ->withParticipantCursor($scroller_participant)
- ->setOrder($order)
- ->setLimit($too_many)
- ->execute();
- if (count($participation) == $too_many) {
- if ($direction == 'up') {
- $node = $scroll_up_participant = reset($participation);
- } else {
- $node = $scroll_down_participant = end($participation);
- }
- unset($participation[$node->getConpherencePHID()]);
+ $menu_participation = $cursor;
}
- $all_participation = $participation;
+ $all_participation =
+ array($conpherence->getPHID() => $menu_participation) +
+ $all_participation;
break;
case self::UNSELECTED_MODE:
default:
- $data = $this->loadDefaultParticipation($too_many);
+ $data = $this->loadDefaultParticipation($limit);
$all_participation = $data['all_participation'];
- $scroll_down_participant = $data['scroll_down_participant'];
break;
}
@@ -119,23 +75,12 @@
$thread_view = id(new ConpherenceThreadListView())
->setUser($user)
->setBaseURI($this->getApplicationURI())
- ->setThreads($threads)
- ->setScrollUpParticipant($scroll_up_participant)
- ->setScrollDownParticipant($scroll_down_participant);
+ ->setThreads($threads);
switch ($mode) {
case self::SELECTED_MODE:
$response = id(new AphrontAjaxResponse())->setContent($thread_view);
break;
- case self::PAGING_MODE:
- $thread_html = $thread_view->renderThreadsHTML();
- $phids = array_keys($participation);
- $content = array(
- 'html' => $thread_html,
- 'phids' => $phids,
- );
- $response = id(new AphrontAjaxResponse())->setContent($content);
- break;
case self::UNSELECTED_MODE:
default:
$layout = id(new ConpherenceLayoutView())
@@ -153,11 +98,11 @@
$policy_objects));
$layout->setThread($conpherence);
} else {
+ $thread = ConpherenceThread::initializeNewThread($user);
+ $thread->attachHandles(array());
+ $thread->makeEphemeral();
$layout->setHeader(
- $this->buildHeaderPaneContent(
- id(new ConpherenceThread())
- ->makeEphemeral(),
- array()));
+ $this->buildHeaderPaneContent($thread, array()));
}
$response = $this->buildApplicationPage(
$layout,
@@ -171,81 +116,16 @@
}
- private function loadDefaultParticipation($too_many) {
+ private function loadDefaultParticipation($limit) {
$viewer = $this->getRequest()->getUser();
- $scroll_down_participant = $this->getEmptyParticipant();
-
$all_participation = id(new ConpherenceParticipantQuery())
->withParticipantPHIDs(array($viewer->getPHID()))
- ->setLimit($too_many)
+ ->setLimit($limit)
->execute();
- if (count($all_participation) == $too_many) {
- $node = end($all_participation);
- unset($all_participation[$node->getConpherencePHID()]);
- $scroll_down_participant = $node;
- }
return array(
- 'all_participation' => $all_participation,
- 'scroll_down_participant' => $scroll_down_participant,);
- }
-
- /**
- * Handles the curious case when we are visiting a conpherence directly
- * by issuing two separate queries. Otherwise, additional conpherences
- * are fetched asynchronously. Note these can be earlier or later
- * (up or down), depending on what conpherence was selected on initial
- * load.
- */
- private function loadParticipationWithMidCursor(
- ConpherenceParticipant $cursor) {
-
- $user = $this->getRequest()->getUser();
-
- $scroll_up_participant = $this->getEmptyParticipant();
- $scroll_down_participant = $this->getEmptyParticipant();
-
- // Note this is a bit dodgy since there may be less than this
- // amount in either the up or down direction, thus having us fail
- // to fetch LIMIT in total. Whatevs for now and re-visit if we're
- // fine-tuning this loading process.
- $too_many = ceil(ConpherenceParticipantQuery::LIMIT / 2) + 1;
- $participant_query = id(new ConpherenceParticipantQuery())
- ->withParticipantPHIDs(array($user->getPHID()))
- ->setLimit($too_many);
- $current_selection_epoch = $cursor->getDateTouched();
- $set_one = $participant_query
- ->withParticipantCursor($cursor)
- ->setOrder(ConpherenceParticipantQuery::ORDER_NEWER)
- ->execute();
-
- if (count($set_one) == $too_many) {
- $node = reset($set_one);
- unset($set_one[$node->getConpherencePHID()]);
- $scroll_up_participant = $node;
- }
-
- $set_two = $participant_query
- ->withParticipantCursor($cursor)
- ->setOrder(ConpherenceParticipantQuery::ORDER_OLDER)
- ->execute();
-
- if (count($set_two) == $too_many) {
- $node = end($set_two);
- unset($set_two[$node->getConpherencePHID()]);
- $scroll_down_participant = $node;
- }
-
- $participation = array_merge(
- $set_one,
- $set_two);
-
- return array(
- 'scroll_up_participant' => $scroll_up_participant,
- 'scroll_down_participant' => $scroll_down_participant,
- 'all_participation' => $participation,
- );
+ 'all_participation' => $all_participation,);
}
private function loadConpherenceThreadData($participation) {
@@ -266,9 +146,4 @@
return $conpherences;
}
- private function getEmptyParticipant() {
- return id(new ConpherenceParticipant())
- ->makeEphemeral();
- }
-
}
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
@@ -31,6 +31,7 @@
->setViewer($user)
->withIDs(array($conpherence_id))
->needFilePHIDs(true)
+ ->needParticipantCache(true)
->requireCapabilities($needed_capabilities)
->executeOne();
@@ -409,10 +410,10 @@
if ($people_widget) {
$people_html = hsprintf('%s', $people_widget->render());
}
- $title = $this->getConpherenceTitle($conpherence);
+ $data = $conpherence->getDisplayData($user);
$content = array(
'transactions' => hsprintf('%s', $rendered_transactions),
- 'conpherence_title' => (string) $title,
+ 'conpherence_title' => (string) $data['title'],
'latest_transaction_id' => $new_latest_transaction_id,
'nav_item' => hsprintf('%s', $nav_item),
'conpherence_phid' => $conpherence->getPHID(),
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
@@ -60,8 +60,8 @@
);
}
- $title = $this->getConpherenceTitle($conpherence);
- $content['title'] = $title;
+ $d_data = $conpherence->getDisplayData($user);
+ $content['title'] = $title = $d_data['title'];
if ($request->isAjax()) {
$content['threadID'] = $conpherence->getID();
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
@@ -17,6 +17,7 @@
array $phids) {
return id(new ConpherenceThreadQuery())
+ ->needParticipantCache(true)
->withPHIDs($phids);
}
@@ -27,12 +28,9 @@
foreach ($handles as $phid => $handle) {
$thread = $objects[$phid];
- $name = $thread->getTitle();
- if (!strlen($name)) {
- $name = pht('[No Title]');
- }
- $handle->setName($name);
- $handle->setFullName($name);
+ $data = $thread->getDisplayData($query->getViewer());
+ $handle->setName($data['title']);
+ $handle->setFullName($data['title']);
$handle->setURI('/conpherence/'.$thread->getID().'/');
}
}
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
@@ -80,6 +80,7 @@
if ($this->requireViewer()->isLoggedIn()) {
$names['participant'] = pht('Joined Rooms');
+ $names['messages'] = pht('All Messages');
}
}
@@ -98,6 +99,9 @@
return $query->setParameter(
'participantPHIDs',
array($this->requireViewer()->getPHID()));
+ case 'messages':
+ $this->setIsRooms(false);
+ return $query;
}
return parent::buildSavedQueryFromBuiltin($query_key);
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
@@ -174,11 +174,10 @@
}
$title = $js_title = $this->getTitle();
- if (!$title) {
- $title = $lucky_handle->getName();
- $js_title = pht('[No Title]');
+ $img_src = null;
+ if ($lucky_handle) {
+ $img_src = $lucky_handle->getImageURI();
}
- $img_src = $lucky_handle->getImageURI();
$count = 0;
$final = false;
@@ -200,6 +199,9 @@
$count++;
$final = $count == 3;
}
+ if (!$title) {
+ $title = $js_title = $subtitle;
+ }
$user_participation = $this->getParticipantIfExists($user->getPHID());
if ($user_participation) {
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
@@ -213,10 +213,14 @@
assert_instances_of($policy_objects, 'PhabricatorPolicy');
- $icon = $conpherence->getPolicyIconName($policy_objects);
- return id(new PHUIIconView())
- ->addClass('mmr')
- ->setIconFont($icon);
+ $icon = null;
+ if ($conpherence->getIsRoom()) {
+ $icon = $conpherence->getPolicyIconName($policy_objects);
+ $icon = id(new PHUIIconView())
+ ->addClass('mmr')
+ ->setIconFont($icon);
+ }
+ return $icon;
}
private function buildIconBar() {
@@ -346,16 +350,13 @@
->addClass('phabricator-dark-menu')
->addClass('phabricator-application-menu');
- $title = $conpherence->getTitle();
- if (!$title) {
- $title = pht('[No Title]');
- }
+ $data = $conpherence->getDisplayData($this->getUser());
$header = phutil_tag(
'span',
array(),
array(
$this->getPolicyIcon($conpherence, $this->getPolicyObjects()),
- $title,
+ $data['title'],
));
}
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,10 +2,10 @@
final class ConpherenceThreadListView extends AphrontView {
+ const SEE_MORE_LIMIT = 5;
+
private $baseURI;
private $threads;
- private $scrollUpParticipant;
- private $scrollDownParticipant;
public function setThreads(array $threads) {
assert_instances_of($threads, 'ConpherenceThread');
@@ -13,18 +13,6 @@
return $this;
}
- public function setScrollUpParticipant(
- ConpherenceParticipant $participant) {
- $this->scrollUpParticipant = $participant;
- return $this;
- }
-
- public function setScrollDownParticipant(
- ConpherenceParticipant $participant) {
- $this->scrollDownParticipant = $participant;
- return $this;
- }
-
public function setBaseURI($base_uri) {
$this->baseURI = $base_uri;
return $this;
@@ -35,7 +23,6 @@
$grouped = mgroup($this->threads, 'getIsRoom');
$rooms = idx($grouped, true, array());
- $rooms = array_slice($rooms, 0, 5);
$policies = array();
foreach ($rooms as $room) {
@@ -55,7 +42,7 @@
$this->addRoomsToMenu($menu, $rooms, $policy_objects);
$messages = idx($grouped, false, array());
- $this->addThreadsToMenu($menu, $messages);
+ $this->addMessagesToMenu($menu, $messages);
return $menu;
}
@@ -71,22 +58,10 @@
public function renderThreadsHTML() {
$thread_html = array();
- if ($this->scrollUpParticipant->getID()) {
- $thread_html[] = $this->getScrollMenuItem(
- $this->scrollUpParticipant,
- 'up');
- }
-
foreach ($this->threads as $thread) {
$thread_html[] = $this->renderSingleThread($thread);
}
- if ($this->scrollDownParticipant->getID()) {
- $thread_html[] = $this->getScrollMenuItem(
- $this->scrollDownParticipant,
- 'down');
- }
-
return phutil_implode_html('', $thread_html);
}
@@ -106,13 +81,17 @@
$uri = $this->baseURI.$thread->getID().'/';
$data = $thread->getDisplayData($user);
+ $icon = null;
+ if ($thread->getIsRoom()) {
+ $icon = id(new PHUIIconView())
+ ->addClass('msr')
+ ->setIconFont($thread->getPolicyIconName($policy_objects));
+ }
$title = phutil_tag(
'span',
array(),
array(
- id(new PHUIIconView())
- ->addClass('msr')
- ->setIconFont($thread->getPolicyIconName($policy_objects)),
+ $icon,
$data['title'],
));
$subtitle = $data['subtitle'];
@@ -141,7 +120,7 @@
private function addRoomsToMenu(
PHUIListView $menu,
- array $conpherences,
+ array $rooms,
array $policy_objects) {
$header = $this->renderMenuItemHeader(
@@ -154,16 +133,16 @@
->setText(pht('Search')));
$menu->addMenuItem($header);
- if (empty($conpherences)) {
+ if (empty($rooms)) {
$join_item = id(new PHUIListItemView())
->setType(PHUIListItemView::TYPE_LINK)
- ->setHref('/conpherence/search/')
+ ->setHref('/room/search/')
->setName(pht('Join a Room'));
$menu->addMenuItem($join_item);
$create_item = id(new PHUIListItemView())
->setType(PHUIListItemView::TYPE_LINK)
- ->setHref('/conpherence/room/new/')
+ ->setHref('/room/room/new/')
->setWorkflow(true)
->setName(pht('Create a Room'));
$menu->addMenuItem($create_item);
@@ -171,46 +150,95 @@
return $menu;
}
- foreach ($conpherences as $conpherence) {
- $item = $this->renderThreadItem($conpherence, $policy_objects);
- $menu->addMenuItem($item);
+ $this->addThreadsToMenu($menu, $rooms, $policy_objects);
+ 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->getNoConpherencesMenuItem());
+ return $menu;
}
- $more_item = id(new PHUIListItemView())
- ->setType(PHUIListItemView::TYPE_LINK)
- ->setHref('/conpherence/search/query/participant/')
- ->setName(pht('See More'));
- $menu->addMenuItem($more_item);
+ $this->addThreadsToMenu($menu, $conpherences, array());
return $menu;
}
-
private function addThreadsToMenu(
PHUIListView $menu,
- array $conpherences) {
+ array $threads,
+ array $policy_objects) {
- if ($this->scrollUpParticipant->getID()) {
- $item = $this->getScrollMenuItem($this->scrollUpParticipant, 'up');
- $menu->addMenuItem($item);
+ // If we have self::SEE_MORE_LIMIT or less, we can just render
+ // all the threads at once. Otherwise, we render a "See more"
+ // UI element, which toggles a show / hide on the remaining rooms
+ $show_threads = $threads;
+ $more_threads = array();
+ if (count($threads) > self::SEE_MORE_LIMIT) {
+ $show_threads = array_slice($threads, 0, self::SEE_MORE_LIMIT);
+ $more_threads = array_slice($threads, self::SEE_MORE_LIMIT);
}
- $header = $this->renderMenuItemHeader(
- pht('Messages'), 'conpherence-message-list-header');
- $menu->addMenuItem($header);
-
- foreach ($conpherences as $conpherence) {
- $item = $this->renderThreadItem($conpherence);
+ $is_room = false;
+ foreach ($show_threads as $thread) {
+ $item = $this->renderThreadItem($thread, $policy_objects);
$menu->addMenuItem($item);
+ $is_room = $thread->getIsRoom();
}
- if (empty($conpherences)) {
- $menu->addMenuItem($this->getNoConpherencesMenuItem());
+ if ($is_room) {
+ $search_uri = '/conpherence/search/query/participant/';
+ $sigil = 'more-room';
+ } else {
+ $search_uri = '/conpherence/search/query/messages/';
+ $sigil = 'more-message';
}
- if ($this->scrollDownParticipant->getID()) {
- $item = $this->getScrollMenuItem($this->scrollDownParticipant, 'down');
- $menu->addMenuItem($item);
+ if ($more_threads) {
+ $more_item = id(new PHUIListItemView())
+ ->setType(PHUIListItemView::TYPE_LINK)
+ ->setHref($search_uri)
+ ->addSigil('conpherence-menu-see-more')
+ ->setMetadata(array('moreSigil' => $sigil))
+ ->setName(pht('See More'));
+ $menu->addMenuItem($more_item);
+ $show_more_threads = $more_threads;
+ $even_more_threads = array();
+ if (count($more_threads) > self::SEE_MORE_LIMIT) {
+ $show_more_threads = array_slice(
+ $more_threads,
+ 0,
+ self::SEE_MORE_LIMIT);
+ $even_more_threads = array_slice(
+ $more_threads,
+ self::SEE_MORE_LIMIT);
+ }
+ foreach ($show_more_threads as $thread) {
+ $item = $this->renderThreadItem($thread, $policy_objects)
+ ->addSigil($sigil)
+ ->addClass('hidden');
+ $menu->addMenuItem($item);
+ }
+
+ if ($even_more_threads) {
+ // kick them to application search here
+ $even_more_item = id(new PHUIListItemView())
+ ->setType(PHUIListItemView::TYPE_LINK)
+ ->setHref($search_uri)
+ ->addSigil($sigil)
+ ->addClass('hidden')
+ ->setName(pht('See More'));
+ $menu->addMenuItem($even_more_item);
+ }
}
return $menu;
@@ -224,29 +252,6 @@
return $item;
}
- public function getScrollMenuItem(
- ConpherenceParticipant $participant,
- $direction) {
-
- if ($direction == 'up') {
- $name = pht('Load Newer Threads');
- } else {
- $name = pht('Load Older Threads');
- }
- $item = id(new PHUIListItemView())
- ->addSigil('conpherence-menu-scroller')
- ->setName($name)
- ->setHref($this->baseURI)
- ->setType(PHUIListItemView::TYPE_BUTTON)
- ->setMetadata(array(
- 'participant_id' => $participant->getID(),
- 'conpherence_phid' => $participant->getConpherencePHID(),
- 'date_touched' => $participant->getDateTouched(),
- 'direction' => $direction,
- ));
- return $item;
- }
-
private function getNoMessagesMenuItem() {
$message = phutil_tag(
'div',
diff --git a/webroot/rsrc/css/application/conpherence/menu.css b/webroot/rsrc/css/application/conpherence/menu.css
--- a/webroot/rsrc/css/application/conpherence/menu.css
+++ b/webroot/rsrc/css/application/conpherence/menu.css
@@ -43,6 +43,10 @@
border-right: 1px solid {$hovergrey}
}
+.conpherence-menu-pane .phui-list-item-view.hidden {
+ display: none;
+}
+
.conpherence-menu-pane.phabricator-side-menu .phui-list-item-type-label {
padding: 10px 0 9px 8px;
}
diff --git a/webroot/rsrc/js/application/conpherence/behavior-menu.js b/webroot/rsrc/js/application/conpherence/behavior-menu.js
--- a/webroot/rsrc/js/application/conpherence/behavior-menu.js
+++ b/webroot/rsrc/js/application/conpherence/behavior-menu.js
@@ -478,8 +478,6 @@
config.selectedID && selectThreadByID(config.selectedID);
- _thread.node.scrollIntoView();
-
markThreadsLoading(false);
}
@@ -504,70 +502,19 @@
}
}
- var handleThreadScrollers = function (e) {
- e.kill();
-
- var data = e.getNodeData('conpherence-menu-scroller');
- var scroller = e.getNode('conpherence-menu-scroller');
- JX.DOM.alterClass(scroller, 'loading', true);
- JX.DOM.setContent(scroller.firstChild, 'Loading...');
- new JX.Workflow(scroller.href, data)
- .setHandler(
- JX.bind(null, threadScrollerResponse, scroller, data.direction))
- .start();
- };
-
- var threadScrollerResponse = function (scroller, direction, r) {
- var html = JX.$H(r.html);
-
- var thread_phids = r.phids;
- var reselect_id = null;
- // remove any threads that are in the list that we just got back
- // in the result set; things have changed and they'll be in the
- // right place soon
- for (var ii = 0; ii < thread_phids.length; ii++) {
- try {
- var node_id = thread_phids[ii] + '-nav-item';
- var node = JX.$(node_id);
- var node_data = JX.Stratcom.getData(node);
- if (node_data.id == _thread.selected) {
- reselect_id = node_id;
- }
- JX.DOM.remove(node);
- } catch (ex) {
- // ignore , just haven't seen this thread yet
- }
- }
-
- var root = JX.DOM.find(document, 'div', 'conpherence-layout');
- var menu_root = JX.DOM.find(root, 'div', 'conpherence-menu-pane');
- var scroll_y = 0;
- // we have to do some hyjinx in the up case to make the menu scroll to
- // where it should
- if (direction == 'up') {
- var style = {
- position: 'absolute',
- left: '-10000px'
- };
- var test_size = JX.$N('div', {style: style}, html);
- document.body.appendChild(test_size);
- var html_size = JX.Vector.getDim(test_size);
- JX.DOM.remove(test_size);
- scroll_y = html_size.y;
- }
- JX.DOM.replace(scroller, html);
- menu_root.scrollTop += scroll_y;
-
- if (reselect_id) {
- selectThreadByID(reselect_id);
- }
- };
-
JX.Stratcom.listen(
['click'],
- 'conpherence-menu-scroller',
- handleThreadScrollers
- );
+ 'conpherence-menu-see-more',
+ function (e) {
+ e.kill();
+ var sigil = e.getNodeData('conpherence-menu-see-more').moreSigil;
+ var root = JX.$('conpherence-menu-pane');
+ var more = JX.DOM.scry(root, 'li', sigil);
+ for (var i = 0; i < more.length; i++) {
+ JX.DOM.alterClass(more[i], 'hidden', false);
+ }
+ JX.DOM.hide(e.getNode('conpherence-menu-see-more'));
+ });
JX.Stratcom.listen(
['keydown'],

File Metadata

Mime Type
text/plain
Expires
Wed, May 22, 10:13 AM (1 w, 5 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6305762
Default Alt Text
D12222.id29366.diff (30 KB)

Event Timeline