Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15490751
D12222.id29366.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
D12222.id29366.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
@@ -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
Details
Attached
Mime Type
text/plain
Expires
Sat, Apr 12, 8:18 PM (1 w, 3 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7730929
Default Alt Text
D12222.id29366.diff (30 KB)
Attached To
Mode
D12222: Conpherence - refine menu interactions with respect to "Show More"
Attached
Detach File
Event Timeline
Log In to Comment