engelsystem/includes/controller/rooms_controller.php

108 lines
2.5 KiB
PHP
Raw Normal View History

2014-12-22 17:55:20 +01:00
<?php
2017-08-28 16:21:10 +02:00
2022-11-09 00:02:30 +01:00
use Engelsystem\Models\AngelType;
2020-09-06 23:50:36 +02:00
use Engelsystem\Models\Room;
use Engelsystem\ShiftsFilter;
2017-01-02 15:43:36 +01:00
use Engelsystem\ShiftsFilterRenderer;
/**
* Room controllers for managing everything room related.
*/
/**
* View a room with its shifts.
2017-01-03 03:22:48 +01:00
*
* @return array
*/
function room_controller(): array
2017-01-02 03:57:23 +01:00
{
if (!auth()->can('view_rooms')) {
2019-09-08 02:25:49 +02:00
throw_redirect(page_link_to());
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
$request = request();
$room = load_room();
2023-01-03 22:19:03 +01:00
$all_shifts = $room->shifts->sortBy('start');
2017-01-02 03:57:23 +01:00
$days = [];
foreach ($all_shifts as $shift) {
2023-01-03 22:19:03 +01:00
$day = $shift->start->format('Y-m-d');
2023-02-04 02:43:47 +01:00
if (!isset($days[$day])) {
$days[$day] = $shift->start->format(__('Y-m-d'));
2017-01-02 03:57:23 +01:00
}
}
2017-01-02 15:43:36 +01:00
$shiftsFilter = new ShiftsFilter(
true,
2020-09-06 23:50:36 +02:00
[$room->id],
2022-11-09 00:02:30 +01:00
AngelType::query()->get('id')->pluck('id')->toArray()
2017-01-02 15:43:36 +01:00
);
2017-01-03 14:12:17 +01:00
$selected_day = date('Y-m-d');
2023-02-04 02:43:47 +01:00
if (!empty($days) && !isset($days[$selected_day])) {
$selected_day = array_key_first($days);
2017-01-02 03:57:23 +01:00
}
if ($request->input('shifts_filter_day')) {
$selected_day = $request->input('shifts_filter_day');
2017-01-02 03:57:23 +01:00
}
2017-01-03 14:12:17 +01:00
$shiftsFilter->setStartTime(parse_date('Y-m-d H:i', $selected_day . ' 00:00'));
$shiftsFilter->setEndTime(parse_date('Y-m-d H:i', $selected_day . ' 23:59'));
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
$shiftsFilterRenderer = new ShiftsFilterRenderer($shiftsFilter);
$shiftsFilterRenderer->enableDaySelection($days);
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
$shiftCalendarRenderer = shiftCalendarRendererByShiftFilter($shiftsFilter);
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
return [
2020-09-06 23:50:36 +02:00
$room->name,
Room_view($room, $shiftsFilterRenderer, $shiftCalendarRenderer),
2017-01-02 15:43:36 +01:00
];
}
/**
* Dispatch different room actions.
2017-01-03 03:22:48 +01:00
*
* @return array
*/
function rooms_controller(): array
2017-01-02 03:57:23 +01:00
{
$request = request();
$action = $request->input('action');
if (!$request->has('action')) {
$action = 'list';
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2022-12-22 00:08:54 +01:00
return match ($action) {
'view' => room_controller(),
2023-02-26 11:27:41 +01:00
'list' => throw_redirect(page_link_to('admin/rooms')),
default => throw_redirect(page_link_to('admin/rooms')),
2022-12-22 00:08:54 +01:00
};
}
2014-12-22 17:55:20 +01:00
2017-01-03 03:22:48 +01:00
/**
2020-09-06 23:50:36 +02:00
* @param Room $room
2017-01-03 03:22:48 +01:00
* @return string
*/
2020-09-06 23:50:36 +02:00
function room_link(Room $room)
2017-01-02 03:57:23 +01:00
{
2020-09-06 23:50:36 +02:00
return page_link_to('rooms', ['action' => 'view', 'room_id' => $room->id]);
2014-12-22 17:55:20 +01:00
}
/**
* Loads room by request param room_id
2017-01-03 03:22:48 +01:00
*
2020-09-06 23:50:36 +02:00
* @return Room
*/
function load_room()
2017-01-02 03:57:23 +01:00
{
2017-01-02 15:43:36 +01:00
if (!test_request_int('room_id')) {
2019-09-08 02:25:49 +02:00
throw_redirect(page_link_to());
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2020-09-06 23:50:36 +02:00
$room = Room::find(request()->input('room_id'));
if (!$room) {
2019-09-08 02:25:49 +02:00
throw_redirect(page_link_to());
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
return $room;
}