diff --git a/src/applications/conpherence/controller/ConpherenceController.php b/src/applications/conpherence/controller/ConpherenceController.php index 34c2f11694..b4dc1f267b 100644 --- a/src/applications/conpherence/controller/ConpherenceController.php +++ b/src/applications/conpherence/controller/ConpherenceController.php @@ -1,174 +1,173 @@ getRequest()->getUser(); $read_participant_query = id(new ConpherenceParticipantQuery()) ->withParticipantPHIDs(array($user->getPHID())); $read_status = ConpherenceParticipationStatus::UP_TO_DATE; if ($current_selection_epoch) { $read_one = $read_participant_query ->withParticipationStatus($read_status) ->withDateTouched($current_selection_epoch, '>') ->execute(); $read_two = $read_participant_query ->withDateTouched($current_selection_epoch, '<=') ->execute(); $read = array_merge($read_one, $read_two); } else { $read = $read_participant_query ->withParticipationStatus($read_status) ->execute(); } $unread_status = ConpherenceParticipationStatus::BEHIND; $unread = id(new ConpherenceParticipantQuery()) ->withParticipantPHIDs(array($user->getPHID())) ->withParticipationStatus($unread_status) ->execute(); $all_participation = $unread + $read; $all_conpherence_phids = array_keys($all_participation); $all_conpherences = id(new ConpherenceThreadQuery()) ->setViewer($user) ->withPHIDs($all_conpherence_phids) ->execute(); $unread_conpherences = array_select_keys( $all_conpherences, array_keys($unread)); $read_conpherences = array_select_keys( $all_conpherences, array_keys($read)); return array($unread_conpherences, $read_conpherences); } public function buildApplicationMenu() { $nav = new PhabricatorMenuView(); $nav->newLink( pht('New Conversation'), $this->getApplicationURI('new/')); return $nav; } public function buildApplicationCrumbs() { $crumbs = parent::buildApplicationCrumbs(); $crumbs ->addAction( id(new PhabricatorMenuItemView()) ->setName(pht('New Conversation')) ->setHref($this->getApplicationURI('new/')) ->setIcon('create')) ->addCrumb( id(new PhabricatorCrumbView()) ->setName(pht('Conpherence'))); return $crumbs; } protected function buildHeaderPaneContent(ConpherenceThread $conpherence) { $user = $this->getRequest()->getUser(); $display_data = $conpherence->getDisplayData( $user, ConpherenceImageData::SIZE_HEAD); $edit_href = $this->getApplicationURI('update/'.$conpherence->getID().'/'); $class_mod = $display_data['image_class']; - $header = - phutil_tag( - 'div', - array( - 'class' => 'upload-photo' - ), - pht('Drop photo here to change this Conpherence photo.')). - javelin_tag( - 'a', - array( - 'class' => 'edit', - 'href' => $edit_href, - 'sigil' => 'conpherence-edit-metadata', - 'meta' => array( - 'action' => 'metadata' - ) - ), - ''). - phutil_tag( - 'div', - array( - 'class' => $class_mod.'header-image', - 'style' => 'background-image: url('.$display_data['image'].');' - ), - ''). - phutil_tag( - 'div', - array( - 'class' => $class_mod.'title', - ), - $display_data['title']). - phutil_tag( - 'div', - array( - 'class' => $class_mod.'subtitle', - ), - $display_data['subtitle']); - - return $header; + return array( + phutil_tag( + 'div', + array( + 'class' => 'upload-photo' + ), + pht('Drop photo here to change this Conpherence photo.')), + javelin_tag( + 'a', + array( + 'class' => 'edit', + 'href' => $edit_href, + 'sigil' => 'conpherence-edit-metadata', + 'meta' => array( + 'action' => 'metadata' + ) + ), + ''), + phutil_tag( + 'div', + array( + 'class' => $class_mod.'header-image', + 'style' => 'background-image: url('.$display_data['image'].');' + ), + ''), + phutil_tag( + 'div', + array( + 'class' => $class_mod.'title', + ), + $display_data['title']), + phutil_tag( + 'div', + array( + 'class' => $class_mod.'subtitle', + ), + $display_data['subtitle']), + ); } protected function renderConpherenceTransactions( ConpherenceThread $conpherence) { $user = $this->getRequest()->getUser(); $transactions = $conpherence->getTransactions(); $handles = $conpherence->getHandles(); $rendered_transactions = array(); $engine = id(new PhabricatorMarkupEngine()) ->setViewer($user); foreach ($transactions as $key => $transaction) { if ($transaction->shouldHide()) { unset($transactions[$key]); continue; } if ($transaction->getComment()) { $engine->addObject( $transaction->getComment(), PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT); } } $engine->process(); foreach ($transactions as $transaction) { $rendered_transactions[] = id(new ConpherenceTransactionView()) ->setUser($user) ->setConpherenceTransaction($transaction) ->setHandles($handles) ->setMarkupEngine($engine) ->render(); } $latest_transaction_id = $transaction->getID(); $rendered_transactions = phutil_implode_html(' ', $rendered_transactions); return array( 'transactions' => $rendered_transactions, 'latest_transaction_id' => $latest_transaction_id ); } } diff --git a/src/applications/conpherence/controller/ConpherenceUpdateController.php b/src/applications/conpherence/controller/ConpherenceUpdateController.php index 60a995551a..1e464353c6 100644 --- a/src/applications/conpherence/controller/ConpherenceUpdateController.php +++ b/src/applications/conpherence/controller/ConpherenceUpdateController.php @@ -1,292 +1,292 @@ conpherenceID = $conpherence_id; return $this; } public function getConpherenceID() { return $this->conpherenceID; } public function willProcessRequest(array $data) { $this->setConpherenceID(idx($data, 'id')); } public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $conpherence_id = $this->getConpherenceID(); if (!$conpherence_id) { return new Aphront404Response(); } $conpherence = id(new ConpherenceThreadQuery()) ->setViewer($user) ->withIDs(array($conpherence_id)) ->needOrigPics(true) ->needHeaderPics(true) ->executeOne(); $supported_formats = PhabricatorFile::getTransformableImageFormats(); $action = $request->getStr('action', 'metadata'); $latest_transaction_id = null; $fancy_ajax_style = true; $error_view = null; $e_file = array(); $errors = array(); if ($request->isFormPost()) { $content_source = PhabricatorContentSource::newForSource( PhabricatorContentSource::SOURCE_WEB, array( 'ip' => $request->getRemoteAddr() )); $editor = id(new ConpherenceEditor()) ->setContinueOnNoEffect($request->isContinueRequest()) ->setContentSource($content_source) ->setActor($user); switch ($action) { case 'message': $message = $request->getStr('text'); $latest_transaction_id = $request->getInt('latest_transaction_id'); $xactions = $editor->generateTransactionsFromText( $conpherence, $message); break; case 'notifications': $notifications = $request->getStr('notifications'); $participant = $conpherence->getParticipant($user->getPHID()); $participant->setSettings(array('notifications' => $notifications)); $participant->save(); $result = pht( 'Updated notification settings to "%s".', ConpherenceSettings::getHumanString($notifications)); return id(new AphrontAjaxResponse()) ->setContent($result); break; case 'metadata': $xactions = array(); $top = $request->getInt('image_y'); $left = $request->getInt('image_x'); $file_id = $request->getInt('file_id'); $title = $request->getStr('title'); $updated = false; if ($file_id) { $orig_file = id(new PhabricatorFileQuery()) ->setViewer($user) ->withIDs(array($file_id)) ->executeOne(); $okay = $orig_file->isTransformableImage(); if ($okay) { $xactions[] = id(new ConpherenceTransaction()) ->setTransactionType(ConpherenceTransactionType::TYPE_PICTURE) ->setNewValue($orig_file->getPHID()); // do a transformation "crudely" $xformer = new PhabricatorImageTransformer(); $header_file = $xformer->executeConpherenceTransform( $orig_file, 0, 0, ConpherenceImageData::HEAD_WIDTH, ConpherenceImageData::HEAD_HEIGHT); // this is handled outside the editor for now. no particularly // good reason to move it inside $conpherence->setImagePHIDs( array( ConpherenceImageData::SIZE_HEAD => $header_file->getPHID(), )); $conpherence->setImages( array( ConpherenceImageData::SIZE_HEAD => $header_file, )); } else { $e_file[] = $orig_file; $errors[] = pht('This server only supports these image formats: %s.', implode(', ', $supported_formats)); } // use the existing title in this image upload case $title = $conpherence->getTitle(); $updated = true; $fancy_ajax_style = false; } // all other metadata updates are continue requests if (!$request->isContinueRequest()) { break; } if ($top !== null || $left !== null) { $file = $conpherence->getImage(ConpherenceImageData::SIZE_ORIG); $xformer = new PhabricatorImageTransformer(); $xformed = $xformer->executeConpherenceTransform( $file, $top, $left, ConpherenceImageData::HEAD_WIDTH, ConpherenceImageData::HEAD_HEIGHT); $image_phid = $xformed->getPHID(); $xactions[] = id(new ConpherenceTransaction()) ->setTransactionType( ConpherenceTransactionType::TYPE_PICTURE_CROP) ->setNewValue($image_phid); $updated = true; } if ($title != $conpherence->getTitle()) { $xactions[] = id(new ConpherenceTransaction()) ->setTransactionType(ConpherenceTransactionType::TYPE_TITLE) ->setNewValue($title); $updated = true; } if (!$updated) { $errors[] = pht( 'That was a non-update. Try cancel.'); } break; default: throw new Exception('Unknown action: '.$action); break; } if ($xactions) { try { $xactions = $editor->applyTransactions($conpherence, $xactions); if ($fancy_ajax_style) { $content = $this->loadAndRenderUpdates( $conpherence_id, $latest_transaction_id); return id(new AphrontAjaxResponse()) ->setContent($content); } else { return id(new AphrontRedirectResponse()) ->setURI($this->getApplicationURI($conpherence->getID().'/')); } } catch (PhabricatorApplicationTransactionNoEffectException $ex) { return id(new PhabricatorApplicationTransactionNoEffectResponse()) ->setCancelURI($this->getApplicationURI($conpherence_id.'/')) ->setException($ex); } } } if ($errors) { $error_view = id(new AphrontErrorView()) ->setTitle(pht('Errors editing conpherence.')) ->setInsideDialogue(true) ->setErrors($errors); } switch ($action) { case 'metadata': default: $dialogue = $this->renderMetadataDialogue($conpherence, $error_view); break; } return id(new AphrontDialogResponse()) ->setDialog($dialogue ->setUser($user) ->setWidth(AphrontDialogView::WIDTH_FORM) ->setSubmitURI($this->getApplicationURI('update/'.$conpherence_id.'/')) ->addSubmitButton() ->addCancelButton($this->getApplicationURI($conpherence->getID().'/'))); } private function renderMetadataDialogue( ConpherenceThread $conpherence, $error_view) { $form = id(new AphrontFormLayoutView()) ->appendChild($error_view) ->appendChild( id(new AphrontFormTextControl()) ->setLabel(pht('Title')) ->setName('title') ->setValue($conpherence->getTitle())); $image = $conpherence->getImage(ConpherenceImageData::SIZE_ORIG); if ($image) { $form ->appendChild( id(new AphrontFormMarkupControl()) ->setLabel(pht('Image')) ->setValue(phutil_tag( 'img', array( 'src' => $conpherence->loadImageURI(ConpherenceImageData::SIZE_HEAD), )))) ->appendChild( id(new AphrontFormCropControl()) ->setLabel(pht('Crop Image')) ->setValue($image) ->setWidth(ConpherenceImageData::HEAD_WIDTH) ->setHeight(ConpherenceImageData::HEAD_HEIGHT)) ->appendChild( id(new ConpherenceFormDragAndDropUploadControl()) ->setLabel(pht('Change Image'))); } else { $form ->appendChild( id(new ConpherenceFormDragAndDropUploadControl()) ->setLabel(pht('Image'))); } require_celerity_resource('conpherence-update-css'); return id(new AphrontDialogView()) ->setTitle(pht('Update Conpherence')) ->addHiddenInput('action', 'metadata') ->addHiddenInput('__continue__', true) ->appendChild($form); } private function loadAndRenderUpdates( $conpherence_id, $latest_transaction_id) { $user = $this->getRequest()->getUser(); $conpherence = id(new ConpherenceThreadQuery()) ->setViewer($user) ->setAfterID($latest_transaction_id) ->needHeaderPics(true) ->needWidgetData(true) ->withIDs(array($conpherence_id)) ->executeOne(); $data = $this->renderConpherenceTransactions($conpherence); $rendered_transactions = $data['transactions']; $new_latest_transaction_id = $data['latest_transaction_id']; - $selected = true; - $nav_item = $this->buildConpherenceMenuItem( - $conpherence, - $selected); + $nav_item = id(new ConpherenceThreadListView()) + ->setUser($user) + ->setBaseURI($this->getApplicationURI()) + ->renderSingleThread($conpherence); $header = $this->buildHeaderPaneContent($conpherence); $file_widget = id(new ConpherenceFileWidgetView()) ->setUser($this->getRequest()->getUser()) ->setConpherence($conpherence) ->setUpdateURI( $this->getApplicationURI('update/'.$conpherence->getID().'/')); $content = array( 'transactions' => $rendered_transactions, 'latest_transaction_id' => $new_latest_transaction_id, - 'nav_item' => $nav_item->render(), + 'nav_item' => hsprintf('%s', $nav_item), 'conpherence_phid' => $conpherence->getPHID(), - 'header' => $header, + 'header' => hsprintf('%s', $header), 'file_widget' => $file_widget->render() ); return $content; } } diff --git a/src/applications/conpherence/controller/ConpherenceViewController.php b/src/applications/conpherence/controller/ConpherenceViewController.php index 0219d5f330..2b7a8c0e24 100644 --- a/src/applications/conpherence/controller/ConpherenceViewController.php +++ b/src/applications/conpherence/controller/ConpherenceViewController.php @@ -1,116 +1,134 @@ conpherence = $conpherence; return $this; } public function getConpherence() { return $this->conpherence; } public function setConpherenceID($conpherence_id) { $this->conpherenceID = $conpherence_id; return $this; } public function getConpherenceID() { return $this->conpherenceID; } public function willProcessRequest(array $data) { $this->setConpherenceID(idx($data, 'id')); } public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $conpherence_id = $this->getConpherenceID(); if (!$conpherence_id) { return new Aphront404Response(); } $conpherence = id(new ConpherenceThreadQuery()) ->setViewer($user) ->withIDs(array($conpherence_id)) ->needHeaderPics(true) ->executeOne(); $this->setConpherence($conpherence); $participant = $conpherence->getParticipant($user->getPHID()); $transactions = $conpherence->getTransactions(); $latest_transaction = end($transactions); $write_guard = AphrontWriteGuard::beginScopedUnguardedWrites(); $participant->markUpToDate($latest_transaction); unset($write_guard); $header = $this->renderHeaderPaneContent(); $messages = $this->renderMessagePaneContent(); $content = $header + $messages; - return id(new AphrontAjaxResponse())->setContent($content); + + if ($request->isAjax()) { + return id(new AphrontAjaxResponse())->setContent($content); + } + + $layout = id(new ConpherenceLayoutView()) + ->setBaseURI($this->getApplicationURI()) + ->setThread($conpherence) + ->setHeader($header) + ->setMessages($messages['messages']) + ->setReplyForm($messages['form']) + ->setRole('thread'); + + return $this->buildApplicationPage( + $layout, + array( + 'title' => $conpherence->getTitle(), + 'device' => true, + )); } private function renderHeaderPaneContent() { require_celerity_resource('conpherence-header-pane-css'); $conpherence = $this->getConpherence(); $header = $this->buildHeaderPaneContent($conpherence); - return array('header' => $header); + return array('header' => hsprintf('%s', $header)); } private function renderMessagePaneContent() { require_celerity_resource('conpherence-message-pane-css'); $user = $this->getRequest()->getUser(); $conpherence = $this->getConpherence(); $data = $this->renderConpherenceTransactions($conpherence); $latest_transaction_id = $data['latest_transaction_id']; $transactions = $data['transactions']; $update_uri = $this->getApplicationURI('update/'.$conpherence->getID().'/'); Javelin::initBehavior('conpherence-pontificate'); $form = id(new AphrontFormView()) ->setAction($update_uri) ->setFlexible(true) ->addSigil('conpherence-pontificate') ->setWorkflow(true) ->setUser($user) ->addHiddenInput('action', 'message') ->addHiddenInput('latest_transaction_id', $latest_transaction_id) ->appendChild( id(new PhabricatorRemarkupControl()) ->setUser($user) ->setName('text')) ->appendChild( id(new AphrontFormSubmitControl()) ->setValue(pht('Pontificate'))) ->render(); $scrollbutton = javelin_tag( 'a', array( 'href' => '#', 'mustcapture' => true, 'sigil' => 'show-older-messages', 'class' => 'conpherence-show-older-messages', ), pht('Show Older Messages')); return array( - 'messages' => $scrollbutton.$transactions, + 'messages' => hsprintf('%s%s', $scrollbutton, $transactions), 'form' => $form ); } } diff --git a/src/applications/conpherence/view/ConpherenceLayoutView.php b/src/applications/conpherence/view/ConpherenceLayoutView.php index 56aa32100c..94d4a9b087 100644 --- a/src/applications/conpherence/view/ConpherenceLayoutView.php +++ b/src/applications/conpherence/view/ConpherenceLayoutView.php @@ -1,124 +1,143 @@ messages = $messages; + return $this; + } + + public function setReplyForm($reply_form) { + $this->replyForm = $reply_form; + return $this; + } + + public function setHeader($header) { + $this->header = $header; + return $this; + } public function setRole($role) { $this->role = $role; return $this; } public function getThreadView() { return $this->threadView; } public function setBaseURI($base_uri) { $this->baseURI = $base_uri; return $this; } public function setThread(ConpherenceThread $thread) { $this->thread = $thread; return $this; } public function setThreadView(ConpherenceThreadListView $thead_view) { $this->threadView = $thead_view; return $this; } public function render() { + require_celerity_resource('conpherence-menu-css'); Javelin::initBehavior('conpherence-menu', array( 'base_uri' => $this->baseURI, 'header' => 'conpherence-header-pane', 'messages' => 'conpherence-messages', 'messages_pane' => 'conpherence-message-pane', 'widgets_pane' => 'conpherence-widget-pane', 'form_pane' => 'conpherence-form', 'menu_pane' => 'conpherence-menu', 'selectedID' => ($this->thread ? $this->thread->getID() : null), 'role' => $this->role, )); Javelin::initBehavior('conpherence-drag-and-drop-photo', array( 'target' => 'conpherence-header-pane', 'form_pane' => 'conpherence-form', 'upload_uri' => '/file/dropupload/', 'activated_class' => 'conpherence-header-upload-photo', )); return javelin_tag( 'div', array( 'sigil' => 'conpherence-layout', 'class' => 'conpherence-layout conpherence-role-'.$this->role, ), array( javelin_tag( 'div', array( 'class' => 'phabricator-nav-column-background', ), ''), javelin_tag( 'div', array( 'class' => 'conpherence-menu-pane phabricator-side-menu', 'sigil' => 'conpherence-menu-pane', ), nonempty($this->threadView, '')), javelin_tag( 'div', array( 'class' => 'conpherence-content-pane', ), array( javelin_tag( 'div', array( 'class' => 'conpherence-header-pane', 'id' => 'conpherence-header-pane', 'sigil' => 'conpherence-header', ), - ''), + nonempty($this->header, '')), phutil_tag( 'div', array( 'class' => 'conpherence-widget-pane', 'id' => 'conpherence-widget-pane' ), ''), javelin_tag( 'div', array( 'class' => 'conpherence-message-pane', 'id' => 'conpherence-message-pane' ), array( javelin_tag( 'div', array( 'class' => 'conpherence-messages', 'id' => 'conpherence-messages', 'sigil' => 'conpherence-messages', ), - ''), + nonempty($this->messages, '')), phutil_tag( 'div', array( 'id' => 'conpherence-form' ), - '') + nonempty($this->replyForm, '')) )), )), )); } } diff --git a/src/applications/conpherence/view/ConpherenceThreadListView.php b/src/applications/conpherence/view/ConpherenceThreadListView.php index cf204c9d20..1fe47f4336 100644 --- a/src/applications/conpherence/view/ConpherenceThreadListView.php +++ b/src/applications/conpherence/view/ConpherenceThreadListView.php @@ -1,112 +1,118 @@ baseURI = $base_uri; return $this; } public function setUnreadThreads(array $unread_threads) { assert_instances_of($unread_threads, 'ConpherenceThread'); $this->unreadThreads = $unread_threads; return $this; } public function setReadThreads(array $read_threads) { assert_instances_of($read_threads, 'ConpherenceThread'); $this->readThreads = $read_threads; return $this; } public function render() { require_celerity_resource('conpherence-menu-css'); $menu = id(new PhabricatorMenuView()) ->addClass('conpherence-menu') ->setID('conpherence-menu'); $menu->addMenuItem( id(new PhabricatorMenuItemView()) ->setName(pht('New Conversation')) ->setWorkflow(true) ->setKey('new') ->setHref($this->baseURI.'new/') ->setType(PhabricatorMenuItemView::TYPE_BUTTON)); $menu->newLabel(pht('Unread')); $this->addThreadsToMenu($menu, $this->unreadThreads, $read = false); $menu->newLabel(pht('Read')); $this->addThreadsToMenu($menu, $this->readThreads, $read = true); return $menu; } + public function renderSingleThread(ConpherenceThread $thread) { + return $this->renderThread($thread); + } + + private function renderThreadItem(ConpherenceThread $thread) { + return id(new PhabricatorMenuItemView()) + ->setType(PhabricatorMenuItemView::TYPE_CUSTOM) + ->setName($this->renderThread($thread)); + } + private function renderThread(ConpherenceThread $thread) { $user = $this->getUser(); $uri = $this->baseURI.$thread->getID().'/'; $data = $thread->getDisplayData($user, null); $title = $data['title']; $subtitle = $data['subtitle']; $unread_count = $data['unread_count']; $epoch = $data['epoch']; $image = $data['image']; $snippet = $data['snippet']; - $item = id(new ConpherenceMenuItemView()) + return id(new ConpherenceMenuItemView()) ->setUser($user) ->setTitle($title) ->setSubtitle($subtitle) ->setHref($uri) ->setEpoch($epoch) ->setImageURI($image) ->setMessageText($snippet) ->setUnreadCount($unread_count) ->setID($thread->getPHID().'-nav-item') ->addSigil('conpherence-menu-click') ->setMetadata( array( 'id' => $thread->getID(), )); - - return id(new PhabricatorMenuItemView()) - ->setType(PhabricatorMenuItemView::TYPE_CUSTOM) - ->setName($item); } private function addThreadsToMenu( PhabricatorMenuView $menu, array $conpherences, $read = false) { foreach ($conpherences as $conpherence) { - $item = $this->renderThread($conpherence); + $item = $this->renderThreadItem($conpherence); $menu->addMenuItem($item); } if (empty($conpherences) || $read) { $menu->addMenuItem($this->getNoConpherencesBlock()); } return $menu; } private function getNoConpherencesBlock() { $message = phutil_tag( 'div', array( 'class' => 'no-conpherences-menu-item' ), pht('No more conpherences.')); return id(new PhabricatorMenuItemView()) ->setType(PhabricatorMenuItemView::TYPE_CUSTOM) ->setName($message); } } diff --git a/webroot/rsrc/css/application/conpherence/header-pane.css b/webroot/rsrc/css/application/conpherence/header-pane.css index 611bf0b307..80e4c6cfcb 100644 --- a/webroot/rsrc/css/application/conpherence/header-pane.css +++ b/webroot/rsrc/css/application/conpherence/header-pane.css @@ -1,102 +1,93 @@ /** * @provides conpherence-header-pane-css */ .conpherence-header-pane { border-bottom: 1px solid #ccc; height: 80px; width: 100%; } -.device .conpherence-header-pane { - position: fixed; - top: 44px; -} - -.device-phone .conpherence-header-pane { - display: none; -} - .conpherence-header-pane .edit { float: right; margin: 16px 16px 0px 0px; height: 50px; width: 50px; background-image: url('/rsrc/image/actions/edit.png'); } .conpherence-header-pane .header-image { position: absolute; top: 15px; left: 15px; height: 50px; width: 50px; } .conpherence-header-pane .custom-header-image { position: absolute; top: 0px; left: 0px; height: 80px; width: 120px; } .conpherence-header-pane .title { position: relative; font-size: 16px; font-weight: bold; left: 77px; top: 21px; max-width: 80%; overflow-x: auto; } .conpherence-header-pane .custom-title { position: relative; font-size: 16px; font-weight: bold; left: 132px; top: 21px; max-width: 80%; overflow-x: auto; } .conpherence-header-pane .subtitle { position: relative; left: 77px; top: 21px; color: #bfbfbf; max-width: 80%; } .conpherence-header-pane .custom-subtitle { position: relative; left: 132px; top: 21px; color: #bfbfbf; max-width: 80%; } .conpherence-header-pane .upload-photo { display: none; } .conpherence-header-upload-photo .upload-photo { display: block; width: 100%; padding: 32px; font-size: 16px; background: #99ff99; border-color: #669966; } .conpherence-header-upload-photo .edit, .conpherence-header-upload-photo .header-image, .conpherence-header-upload-photo .custom-header-image, .conpherence-header-upload-photo .title, .conpherence-header-upload-photo .custom-title, .conpherence-header-upload-photo .subtitle, .conpherence-header-upload-photo .custom-subtitle { display: none; } diff --git a/webroot/rsrc/css/application/conpherence/menu.css b/webroot/rsrc/css/application/conpherence/menu.css index 9b87c65a5d..0da340fe41 100644 --- a/webroot/rsrc/css/application/conpherence/menu.css +++ b/webroot/rsrc/css/application/conpherence/menu.css @@ -1,138 +1,156 @@ /** * @provides conpherence-menu-css */ .conpherence-layout { position: fixed; bottom: 0; left: 0; right: 0; top: 44px; } .conpherence-menu-pane { width: 300px; position: absolute; overflow-x: hidden; overflow-y: auto; top: 0; bottom: 0; } .conpherence-content-pane { margin-left: 300px; position: relative; } div.conpherence-layout .phabricator-nav-column-background { display: block; width: 300px; } .device .conpherence-role-list .conpherence-menu-pane, .device .conpherence-role-list .phabricator-nav-column-background { width: 100%; } .device .conpherence-role-list .conpherence-content-pane { display: none; } +.device .conpherence-role-thread .conpherence-menu-pane, +.device .conpherence-role-thread .phabricator-nav-column-background, +.device .conpherence-role-thread .conpherence-widget-pane { + display: none; +} + +.device .conpherence-role-thread .conpherence-content-pane { + margin-left: 0; +} + +.device .conpherence-role-thread .conpherence-message-pane, +.device .conpherence-role-thread .conpherence-messages, +.device .conpherence-role-thread .phabricator-form-view { + left: 0; + right: 0; + width: 100%; +} + .conpherence-menu .conpherence-menu-item-view { display: block; height: 70px; width: 100%; overflow: hidden; position: relative; text-decoration: none; border-top: solid 1px #3B3D3E; border-bottom: solid 1px #1C1F21; border-right: 0; border-left: 2px solid transparent; } .conpherence-menu .conpherence-selected { background: rgba(0, 0, 0, .6); border-left: 2px solid #66CCFF; } .device-desktop .conpherence-menu .conpherence-menu-item-view:hover { background-image: url('/rsrc/image/texture/dark-menu-hover.png'); } .conpherence-menu .conpherence-menu-item-view .conpherence-menu-item-image { top: 6px; left: 6px; display: block; position: absolute; width: 50px; height: 50px; border: 4px solid rgb(29, 32, 34); border-radius: 2px; } .conpherence-menu .conpherence-menu-item-view .conpherence-menu-item-title { display: block; margin-top: 12px; margin-left: 70px; text-align: left; font-weight: bold; font-size: 12px; color: #ffffff; text-shadow: 0px 1px 1px #000000; } .conpherence-menu .conpherence-menu-item-view .conpherence-menu-item-subtitle { display: block; color: #bfbfbf; font-size: 11px; margin-top: 2px; margin-left: 70px; 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; top: 3px; background: #f00; border-radius: 10px; color: white; font-weight: bold; padding: 1px 6px 2px; border: 1px solid #a00; font-size: 12px; } .conpherence-menu .hide-unread-count .conpherence-menu-item-unread-count, .conpherence-menu .conpherence-selected .conpherence-menu-item-unread-count { display: none; } .conpherence-menu .conpherence-menu-item-view .conpherence-menu-item-date { position: absolute; top: 10px; right: 12px; color: white; font-size: 12px; } .no-conpherences-menu-item { color: #a1a5a9; border-top: solid 1px #3B3D3E; padding: 20px 0; margin: 0px auto; width: 300px; text-align: center; }