continue working on shifts calendar renderer

This commit is contained in:
msquare 2016-10-05 22:28:39 +02:00
parent 6fff6a6c1a
commit 6d97aa2d27
6 changed files with 89 additions and 23 deletions

View File

@ -1,6 +1,7 @@
<?php
use Engelsystem\ShiftsFilterRenderer;
use Engelsystem\ShiftsFilter;
use Engelsystem\ShiftCalendarRenderer;
/**
* Room controllers for managing everything room related.
@ -26,18 +27,27 @@ function room_controller() {
}
}
$shiftsFilter = new ShiftsFilter(false, [
$shiftsFilter = new ShiftsFilter(true, [
$room['RID']
], []);
$shiftsFilter->setStartTime(time());
$shiftsFilter->setEndTime(time() + 24 * 60 * 60);
], AngelType_ids());
$selected_day = date("Y-m-d");
if (! empty($days)) {
$selected_day = $days[0];
}
if (isset($_REQUEST['shifts_filter_day'])) {
$selected_day = $_REQUEST['shifts_filter_day'];
}
$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'));
$shiftsFilterRenderer = new ShiftsFilterRenderer($shiftsFilter);
$shiftsFilterRenderer->enableDaySelection($days, EventConfig());
$shiftsFilterRenderer->enableDaySelection($days);
$shifts = Shifts_by_ShiftsFilter($shiftsFilter, $user);
return [
$room['Name'],
Room_view($room, $shiftsFilterRenderer)
Room_view($room, $shiftsFilterRenderer, new ShiftCalendarRenderer($shifts, $shiftsFilter))
];
}

View File

@ -124,14 +124,11 @@ function AngelTypes() {
* Returns AngelType id array
*/
function AngelType_ids() {
$angelType_source = sql_select("SELECT `id` FROM `AngelTypes`");
if ($angelType_source === false) {
return false;
$result = sql_select("SELECT `id` FROM `AngelTypes`");
if ($result === false) {
engelsystem_error("Unable to load angeltypes.");
}
if (count($angelType_source) > 0) {
return $angelType_source;
}
return null;
return select_array($result, 'id', 'id');
}
/**

View File

@ -49,7 +49,7 @@ function Shifts_by_ShiftsFilter(ShiftsFilter $shiftsFilter, $user) {
AND `ShiftEntry`.`SID` = `Shifts`.`SID`
)
)";
} elseif ($_SESSION['user_shifts']['filled'][0] == 1) {
} elseif ($_SESSION['user_shifts']['filled'][0] == ShiftsFilter::FILLED_FILLED) {
$SQL .= "
AND (
nat.`count` <= entries.`count`

View File

@ -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()
]);
}

View File

@ -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);
}
}

View File

@ -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;
}
/**