mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-23 15:22:41 +01:00
Ignore Calendar date edits which just change the internal date timezone without rescheduling it
Summary: Ref T11816. Currently, if someone in California creates an event and then someone in New York edits it, we generate a no-op "<user> changed the start time from 3PM to 3PM." transaction. This is because the internal timezone of the event is changing, but the actual absolute time is not. Instead, when an edit wouldn't reschedule an event and would only change the internal timezone, ignore the edit. Test Plan: - Edited non-all-day events in PST / EST with out making changes (ignored). - Edited non-all-day events in PST / EST with changes (changes worked). - Performed the same edits with all-day events, which also were ignored and worked, respectively. - Pulled events in and out of all-day mode in different timezones, behavior seemeed reasonable. Reviewers: chad Reviewed By: chad Maniphest Tasks: T11816 Differential Revision: https://secure.phabricator.com/D16955
This commit is contained in:
parent
ab3b707396
commit
22a566f732
3 changed files with 42 additions and 0 deletions
|
@ -22,6 +22,35 @@ abstract class PhabricatorCalendarEventDateTransaction
|
||||||
->toDictionary();
|
->toDictionary();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getTransactionHasEffect($object, $old, $new) {
|
||||||
|
$editor = $this->getEditor();
|
||||||
|
|
||||||
|
$actor = $this->getActor();
|
||||||
|
$actor_timezone = $actor->getTimezoneIdentifier();
|
||||||
|
|
||||||
|
// When an edit only changes the timezone of an event without materially
|
||||||
|
// changing the absolute time, discard it. This can happen if two users in
|
||||||
|
// different timezones edit an event without rescheduling it.
|
||||||
|
|
||||||
|
// Eventually, after T11073, there may be a UI control to adjust timezones.
|
||||||
|
// If a user explicitly changed the timezone, we should respect that.
|
||||||
|
// However, there is no way for users to intentionally apply this kind of
|
||||||
|
// edit today.
|
||||||
|
|
||||||
|
$old_datetime = PhutilCalendarAbsoluteDateTime::newFromDictionary($old)
|
||||||
|
->setIsAllDay($editor->getNewIsAllDay())
|
||||||
|
->setViewerTimezone($actor_timezone);
|
||||||
|
|
||||||
|
$new_datetime = PhutilCalendarAbsoluteDateTime::newFromDictionary($new)
|
||||||
|
->setIsAllDay($editor->getNewIsAllDay())
|
||||||
|
->setViewerTimezone($actor_timezone);
|
||||||
|
|
||||||
|
$old_epoch = $old_datetime->getEpoch();
|
||||||
|
$new_epoch = $new_datetime->getEpoch();
|
||||||
|
|
||||||
|
return ($old_epoch !== $new_epoch);
|
||||||
|
}
|
||||||
|
|
||||||
public function validateTransactions($object, array $xactions) {
|
public function validateTransactions($object, array $xactions) {
|
||||||
$errors = array();
|
$errors = array();
|
||||||
|
|
||||||
|
|
|
@ -502,6 +502,15 @@ abstract class PhabricatorApplicationTransactionEditor
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$type = $xaction->getTransactionType();
|
||||||
|
$xtype = $this->getModularTransactionType($type);
|
||||||
|
if ($xtype) {
|
||||||
|
return $xtype->getTransactionHasEffect(
|
||||||
|
$object,
|
||||||
|
$xaction->getOldValue(),
|
||||||
|
$xaction->getNewValue());
|
||||||
|
}
|
||||||
|
|
||||||
return ($xaction->getOldValue() !== $xaction->getNewValue());
|
return ($xaction->getOldValue() !== $xaction->getNewValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,10 @@ abstract class PhabricatorModularTransactionType
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getTransactionHasEffect($object, $old, $new) {
|
||||||
|
return ($old !== $new);
|
||||||
|
}
|
||||||
|
|
||||||
public function extractFilePHIDs($object, $value) {
|
public function extractFilePHIDs($object, $value) {
|
||||||
return array();
|
return array();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue