| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * Copyright 2011 Facebook, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  |  * you may not use this file except in compliance with the License. | 
					
						
							|  |  |  |  * You may obtain a copy of the License at | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *   http://www.apache.org/licenses/LICENSE-2.0 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  |  * distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  |  * See the License for the specific language governing permissions and | 
					
						
							|  |  |  |  * limitations under the License. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-04 13:04:22 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @group maniphest | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  | class ManiphestTaskDetailController extends ManiphestController { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private $id; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   public function willProcessRequest(array $data) { | 
					
						
							|  |  |  |     $this->id = $data['id']; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   public function processRequest() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $request = $this->getRequest(); | 
					
						
							|  |  |  |     $user = $request->getUser(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $e_title = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $priority_map = ManiphestTaskPriority::getTaskPriorityMap(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $task = id(new ManiphestTask())->load($this->id); | 
					
						
							| 
									
										
										
										
											2011-03-30 21:38:24 -07:00
										 |  |  |     if (!$task) { | 
					
						
							|  |  |  |       return new Aphront404Response(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-03 14:20:05 -07:00
										 |  |  |     $workflow = $request->getStr('workflow'); | 
					
						
							|  |  |  |     $parent_task = null; | 
					
						
							|  |  |  |     if ($workflow && is_numeric($workflow)) { | 
					
						
							|  |  |  |       $parent_task = id(new ManiphestTask())->load($workflow); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-05 09:44:43 -07:00
										 |  |  |     $extensions = ManiphestTaskExtensions::newExtensions(); | 
					
						
							|  |  |  |     $aux_fields = $extensions->getAuxiliaryFieldSpecifications(); | 
					
						
							| 
									
										
										
										
											2011-07-27 11:49:50 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |     $transactions = id(new ManiphestTransaction())->loadAllWhere( | 
					
						
							| 
									
										
										
										
											2011-04-11 02:45:53 -07:00
										 |  |  |       'taskID = %d ORDER BY id ASC', | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |       $task->getID()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $phids = array(); | 
					
						
							|  |  |  |     foreach ($transactions as $transaction) { | 
					
						
							|  |  |  |       foreach ($transaction->extractPHIDs() as $phid) { | 
					
						
							|  |  |  |         $phids[$phid] = true; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     foreach ($task->getCCPHIDs() as $phid) { | 
					
						
							|  |  |  |       $phids[$phid] = true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-02-20 20:08:16 -08:00
										 |  |  |     foreach ($task->getProjectPHIDs() as $phid) { | 
					
						
							|  |  |  |       $phids[$phid] = true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |     if ($task->getOwnerPHID()) { | 
					
						
							|  |  |  |       $phids[$task->getOwnerPHID()] = true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     $phids[$task->getAuthorPHID()] = true; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-17 14:32:01 -08:00
										 |  |  |     $attached = $task->getAttached(); | 
					
						
							|  |  |  |     foreach ($attached as $type => $list) { | 
					
						
							|  |  |  |       foreach ($list as $phid => $info) { | 
					
						
							|  |  |  |         $phids[$phid] = true; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-03 14:20:05 -07:00
										 |  |  |     if ($parent_task) { | 
					
						
							|  |  |  |       $phids[$parent_task->getPHID()] = true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $phids = array_keys($phids); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |     $handles = id(new PhabricatorObjectHandleData($phids)) | 
					
						
							|  |  |  |       ->loadHandles(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												Generalize the markup engine factory
Summary:
This thing services every app but it lives inside Differential right now. Pull
it out, and separate the factory interfaces per-application.
This will let us accommodate changes we need to make for Phriction to support
wiki linking.
Test Plan: Tested remarkup in differential, diffusion, maniphest, people,
slowvote.
Reviewed By: hsb
Reviewers: hsb, codeblock, jungejason, tuomaspelkonen, aran
CC: aran, hsb
Differential Revision: 646
											
										 
											2011-07-11 15:58:32 -07:00
										 |  |  |     $engine = PhabricatorMarkupEngine::newManiphestMarkupEngine(); | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     $dict = array(); | 
					
						
							|  |  |  |     $dict['Status'] = | 
					
						
							|  |  |  |       '<strong>'. | 
					
						
							|  |  |  |         ManiphestTaskStatus::getTaskStatusFullName($task->getStatus()). | 
					
						
							|  |  |  |       '</strong>'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $dict['Assigned To'] = $task->getOwnerPHID() | 
					
						
							| 
									
										
										
										
											2011-02-08 21:01:42 -08:00
										 |  |  |       ? $handles[$task->getOwnerPHID()]->renderLink() | 
					
						
							|  |  |  |       : '<em>None</em>'; | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     $dict['Priority'] = ManiphestTaskPriority::getTaskPriorityName( | 
					
						
							|  |  |  |       $task->getPriority()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $cc = $task->getCCPHIDs(); | 
					
						
							|  |  |  |     if ($cc) { | 
					
						
							|  |  |  |       $cc_links = array(); | 
					
						
							|  |  |  |       foreach ($cc as $phid) { | 
					
						
							|  |  |  |         $cc_links[] = $handles[$phid]->renderLink(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       $dict['CC'] = implode(', ', $cc_links); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       $dict['CC'] = '<em>None</em>'; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $dict['Author'] = $handles[$task->getAuthorPHID()]->renderLink(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-14 13:11:58 -07:00
										 |  |  |     $source = $task->getOriginalEmailSource(); | 
					
						
							|  |  |  |     if ($source) { | 
					
						
							|  |  |  |       $subject = '[T'.$task->getID().'] '.$task->getTitle(); | 
					
						
							|  |  |  |       $dict['From Email'] = phutil_render_tag( | 
					
						
							|  |  |  |         'a', | 
					
						
							|  |  |  |         array( | 
					
						
							|  |  |  |           'href' => 'mailto:'.$source.'?subject='.$subject | 
					
						
							|  |  |  |         ), | 
					
						
							|  |  |  |         phutil_escape_html($source)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-20 20:08:16 -08:00
										 |  |  |     $projects = $task->getProjectPHIDs(); | 
					
						
							|  |  |  |     if ($projects) { | 
					
						
							|  |  |  |       $project_links = array(); | 
					
						
							|  |  |  |       foreach ($projects as $phid) { | 
					
						
							|  |  |  |         $project_links[] = $handles[$phid]->renderLink(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       $dict['Projects'] = implode(', ', $project_links); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       $dict['Projects'] = '<em>None</em>'; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-27 11:49:50 -05:00
										 |  |  |     if ($aux_fields) { | 
					
						
							|  |  |  |       foreach ($aux_fields as $aux_field) { | 
					
						
							|  |  |  |         $attribute = $task->loadAuxiliaryAttribute( | 
					
						
							|  |  |  |           $aux_field->getAuxiliaryKey() | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($attribute) { | 
					
						
							|  |  |  |           $aux_field->setValue($attribute->getValue()); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $dict[$aux_field->getLabel()] = $aux_field->renderForDetailView(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-05 13:18:47 -07:00
										 |  |  |     $dtasks = idx($attached, PhabricatorPHIDConstants::PHID_TYPE_TASK); | 
					
						
							|  |  |  |     if ($dtasks) { | 
					
						
							|  |  |  |       $dtask_links = array(); | 
					
						
							|  |  |  |       foreach ($dtasks as $dtask => $info) { | 
					
						
							|  |  |  |         $dtask_links[] = $handles[$dtask]->renderLink(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       $dtask_links = implode('<br />', $dtask_links); | 
					
						
							|  |  |  |       $dict['Depends On'] = $dtask_links; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $revs = idx($attached, PhabricatorPHIDConstants::PHID_TYPE_DREV); | 
					
						
							|  |  |  |     if ($revs) { | 
					
						
							| 
									
										
										
										
											2011-02-17 14:32:01 -08:00
										 |  |  |       $rev_links = array(); | 
					
						
							|  |  |  |       foreach ($revs as $rev => $info) { | 
					
						
							|  |  |  |         $rev_links[] = $handles[$rev]->renderLink(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-06-28 07:02:09 -07:00
										 |  |  |       $rev_links = implode('<br />', $rev_links); | 
					
						
							| 
									
										
										
										
											2011-02-17 14:32:01 -08:00
										 |  |  |       $dict['Revisions'] = $rev_links; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-05 13:18:47 -07:00
										 |  |  |     $file_infos = idx($attached, PhabricatorPHIDConstants::PHID_TYPE_FILE); | 
					
						
							|  |  |  |     if ($file_infos) { | 
					
						
							| 
									
										
										
										
											2011-05-22 17:06:42 -07:00
										 |  |  |       $file_phids = array_keys($file_infos); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-05 13:18:47 -07:00
										 |  |  |       $files = id(new PhabricatorFile())->loadAllWhere( | 
					
						
							|  |  |  |         'phid IN (%Ls)', | 
					
						
							|  |  |  |         $file_phids); | 
					
						
							| 
									
										
										
										
											2011-05-22 17:06:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-05 13:18:47 -07:00
										 |  |  |       $views = array(); | 
					
						
							|  |  |  |       foreach ($files as $file) { | 
					
						
							|  |  |  |         $view = new AphrontFilePreviewView(); | 
					
						
							|  |  |  |         $view->setFile($file); | 
					
						
							|  |  |  |         $views[] = $view->render(); | 
					
						
							| 
									
										
										
										
											2011-02-20 20:08:16 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-07-05 13:18:47 -07:00
										 |  |  |       $dict['Files'] = implode('', $views); | 
					
						
							| 
									
										
										
										
											2011-02-20 20:08:16 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-09 14:10:12 -08:00
										 |  |  |     $dict['Description'] = | 
					
						
							|  |  |  |       '<div class="maniphest-task-description">'. | 
					
						
							|  |  |  |         '<div class="phabricator-remarkup">'. | 
					
						
							|  |  |  |           $engine->markupText($task->getDescription()). | 
					
						
							|  |  |  |         '</div>'. | 
					
						
							|  |  |  |       '</div>'; | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     require_celerity_resource('mainphest-task-detail-css'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $table = array(); | 
					
						
							|  |  |  |     foreach ($dict as $key => $value) { | 
					
						
							|  |  |  |       $table[] = | 
					
						
							|  |  |  |         '<tr>'. | 
					
						
							|  |  |  |           '<th>'.phutil_escape_html($key).':</th>'. | 
					
						
							|  |  |  |           '<td>'.$value.'</td>'. | 
					
						
							|  |  |  |         '</tr>'; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     $table = | 
					
						
							|  |  |  |       '<table class="maniphest-task-properties">'. | 
					
						
							|  |  |  |         implode("\n", $table). | 
					
						
							|  |  |  |       '</table>'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												Tweak style on "Create Another Task" button
Summary:
Not totally sure I'm in love with this but I think it's somewhat non-terrible,
despite the lack of lens flare.
Also made "Cancel" take you back to the task if you got to "Create" from "Create
Another Task".
Test Plan:
  - Style:
https://secure.phabricator.com/file/view/PHID-FILE-ad37d3c1f3b2c7a7a7d1/
  - Hit "Cancel" from "Create Another", got sent back to task.
  - Hit "Cancel" from normal create, got sent back to list.
  - Tried to save an invalid task after making changes to CC/Projects, changes
were preserved.
Reviewed By: codeblock
Reviewers: hunterbridges, jungejason, tuomaspelkonen, aran, codeblock
CC: aran, epriestley, codeblock
Differential Revision: 736
											
										 
											2011-07-27 10:46:22 -07:00
										 |  |  |     $context_bar = null; | 
					
						
							| 
									
										
										
										
											2011-08-03 14:20:05 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if ($parent_task) { | 
					
						
							|  |  |  |       $context_bar = new AphrontContextBarView(); | 
					
						
							|  |  |  |       $context_bar->addButton( | 
					
						
							|  |  |  |          phutil_render_tag( | 
					
						
							|  |  |  |          'a', | 
					
						
							|  |  |  |          array( | 
					
						
							|  |  |  |            'href' => '/maniphest/task/create/?parent='.$parent_task->getID(), | 
					
						
							|  |  |  |            'class' => 'green button', | 
					
						
							|  |  |  |          ), | 
					
						
							|  |  |  |         'Create Another Subtask')); | 
					
						
							|  |  |  |       $context_bar->appendChild( | 
					
						
							|  |  |  |         'Created a subtask of <strong>'. | 
					
						
							|  |  |  |         $handles[$parent_task->getPHID()]->renderLink(). | 
					
						
							|  |  |  |         '</strong>'); | 
					
						
							|  |  |  |     } else if ($workflow == 'create') { | 
					
						
							| 
									
										
										
											
												Tweak style on "Create Another Task" button
Summary:
Not totally sure I'm in love with this but I think it's somewhat non-terrible,
despite the lack of lens flare.
Also made "Cancel" take you back to the task if you got to "Create" from "Create
Another Task".
Test Plan:
  - Style:
https://secure.phabricator.com/file/view/PHID-FILE-ad37d3c1f3b2c7a7a7d1/
  - Hit "Cancel" from "Create Another", got sent back to task.
  - Hit "Cancel" from normal create, got sent back to list.
  - Tried to save an invalid task after making changes to CC/Projects, changes
were preserved.
Reviewed By: codeblock
Reviewers: hunterbridges, jungejason, tuomaspelkonen, aran, codeblock
CC: aran, epriestley, codeblock
Differential Revision: 736
											
										 
											2011-07-27 10:46:22 -07:00
										 |  |  |       $context_bar = new AphrontContextBarView(); | 
					
						
							|  |  |  |       $context_bar->addButton( | 
					
						
							|  |  |  |          phutil_render_tag( | 
					
						
							|  |  |  |          'a', | 
					
						
							|  |  |  |          array( | 
					
						
							|  |  |  |            'href' => '/maniphest/task/create/?template='.$task->getID(), | 
					
						
							|  |  |  |            'class' => 'green button', | 
					
						
							|  |  |  |          ), | 
					
						
							|  |  |  |         'Create Another Task')); | 
					
						
							|  |  |  |       $context_bar->appendChild('New task created.'); | 
					
						
							| 
									
										
										
										
											2011-07-26 12:39:36 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-02-20 14:15:53 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-20 12:50:28 -08:00
										 |  |  |     $actions = array(); | 
					
						
							| 
									
										
										
										
											2011-02-20 14:15:53 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-20 12:50:28 -08:00
										 |  |  |     $action = new AphrontHeadsupActionView(); | 
					
						
							|  |  |  |     $action->setName('Edit Task'); | 
					
						
							| 
									
										
										
										
											2011-02-20 14:15:53 -08:00
										 |  |  |     $action->setURI('/maniphest/task/edit/'.$task->getID().'/'); | 
					
						
							| 
									
										
										
										
											2011-02-20 12:50:28 -08:00
										 |  |  |     $action->setClass('action-edit'); | 
					
						
							|  |  |  |     $actions[] = $action; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-16 11:43:39 -07:00
										 |  |  |     require_celerity_resource('phabricator-object-selector-css'); | 
					
						
							|  |  |  |     require_celerity_resource('javelin-behavior-phabricator-object-selector'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-14 07:55:04 -07:00
										 |  |  |     $action = new AphrontHeadsupActionView(); | 
					
						
							|  |  |  |     $action->setName('Merge Duplicates'); | 
					
						
							|  |  |  |     $action->setURI('/search/attach/'.$task->getPHID().'/TASK/merge/'); | 
					
						
							|  |  |  |     $action->setWorkflow(true); | 
					
						
							|  |  |  |     $action->setClass('action-merge'); | 
					
						
							|  |  |  |     $actions[] = $action; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-03 08:48:42 -07:00
										 |  |  |     $action = new AphrontHeadsupActionView(); | 
					
						
							|  |  |  |     $action->setName('Create Subtask'); | 
					
						
							|  |  |  |     $action->setURI('/maniphest/task/create/?parent='.$task->getID()); | 
					
						
							|  |  |  |     $action->setClass('action-branch'); | 
					
						
							|  |  |  |     $actions[] = $action; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-05 13:18:47 -07:00
										 |  |  |     $action = new AphrontHeadsupActionView(); | 
					
						
							|  |  |  |     $action->setName('Edit Dependencies'); | 
					
						
							|  |  |  |     $action->setURI('/search/attach/'.$task->getPHID().'/TASK/dependencies/'); | 
					
						
							|  |  |  |     $action->setWorkflow(true); | 
					
						
							|  |  |  |     $action->setClass('action-dependencies'); | 
					
						
							|  |  |  |     $actions[] = $action; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-20 12:50:28 -08:00
										 |  |  |     $action = new AphrontHeadsupActionView(); | 
					
						
							|  |  |  |     $action->setName('Edit Differential Revisions'); | 
					
						
							| 
									
										
										
										
											2011-05-16 11:43:39 -07:00
										 |  |  |     $action->setURI('/search/attach/'.$task->getPHID().'/DREV/'); | 
					
						
							|  |  |  |     $action->setWorkflow(true); | 
					
						
							|  |  |  |     $action->setClass('action-attach'); | 
					
						
							| 
									
										
										
										
											2011-02-20 12:50:28 -08:00
										 |  |  |     $actions[] = $action; | 
					
						
							| 
									
										
										
										
											2011-02-20 14:15:53 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-20 12:50:28 -08:00
										 |  |  |     $action_list = new AphrontHeadsupActionListView(); | 
					
						
							|  |  |  |     $action_list->setActions($actions); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |     $panel = | 
					
						
							|  |  |  |       '<div class="maniphest-panel">'. | 
					
						
							| 
									
										
										
										
											2011-02-20 12:50:28 -08:00
										 |  |  |         $action_list->render(). | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |         '<div class="maniphest-task-detail-core">'. | 
					
						
							|  |  |  |           '<h1>'. | 
					
						
							| 
									
										
										
										
											2011-06-14 12:53:52 -07:00
										 |  |  |             '<span class="aphront-headsup-object-name">'. | 
					
						
							|  |  |  |               phutil_escape_html('T'.$task->getID()). | 
					
						
							|  |  |  |             '</span>'. | 
					
						
							|  |  |  |             ' '. | 
					
						
							|  |  |  |             phutil_escape_html($task->getTitle()). | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |           '</h1>'. | 
					
						
							|  |  |  |           $table. | 
					
						
							|  |  |  |         '</div>'. | 
					
						
							|  |  |  |       '</div>'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $transaction_types = ManiphestTransactionType::getTransactionTypeMap(); | 
					
						
							|  |  |  |     $resolution_types = ManiphestTaskStatus::getTaskStatusMap(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ($task->getStatus() == ManiphestTaskStatus::STATUS_OPEN) { | 
					
						
							|  |  |  |       $resolution_types = array_select_keys( | 
					
						
							|  |  |  |         $resolution_types, | 
					
						
							|  |  |  |         array( | 
					
						
							|  |  |  |           ManiphestTaskStatus::STATUS_CLOSED_RESOLVED, | 
					
						
							|  |  |  |           ManiphestTaskStatus::STATUS_CLOSED_WONTFIX, | 
					
						
							|  |  |  |           ManiphestTaskStatus::STATUS_CLOSED_INVALID, | 
					
						
							|  |  |  |           ManiphestTaskStatus::STATUS_CLOSED_SPITE, | 
					
						
							|  |  |  |         )); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       $resolution_types = array( | 
					
						
							|  |  |  |         ManiphestTaskStatus::STATUS_OPEN => 'Reopened', | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       $transaction_types[ManiphestTransactionType::TYPE_STATUS] = | 
					
						
							|  |  |  |         'Reopen Task'; | 
					
						
							|  |  |  |       unset($transaction_types[ManiphestTransactionType::TYPE_PRIORITY]); | 
					
						
							|  |  |  |       unset($transaction_types[ManiphestTransactionType::TYPE_OWNER]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $default_claim = array( | 
					
						
							|  |  |  |       $user->getPHID() => $user->getUsername().' ('.$user->getRealName().')', | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-10 16:18:47 -07:00
										 |  |  |     $draft = id(new PhabricatorDraft())->loadOneWhere( | 
					
						
							|  |  |  |       'authorPHID = %s AND draftKey = %s', | 
					
						
							|  |  |  |       $user->getPHID(), | 
					
						
							|  |  |  |       $task->getPHID()); | 
					
						
							|  |  |  |     if ($draft) { | 
					
						
							|  |  |  |       $draft_text = $draft->getDraft(); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       $draft_text = null; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												Improve drag-and-drop uploader
Summary:
Make it discoverable, show uploading progress, show file thumbnails, allow you
to remove files, make it a generic form component.
Test Plan:
Uploaded ducks
Reviewed By: tomo
Reviewers: aran, tomo, jungejason, tuomaspelkonen
CC: anjali, aran, epriestley, tomo
Differential Revision: 334
											
										 
											2011-05-22 16:11:41 -07:00
										 |  |  |     $panel_id = celerity_generate_unique_node_id(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |     $comment_form = new AphrontFormView(); | 
					
						
							|  |  |  |     $comment_form | 
					
						
							|  |  |  |       ->setUser($user) | 
					
						
							|  |  |  |       ->setAction('/maniphest/transaction/save/') | 
					
						
							| 
									
										
										
										
											2011-02-20 20:08:16 -08:00
										 |  |  |       ->setEncType('multipart/form-data') | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |       ->addHiddenInput('taskID', $task->getID()) | 
					
						
							|  |  |  |       ->appendChild( | 
					
						
							|  |  |  |         id(new AphrontFormSelectControl()) | 
					
						
							|  |  |  |           ->setLabel('Action') | 
					
						
							|  |  |  |           ->setName('action') | 
					
						
							|  |  |  |           ->setOptions($transaction_types) | 
					
						
							|  |  |  |           ->setID('transaction-action')) | 
					
						
							|  |  |  |       ->appendChild( | 
					
						
							|  |  |  |         id(new AphrontFormSelectControl()) | 
					
						
							|  |  |  |           ->setLabel('Resolution') | 
					
						
							|  |  |  |           ->setName('resolution') | 
					
						
							|  |  |  |           ->setControlID('resolution') | 
					
						
							|  |  |  |           ->setControlStyle('display: none') | 
					
						
							|  |  |  |           ->setOptions($resolution_types)) | 
					
						
							|  |  |  |       ->appendChild( | 
					
						
							|  |  |  |         id(new AphrontFormTokenizerControl()) | 
					
						
							|  |  |  |           ->setLabel('Assign To') | 
					
						
							|  |  |  |           ->setName('assign_to') | 
					
						
							|  |  |  |           ->setControlID('assign_to') | 
					
						
							|  |  |  |           ->setControlStyle('display: none') | 
					
						
							|  |  |  |           ->setID('assign-tokenizer') | 
					
						
							|  |  |  |           ->setDisableBehavior(true)) | 
					
						
							|  |  |  |       ->appendChild( | 
					
						
							|  |  |  |         id(new AphrontFormTokenizerControl()) | 
					
						
							|  |  |  |           ->setLabel('CCs') | 
					
						
							|  |  |  |           ->setName('ccs') | 
					
						
							|  |  |  |           ->setControlID('ccs') | 
					
						
							|  |  |  |           ->setControlStyle('display: none') | 
					
						
							|  |  |  |           ->setID('cc-tokenizer') | 
					
						
							|  |  |  |           ->setDisableBehavior(true)) | 
					
						
							|  |  |  |       ->appendChild( | 
					
						
							|  |  |  |         id(new AphrontFormSelectControl()) | 
					
						
							|  |  |  |           ->setLabel('Priority') | 
					
						
							|  |  |  |           ->setName('priority') | 
					
						
							|  |  |  |           ->setOptions($priority_map) | 
					
						
							|  |  |  |           ->setControlID('priority') | 
					
						
							|  |  |  |           ->setControlStyle('display: none') | 
					
						
							|  |  |  |           ->setValue($task->getPriority())) | 
					
						
							| 
									
										
										
										
											2011-02-20 20:08:16 -08:00
										 |  |  |       ->appendChild( | 
					
						
							|  |  |  |         id(new AphrontFormTokenizerControl()) | 
					
						
							|  |  |  |           ->setLabel('Projects') | 
					
						
							|  |  |  |           ->setName('projects') | 
					
						
							|  |  |  |           ->setControlID('projects') | 
					
						
							|  |  |  |           ->setControlStyle('display: none') | 
					
						
							|  |  |  |           ->setID('projects-tokenizer') | 
					
						
							|  |  |  |           ->setDisableBehavior(true)) | 
					
						
							|  |  |  |       ->appendChild( | 
					
						
							|  |  |  |         id(new AphrontFormFileControl()) | 
					
						
							|  |  |  |           ->setLabel('File') | 
					
						
							|  |  |  |           ->setName('file') | 
					
						
							|  |  |  |           ->setControlID('file') | 
					
						
							|  |  |  |           ->setControlStyle('display: none')) | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |       ->appendChild( | 
					
						
							|  |  |  |         id(new AphrontFormTextAreaControl()) | 
					
						
							|  |  |  |           ->setLabel('Comments') | 
					
						
							|  |  |  |           ->setName('comments') | 
					
						
							| 
									
										
										
										
											2011-05-10 16:18:47 -07:00
										 |  |  |           ->setValue($draft_text) | 
					
						
							| 
									
										
										
										
											2011-05-10 08:29:28 -07:00
										 |  |  |           ->setID('transaction-comments')) | 
					
						
							| 
									
										
										
										
											2011-05-22 11:55:10 -07:00
										 |  |  |       ->appendChild( | 
					
						
							| 
									
										
										
											
												Improve drag-and-drop uploader
Summary:
Make it discoverable, show uploading progress, show file thumbnails, allow you
to remove files, make it a generic form component.
Test Plan:
Uploaded ducks
Reviewed By: tomo
Reviewers: aran, tomo, jungejason, tuomaspelkonen
CC: anjali, aran, epriestley, tomo
Differential Revision: 334
											
										 
											2011-05-22 16:11:41 -07:00
										 |  |  |         id(new AphrontFormDragAndDropUploadControl()) | 
					
						
							| 
									
										
										
										
											2011-05-22 11:55:10 -07:00
										 |  |  |           ->setLabel('Attached Files') | 
					
						
							| 
									
										
										
											
												Improve drag-and-drop uploader
Summary:
Make it discoverable, show uploading progress, show file thumbnails, allow you
to remove files, make it a generic form component.
Test Plan:
Uploaded ducks
Reviewed By: tomo
Reviewers: aran, tomo, jungejason, tuomaspelkonen
CC: anjali, aran, epriestley, tomo
Differential Revision: 334
											
										 
											2011-05-22 16:11:41 -07:00
										 |  |  |           ->setName('files') | 
					
						
							|  |  |  |           ->setDragAndDropTarget($panel_id) | 
					
						
							|  |  |  |           ->setActivatedClass('aphront-panel-view-drag-and-drop')) | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |       ->appendChild( | 
					
						
							|  |  |  |         id(new AphrontFormSubmitControl()) | 
					
						
							|  |  |  |           ->setValue('Avast!')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-11 04:17:48 -07:00
										 |  |  |     $control_map = array( | 
					
						
							|  |  |  |       ManiphestTransactionType::TYPE_STATUS   => 'resolution', | 
					
						
							|  |  |  |       ManiphestTransactionType::TYPE_OWNER    => 'assign_to', | 
					
						
							|  |  |  |       ManiphestTransactionType::TYPE_CCS      => 'ccs', | 
					
						
							|  |  |  |       ManiphestTransactionType::TYPE_PRIORITY => 'priority', | 
					
						
							|  |  |  |       ManiphestTransactionType::TYPE_PROJECTS => 'projects', | 
					
						
							|  |  |  |       ManiphestTransactionType::TYPE_ATTACH   => 'file', | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |     Javelin::initBehavior('maniphest-transaction-controls', array( | 
					
						
							|  |  |  |       'select' => 'transaction-action', | 
					
						
							| 
									
										
										
										
											2011-05-11 04:17:48 -07:00
										 |  |  |       'controlMap' => $control_map, | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |       'tokenizers' => array( | 
					
						
							| 
									
										
										
										
											2011-02-20 20:08:16 -08:00
										 |  |  |         ManiphestTransactionType::TYPE_PROJECTS => array( | 
					
						
							| 
									
										
										
										
											2011-10-07 18:25:54 -07:00
										 |  |  |           'id'       => 'projects-tokenizer', | 
					
						
							|  |  |  |           'src'      => '/typeahead/common/projects/', | 
					
						
							|  |  |  |           'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'), | 
					
						
							| 
									
										
										
										
											2011-02-20 20:08:16 -08:00
										 |  |  |         ), | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |         ManiphestTransactionType::TYPE_OWNER => array( | 
					
						
							| 
									
										
										
										
											2011-10-07 18:25:54 -07:00
										 |  |  |           'id'       => 'assign-tokenizer', | 
					
						
							|  |  |  |           'src'      => '/typeahead/common/users/', | 
					
						
							|  |  |  |           'value'    => $default_claim, | 
					
						
							|  |  |  |           'limit'    => 1, | 
					
						
							|  |  |  |           'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'), | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |         ), | 
					
						
							|  |  |  |         ManiphestTransactionType::TYPE_CCS => array( | 
					
						
							| 
									
										
										
										
											2011-10-07 18:25:54 -07:00
										 |  |  |           'id'       => 'cc-tokenizer', | 
					
						
							|  |  |  |           'src'      => '/typeahead/common/mailable/', | 
					
						
							|  |  |  |           'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'), | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |         ), | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |     )); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-10 08:29:28 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Javelin::initBehavior('maniphest-transaction-preview', array( | 
					
						
							|  |  |  |       'uri'     => '/maniphest/transaction/preview/'.$task->getID().'/', | 
					
						
							|  |  |  |       'preview' => 'transaction-preview', | 
					
						
							|  |  |  |       'comments' => 'transaction-comments', | 
					
						
							| 
									
										
										
										
											2011-05-11 04:17:48 -07:00
										 |  |  |       'action'   => 'transaction-action', | 
					
						
							|  |  |  |       'map'      => $control_map, | 
					
						
							| 
									
										
										
										
											2011-05-10 08:29:28 -07:00
										 |  |  |     )); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |     $comment_panel = new AphrontPanelView(); | 
					
						
							|  |  |  |     $comment_panel->appendChild($comment_form); | 
					
						
							| 
									
										
										
											
												Improve drag-and-drop uploader
Summary:
Make it discoverable, show uploading progress, show file thumbnails, allow you
to remove files, make it a generic form component.
Test Plan:
Uploaded ducks
Reviewed By: tomo
Reviewers: aran, tomo, jungejason, tuomaspelkonen
CC: anjali, aran, epriestley, tomo
Differential Revision: 334
											
										 
											2011-05-22 16:11:41 -07:00
										 |  |  |     $comment_panel->setID($panel_id); | 
					
						
							| 
									
										
										
											
												Tweak Maniphest CSS, fix remarkup in description change views
Summary:
Various CSS tweaks and fixes:
  - Add remarkup styling to description change views, missed this before.
  - Fix CSS so that transactions with only one item (e.g., changed priority)
don't have weird floater underneath them.
  - Add more space between transaction items.
  - Make default background color lighter and less heavy.
  - Use beigey color for comment form in Maniphest.
  - Share more CSS between Maniphest and Differential (previews, feedback).
  - Move "Leap Into Action" call to Differential, replace Maniphest with
thematically-consistent "Weigh In" (obviously, Maniphest has a nautical theme).
Test Plan:
Browsed Maniphest and Differential in a couple browsers, styling all seems
correct.
Reviewed By: tomo
Reviewers: tomo, aran, jungejason, tuomaspelkonen
CC: anjali, aran, tomo
Differential Revision: 328
											
										 
											2011-05-22 08:49:07 -07:00
										 |  |  |     $comment_panel->addClass('aphront-panel-accent'); | 
					
						
							| 
									
										
										
											
												Improve drag-and-drop uploader
Summary:
Make it discoverable, show uploading progress, show file thumbnails, allow you
to remove files, make it a generic form component.
Test Plan:
Uploaded ducks
Reviewed By: tomo
Reviewers: aran, tomo, jungejason, tuomaspelkonen
CC: anjali, aran, epriestley, tomo
Differential Revision: 334
											
										 
											2011-05-22 16:11:41 -07:00
										 |  |  |     $comment_panel->setHeader('Weigh In'); | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-10 08:29:28 -07:00
										 |  |  |     $preview_panel = | 
					
						
							| 
									
										
										
											
												Tweak Maniphest CSS, fix remarkup in description change views
Summary:
Various CSS tweaks and fixes:
  - Add remarkup styling to description change views, missed this before.
  - Fix CSS so that transactions with only one item (e.g., changed priority)
don't have weird floater underneath them.
  - Add more space between transaction items.
  - Make default background color lighter and less heavy.
  - Use beigey color for comment form in Maniphest.
  - Share more CSS between Maniphest and Differential (previews, feedback).
  - Move "Leap Into Action" call to Differential, replace Maniphest with
thematically-consistent "Weigh In" (obviously, Maniphest has a nautical theme).
Test Plan:
Browsed Maniphest and Differential in a couple browsers, styling all seems
correct.
Reviewed By: tomo
Reviewers: tomo, aran, jungejason, tuomaspelkonen
CC: anjali, aran, tomo
Differential Revision: 328
											
										 
											2011-05-22 08:49:07 -07:00
										 |  |  |       '<div class="aphront-panel-preview"> | 
					
						
							| 
									
										
										
										
											2011-05-10 08:29:28 -07:00
										 |  |  |         <div id="transaction-preview"> | 
					
						
							| 
									
										
										
											
												Tweak Maniphest CSS, fix remarkup in description change views
Summary:
Various CSS tweaks and fixes:
  - Add remarkup styling to description change views, missed this before.
  - Fix CSS so that transactions with only one item (e.g., changed priority)
don't have weird floater underneath them.
  - Add more space between transaction items.
  - Make default background color lighter and less heavy.
  - Use beigey color for comment form in Maniphest.
  - Share more CSS between Maniphest and Differential (previews, feedback).
  - Move "Leap Into Action" call to Differential, replace Maniphest with
thematically-consistent "Weigh In" (obviously, Maniphest has a nautical theme).
Test Plan:
Browsed Maniphest and Differential in a couple browsers, styling all seems
correct.
Reviewed By: tomo
Reviewers: tomo, aran, jungejason, tuomaspelkonen
CC: anjali, aran, tomo
Differential Revision: 328
											
										 
											2011-05-22 08:49:07 -07:00
										 |  |  |           <div class="aphront-panel-preview-loading-text"> | 
					
						
							| 
									
										
										
										
											2011-05-10 08:29:28 -07:00
										 |  |  |             Loading preview... | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |         </div> | 
					
						
							|  |  |  |       </div>'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |     $transaction_view = new ManiphestTransactionListView(); | 
					
						
							|  |  |  |     $transaction_view->setTransactions($transactions); | 
					
						
							|  |  |  |     $transaction_view->setHandles($handles); | 
					
						
							|  |  |  |     $transaction_view->setUser($user); | 
					
						
							|  |  |  |     $transaction_view->setMarkupEngine($engine); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return $this->buildStandardPageResponse( | 
					
						
							|  |  |  |       array( | 
					
						
							| 
									
										
										
											
												Tweak style on "Create Another Task" button
Summary:
Not totally sure I'm in love with this but I think it's somewhat non-terrible,
despite the lack of lens flare.
Also made "Cancel" take you back to the task if you got to "Create" from "Create
Another Task".
Test Plan:
  - Style:
https://secure.phabricator.com/file/view/PHID-FILE-ad37d3c1f3b2c7a7a7d1/
  - Hit "Cancel" from "Create Another", got sent back to task.
  - Hit "Cancel" from normal create, got sent back to list.
  - Tried to save an invalid task after making changes to CC/Projects, changes
were preserved.
Reviewed By: codeblock
Reviewers: hunterbridges, jungejason, tuomaspelkonen, aran, codeblock
CC: aran, epriestley, codeblock
Differential Revision: 736
											
										 
											2011-07-27 10:46:22 -07:00
										 |  |  |         $context_bar, | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |         $panel, | 
					
						
							|  |  |  |         $transaction_view, | 
					
						
							|  |  |  |         $comment_panel, | 
					
						
							| 
									
										
										
										
											2011-05-10 08:29:28 -07:00
										 |  |  |         $preview_panel, | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |       ), | 
					
						
							|  |  |  |       array( | 
					
						
							| 
									
										
										
										
											2011-02-09 16:38:31 -08:00
										 |  |  |         'title' => 'T'.$task->getID().' '.$task->getTitle(), | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  |       )); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-02-18 22:15:28 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-08 10:53:59 -08:00
										 |  |  | } |