diff options
author | Philip Häusler <msquare@notrademark.de> | 2014-08-23 01:55:18 +0200 |
---|---|---|
committer | Philip Häusler <msquare@notrademark.de> | 2014-08-23 01:55:18 +0200 |
commit | f5a094fd8b32d44767f7fc30a65f407f4e1d9945 (patch) | |
tree | eac9a223e103c3066ef6e0b57e0bf215eaa89a72 /includes | |
parent | 74647e16d37fac9425a4561b49618b52cdc3e75c (diff) |
add user view, better bootstrap
Diffstat (limited to 'includes')
-rw-r--r-- | includes/controller/user_angeltypes_controller.php | 2 | ||||
-rw-r--r-- | includes/controller/users_controller.php | 15 | ||||
-rw-r--r-- | includes/model/AngelType_model.php | 3 | ||||
-rw-r--r-- | includes/model/ShiftEntry_model.php | 20 | ||||
-rw-r--r-- | includes/model/Shifts_model.php | 137 | ||||
-rw-r--r-- | includes/model/UserAngelTypes_model.php | 9 | ||||
-rw-r--r-- | includes/model/UserGroups_model.php | 17 | ||||
-rw-r--r-- | includes/model/User_model.php | 28 | ||||
-rw-r--r-- | includes/pages/admin_questions.php | 2 | ||||
-rw-r--r-- | includes/pages/user_messages.php | 2 | ||||
-rw-r--r-- | includes/pages/user_myshifts.php | 82 | ||||
-rw-r--r-- | includes/pages/user_news.php | 2 | ||||
-rw-r--r-- | includes/pages/user_shifts.php | 4 | ||||
-rw-r--r-- | includes/sys_menu.php | 2 | ||||
-rw-r--r-- | includes/sys_template.php | 7 | ||||
-rw-r--r-- | includes/view/User_view.php | 148 |
16 files changed, 322 insertions, 158 deletions
diff --git a/includes/controller/user_angeltypes_controller.php b/includes/controller/user_angeltypes_controller.php index cb8c72ae..deb9b7f3 100644 --- a/includes/controller/user_angeltypes_controller.php +++ b/includes/controller/user_angeltypes_controller.php @@ -12,7 +12,7 @@ function user_angeltypes_unconfirmed_hint() { return ''; if ($_REQUEST['p'] == 'angeltypes' && $_REQUEST['action'] == 'view' && $_REQUEST['angeltype_id'] == $unconfirmed_user_angeltypes[0]['angeltype_id']) return ''; - return error(sprintf(ngettext("There is %d unconfirmed angeltype.", "There are %d unconfirmed angeltypes.", count($unconfirmed_user_angeltypes)), count($unconfirmed_user_angeltypes)) . " " . sprintf(_("The first wants to join %s."), '<a href="' . page_link_to('angeltypes') . '&action=view&angeltype_id=' . $unconfirmed_user_angeltypes[0]['angeltype_id'] . '">' . $unconfirmed_user_angeltypes[0]['name'] . '</a>'), true); + return error(sprintf(ngettext("There is %d unconfirmed angeltype.", "There are %d unconfirmed angeltypes.", count($unconfirmed_user_angeltypes)), count($unconfirmed_user_angeltypes)) . " " . sprintf(_("The first wants to join %s."), '<a href="' . page_link_to('angeltypes') . '&action=view&angeltype_id=' . $unconfirmed_user_angeltypes[0]['angeltype_id'] . '">' . $unconfirmed_user_angeltypes[0]['name'] . '</a>')); } /** diff --git a/includes/controller/users_controller.php b/includes/controller/users_controller.php index f65f54e3..77997278 100644 --- a/includes/controller/users_controller.php +++ b/includes/controller/users_controller.php @@ -35,9 +35,22 @@ function user_controller() { $admin_user_privilege = in_array('admin_user', $privileges); + $shifts = Shifts_by_user($user_source); + foreach ($shifts as &$shift) { + $shift['needed_angeltypes'] = sql_select("SELECT DISTINCT `AngelTypes`.* FROM `ShiftEntry` JOIN `AngelTypes` ON `ShiftEntry`.`TID`=`AngelTypes`.`id` WHERE `ShiftEntry`.`SID`=" . sql_escape($shift['SID']) . " ORDER BY `AngelTypes`.`name`"); + foreach ($shift['needed_angeltypes'] as &$needed_angeltype) { + $needed_angeltype['users'] = sql_select(" + SELECT `ShiftEntry`.`freeloaded`, `User`.* + FROM `ShiftEntry` + JOIN `User` ON `ShiftEntry`.`UID`=`User`.`UID` + WHERE `ShiftEntry`.`SID`=" . sql_escape($shift['SID']) . " + AND `ShiftEntry`.`TID`=" . sql_escape($needed_angeltype['id'])); + } + } + return array( $user_source['Nick'], - User_view($user_source) + User_view($user_source, $admin_user_privilege, User_is_freeloader($user_source), User_shift_state($user_source), User_angeltypes($user_source), User_groups($user_source), $shifts, $user['UID'] == $user_source['UID']) ); } diff --git a/includes/model/AngelType_model.php b/includes/model/AngelType_model.php index df5e6ae1..d0119e6f 100644 --- a/includes/model/AngelType_model.php +++ b/includes/model/AngelType_model.php @@ -2,7 +2,8 @@ /** * Delete an Angeltype. - * @param Angeltype $angeltype + * + * @param Angeltype $angeltype */ function AngelType_delete($angeltype) { return sql_query(" diff --git a/includes/model/ShiftEntry_model.php b/includes/model/ShiftEntry_model.php index 97fdf784..332620f6 100644 --- a/includes/model/ShiftEntry_model.php +++ b/includes/model/ShiftEntry_model.php @@ -1,9 +1,25 @@ <?php /** + * Returns next (or current) shifts of given user. + * @param User $user + */ +function ShiftEntries_upcoming_for_user($user) { + return sql_select(" + SELECT * + FROM `ShiftEntry` + JOIN `Shifts` ON `Shifts`.`SID`=`ShiftEntry`.`SID` + WHERE `ShiftEntry`.`UID`=" . sql_escape($user['UID']) . " + AND `Shifts`.`end` > " . sql_escape(time()) . " + ORDER BY `Shifts`.`end` + "); +} + +/** * Returns all shift entries in given shift for given angeltype. - * @param int $shift_id - * @param int $angeltype_id + * + * @param int $shift_id + * @param int $angeltype_id */ function ShiftEntries_by_shift_and_angeltype($shift_id, $angeltype_id) { return sql_select(" diff --git a/includes/model/Shifts_model.php b/includes/model/Shifts_model.php index 8cd4b3c2..5d0ec4a2 100644 --- a/includes/model/Shifts_model.php +++ b/includes/model/Shifts_model.php @@ -1,79 +1,90 @@ <?php +function Shifts_by_user($user) { + return sql_select(" + SELECT * + FROM `ShiftEntry` + JOIN `Shifts` ON (`ShiftEntry`.`SID` = `Shifts`.`SID`) + JOIN `Room` ON (`Shifts`.`RID` = `Room`.`RID`) + WHERE `UID`=" . sql_escape($user['UID']) . " + ORDER BY `start` + "); +} /** * TODO: $_REQUEST is not allowed in model! * Returns Shift id array */ function Shifts_filtered() { - global $_REQUEST; - $filter = ""; - - // filterRoom (Array of integer) - Array of Room IDs (optional, for list request) - if (isset($_REQUEST['filterRoom']) && is_array($_REQUEST['filterRoom']) ) { - foreach ( $_REQUEST['filterRoom'] as $key => $value ) { - $filter .= ", `RID`=" . sql_escape($value) . " "; - } - } - - //filterTask (Array of integer) - Array if Task (optional, for list request) - if (isset($_REQUEST['filterTask']) && is_array($_REQUEST['filterTask']) ) { - foreach ( $_REQUEST['filterTask'] as $key => $value ) { -// TODO $filter .= ", `RID`=" . sql_escape($value) . " "; - } - } - - // filterOccupancy (integer) - Occupancy state: (optional, for list request) - // 1 occupied, 2 free, 3 occupied and free - if (isset($_REQUEST['filterOccupancy']) && is_array($_REQUEST['filterOccupancy']) ) { - foreach ( $_REQUEST['filterOccupancy'] as $key => $value ) { -// TODO $filter .= ", `RID`=" . sql_escape($value) . " "; - } - } - - // format filter - if( $filter != "" ) { - $filter = ' WHERE '. substr($filter, 1); - } - - // real request - $shifts_source = sql_select("SELECT `SID` FROM `Shifts`". $filter); - if ($shifts_source === false) - return false; - if (count($shifts_source) > 0) { - return $shifts_source; - } - return null; + global $_REQUEST; + $filter = ""; + + // filterRoom (Array of integer) - Array of Room IDs (optional, for list request) + if (isset($_REQUEST['filterRoom']) && is_array($_REQUEST['filterRoom'])) { + foreach ($_REQUEST['filterRoom'] as $key => $value) { + $filter .= ", `RID`=" . sql_escape($value) . " "; + } + } + + // filterTask (Array of integer) - Array if Task (optional, for list request) + if (isset($_REQUEST['filterTask']) && is_array($_REQUEST['filterTask'])) { + foreach ($_REQUEST['filterTask'] as $key => $value) { + // TODO $filter .= ", `RID`=" . sql_escape($value) . " "; + } + } + + // filterOccupancy (integer) - Occupancy state: (optional, for list request) + // 1 occupied, 2 free, 3 occupied and free + if (isset($_REQUEST['filterOccupancy']) && is_array($_REQUEST['filterOccupancy'])) { + foreach ($_REQUEST['filterOccupancy'] as $key => $value) { + // TODO $filter .= ", `RID`=" . sql_escape($value) . " "; + } + } + + // format filter + if ($filter != "") { + $filter = ' WHERE ' . substr($filter, 1); + } + + // real request + $shifts_source = sql_select("SELECT `SID` FROM `Shifts`" . $filter); + if ($shifts_source === false) + return false; + if (count($shifts_source) > 0) { + return $shifts_source; + } + return null; } /** * Returns Shift by id. * - * @param $id Shift ID + * @param $id Shift + * ID */ function Shift($id) { - $shifts_source = sql_select("SELECT * FROM `Shifts` WHERE `SID`=" . sql_escape($id) . " LIMIT 1"); - $shiftsEntry_source = sql_select("SELECT `TID` , `UID` , `freeloaded` FROM `ShiftEntry` WHERE `SID`=" . sql_escape($id) ); - - if ($shifts_source === false) - return false; - if (count($shifts_source) > 0) { - $result = $shifts_source[0]; - - $result['ShiftEntry'] = $shiftsEntry_source; - - $temp = NeededAngelTypes_by_shift($id); - foreach( $temp as $e) - { - $result['NeedAngels'][] = array ( - 'TID' => $e['angel_type_id'], - 'count' => $e['count'], - 'restricted' => $e['restricted'], - 'taken' => $e['taken'] ); - } - - return $result; - } - return null; + $shifts_source = sql_select("SELECT * FROM `Shifts` WHERE `SID`=" . sql_escape($id) . " LIMIT 1"); + $shiftsEntry_source = sql_select("SELECT `TID` , `UID` , `freeloaded` FROM `ShiftEntry` WHERE `SID`=" . sql_escape($id)); + + if ($shifts_source === false) + return false; + if (count($shifts_source) > 0) { + $result = $shifts_source[0]; + + $result['ShiftEntry'] = $shiftsEntry_source; + + $temp = NeededAngelTypes_by_shift($id); + foreach ($temp as $e) { + $result['NeedAngels'][] = array( + 'TID' => $e['angel_type_id'], + 'count' => $e['count'], + 'restricted' => $e['restricted'], + 'taken' => $e['taken'] + ); + } + + return $result; + } + return null; } /** @@ -92,7 +103,7 @@ function Shifts() { $needed_angeltypes = NeededAngelTypes_by_shift($shift['SID']); if ($needed_angeltypes === false) return false; - + $shift['angeltypes'] = $needed_angeltypes; } diff --git a/includes/model/UserAngelTypes_model.php b/includes/model/UserAngelTypes_model.php index a9944ff1..4a25d25a 100644 --- a/includes/model/UserAngelTypes_model.php +++ b/includes/model/UserAngelTypes_model.php @@ -3,6 +3,15 @@ * User angeltypes model */ +function User_angeltypes($user) { + return sql_select(" + SELECT `AngelTypes`.*, `UserAngelTypes`.`confirm_user_id`, `UserAngelTypes`.`coordinator` + FROM `UserAngelTypes` + JOIN `AngelTypes` ON `UserAngelTypes`.`angeltype_id` = `AngelTypes`.`id` + WHERE `UserAngelTypes`.`user_id`=" . sql_escape($user['UID']) . " + "); +} + /** * Gets unconfirmed user angeltypes for angeltypes of which the given user is a coordinator. * diff --git a/includes/model/UserGroups_model.php b/includes/model/UserGroups_model.php new file mode 100644 index 00000000..1d018386 --- /dev/null +++ b/includes/model/UserGroups_model.php @@ -0,0 +1,17 @@ +<?php + +/** + * Returns users groups + * @param User $user + */ +function User_groups($user) { + return sql_select(" + SELECT `Groups`.* + FROM `UserGroups` + JOIN `Groups` ON `Groups`.`UID`=`UserGroups`.`group_id` + WHERE `UserGroups`.`uid`=" . sql_escape($user['UID']) . " + ORDER BY `UserGroups`.`group_id` + "); +} + +?>
\ No newline at end of file diff --git a/includes/model/User_model.php b/includes/model/User_model.php index c8c48e6c..45600676 100644 --- a/includes/model/User_model.php +++ b/includes/model/User_model.php @@ -4,6 +4,34 @@ */ /** + * Returns -seconds until free if user is busy or seconds until next shift. + * 0 if there is an error or no upcoming shift. + * + * @param User $user + */ +function User_shift_state($user) { + $shifts = ShiftEntries_upcoming_for_user($user); + if ($shifts === false) + return 0; + if (count($shifts) == 0) + return 0; + if ($shifts[0]['start'] < time()) + return $shifts[0]['end'] - time(); + return $shifts[0]['start'] - time(); +} + +/** + * Returns true if user is freeloader + * + * @param User $user + */ +function User_is_freeloader($user) { + global $max_freeloadable_shifts, $user; + + return count(ShiftEntries_freeloaded_by_user($user)) >= $max_freeloadable_shifts; +} + +/** * Returns all users that are not member of given angeltype. * * @param Angeltype $angeltype diff --git a/includes/pages/admin_questions.php b/includes/pages/admin_questions.php index 5d4fbd61..8bdde714 100644 --- a/includes/pages/admin_questions.php +++ b/includes/pages/admin_questions.php @@ -10,7 +10,7 @@ function admin_new_questions() { $new_messages = sql_num_query("SELECT * FROM `Questions` WHERE `AID` IS NULL"); if ($new_messages > 0) - return info('<a href="' . page_link_to("admin_questions") . '">Es gibt unbeantwortete Fragen!</a>', true); + info('<a href="' . page_link_to("admin_questions") . '">Es gibt unbeantwortete Fragen!</a>'); } return ""; diff --git a/includes/pages/user_messages.php b/includes/pages/user_messages.php index a1b565ec..b0ac66b1 100644 --- a/includes/pages/user_messages.php +++ b/includes/pages/user_messages.php @@ -53,7 +53,7 @@ function user_messages() { return template_render('../templates/user_messages.html', array( 'title' => messages_title(), 'link' => page_link_to("user_messages"), - 'greeting' => sprintf(_("Hello %s, here can you leave messages for other angels"), User_Nick_render($user)) . '<br /><br />', + 'greeting' => msg() . sprintf(_("Hello %s, here can you leave messages for other angels"), User_Nick_render($user)) . '<br /><br />', 'messages' => $messages_html, 'new_label' => _("New"), 'date_label' => _("Date"), diff --git a/includes/pages/user_myshifts.php b/includes/pages/user_myshifts.php index 12ba5562..333f9517 100644 --- a/includes/pages/user_myshifts.php +++ b/includes/pages/user_myshifts.php @@ -80,86 +80,8 @@ function user_myshifts() { } else redirect(page_link_to('user_myshifts')); } - $shifts = sql_select("SELECT * FROM `ShiftEntry` JOIN `Shifts` ON (`ShiftEntry`.`SID` = `Shifts`.`SID`) JOIN `Room` ON (`Shifts`.`RID` = `Room`.`RID`) WHERE `UID`=" . sql_escape($shifts_user['UID']) . " ORDER BY `start`"); - $myshifts_table = array(); - $html = ""; - $timesum = 0; - foreach ($shifts as $shift) { - $shift_info = $shift['name']; - $needed_angel_types_source = sql_select("SELECT DISTINCT `AngelTypes`.* FROM `ShiftEntry` JOIN `AngelTypes` ON `ShiftEntry`.`TID`=`AngelTypes`.`id` WHERE `ShiftEntry`.`SID`=" . sql_escape($shift['SID']) . " ORDER BY `AngelTypes`.`name`"); - foreach ($needed_angel_types_source as $needed_angel_type) { - $shift_info .= '<br><b>' . $needed_angel_type['name'] . ':</b> '; - - $users_source = sql_select("SELECT `ShiftEntry`.`freeloaded`, `User`.* FROM `ShiftEntry` JOIN `User` ON `ShiftEntry`.`UID`=`User`.`UID` WHERE `ShiftEntry`.`SID`=" . sql_escape($shift['SID']) . " AND `ShiftEntry`.`TID`=" . sql_escape($needed_angel_type['id'])); - $shift_entries = array(); - foreach ($users_source as $user_source) { - if ($user['UID'] == $user_source['UID']) - $member = '<b>' . $user_source['Nick'] . '</b>'; - else - $member = User_Nick_render($user_source); - if ($user_source['freeloaded']) - $member = '<strike>' . $member . '</strike>'; - - $shift_entries[] = $member; - } - $shift_info .= join(", ", $shift_entries); - } - - $myshift = array( - 'date' => date("Y-m-d", $shift['start']), - 'time' => date("H:i", $shift['start']) . ' - ' . date("H:i", $shift['end']), - 'room' => $shift['Name'], - 'shift_info' => $shift_info, - 'comment' => $shift['Comment'] - ); - - if ($shift['freeloaded']) { - if (in_array("user_shifts_admin", $privileges)) - $myshift['comment'] .= '<br /><p class="error">' . _("Freeloaded") . ': ' . $shift['freeload_comment'] . '</p>'; - else - $myshift['comment'] .= '<br /><p class="error">' . _("Freeloaded") . '</p>'; - } - - $myshift['actions'] = ""; - if ($id == $user['UID'] || in_array('user_shifts_admin', $privileges)) - $myshift['actions'] .= img_button(page_link_to('user_myshifts') . '&edit=' . $shift['id'] . '&id=' . $id, 'pencil', _("edit")); - if (($shift['start'] > time() + $LETZTES_AUSTRAGEN * 3600) || in_array('user_shifts_admin', $privileges)) - $myshift['actions'] .= img_button(page_link_to('user_myshifts') . (($id != $user['UID']) ? '&id=' . $id : '') . '&cancel=' . $shift['id'], 'cross', _("sign off")); - - if ($shift['freeloaded']) - $timesum += - 2 * ($shift['end'] - $shift['start']); - else - $timesum += $shift['end'] - $shift['start']; - $myshifts_table[] = $myshift; - } - if (count($myshifts_table) > 0) - $myshifts_table[] = array( - 'date' => '<b>' . _("Sum:") . '</b>', - 'time' => "<b>" . round($timesum / (60 * 60), 1) . " h</b>", - 'room' => "", - 'shift_info' => "", - 'comment' => "", - 'actions' => "" - ); - - return page_with_title(myshifts_title(), array( - msg(), - $id == $user['UID'] ? sprintf(_('These are your shifts.<br/>Please try to appear <b>15 minutes</b> before your shift begins!<br/>You can remove yourself from a shift up to %d hours before it starts.'), $LETZTES_AUSTRAGEN) : '', - $id != $user['UID'] ? info(sprintf("You are viewing %s's shifts.", $shifts_user['Nick']), true) : '', - $id != $user['UID'] ? buttons(array( - button(page_link_to('admin_user') . '&id=' . $shifts_user['UID'], "Edit " . $shifts_user['Nick'], 'edit') - )) : '', - table(array( - 'date' => _("Day"), - 'time' => _("Time"), - 'room' => _("Location"), - 'shift_info' => _("Name & workmates"), - 'comment' => _("Comment"), - 'actions' => _("Action") - ), $myshifts_table), - $id == $user['UID'] && count($shifts) == 0 ? error(sprintf(_("Go to the <a href=\"%s\">shifts table</a> to sign yourself up for some shifts."), page_link_to('user_shifts')), true) : '', - '<h2>' . _("Exports") . '</h2>' . sprintf(_("Export of shown shifts. <a href=\"%s\">iCal format</a> or <a href=\"%s\">JSON format</a> available (please keep secret, otherwise <a href=\"%s\">reset the api key</a>)."), page_link_to_absolute('ical') . '&key=' . $shifts_user['api_key'], page_link_to_absolute('shifts_json_export') . '&key=' . $shifts_user['api_key'], page_link_to('user_myshifts') . '&reset') - )); + msg(); + redirect(page_link_to('users') . '&action=view'); } ?> diff --git a/includes/pages/user_news.php b/includes/pages/user_news.php index b8879e62..c4d243f4 100644 --- a/includes/pages/user_news.php +++ b/includes/pages/user_news.php @@ -14,7 +14,7 @@ function meetings_title() { function user_meetings() { global $DISPLAY_NEWS, $privileges, $user; - $html = '<div class="col-md-10"><h1>' . meetings_title() . '</h1>'; + $html = '<div class="col-md-10"><h1>' . meetings_title() . '</h1>' . msg(); if (isset($_REQUEST['page']) && preg_match("/^[0-9]{1,}$/", $_REQUEST['page'])) $page = $_REQUEST['page']; diff --git a/includes/pages/user_shifts.php b/includes/pages/user_shifts.php index 2adce0d5..faf6f162 100644 --- a/includes/pages/user_shifts.php +++ b/includes/pages/user_shifts.php @@ -6,7 +6,7 @@ function shifts_title() { function user_shifts() { global $user, $privileges, $max_freeloadable_shifts; - if (count(ShiftEntries_freeloaded_by_user($user)) >= $max_freeloadable_shifts) + if (User_is_freeloader($user)) redirect(page_link_to('user_myshifts')); // Löschen einzelner Schicht-Einträge (Also Belegung einer Schicht von Engeln) durch Admins @@ -743,7 +743,7 @@ function view_user_shifts() { 'filled_select' => make_select($filled, $_SESSION['user_shifts']['filled'], "filled", _("Occupancy")), 'task_notice' => '<sup>1</sup>' . _("The tasks shown here are influenced by the preferences you defined in your settings!") . " <a href=\"" . page_link_to('angeltypes') . '&action=about' . "\">" . _("Description of the jobs.") . "</a>", 'new_style_checkbox' => '<label><input type="checkbox" name="new_style" value="1" ' . ($_SESSION['user_shifts']['new_style'] ? ' checked' : '') . '> ' . _("Use new style if possible") . '</label>', - 'shifts_table' => $shifts_table, + 'shifts_table' =>msg(). $shifts_table, 'ical_text' => '<h2>' . _("iCal export") . '</h2><p>' . sprintf(_("Export of shown shifts. <a href=\"%s\">iCal format</a> or <a href=\"%s\">JSON format</a> available (please keep secret, otherwise <a href=\"%s\">reset the api key</a>)."), 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') . '</p>', 'filter' => _("Filter") )), diff --git a/includes/sys_menu.php b/includes/sys_menu.php index 781218f1..407b784c 100644 --- a/includes/sys_menu.php +++ b/includes/sys_menu.php @@ -22,7 +22,7 @@ function header_toolbar() { $toolbar_items[] = toolbar_item_link(page_link_to('register'), 'plus', register_title(), $p == 'register'); if (in_array('user_myshifts', $privileges)) - $toolbar_items[] = toolbar_item_link(page_link_to('user_myshifts'), ' icon-icon_angel', $user['Nick'], $p == 'user_myshifts'); + $toolbar_items[] = toolbar_item_link(page_link_to('users') . '&action=view', ' icon-icon_angel', $user['Nick'], $p == 'user_myshifts'); if (in_array('user_settings', $privileges)) $toolbar_items[] = toolbar_item_link(page_link_to('user_settings'), 'list-alt', settings_title(), $p == 'user_settings'); diff --git a/includes/sys_template.php b/includes/sys_template.php index bb3d5731..9fc87ef3 100644 --- a/includes/sys_template.php +++ b/includes/sys_template.php @@ -8,6 +8,11 @@ $themes = array( "1" => "Engelsystem dark" ); +function div($class, $content = array(), $id = "") { + $id = $id != '' ? ' id="' . $id . '"' : ''; + return '<div' . $id . ' class="' . $class . '">' . join("\n", $content) . '</div>'; +} + /** * Render a toolbar. * @@ -273,7 +278,7 @@ function button($href, $label, $class = "") { * Rendert eine Toolbar mit Knöpfen */ function buttons($buttons = array ()) { - return '<div class="form-group">' . join(' ', $buttons) . '</div>'; + return '<div class="form-group"><div class="btn-group">' . join(' ', $buttons) . '</div></div>'; } // Load and render template diff --git a/includes/view/User_view.php b/includes/view/User_view.php index 20a6de6e..f7011ffd 100644 --- a/includes/view/User_view.php +++ b/includes/view/User_view.php @@ -1,8 +1,126 @@ <?php -function User_view($user_source) { +function User_shift_mode_render($shift_mode) { + if ($shift_mode == 0) + return '<span class="text-success">' . _("Free") . '</span>'; + if ($shift_mode > 8 * 3600) + return '<span class="text-success">' . sprintf(_("Next shift in %s min"), floor($shift_mode / 60)) . '</span>'; + if ($shift_mode > 0) + return '<span class="text-warning">' . sprintf(_("Next shift in %s min"), floor($shift_mode / 60)) . '</span>'; + if ($shift_mode < 0) + return '<span class="text-danger">' . sprintf(_("Current ends in %s min"), floor($shift_mode / 60)) . '</span>'; +} + +function User_view($user_source, $admin_user_privilege, $freeloader, $user_shift_mode, $user_angeltypes, $user_groups, $shifts, $its_me) { + global $LETZTES_AUSTRAGEN, $privileges; + $user_name = htmlspecialchars($user_source['Vorname']) . " " . htmlspecialchars($user_source['Name']); - return page_with_title('<span class="icon-icon_angel"></span> ' . htmlspecialchars($user_source['Nick']) . ' <small>' . $user_name . '</small>', array()); + + $myshifts_table = array(); + $html = ""; + $timesum = 0; + foreach ($shifts as $shift) { + $shift_info = $shift['name']; + foreach ($shift['needed_angeltypes'] as $needed_angel_type) { + $shift_info .= '<br><b>' . $needed_angel_type['name'] . ':</b> '; + + $shift_entries = array(); + foreach ($needed_angel_type['users'] as $user_source) { + if ($its_me) + $member = '<strong>' . User_Nick_render($user_source) . '</strong>'; + else + $member = User_Nick_render($user_source); + if ($user_source['freeloaded']) + $member = '<strike>' . $member . '</strike>'; + + $shift_entries[] = $member; + } + $shift_info .= join(", ", $shift_entries); + } + + $myshift = array( + 'date' => date("Y-m-d", $shift['start']), + 'time' => date("H:i", $shift['start']) . ' - ' . date("H:i", $shift['end']), + 'room' => $shift['Name'], + 'shift_info' => $shift_info, + 'comment' => $shift['Comment'] + ); + + if ($shift['freeloaded']) { + if (in_array("user_shifts_admin", $privileges)) + $myshift['comment'] .= '<br /><p class="error">' . _("Freeloaded") . ': ' . $shift['freeload_comment'] . '</p>'; + else + $myshift['comment'] .= '<br /><p class="error">' . _("Freeloaded") . '</p>'; + } + + $myshift['actions'] = ""; + if ($its_me || in_array('user_shifts_admin', $privileges)) + $myshift['actions'] .= img_button(page_link_to('user_myshifts') . '&edit=' . $shift['id'] . '&id=' . $user_source['UID'], 'pencil', _("edit")); + if (($shift['start'] > time() + $LETZTES_AUSTRAGEN * 3600) || in_array('user_shifts_admin', $privileges)) + $myshift['actions'] .= img_button(page_link_to('user_myshifts') . ((! $its_me) ? '&id=' . $id : '') . '&cancel=' . $shift['id'], 'cross', _("sign off")); + + if ($shift['freeloaded']) + $timesum += - 2 * ($shift['end'] - $shift['start']); + else + $timesum += $shift['end'] - $shift['start']; + $myshifts_table[] = $myshift; + } + if (count($myshifts_table) > 0) + $myshifts_table[] = array( + 'date' => '<b>' . _("Sum:") . '</b>', + 'time' => "<b>" . round($timesum / (60 * 60), 1) . " h</b>", + 'room' => "", + 'shift_info' => "", + 'comment' => "", + 'actions' => "" + ); + + return page_with_title('<span class="icon-icon_angel"></span> ' . htmlspecialchars($user_source['Nick']) . ' <small>' . $user_name . '</small>', array( + msg(), + div('row', array( + div('col-md-3', array( + '<h1>', + '<span class="glyphicon glyphicon-phone"></span>', + $user_source['DECT'], + '</h1>' + )), + div('col-md-3', array( + '<h4>' . _("User state") . '</h4>', + ($admin_user_privilege && $freeloader) ? '<span class="text-danger"><span class="glyphicon glyphicon-exclamation-sign"></span> ' . _("Freeloader") . '</span><br />' : '', + $user_source['Gekommen'] ? User_shift_mode_render($user_shift_mode) . '<br />' : '', + ($user_source['Gekommen'] ? '<span class="text-success"><span class="glyphicon glyphicon-home"></span> ' . _("Arrived") . '</span>' : '<span class="text-danger">' . _("Not arrived") . '</span>'), + ($user_source['Gekommen'] && $admin_user_privilege && $user_source['Aktiv']) ? ' <span class="text-success">' . _("Active") . '</span>' : '', + ($user_source['Gekommen'] && $admin_user_privilege && $user_source['Tshirt']) ? ' <span class="text-success">' . _("T-Shirt") . '</span>' : '' + )), + div('col-md-3', array( + '<h4>' . _("Angeltypes") . '</h4>', + User_angeltypes_render($user_angeltypes) + )), + div('col-md-3', array( + '<h4>' . _("Rights") . '</h4>', + User_groups_render($user_groups) + )) + )), + $admin_user_privilege ? buttons(array( + button(page_link_to('admin_user') . '&id=' . $user_source['UID'], '<span class="glyphicon glyphicon-edit"></span> ' . _("edit")) + )) : '', + ($its_me || $admin_user_privilege) ? '<h2>' . _("Shifts") . '</h2>' : '', + ($its_me || $admin_user_privilege) ? table(array( + 'date' => _("Day"), + 'time' => _("Time"), + 'room' => _("Location"), + 'shift_info' => _("Name & workmates"), + 'comment' => _("Comment"), + 'actions' => _("Action") + ), $myshifts_table) : '', + $its_me && count($shifts) == 0 ? error(sprintf(_("Go to the <a href=\"%s\">shifts table</a> to sign yourself up for some shifts."), page_link_to('user_shifts')), true) : '', + ($its_me || $admin_user_privilege) ? '<h2>' . _("Exports") . '</h2>' : '', + $its_me ? (sprintf(_("Export of shown shifts. <a href=\"%s\">iCal format</a> or <a href=\"%s\">JSON format</a> available (please keep secret, otherwise <a href=\"%s\">reset the api key</a>)."), page_link_to_absolute('ical') . '&key=' . $user_source['api_key'], page_link_to_absolute('shifts_json_export') . '&key=' . $user_source['api_key'], page_link_to('user_myshifts') . '&reset')) : '', + (! $its_me && $admin_user_privilege) ? buttons(array( + button(page_link_to_absolute('ical') . '&key=' . $user_source['api_key'], '<span class="glyphicon glyphicon-calendar"></span> ' . _("iCal Export")), + button(page_link_to_absolute('shifts_json_export') . '&key=' . $user_source['api_key'], '<span class="glyphicon glyphicon-export"></span> ' . _("JSON Export")) + )) : '' + )); } /** @@ -53,6 +171,30 @@ function User_password_set_view() { )); } +function User_angeltypes_render($user_angeltypes) { + $output = array(); + foreach ($user_angeltypes as $angeltype) { + $class = ""; + if ($angeltype['restricted'] == 1) + if ($angeltype['confirm_user_id'] != null) + $class = 'text-success'; + else + $class = 'text-warning'; + else + $class = 'text-success'; + $output[] = '<span class="' . $class . '">' . ($angeltype['coordinator'] ? '<span class="glyphicon glyphicon-certificate"></span> ' : '') . $angeltype['name'] . '</span>'; + } + return join('<br />', $output); +} + +function User_groups_render($user_groups) { + $output = array(); + foreach ($user_groups as $group) { + $output[] = substr($group['Name'], 2); + } + return join('<br />', $output); +} + /** * Render a users avatar. * @@ -72,7 +214,7 @@ function User_Avatar_render($user) { function User_Nick_render($user_source) { global $user, $privileges; if ($user['UID'] == $user_source['UID'] || in_array('user_shifts_admin', $privileges)) - return '<a href="' . page_link_to('user_myshifts') . '&id=' . $user_source['UID'] . '"><span class="icon-icon_angel"></span> ' . htmlspecialchars($user_source['Nick']) . '</a>'; + return '<a href="' . page_link_to('users') . '&action=view&user_id=' . $user_source['UID'] . '"><span class="icon-icon_angel"></span> ' . htmlspecialchars($user_source['Nick']) . '</a>'; else return htmlspecialchars($user_source['Nick']); } |