@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.

T5464, ApplicationTransactions for calendar events

Summary: Closes T5464, Implement ApplicationTransactions in Calendar.

Test Plan: Create a calendar event, update calendar event, detail view of event should show update history.

Reviewers: epriestley, #blessed_reviewers

Reviewed By: epriestley, #blessed_reviewers

Subscribers: johnny-bit, Korvin, epriestley

Maniphest Tasks: T5464

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

+465 -39
+19
resources/sql/autopatches/20150427.calendar.1.xaction.sql
··· 1 + CREATE TABLE {$NAMESPACE}_calendar.calendar_eventtransaction ( 2 + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 3 + phid VARBINARY(64) NOT NULL, 4 + authorPHID VARBINARY(64) NOT NULL, 5 + objectPHID VARBINARY(64) NOT NULL, 6 + viewPolicy VARBINARY(64) NOT NULL, 7 + editPolicy VARBINARY(64) NOT NULL, 8 + commentPHID VARBINARY(64) DEFAULT NULL, 9 + commentVersion INT UNSIGNED NOT NULL, 10 + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, 11 + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, 12 + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, 13 + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, 14 + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, 15 + dateCreated INT UNSIGNED NOT NULL, 16 + dateModified INT UNSIGNED NOT NULL, 17 + UNIQUE KEY `key_phid` (`phid`), 18 + KEY `key_object` (`objectPHID`) 19 + ) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT};
+16
resources/sql/autopatches/20150427.calendar.2.xaction.sql
··· 1 + CREATE TABLE {$NAMESPACE}_calendar.calendar_eventtransaction_comment ( 2 + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 3 + phid VARBINARY(64) NOT NULL, 4 + transactionPHID VARBINARY(64) DEFAULT NULL, 5 + authorPHID VARBINARY(64) NOT NULL, 6 + viewPolicy VARBINARY(64) NOT NULL, 7 + editPolicy VARBINARY(64) NOT NULL, 8 + commentVersion INT UNSIGNED NOT NULL, 9 + content LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, 10 + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, 11 + isDeleted TINYINT(1) NOT NULL, 12 + dateCreated INT UNSIGNED NOT NULL, 13 + dateModified INT UNSIGNED NOT NULL, 14 + UNIQUE KEY `key_phid` (`phid`), 15 + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) 16 + ) ENGINE=InnoDB COLLATE {$COLLATE_TEXT}
+9
src/__phutil_library_map__.php
··· 1484 1484 'PhabricatorCalendarEvent' => 'applications/calendar/storage/PhabricatorCalendarEvent.php', 1485 1485 'PhabricatorCalendarEventDeleteController' => 'applications/calendar/controller/PhabricatorCalendarEventDeleteController.php', 1486 1486 'PhabricatorCalendarEventEditController' => 'applications/calendar/controller/PhabricatorCalendarEventEditController.php', 1487 + 'PhabricatorCalendarEventEditor' => 'applications/calendar/editor/PhabricatorCalendarEventEditor.php', 1487 1488 'PhabricatorCalendarEventInvalidEpochException' => 'applications/calendar/exception/PhabricatorCalendarEventInvalidEpochException.php', 1488 1489 'PhabricatorCalendarEventListController' => 'applications/calendar/controller/PhabricatorCalendarEventListController.php', 1489 1490 'PhabricatorCalendarEventPHIDType' => 'applications/calendar/phid/PhabricatorCalendarEventPHIDType.php', 1490 1491 'PhabricatorCalendarEventQuery' => 'applications/calendar/query/PhabricatorCalendarEventQuery.php', 1491 1492 'PhabricatorCalendarEventSearchEngine' => 'applications/calendar/query/PhabricatorCalendarEventSearchEngine.php', 1493 + 'PhabricatorCalendarEventTransaction' => 'applications/calendar/storage/PhabricatorCalendarEventTransaction.php', 1494 + 'PhabricatorCalendarEventTransactionComment' => 'applications/calendar/storage/PhabricatorCalendarEventTransactionComment.php', 1495 + 'PhabricatorCalendarEventTransactionQuery' => 'applications/calendar/query/PhabricatorCalendarEventTransactionQuery.php', 1492 1496 'PhabricatorCalendarEventViewController' => 'applications/calendar/controller/PhabricatorCalendarEventViewController.php', 1493 1497 'PhabricatorCalendarHoliday' => 'applications/calendar/storage/PhabricatorCalendarHoliday.php', 1494 1498 'PhabricatorCalendarHolidayTestCase' => 'applications/calendar/storage/__tests__/PhabricatorCalendarHolidayTestCase.php', ··· 4802 4806 'PhabricatorCalendarDAO', 4803 4807 'PhabricatorPolicyInterface', 4804 4808 'PhabricatorMarkupInterface', 4809 + 'PhabricatorApplicationTransactionInterface', 4805 4810 ), 4806 4811 'PhabricatorCalendarEventDeleteController' => 'PhabricatorCalendarController', 4807 4812 'PhabricatorCalendarEventEditController' => 'PhabricatorCalendarController', 4813 + 'PhabricatorCalendarEventEditor' => 'PhabricatorApplicationTransactionEditor', 4808 4814 'PhabricatorCalendarEventInvalidEpochException' => 'Exception', 4809 4815 'PhabricatorCalendarEventListController' => 'PhabricatorCalendarController', 4810 4816 'PhabricatorCalendarEventPHIDType' => 'PhabricatorPHIDType', 4811 4817 'PhabricatorCalendarEventQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 4812 4818 'PhabricatorCalendarEventSearchEngine' => 'PhabricatorApplicationSearchEngine', 4819 + 'PhabricatorCalendarEventTransaction' => 'PhabricatorApplicationTransaction', 4820 + 'PhabricatorCalendarEventTransactionComment' => 'PhabricatorApplicationTransactionComment', 4821 + 'PhabricatorCalendarEventTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 4813 4822 'PhabricatorCalendarEventViewController' => 'PhabricatorCalendarController', 4814 4823 'PhabricatorCalendarHoliday' => 'PhabricatorCalendarDAO', 4815 4824 'PhabricatorCalendarHolidayTestCase' => 'PhabricatorTestCase',
+33 -38
src/applications/calendar/controller/PhabricatorCalendarEventEditController.php
··· 30 30 ->setInitialTime(AphrontFormDateControl::TIME_END_OF_DAY); 31 31 32 32 if ($this->isCreate()) { 33 - $status = new PhabricatorCalendarEvent(); 34 - $end_value = $end_time->readValueFromRequest($request); 35 - $start_value = $start_time->readValueFromRequest($request); 33 + $status = PhabricatorCalendarEvent::initializeNewCalendarEvent($user); 34 + $end_value = $end_time->readValueFromRequest($request); 35 + $start_value = $start_time->readValueFromRequest($request); 36 36 $submit_label = pht('Create'); 37 - $filter = 'status/create/'; 38 - $page_title = pht('Create Event'); 39 - $redirect = 'created'; 37 + $filter = 'status/create/'; 38 + $page_title = pht('Create Event'); 39 + $redirect = 'created'; 40 40 } else { 41 41 $status = id(new PhabricatorCalendarEventQuery()) 42 42 ->setViewer($user) ··· 61 61 62 62 $errors = array(); 63 63 if ($request->isFormPost()) { 64 + $xactions = array(); 64 65 $type = $request->getInt('status'); 65 66 $start_value = $start_time->readValueFromRequest($request); 66 67 $end_value = $end_time->readValueFromRequest($request); ··· 73 74 $errors[] = pht('Invalid end time; reset to default.'); 74 75 } 75 76 if (!$errors) { 76 - try { 77 - $status 78 - ->setUserPHID($user->getPHID()) 79 - ->setStatus($type) 80 - ->setDateFrom($start_value) 81 - ->setDateTo($end_value) 82 - ->setDescription($description) 83 - ->save(); 84 - } catch (PhabricatorCalendarEventInvalidEpochException $e) { 85 - $errors[] = pht('Start must be before end.'); 86 - } 87 - } 77 + $xactions[] = id(new PhabricatorCalendarEventTransaction()) 78 + ->setTransactionType( 79 + PhabricatorCalendarEventTransaction::TYPE_START_DATE) 80 + ->setNewValue($start_value); 81 + 82 + $xactions[] = id(new PhabricatorCalendarEventTransaction()) 83 + ->setTransactionType( 84 + PhabricatorCalendarEventTransaction::TYPE_END_DATE) 85 + ->setNewValue($end_value); 86 + 87 + $xactions[] = id(new PhabricatorCalendarEventTransaction()) 88 + ->setTransactionType( 89 + PhabricatorCalendarEventTransaction::TYPE_STATUS) 90 + ->setNewValue($type); 91 + 92 + $xactions[] = id(new PhabricatorCalendarEventTransaction()) 93 + ->setTransactionType( 94 + PhabricatorCalendarEventTransaction::TYPE_DESCRIPTION) 95 + ->setNewValue($description); 96 + 97 + $editor = id(new PhabricatorCalendarEventEditor()) 98 + ->setActor($user) 99 + ->setContentSourceFromRequest($request) 100 + ->setContinueOnNoEffect(true); 88 101 89 - if (!$errors) { 90 - $uri = new PhutilURI($this->getApplicationURI()); 91 - $uri->setQueryParams( 92 - array( 93 - 'month' => phabricator_format_local_time($status->getDateFrom(), 94 - $user, 95 - 'm'), 96 - 'year' => phabricator_format_local_time($status->getDateFrom(), 97 - $user, 98 - 'Y'), 99 - $redirect => true, 100 - )); 101 - if ($request->isAjax()) { 102 - $response = id(new AphrontAjaxResponse()) 103 - ->setContent(array('redirect_uri' => $uri)); 104 - } else { 105 - $response = id(new AphrontRedirectResponse()) 106 - ->setURI($uri); 107 - } 108 - return $response; 102 + $xactions = $editor->applyTransactions($status, $xactions); 103 + return id(new AphrontRedirectResponse())->setURI('/E'.$status->getID()); 109 104 } 110 105 } 111 106
+5
src/applications/calendar/controller/PhabricatorCalendarEventViewController.php
··· 29 29 $crumbs = $this->buildApplicationCrumbs(); 30 30 $crumbs->addTextCrumb($title, '/E'.$event->getID()); 31 31 32 + $timeline = $this->buildTransactionTimeline( 33 + $event, 34 + new PhabricatorCalendarEventTransactionQuery()); 35 + 32 36 $header = $this->buildHeaderView($event); 33 37 $actions = $this->buildActionView($event); 34 38 $properties = $this->buildPropertyView($event); ··· 42 46 array( 43 47 $crumbs, 44 48 $box, 49 + $timeline, 45 50 ), 46 51 array( 47 52 'title' => $title,
+108
src/applications/calendar/editor/PhabricatorCalendarEventEditor.php
··· 1 + <?php 2 + 3 + final class PhabricatorCalendarEventEditor 4 + extends PhabricatorApplicationTransactionEditor { 5 + 6 + public function getEditorApplicationClass() { 7 + return 'PhabricatorCalendarApplication'; 8 + } 9 + 10 + public function getEditorObjectsDescription() { 11 + return pht('Calendar'); 12 + } 13 + 14 + public function getTransactionTypes() { 15 + $types = parent::getTransactionTypes(); 16 + 17 + $types[] = PhabricatorCalendarEventTransaction::TYPE_START_DATE; 18 + $types[] = PhabricatorCalendarEventTransaction::TYPE_END_DATE; 19 + $types[] = PhabricatorCalendarEventTransaction::TYPE_STATUS; 20 + $types[] = PhabricatorCalendarEventTransaction::TYPE_DESCRIPTION; 21 + 22 + $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; 23 + $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; 24 + 25 + return $types; 26 + } 27 + 28 + protected function getCustomTransactionOldValue( 29 + PhabricatorLiskDAO $object, 30 + PhabricatorApplicationTransaction $xaction) { 31 + switch ($xaction->getTransactionType()) { 32 + case PhabricatorCalendarEventTransaction::TYPE_START_DATE: 33 + return $object->getDateFrom(); 34 + case PhabricatorCalendarEventTransaction::TYPE_END_DATE: 35 + return $object->getDateTo(); 36 + case PhabricatorCalendarEventTransaction::TYPE_STATUS: 37 + $status = $object->getStatus(); 38 + if ($status === null) { 39 + return null; 40 + } 41 + return (int)$status; 42 + case PhabricatorCalendarEventTransaction::TYPE_DESCRIPTION: 43 + return $object->getDescription(); 44 + } 45 + 46 + return parent::getCustomTransactionOldValue($object, $xaction); 47 + } 48 + 49 + protected function getCustomTransactionNewValue( 50 + PhabricatorLiskDAO $object, 51 + PhabricatorApplicationTransaction $xaction) { 52 + 53 + switch ($xaction->getTransactionType()) { 54 + case PhabricatorCalendarEventTransaction::TYPE_START_DATE: 55 + case PhabricatorCalendarEventTransaction::TYPE_END_DATE: 56 + case PhabricatorCalendarEventTransaction::TYPE_DESCRIPTION: 57 + return $xaction->getNewValue(); 58 + case PhabricatorCalendarEventTransaction::TYPE_STATUS: 59 + return (int)$xaction->getNewValue(); 60 + } 61 + 62 + return parent::getCustomTransactionNewValue($object, $xaction); 63 + } 64 + 65 + protected function applyCustomInternalTransaction( 66 + PhabricatorLiskDAO $object, 67 + PhabricatorApplicationTransaction $xaction) { 68 + 69 + switch ($xaction->getTransactionType()) { 70 + case PhabricatorCalendarEventTransaction::TYPE_START_DATE: 71 + $object->setDateFrom($xaction->getNewValue()); 72 + return; 73 + case PhabricatorCalendarEventTransaction::TYPE_END_DATE: 74 + $object->setDateTo($xaction->getNewValue()); 75 + return; 76 + case PhabricatorCalendarEventTransaction::TYPE_STATUS: 77 + $object->setStatus($xaction->getNewValue()); 78 + return; 79 + case PhabricatorCalendarEventTransaction::TYPE_DESCRIPTION: 80 + $object->setDescription($xaction->getNewValue()); 81 + return; 82 + case PhabricatorTransactions::TYPE_VIEW_POLICY: 83 + case PhabricatorTransactions::TYPE_EDIT_POLICY: 84 + case PhabricatorTransactions::TYPE_EDGE: 85 + return; 86 + } 87 + 88 + return parent::applyCustomInternalTransaction($object, $xaction); 89 + } 90 + 91 + protected function applyCustomExternalTransaction( 92 + PhabricatorLiskDAO $object, 93 + PhabricatorApplicationTransaction $xaction) { 94 + 95 + switch ($xaction->getTransactionType()) { 96 + case PhabricatorCalendarEventTransaction::TYPE_START_DATE: 97 + case PhabricatorCalendarEventTransaction::TYPE_END_DATE: 98 + case PhabricatorCalendarEventTransaction::TYPE_STATUS: 99 + case PhabricatorCalendarEventTransaction::TYPE_DESCRIPTION: 100 + case PhabricatorTransactions::TYPE_VIEW_POLICY: 101 + case PhabricatorTransactions::TYPE_EDIT_POLICY: 102 + case PhabricatorTransactions::TYPE_EDGE: 103 + return; 104 + } 105 + 106 + return parent::applyCustomExternalTransaction($object, $xaction); 107 + } 108 + }
+10
src/applications/calendar/query/PhabricatorCalendarEventTransactionQuery.php
··· 1 + <?php 2 + 3 + final class PhabricatorCalendarEventTransactionQuery 4 + extends PhabricatorApplicationTransactionQuery { 5 + 6 + public function getTemplateApplicationTransaction() { 7 + return new PhabricatorCalendarEventTransaction(); 8 + } 9 + 10 + }
+45 -1
src/applications/calendar/storage/PhabricatorCalendarEvent.php
··· 2 2 3 3 final class PhabricatorCalendarEvent extends PhabricatorCalendarDAO 4 4 implements PhabricatorPolicyInterface, 5 - PhabricatorMarkupInterface { 5 + PhabricatorMarkupInterface, 6 + PhabricatorApplicationTransactionInterface { 6 7 7 8 protected $userPHID; 8 9 protected $dateFrom; ··· 12 13 13 14 const STATUS_AWAY = 1; 14 15 const STATUS_SPORADIC = 2; 16 + 17 + public static function initializeNewCalendarEvent(PhabricatorUser $actor) { 18 + $app = id(new PhabricatorApplicationQuery()) 19 + ->setViewer($actor) 20 + ->withClasses(array('PhabricatorCalendarApplication')) 21 + ->executeOne(); 22 + 23 + return id(new PhabricatorCalendarEvent()) 24 + ->setUserPHID($actor->getPHID()); 25 + } 15 26 16 27 private static $statusTexts = array( 17 28 self::STATUS_AWAY => 'away', ··· 86 97 return mpull($statuses, null, 'getUserPHID'); 87 98 } 88 99 100 + public static function getNameForStatus($value) { 101 + switch ($value) { 102 + case self::STATUS_AWAY: 103 + return pht('Away'); 104 + case self::STATUS_SPORADIC: 105 + return pht('Sporadic'); 106 + default: 107 + return pht('Unknown'); 108 + } 109 + } 110 + 89 111 /** 90 112 * Validates data and throws exceptions for non-sensical status 91 113 * windows ··· 171 193 172 194 public function describeAutomaticCapability($capability) { 173 195 return null; 196 + } 197 + 198 + /* -( PhabricatorApplicationTransactionInterface )------------------------- */ 199 + 200 + 201 + public function getApplicationTransactionEditor() { 202 + return new PhabricatorCalendarEventEditor(); 203 + } 204 + 205 + public function getApplicationTransactionObject() { 206 + return $this; 207 + } 208 + 209 + public function getApplicationTransactionTemplate() { 210 + return new PhabricatorCalendarEventTransaction(); 211 + } 212 + 213 + public function willRenderTimeline( 214 + PhabricatorApplicationTransactionView $timeline, 215 + AphrontRequest $request) { 216 + 217 + return $timeline; 174 218 } 175 219 176 220 }
+210
src/applications/calendar/storage/PhabricatorCalendarEventTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorCalendarEventTransaction 4 + extends PhabricatorApplicationTransaction { 5 + 6 + const TYPE_START_DATE = 'calendar.startdate'; 7 + const TYPE_END_DATE = 'calendar.enddate'; 8 + const TYPE_STATUS = 'calendar.status'; 9 + const TYPE_DESCRIPTION = 'calendar.description'; 10 + 11 + const MAILTAG_CONTENT = 'calendar-content'; 12 + const MAILTAG_OTHER = 'calendar-other'; 13 + 14 + public function getApplicationName() { 15 + return 'calendar'; 16 + } 17 + 18 + public function getApplicationTransactionType() { 19 + return PhabricatorCalendarEventPHIDType::TYPECONST; 20 + } 21 + 22 + public function getApplicationTransactionCommentObject() { 23 + return new PhabricatorCalendarEventTransactionComment(); 24 + } 25 + 26 + public function getRequiredHandlePHIDs() { 27 + $phids = parent::getRequiredHandlePHIDs(); 28 + 29 + switch ($this->getTransactionType()) { 30 + case self::TYPE_START_DATE: 31 + case self::TYPE_END_DATE: 32 + case self::TYPE_STATUS: 33 + case self::TYPE_DESCRIPTION: 34 + $phids[] = $this->getObjectPHID(); 35 + break; 36 + } 37 + 38 + return $phids; 39 + } 40 + 41 + public function shouldHide() { 42 + $old = $this->getOldValue(); 43 + switch ($this->getTransactionType()) { 44 + case self::TYPE_START_DATE: 45 + case self::TYPE_END_DATE: 46 + case self::TYPE_STATUS: 47 + case self::TYPE_DESCRIPTION: 48 + return ($old === null); 49 + } 50 + return parent::shouldHide(); 51 + } 52 + 53 + public function getIcon() { 54 + switch ($this->getTransactionType()) { 55 + case self::TYPE_START_DATE: 56 + case self::TYPE_END_DATE: 57 + case self::TYPE_STATUS: 58 + case self::TYPE_DESCRIPTION: 59 + return 'fa-pencil'; 60 + break; 61 + } 62 + return parent::getIcon(); 63 + } 64 + 65 + public function getTitle() { 66 + $author_phid = $this->getAuthorPHID(); 67 + $object_phid = $this->getObjectPHID(); 68 + 69 + $old = $this->getOldValue(); 70 + $new = $this->getNewValue(); 71 + 72 + $type = $this->getTransactionType(); 73 + switch ($type) { 74 + case self::TYPE_START_DATE: 75 + if ($old) { 76 + return pht( 77 + '%s edited the start date of this event.', 78 + $this->renderHandleLink($author_phid)); 79 + } 80 + break; 81 + case self::TYPE_END_DATE: 82 + if ($old) { 83 + return pht( 84 + '%s edited the end date of this event.', 85 + $this->renderHandleLink($author_phid)); 86 + } 87 + break; 88 + case self::TYPE_STATUS: 89 + $old_name = PhabricatorCalendarEvent::getNameForStatus($old); 90 + $new_name = PhabricatorCalendarEvent::getNameForStatus($new); 91 + return pht( 92 + '%s updated the event status from %s to %s.', 93 + $this->renderHandleLink($author_phid), 94 + $old_name, 95 + $new_name); 96 + break; 97 + case self::TYPE_DESCRIPTION: 98 + return pht( 99 + "%s updated the event's description.", 100 + $this->renderHandleLink($author_phid)); 101 + break; 102 + } 103 + 104 + return parent::getTitle(); 105 + } 106 + 107 + public function getTitleForFeed() { 108 + $author_phid = $this->getAuthorPHID(); 109 + $object_phid = $this->getObjectPHID(); 110 + 111 + $old = $this->getOldValue(); 112 + $new = $this->getNewValue(); 113 + 114 + $type = $this->getTransactionType(); 115 + switch ($type) { 116 + case self::TYPE_START_DATE: 117 + if ($old) { 118 + return pht( 119 + '%s edited the start date of this event from %s to %s.', 120 + $this->renderHandleLink($author_phid), 121 + $old, 122 + $new); 123 + } 124 + break; 125 + case self::TYPE_END_DATE: 126 + if ($old) { 127 + return pht( 128 + '%s edited the end date of this event from %s to %s.', 129 + $this->renderHandleLink($author_phid), 130 + $old, 131 + $new); 132 + } 133 + break; 134 + case self::TYPE_STATUS: 135 + return pht( 136 + '%s updated the event status from %s to %s.', 137 + $this->renderHandleLink($author_phid), 138 + $old, 139 + $new); 140 + break; 141 + case self::TYPE_DESCRIPTION: 142 + return pht( 143 + "%s updated the event's description.", 144 + $this->renderHandleLink($author_phid)); 145 + break; 146 + } 147 + 148 + return parent::getTitleForFeed(); 149 + } 150 + 151 + public function getColor() { 152 + $old = $this->getOldValue(); 153 + $new = $this->getNewValue(); 154 + 155 + switch ($this->getTransactionType()) { 156 + case self::TYPE_START_DATE: 157 + case self::TYPE_END_DATE: 158 + case self::TYPE_STATUS: 159 + case self::TYPE_DESCRIPTION: 160 + return PhabricatorTransactions::COLOR_GREEN; 161 + } 162 + 163 + return parent::getColor(); 164 + } 165 + 166 + 167 + public function hasChangeDetails() { 168 + switch ($this->getTransactionType()) { 169 + case self::TYPE_DESCRIPTION: 170 + return ($this->getOldValue() !== null); 171 + } 172 + 173 + return parent::hasChangeDetails(); 174 + } 175 + 176 + public function renderChangeDetails(PhabricatorUser $viewer) { 177 + switch ($this->getTransactionType()) { 178 + case self::TYPE_DESCRIPTION: 179 + $old = $this->getOldValue(); 180 + $new = $this->getNewValue(); 181 + 182 + return $this->renderTextCorpusChangeDetails( 183 + $viewer, 184 + $old, 185 + $new); 186 + } 187 + 188 + return parent::renderChangeDetails($viewer); 189 + } 190 + 191 + public function getMailTags() { 192 + $tags = array(); 193 + switch ($this->getTransactionType()) { 194 + case self::TYPE_START_DATE: 195 + $tags[] = self::MAILTAG_CONTENT; 196 + break; 197 + case self::TYPE_END_DATE: 198 + $tags[] = self::MAILTAG_CONTENT; 199 + break; 200 + case self::TYPE_STATUS: 201 + $tags[] = self::MAILTAG_OTHER; 202 + break; 203 + case self::TYPE_DESCRIPTION: 204 + $tags[] = self::MAILTAG_CONTENT; 205 + break; 206 + } 207 + return $tags; 208 + } 209 + 210 + }
+10
src/applications/calendar/storage/PhabricatorCalendarEventTransactionComment.php
··· 1 + <?php 2 + 3 + final class PhabricatorCalendarEventTransactionComment 4 + extends PhabricatorApplicationTransactionComment { 5 + 6 + public function getApplicationTransactionObject() { 7 + return new PhabricatorCalendarEventTransaction(); 8 + } 9 + 10 + }