From f5a094fd8b32d44767f7fc30a65f407f4e1d9945 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20H=C3=A4usler?= Date: Sat, 23 Aug 2014 01:55:18 +0200 Subject: [PATCH] add user view, better bootstrap --- .../controller/user_angeltypes_controller.php | 2 +- includes/controller/users_controller.php | 15 +- includes/model/AngelType_model.php | 3 +- includes/model/ShiftEntry_model.php | 20 +- includes/model/Shifts_model.php | 137 ++--- includes/model/UserAngelTypes_model.php | 9 + includes/model/UserGroups_model.php | 17 + includes/model/User_model.php | 28 + includes/pages/admin_questions.php | 2 +- includes/pages/user_messages.php | 2 +- includes/pages/user_myshifts.php | 82 +-- includes/pages/user_news.php | 2 +- includes/pages/user_shifts.php | 4 +- includes/sys_menu.php | 2 +- includes/sys_template.php | 7 +- includes/view/User_view.php | 148 ++++- public/index.php | 52 +- public/vendor/bootstrap-3.2.0/css/theme0.css | 7 +- public/vendor/bootstrap-3.2.0/css/theme1.css | 511 +++++++++--------- templates/layout.html | 20 +- themes/base.scss | 4 + themes/theme1.scss | 49 +- 22 files changed, 669 insertions(+), 454 deletions(-) create mode 100644 includes/model/UserGroups_model.php 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."), '' . $unconfirmed_user_angeltypes[0]['name'] . ''), 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."), '' . $unconfirmed_user_angeltypes[0]['name'] . '')); } /** 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 @@ " . 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 @@ $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 @@ + \ 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 @@ -3,6 +3,34 @@ * User model */ +/** + * 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. * 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('Es gibt unbeantwortete Fragen!', true); + info('Es gibt unbeantwortete Fragen!'); } 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)) . '

', + 'greeting' => msg() . sprintf(_("Hello %s, here can you leave messages for other angels"), User_Nick_render($user)) . '

', '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 .= '
' . $needed_angel_type['name'] . ': '; - - $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 = '' . $user_source['Nick'] . ''; - else - $member = User_Nick_render($user_source); - if ($user_source['freeloaded']) - $member = '' . $member . ''; - - $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'] .= '

' . _("Freeloaded") . ': ' . $shift['freeload_comment'] . '

'; - else - $myshift['comment'] .= '

' . _("Freeloaded") . '

'; - } - - $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' => '' . _("Sum:") . '', - 'time' => "" . round($timesum / (60 * 60), 1) . " h", - 'room' => "", - 'shift_info' => "", - 'comment' => "", - 'actions' => "" - ); - - return page_with_title(myshifts_title(), array( - msg(), - $id == $user['UID'] ? sprintf(_('These are your shifts.
Please try to appear 15 minutes before your shift begins!
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 shifts table to sign yourself up for some shifts."), page_link_to('user_shifts')), true) : '', - '

' . _("Exports") . '

' . 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=' . $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 = '

' . meetings_title() . '

'; + $html = '

' . meetings_title() . '

' . 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' => '1' . _("The tasks shown here are influenced by the preferences you defined in your settings!") . " " . _("Description of the jobs.") . "", 'new_style_checkbox' => '', - 'shifts_table' => $shifts_table, + 'shifts_table' =>msg(). $shifts_table, '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") )), 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 '' . join("\n", $content) . '
'; +} + /** * Render a toolbar. * @@ -273,7 +278,7 @@ function button($href, $label, $class = "") { * Rendert eine Toolbar mit Knöpfen */ function buttons($buttons = array ()) { - return '
' . join(' ', $buttons) . '
'; + return '
' . join(' ', $buttons) . '
'; } // 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 @@ ' . _("Free") . ''; + if ($shift_mode > 8 * 3600) + return '' . sprintf(_("Next shift in %s min"), floor($shift_mode / 60)) . ''; + if ($shift_mode > 0) + return '' . sprintf(_("Next shift in %s min"), floor($shift_mode / 60)) . ''; + if ($shift_mode < 0) + return '' . sprintf(_("Current ends in %s min"), floor($shift_mode / 60)) . ''; +} + +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(' ' . htmlspecialchars($user_source['Nick']) . ' ' . $user_name . '', 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 .= '
' . $needed_angel_type['name'] . ': '; + + $shift_entries = array(); + foreach ($needed_angel_type['users'] as $user_source) { + if ($its_me) + $member = '' . User_Nick_render($user_source) . ''; + else + $member = User_Nick_render($user_source); + if ($user_source['freeloaded']) + $member = '' . $member . ''; + + $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'] .= '

' . _("Freeloaded") . ': ' . $shift['freeload_comment'] . '

'; + else + $myshift['comment'] .= '

' . _("Freeloaded") . '

