summaryrefslogtreecommitdiff
path: root/includes/view
diff options
context:
space:
mode:
Diffstat (limited to 'includes/view')
-rw-r--r--includes/view/Rooms_view.php6
-rw-r--r--includes/view/ShiftCalendarRenderer.php56
-rw-r--r--includes/view/ShiftsFilterRenderer.php15
3 files changed, 68 insertions, 9 deletions
diff --git a/includes/view/Rooms_view.php b/includes/view/Rooms_view.php
index 4dbf2956..40ab9480 100644
--- a/includes/view/Rooms_view.php
+++ b/includes/view/Rooms_view.php
@@ -1,9 +1,11 @@
<?php
use Engelsystem\ShiftsFilterRenderer;
+use Engelsystem\ShiftCalendarRenderer;
-function Room_view($room, ShiftsFilterRenderer $shiftsFilterRenderer) {
+function Room_view($room, ShiftsFilterRenderer $shiftsFilterRenderer, ShiftCalendarRenderer $shiftCalendarRenderer) {
return page_with_title(glyph('map-marker') . $room['Name'], [
- $shiftsFilterRenderer->render()
+ $shiftsFilterRenderer->render(room_link($room)) ,
+ $shiftCalendarRenderer->render()
]);
}
diff --git a/includes/view/ShiftCalendarRenderer.php b/includes/view/ShiftCalendarRenderer.php
index 8356d033..41cf6f94 100644
--- a/includes/view/ShiftCalendarRenderer.php
+++ b/includes/view/ShiftCalendarRenderer.php
@@ -4,7 +4,61 @@ namespace Engelsystem;
class ShiftCalendarRenderer {
- public function __construct() {
+ /**
+ * 15m * 60s/m = 900s
+ */
+ const MINUTES_PER_ROW = 900;
+
+ private $shifts;
+
+ private $shiftsFilter;
+
+ public function __construct($shifts, ShiftsFilter $shiftsFilter) {
+ $this->shifts = $shifts;
+ $this->shiftsFilter = $shiftsFilter;
+ }
+
+ public function render() {
+ $rooms = $this->rooms();
+ $slotSizes = $this->calcSlotSizes($rooms);
+
+ return '';
+ }
+
+ /**
+ * Calculates the slots for each room that appears in the shifts
+ */
+ private function rooms() {
+ $rooms = [];
+ foreach ($this->shifts as $shift) {
+ if (! isset($rooms[$shift['RID']])) {
+ $rooms[$shift['RID']] = $shift['room_name'];
+ }
+ }
+ return $rooms;
+ }
+
+ private function calcSlotSizes($rooms) {
+ $first_block_start_time = ShiftCalendarRenderer::MINUTES_PER_ROW * floor($this->shiftsFilter->getStartTime() / ShiftCalendarRenderer::MINUTES_PER_ROW);
+ $blocks_per_slot = ceil(($this->shiftsFilter->getEndTime() - $first_block_start_time) / ShiftCalendarRenderer::MINUTES_PER_ROW);
+ $parallel_blocks = [];
+
+ // initialize $block array
+ foreach (array_keys($rooms) as $room_id) {
+ $parallel_blocks[$room_id] = array_fill(0, $blocks_per_slot, 0);
+ }
+
+ // calculate number of parallel shifts in each timeslot for each room
+ foreach ($this->shifts as $shift) {
+ $room_id = $shift["RID"];
+ $shift_blocks = ($shift["end"] - $shift["start"]) / ShiftCalendarRenderer::MINUTES_PER_ROW;
+ $firstblock = floor(($shift["start"] - $first_block_start_time) / ShiftCalendarRenderer::MINUTES_PER_ROW);
+ for ($block = $firstblock; $block < $shift_blocks + $firstblock && $block < $blocks_per_slot; $block ++) {
+ $parallel_blocks[$room_id][$block] ++;
+ }
+ }
+
+ return array_map('max', $parallel_blocks);
}
}
diff --git a/includes/view/ShiftsFilterRenderer.php b/includes/view/ShiftsFilterRenderer.php
index 94d53bb3..ff9302f7 100644
--- a/includes/view/ShiftsFilterRenderer.php
+++ b/includes/view/ShiftsFilterRenderer.php
@@ -18,10 +18,14 @@ class ShiftsFilterRenderer {
*/
private $daySelectionEnabled = false;
+ /**
+ * Days that can be selected.
+ * Format Y-m-d
+ *
+ * @var string[]
+ */
private $days = [];
- private $event_config = null;
-
public function __construct(ShiftsFilter $shiftsFilter) {
$this->shiftsFilter = $shiftsFilter;
}
@@ -31,14 +35,14 @@ class ShiftsFilterRenderer {
*
* @return Generated HTML
*/
- public function render() {
+ public function render($link_base) {
$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);
+ $day_dropdown_items[] = toolbar_item_link($link_base . '&shifts_filter_day=' . $day, '', $day);
}
$toolbar[] = toolbar_dropdown('', $selected_day, $day_dropdown_items, 'active');
}
@@ -48,10 +52,9 @@ class ShiftsFilterRenderer {
/**
* Should the filter display a day selection.
*/
- public function enableDaySelection($days, $event_config) {
+ public function enableDaySelection($days) {
$this->daySelectionEnabled = true;
$this->days = $days;
- $this->event_config = $event_config;
}
/**