@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 event timeline feed should reflect invite changes better

Summary: Ref T7988, Calendar event timeline feed should better reflect invite changes.

Test Plan: Create or edit calendar event, invite or remove users, save, timeline feed should correctly reflect added/removed invitees.

Reviewers: epriestley, #blessed_reviewers

Reviewed By: epriestley, #blessed_reviewers

Subscribers: Korvin, epriestley

Maniphest Tasks: T7988

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

+87 -17
+87 -17
src/applications/calendar/storage/PhabricatorCalendarEventTransaction.php
··· 36 36 case self::TYPE_STATUS: 37 37 case self::TYPE_DESCRIPTION: 38 38 case self::TYPE_CANCEL: 39 + $phids[] = $this->getObjectPHID(); 40 + break; 39 41 case self::TYPE_INVITE: 40 - $phids[] = $this->getObjectPHID(); 42 + $new = $this->getNewValue(); 43 + foreach ($new as $phid => $status) { 44 + $phids[] = $phid; 45 + } 41 46 break; 42 47 } 43 48 ··· 96 101 $old, 97 102 $new); 98 103 } 99 - break; 100 104 case self::TYPE_START_DATE: 101 105 if ($old) { 102 106 return pht( ··· 119 123 $this->renderHandleLink($author_phid), 120 124 $old_name, 121 125 $new_name); 122 - break; 123 126 case self::TYPE_DESCRIPTION: 124 127 return pht( 125 128 "%s updated the event's description.", 126 129 $this->renderHandleLink($author_phid)); 127 - break; 128 130 case self::TYPE_CANCEL: 129 131 if ($new) { 130 132 return pht( 131 133 '%s cancelled this event.', 132 134 $this->renderHandleLink($author_phid)); 133 - break; 134 135 } else { 135 136 return pht( 136 137 '%s reinstated this event.', 137 138 $this->renderHandleLink($author_phid)); 138 - break; 139 139 } 140 140 case self::TYPE_INVITE: 141 - return pht( 142 - "%s updated the event's invitee list.", 143 - $this->renderHandleLink($author_phid)); 144 - break; 145 - } 141 + if (count($old) === 1 142 + && count($new) === 1 143 + && isset($old[$author_phid])) { 144 + // user joined/declined/accepted event themself 145 + $old_status = $old[$author_phid]; 146 + $new_status = $new[$author_phid]; 146 147 148 + if ($old_status !== $new_status) { 149 + switch ($new_status) { 150 + case PhabricatorCalendarEventInvitee::STATUS_INVITED: 151 + $text = pht( 152 + '%s has joined this event.', 153 + $this->renderHandleLink($author_phid)); 154 + break; 155 + case PhabricatorCalendarEventInvitee::STATUS_ATTENDING: 156 + $text = pht( 157 + '%s is attending this event.', 158 + $this->renderHandleLink($author_phid)); 159 + break; 160 + case PhabricatorCalendarEventInvitee::STATUS_DECLINED: 161 + case PhabricatorCalendarEventInvitee::STATUS_UNINVITED: 162 + $text = pht( 163 + '%s has declined this event.', 164 + $this->renderHandleLink($author_phid)); 165 + break; 166 + default: 167 + $text = pht( 168 + '%s has changed their status for this event.', 169 + $this->renderHandleLink($author_phid)); 170 + break; 171 + } 172 + } 173 + } else { 174 + // user changed status for many users 175 + $self_joined = null; 176 + $self_declined = null; 177 + $added = array(); 178 + $uninvited = array(); 179 + $text = null; 180 + 181 + foreach ($new as $phid => $status) { 182 + if ($status == PhabricatorCalendarEventInvitee::STATUS_INVITED 183 + || $status == PhabricatorCalendarEventInvitee::STATUS_ATTENDING) { 184 + // added users 185 + $added[] = $phid; 186 + } else if ( 187 + $status == PhabricatorCalendarEventInvitee::STATUS_DECLINED 188 + || $status == PhabricatorCalendarEventInvitee::STATUS_UNINVITED) { 189 + $uninvited[] = $phid; 190 + } 191 + } 192 + 193 + $count_added = count($added); 194 + $count_uninvited = count($uninvited); 195 + $added_text = null; 196 + $uninvited_text = null; 197 + 198 + if ($count_added > 0 && $count_uninvited == 0) { 199 + $added_text = $this->renderHandleList($added); 200 + $text = pht('%s invited: %s.', 201 + $this->renderHandleLink($author_phid), 202 + $added_text); 203 + } else if ($count_added > 0 && $count_uninvited > 0) { 204 + $added_text = $this->renderHandleList($added); 205 + $uninvited_text = $this->renderHandleList($uninvited); 206 + $text = pht('%s invited: %s and uninvited: %s', 207 + $this->renderHandleLink($author_phid), 208 + $added_text, 209 + $uninvited_text); 210 + } else if ($count_added == 0 && $count_uninvited > 0) { 211 + $uninvited_text = $this->renderHandleList($uninvited); 212 + $text = pht('%s uninvited: %s.', 213 + $this->renderHandleLink($author_phid), 214 + $uninvited_text); 215 + } else { 216 + $text = pht('%s updated the invitee list.', 217 + $this->renderHandleLink($author_phid)); 218 + } 219 + } 220 + return $text; 221 + break; 222 + } 147 223 return parent::getTitle(); 148 224 } 149 225 ··· 172 248 $old, 173 249 $new); 174 250 } 175 - break; 176 251 case self::TYPE_START_DATE: 177 252 if ($old) { 178 253 $old = phabricator_datetime($old, $viewer); ··· 206 281 $this->renderHandleLink($object_phid), 207 282 $old_name, 208 283 $new_name); 209 - break; 210 284 case self::TYPE_DESCRIPTION: 211 285 return pht( 212 286 '%s updated the description of %s.', 213 287 $this->renderHandleLink($author_phid), 214 288 $this->renderHandleLink($object_phid)); 215 - break; 216 289 case self::TYPE_CANCEL: 217 290 if ($new) { 218 291 return pht( 219 292 '%s cancelled %s.', 220 293 $this->renderHandleLink($author_phid), 221 294 $this->renderHandleLink($object_phid)); 222 - break; 223 295 } else { 224 296 return pht( 225 297 '%s reinstated %s.', 226 298 $this->renderHandleLink($author_phid), 227 299 $this->renderHandleLink($object_phid)); 228 - break; 229 300 } 230 301 case self::TYPE_INVITE: 231 302 return pht( 232 303 '%s updated the invitee list of %s.', 233 304 $this->renderHandleLink($author_phid), 234 305 $this->renderHandleLink($object_phid)); 235 - break; 236 306 } 237 307 238 308 return parent::getTitleForFeed();