summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--db/update.sql2
-rw-r--r--includes/controller/rooms_controller.php80
-rw-r--r--includes/engelsystem_provider.php1
-rw-r--r--includes/model/Shifts_model.php8
-rw-r--r--includes/pages/admin_rooms.php2
-rw-r--r--includes/sys_menu.php28
-rw-r--r--includes/sys_template.php4
-rw-r--r--includes/view/Rooms_view.php7
-rw-r--r--includes/view/ShiftsFilterRenderer.php65
-rw-r--r--public/index.php3
10 files changed, 199 insertions, 1 deletions
diff --git a/db/update.sql b/db/update.sql
index e69de29b..5c5688e7 100644
--- a/db/update.sql
+++ b/db/update.sql
@@ -0,0 +1,2 @@
+INSERT INTO `Privileges` (`id`, `name`, `desc`) VALUES (40, 'view_rooms', 'User can view rooms');
+INSERT INTO `GroupPrivileges` (`id`, `group_id`, `privilege_id`) VALUES (NULL, '-2', '40');
diff --git a/includes/controller/rooms_controller.php b/includes/controller/rooms_controller.php
index 5d55e1b7..da5bdba1 100644
--- a/includes/controller/rooms_controller.php
+++ b/includes/controller/rooms_controller.php
@@ -1,7 +1,87 @@
<?php
+use Engelsystem\ShiftsFilterRenderer;
+use Engelsystem\ShiftsFilter;
+
+/**
+ * Room controllers for managing everything room related.
+ */
+
+/**
+ * View a room with its shifts.
+ */
+function room_controller() {
+ global $privileges, $user;
+
+ if (! in_array('view_rooms', $privileges)) {
+ redirect(page_link_to());
+ }
+
+ $room = load_room();
+ $all_shifts = Shifts_by_room($room);
+ $days = [];
+ foreach ($all_shifts as $shift) {
+ $day = date("Y-m-d", $shift['start']);
+ if (! in_array($day, $days)) {
+ $days[] = $day;
+ }
+ }
+
+ $shiftsFilter = new ShiftsFilter(false, [
+ $room['RID']
+ ], []);
+ $shiftsFilter->setStartTime(time());
+ $shiftsFilter->setEndTime(time() + 24 * 60 * 60);
+
+ $shiftsFilterRenderer = new ShiftsFilterRenderer($shiftsFilter);
+ $shiftsFilterRenderer->enableDaySelection($days, EventConfig());
+
+ return [
+ $room['Name'],
+ Room_view($room, $shiftsFilterRenderer)
+ ];
+}
+
+/**
+ * Dispatch different room actions.
+ */
+function rooms_controller() {
+ global $privileges;
+
+ if (! isset($_REQUEST['action'])) {
+ $_REQUEST['action'] = 'list';
+ }
+
+ switch ($_REQUEST['action']) {
+ default:
+ case 'list':
+ redirect(page_link_to('admin_rooms'));
+ case 'view':
+ return room_controller();
+ }
+}
function room_link($room) {
+ return page_link_to('rooms') . '&action=view&room_id=' . $room['RID'];
+}
+
+function room_edit_link($room) {
return page_link_to('admin_rooms') . '&show=edit&id=' . $room['RID'];
}
+/**
+ * Loads room by request param room_id
+ */
+function load_room() {
+ if (! test_request_int('room_id')) {
+ redirect(page_link_to());
+ }
+
+ $room = Room($_REQUEST['room_id']);
+ if ($room == null) {
+ redirect(page_link_to());
+ }
+
+ return $room;
+}
+
?> \ No newline at end of file
diff --git a/includes/engelsystem_provider.php b/includes/engelsystem_provider.php
index c6d34d1a..dbf7c54f 100644
--- a/includes/engelsystem_provider.php
+++ b/includes/engelsystem_provider.php
@@ -30,6 +30,7 @@ require_once realpath(__DIR__ . '/../includes/view/EventConfig_view.php');
require_once realpath(__DIR__ . '/../includes/view/Questions_view.php');
require_once realpath(__DIR__ . '/../includes/view/Rooms_view.php');
require_once realpath(__DIR__ . '/../includes/view/ShiftCalendarRenderer.php');
+require_once realpath(__DIR__ . '/../includes/view/ShiftsFilterRenderer.php');
require_once realpath(__DIR__ . '/../includes/view/Shifts_view.php');
require_once realpath(__DIR__ . '/../includes/view/ShiftEntry_view.php');
require_once realpath(__DIR__ . '/../includes/view/ShiftTypes_view.php');
diff --git a/includes/model/Shifts_model.php b/includes/model/Shifts_model.php
index 8c251209..6721c30e 100644
--- a/includes/model/Shifts_model.php
+++ b/includes/model/Shifts_model.php
@@ -1,6 +1,14 @@
<?php
use Engelsystem\ShiftsFilter;
+function Shifts_by_room($room) {
+ $result = sql_select("SELECT * FROM `Shifts` WHERE `RID`=" . sql_escape($room['RID']));
+ if ($result === false) {
+ engelsystem_error("Unable to load shifts.");
+ }
+ return $result;
+}
+
function Shifts_by_ShiftsFilter(ShiftsFilter $shiftsFilter, $user) {
$SQL = "SELECT DISTINCT `Shifts`.*, `ShiftTypes`.`name`, `Room`.`Name` as `room_name`, nat2.`special_needs` > 0 AS 'has_special_needs'
FROM `Shifts`
diff --git a/includes/pages/admin_rooms.php b/includes/pages/admin_rooms.php
index 186a676e..7a0f7a31 100644
--- a/includes/pages/admin_rooms.php
+++ b/includes/pages/admin_rooms.php
@@ -9,7 +9,7 @@ function admin_rooms() {
$rooms = [];
foreach ($rooms_source as $room) {
$rooms[] = [
- 'name' => $room['Name'],
+ 'name' => Room_name_render($room),
'from_pentabarf' => $room['FromPentabarf'] == 'Y' ? '&#10003;' : '',
'public' => $room['show'] == 'Y' ? '&#10003;' : '',
'actions' => buttons([
diff --git a/includes/sys_menu.php b/includes/sys_menu.php
index 112c490f..a5971ace 100644
--- a/includes/sys_menu.php
+++ b/includes/sys_menu.php
@@ -129,6 +129,8 @@ function make_navigation() {
}
}
+ $menu = make_room_navigation($menu);
+
$admin_menu = [];
$admin_pages = [
"admin_arrive" => admin_arrive_title(),
@@ -158,6 +160,32 @@ function make_navigation() {
return toolbar($menu);
}
+/**
+ * Adds room navigation to the given menu.
+ *
+ * @param string[] $menu
+ * Rendered menu
+ */
+function make_room_navigation($menu) {
+ global $privileges;
+
+ $rooms = Rooms();
+ $room_menu = [];
+ if (in_array('admin_rooms', $privileges)) {
+ $room_menu[] = toolbar_item_link(page_link_to('admin_rooms'), 'list', _("Manage rooms"));
+ }
+ if (count($room_menu) > 0) {
+ $room_menu[] = toolbar_item_divider();
+ }
+ foreach ($rooms as $room) {
+ $room_menu[] = toolbar_item_link(room_link($room), 'map-marker', $room['Name']);
+ }
+ if (count($room_menu > 0)) {
+ $menu[] = toolbar_dropdown('map-marker', _("Rooms"), $room_menu);
+ }
+ return $menu;
+}
+
function make_menu() {
return make_navigation();
}
diff --git a/includes/sys_template.php b/includes/sys_template.php
index 5b6caade..9bede1ee 100644
--- a/includes/sys_template.php
+++ b/includes/sys_template.php
@@ -60,6 +60,10 @@ function toolbar($items = [], $right = false) {
return '<ul class="nav navbar-nav' . ($right ? ' navbar-right' : '') . '">' . join("\n", $items) . '</ul>';
}
+function toolbar_pills($items) {
+ return '<ul class="nav nav-pills">' . join("\n", $items) . '</ul>';
+}
+
/**
* Render a link for a toolbar.
*
diff --git a/includes/view/Rooms_view.php b/includes/view/Rooms_view.php
index c820e983..4dbf2956 100644
--- a/includes/view/Rooms_view.php
+++ b/includes/view/Rooms_view.php
@@ -1,4 +1,11 @@
<?php
+use Engelsystem\ShiftsFilterRenderer;
+
+function Room_view($room, ShiftsFilterRenderer $shiftsFilterRenderer) {
+ return page_with_title(glyph('map-marker') . $room['Name'], [
+ $shiftsFilterRenderer->render()
+ ]);
+}
function Room_name_render($room) {
global $privileges;
diff --git a/includes/view/ShiftsFilterRenderer.php b/includes/view/ShiftsFilterRenderer.php
new file mode 100644
index 00000000..94d53bb3
--- /dev/null
+++ b/includes/view/ShiftsFilterRenderer.php
@@ -0,0 +1,65 @@
+<?php
+
+namespace Engelsystem;
+
+class ShiftsFilterRenderer {
+
+ /**
+ * The shiftFilter to render.
+ *
+ * @var ShiftsFilter
+ */
+ private $shiftsFilter;
+
+ /**
+ * Should the filter display a day selection.
+ *
+ * @var boolean
+ */
+ private $daySelectionEnabled = false;
+
+ private $days = [];
+
+ private $event_config = null;
+
+ public function __construct(ShiftsFilter $shiftsFilter) {
+ $this->shiftsFilter = $shiftsFilter;
+ }
+
+ /**
+ * Renders the filter.
+ *
+ * @return Generated HTML
+ */
+ public function render() {
+ $toolbar = [];
+ if ($this->daySelectionEnabled && ! empty($this->days)) {
+ $today = date("Y-m-d");
+ $selected_day = date("Y-m-d", $this->shiftsFilter->getStartTime());
+ $day_dropdown_items = [];
+ foreach ($this->days as $day) {
+ $day_dropdown_items[] = toolbar_item_link('', '', $day);
+ }
+ $toolbar[] = toolbar_dropdown('', $selected_day, $day_dropdown_items, 'active');
+ }
+ return toolbar_pills($toolbar);
+ }
+
+ /**
+ * Should the filter display a day selection.
+ */
+ public function enableDaySelection($days, $event_config) {
+ $this->daySelectionEnabled = true;
+ $this->days = $days;
+ $this->event_config = $event_config;
+ }
+
+ /**
+ * Should the filter display a day selection.
+ */
+ public function isDaySelectionEnabled() {
+ return $this->daySelectionEnabled;
+ }
+}
+
+?> \ No newline at end of file
diff --git a/public/index.php b/public/index.php
index 996c2b77..e1af1000 100644
--- a/public/index.php
+++ b/public/index.php
@@ -9,6 +9,7 @@ $free_pages = [
'credits',
'ical',
'login',
+ 'rooms',
'shifts',
'shifts_json_export',
'shifts_json_export_all',
@@ -68,6 +69,8 @@ if (isset($_REQUEST['p']) && preg_match("/^[a-z0-9_]*$/i", $_REQUEST['p']) && (i
list($title, $content) = shifttypes_controller();
} elseif ($page == "admin_event_config") {
list($title, $content) = event_config_edit_controller();
+ } elseif ($page == "rooms") {
+ list($title, $content) = rooms_controller();
} elseif ($page == "news") {
$title = news_title();
$content = user_news();