getStartTime(); if ($start_time == null) { $start_time = time(); } $end_time = $shiftsFilter->getEndTime(); if ($end_time == null) { $end_time = $start_time + 24 * 60 * 60; } $shiftsFilter->setStartTime(check_request_datetime('start_day', 'start_time', $days, $start_time)); $shiftsFilter->setEndTime(check_request_datetime('end_day', 'end_time', $days, $end_time)); if ($shiftsFilter->getStartTime() > $shiftsFilter->getEndTime()) { $shiftsFilter->setEndTime($shiftsFilter->getStartTime() + 24 * 60 * 60); } } /** * Update given ShiftsFilter with filter params from user input * * @param ShiftsFilter $shiftsFilter * The shifts filter to update from request data * @param boolean $user_shifts_admin * Has the user user_shift_admin privilege? * @param string[] $days * An array of available filter days */ function update_ShiftsFilter(ShiftsFilter $shiftsFilter, $user_shifts_admin, $days) { $shiftsFilter->setUserShiftsAdmin($user_shifts_admin); $shiftsFilter->setFilled(check_request_int_array('filled', $shiftsFilter->getFilled())); $shiftsFilter->setRooms(check_request_int_array('rooms', $shiftsFilter->getRooms())); $shiftsFilter->setTypes(check_request_int_array('types', $shiftsFilter->getTypes())); update_ShiftsFilter_timerange($shiftsFilter, $days); } function load_rooms() { $rooms = sql_select("SELECT `RID` AS `id`, `Name` AS `name` FROM `Room` WHERE `show`='Y' ORDER BY `Name`"); if (count($rooms) == 0) { error(_("The administration has not configured any rooms yet.")); redirect('?'); } return $rooms; } function load_days() { $days = sql_select_single_col(" SELECT DISTINCT DATE(FROM_UNIXTIME(`start`)) AS `id`, DATE(FROM_UNIXTIME(`start`)) AS `name` FROM `Shifts` ORDER BY `start`"); if (count($days) == 0) { error(_("The administration has not configured any shifts yet.")); redirect('?'); } return $days; } function load_types() { global $user; if (sql_num_query("SELECT `id`, `name` FROM `AngelTypes` WHERE `restricted` = 0") == 0) { error(_("The administration has not configured any angeltypes yet - or you are not subscribed to any angeltype.")); redirect('?'); } $types = sql_select("SELECT `AngelTypes`.`id`, `AngelTypes`.`name`, (`AngelTypes`.`restricted`=0 OR (NOT `UserAngelTypes`.`confirm_user_id` IS NULL OR `UserAngelTypes`.`id` IS NULL)) as `enabled` FROM `AngelTypes` LEFT JOIN `UserAngelTypes` ON (`UserAngelTypes`.`angeltype_id`=`AngelTypes`.`id` AND `UserAngelTypes`.`user_id`='" . sql_escape($user['UID']) . "') ORDER BY `AngelTypes`.`name`"); if (empty($types)) { return sql_select("SELECT `id`, `name` FROM `AngelTypes` WHERE `restricted` = 0"); } return $types; } function view_user_shifts() { global $user, $privileges; global $ical_shifts; $ical_shifts = []; $days = load_days(); $rooms = load_rooms(); $types = load_types(); if (! isset($_SESSION['ShiftsFilter'])) { $room_ids = array_map('get_ids_from_array', $rooms); $type_ids = array_map('get_ids_from_array', $types); $_SESSION['ShiftsFilter'] = new ShiftsFilter(in_array('user_shifts_admin', $privileges), $room_ids, $type_ids); } update_ShiftsFilter($_SESSION['ShiftsFilter'], in_array('user_shifts_admin', $privileges), $days); $shiftsFilter = $_SESSION['ShiftsFilter']; $shifts = Shifts_by_ShiftsFilter($shiftsFilter, $user); $ownshifts_source = sql_select(" SELECT `ShiftTypes`.`name`, `Shifts`.* FROM `Shifts` INNER JOIN `ShiftTypes` ON (`ShiftTypes`.`id` = `Shifts`.`shifttype_id`) INNER JOIN `ShiftEntry` ON (`Shifts`.`SID` = `ShiftEntry`.`SID` AND `ShiftEntry`.`UID` = '" . sql_escape($user['UID']) . "') WHERE `Shifts`.`RID` IN (" . implode(',', $shiftsFilter->getRooms()) . ") AND `start` BETWEEN " . $shiftsFilter->getStartTime() . " AND " . $shiftsFilter->getEndTime()); $ownshifts = []; foreach ($ownshifts_source as $ownshift) { $ownshifts[$ownshift['SID']] = $ownshift; } unset($ownshifts_source); if ($user['api_key'] == "") { User_reset_api_key($user, false); } $filled = [ [ 'id' => '1', 'name' => _("occupied") ], [ 'id' => '0', 'name' => _("free") ] ]; $start_day = date("Y-m-d", $shiftsFilter->getStartTime()); $start_time = date("H:i", $shiftsFilter->getStartTime()); $end_day = date("Y-m-d", $shiftsFilter->getEndTime()); $end_time = date("H:i", $shiftsFilter->getEndTime()); $shiftCalendarRenderer = new ShiftCalendarRenderer($shifts, $shiftsFilter); return page([ div('col-md-12', [ msg(), template_render('../templates/user_shifts.html', [ 'title' => shifts_title(), 'room_select' => make_select($rooms, $shiftsFilter->getRooms(), "rooms", _("Rooms")), 'start_select' => html_select_key("start_day", "start_day", array_combine($days, $days), $start_day), 'start_time' => $start_time, 'end_select' => html_select_key("end_day", "end_day", array_combine($days, $days), $end_day), 'end_time' => $end_time, 'type_select' => make_select($types, $shiftsFilter->getTypes(), "types", _("Angeltypes") . '1'), 'filled_select' => make_select($filled, $shiftsFilter->getFilled(), "filled", _("Occupancy")), 'task_notice' => '1' . _("The tasks shown here are influenced by the angeltypes you joined already!") . " " . _("Description of the jobs.") . "", 'shifts_table' => msg() . $shiftCalendarRenderer->render(), 'ical_text' => '

' . _("iCal export") . '

' . sprintf(_("Export of shown shifts. iCal format or JSON format available (please keep secret, otherwise reset the api key)."), page_link_to_absolute('ical') . '&key=' . $user['api_key'], page_link_to_absolute('shifts_json_export') . '&key=' . $user['api_key'], page_link_to('user_myshifts') . '&reset') . '

', 'filter' => _("Filter") ]) ]) ]); } function get_ids_from_array($array) { return $array["id"]; } function make_select($items, $selected, $name, $title = null) { $html_items = []; if (isset($title)) { $html_items[] = '

' . $title . '

' . "\n"; } foreach ($items as $i) { $html_items[] = '
' . (! isset($i['enabled']) || $i['enabled'] ? '' : glyph("lock")) . '

'; } $html = '
' . "\n"; $html .= implode("\n", $html_items); $html .= buttons([ button("javascript: checkAll('selection_" . $name . "', true)", _("All"), ""), button("javascript: checkAll('selection_" . $name . "', false)", _("None"), "") ]); $html .= '
' . "\n"; return $html; } ?>