From 4d624e756923cf8ce5b6c50db8bbe796889c08af Mon Sep 17 00:00:00 2001 From: Hamza Mahjoubi Date: Tue, 2 Apr 2024 09:44:42 +0200 Subject: [PATCH] Feat: calendar widget for private calendars Signed-off-by: Hamza Mahjoubi --- lib/Reference/ReferenceProvider.php | 76 +++++++++++++++++++++++------ src/components/CalendarGrid.vue | 37 ++++++++++++-- src/reference.js | 4 +- src/views/Calendar.vue | 15 +++++- 4 files changed, 113 insertions(+), 19 deletions(-) diff --git a/lib/Reference/ReferenceProvider.php b/lib/Reference/ReferenceProvider.php index f4048ca1d..3c937876e 100644 --- a/lib/Reference/ReferenceProvider.php +++ b/lib/Reference/ReferenceProvider.php @@ -73,24 +73,55 @@ class ReferenceProvider extends ADiscoverableReferenceProvider { public function matchReference(string $referenceText): bool { $start = $this->urlGenerator->getAbsoluteURL('/apps/' . Application::APP_ID); $startIndex = $this->urlGenerator->getAbsoluteURL('/index.php/apps/' . Application::APP_ID); + if (preg_match('/^' . preg_quote($start, '/') . '\/p\/[a-zA-Z0-9]+$/i', $referenceText) === 1 || preg_match('/^' . preg_quote($startIndex, '/') . '\/p\/[a-zA-Z0-9]+$/i', $referenceText) === 1) { + return true; + } + + $start = $this->urlGenerator->getAbsoluteURL('/remote.php/dav/calendars'); + if (preg_match('/^' . preg_quote($start, '/') . '\/[a-zA-Z0-9-]+\/[a-zA-Z0-9-]+\/$/i', $referenceText) === 1) { + return true; + } - return preg_match('/^' . preg_quote($start, '/') . '\/p\/[a-zA-Z0-9]+$/i', $referenceText) === 1 || preg_match('/^' . preg_quote($startIndex, '/') . '\/p\/[a-zA-Z0-9]+$/i', $referenceText) === 1; + return false; } public function resolveReference(string $referenceText): ?IReference { if ($this->matchReference($referenceText)) { - $token = $this->getCalendarTokenFromLink($referenceText); - + $type = $this->getType($referenceText); $reference = new Reference($referenceText); $reference->setTitle('calendar'); - $reference->setDescription($token); - $reference->setRichObject( - 'calendar_widget', - [ - 'title' => 'calendar', - 'token' => $token, - 'url' => $referenceText,] - ); + $reference->setDescription('calendar widget'); + + switch ($type) { + case 'public': + $token = $this->getCalendarTokenFromLink($referenceText); + $url = $this->getUrlFromLink($token, 'public'); + $reference->setRichObject( + 'calendar_widget', + [ + 'title' => 'calendar', + 'token' => $token, + 'isPublic' => true, + 'url' => $url, + ] + ); + break; + case 'private': + $url = $this->getUrlFromLink($referenceText, 'private'); + $reference->setRichObject( + 'calendar_widget', + [ + 'title' => 'calendar', + 'isPublic' => false, + 'url' => $url, + ] + ); + break; + default: + return null; + } + + return $reference; } @@ -99,14 +130,31 @@ class ReferenceProvider extends ADiscoverableReferenceProvider { } private function getCalendarTokenFromLink(string $url): ?string { - - if (preg_match('/\/p\/([a-zA-Z0-9]+)/', $url, $output_array)) { return $output_array[1]; } - return $url; + return null; } + private function getUrlFromLink(string $data, string $type): ?string { + if ($type === 'public') { + return "{$this->urlGenerator->getWebroot()}/remote.php/dav/public-calendars/{$data}/"; + } elseif ($type === 'private' && preg_match('/\/remote.php\/dav\/calendars\/([a-zA-Z0-9-]+)\/([a-zA-Z0-9-]+)\//', $data, $output_array)) { + return $this->urlGenerator->getWebroot().$output_array[0]; + } + return null; + + } + + private function getType(string $url): string { + if (preg_match('/\/p\/([a-zA-Z0-9]+)/', $url) === 1) { + return 'public'; + } + if (preg_match('/\/dav\/calendars\/([^\/]+)\/([^\/]+)/', $url) === 1) { + return 'private'; + } + return 'unknown'; + } public function getCachePrefix(string $referenceId): string { return ''; diff --git a/src/components/CalendarGrid.vue b/src/components/CalendarGrid.vue index 4b2d02fcb..265ed2e63 100644 --- a/src/components/CalendarGrid.vue +++ b/src/components/CalendarGrid.vue @@ -22,9 +22,10 @@ -->