diff --git a/Pages/Admin/ManageConfigurationPage.php b/Pages/Admin/ManageConfigurationPage.php index 789ec245f..36ffbddfe 100644 --- a/Pages/Admin/ManageConfigurationPage.php +++ b/Pages/Admin/ManageConfigurationPage.php @@ -94,6 +94,11 @@ public function SetPostReservationPluginValues($values); */ public function SetStylingPluginValues($values); + /** + * @param string[] $values + */ + public function SetExportPluginValues($values); + /** * @return int */ @@ -262,6 +267,10 @@ public function SetStylingPluginValues($values) { $this->Set('StylingPluginValues', $values); } + public function SetExportPluginValues($values) + { + $this->Set('ExportPluginValues', $values); + } public function GetHomePageId() { diff --git a/Presenters/Admin/ManageConfigurationPresenter.php b/Presenters/Admin/ManageConfigurationPresenter.php index 6d81f408f..72f1dfaf4 100644 --- a/Presenters/Admin/ManageConfigurationPresenter.php +++ b/Presenters/Admin/ManageConfigurationPresenter.php @@ -158,6 +158,7 @@ private function PopulatePlugins() $this->page->SetPreReservationPluginValues($plugins['PreReservation']); $this->page->SetPostReservationPluginValues($plugins['PostReservation']); $this->page->SetStylingPluginValues($plugins['Styling']); + $this->page->SetExportPluginValues($plugins['Export']); } public function Update() diff --git a/config/config.devel.php b/config/config.devel.php index f9df64c1d..376c140f2 100644 --- a/config/config.devel.php +++ b/config/config.devel.php @@ -119,6 +119,7 @@ */ $conf['settings']['plugins']['Authentication'] = ''; $conf['settings']['plugins']['Authorization'] = ''; +$conf['settings']['plugins']['Export'] = ''; $conf['settings']['plugins']['Permission'] = ''; $conf['settings']['plugins']['PostRegistration'] = ''; $conf['settings']['plugins']['PreReservation'] = ''; diff --git a/config/config.dist.php b/config/config.dist.php index 2def7023f..8f1d76fbf 100644 --- a/config/config.dist.php +++ b/config/config.dist.php @@ -121,6 +121,7 @@ */ $conf['settings']['plugins']['Authentication'] = ''; $conf['settings']['plugins']['Authorization'] = ''; +$conf['settings']['plugins']['Export'] = ''; $conf['settings']['plugins']['Permission'] = ''; $conf['settings']['plugins']['PostRegistration'] = ''; $conf['settings']['plugins']['PreReservation'] = ''; diff --git a/lib/Application/Export/ExportFactory.php b/lib/Application/Export/ExportFactory.php new file mode 100644 index 000000000..1109865f4 --- /dev/null +++ b/lib/Application/Export/ExportFactory.php @@ -0,0 +1,41 @@ +CanViewUser($currentUser, $res, $res->OwnerId); $canViewDetails = $privacyFilter->CanViewDetails($currentUser, $res, $res->OwnerId); + $this->ExportFactory = PluginManager::Instance()->LoadExport(); + $privateNotice = 'Private'; + + $this->Classification = method_exists($this->ExportFactory, 'GetIcalendarClassification') ? $this->ExportFactory->GetIcalendarClassification($res) : 'PUBLIC'; if ($res->DateCreated){ $this->DateCreated = $res->DateCreated; } else $this->DateCreated = Date::Now(); + $this->DateEnd = $res->EndDate; $this->DateStart = $res->StartDate; $this->Description = $canViewDetails ? $factory->Format($res, $summaryFormat) : $privateNotice; @@ -70,6 +82,8 @@ public function __construct($res, UserSession $currentUser, IPrivacyFilter $priv if ($res->OwnerId == $currentUser->UserId) { $this->OrganizerEmail = str_replace('@', '-noreply@', $res->OwnerEmailAddress); } + + $this->ExtraIcalLines = method_exists($this->ExportFactory, 'GetIcalendarExtraLines') ? $this->ExportFactory->GetIcalendarExtraLines($res) : null; } /** diff --git a/lib/Common/PluginManager.php b/lib/Common/PluginManager.php index 6cfb41795..28a0d4425 100644 --- a/lib/Common/PluginManager.php +++ b/lib/Common/PluginManager.php @@ -169,9 +169,9 @@ public function LoadPostRegistration() /** * Loads the configured Styling plugin, if one exists - * If no plugin exists, the default PreReservationFactory class is returned + * If no plugin exists, the default StylingFactory class is returned * - * @return IPreReservationFactory + * @return IStylingFactory */ public function LoadStyling() { @@ -188,6 +188,27 @@ public function LoadStyling() return $factory; } + /** + * Loads the configured Export plugin, if one exists + * If no plugin exists, the default ExportFactory class is returned + * + * @return IExportFactory + */ + public function LoadExport() + { + require_once(ROOT_DIR . 'lib/Application/Export/namespace.php'); + + $factory = new ExportFactory(); + + $plugin = $this->LoadPlugin(ConfigKeys::PLUGIN_EXPORT, 'Export', $factory); + + if (!is_null($plugin)) { + return $plugin; + } + + return $factory; + } + /** * @param string $configKey key to use * @param string $pluginSubDirectory subdirectory name under 'plugins' diff --git a/lib/Config/ConfigKeys.php b/lib/Config/ConfigKeys.php index d42d375e2..69b2667da 100644 --- a/lib/Config/ConfigKeys.php +++ b/lib/Config/ConfigKeys.php @@ -45,6 +45,7 @@ class ConfigKeys public const PLUGIN_AUTHENTICATION = 'Authentication'; public const PLUGIN_AUTHORIZATION = 'Authorization'; + public const PLUGIN_EXPORT = 'Export'; public const PLUGIN_PERMISSION = 'Permission'; public const PLUGIN_POSTREGISTRATION = 'PostRegistration'; public const PLUGIN_PRERESERVATION = 'PreReservation'; diff --git a/plugins/Export/ExportExample/ExportExample.php b/plugins/Export/ExportExample/ExportExample.php new file mode 100644 index 000000000..ae2232fa2 --- /dev/null +++ b/plugins/Export/ExportExample/ExportExample.php @@ -0,0 +1,22 @@ +factoryToDecorate = $factoryToDecorate; + } + + public function GetIcalendarClassification(IReservedItemView $item) { + return 'PRIVATE'; + } + + public function GetIcalendarExtraLines(IReservedItemView $item) { + return "TRANSP:TRANSPARENT\n"; + } +} diff --git a/tests/Presenters/Admin/ManageConfigurationPresenterTest.php b/tests/Presenters/Admin/ManageConfigurationPresenterTest.php index 487c8616a..8e0a87103 100644 --- a/tests/Presenters/Admin/ManageConfigurationPresenterTest.php +++ b/tests/Presenters/Admin/ManageConfigurationPresenterTest.php @@ -322,6 +322,14 @@ public function SetStylingPluginValues($values) // TODO: Implement SetStylingPluginValues() method. } + /** + * @param string[] $values + */ + public function SetExportPluginValues($values) + { + // TODO: Implement SetExportPluginValues() method. + } + /** * @return int */ diff --git a/tpl/Export/ical.tpl b/tpl/Export/ical.tpl index 7c3d7c156..e8bff49b8 100644 --- a/tpl/Export/ical.tpl +++ b/tpl/Export/ical.tpl @@ -4,7 +4,7 @@ METHOD:REQUEST PRODID:-//LibreBooking//NONSGML {$bookedVersion}//EN {foreach from=$Reservations item=reservation} BEGIN:VEVENT -CLASS:PUBLIC +CLASS:{$reservation->Classification} CREATED:{formatdate date=$reservation->DateCreated key=ical} DESCRIPTION:{$reservation->Description|regex_replace:"/\r\n|\n|\r/m":"\n "} DTSTAMP:{formatdate date=$reservation->DateCreated key=ical} @@ -23,6 +23,8 @@ UID:{$reservation->ReferenceNumber}&{$UID} SEQUENCE:0 URL:{$reservation->ReservationUrl} X-MICROSOFT-CDO-BUSYSTATUS:BUSY +{if $reservation->ExtraIcalLines != null} +{$reservation->ExtraIcalLines}{/if} {if $reservation->StartReminder != null} BEGIN:VALARM TRIGGER;RELATED=START:-PT{$reservation->StartReminder->MinutesPrior()}M