Skip to content

Commit

Permalink
fix(#122): Add first occurrence date to select dates only on demand
Browse files Browse the repository at this point in the history
  • Loading branch information
seandelaney committed Jul 22, 2022
1 parent ba95ac7 commit 6975795
Show file tree
Hide file tree
Showing 13 changed files with 131 additions and 63 deletions.
30 changes: 30 additions & 0 deletions packages/plugin/src/Controllers/EventsApiController.php
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,36 @@ public function actionDeleteOccurrence(): Response
return $this->asJson('success');
}

/**
* https://github.com/solspace/craft-calendar/issues/122.
*
* Adds the first occurrence date to the list of select dates
*
* @return Response
*/
public function actionFirstOccurrenceDate(): Response
{
$this->requirePostRequest();

$eventId = \Craft::$app->request->post('eventId');

$event = Calendar::getInstance()->events->getEventById($eventId, null, true);

if (! $event) {
return $this->asErrorJson([
'success' => false,
'event' => Calendar::t('Event could not be found'),
]);
}

$event->selectDates = Calendar::getInstance()->events->addFirstOccurrenceDate($event->selectDates);

return $this->asJson([
'success' => true,
'event' => $event,
]);
}

/**
* @throws HttpException
*/
Expand Down
61 changes: 5 additions & 56 deletions packages/plugin/src/Elements/Event.php
Original file line number Diff line number Diff line change
Expand Up @@ -475,13 +475,8 @@ public function getSelectDates(\DateTime $rangeStart = null, \DateTime $rangeEnd
}

if (null === $this->selectDates) {
$this->hydrateSelectDates();
$this->addOriginalEventToSelectDates($this->selectDates);
} else {
// Remove duplicates...
$this->removeOriginalEventFromSelectDates($this->selectDates);
$this->addOriginalEventToSelectDates($this->selectDates);
}
$this->hydrateSelectDates();
}

$cacheHash = md5(($rangeStart ? $rangeStart->getTimestamp() : 0).($rangeEnd ? $rangeEnd->getTimestamp() : 0));
if (!isset($this->selectDatesCache[$cacheHash])) {
Expand Down Expand Up @@ -528,14 +523,10 @@ public function setSelectDates(array $selectDates = []): self
/**
* @return \DateTime[]
*/
public function getSelectDatesAsDates(bool $includeOriginalEventStartDate = false, \DateTime $rangeStart = null, \DateTime $rangeEnd = null): array
public function getSelectDatesAsDates(\DateTime $rangeStart = null, \DateTime $rangeEnd = null): array
{
$models = $this->getSelectDates($rangeStart, $rangeEnd);

if (!$includeOriginalEventStartDate) {
$this->removeOriginalEventFromSelectDates($models);
}

$dates = [];
foreach ($models as $model) {
$dates[] = $model->date;
Expand Down Expand Up @@ -667,8 +658,7 @@ public function getOccurrenceDatesBetween(\DateTime $rangeStart = null, \DateTim
$occurrences[] = $startDate->setTime(0, 0, 0);
}

$includeOriginalEventStartDate = false;
$occurrences = array_merge($occurrences, $this->getSelectDatesAsDates($includeOriginalEventStartDate, $rangeStart, $rangeEnd));
$occurrences = array_merge($occurrences, $this->getSelectDatesAsDates($rangeStart, $rangeEnd));
} else {
$rrule = $this->getRRuleObject();
if (null !== $rrule) {
Expand Down Expand Up @@ -1057,9 +1047,7 @@ public function getOccurrences(array $config = null): array
if ($this->getRRuleObject()) {
$occurrenceDates = $this->getOccurrenceDatesBetween($rangeStart, $rangeEnd);
} elseif ($this->getSelectDates()) {
$includeOriginalEventStartDate = true;

$occurrenceDates = $this->getSelectDatesAsDates($includeOriginalEventStartDate, $rangeStart, $rangeEnd);
$occurrenceDates = $this->getSelectDatesAsDates($rangeStart, $rangeEnd);
}

$occurrences = [];
Expand Down Expand Up @@ -1355,45 +1343,6 @@ public function metaFieldsHtml(): string
]);
}

/**
* https://github.com/solspace/craft-calendar/issues/122.
*
* Adds original event date as an occurrence
*
* @return array
*/
public function addOriginalEventToSelectDates(array &$selectDates)
{
if (\array_key_exists(0, $selectDates) && !empty($selectDates[0]) && !empty($selectDates[0]->eventId)) {
$event = Calendar::getInstance()->events->getEventById($selectDates[0]->eventId);
if ($event) {
$originalEventDate = new SelectDateModel();
$originalEventDate->id = (int) $event->getId();
$originalEventDate->eventId = (int) $event->getId();
$originalEventDate->date = new Carbon($event->getStartDate(), DateHelper::UTC);

array_unshift($selectDates, $originalEventDate);
}
}
}

/**
* Removes original event date as an occurrence.
*
* @return array
*/
public function removeOriginalEventFromSelectDates(array &$selectDates)
{
if (\array_key_exists(0, $selectDates) && !empty($selectDates[0]) && !empty($selectDates[0]->eventId)) {
$event = Calendar::getInstance()->events->getEventById($selectDates[0]->eventId);

// Only remove if it matches the original event
if ($event && $event->getId() == $selectDates[0]->id && $event->getId() == $selectDates[0]->eventId && $event->getStartDate() == $selectDates[0]->date) {
array_shift($selectDates);
}
}
}

/**
* {@inheritDoc}
*/
Expand Down

Large diffs are not rendered by default.

Loading

0 comments on commit 6975795

Please sign in to comment.