@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Calendar events should now have a 'Name' field.

Summary: Closes T7953, Calendar events should now have a 'Name' field.

Test Plan: Create or edit event with no title, save event, should get error requiring name, event detail view timeline should reflect name changes.

Reviewers: epriestley, #blessed_reviewers

Reviewed By: epriestley, #blessed_reviewers

Subscribers: Korvin, epriestley

Maniphest Tasks: T7953

Differential Revision: https://secure.phabricator.com/D12591

+128 -58
+2
resources/sql/autopatches/20150428.calendar.1.name.sql
··· 1 + ALTER TABLE {$NAMESPACE}_calendar.calendar_event 2 + ADD name LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL;
+53 -56
src/applications/calendar/controller/PhabricatorCalendarEventEditController.php
··· 14 14 } 15 15 16 16 public function processRequest() { 17 - $request = $this->getRequest(); 18 - $user = $request->getUser(); 17 + $request = $this->getRequest(); 18 + $user = $request->getUser(); 19 + $error_name = true; 20 + $validation_exception = null; 21 + 19 22 20 23 $start_time = id(new AphrontFormDateControl()) 21 24 ->setUser($user) ··· 30 33 ->setInitialTime(AphrontFormDateControl::TIME_END_OF_DAY); 31 34 32 35 if ($this->isCreate()) { 33 - $status = PhabricatorCalendarEvent::initializeNewCalendarEvent($user); 36 + $event = PhabricatorCalendarEvent::initializeNewCalendarEvent($user); 34 37 $end_value = $end_time->readValueFromRequest($request); 35 38 $start_value = $start_time->readValueFromRequest($request); 36 39 $submit_label = pht('Create'); 37 - $filter = 'status/create/'; 40 + $filter = 'event/create/'; 38 41 $page_title = pht('Create Event'); 39 42 $redirect = 'created'; 40 43 } else { 41 - $status = id(new PhabricatorCalendarEventQuery()) 44 + $event = id(new PhabricatorCalendarEventQuery()) 42 45 ->setViewer($user) 43 46 ->withIDs(array($this->id)) 44 47 ->requireCapabilities( ··· 47 50 PhabricatorPolicyCapability::CAN_EDIT, 48 51 )) 49 52 ->executeOne(); 50 - if (!$status) { 53 + if (!$event) { 51 54 return new Aphront404Response(); 52 55 } 53 56 54 - $end_time->setValue($status->getDateTo()); 55 - $start_time->setValue($status->getDateFrom()); 57 + $end_time->setValue($event->getDateTo()); 58 + $start_time->setValue($event->getDateFrom()); 56 59 $submit_label = pht('Update'); 57 - $filter = 'event/edit/'.$status->getID().'/'; 60 + $filter = 'event/edit/'.$event->getID().'/'; 58 61 $page_title = pht('Update Event'); 59 62 $redirect = 'updated'; 60 63 } 61 64 62 65 $errors = array(); 63 66 if ($request->isFormPost()) { 64 - $xactions = array(); 65 - $type = $request->getInt('status'); 67 + $xactions = array(); 68 + $name = $request->getStr('name'); 69 + $type = $request->getInt('status'); 66 70 $start_value = $start_time->readValueFromRequest($request); 67 - $end_value = $end_time->readValueFromRequest($request); 71 + $end_value = $end_time->readValueFromRequest($request); 68 72 $description = $request->getStr('description'); 69 73 70 74 if ($start_time->getError()) { ··· 76 80 if (!$errors) { 77 81 $xactions[] = id(new PhabricatorCalendarEventTransaction()) 78 82 ->setTransactionType( 83 + PhabricatorCalendarEventTransaction::TYPE_NAME) 84 + ->setNewValue($name); 85 + 86 + $xactions[] = id(new PhabricatorCalendarEventTransaction()) 87 + ->setTransactionType( 79 88 PhabricatorCalendarEventTransaction::TYPE_START_DATE) 80 89 ->setNewValue($start_value); 81 90 ··· 99 108 ->setContentSourceFromRequest($request) 100 109 ->setContinueOnNoEffect(true); 101 110 102 - $xactions = $editor->applyTransactions($status, $xactions); 103 - return id(new AphrontRedirectResponse())->setURI('/E'.$status->getID()); 111 + try { 112 + $xactions = $editor->applyTransactions($event, $xactions); 113 + $response = id(new AphrontRedirectResponse()); 114 + return $response->setURI('/E'.$event->getID()); 115 + } catch (PhabricatorApplicationTransactionValidationException $ex) { 116 + $validation_exception = $ex; 117 + $error_name = $ex 118 + ->getShortMessage(PhabricatorCalendarEventTransaction::TYPE_NAME); 119 + } 104 120 } 105 121 } 106 122 ··· 111 127 ->setErrors($errors); 112 128 } 113 129 130 + $name = id(new AphrontFormTextControl()) 131 + ->setLabel(pht('Name')) 132 + ->setName('name') 133 + ->setValue($event->getName()) 134 + ->setError($error_name); 135 + 114 136 $status_select = id(new AphrontFormSelectControl()) 115 137 ->setLabel(pht('Status')) 116 138 ->setName('status') 117 - ->setValue($status->getStatus()) 118 - ->setOptions($status->getStatusOptions()); 139 + ->setValue($event->getStatus()) 140 + ->setOptions($event->getStatusOptions()); 119 141 120 142 $description = id(new AphrontFormTextAreaControl()) 121 143 ->setLabel(pht('Description')) 122 144 ->setName('description') 123 - ->setValue($status->getDescription()); 145 + ->setValue($event->getDescription()); 124 146 125 - if ($request->isAjax()) { 126 - $dialog = id(new AphrontDialogView()) 127 - ->setUser($user) 128 - ->setTitle($page_title) 129 - ->setWidth(AphrontDialogView::WIDTH_FORM); 130 - if ($this->isCreate()) { 131 - $dialog->setSubmitURI($this->getApplicationURI('event/create/')); 132 - } else { 133 - $dialog->setSubmitURI( 134 - $this->getApplicationURI('event/edit/'.$status->getID().'/')); 135 - } 136 - $form = new PHUIFormLayoutView(); 137 - if ($error_view) { 138 - $form->appendChild($error_view); 139 - } 140 - } else { 141 - $form = id(new AphrontFormView()) 142 - ->setUser($user); 143 - } 144 - 145 - $form 147 + $form = id(new AphrontFormView()) 148 + ->setUser($user) 149 + ->appendChild($name) 146 150 ->appendChild($status_select) 147 151 ->appendChild($start_time) 148 152 ->appendChild($end_time) 149 153 ->appendChild($description); 150 154 151 - if ($request->isAjax()) { 152 - $dialog->addSubmitButton($submit_label); 153 - $submit = $dialog; 154 - } else { 155 - $submit = id(new AphrontFormSubmitControl()) 156 - ->setValue($submit_label); 157 - } 155 + $submit = id(new AphrontFormSubmitControl()) 156 + ->setValue($submit_label); 158 157 if ($this->isCreate()) { 159 158 $submit->addCancelButton($this->getApplicationURI()); 160 159 } else { 161 - $submit->addCancelButton('/E'.$status->getID()); 160 + $submit->addCancelButton('/E'.$event->getID()); 162 161 } 163 162 164 - if ($request->isAjax()) { 165 - $dialog->appendChild($form); 166 - return id(new AphrontDialogResponse()) 167 - ->setDialog($dialog); 168 - } 169 163 $form->appendChild($submit); 170 164 171 - 172 - 173 165 $form_box = id(new PHUIObjectBoxView()) 174 166 ->setHeaderText($page_title) 175 167 ->setFormErrors($errors) 176 168 ->setForm($form); 177 169 178 - $nav = $this->buildSideNavView($status); 170 + $nav = $this->buildSideNavView($event); 179 171 $nav->selectFilter($filter); 180 172 181 173 $crumbs = $this->buildApplicationCrumbs(); 182 174 183 175 if (!$this->isCreate()) { 184 - $crumbs->addTextCrumb('E'.$status->getId(), '/E'.$status->getId()); 176 + $crumbs->addTextCrumb('E'.$event->getId(), '/E'.$event->getId()); 185 177 } 186 178 187 179 $crumbs->addTextCrumb($page_title); 188 180 181 + $object_box = id(new PHUIObjectBoxView()) 182 + ->setHeaderText($page_title) 183 + ->setValidationException($validation_exception) 184 + ->appendChild($form); 185 + 189 186 $nav->appendChild( 190 187 array( 191 188 $crumbs, 192 - $form_box, 189 + $object_box, 193 190 )); 194 191 195 192 return $this->buildApplicationPage(
+7 -2
src/applications/calendar/controller/PhabricatorCalendarEventViewController.php
··· 26 26 } 27 27 28 28 $title = 'E'.$event->getID(); 29 + $page_title = $title.' '.$event->getName(); 29 30 $crumbs = $this->buildApplicationCrumbs(); 30 31 $crumbs->addTextCrumb($title, '/E'.$event->getID()); 31 32 ··· 49 50 $timeline, 50 51 ), 51 52 array( 52 - 'title' => $title, 53 + 'title' => $page_title, 53 54 )); 54 55 } 55 56 ··· 58 59 59 60 return id(new PHUIHeaderView()) 60 61 ->setUser($viewer) 61 - ->setHeader($event->getTerseSummary($viewer)) 62 + ->setHeader($event->getName()) 62 63 ->setPolicyObject($event); 63 64 } 64 65 ··· 100 101 $properties = id(new PHUIPropertyListView()) 101 102 ->setUser($viewer) 102 103 ->setObject($event); 104 + 105 + // $properties->addProperty( 106 + // pht('Name'), 107 + // $event->getName()); 103 108 104 109 $properties->addProperty( 105 110 pht('Starts'),
+37
src/applications/calendar/editor/PhabricatorCalendarEventEditor.php
··· 14 14 public function getTransactionTypes() { 15 15 $types = parent::getTransactionTypes(); 16 16 17 + $types[] = PhabricatorCalendarEventTransaction::TYPE_NAME; 17 18 $types[] = PhabricatorCalendarEventTransaction::TYPE_START_DATE; 18 19 $types[] = PhabricatorCalendarEventTransaction::TYPE_END_DATE; 19 20 $types[] = PhabricatorCalendarEventTransaction::TYPE_STATUS; ··· 29 30 PhabricatorLiskDAO $object, 30 31 PhabricatorApplicationTransaction $xaction) { 31 32 switch ($xaction->getTransactionType()) { 33 + case PhabricatorCalendarEventTransaction::TYPE_NAME: 34 + return $object->getName(); 32 35 case PhabricatorCalendarEventTransaction::TYPE_START_DATE: 33 36 return $object->getDateFrom(); 34 37 case PhabricatorCalendarEventTransaction::TYPE_END_DATE: ··· 51 54 PhabricatorApplicationTransaction $xaction) { 52 55 53 56 switch ($xaction->getTransactionType()) { 57 + case PhabricatorCalendarEventTransaction::TYPE_NAME: 54 58 case PhabricatorCalendarEventTransaction::TYPE_START_DATE: 55 59 case PhabricatorCalendarEventTransaction::TYPE_END_DATE: 56 60 case PhabricatorCalendarEventTransaction::TYPE_DESCRIPTION: ··· 67 71 PhabricatorApplicationTransaction $xaction) { 68 72 69 73 switch ($xaction->getTransactionType()) { 74 + case PhabricatorCalendarEventTransaction::TYPE_NAME: 75 + $object->setName($xaction->getNewValue()); 76 + return; 70 77 case PhabricatorCalendarEventTransaction::TYPE_START_DATE: 71 78 $object->setDateFrom($xaction->getNewValue()); 72 79 return; ··· 93 100 PhabricatorApplicationTransaction $xaction) { 94 101 95 102 switch ($xaction->getTransactionType()) { 103 + case PhabricatorCalendarEventTransaction::TYPE_NAME: 96 104 case PhabricatorCalendarEventTransaction::TYPE_START_DATE: 97 105 case PhabricatorCalendarEventTransaction::TYPE_END_DATE: 98 106 case PhabricatorCalendarEventTransaction::TYPE_STATUS: ··· 104 112 } 105 113 106 114 return parent::applyCustomExternalTransaction($object, $xaction); 115 + } 116 + 117 + protected function validateTransaction( 118 + PhabricatorLiskDAO $object, 119 + $type, 120 + array $xactions) { 121 + 122 + $errors = parent::validateTransaction($object, $type, $xactions); 123 + 124 + switch ($type) { 125 + case PhabricatorCalendarEventTransaction::TYPE_NAME: 126 + $missing = $this->validateIsEmptyTextField( 127 + $object->getName(), 128 + $xactions); 129 + 130 + if ($missing) { 131 + $error = new PhabricatorApplicationTransactionValidationError( 132 + $type, 133 + pht('Required'), 134 + pht('Event name is required.'), 135 + nonempty(last($xactions), null)); 136 + 137 + $error->setIsMissingFieldError(true); 138 + $errors[] = $error; 139 + } 140 + break; 141 + } 142 + 143 + return $errors; 107 144 } 108 145 }
+2
src/applications/calendar/storage/PhabricatorCalendarEvent.php
··· 5 5 PhabricatorMarkupInterface, 6 6 PhabricatorApplicationTransactionInterface { 7 7 8 + protected $name; 8 9 protected $userPHID; 9 10 protected $dateFrom; 10 11 protected $dateTo; ··· 49 50 return array( 50 51 self::CONFIG_AUX_PHID => true, 51 52 self::CONFIG_COLUMN_SCHEMA => array( 53 + 'name' => 'text', 52 54 'dateFrom' => 'epoch', 53 55 'dateTo' => 'epoch', 54 56 'status' => 'uint32',
+27
src/applications/calendar/storage/PhabricatorCalendarEventTransaction.php
··· 3 3 final class PhabricatorCalendarEventTransaction 4 4 extends PhabricatorApplicationTransaction { 5 5 6 + const TYPE_NAME = 'calendar.name'; 6 7 const TYPE_START_DATE = 'calendar.startdate'; 7 8 const TYPE_END_DATE = 'calendar.enddate'; 8 9 const TYPE_STATUS = 'calendar.status'; ··· 27 28 $phids = parent::getRequiredHandlePHIDs(); 28 29 29 30 switch ($this->getTransactionType()) { 31 + case self::TYPE_NAME: 30 32 case self::TYPE_START_DATE: 31 33 case self::TYPE_END_DATE: 32 34 case self::TYPE_STATUS: ··· 41 43 public function shouldHide() { 42 44 $old = $this->getOldValue(); 43 45 switch ($this->getTransactionType()) { 46 + case self::TYPE_NAME: 44 47 case self::TYPE_START_DATE: 45 48 case self::TYPE_END_DATE: 46 49 case self::TYPE_STATUS: ··· 52 55 53 56 public function getIcon() { 54 57 switch ($this->getTransactionType()) { 58 + case self::TYPE_NAME: 55 59 case self::TYPE_START_DATE: 56 60 case self::TYPE_END_DATE: 57 61 case self::TYPE_STATUS: ··· 71 75 72 76 $type = $this->getTransactionType(); 73 77 switch ($type) { 78 + case self::TYPE_NAME: 79 + if ($old) { 80 + return pht( 81 + '%s changed the name of this event from %s to %s.', 82 + $this->renderHandleLink($author_phid), 83 + $old, 84 + $new); 85 + } 86 + break; 74 87 case self::TYPE_START_DATE: 75 88 if ($old) { 76 89 return pht( ··· 113 126 114 127 $type = $this->getTransactionType(); 115 128 switch ($type) { 129 + case self::TYPE_NAME: 130 + if ($old) { 131 + return pht( 132 + '%s changed the name of %s from %s to %s.', 133 + $this->renderHandleLink($author_phid), 134 + $this->renderHandleLink($object_phid), 135 + $old, 136 + $new); 137 + } 138 + break; 116 139 case self::TYPE_START_DATE: 117 140 if ($old) { 118 141 return pht( ··· 153 176 $new = $this->getNewValue(); 154 177 155 178 switch ($this->getTransactionType()) { 179 + case self::TYPE_NAME: 156 180 case self::TYPE_START_DATE: 157 181 case self::TYPE_END_DATE: 158 182 case self::TYPE_STATUS: ··· 191 215 public function getMailTags() { 192 216 $tags = array(); 193 217 switch ($this->getTransactionType()) { 218 + case self::TYPE_NAME: 219 + $tags[] = self::MAILTAG_CONTENT; 220 + break; 194 221 case self::TYPE_START_DATE: 195 222 $tags[] = self::MAILTAG_CONTENT; 196 223 break;