engelsystem/includes/sys_menu.php

217 lines
5.5 KiB
PHP
Raw Normal View History

2011-06-02 00:48:29 +02:00
<?php
2017-08-28 16:21:10 +02:00
2020-12-18 18:27:10 +01:00
use Engelsystem\Models\Question;
2023-02-26 11:27:41 +01:00
use Engelsystem\Models\Room;
2016-11-15 16:28:20 +01:00
use Engelsystem\UserHintsRenderer;
2013-10-13 00:52:44 +02:00
2017-01-03 03:22:48 +01:00
/**
* @param string $page
2017-08-28 16:21:10 +02:00
* @param array $parameters get parameters
2017-01-03 03:22:48 +01:00
* @return string
*/
2017-08-28 16:21:10 +02:00
function page_link_to($page = '', $parameters = [])
2017-01-02 03:57:23 +01:00
{
2017-08-28 16:21:10 +02:00
$page = str_replace('_', '-', $page);
return url($page, $parameters);
2013-10-13 00:52:44 +02:00
}
/**
2016-11-14 19:10:29 +01:00
* Render the user hints
2017-01-03 03:22:48 +01:00
*
* @return string
2013-10-13 00:52:44 +02:00
*/
2017-01-02 03:57:23 +01:00
function header_render_hints()
{
2018-10-31 12:48:22 +01:00
$user = auth()->user();
2017-01-02 15:43:36 +01:00
2018-10-08 21:15:56 +02:00
if ($user) {
2023-01-22 19:16:33 +01:00
$hints_renderer = new UserHintsRenderer();
2017-01-02 03:57:23 +01:00
$hints_renderer->addHint(admin_new_questions());
$hints_renderer->addHint(user_angeltypes_unconfirmed_hint());
$hints_renderer->addHint(render_user_departure_date_hint());
$hints_renderer->addHint(user_driver_license_required_hint());
2023-08-10 11:33:06 +02:00
$hints_renderer->addHint(user_ifsg_certificate_required_hint());
2017-01-02 15:43:36 +01:00
// Important hints:
$hints_renderer->addHint(render_user_freeloader_hint(), true);
2017-01-02 03:57:23 +01:00
$hints_renderer->addHint(render_user_arrived_hint(), true);
$hints_renderer->addHint(render_user_tshirt_hint(), true);
$hints_renderer->addHint(render_user_dect_hint(), true);
2023-01-22 19:16:33 +01:00
return $hints_renderer->render();
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2023-01-22 19:16:33 +01:00
return '';
2016-11-14 19:10:29 +01:00
}
2019-11-26 20:12:43 +01:00
/**
* Returns the path of the current path with underscores instead of hyphens
*
* @return string
*/
function current_page()
{
return request()->query->get('p') ?: str_replace('-', '_', request()->path());
}
2017-01-03 03:22:48 +01:00
/**
* @return string
*/
2017-01-02 03:57:23 +01:00
function make_navigation()
{
2019-11-26 20:12:43 +01:00
$page = current_page();
2017-01-02 03:57:23 +01:00
$menu = [];
$pages = [
2023-10-03 18:59:46 +02:00
'news' => __('news.title'),
'meetings' => [__('news.title.meetings'), 'user_meetings'],
2018-09-02 02:09:56 +02:00
'user_shifts' => __('Shifts'),
2023-10-01 22:33:58 +02:00
'angeltypes' => __('angeltypes.angeltypes'),
2020-12-18 18:27:10 +01:00
'questions' => [__('Ask the Heaven'), 'question.add'],
2017-01-02 15:43:36 +01:00
];
2020-12-18 18:27:10 +01:00
foreach ($pages as $menu_page => $options) {
if (!menu_is_allowed($menu_page, $options)) {
continue;
2017-01-02 03:57:23 +01:00
}
2020-12-18 18:27:10 +01:00
$title = ((array) $options)[0];
2020-12-18 18:27:10 +01:00
$menu[] = toolbar_item_link(page_link_to($menu_page), '', $title, $menu_page == $page);
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
$menu = make_room_navigation($menu);
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
$admin_menu = [];
$admin_pages = [
2020-05-01 16:29:28 +02:00
// path => name
// path => [name, permission]
'admin_arrive' => 'Arrive angels',
'admin_active' => 'Active angels',
'users' => ['All Angels', 'admin_user'],
'admin_free' => 'Free angels',
2020-12-18 18:27:10 +01:00
'admin/questions' => ['Answer questions', 'question.edit'],
'shifttypes' => 'Shifttypes',
'admin_shifts' => 'Create shifts',
2023-02-26 11:27:41 +01:00
'admin/rooms' => ['room.rooms', 'admin_rooms'],
'admin_groups' => 'Grouprights',
'admin/schedule' => ['schedule.import', 'schedule.import'],
2020-05-01 16:29:28 +02:00
'admin/logs' => ['log.log', 'admin_log'],
'admin_event_config' => 'Event config',
2017-01-02 15:43:36 +01:00
];
if (config('autoarrive')) {
unset($admin_pages['admin_arrive']);
}
foreach ($admin_pages as $menu_page => $options) {
2020-12-18 18:27:10 +01:00
if (!menu_is_allowed($menu_page, $options)) {
continue;
}
$title = ((array) $options)[0];
$admin_menu[] = toolbar_dropdown_item(
2020-12-18 18:27:10 +01:00
page_link_to($menu_page),
__($title),
$menu_page == $page
);
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
if (count($admin_menu) > 0) {
2023-01-22 19:16:33 +01:00
$menu[] = toolbar_dropdown(__('Admin'), $admin_menu);
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2023-01-22 19:16:33 +01:00
return join("\n", $menu);
2011-06-02 17:15:03 +02:00
}
2020-12-18 18:27:10 +01:00
/**
* @param string $page
* @param string|string[] $options
*
* @return bool
*/
function menu_is_allowed(string $page, $options)
{
$options = (array) $options;
2020-12-18 18:27:10 +01:00
$permissions = $page;
if (isset($options[1])) {
$permissions = $options[1];
}
return auth()->can($permissions);
}
/**
* Adds room navigation to the given menu.
*
2017-01-03 03:22:48 +01:00
* @param string[] $menu Rendered menu
* @return string[]
*/
2017-01-02 03:57:23 +01:00
function make_room_navigation($menu)
{
if (!auth()->can('view_rooms')) {
2017-01-02 03:57:23 +01:00
return $menu;
}
2017-01-02 15:43:36 +01:00
// Get a list of all rooms
2023-02-26 11:27:41 +01:00
$rooms = Room::orderBy('name')->get();
2017-01-02 03:57:23 +01:00
$room_menu = [];
if (auth()->can('admin_rooms')) {
2023-10-13 11:53:13 +02:00
$room_menu[] = toolbar_dropdown_item(page_link_to('admin/rooms'), __('Manage locations'), false, 'list');
2017-01-02 03:57:23 +01:00
}
if (count($room_menu) > 0) {
$room_menu[] = toolbar_dropdown_item_divider();
2017-01-02 03:57:23 +01:00
}
foreach ($rooms as $room) {
2022-12-02 23:03:23 +01:00
$room_menu[] = toolbar_dropdown_item(room_link($room), $room->name, false, 'pin-map-fill');
2017-01-02 03:57:23 +01:00
}
2017-01-03 03:22:48 +01:00
if (count($room_menu) > 0) {
2023-10-13 11:53:13 +02:00
$menu[] = toolbar_dropdown(__('Locations'), $room_menu);
2017-01-02 03:57:23 +01:00
}
2016-10-07 17:22:48 +02:00
return $menu;
}
/**
* Renders language selection.
*
* @return array
*/
function make_language_select()
{
$request = app('request');
$activeLocale = session()->get('locale');
$items = [];
foreach (config('locales') as $locale => $name) {
2023-01-22 19:16:33 +01:00
$url = url($request->getPathInfo(), [...$request->getQueryParams(), 'set-locale' => $locale]);
$items[] = toolbar_dropdown_item(
htmlspecialchars($url),
$name,
$locale == $activeLocale
);
}
return $items;
}
2020-12-18 18:27:10 +01:00
/**
* Renders a hint for new questions to answer.
*
* @return string|null
*/
function admin_new_questions()
{
if (!auth()->can('question.edit') || current_page() == 'admin/questions') {
return null;
}
$unanswered_questions = Question::unanswered()->count();
if (!$unanswered_questions) {
return null;
}
return '<a href="' . page_link_to('/admin/questions') . '">'
2020-12-18 18:27:10 +01:00
. __('There are unanswered questions!')
. '</a>';
}