From 18c76b8a46c0249e7240de954ae2c26b2871f20f Mon Sep 17 00:00:00 2001 From: Bob Trahan Date: Mon, 8 Apr 2013 11:13:35 -0700 Subject: [PATCH] Conpherence - make conpherence load the bare minimum of data Summary: also re-enables the updating of the widgets and "cleans up" the javascript a tad. Ref T2867 Test Plan: all sorts of conpherence fun like adding people to threads, adding files, pontificating, etc Reviewers: epriestley, chad Reviewed By: epriestley CC: aran, Korvin Maniphest Tasks: T2867 Differential Revision: https://secure.phabricator.com/D5595 --- src/__celerity_resource_map__.php | 10 +- .../controller/ConpherenceController.php | 2 +- .../controller/ConpherenceListController.php | 1 - .../ConpherenceUpdateController.php | 10 +- .../controller/ConpherenceViewController.php | 16 ++- .../ConpherenceWidgetController.php | 17 +-- .../query/ConpherenceThreadQuery.php | 59 ++++++-- .../conpherence/storage/ConpherenceThread.php | 128 ++++++------------ .../view/ConpherenceMenuItemView.php | 19 --- .../view/ConpherencePeopleWidgetView.php | 14 +- .../view/ConpherenceThreadListView.php | 2 - .../view/ConpherenceWidgetView.php | 7 - .../rsrc/css/application/conpherence/menu.css | 36 ++--- .../application/conpherence/widget-pane.css | 2 +- .../application/conpherence/behavior-menu.js | 22 +-- .../conpherence/behavior-pontificate.js | 22 ++- .../conpherence/behavior-widget-pane.js | 90 ++++++------ 17 files changed, 222 insertions(+), 235 deletions(-) diff --git a/src/__celerity_resource_map__.php b/src/__celerity_resource_map__.php index 3d415a3624..0d98d4596b 100644 --- a/src/__celerity_resource_map__.php +++ b/src/__celerity_resource_map__.php @@ -913,7 +913,7 @@ celerity_register_resource_map(array( ), 'conpherence-menu-css' => array( - 'uri' => '/res/69980966/rsrc/css/application/conpherence/menu.css', + 'uri' => '/res/7413379f/rsrc/css/application/conpherence/menu.css', 'type' => 'css', 'requires' => array( @@ -940,7 +940,7 @@ celerity_register_resource_map(array( ), 'conpherence-widget-pane-css' => array( - 'uri' => '/res/fda7cf40/rsrc/css/application/conpherence/widget-pane.css', + 'uri' => '/res/28fbffe3/rsrc/css/application/conpherence/widget-pane.css', 'type' => 'css', 'requires' => array( @@ -1289,7 +1289,7 @@ celerity_register_resource_map(array( ), 'javelin-behavior-conpherence-menu' => array( - 'uri' => '/res/29585411/rsrc/js/application/conpherence/behavior-menu.js', + 'uri' => '/res/e8479b8e/rsrc/js/application/conpherence/behavior-menu.js', 'type' => 'js', 'requires' => array( @@ -1305,7 +1305,7 @@ celerity_register_resource_map(array( ), 'javelin-behavior-conpherence-pontificate' => array( - 'uri' => '/res/ae5f5f61/rsrc/js/application/conpherence/behavior-pontificate.js', + 'uri' => '/res/68f1e046/rsrc/js/application/conpherence/behavior-pontificate.js', 'type' => 'js', 'requires' => array( @@ -1319,7 +1319,7 @@ celerity_register_resource_map(array( ), 'javelin-behavior-conpherence-widget-pane' => array( - 'uri' => '/res/c0990399/rsrc/js/application/conpherence/behavior-widget-pane.js', + 'uri' => '/res/0c0fc5ef/rsrc/js/application/conpherence/behavior-widget-pane.js', 'type' => 'js', 'requires' => array( diff --git a/src/applications/conpherence/controller/ConpherenceController.php b/src/applications/conpherence/controller/ConpherenceController.php index ed314f2cd4..8dc426f719 100644 --- a/src/applications/conpherence/controller/ConpherenceController.php +++ b/src/applications/conpherence/controller/ConpherenceController.php @@ -46,7 +46,7 @@ abstract class ConpherenceController extends PhabricatorController { $all_conpherences = id(new ConpherenceThreadQuery()) ->setViewer($user) ->withPHIDs($all_conpherence_phids) - ->needAllTransactions(true) + ->needParticipantCache(true) ->execute(); $unread_conpherences = array_select_keys( $all_conpherences, diff --git a/src/applications/conpherence/controller/ConpherenceListController.php b/src/applications/conpherence/controller/ConpherenceListController.php index 070d175d8a..288913b89b 100644 --- a/src/applications/conpherence/controller/ConpherenceListController.php +++ b/src/applications/conpherence/controller/ConpherenceListController.php @@ -31,7 +31,6 @@ final class ConpherenceListController if ($conpherence_id) { $conpherence = id(new ConpherenceThreadQuery()) ->setViewer($user) - ->needAllTransactions(true) ->withIDs(array($conpherence_id)) ->executeOne(); if (!$conpherence) { diff --git a/src/applications/conpherence/controller/ConpherenceUpdateController.php b/src/applications/conpherence/controller/ConpherenceUpdateController.php index c24cec0c39..b36bb32431 100644 --- a/src/applications/conpherence/controller/ConpherenceUpdateController.php +++ b/src/applications/conpherence/controller/ConpherenceUpdateController.php @@ -30,9 +30,9 @@ final class ConpherenceUpdateController $conpherence = id(new ConpherenceThreadQuery()) ->setViewer($user) ->withIDs(array($conpherence_id)) + ->needFilePHIDs(true) ->needOrigPics(true) ->needHeaderPics(true) - ->needAllTransactions(true) ->executeOne(); $supported_formats = PhabricatorFile::getTransformableImageFormats(); @@ -327,7 +327,7 @@ final class ConpherenceUpdateController ->setAfterMessageID($latest_transaction_id) ->needHeaderPics(true) ->needWidgetData(true) - ->needAllTransactions(true) + ->needTransactions(true) ->withIDs(array($conpherence_id)) ->executeOne(); @@ -358,10 +358,8 @@ final class ConpherenceUpdateController 'nav_item' => hsprintf('%s', $nav_item), 'conpherence_phid' => $conpherence->getPHID(), 'header' => hsprintf('%s', $header), - - // TODO: Fix these. -// 'file_widget' => $file_widget->render(), -// 'people_widget' => $people_widget->render() + 'file_widget' => $file_widget->render(), + 'people_widget' => $people_widget->render() ); return $content; } diff --git a/src/applications/conpherence/controller/ConpherenceViewController.php b/src/applications/conpherence/controller/ConpherenceViewController.php index f4532fe214..13691e400f 100644 --- a/src/applications/conpherence/controller/ConpherenceViewController.php +++ b/src/applications/conpherence/controller/ConpherenceViewController.php @@ -41,7 +41,7 @@ final class ConpherenceViewController extends ->setViewer($user) ->withIDs(array($conpherence_id)) ->needHeaderPics(true) - ->needAllTransactions(true) + ->needTransactions(true) ->executeOne(); $this->setConpherence($conpherence); @@ -105,7 +105,6 @@ final class ConpherenceViewController extends ->setWorkflow(true) ->setUser($user) ->addHiddenInput('action', 'message') - ->addHiddenInput('latest_transaction_id', $latest_transaction_id) ->appendChild( id(new PhabricatorRemarkupControl()) ->setUser($user) @@ -113,6 +112,19 @@ final class ConpherenceViewController extends ->appendChild( id(new AphrontFormSubmitControl()) ->setValue(pht('Pontificate'))) + ->appendChild( + javelin_tag( + 'input', + array( + 'type' => 'hidden', + 'name' => 'latest_transaction_id', + 'value' => $latest_transaction_id, + 'sigil' => 'latest-transaction-id', + 'meta' => array( + 'id' => $latest_transaction_id + ) + ), + '')) ->render(); $scrollbutton = javelin_tag( diff --git a/src/applications/conpherence/controller/ConpherenceWidgetController.php b/src/applications/conpherence/controller/ConpherenceWidgetController.php index a01c40c504..9f9e7a4479 100644 --- a/src/applications/conpherence/controller/ConpherenceWidgetController.php +++ b/src/applications/conpherence/controller/ConpherenceWidgetController.php @@ -50,7 +50,6 @@ final class ConpherenceWidgetController extends ->setViewer($user) ->withIDs(array($conpherence_id)) ->needWidgetData(true) - ->needAllTransactions(true) ->executeOne(); $this->setConpherence($conpherence); @@ -69,11 +68,6 @@ final class ConpherenceWidgetController extends Javelin::initBehavior( 'conpherence-widget-pane', array( - 'header' => 'conpherence-header-pane', - 'messages' => 'conpherence-messages', - 'people_widget' => 'widgets-people', - 'file_widget' => 'widgets-files', - 'settings_widget' => 'widgets-settings', 'widgetRegistery' => array( 'widgets-conpherence-list' => $cant_toggle, 'widgets-conversation' => $cant_toggle, @@ -174,22 +168,24 @@ final class ConpherenceWidgetController extends ))); $user = $this->getRequest()->getUser(); // now the widget bodies - $widgets[] = phutil_tag( + $widgets[] = javelin_tag( 'div', array( 'class' => 'widgets-body', 'id' => 'widgets-people', + 'sigil' => 'widgets-people', 'style' => 'display: none;' ), id(new ConpherencePeopleWidgetView()) ->setUser($user) ->setConpherence($conpherence) ->setUpdateURI($this->getWidgetURI())); - $widgets[] = phutil_tag( + $widgets[] = javelin_tag( 'div', array( 'class' => 'widgets-body', 'id' => 'widgets-files', + 'sigil' => 'widgets-files', ), id(new ConpherenceFileWidgetView()) ->setUser($user) @@ -257,10 +253,10 @@ final class ConpherenceWidgetController extends 'name' => 'action', 'value' => 'notifications' )), - javelin_tag( + phutil_tag( 'button', array( - 'sigil' => 'notifications-update', + 'type' => 'submit', 'class' => 'notifications-update grey', ), pht('Update Notifications')) @@ -271,6 +267,7 @@ final class ConpherenceWidgetController extends array( 'method' => 'POST', 'action' => $this->getWidgetURI(), + 'sigil' => 'notifications-update', ), $layout); } diff --git a/src/applications/conpherence/query/ConpherenceThreadQuery.php b/src/applications/conpherence/query/ConpherenceThreadQuery.php index 5c81707b8a..b92139760f 100644 --- a/src/applications/conpherence/query/ConpherenceThreadQuery.php +++ b/src/applications/conpherence/query/ConpherenceThreadQuery.php @@ -11,9 +11,21 @@ final class ConpherenceThreadQuery private $needWidgetData; private $needHeaderPics; private $needOrigPics; - private $needAllTransactions; + private $needTransactions; + private $needParticipantCache; + private $needFilePHIDs; private $afterMessageID; + public function needFilePHIDs($need_file_phids) { + $this->needFilePHIDs = $need_file_phids; + return $this; + } + + public function needParticipantCache($participant_cache) { + $this->needParticipantCache = $participant_cache; + return $this; + } + public function needOrigPics($need_orig_pics) { $this->needOrigPics = $need_orig_pics; return $this; @@ -29,8 +41,8 @@ final class ConpherenceThreadQuery return $this; } - public function needAllTransactions($need_all_transactions) { - $this->needAllTransactions = $need_all_transactions; + public function needTransactions($need_transactions) { + $this->needTransactions = $need_transactions; return $this; } @@ -66,14 +78,18 @@ final class ConpherenceThreadQuery if ($conpherences) { $conpherences = mpull($conpherences, null, 'getPHID'); - $this->loadParticipants($conpherences); - - if ($this->needAllTransactions) { + $this->loadParticipantsAndInitHandles($conpherences); + if ($this->needParticipantCache) { + $this->loadCoreHandles($conpherences, 'getRecentParticipantPHIDs'); + } else if ($this->needWidgetData) { + $this->loadCoreHandles($conpherences, 'getParticipantPHIDs'); + } + if ($this->needTransactions) { $this->loadTransactionsAndHandles($conpherences); } - - $this->loadFilePHIDs($conpherences); - + if ($this->needFilePHIDs || $this->needWidgetData) { + $this->loadFilePHIDs($conpherences); + } if ($this->needWidgetData) { $this->loadWidgetData($conpherences); } @@ -110,7 +126,7 @@ final class ConpherenceThreadQuery return $this->formatWhereClause($where); } - private function loadParticipants(array $conpherences) { + private function loadParticipantsAndInitHandles(array $conpherences) { $participants = id(new ConpherenceParticipant()) ->loadAllWhere('conpherencePHID IN (%Ls)', array_keys($conpherences)); $map = mgroup($participants, 'getConpherencePHID'); @@ -121,11 +137,32 @@ final class ConpherenceThreadQuery null, 'getParticipantPHID'); $current_conpherence->attachParticipants($conpherence_participants); + $current_conpherence->attachHandles(array()); } return $this; } + private function loadCoreHandles( + array $conpherences, + $method) { + + $handle_phids = array(); + foreach ($conpherences as $conpherence) { + $handle_phids[$conpherence->getPHID()] = + $conpherence->$method(); + } + $flat_phids = array_mergev($handle_phids); + $handles = id(new PhabricatorObjectHandleData($flat_phids)) + ->setViewer($this->getViewer()) + ->loadHandles(); + foreach ($handle_phids as $conpherence_phid => $phids) { + $conpherence = $conpherences[$conpherence_phid]; + $conpherence->attachHandles(array_select_keys($handles, $phids)); + } + return $this; + } + private function loadTransactionsAndHandles(array $conpherences) { $transactions = id(new ConpherenceTransactionQuery()) ->setViewer($this->getViewer()) @@ -141,7 +178,7 @@ final class ConpherenceThreadQuery foreach ($current_transactions as $transaction) { $handles += $transaction->getHandles(); } - $conpherence->attachHandles($handles); + $conpherence->attachHandles($conpherence->getHandles() + $handles); $conpherence->attachTransactions($transactions[$phid]); } return $this; diff --git a/src/applications/conpherence/storage/ConpherenceThread.php b/src/applications/conpherence/storage/ConpherenceThread.php index 55932f7948..101510ff82 100644 --- a/src/applications/conpherence/storage/ConpherenceThread.php +++ b/src/applications/conpherence/storage/ConpherenceThread.php @@ -173,107 +173,51 @@ final class ConpherenceThread extends ConpherenceDAO } public function getDisplayData(PhabricatorUser $user, $size) { - $transactions = $this->getTransactions(); - + $recent_phids = $this->getRecentParticipantPHIDs(); $handles = $this->getHandles(); - // we don't want to show the user unless they are babbling to themselves - if (count($handles) > 1) { - unset($handles[$user->getPHID()]); + + // luck has little to do with it really; most recent participant who isn't + // the user.... + $lucky_phid = null; + $lucky_index = null; + foreach ($recent_phids as $index => $phid) { + if ($phid == $user->getPHID()) { + continue; + } + $lucky_phid = $phid; + break; + } + reset($recent_phids); + + if ($lucky_phid) { + $lucky_handle = $handles[$lucky_phid]; + // this will be just the user talking to themselves. weirdos. + } else { + $lucky_handle = reset($handles); } - $participants = $this->getParticipants(); - $user_participation = $participants[$user->getPHID()]; - $latest_transaction = null; $title = $this->getTitle(); - $subtitle = ''; - $img_src = null; - $img_class = null; - if ($this->getImagePHID($size)) { + if (!$title) { + $title = $lucky_handle->getName(); + } + + $image = $this->getImagePHID($size); + if ($image) { $img_src = $this->getImage($size)->getBestURI(); $img_class = 'custom-'; - } - $unread_count = 0; - $max_count = 10; - $snippet = null; - if (!$user_participation->isUpToDate()) { - $behind_transaction_phid = - $user_participation->getBehindTransactionPHID(); } else { - $behind_transaction_phid = null; - } - foreach (array_reverse($transactions) as $transaction) { - switch ($transaction->getTransactionType()) { - case ConpherenceTransactionType::TYPE_PARTICIPANTS: - case ConpherenceTransactionType::TYPE_TITLE: - case ConpherenceTransactionType::TYPE_PICTURE: - continue 2; - case PhabricatorTransactions::TYPE_COMMENT: - if ($snippet === null) { - $snippet = phutil_utf8_shorten( - $transaction->getComment()->getContent(), - 48); - if ($transaction->getAuthorPHID() == $user->getPHID()) { - $snippet = "\xE2\x86\xB0 " . $snippet; - } - } - // fallthrough intentionally here - case ConpherenceTransactionType::TYPE_FILES: - if (!$latest_transaction) { - $latest_transaction = $transaction; - } - $latest_participant_phid = $transaction->getAuthorPHID(); - if ((!$title || !$img_src) && - $latest_participant_phid != $user->getPHID()) { - $latest_handle = $handles[$latest_participant_phid]; - if (!$img_src) { - $img_src = $latest_handle->getImageURI(); - } - if (!$title) { - $title = $latest_handle->getName(); - // (maybs) used the pic, definitely used the name -- discard - unset($handles[$latest_participant_phid]); - } - } - if ($behind_transaction_phid) { - $unread_count++; - if ($transaction->getPHID() == $behind_transaction_phid) { - break 2; - } - } - if ($unread_count > $max_count) { - break 2; - } - break; - default: - continue 2; - } - if ($snippet && !$behind_transaction_phid) { - break; - } - } - if ($unread_count > $max_count) { - $unread_count = $max_count.'+'; - } - - // This happens if the user has been babbling, maybs just to themselves, - // but enough un-responded to transactions for our SQL limit would - // hit this too... Also happens on new threads since only the first - // author has participated. - // ...so just pick a different handle in these cases. - $some_handle = reset($handles); - if (!$img_src) { - $img_src = $some_handle->getImageURI(); - } - if (!$title) { - $title = $some_handle->getName(); + $img_src = $lucky_handle->getImageURI(); + $img_class = null; } $count = 0; $final = false; - foreach ($handles as $handle) { - if ($handle->getType() != PhabricatorPHIDConstants::PHID_TYPE_USER) { + $subtitle = null; + foreach ($recent_phids as $phid) { + if ($phid == $user->getPHID()) { continue; } + $handle = $handles[$phid]; if ($subtitle) { if ($final) { $subtitle .= '...'; @@ -287,14 +231,18 @@ final class ConpherenceThread extends ConpherenceDAO $final = $count == 3; } + $participants = $this->getParticipants(); + $user_participation = $participants[$user->getPHID()]; + $unread_count = $this->getMessageCount() - + $user_participation->getSeenMessageCount(); + return array( 'title' => $title, 'subtitle' => $subtitle, 'unread_count' => $unread_count, - 'epoch' => $latest_transaction->getDateCreated(), + 'epoch' => $this->getDateModified(), 'image' => $img_src, 'image_class' => $img_class, - 'snippet' => $snippet, ); } diff --git a/src/applications/conpherence/view/ConpherenceMenuItemView.php b/src/applications/conpherence/view/ConpherenceMenuItemView.php index 50284abfa0..5450abf157 100644 --- a/src/applications/conpherence/view/ConpherenceMenuItemView.php +++ b/src/applications/conpherence/view/ConpherenceMenuItemView.php @@ -9,7 +9,6 @@ final class ConpherenceMenuItemView extends AphrontTagView { private $subtitle; private $imageURI; private $href; - private $messageText; private $epoch; private $unreadCount; @@ -21,14 +20,6 @@ final class ConpherenceMenuItemView extends AphrontTagView { return $this->unreadCount; } - public function setMessageText($message_text) { - $this->messageText = $message_text; - return $this; - } - public function getMessageText() { - return $this->messageText; - } - public function setEpoch($epoch) { $this->epoch = $epoch; return $this; @@ -111,15 +102,6 @@ final class ConpherenceMenuItemView extends AphrontTagView { ), $this->subtitle); } - $message = null; - if ($this->messageText) { - $message = phutil_tag( - 'span', - array( - 'class' => 'conpherence-menu-item-message-text' - ), - $this->messageText); - } $epoch = null; if ($this->epoch) { $epoch = phutil_tag( @@ -143,7 +125,6 @@ final class ConpherenceMenuItemView extends AphrontTagView { $image, $title, $subtitle, - $message, $epoch, $unread_count, ); diff --git a/src/applications/conpherence/view/ConpherencePeopleWidgetView.php b/src/applications/conpherence/view/ConpherencePeopleWidgetView.php index 9f5048b04e..d0d377d2d0 100644 --- a/src/applications/conpherence/view/ConpherencePeopleWidgetView.php +++ b/src/applications/conpherence/view/ConpherencePeopleWidgetView.php @@ -18,6 +18,10 @@ final class ConpherencePeopleWidgetView extends ConpherenceWidgetView { array( 'method' => 'POST', 'action' => $this->getUpdateURI(), + 'sigil' => 'add-person', + 'meta' => array( + 'action' => 'add_person' + ) ), array( id(new AphrontFormTokenizerControl()) @@ -26,15 +30,11 @@ final class ConpherencePeopleWidgetView extends ConpherenceWidgetView { ->setUser($user) ->setDatasource('/typeahead/common/users/') ->setLimit(1), - javelin_tag( + phutil_tag( 'button', array( - 'sigil' => 'add-person', + 'type' => 'submit', 'class' => 'people-add-button', - 'meta' => array( - 'action' => 'add_person', - 'latest_transaction_id' => $this->getLatestTransactionID() - ) ), pht('Add')) )); @@ -73,7 +73,6 @@ final class ConpherencePeopleWidgetView extends ConpherenceWidgetView { 'meta' => array( 'remove_person' => $handle->getPHID(), 'action' => 'remove_person', - 'latest_transaction_id' => $this->getLatestTransactionID() ) ), phutil_tag( @@ -105,6 +104,5 @@ final class ConpherencePeopleWidgetView extends ConpherenceWidgetView { } return array($header, $body); - } } diff --git a/src/applications/conpherence/view/ConpherenceThreadListView.php b/src/applications/conpherence/view/ConpherenceThreadListView.php index 1fe47f4336..cddc767e3d 100644 --- a/src/applications/conpherence/view/ConpherenceThreadListView.php +++ b/src/applications/conpherence/view/ConpherenceThreadListView.php @@ -66,7 +66,6 @@ final class ConpherenceThreadListView extends AphrontView { $unread_count = $data['unread_count']; $epoch = $data['epoch']; $image = $data['image']; - $snippet = $data['snippet']; return id(new ConpherenceMenuItemView()) ->setUser($user) @@ -75,7 +74,6 @@ final class ConpherenceThreadListView extends AphrontView { ->setHref($uri) ->setEpoch($epoch) ->setImageURI($image) - ->setMessageText($snippet) ->setUnreadCount($unread_count) ->setID($thread->getPHID().'-nav-item') ->addSigil('conpherence-menu-click') diff --git a/src/applications/conpherence/view/ConpherenceWidgetView.php b/src/applications/conpherence/view/ConpherenceWidgetView.php index 57dbc5aee5..010ad5ba19 100644 --- a/src/applications/conpherence/view/ConpherenceWidgetView.php +++ b/src/applications/conpherence/view/ConpherenceWidgetView.php @@ -23,11 +23,4 @@ abstract class ConpherenceWidgetView extends AphrontView { public function getConpherence() { return $this->conpherence; } - - public function getLatestTransactionID() { - $transactions = $this->getConpherence()->getTransactions(); - $latest = end($transactions); - return $latest->getID(); - } - } diff --git a/webroot/rsrc/css/application/conpherence/menu.css b/webroot/rsrc/css/application/conpherence/menu.css index 0da340fe41..a0b94f5d12 100644 --- a/webroot/rsrc/css/application/conpherence/menu.css +++ b/webroot/rsrc/css/application/conpherence/menu.css @@ -59,7 +59,7 @@ div.conpherence-layout .phabricator-nav-column-background { .conpherence-menu .conpherence-menu-item-view { display: block; - height: 70px; + height: 55px; width: 100%; overflow: hidden; position: relative; @@ -84,45 +84,37 @@ div.conpherence-layout .phabricator-nav-column-background { left: 6px; display: block; position: absolute; - width: 50px; - height: 50px; + width: 35px; + height: 35px; + background-size: 35px; border: 4px solid rgb(29, 32, 34); - border-radius: 2px; + border-radius: 3px; } .conpherence-menu .conpherence-menu-item-view .conpherence-menu-item-title { display: block; margin-top: 12px; - margin-left: 70px; + margin-left: 58px; text-align: left; font-weight: bold; - font-size: 12px; + font-size: 13px; color: #ffffff; text-shadow: 0px 1px 1px #000000; } .conpherence-menu .conpherence-menu-item-view .conpherence-menu-item-subtitle { display: block; - color: #bfbfbf; + color: #a1a5a9; font-size: 11px; margin-top: 2px; - margin-left: 70px; + margin-left: 58px; font-style: italic; } -.conpherence-menu .conpherence-menu-item-view -.conpherence-menu-item-message-text { - display: block; - color: #66CCFF; - font-size: 12px; - margin-top: 4px; - margin-left: 70px; -} - .conpherence-menu .conpherence-menu-item-view .conpherence-menu-item-unread-count { position: absolute; - left: 48px; + left: 35px; top: 3px; background: #f00; border-radius: 10px; @@ -140,10 +132,10 @@ div.conpherence-layout .phabricator-nav-column-background { .conpherence-menu .conpherence-menu-item-view .conpherence-menu-item-date { position: absolute; - top: 10px; - right: 12px; - color: white; - font-size: 12px; + top: 15px; + right: 16px; + color: #a1a5a9; + font-size: 11px; } .no-conpherences-menu-item { diff --git a/webroot/rsrc/css/application/conpherence/widget-pane.css b/webroot/rsrc/css/application/conpherence/widget-pane.css index ef0a3af97f..510ed8bd5d 100644 --- a/webroot/rsrc/css/application/conpherence/widget-pane.css +++ b/webroot/rsrc/css/application/conpherence/widget-pane.css @@ -337,7 +337,7 @@ clear: none; font-size: 14px; font-weight: bold; - width: 166px; + width: 164px; } .conpherence-widget-pane .person-entry .pic { diff --git a/webroot/rsrc/js/application/conpherence/behavior-menu.js b/webroot/rsrc/js/application/conpherence/behavior-menu.js index bda3f09063..0c22e47201 100644 --- a/webroot/rsrc/js/application/conpherence/behavior-menu.js +++ b/webroot/rsrc/js/application/conpherence/behavior-menu.js @@ -29,13 +29,12 @@ JX.behavior('conpherence-menu', function(config) { } function selectthread(node) { - if (node === thread.node) { - return; - } if (thread.node) { JX.DOM.alterClass(thread.node, 'conpherence-selected', false); - JX.DOM.alterClass(thread.node, 'hide-unread-count', false); + // keep the unread-count hidden still. big TODO once we ajax in updates + // to threads to make this work right and move threads between read / + // unread } JX.DOM.alterClass(node, 'conpherence-selected', true); @@ -47,10 +46,18 @@ JX.behavior('conpherence-menu', function(config) { thread.selected = data.id; JX.History.replace(config.base_uri + data.id + '/'); - redrawthread(); } + JX.Stratcom.listen( + 'conpherence-selectthread', + null, + function (e) { + var node = JX.$(e.getData().id); + selectthread(node); + } + ); + function redrawthread() { if (!thread.node) { return; @@ -67,6 +74,8 @@ JX.behavior('conpherence-menu', function(config) { new JX.Workflow(uri, {}) .setHandler(onresponse) .start(); + } else { + didredrawthread(); } if (thread.visible !== null || !config.hasWidgets) { @@ -183,7 +192,6 @@ JX.behavior('conpherence-menu', function(config) { if (!config.hasThreadList) { loadthreads(); - didredrawthread(); } else { didloadthreads(); } @@ -192,7 +200,6 @@ JX.behavior('conpherence-menu', function(config) { JX.Stratcom.listen('phabricator-device-change', null, ondevicechange); ondevicechange(); - function loadthreads() { var uri = config.base_uri + 'thread/' + config.selectedID + '/'; new JX.Workflow(uri) @@ -221,7 +228,6 @@ JX.behavior('conpherence-menu', function(config) { } } } - redrawthread(); } diff --git a/webroot/rsrc/js/application/conpherence/behavior-pontificate.js b/webroot/rsrc/js/application/conpherence/behavior-pontificate.js index a3cc01c2ce..1661e5a1d1 100644 --- a/webroot/rsrc/js/application/conpherence/behavior-pontificate.js +++ b/webroot/rsrc/js/application/conpherence/behavior-pontificate.js @@ -16,6 +16,12 @@ JX.behavior('conpherence-pontificate', function(config) { var root = e.getNode('conpherence-layout'); var messages = JX.DOM.find(root, 'div', 'conpherence-messages'); var header = JX.DOM.find(root, 'div', 'conpherence-header'); + var fileWidget = null; + try { + fileWidget = JX.DOM.find(root, 'div', 'widgets-files'); + } catch (ex) { + // Ignore; maybe no files widget + } JX.Workflow.newFromForm(form) .setHandler(JX.bind(this, function(r) { @@ -25,16 +31,28 @@ JX.behavior('conpherence-pontificate', function(config) { JX.DOM.setContent(header, JX.$H(r.header)); try { + var node = JX.$(r.conpherence_phid + '-nav-item'); JX.DOM.replace( - JX.$(r.conpherence_phid + '-nav-item'), + node, JX.$H(r.nav_item)); + JX.Stratcom.invoke( + 'conpherence-selectthread', + null, + { id : r.conpherence_phid + '-nav-item' } + ); } catch (ex) { // Ignore; this view may not have a menu. } + if (fileWidget) { + JX.DOM.setContent( + fileWidget, + JX.$H(r.file_widget) + ); + } + var inputs = JX.DOM.scry(form, 'input'); for (var ii = 0; ii < inputs.length; ii++) { - JX.log(inputs[ii]); if (inputs[ii].name == 'latest_transaction_id') { inputs[ii].value = r.latest_transaction_id; break; diff --git a/webroot/rsrc/js/application/conpherence/behavior-widget-pane.js b/webroot/rsrc/js/application/conpherence/behavior-widget-pane.js index 1a6243f1ae..cc4f84fcfe 100644 --- a/webroot/rsrc/js/application/conpherence/behavior-widget-pane.js +++ b/webroot/rsrc/js/application/conpherence/behavior-widget-pane.js @@ -40,65 +40,76 @@ JX.behavior('conpherence-widget-pane', function(config) { ); /* people widget */ - var peopleRoot = JX.$(config.people_widget); - var peopleUpdateHandler = function (r) { - // update the transactions - var messages = JX.$(config.messages); - JX.DOM.appendContent(messages, JX.$H(r.transactions)); - messages.scrollTop = messages.scrollHeight; - - // update the menu entry as well - JX.DOM.replace( - JX.$(r.conpherence_phid + '-nav-item'), - JX.$H(r.nav_item) - ); - - // update the header - JX.DOM.setContent( - JX.$(config.header), - JX.$H(r.header) - ); - - // update the people widget - JX.DOM.setContent( - JX.$(config.people_widget), - JX.$H(r.people_widget) - ); - }; - - JX.DOM.listen( - peopleRoot, - ['click'], + JX.Stratcom.listen( + ['submit', 'didSyntheticSubmit'], 'add-person', function (e) { e.kill(); - var form = JX.DOM.find(peopleRoot, 'form'); + var root = e.getNode('conpherence-layout'); + var form = e.getNode('tag:form'); var data = e.getNodeData('add-person'); + var peopleRoot = e.getNode('widgets-people'); + var messages = JX.DOM.find(root, 'div', 'conpherence-messages'); + var header = JX.DOM.find(root, 'div', 'conpherence-header'); + var latestTransactionData = JX.Stratcom.getData( + JX.DOM.find( + root, + 'input', + 'latest-transaction-id' + )); + data.latest_transaction_id = latestTransactionData.id; JX.Workflow.newFromForm(form, data) - .setHandler(peopleUpdateHandler) + .setHandler(JX.bind(this, function (r) { + // update the transactions + JX.DOM.appendContent(messages, JX.$H(r.transactions)); + messages.scrollTop = messages.scrollHeight; + + try { + JX.DOM.replace( + JX.$(r.conpherence_phid + '-nav-item'), + JX.$H(r.nav_item)); + JX.Stratcom.invoke( + 'conpherence-selectthread', + null, + { id : r.conpherence_phid + '-nav-item' } + ); + } catch (ex) { + // Ignore; this view may not have a menu. + } + + // update the header + JX.DOM.setContent( + header, + JX.$H(r.header) + ); + + // update the people widget + JX.DOM.setContent( + peopleRoot, + JX.$H(r.people_widget) + ); + })) .start(); } ); - JX.DOM.listen( - peopleRoot, + JX.Stratcom.listen( ['click'], 'remove-person', function (e) { + var peopleRoot = e.getNode('widgets-people'); var form = JX.DOM.find(peopleRoot, 'form'); var data = e.getNodeData('remove-person'); + // we end up re-directing to conpherence home JX.Workflow.newFromForm(form, data) - .setHandler(peopleUpdateHandler) .start(); } ); /* settings widget */ - var settingsRoot = JX.$(config.settings_widget); - var onsubmitSettings = function (e) { e.kill(); - var form = JX.DOM.find(settingsRoot, 'form'); + var form = e.getNode('tag:form'); var button = JX.DOM.find(form, 'button'); JX.Workflow.newFromForm(form) .setHandler(JX.bind(this, function (r) { @@ -112,9 +123,8 @@ JX.behavior('conpherence-widget-pane', function(config) { .start(); }; - JX.DOM.listen( - settingsRoot, - ['click'], + JX.Stratcom.listen( + ['submit', 'didSyntheticSubmit'], 'notifications-update', onsubmitSettings );