public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     // this means we're using "show more" on a diff of a description and
     // should thus use the rendering reference to identify the transaction
     $ref = $request->getStr('ref');
     if ($ref) {
         $this->setTransactionID($ref);
     }
     $transaction_id = $this->getTransactionID();
     $transaction = id(new ManiphestTransaction())->load($transaction_id);
     if (!$transaction) {
         return new Aphront404Response();
     }
     $transactions = array($transaction);
     $phids = array();
     foreach ($transactions as $transaction) {
         foreach ($transaction->extractPHIDs() as $phid) {
             $phids[$phid] = $phid;
         }
     }
     $handles = id(new PhabricatorObjectHandleData($phids))->loadHandles();
     $engine = PhabricatorMarkupEngine::newManiphestMarkupEngine();
     $view = new ManiphestTransactionDetailView();
     $view->setTransactionGroup($transactions);
     $view->setHandles($handles);
     $view->setUser($user);
     $view->setMarkupEngine($engine);
     $view->setRenderSummaryOnly(true);
     $view->setRenderFullSummary(true);
     $view->setRangeSpecification($request->getStr('range'));
     return id(new AphrontAjaxResponse())->setContent($view->render());
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $transaction = id(new ManiphestTransaction())->load($this->transactionID);
     if (!$transaction) {
         return new Aphront404Response();
     }
     $transactions = array($transaction);
     $phids = array();
     foreach ($transactions as $transaction) {
         foreach ($transaction->extractPHIDs() as $phid) {
             $phids[$phid] = $phid;
         }
     }
     $handles = id(new PhabricatorObjectHandleData($phids))->loadHandles();
     $engine = PhabricatorMarkupEngine::newManiphestMarkupEngine();
     $view = new ManiphestTransactionDetailView();
     $view->setTransactionGroup($transactions);
     $view->setHandles($handles);
     $view->setUser($user);
     $view->setMarkupEngine($engine);
     $view->setRenderSummaryOnly(true);
     $view->setRenderFullSummary(true);
     return id(new AphrontAjaxResponse())->setContent($view->render());
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $is_show_more = false;
     if (!$this->getTransactionID()) {
         $this->setTransactionID($this->getRequest()->getStr('ref'));
         $is_show_more = true;
     }
     $transaction_id = $this->getTransactionID();
     $transaction = id(new ManiphestTransaction())->load($transaction_id);
     if (!$transaction) {
         return new Aphront404Response();
     }
     $transactions = array($transaction);
     $phids = array();
     foreach ($transactions as $xaction) {
         foreach ($xaction->extractPHIDs() as $phid) {
             $phids[$phid] = $phid;
         }
     }
     $handles = $this->loadViewerHandles($phids);
     $engine = new PhabricatorMarkupEngine();
     $engine->setViewer($user);
     $engine->addObject($transaction, ManiphestTransaction::MARKUP_FIELD_BODY);
     $engine->process();
     $view = new ManiphestTransactionDetailView();
     $view->setTransactionGroup($transactions);
     $view->setHandles($handles);
     $view->setUser($user);
     $view->setMarkupEngine($engine);
     $view->setRenderSummaryOnly(true);
     $view->setRenderFullSummary(true);
     $view->setRangeSpecification($request->getStr('range'));
     if ($is_show_more) {
         return id(new PhabricatorChangesetResponse())->setRenderedChangeset($view->render());
     } else {
         return id(new AphrontAjaxResponse())->setContent($view->render());
     }
 }
 public function render()
 {
     $views = array();
     $last = null;
     $group = array();
     $groups = array();
     foreach ($this->transactions as $transaction) {
         if ($last === null) {
             $last = $transaction;
             $group[] = $transaction;
             continue;
         } else {
             if ($last->canGroupWith($transaction)) {
                 $group[] = $transaction;
                 if ($transaction->hasComments()) {
                     $last = $transaction;
                 }
             } else {
                 $groups[] = $group;
                 $last = $transaction;
                 $group = array($transaction);
             }
         }
     }
     if ($group) {
         $groups[] = $group;
     }
     $sequence = 1;
     foreach ($groups as $group) {
         $view = new ManiphestTransactionDetailView();
         $view->setUser($this->user);
         $view->setTransactionGroup($group);
         $view->setHandles($this->handles);
         $view->setMarkupEngine($this->markupEngine);
         $view->setPreview($this->preview);
         $view->setCommentNumber($sequence++);
         $views[] = $view->render();
     }
     return '<div class="maniphest-transaction-list-view">' . implode("\n", $views) . '</div>';
 }
 public function render()
 {
     $views = array();
     $last = null;
     $group = array();
     $groups = array();
     $has_description_transaction = false;
     foreach ($this->transactions as $transaction) {
         if ($transaction->getTransactionType() == ManiphestTransactionType::TYPE_DESCRIPTION) {
             $has_description_transaction = true;
         }
         if ($last === null) {
             $last = $transaction;
             $group[] = $transaction;
             continue;
         } else {
             if ($last->canGroupWith($transaction)) {
                 $group[] = $transaction;
                 if ($transaction->hasComments()) {
                     $last = $transaction;
                 }
             } else {
                 $groups[] = $group;
                 $last = $transaction;
                 $group = array($transaction);
             }
         }
     }
     if ($group) {
         $groups[] = $group;
     }
     if ($has_description_transaction) {
         require_celerity_resource('differential-changeset-view-css');
         require_celerity_resource('syntax-highlighting-css');
         $whitespace_mode = DifferentialChangesetParser::WHITESPACE_SHOW_ALL;
         Javelin::initBehavior('differential-show-more', array('uri' => '/maniphest/task/descriptionchange/', 'whitespace' => $whitespace_mode));
     }
     $sequence = 1;
     foreach ($groups as $group) {
         $view = new ManiphestTransactionDetailView();
         $view->setUser($this->user);
         $view->setAuxiliaryFields($this->getAuxiliaryFields());
         $view->setTransactionGroup($group);
         $view->setHandles($this->handles);
         $view->setMarkupEngine($this->markupEngine);
         $view->setPreview($this->preview);
         $view->setCommentNumber($sequence++);
         $views[] = $view->render();
     }
     return '<div class="maniphest-transaction-list-view">' . implode("\n", $views) . '</div>';
 }
 private function sendEmail($task, $transactions, $email_to, $email_cc)
 {
     $email_to = array_filter(array_unique($email_to));
     $email_cc = array_filter(array_unique($email_cc));
     $phids = array();
     foreach ($transactions as $transaction) {
         foreach ($transaction->extractPHIDs() as $phid) {
             $phids[$phid] = true;
         }
     }
     foreach ($email_to as $phid) {
         $phids[$phid] = true;
     }
     foreach ($email_cc as $phid) {
         $phids[$phid] = true;
     }
     $phids = array_keys($phids);
     $handles = id(new PhabricatorObjectHandleData($phids))->loadHandles();
     $view = new ManiphestTransactionDetailView();
     $view->setTransactionGroup($transactions);
     $view->setHandles($handles);
     list($action, $body) = $view->renderForEmail($with_date = false);
     $is_create = false;
     foreach ($transactions as $transaction) {
         $type = $transaction->getTransactionType();
         if ($type == ManiphestTransactionType::TYPE_STATUS && $transaction->getOldValue() === null && $transaction->getNewValue() == ManiphestTaskStatus::STATUS_OPEN) {
             $is_create = true;
         }
     }
     $task_uri = PhabricatorEnv::getURI('/T' . $task->getID());
     $reply_handler = $this->buildReplyHandler($task);
     if ($is_create) {
         $body .= "\n\n" . "TASK DESCRIPTION\n" . "  " . $task->getDescription();
     }
     $body .= "\n\n" . "TASK DETAIL\n" . "  " . $task_uri . "\n";
     $reply_instructions = $reply_handler->getReplyHandlerInstructions();
     if ($reply_instructions) {
         $body .= "\n" . "REPLY HANDLER ACTIONS\n" . "  " . $reply_instructions . "\n";
     }
     $thread_id = '<maniphest-task-' . $task->getPHID() . '>';
     $task_id = $task->getID();
     $title = $task->getTitle();
     $prefix = $this->getSubjectPrefix();
     $subject = trim("{$prefix} [{$action}] T{$task_id}: {$title}");
     $template = id(new PhabricatorMetaMTAMail())->setSubject($subject)->setFrom($transaction->getAuthorPHID())->setParentMessageID($this->parentMessageID)->addHeader('Thread-Topic', 'Maniphest Task ' . $task->getID())->setThreadID($thread_id, $is_create)->setRelatedPHID($task->getPHID())->setBody($body);
     $mails = $reply_handler->multiplexMail($template, array_select_keys($handles, $email_to), array_select_keys($handles, $email_cc));
     foreach ($mails as $mail) {
         $mail->saveAndSend();
     }
 }
 private function sendEmail($task, $transactions, $email_to, $email_cc)
 {
     $email_to = array_filter(array_unique($email_to));
     $email_cc = array_filter(array_unique($email_cc));
     $phids = array();
     foreach ($transactions as $transaction) {
         foreach ($transaction->extractPHIDs() as $phid) {
             $phids[$phid] = true;
         }
     }
     foreach ($email_to as $phid) {
         $phids[$phid] = true;
     }
     foreach ($email_cc as $phid) {
         $phids[$phid] = true;
     }
     $phids = array_keys($phids);
     $handles = id(new PhabricatorObjectHandleData($phids))->loadHandles();
     $view = new ManiphestTransactionDetailView();
     $view->setTransactionGroup($transactions);
     $view->setHandles($handles);
     $view->setAuxiliaryFields($this->auxiliaryFields);
     list($action, $main_body) = $view->renderForEmail($with_date = false);
     $is_create = $this->isCreate($transactions);
     $task_uri = PhabricatorEnv::getURI('/T' . $task->getID());
     $reply_handler = $this->buildReplyHandler($task);
     $body = new PhabricatorMetaMTAMailBody();
     $body->addRawSection($main_body);
     if ($is_create) {
         $body->addTextSection(pht('TASK DESCRIPTION'), $task->getDescription());
     }
     $body->addTextSection(pht('TASK DETAIL'), $task_uri);
     $body->addReplySection($reply_handler->getReplyHandlerInstructions());
     $thread_id = 'maniphest-task-' . $task->getPHID();
     $task_id = $task->getID();
     $title = $task->getTitle();
     $mailtags = $this->getMailTags($transactions);
     $template = id(new PhabricatorMetaMTAMail())->setSubject("T{$task_id}: {$title}")->setSubjectPrefix($this->getSubjectPrefix())->setVarySubjectPrefix("[{$action}]")->setFrom($transaction->getAuthorPHID())->setParentMessageID($this->parentMessageID)->addHeader('Thread-Topic', "T{$task_id}: " . $task->getOriginalTitle())->setThreadID($thread_id, $is_create)->setRelatedPHID($task->getPHID())->setIsBulk(true)->setMailTags($mailtags)->setBody($body->render());
     $mails = $reply_handler->multiplexMail($template, array_select_keys($handles, $email_to), array_select_keys($handles, $email_cc));
     foreach ($mails as $mail) {
         $mail->saveAndSend();
     }
 }