'; + } + + $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' => '' . _("Sum:") . '', + 'time' => "" . round($timesum / (60 * 60), 1) . " h", + 'room' => "", + 'shift_info' => "", + 'comment' => "", + 'actions' => "" + ); + + return page_with_title(' ' . htmlspecialchars($user_source['Nick']) . ' ' . $user_name . '', array( + msg(), + div('row', array( + div('col-md-3', array( + '

', + '', + $user_source['DECT'], + '

' + )), + div('col-md-3', array( + '

' . _("User state") . '

', + ($admin_user_privilege && $freeloader) ? ' ' . _("Freeloader") . '
' : '', + $user_source['Gekommen'] ? User_shift_mode_render($user_shift_mode) . '
' : '', + ($user_source['Gekommen'] ? ' ' . _("Arrived") . '' : '' . _("Not arrived") . ''), + ($user_source['Gekommen'] && $admin_user_privilege && $user_source['Aktiv']) ? ' ' . _("Active") . '' : '', + ($user_source['Gekommen'] && $admin_user_privilege && $user_source['Tshirt']) ? ' ' . _("T-Shirt") . '' : '' + )), + div('col-md-3', array( + '

' . _("Angeltypes") . '

', + User_angeltypes_render($user_angeltypes) + )), + div('col-md-3', array( + '

' . _("Rights") . '

', + User_groups_render($user_groups) + )) + )), + $admin_user_privilege ? buttons(array( + button(page_link_to('admin_user') . '&id=' . $user_source['UID'], ' ' . _("edit")) + )) : '', + ($its_me || $admin_user_privilege) ? '

' . _("Shifts") . '

' : '', + ($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 shifts table to sign yourself up for some shifts."), page_link_to('user_shifts')), true) : '', + ($its_me || $admin_user_privilege) ? '

' . _("Exports") . '

' : '', + $its_me ? (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_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'], ' ' . _("iCal Export")), + button(page_link_to_absolute('shifts_json_export') . '&key=' . $user_source['api_key'], ' ' . _("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[] = '' . ($angeltype['coordinator'] ? ' ' : '') . $angeltype['name'] . ''; + } + return join('
', $output); +} + +function User_groups_render($user_groups) { + $output = array(); + foreach ($user_groups as $group) { + $output[] = substr($group['Name'], 2); + } + return join('
', $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 ' ' . htmlspecialchars($user_source['Nick']) . ''; + return ' ' . htmlspecialchars($user_source['Nick']) . ''; else return htmlspecialchars($user_source['Nick']); } diff --git a/public/index.php b/public/index.php index f24c425f..eac59104 100644 --- a/public/index.php +++ b/public/index.php @@ -18,6 +18,7 @@ require_once ('includes/model/Room_model.php'); require_once ('includes/model/ShiftEntry_model.php'); require_once ('includes/model/Shifts_model.php'); require_once ('includes/model/UserAngelTypes_model.php'); +require_once ('includes/model/UserGroups_model.php'); require_once ('includes/model/User_model.php'); require_once ('includes/view/AngelTypes_view.php'); @@ -84,11 +85,35 @@ $free_pages = array( ); // Gewünschte Seite/Funktion +$p = ""; if (! isset($_REQUEST['p'])) $_REQUEST['p'] = isset($user) ? "news" : "login"; if (isset($_REQUEST['p']) && preg_match("/^[a-z0-9_]*$/i", $_REQUEST['p']) && (in_array($_REQUEST['p'], $free_pages) || in_array($_REQUEST['p'], $privileges))) { $p = $_REQUEST['p']; + if (isset($user)) { + $hints = ""; + + if (User_is_freeloader($user)) + error(sprintf(_("You freeloaded at least %s shifts. Shift signup is locked. Please go to heavens desk to be unlocked again."), $max_freeloadable_shifts)); + + // Hinweis für Engel, die noch nicht angekommen sind + if ($user['Gekommen'] == 0) + error(_("You are not marked as arrived. Please go to heaven's desk, get your angel badge and/or tell them that you arrived already.")); + + if ($enable_tshirt_size && $user['Size'] == "") + error(_("You need to specify a tshirt size in your settings!")); + + if ($user['DECT'] == "") + error(_("You need to specify a DECT phone number in your settings! If you don't have a DECT phone, just enter \"-\".")); + + // Erzengel Hinweis für unbeantwortete Fragen + if ($p != "admin_questions") + admin_new_questions(); + + user_angeltypes_unconfirmed_hint(); + } + $title = $p; $content = ""; @@ -214,33 +239,6 @@ if (isset($_REQUEST['p']) && preg_match("/^[a-z0-9_]*$/i", $_REQUEST['p']) && (i } } -if (isset($user)) { - $hints = ""; - - $freeloaded_shifts_count = count(ShiftEntries_freeloaded_by_user($user)); - if ($freeloaded_shifts_count >= $max_freeloadable_shifts) - $hints = error(sprintf(_("You freeloaded %s shifts. Shift signup is locked. Please go to heavens desk to be unlocked again."), $freeloaded_shifts_count), true); - - // Hinweis für Engel, die noch nicht angekommen sind - if ($user['Gekommen'] == 0) - $hints = error(_("You are not marked as arrived. Please go to heaven's desk, get your angel badge and/or tell them that you arrived already."), true) . $hints; - - if ($enable_tshirt_size && $user['Size'] == "") - $hints = error(_("You need to specify a tshirt size in your settings!"), true) . $hints; - - if ($user['DECT'] == "") - $hints = error(_("You need to specify a DECT phone number in your settings! If you don't have a DECT phone, just enter \"-\"."), true) . $hints; - - // Erzengel Hinweis für unbeantwortete Fragen - if ($p != "admin_questions") - $hints = admin_new_questions() . $hints; - - $hints = user_angeltypes_unconfirmed_hint() . $hints; - - if ($hints != "") - $content = '
' . $hints . '
' . $content; -} - echo template_render('../templates/layout.html', array( 'theme' => isset($user) ? $user['color'] : $default_theme, 'title' => $title, diff --git a/public/vendor/bootstrap-3.2.0/css/theme0.css b/public/vendor/bootstrap-3.2.0/css/theme0.css index 060467ad..52236b90 100644 --- a/public/vendor/bootstrap-3.2.0/css/theme0.css +++ b/public/vendor/bootstrap-3.2.0/css/theme0.css @@ -249,8 +249,8 @@ th { border: 1px solid #ddd !important; } } @font-face { font-family: 'Glyphicons Halflings'; - src: url("bootstrap/glyphicons-halflings-regular.eot"); - src: url("bootstrap/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("bootstrap/glyphicons-halflings-regular.woff") format("woff"), url("bootstrap/glyphicons-halflings-regular.ttf") format("truetype"), url("bootstrap/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg"); } + src: url("../fonts/glyphicons-halflings-regular.eot"); + src: url("../fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/glyphicons-halflings-regular.woff") format("woff"), url("../fonts/glyphicons-halflings-regular.ttf") format("truetype"), url("../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg"); } .glyphicon { position: relative; @@ -5294,3 +5294,6 @@ button.close { display: none !important; } } body { padding-top: 50px; } + +.footer a { + color: #777777; } diff --git a/public/vendor/bootstrap-3.2.0/css/theme1.css b/public/vendor/bootstrap-3.2.0/css/theme1.css index 27a5500a..179ac12d 100644 --- a/public/vendor/bootstrap-3.2.0/css/theme1.css +++ b/public/vendor/bootstrap-3.2.0/css/theme1.css @@ -1,100 +1,26 @@ -@import url("//fonts.googleapis.com/css?family=Roboto:400,700"); -.text-primary, -.text-primary:hover { - color: #2a9fd6; } +/* +The MIT License (MIT) -.text-success, -.text-success:hover { - color: #77b300; } +Copyright (c) 2013 Thomas Park -.text-danger, -.text-danger:hover { - color: #cc0000; } +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -.text-warning, -.text-warning:hover { - color: #ff8800; } - -.text-info, -.text-info:hover { - color: #2a9fd6; } - -table, -.table { - color: #fff; } - table a:not(.btn), - .table a:not(.btn) { - color: #fff; - text-decoration: underline; } - table .text-muted, - .table .text-muted { - color: #888888; } - -.table-responsive > .table { - background-color: #181818; } - -.has-warning .help-block, -.has-warning .control-label, -.has-warning .form-control-feedback { - color: #ff8800; } -.has-warning .form-control, -.has-warning .form-control:focus, -.has-warning .input-group-addon { - border-color: #ff8800; } - -.has-error .help-block, -.has-error .control-label, -.has-error .form-control-feedback { - color: #cc0000; } -.has-error .form-control, -.has-error .form-control:focus, -.has-error .input-group-addon { - border-color: #cc0000; } - -.has-success .help-block, -.has-success .control-label, -.has-success .form-control-feedback { - color: #77b300; } -.has-success .form-control, -.has-success .form-control:focus, -.has-success .input-group-addon { - border-color: #77b300; } - -legend { - color: #fff; } - -.input-group-addon { - background-color: #424242; } - -.nav-tabs a, -.nav-pills a, -.breadcrumb a, -.pager a { - color: #fff; } - -.alert .alert-link, -.alert a { - color: white; - text-decoration: underline; } -.alert .close { - text-decoration: none; } - -.close { - color: #fff; - text-decoration: none; - opacity: 0.4; } - .close:hover, .close:focus { - color: #fff; - opacity: 1; } - -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: #282828; } - -.jumbotron h1, .jumbotron h2, .jumbotron h3, .jumbotron h4, .jumbotron h5, .jumbotron h6 { - color: #fff; } +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ /*! normalize.css v3.0.1 | MIT License | git.io/normalize */ html { font-family: sans-serif; @@ -976,7 +902,7 @@ html { -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body { - font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.42857; color: #888888; @@ -991,10 +917,10 @@ textarea { line-height: inherit; } a { - color: #2a9fd6; + color: #428bca; text-decoration: none; } a:hover, a:focus { - color: #2a9fd6; + color: #428bca; text-decoration: underline; } a:focus { outline: thin dotted; @@ -1059,7 +985,7 @@ hr { h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { - font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 500; line-height: 1.1; color: white; } @@ -1114,17 +1040,17 @@ h6, .h6 { font-size: 75%; } h1, .h1 { - font-size: 56px; } - -h2, .h2 { - font-size: 45px; } - -h3, .h3 { font-size: 34px; } -h4, .h4 { +h2, .h2 { font-size: 24px; } +h3, .h3 { + font-size: 20px; } + +h4, .h4 { + font-size: 20px; } + h5, .h5 { font-size: 20px; } @@ -1152,7 +1078,7 @@ cite { mark, .mark { - background-color: #ff8800; + background-color: #f0ad4e; padding: .2em; } .text-left { @@ -1183,10 +1109,10 @@ mark, color: #888888; } .text-primary { - color: #2a9fd6; } + color: #428bca; } a.text-primary:hover { - color: #2180ac; } + color: #3071a9; } .text-success { color: white; } @@ -1216,34 +1142,34 @@ a.text-danger:hover { color: #fff; } .bg-primary { - background-color: #2a9fd6; } + background-color: #428bca; } a.bg-primary:hover { - background-color: #2180ac; } + background-color: #3071a9; } .bg-success { - background-color: #77b300; } + background-color: #5cb85c; } a.bg-success:hover { - background-color: #558000; } + background-color: #449d44; } .bg-info { - background-color: #2a9fd6; } + background-color: #5bc0de; } a.bg-info:hover { - background-color: #2180ac; } + background-color: #31b0d5; } .bg-warning { - background-color: #ff8800; } + background-color: #f0ad4e; } a.bg-warning:hover { - background-color: #cc6d00; } + background-color: #ec971f; } .bg-danger { - background-color: #cc0000; } + background-color: #d9534f; } a.bg-danger:hover { - background-color: #990000; } + background-color: #c9302c; } .page-header { padding-bottom: 9px; @@ -2183,11 +2109,11 @@ table th[class*="col-"] { .table > tfoot > tr > th.success, .table > tfoot > tr.success > td, .table > tfoot > tr.success > th { - background-color: #77b300; } + background-color: #5cb85c; } .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th { - background-color: #669a00; } + background-color: #4cae4c; } .table > thead > tr > td.info, .table > thead > tr > th.info, .table > thead > tr.info > td, .table > thead > tr.info > th, @@ -2199,11 +2125,11 @@ table th[class*="col-"] { .table > tfoot > tr > th.info, .table > tfoot > tr.info > td, .table > tfoot > tr.info > th { - background-color: #2a9fd6; } + background-color: #5bc0de; } .table-hover > tbody > tr > td.info:hover, .table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th { - background-color: #258fc1; } + background-color: #46b8da; } .table > thead > tr > td.warning, .table > thead > tr > th.warning, .table > thead > tr.warning > td, .table > thead > tr.warning > th, @@ -2215,11 +2141,11 @@ table th[class*="col-"] { .table > tfoot > tr > th.warning, .table > tfoot > tr.warning > td, .table > tfoot > tr.warning > th { - background-color: #ff8800; } + background-color: #f0ad4e; } .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th { - background-color: #e67a00; } + background-color: #eea236; } .table > thead > tr > td.danger, .table > thead > tr > th.danger, .table > thead > tr.danger > td, .table > thead > tr.danger > th, @@ -2231,11 +2157,11 @@ table th[class*="col-"] { .table > tfoot > tr > th.danger, .table > tfoot > tr.danger > td, .table > tfoot > tr.danger > th { - background-color: #cc0000; } + background-color: #d9534f; } .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th { - background-color: #b30000; } + background-color: #d43f3a; } @media screen and (max-width: 767px) { .table-responsive { @@ -2590,7 +2516,7 @@ select[multiple].input-lg, .has-success .input-group-addon { color: white; border-color: white; - background-color: #77b300; } + background-color: #5cb85c; } .has-success .form-control-feedback { color: white; } @@ -2612,7 +2538,7 @@ select[multiple].input-lg, .has-warning .input-group-addon { color: white; border-color: white; - background-color: #ff8800; } + background-color: #f0ad4e; } .has-warning .form-control-feedback { color: white; } @@ -2634,7 +2560,7 @@ select[multiple].input-lg, .has-error .input-group-addon { color: white; border-color: white; - background-color: #cc0000; } + background-color: #d9534f; } .has-error .form-control-feedback { color: white; } @@ -2779,91 +2705,91 @@ select[multiple].input-lg, .btn-primary { color: white; - background-color: #2a9fd6; - border-color: #2a9fd6; } + background-color: #428bca; + border-color: #428bca; } .btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { color: white; - background-color: #2180ac; - border-color: #1f79a3; } + background-color: #3071a9; + border-color: #2d6ca2; } .btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { background-image: none; } .btn-primary.disabled, .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled:active, .btn-primary.disabled.active, .btn-primary[disabled], .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled]:active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary, fieldset[disabled] .btn-primary:hover, fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary:active, fieldset[disabled] .btn-primary.active { - background-color: #2a9fd6; - border-color: #2a9fd6; } + background-color: #428bca; + border-color: #428bca; } .btn-primary .badge { - color: #2a9fd6; + color: #428bca; background-color: white; } .btn-success { color: white; - background-color: #77b300; - border-color: #77b300; } + background-color: #5cb85c; + border-color: #5cb85c; } .btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { color: white; - background-color: #558000; - border-color: #4e7600; } + background-color: #449d44; + border-color: #419641; } .btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { background-image: none; } .btn-success.disabled, .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled:active, .btn-success.disabled.active, .btn-success[disabled], .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled]:active, .btn-success[disabled].active, fieldset[disabled] .btn-success, fieldset[disabled] .btn-success:hover, fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success:active, fieldset[disabled] .btn-success.active { - background-color: #77b300; - border-color: #77b300; } + background-color: #5cb85c; + border-color: #5cb85c; } .btn-success .badge { - color: #77b300; + color: #5cb85c; background-color: white; } .btn-info { color: white; - background-color: #2a9fd6; - border-color: #2a9fd6; } + background-color: #5bc0de; + border-color: #5bc0de; } .btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle { color: white; - background-color: #2180ac; - border-color: #1f79a3; } + background-color: #31b0d5; + border-color: #2aabd2; } .btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle { background-image: none; } .btn-info.disabled, .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled:active, .btn-info.disabled.active, .btn-info[disabled], .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled]:active, .btn-info[disabled].active, fieldset[disabled] .btn-info, fieldset[disabled] .btn-info:hover, fieldset[disabled] .btn-info:focus, fieldset[disabled] .btn-info:active, fieldset[disabled] .btn-info.active { - background-color: #2a9fd6; - border-color: #2a9fd6; } + background-color: #5bc0de; + border-color: #5bc0de; } .btn-info .badge { - color: #2a9fd6; + color: #5bc0de; background-color: white; } .btn-warning { color: white; - background-color: #ff8800; - border-color: #ff8800; } + background-color: #f0ad4e; + border-color: #f0ad4e; } .btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle { color: white; - background-color: #cc6d00; - border-color: #c26700; } + background-color: #ec971f; + border-color: #eb9316; } .btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle { background-image: none; } .btn-warning.disabled, .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled:active, .btn-warning.disabled.active, .btn-warning[disabled], .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled]:active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning, fieldset[disabled] .btn-warning:hover, fieldset[disabled] .btn-warning:focus, fieldset[disabled] .btn-warning:active, fieldset[disabled] .btn-warning.active { - background-color: #ff8800; - border-color: #ff8800; } + background-color: #f0ad4e; + border-color: #f0ad4e; } .btn-warning .badge { - color: #ff8800; + color: #f0ad4e; background-color: white; } .btn-danger { color: white; - background-color: #cc0000; - border-color: #cc0000; } + background-color: #d9534f; + border-color: #d9534f; } .btn-danger:hover, .btn-danger:focus, .btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle { color: white; - background-color: #990000; - border-color: #8f0000; } + background-color: #c9302c; + border-color: #c12e2a; } .btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle { background-image: none; } .btn-danger.disabled, .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled:active, .btn-danger.disabled.active, .btn-danger[disabled], .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled]:active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger, fieldset[disabled] .btn-danger:hover, fieldset[disabled] .btn-danger:focus, fieldset[disabled] .btn-danger:active, fieldset[disabled] .btn-danger.active { - background-color: #cc0000; - border-color: #cc0000; } + background-color: #d9534f; + border-color: #d9534f; } .btn-danger .badge { - color: #cc0000; + color: #d9534f; background-color: white; } .btn-link { - color: #2a9fd6; + color: #428bca; font-weight: normal; cursor: pointer; border-radius: 0; } @@ -2874,7 +2800,7 @@ select[multiple].input-lg, .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { border-color: transparent; } .btn-link:hover, .btn-link:focus { - color: #2a9fd6; + color: #428bca; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:hover, fieldset[disabled] .btn-link:focus { @@ -3000,7 +2926,7 @@ tbody.collapse.in { color: white; text-decoration: none; outline: 0; - background-color: #2a9fd6; } + background-color: #428bca; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: #777777; } @@ -3354,7 +3280,7 @@ tbody.collapse.in { cursor: not-allowed; } .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { background-color: #222222; - border-color: #2a9fd6; } + border-color: #428bca; } .nav .nav-divider { height: 1px; margin: 9px 0; @@ -3377,7 +3303,7 @@ tbody.collapse.in { border-color: transparent transparent #282828; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: white; - background-color: #2a9fd6; + background-color: #428bca; border: 1px solid #282828; border-bottom-color: transparent; cursor: default; } @@ -3390,7 +3316,7 @@ tbody.collapse.in { margin-left: 2px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: white; - background-color: #2a9fd6; } + background-color: #428bca; } .nav-stacked > li { float: none; } @@ -3845,7 +3771,7 @@ tbody.collapse.in { .pagination > li > span:hover, .pagination > li > span:focus { color: white; - background-color: #2a9fd6; + background-color: #428bca; border-color: transparent; } .pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus, .pagination > .active > span, @@ -3853,7 +3779,7 @@ tbody.collapse.in { .pagination > .active > span:focus { z-index: 2; color: white; - background-color: #2a9fd6; + background-color: #428bca; border-color: transparent; cursor: default; } .pagination > .disabled > span, @@ -3915,7 +3841,7 @@ tbody.collapse.in { .pager li > a:hover, .pager li > a:focus { text-decoration: none; - background-color: #2a9fd6; } + background-color: #428bca; } .pager .next > a, .pager .next > span { float: right; } @@ -3958,29 +3884,29 @@ a.label:hover, a.label:focus { background-color: #282828; } .label-primary { - background-color: #2a9fd6; } + background-color: #428bca; } .label-primary[href]:hover, .label-primary[href]:focus { - background-color: #2180ac; } + background-color: #3071a9; } .label-success { - background-color: #77b300; } + background-color: #5cb85c; } .label-success[href]:hover, .label-success[href]:focus { - background-color: #558000; } + background-color: #449d44; } .label-info { - background-color: #2a9fd6; } + background-color: #5bc0de; } .label-info[href]:hover, .label-info[href]:focus { - background-color: #2180ac; } + background-color: #31b0d5; } .label-warning { - background-color: #ff8800; } + background-color: #f0ad4e; } .label-warning[href]:hover, .label-warning[href]:focus { - background-color: #cc6d00; } + background-color: #ec971f; } .label-danger { - background-color: #cc0000; } + background-color: #d9534f; } .label-danger[href]:hover, .label-danger[href]:focus { - background-color: #990000; } + background-color: #c9302c; } .badge { display: inline-block; @@ -3993,7 +3919,7 @@ a.label:hover, a.label:focus { vertical-align: baseline; white-space: nowrap; text-align: center; - background-color: #2a9fd6; + background-color: #428bca; border-radius: 10px; } .badge:empty { display: none; } @@ -4004,7 +3930,7 @@ a.label:hover, a.label:focus { top: 0; padding: 1px 5px; } a.list-group-item.active > .badge, .nav-pills > .active > a > .badge { - color: #2a9fd6; + color: #428bca; background-color: white; } .nav-pills > li > a > .badge { margin-left: 3px; } @@ -4069,7 +3995,7 @@ a.badge:hover, a.badge:focus { a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { - border-color: #2a9fd6; } + border-color: #428bca; } .alert { padding: 15px; @@ -4098,38 +4024,38 @@ a.thumbnail.active { color: inherit; } .alert-success { - background-color: #77b300; - border-color: #669a00; + background-color: #5cb85c; + border-color: #4cae4c; color: white; } .alert-success hr { - border-top-color: #558000; } + border-top-color: #449d44; } .alert-success .alert-link { color: #e6e6e6; } .alert-info { - background-color: #2a9fd6; - border-color: #2489b9; + background-color: #5bc0de; + border-color: #3db5d8; color: white; } .alert-info hr { - border-top-color: #1f79a3; } + border-top-color: #2aabd2; } .alert-info .alert-link { color: #e6e6e6; } .alert-warning { - background-color: #ff8800; - border-color: #f08000; + background-color: #f0ad4e; + border-color: #efa640; color: white; } .alert-warning hr { - border-top-color: #d67200; } + border-top-color: #ed9c28; } .alert-warning .alert-link { color: #e6e6e6; } .alert-danger { - background-color: #cc0000; - border-color: #bd0000; + background-color: #d9534f; + border-color: #d64742; color: white; } .alert-danger hr { - border-top-color: #a30000; } + border-top-color: #d2322d; } .alert-danger .alert-link { color: #e6e6e6; } @@ -4164,7 +4090,7 @@ a.thumbnail.active { line-height: 20px; color: white; text-align: center; - background-color: #2a9fd6; + background-color: #428bca; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -webkit-transition: width 0.6s ease; @@ -4194,28 +4120,28 @@ a.thumbnail.active { box-shadow: none; } .progress-bar-success { - background-color: #77b300; } + background-color: #5cb85c; } .progress-striped .progress-bar-success { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-info { - background-color: #2a9fd6; } + background-color: #5bc0de; } .progress-striped .progress-bar-info { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-warning { - background-color: #ff8800; } + background-color: #f0ad4e; } .progress-striped .progress-bar-warning { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-danger { - background-color: #cc0000; } + background-color: #d9534f; } .progress-striped .progress-bar-danger { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); @@ -4290,8 +4216,8 @@ a.list-group-item { .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; color: white; - background-color: #2a9fd6; - border-color: #2a9fd6; } + background-color: #428bca; + border-color: #428bca; } .list-group-item.active .list-group-item-heading, .list-group-item.active .list-group-item-heading > small, .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading, @@ -4301,11 +4227,11 @@ a.list-group-item { .list-group-item.active:focus .list-group-item-heading > .small { color: inherit; } .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { - color: #d5ecf7; } + color: #e1edf7; } .list-group-item-success { color: white; - background-color: #77b300; } + background-color: #5cb85c; } a.list-group-item-success { color: white; } @@ -4313,7 +4239,7 @@ a.list-group-item-success { color: inherit; } a.list-group-item-success:hover, a.list-group-item-success:focus { color: white; - background-color: #669a00; } + background-color: #4cae4c; } a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus { color: #fff; background-color: white; @@ -4321,7 +4247,7 @@ a.list-group-item-success { .list-group-item-info { color: white; - background-color: #2a9fd6; } + background-color: #5bc0de; } a.list-group-item-info { color: white; } @@ -4329,7 +4255,7 @@ a.list-group-item-info { color: inherit; } a.list-group-item-info:hover, a.list-group-item-info:focus { color: white; - background-color: #258fc1; } + background-color: #46b8da; } a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus { color: #fff; background-color: white; @@ -4337,7 +4263,7 @@ a.list-group-item-info { .list-group-item-warning { color: white; - background-color: #ff8800; } + background-color: #f0ad4e; } a.list-group-item-warning { color: white; } @@ -4345,7 +4271,7 @@ a.list-group-item-warning { color: inherit; } a.list-group-item-warning:hover, a.list-group-item-warning:focus { color: white; - background-color: #e67a00; } + background-color: #eea236; } a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus { color: #fff; background-color: white; @@ -4353,7 +4279,7 @@ a.list-group-item-warning { .list-group-item-danger { color: white; - background-color: #cc0000; } + background-color: #d9534f; } a.list-group-item-danger { color: white; } @@ -4361,7 +4287,7 @@ a.list-group-item-danger { color: inherit; } a.list-group-item-danger:hover, a.list-group-item-danger:focus { color: white; - background-color: #b30000; } + background-color: #d43f3a; } a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus { color: #fff; background-color: white; @@ -4570,74 +4496,74 @@ a.list-group-item-danger { border-bottom-color: #282828; } .panel-primary { - border-color: #2a9fd6; } + border-color: #428bca; } .panel-primary > .panel-heading { color: white; - background-color: #2a9fd6; - border-color: #2a9fd6; } + background-color: #428bca; + border-color: #428bca; } .panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #2a9fd6; } + border-top-color: #428bca; } .panel-primary > .panel-heading .badge { - color: #2a9fd6; + color: #428bca; background-color: white; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #2a9fd6; } + border-bottom-color: #428bca; } .panel-success { - border-color: #669a00; } + border-color: #4cae4c; } .panel-success > .panel-heading { color: white; - background-color: #77b300; - border-color: #669a00; } + background-color: #5cb85c; + border-color: #4cae4c; } .panel-success > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #669a00; } + border-top-color: #4cae4c; } .panel-success > .panel-heading .badge { - color: #77b300; + color: #5cb85c; background-color: white; } .panel-success > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #669a00; } + border-bottom-color: #4cae4c; } .panel-info { - border-color: #2489b9; } + border-color: #3db5d8; } .panel-info > .panel-heading { color: white; - background-color: #2a9fd6; - border-color: #2489b9; } + background-color: #5bc0de; + border-color: #3db5d8; } .panel-info > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #2489b9; } + border-top-color: #3db5d8; } .panel-info > .panel-heading .badge { - color: #2a9fd6; + color: #5bc0de; background-color: white; } .panel-info > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #2489b9; } + border-bottom-color: #3db5d8; } .panel-warning { - border-color: #f08000; } + border-color: #efa640; } .panel-warning > .panel-heading { color: white; - background-color: #ff8800; - border-color: #f08000; } + background-color: #f0ad4e; + border-color: #efa640; } .panel-warning > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #f08000; } + border-top-color: #efa640; } .panel-warning > .panel-heading .badge { - color: #ff8800; + color: #f0ad4e; background-color: white; } .panel-warning > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #f08000; } + border-bottom-color: #efa640; } .panel-danger { - border-color: #bd0000; } + border-color: #d64742; } .panel-danger > .panel-heading { color: white; - background-color: #cc0000; - border-color: #bd0000; } + background-color: #d9534f; + border-color: #d64742; } .panel-danger > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #bd0000; } + border-top-color: #d64742; } .panel-danger > .panel-heading .badge { - color: #cc0000; + color: #d9534f; background-color: white; } .panel-danger > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #bd0000; } + border-bottom-color: #d64742; } .embed-responsive { position: relative; @@ -5391,3 +5317,102 @@ button.close { display: none !important; } } body { padding-top: 50px; } + +.footer a { + color: #888888; } + +.text-primary, +.text-primary:hover { + color: #428bca; } + +.text-success, +.text-success:hover { + color: #5cb85c; } + +.text-danger, +.text-danger:hover { + color: #d9534f; } + +.text-warning, +.text-warning:hover { + color: #f0ad4e; } + +.text-info, +.text-info:hover { + color: #5bc0de; } + +table, +.table { + color: #fff; } + table a:not(.btn), + .table a:not(.btn) { + color: #fff; + text-decoration: underline; } + table .text-muted, + .table .text-muted { + color: #888888; } + +.table-responsive > .table { + background-color: #181818; } + +.has-warning .help-block, +.has-warning .control-label, +.has-warning .form-control-feedback { + color: #f0ad4e; } +.has-warning .form-control, +.has-warning .form-control:focus, +.has-warning .input-group-addon { + border-color: #f0ad4e; } + +.has-error .help-block, +.has-error .control-label, +.has-error .form-control-feedback { + color: #d9534f; } +.has-error .form-control, +.has-error .form-control:focus, +.has-error .input-group-addon { + border-color: #d9534f; } + +.has-success .help-block, +.has-success .control-label, +.has-success .form-control-feedback { + color: #5cb85c; } +.has-success .form-control, +.has-success .form-control:focus, +.has-success .input-group-addon { + border-color: #5cb85c; } + +legend { + color: #fff; } + +.input-group-addon { + background-color: #424242; } + +.nav-tabs a, +.nav-pills a, +.breadcrumb a, +.pager a { + color: #fff; } + +.alert .alert-link, +.alert a { + color: white; + text-decoration: underline; } +.alert .close { + text-decoration: none; } + +.close { + color: #fff; + text-decoration: none; + opacity: 0.4; } + .close:hover, .close:focus { + color: #fff; + opacity: 1; } + +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #282828; } + +.jumbotron h1, .jumbotron h2, .jumbotron h3, .jumbotron h4, .jumbotron h5, .jumbotron h6 { + color: #fff; } diff --git a/templates/layout.html b/templates/layout.html index af412184..6f5a4886 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -24,17 +24,17 @@
- +
%menu%
%content% +
diff --git a/themes/base.scss b/themes/base.scss index 802524a6..70d1a4b7 100644 --- a/themes/base.scss +++ b/themes/base.scss @@ -6,3 +6,7 @@ $icon-font-path: "../fonts/"; body { padding-top: 50px; } + +.footer a { + color: $text-muted; +} \ No newline at end of file diff --git a/themes/theme1.scss b/themes/theme1.scss index 699ddd86..bd1919e1 100644 --- a/themes/theme1.scss +++ b/themes/theme1.scss @@ -1,5 +1,29 @@ @import "../vendor/bootstrap-3.2.0/_variables"; +/* +The MIT License (MIT) + +Copyright (c) 2013 Thomas Park + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + // Cyborg 3.2.0 // Variables // -------------------------------------------------- @@ -14,11 +38,11 @@ $gray: #555; // #555 $gray-light: #888; // #999 $gray-lighter: #ADAFAE; // #eee -$brand-primary: #2A9FD6; -$brand-success: #77B300; -$brand-info: $brand-primary; -$brand-warning: #FF8800; -$brand-danger: #CC0000; +$brand-primary: #428bca; +$brand-success: #5cb85c; +$brand-info: #5bc0de; +$brand-warning: #f0ad4e; +$brand-danger: #d9534f; //== Scaffolding @@ -40,7 +64,6 @@ $link-hover-color: $link-color; // //## Font, line-height, and color for body text, headings, and more. -$font-family-sans-serif: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; $font-family-serif: Georgia, "Times New Roman", Times, serif; //** Default monospace fonts for ``, ``, and `
`.
 $font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace;
@@ -50,10 +73,10 @@ $font-size-base:          14px;
 $font-size-large:         ceil(($font-size-base * 1.25)); // ~18px
 $font-size-small:         ceil(($font-size-base * 0.85)); // ~12px
 
-$font-size-h1:            56px;
-$font-size-h2:            45px;
-$font-size-h3:            34px;
-$font-size-h4:            24px;
+$font-size-h1:            34px;
+$font-size-h2:            24px;
+$font-size-h3:            20px;
+$font-size-h4:            20px;
 $font-size-h5:            20px;
 $font-size-h6:            16px;
 
@@ -845,12 +868,12 @@ $dl-horizontal-offset:        $component-offset-horizontal;
 //** Horizontal line color.
 $hr-border:                   $gray-dark;
 
+@import "base";
+
 // Cyborg 3.2.0
 // Bootswatch
 // -----------------------------------------------------
 
-@import url("//fonts.googleapis.com/css?family=Roboto:400,700");
-
 // Navbar =====================================================================
 
 // Buttons ====================================================================
@@ -1009,5 +1032,3 @@ a.thumbnail.active {
     color: #fff;
   }
 }
-
-@import "base";
\ No newline at end of file