Skip to content

Commit

Permalink
Merge pull request #1149 from Zoldiru/feat/recurrent-date-field
Browse files Browse the repository at this point in the history
Feat/recurrent date field
  • Loading branch information
mrflos authored May 16, 2024
2 parents f4faf9a + b8e26f6 commit 694bb14
Show file tree
Hide file tree
Showing 16 changed files with 1,906 additions and 53 deletions.
3 changes: 3 additions & 0 deletions tools/bazar/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,9 @@ services:

YesWiki\Bazar\Service\:
resource: 'services/*'
YesWiki\Bazar\Service\DateService:
tags:
- { name: yeswiki.event_subscriber }

# Allows to use controllers as services
YesWiki\Bazar\Controller\:
Expand Down
59 changes: 51 additions & 8 deletions tools/bazar/fields/DateField.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

namespace YesWiki\Bazar\Field;

use YesWiki\Core\Service\DateService;
use YesWiki\Bazar\Service\DateService;
use YesWiki\Core\Service\DateService as CoreDateService;

/**
* @Field({"jour", "listedatedeb", "listedatefin"})
Expand All @@ -19,7 +20,7 @@ protected function renderInput($entry)

if (!empty($value)) {
// Default value when entry exist
$day = $this->getService(DateService::class)->getDateTimeWithRightTimeZone($value)->format('Y-m-d H:i');
$day = $this->getService(CoreDateService::class)->getDateTimeWithRightTimeZone($value)->format('Y-m-d H:i');
$hasTime = (strlen($value) > 10);
if ($hasTime) {
$result = explode(' ', $day);
Expand All @@ -43,19 +44,47 @@ protected function renderInput($entry)
'hour' => $hour,
'minute' => $minute,
'hasTime' => $hasTime,
'value' => $value
'value' => $value,
'data' => $entry["{$this->getPropertyName()}_data"] ?? [],
'canRegisterMultipleEntries' => $this->getService(DateService::class)->canRegisterMultipleEntries($entry)
]);
}

public function formatValuesBeforeSave($entry)
{
$return = [];
if ($this->getPropertyname() === 'bf_date_fin_evenement') {
if(!empty($entry['id_fiche'])
&& is_string($entry['id_fiche'])) {
$this->getService(DateService::class)->followId($entry['id_fiche']);
}
if (!$this->getService(DateService::class)->canRegisterMultipleEntries($entry)) {
// clean data from entry because not possible to create repetition
if (isset($entry['bf_date_fin_evenement_data'])) {
unset($entry['bf_date_fin_evenement_data']);
}
} elseif (!empty($entry['bf_date_fin_evenement_data']['other'])) {
unset($entry['bf_date_fin_evenement_data']['other']);
if (!empty($entry['bf_date_fin_evenement_data'])) {
$return['bf_date_fin_evenement_data'] = $entry['bf_date_fin_evenement_data'];
}
}
}
$value = $this->getValue($entry);
if (!empty($value) && isset($entry[$this->propertyName . '_allday']) && $entry[$this->propertyName . '_allday'] == 0
&& isset($entry[$this->propertyName . '_hour']) && isset($entry[$this->propertyName . '_minutes'])) {
$value = $this->getService(DateService::class)->getDateTimeWithRightTimeZone("$value {$entry[$this->propertyName . '_hour']}:{$entry[$this->propertyName . '_minutes']}")->format('c');
$value = $this->getService(CoreDateService::class)->getDateTimeWithRightTimeZone("$value {$entry[$this->propertyName . '_hour']}:{$entry[$this->propertyName . '_minutes']}")->format('c');
}
return [$this->propertyName => $value,
'fields-to-remove' => [$this->propertyName . '_allday',$this->propertyName . '_hour',$this->propertyName . '_minutes']];
$return[$this->propertyName] = $value;
$return['fields-to-remove'] = [
$this->propertyName . '_allday',
$this->propertyName . '_hour',
$this->propertyName . '_minutes'
];
if (empty($entry['bf_date_fin_evenement_data'])) {
$return['fields-to-remove'][] = 'bf_date_fin_evenement_data';
}
return $return;
}

protected function renderStatic($entry)
Expand All @@ -66,13 +95,27 @@ protected function renderStatic($entry)
}

if (strlen($value) > 10) {
$value = $this->getService(DateService::class)->getDateTimeWithRightTimeZone($value)->format('d.m.Y - H:i');
$value = $this->getService(CoreDateService::class)->getDateTimeWithRightTimeZone($value)->format('d.m.Y - H:i');
} else {
$value = date('d.m.Y', strtotime($value));
}

$matches = [];
$recurrenceBaseId = '';
$data = [];
if ($this->getPropertyname() === 'bf_date_fin_evenement'
&& !empty($entry['bf_date_fin_evenement_data'])) {
if(is_string($entry['bf_date_fin_evenement_data'])
&& preg_match('/\{\\"recurrentParentId\\":\\"([^"]+)\\"\}/', $entry['bf_date_fin_evenement_data'], $matches)) {
$recurrenceBaseId = $matches[1];
} elseif (is_array($entry['bf_date_fin_evenement_data'])) {
$data = $entry['bf_date_fin_evenement_data'];
}
}
return $this->render('@bazar/fields/date.twig', [
'value' => $value
'value' => $value,
'recurrenceBaseId' => $recurrenceBaseId,
'data' => $data
]);
}

Expand Down
17 changes: 17 additions & 0 deletions tools/bazar/fields/FileField.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use attach;
use Psr\Container\ContainerInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use YesWiki\Bazar\Service\DateService;
use YesWiki\Bazar\Service\EntryManager;
use YesWiki\Bazar\Service\Guard;
use YesWiki\Core\Service\EventDispatcher;
Expand Down Expand Up @@ -295,7 +296,15 @@ protected function updateEntryAfterFileDelete($entry)
$_POST = [];
$previousRequest = $_REQUEST;
$_REQUEST = [];

// remove current field
unset($entryFromDb[$this->propertyName]);

// be careful to recurrence
if (isset($entryFromDb['bf_date_fin_evenement_data']) && is_string($entryFromDb['bf_date_fin_evenement_data'])) {
unset($entryFromDb['bf_date_fin_evenement_data']); // remove links to parent
}

$entryFromDb['antispam'] = 1;
$entryFromDb['date_maj_fiche'] = date('Y-m-d H:i:s', time());
$newEntry = $entryManager->update($entryFromDb['id_fiche'], $entryFromDb, false, true);
Expand All @@ -304,6 +313,14 @@ protected function updateEntryAfterFileDelete($entry)
$_POST = $previousPost;
$_REQUEST = $previousRequest;

// be careful to recurrence

if (!empty($newEntry['id_fiche'])
&& is_string($newEntry['id_fiche'])
&& isset($newEntry['bf_date_fin_evenement'])) {
$this->getService(DateService::class)->followId($newEntry['id_fiche']);
}

$errors = $this->services->get(EventDispatcher::class)->yesWikiDispatch('entry.updated', [
'id' => $newEntry['id_fiche'],
'data' => $newEntry
Expand Down
41 changes: 41 additions & 0 deletions tools/bazar/lang/bazar_ca.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,47 @@
// 'SUM' => 'Somme',
'URL' => 'Url',

// templates/bazar/fields/date.twig
// 'EVENT_IS_RECURRENT' => 'Cet évènement est récurrent : %{repetition}',
// 'EVENT_LIMIT_DATE' => 'jusqu\'au %{date}',
// 'EVENT_REPETITION_FOR_DAYS' => 'tous les %{x} jours',
// 'EVENT_REPETITION_FOR_MONTHS' => 'tous les %{x} mois, %{monthRepetition}',
// 'EVENT_REPETITION_FOR_WEEKS' => 'toutes les %{x} semaines, %{days}',
// 'EVENT_REPETITION_FOR_YEAR' => 'tous les ans, %{monthRepetition}',
// 'EVENT_REPETITION_FOR_YEARS' => 'toutes les %{x} années, %{monthRepetition}',
// 'EVENT_REPETITION_NTH_OF_MONTH' => 'le %{nth} %{month}',
// 'EVENT_REPETITION_NTH_OF_MONTH_ALONE' => 'le %{nth}',
// 'EVENT_REPETITION_IN_MONTH' => 'en %{month}, ',
// 'EVENT_IS_LINKED_TO_RECURRENT' => 'Cet évènement est un évènement récurrent lié à la fiche %{link}',

// templates/bazar/inputs/date.twig
// 'EVENT_ACTIVATE_CUSTOM' => 'Voir les options supplémentaires',
// 'EVENT_EVERY_DAYS' => 'Tous les jours',
// 'EVENT_EVERY_X_DAYS' => 'Tous les X jours',
// 'EVENT_EVERY_WEEKS' => 'Toutes les semaines',
// 'EVENT_EVERY_X_WEEKS' => 'Toutes les X semaines',
// 'EVENT_EVERY_MONTHS' => 'Tous les mois',
// 'EVENT_EVERY_X_MONTHS' => 'Tous les X mois',
// 'EVENT_EVERY_X_MONTHS' => 'Tous les X mois',
// 'EVENT_EVERY_YEARS' => 'Tous les ans',
// 'EVENT_EVERY_X_YEARS' => 'Toutes les X années',
// 'EVENT_EXCEPT_LABEL' => 'Sauf',
// 'EVENT_FIRST_Y_OF_MONTH' => 'Le premier Y du mois',
// 'EVENT_FORTH_Y_OF_MONTH' => 'Le quatrième Y du mois',
// 'EVENT_IS_LINKED_TO_RECURRENT_EDIT' => 'Cette évènement est un évènement récurrent lié à la fiche %{link}.<br/>Toute modification de cette fiche cassera le lien avec l\'évènement de base !',
// 'EVENT_LAST_Y_OF_MONTH' => 'Le dernier Y du mois',
// 'EVENT_LIMIT_DATE_UPDATE_FORCED' => 'La date de fin a été forcée pour réduire le nombre de répétitions à 600 !',
// 'EVENT_NO_REPETITION' => 'Pas de répétition',
// 'EVENT_NTH_OF_MONTH' => 'Chaque Y du mois',
// 'EVENT_ON_MONTH' => 'En :',
// 'EVENT_RECURRENT' => 'Récurrence',
// 'EVENT_REMOVE_CUSTOM' => 'Masques les options supplémentaires',
// 'EVENTS_REPETITIONS' => 'Répétitions',
// 'EVENT_SECOND_Y_OF_MONTH' => 'Le second Y du mois',
// 'EVENT_THIRD_Y_OF_MONTH' => 'Le troisième Y du mois',
// 'EVENT_UP_TO_DATE' => 'Jusqu\'au :',
// 'EVENTS_WHEN_IN_MONTH' => 'A quel moment du mois ?',

// presentation/templates/timeline.tpl.html
// 'BAZ_YEAR' => 'Ann&eacute;e',

Expand Down
42 changes: 42 additions & 0 deletions tools/bazar/lang/bazar_en.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -352,5 +352,47 @@
// templates/tableau.twig
'SUM' => 'Sum',
'URL' => 'Url',

// templates/bazar/fields/date.twig
// 'EVENT_IS_RECURRENT' => 'Cet évènement est récurrent : %{repetition}',
// 'EVENT_LIMIT_DATE' => 'jusqu\'au %{date}',
// 'EVENT_REPETITION_FOR_DAYS' => 'tous les %{x} jours',
// 'EVENT_REPETITION_FOR_MONTHS' => 'tous les %{x} mois, %{monthRepetition}',
// 'EVENT_REPETITION_FOR_WEEKS' => 'toutes les %{x} semaines, %{days}',
// 'EVENT_REPETITION_FOR_YEAR' => 'tous les ans, %{monthRepetition}',
// 'EVENT_REPETITION_FOR_YEARS' => 'toutes les %{x} années, %{monthRepetition}',
// 'EVENT_REPETITION_NTH_OF_MONTH' => 'le %{nth} %{month}',
// 'EVENT_REPETITION_NTH_OF_MONTH_ALONE' => 'le %{nth}',
// 'EVENT_REPETITION_IN_MONTH' => 'en %{month}, ',
// 'EVENT_IS_LINKED_TO_RECURRENT' => 'Cet évènement est un évènement récurrent lié à la fiche %{link}',

// templates/bazar/inputs/date.twig
// 'EVENT_ACTIVATE_CUSTOM' => 'Voir les options supplémentaires',
// 'EVENT_EVERY_DAYS' => 'Tous les jours',
// 'EVENT_EVERY_X_DAYS' => 'Tous les X jours',
// 'EVENT_EVERY_WEEKS' => 'Toutes les semaines',
// 'EVENT_EVERY_X_WEEKS' => 'Toutes les X semaines',
// 'EVENT_EVERY_MONTHS' => 'Tous les mois',
// 'EVENT_EVERY_X_MONTHS' => 'Tous les X mois',
// 'EVENT_EVERY_X_MONTHS' => 'Tous les X mois',
// 'EVENT_EVERY_YEARS' => 'Tous les ans',
// 'EVENT_EVERY_X_YEARS' => 'Toutes les X années',
// 'EVENT_EXCEPT_LABEL' => 'Sauf',
// 'EVENT_FIRST_Y_OF_MONTH' => 'Le premier Y du mois',
// 'EVENT_FORTH_Y_OF_MONTH' => 'Le quatrième Y du mois',
// 'EVENT_IS_LINKED_TO_RECURRENT_EDIT' => 'Cette évènement est un évènement récurrent lié à la fiche %{link}.<br/>Toute modification de cette fiche cassera le lien avec l\'évènement de base !',
// 'EVENT_LAST_Y_OF_MONTH' => 'Le dernier Y du mois',
// 'EVENT_LIMIT_DATE_UPDATE_FORCED' => 'La date de fin a été forcée pour réduire le nombre de répétitions à 600 !',
// 'EVENT_NO_REPETITION' => 'Pas de répétition',
// 'EVENT_NTH_OF_MONTH' => 'Chaque Y du mois',
// 'EVENT_ON_MONTH' => 'En :',
// 'EVENT_RECURRENT' => 'Récurrence',
// 'EVENT_REMOVE_CUSTOM' => 'Masques les options supplémentaires',
// 'EVENTS_REPETITIONS' => 'Répétitions',
// 'EVENT_SECOND_Y_OF_MONTH' => 'Le second Y du mois',
// 'EVENT_THIRD_Y_OF_MONTH' => 'Le troisième Y du mois',
// 'EVENT_UP_TO_DATE' => 'Jusqu\'au :',
// 'EVENTS_WHEN_IN_MONTH' => 'A quel moment du mois ?',

'BAZ_FILEFIELD_FILE' => 'File : {filename}',
];
41 changes: 41 additions & 0 deletions tools/bazar/lang/bazar_es.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,47 @@
// 'SUM' => 'Somme',
'URL' => 'Url',

// templates/bazar/fields/date.twig
// 'EVENT_IS_RECURRENT' => 'Cet évènement est récurrent : %{repetition}',
// 'EVENT_LIMIT_DATE' => 'jusqu\'au %{date}',
// 'EVENT_REPETITION_FOR_DAYS' => 'tous les %{x} jours',
// 'EVENT_REPETITION_FOR_MONTHS' => 'tous les %{x} mois, %{monthRepetition}',
// 'EVENT_REPETITION_FOR_WEEKS' => 'toutes les %{x} semaines, %{days}',
// 'EVENT_REPETITION_FOR_YEAR' => 'tous les ans, %{monthRepetition}',
// 'EVENT_REPETITION_FOR_YEARS' => 'toutes les %{x} années, %{monthRepetition}',
// 'EVENT_REPETITION_NTH_OF_MONTH' => 'le %{nth} %{month}',
// 'EVENT_REPETITION_NTH_OF_MONTH_ALONE' => 'le %{nth}',
// 'EVENT_REPETITION_IN_MONTH' => 'en %{month}, ',
// 'EVENT_IS_LINKED_TO_RECURRENT' => 'Cet évènement est un évènement récurrent lié à la fiche %{link}',

// templates/bazar/inputs/date.twig
// 'EVENT_ACTIVATE_CUSTOM' => 'Voir les options supplémentaires',
// 'EVENT_EVERY_DAYS' => 'Tous les jours',
// 'EVENT_EVERY_X_DAYS' => 'Tous les X jours',
// 'EVENT_EVERY_WEEKS' => 'Toutes les semaines',
// 'EVENT_EVERY_X_WEEKS' => 'Toutes les X semaines',
// 'EVENT_EVERY_MONTHS' => 'Tous les mois',
// 'EVENT_EVERY_X_MONTHS' => 'Tous les X mois',
// 'EVENT_EVERY_X_MONTHS' => 'Tous les X mois',
// 'EVENT_EVERY_YEARS' => 'Tous les ans',
// 'EVENT_EVERY_X_YEARS' => 'Toutes les X années',
// 'EVENT_EXCEPT_LABEL' => 'Sauf',
// 'EVENT_FIRST_Y_OF_MONTH' => 'Le premier Y du mois',
// 'EVENT_FORTH_Y_OF_MONTH' => 'Le quatrième Y du mois',
// 'EVENT_IS_LINKED_TO_RECURRENT_EDIT' => 'Cette évènement est un évènement récurrent lié à la fiche %{link}.<br/>Toute modification de cette fiche cassera le lien avec l\'évènement de base !',
// 'EVENT_LAST_Y_OF_MONTH' => 'Le dernier Y du mois',
// 'EVENT_LIMIT_DATE_UPDATE_FORCED' => 'La date de fin a été forcée pour réduire le nombre de répétitions à 600 !',
// 'EVENT_NO_REPETITION' => 'Pas de répétition',
// 'EVENT_NTH_OF_MONTH' => 'Chaque Y du mois',
// 'EVENT_ON_MONTH' => 'En :',
// 'EVENT_RECURRENT' => 'Récurrence',
// 'EVENT_REMOVE_CUSTOM' => 'Masques les options supplémentaires',
// 'EVENTS_REPETITIONS' => 'Répétitions',
// 'EVENT_SECOND_Y_OF_MONTH' => 'Le second Y du mois',
// 'EVENT_THIRD_Y_OF_MONTH' => 'Le troisième Y du mois',
// 'EVENT_UP_TO_DATE' => 'Jusqu\'au :',
// 'EVENTS_WHEN_IN_MONTH' => 'A quel moment du mois ?',

// presentation/templates/timeline.tpl.html
// 'BAZ_YEAR' => 'Ann&eacute;e',

Expand Down
41 changes: 41 additions & 0 deletions tools/bazar/lang/bazar_fr.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,47 @@
'SUM' => 'Somme',
'URL' => 'Url',

// templates/bazar/fields/date.twig
'EVENT_IS_RECURRENT' => 'Cet évènement est récurrent : %{repetition}',
'EVENT_LIMIT_DATE' => 'jusqu\'au %{date}',
'EVENT_REPETITION_FOR_DAYS' => 'tous les %{x} jours',
'EVENT_REPETITION_FOR_MONTHS' => 'tous les %{x} mois, %{monthRepetition}',
'EVENT_REPETITION_FOR_WEEKS' => 'toutes les %{x} semaines, %{days}',
'EVENT_REPETITION_FOR_YEAR' => 'tous les ans, %{monthRepetition}',
'EVENT_REPETITION_FOR_YEARS' => 'toutes les %{x} années, %{monthRepetition}',
'EVENT_REPETITION_NTH_OF_MONTH' => 'le %{nth} %{month}',
'EVENT_REPETITION_NTH_OF_MONTH_ALONE' => 'le %{nth}',
'EVENT_REPETITION_IN_MONTH' => 'en %{month}, ',
'EVENT_IS_LINKED_TO_RECURRENT' => 'Cet évènement est un évènement récurrent lié à la fiche %{link}',

// templates/bazar/inputs/date.twig
'EVENT_ACTIVATE_CUSTOM' => 'Voir les options supplémentaires',
'EVENT_EVERY_DAYS' => 'Tous les jours',
'EVENT_EVERY_X_DAYS' => 'Tous les X jours',
'EVENT_EVERY_WEEKS' => 'Toutes les semaines',
'EVENT_EVERY_X_WEEKS' => 'Toutes les X semaines',
'EVENT_EVERY_MONTHS' => 'Tous les mois',
'EVENT_EVERY_X_MONTHS' => 'Tous les X mois',
'EVENT_EVERY_X_MONTHS' => 'Tous les X mois',
'EVENT_EVERY_YEARS' => 'Tous les ans',
'EVENT_EVERY_X_YEARS' => 'Toutes les X années',
'EVENT_EXCEPT_LABEL' => 'Sauf',
'EVENT_FIRST_Y_OF_MONTH' => 'Le premier Y du mois',
'EVENT_FORTH_Y_OF_MONTH' => 'Le quatrième Y du mois',
'EVENT_IS_LINKED_TO_RECURRENT_EDIT' => 'Cette évènement est un évènement récurrent lié à la fiche %{link}.<br/>Toute modification de cette fiche cassera le lien avec l\'évènement de base !',
'EVENT_LAST_Y_OF_MONTH' => 'Le dernier Y du mois',
'EVENT_LIMIT_DATE_UPDATE_FORCED' => 'La date de fin a été forcée pour réduire le nombre de répétitions à 600 !',
'EVENT_NO_REPETITION' => 'Pas de répétition',
'EVENT_NTH_OF_MONTH' => 'Chaque Y du mois',
'EVENT_ON_MONTH' => 'En :',
'EVENT_RECURRENT' => 'Récurrence',
'EVENT_REMOVE_CUSTOM' => 'Masques les options supplémentaires',
'EVENTS_REPETITIONS' => 'Répétitions',
'EVENT_SECOND_Y_OF_MONTH' => 'Le second Y du mois',
'EVENT_THIRD_Y_OF_MONTH' => 'Le troisième Y du mois',
'EVENT_UP_TO_DATE' => 'Jusqu\'au :',
'EVENTS_WHEN_IN_MONTH' => 'A quel moment du mois ?',

// presentation/templates/timeline.tpl.html
'BAZ_YEAR' => 'Ann&eacute;e',

Expand Down
Loading

0 comments on commit 694bb14

Please sign in to comment.