From 928e707015fa5b9b3e2dd52c9493552ae1218911 Mon Sep 17 00:00:00 2001 From: msquare Date: Fri, 24 Nov 2017 12:01:19 +0100 Subject: add shift calendar to angeltype view --- includes/controller/angeltypes_controller.php | 61 +++++++++++++- includes/model/Room_model.php | 11 +++ includes/model/Shifts_model.php | 25 +++++- includes/sys_template.php | 26 ++++++ includes/view/AngelTypes_view.php | 111 +++++++++++++++++++------- includes/view/Rooms_view.php | 5 +- includes/view/ShiftCalendarRenderer.php | 2 +- includes/view/ShiftsFilterRenderer.php | 10 +-- 8 files changed, 211 insertions(+), 40 deletions(-) (limited to 'includes') diff --git a/includes/controller/angeltypes_controller.php b/includes/controller/angeltypes_controller.php index eaaa9c0f..5c3bd859 100644 --- a/includes/controller/angeltypes_controller.php +++ b/includes/controller/angeltypes_controller.php @@ -1,5 +1,7 @@ enableDaySelection($days); + + $shiftCalendarRenderer = shiftCalendarRendererByShiftFilter($shiftsFilter); return [ sprintf(_('Team %s'), $angeltype['name']), @@ -193,11 +203,60 @@ function angeltype_controller() in_array('admin_angel_types', $privileges), $user_angeltype['supporter'], $user_driver_license, - $user + $user, + $shiftsFilterRenderer, + $shiftCalendarRenderer ) ]; } +/** + * On which days do shifts for this angeltype occur? Needed for shiftCalendar. + * + * @param Angeltype $angeltype + * @return array + */ +function angeltype_controller_shiftsFilterDays($angeltype) { + $all_shifts = Shifts_by_angeltype($angeltype); + $days = []; + foreach ($all_shifts as $shift) { + $day = date('Y-m-d', $shift['start']); + if (!in_array($day, $days)) { + $days[] = $day; + } + } + return $days; +} + +/** + * Sets up the shift filter for the angeltype. + * + * @param Angeltype $angeltype + * @param array $days + * @return ShiftsFilter + */ +function angeltype_controller_shiftsFilter($angeltype, $days) { + global $privileges; + + $request = request(); + $shiftsFilter = new ShiftsFilter( + in_array('user_shifts_admin', $privileges), + Room_ids(), + [$angeltype['id']] + ); + $selected_day = date('Y-m-d'); + if (!empty($days)) { + $selected_day = $days[0]; + } + if ($request->has('shifts_filter_day')) { + $selected_day = $request->input('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')); + + return $shiftsFilter; +} + /** * View a list of all angeltypes. * diff --git a/includes/model/Room_model.php b/includes/model/Room_model.php index 8425e5ad..74a08be4 100644 --- a/includes/model/Room_model.php +++ b/includes/model/Room_model.php @@ -13,6 +13,17 @@ function Rooms($show_all = false) return DB::select('SELECT * FROM `Room`' . ($show_all ? '' : ' WHERE `show`=\'Y\'') . ' ORDER BY `Name`'); } +/** + * Returns Room id array + * + * @return array + */ +function Room_ids() +{ + $result = DB::select('SELECT `RID` FROM `Room`'); + return select_array($result, 'RID', 'RID'); +} + /** * Delete a room * diff --git a/includes/model/Shifts_model.php b/includes/model/Shifts_model.php index ef02aaab..8a1b69f9 100644 --- a/includes/model/Shifts_model.php +++ b/includes/model/Shifts_model.php @@ -4,6 +4,29 @@ use Engelsystem\Database\DB; use Engelsystem\ShiftsFilter; use Engelsystem\ShiftSignupState; +/** + * @param array $angeltype + * @return array + */ +function Shifts_by_angeltype($angeltype) { + return DB::select(' + SELECT DISTINCT `Shifts`.* FROM `Shifts` + JOIN `NeededAngelTypes` ON `NeededAngelTypes`.`shift_id` = `Shifts`.`SID` + WHERE `NeededAngelTypes`.`angel_type_id` = ? + AND `NeededAngelTypes`.`count` > 0 + AND `Shifts`.`PSID` IS NULL + + UNION + + SELECT DISTINCT `Shifts`.* FROM `Shifts` + JOIN `NeededAngelTypes` ON `NeededAngelTypes`.`room_id` = `Shifts`.`RID` + WHERE `NeededAngelTypes`.`angel_type_id` = ? + AND `NeededAngelTypes`.`count` > 0 + AND NOT `Shifts`.`PSID` IS NULL + ', [$angeltype['id'], $angeltype['id']]); +} + + /** * @param array $room * @return array @@ -24,7 +47,7 @@ function Shifts_by_ShiftsFilter(ShiftsFilter $shiftsFilter) FROM `Shifts` JOIN `Room` USING (`RID`) JOIN `ShiftTypes` ON `ShiftTypes`.`id` = `Shifts`.`shifttype_id` - JOIN `NeededAngelTypes` ON `NeededAngelTypes`.`shift_id`=`Shifts`.`SID` + JOIN `NeededAngelTypes` ON `NeededAngelTypes`.`shift_id` = `Shifts`.`SID` WHERE `Shifts`.`RID` IN (' . implode(',', $shiftsFilter->getRooms()) . ') AND `start` BETWEEN ? AND ? AND `NeededAngelTypes`.`angel_type_id` IN (' . implode(',', $shiftsFilter->getTypes()) . ') diff --git a/includes/sys_template.php b/includes/sys_template.php index 662283b1..96290062 100644 --- a/includes/sys_template.php +++ b/includes/sys_template.php @@ -1,5 +1,31 @@ $content) { + $class = ''; + if(count($tab_header) == 0) { + $class = 'active'; + } + $tab_header[] = ''; + $tab_content[] = '
' . $content . '
'; + } + return div('', [ + '', + '
' . join($tab_content) . '
' + ]); +} + /** * Display muted (grey) text. * diff --git a/includes/view/AngelTypes_view.php b/includes/view/AngelTypes_view.php index 6e70b3be..e42321af 100644 --- a/includes/view/AngelTypes_view.php +++ b/includes/view/AngelTypes_view.php @@ -1,5 +1,7 @@ AngelType_view_info( + $angeltype, + $members, + $admin_user_angeltypes, + $admin_angeltypes, + $supporter + ), + _('Shifts') => AngelType_view_shifts( + $angeltype, + $shiftsFilterRenderer, + $shiftCalendarRenderer + ) + ]) + ]); +} +/** + * @param Angeltype $angeltype + * @param ShiftsFilterRenderer $shiftsFilterRenderer + * @param ShiftCalendarRenderer $shiftCalendarRenderer + * @return string HTML + */ +function AngelType_view_shifts($angeltype, $shiftsFilterRenderer, $shiftCalendarRenderer) +{ + $shifts = $shiftsFilterRenderer->render(page_link_to('angeltypes', [ + 'action' => 'view', + 'angeltype_id' => $angeltype['id'] + ])); + $shifts .= $shiftCalendarRenderer->render(); + + return div('first', $shifts); +} + +/** + * @param Angeltype $angeltype + * @param array $members + * @param bool $admin_user_angeltypes + * @param bool $admin_angeltypes + * @param bool $supporter + * @return string HTML + */ +function AngelType_view_info( + $angeltype, + $members, + $admin_user_angeltypes, + $admin_angeltypes, + $supporter +) { + $info = []; if(AngelType_has_contact_info($angeltype)) { - $page[] = AngelTypes_render_contact_info($angeltype); + $info[] = AngelTypes_render_contact_info($angeltype); } - $page[] = '

' . _('Description') . '

'; + $info[] = '

' . _('Description') . '

'; $parsedown = new Parsedown(); if ($angeltype['description'] != '') { - $page[] = '
' . $parsedown->parse($angeltype['description']) . '
'; + $info[] = '
' . $parsedown->parse($angeltype['description']) . '
'; } - + list($supporters, $members_confirmed, $members_unconfirmed) = AngelType_view_members( $angeltype, $members, $admin_user_angeltypes, $admin_angeltypes - ); + ); $table_headers = AngelType_view_table_headers($angeltype, $supporter, $admin_angeltypes); - + if (count($supporters) > 0) { - $page[] = '

' . _('supporters') . '

'; - $page[] = table($table_headers, $supporters); + $info[] = '

' . _('supporters') . '

'; + $info[] = table($table_headers, $supporters); } - + if (count($members_confirmed) > 0) { $members_confirmed[] = [ 'Nick' => _('Sum'), @@ -357,7 +409,7 @@ function AngelType_view( 'actions' => '' ]; } - + if (count($members_unconfirmed) > 0) { $members_unconfirmed[] = [ 'Nick' => _('Sum'), @@ -365,40 +417,40 @@ function AngelType_view( 'actions' => '' ]; } - - $page[] = '

' . _('Members') . '

'; + + $info[] = '

' . _('Members') . '

'; if ($admin_user_angeltypes) { - $page[] = buttons([ + $info[] = buttons([ button( page_link_to( 'user_angeltypes', ['action' => 'add', 'angeltype_id' => $angeltype['id']] - ), + ), _('Add'), 'add' - ) + ) ]); } - $page[] = table($table_headers, $members_confirmed); - + $info[] = table($table_headers, $members_confirmed); + if ($admin_user_angeltypes && $angeltype['restricted'] && count($members_unconfirmed) > 0) { - $page[] = '

' . _('Unconfirmed') . '

'; - $page[] = buttons([ + $info[] = '

' . _('Unconfirmed') . '

'; + $info[] = buttons([ button( page_link_to('user_angeltypes', ['action' => 'confirm_all', 'angeltype_id' => $angeltype['id']]), _('confirm all'), 'ok' - ), + ), button( page_link_to('user_angeltypes', ['action' => 'delete_all', 'angeltype_id' => $angeltype['id']]), _('deny all'), 'cancel' - ) + ) ]); - $page[] = table($table_headers, $members_unconfirmed); + $info[] = table($table_headers, $members_unconfirmed); } - - return page_with_title(sprintf(_('Team %s'), $angeltype['name']), $page); + + return join($info); } /** @@ -407,7 +459,8 @@ function AngelType_view( * @param Anteltype $angeltype * @return string HTML */ -function AngelTypes_render_contact_info($angeltype) { +function AngelTypes_render_contact_info($angeltype) +{ return heading(_('Contact'), 3) . description([ _('Name') => $angeltype['contact_name'], _('DECT') => $angeltype['contact_dect'], diff --git a/includes/view/Rooms_view.php b/includes/view/Rooms_view.php index adb58a9a..bd6138e1 100644 --- a/includes/view/Rooms_view.php +++ b/includes/view/Rooms_view.php @@ -19,7 +19,10 @@ function Room_view($room, ShiftsFilterRenderer $shiftsFilterRenderer, ShiftCalen } return page_with_title(glyph('map-marker') . $room['Name'], [ - $shiftsFilterRenderer->render($room), + $shiftsFilterRenderer->render(page_link_to('rooms', [ + 'action' => 'view', + 'room_id' => $room['RID'] + ])), $assignNotice, $shiftCalendarRenderer->render() ]); diff --git a/includes/view/ShiftCalendarRenderer.php b/includes/view/ShiftCalendarRenderer.php index d2becb58..354d0336 100644 --- a/includes/view/ShiftCalendarRenderer.php +++ b/includes/view/ShiftCalendarRenderer.php @@ -143,7 +143,7 @@ class ShiftCalendarRenderer public function render() { if (count($this->lanes) == 0) { - return ''; + return info(_('No shifts found.'), true); } return div('shift-calendar', [ $this->renderTimeLane(), diff --git a/includes/view/ShiftsFilterRenderer.php b/includes/view/ShiftsFilterRenderer.php index c3e0ccf1..27c6240a 100644 --- a/includes/view/ShiftsFilterRenderer.php +++ b/includes/view/ShiftsFilterRenderer.php @@ -39,21 +39,17 @@ class ShiftsFilterRenderer /** * Renders the filter. * - * @param array $room + * @param string $page_link Link pointing to the actual page. * @return string Generated HTML */ - public function render($room) + public function render($page_link) { $toolbar = []; if ($this->daySelectionEnabled && !empty($this->days)) { $selected_day = date('Y-m-d', $this->shiftsFilter->getStartTime()); $day_dropdown_items = []; foreach ($this->days as $day) { - $link = page_link_to('rooms', [ - 'action' => 'view', - 'room_id' => $room['RID'], - 'shifts_filter_day' => $day, - ]); + $link = $page_link . '&shifts_filter_day=' . $day; $day_dropdown_items[] = toolbar_item_link($link, '', $day); } $toolbar[] = toolbar_dropdown('', $selected_day, $day_dropdown_items, 'active'); -- cgit v1.3.1