Hi,
I’ve created a vue based plugin showing a panel page with a court-schedule.
The custom panel page works fine.
But I cannot manage to get the default Kirby left sidebar into my page.
Probably something I miss in my approach.
Any tips someone?
Thanks in advance.
Below my screenprint and plugins index.php
<?php
// site/plugins/plg-courtschedule/index.php
use Kirby\Cms\App;
Kirby::plugin('padeltime/courtschedule', [
'areas' => [
'courtschedule2' => function ($kirby) {
return [
'label' => 'CourtSchedule',
'icon' => 'calendar',
'menu' => true,
'link' => 'courtschedule2',
'searches' => [
'pages' => [
'label' => 'Pages',
'icon' => 'page',
'query' => function (string|null $query, int $limit, int $page) {
$kirby = App::instance();
return $kirby->site()->index()->search($query)->limit($limit);
}
]
],
'views' => [
[
'pattern' => 'courtschedule2',
'action' => function () {
return [
'component' => 'k-courtschedule2-view',
'title' => 'Court Schedule 2',
'props' => [
'layout' => 'inside',
'message' => 'Welcome to CourtSchedule2!'
]
];
}
]
]
];
}
],
'api' => [
'routes' => [
[
'pattern' => 'courtschedule2/clubs',
'method' => 'GET',
'action' => function () {
$courtschedulePage = site()->find('courtschedule');
if (!$courtschedulePage) {
return [
'success' => false,
'error' => 'Court schedule page not found'
];
}
// Get filtered clubs using the model method
$clubs = $courtschedulePage->filteredClubs();
// Format clubs data for JSON response
$clubsData = [];
foreach ($clubs as $club) {
$clubsData[] = [
'id' => $club->id(), // Full path like 'clubs/bakkershaag'
'uid' => $club->uid(), // Just 'bakkershaag'
'title' => $club->title()->value(),
'openingTime' => $club->opening_time()->or('08:00')->value(),
'closingTime' => $club->closing_time()->or('22:00')->value()
];
}
return [
'success' => true,
'clubs' => $clubsData
];
}
],
[
'pattern' => 'courtschedule2/schedule/(:any)/(:any)',
'method' => 'GET',
'action' => function (string $clubUid, string $date) {
try {
$courtschedulePage = site()->find('courtschedule');
if (!$courtschedulePage) {
return [
'success' => false,
'error' => 'Court schedule page not found'
];
}
// Construct full club path from UID
$club = page('clubs/' . $clubUid);
if (!$club) {
return [
'success' => false,
'error' => 'Club not found: ' . $clubUid
];
}
// Get schedule data (works for both weekly and daily views)
$weekStart = date('Y-m-d', strtotime('monday this week', strtotime($date)));
$lessons = $courtschedulePage->getWeekSchedule($club, $weekStart);
$courts = $club->childrenAndDrafts()->filterBy('template', 'court');
// Format lessons data
$lessonsData = [];
foreach ($lessons as $lesson) {
$lessonsData[] = [
'id' => $lesson['id'],
'lessonGroupId' => $lesson['lessonGroupId'],
'title' => $lesson['title'],
'courtId' => $lesson['court'] ? $lesson['court']->id() : null,
'courtTitle' => $lesson['court'] ? $lesson['court']->title()->value() : null,
'date' => $lesson['date'],
'day' => $lesson['day'],
'startTime' => $lesson['startTime'],
'duration' => $lesson['duration'],
'trainer' => $lesson['trainer'],
'participants' => $lesson['participants'],
'maxParticipants' => $lesson['maxParticipants'],
'lessonNumber' => $lesson['lessonNumber'],
'totalLessons' => $lesson['totalLessons']
];
}
// Format courts data
$courtsData = [];
foreach ($courts as $court) {
$courtsData[] = [
'id' => $court->id(),
'title' => $court->title()->value(),
'name' => $court->court_name()->value()
];
}
return [
'success' => true,
'lessons' => $lessonsData,
'courts' => $courtsData,
'clubId' => $club->id(),
'clubTitle' => $club->title()->value(),
'openingTime' => $club->opening_time()->or('08:00')->value(),
'closingTime' => $club->closing_time()->or('22:00')->value()
];
} catch (Exception $e) {
return [
'success' => false,
'error' => 'Error loading schedule: ' . $e->getMessage(),
'trace' => $e->getTraceAsString()
];
}
}
],
[
'pattern' => 'courtschedule2/lesson/create',
'method' => 'POST',
'action' => function () {
try {
$data = kirby()->request()->data();
$courtId = $data['courtId'] ?? null;
$lessonGroupId = $data['lessonGroupId'] ?? null;
$date = $data['date'] ?? null;
$startTime = $data['startTime'] ?? null;
if (!$lessonGroupId || !$date || !$startTime) {
return [
'success' => false,
'error' => 'Missing required fields: lessonGroupId, date, or startTime'
];
}
// Get the lesson group page
$lessonGroup = page($lessonGroupId);
if (!$lessonGroup) {
return [
'success' => false,
'error' => 'Lesson group not found'
];
}
// Create a unique slug for the lesson
$lessonSlug = 'lesson-' . $date;
// Check if lesson already exists
$counter = 1;
$originalSlug = $lessonSlug;
while ($lessonGroup->children()->find($lessonSlug)) {
$lessonSlug = $originalSlug . '-' . $counter;
$counter++;
}
// Create the lesson page
$lesson = $lessonGroup->createChild([
'slug' => $lessonSlug,
'template' => 'lesson',
'content' => [
'date' => $date,
'start_time' => $startTime,
'court' => $courtId ? 'page://' . $courtId : '',
'duration' => '60'
]
]);
return [
'success' => true,
'lessonId' => $lesson->id()
];
} catch (Exception $e) {
return [
'success' => false,
'error' => 'Error creating lesson: ' . $e->getMessage(),
'trace' => $e->getTraceAsString()
];
}
}
]
]
]
]);

