From 6fff6a6c1a5a4ae6c6977c3aeb4ac532ba09a395 Mon Sep 17 00:00:00 2001 From: msquare Date: Wed, 5 Oct 2016 18:56:50 +0200 Subject: begin room view and shifts filter renderer --- includes/controller/rooms_controller.php | 80 ++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) (limited to 'includes/controller/rooms_controller.php') 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 @@ 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 -- cgit v1.2.3-70-g09d2 From 6d97aa2d273464e3cb6703a0527793c52583d4cd Mon Sep 17 00:00:00 2001 From: msquare Date: Wed, 5 Oct 2016 22:28:39 +0200 Subject: continue working on shifts calendar renderer --- includes/controller/rooms_controller.php | 22 +++++++++---- includes/model/AngelType_model.php | 11 +++---- includes/model/Shifts_model.php | 2 +- includes/view/Rooms_view.php | 6 ++-- includes/view/ShiftCalendarRenderer.php | 56 +++++++++++++++++++++++++++++++- includes/view/ShiftsFilterRenderer.php | 15 +++++---- 6 files changed, 89 insertions(+), 23 deletions(-) (limited to 'includes/controller/rooms_controller.php') diff --git a/includes/controller/rooms_controller.php b/includes/controller/rooms_controller.php index da5bdba1..4573409a 100644 --- a/includes/controller/rooms_controller.php +++ b/includes/controller/rooms_controller.php @@ -1,6 +1,7 @@ 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)) ]; } diff --git a/includes/model/AngelType_model.php b/includes/model/AngelType_model.php index d01cf905..be15dc59 100644 --- a/includes/model/AngelType_model.php +++ b/includes/model/AngelType_model.php @@ -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; - } - if (count($angelType_source) > 0) { - return $angelType_source; + $result = sql_select("SELECT `id` FROM `AngelTypes`"); + if ($result === false) { + engelsystem_error("Unable to load angeltypes."); } - return null; + return select_array($result, 'id', 'id'); } /** diff --git a/includes/model/Shifts_model.php b/includes/model/Shifts_model.php index 6721c30e..5a38abdd 100644 --- a/includes/model/Shifts_model.php +++ b/includes/model/Shifts_model.php @@ -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` 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 @@ 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; } /** -- cgit v1.2.3-70-g09d2 From 1d4811cca51a00de27328d5608dbc23e46854297 Mon Sep 17 00:00:00 2001 From: msquare Date: Sat, 8 Oct 2016 09:18:04 +0200 Subject: remove unused code --- includes/controller/rooms_controller.php | 2 -- includes/view/ShiftCalendarRenderer.php | 8 ++++---- includes/view/ShiftsFilterRenderer.php | 1 - 3 files changed, 4 insertions(+), 7 deletions(-) (limited to 'includes/controller/rooms_controller.php') diff --git a/includes/controller/rooms_controller.php b/includes/controller/rooms_controller.php index 4573409a..0e8560d5 100644 --- a/includes/controller/rooms_controller.php +++ b/includes/controller/rooms_controller.php @@ -55,8 +55,6 @@ function room_controller() { * Dispatch different room actions. */ function rooms_controller() { - global $privileges; - if (! isset($_REQUEST['action'])) { $_REQUEST['action'] = 'list'; } diff --git a/includes/view/ShiftCalendarRenderer.php b/includes/view/ShiftCalendarRenderer.php index 04ecdf61..ab13a5f3 100644 --- a/includes/view/ShiftCalendarRenderer.php +++ b/includes/view/ShiftCalendarRenderer.php @@ -44,7 +44,7 @@ class ShiftCalendarRenderer { return $shifts_table; } - private function initTableBody($rooms, $slotSizes, $first_block_start_time, $blocks_per_slot) { + private function initTableBody($slotSizes, $first_block_start_time, $blocks_per_slot) { // Slot sizes plus 1 for the time $columns_needed = array_sum($slotSizes) + 1; $table_line = array_fill(0, $columns_needed, ShiftCalendarRenderer::EMPTY_CELL); @@ -67,7 +67,7 @@ class ShiftCalendarRenderer { private function calcRoomSlots($rooms, $slotSizes) { $result = []; $slot = 1; // 1 for the time - foreach ($rooms as $room_id => $room_name) { + foreach (array_keys($rooms) as $room_id) { $result[$room_id] = $slot; $slot += $slotSizes[$room_id]; } @@ -81,7 +81,7 @@ class ShiftCalendarRenderer { } private function renderShift($shift) { - global $privileges, $user; + global $privileges; $collides = $this->collides(); $is_free = false; @@ -206,7 +206,7 @@ class ShiftCalendarRenderer { } private function renderTableBody($rooms, $slotSizes, $first_block_start_time, $blocks_per_slot) { - $table = $this->initTableBody($rooms, $slotSizes, $first_block_start_time, $blocks_per_slot); + $table = $this->initTableBody($slotSizes, $first_block_start_time, $blocks_per_slot); $room_slots = $this->calcRoomSlots($rooms, $slotSizes); diff --git a/includes/view/ShiftsFilterRenderer.php b/includes/view/ShiftsFilterRenderer.php index 289ed210..301f31a2 100644 --- a/includes/view/ShiftsFilterRenderer.php +++ b/includes/view/ShiftsFilterRenderer.php @@ -38,7 +38,6 @@ class ShiftsFilterRenderer { 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) { -- cgit v1.2.3-70-g09d2