add user view, better bootstrap

This commit is contained in:
Philip Häusler 2014-08-23 01:55:18 +02:00
parent 74647e16d3
commit f5a094fd8b
22 changed files with 669 additions and 454 deletions

View File

@ -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>'));
}
/**

View File

@ -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'])
);
}

View File

@ -2,7 +2,8 @@
/**
* Delete an Angeltype.
* @param Angeltype $angeltype
*
* @param Angeltype $angeltype
*/
function AngelType_delete($angeltype) {
return sql_query("

View File

@ -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("

View File

@ -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;
}

View File

@ -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.
*

View File

@ -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`
");
}
?>

View File

@ -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.
*

View File

@ -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 "";

View File

@ -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"),

View File

@ -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') . '&amp;id=' . $shifts_user['UID'], "Edit " . $shifts_user['Nick'], 'edit')
)) : '',
table(array(
'date' => _("Day"),
'time' => _("Time"),
'room' => _("Location"),
'shift_info' => _("Name &amp; 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');
}
?>

View File

@ -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'];

View File

@ -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")
)),

View File

@ -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') . '&amp;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');

View File

@ -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

View File

@ -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 &amp; 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') . '&amp;id=' . $user_source['UID'] . '"><span class="icon-icon_angel"></span> ' . htmlspecialchars($user_source['Nick']) . '</a>';
return '<a href="' . page_link_to('users') . '&amp;action=view&amp;user_id=' . $user_source['UID'] . '"><span class="icon-icon_angel"></span> ' . htmlspecialchars($user_source['Nick']) . '</a>';
else
return htmlspecialchars($user_source['Nick']);
}

View File

@ -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 = '<div class="col-md-10">' . $hints . '</div>' . $content;
}
echo template_render('../templates/layout.html', array(
'theme' => isset($user) ? $user['color'] : $default_theme,
'title' => $title,

View File

@ -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; }

View File

@ -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; }

View File

@ -24,17 +24,17 @@
</div>
</div>
<div class="container-fluid">
<div class="col-md-2" style="margin-top: 28px;">
%menu%
<ul>
<li><a href="%faq_url%">FAQ</a></li>
<li><a href="mailto:erzengel@lists.ccc.de">Contact <img src="pic/icons/email.png" alt="E-Mail"></a></li>
<li><a href="mailto:bugs@engelsystem.de">Bugs / Features <img src="pic/icons/email.png" alt="E-Mail"></a></li>
<li><a href="https://vcs.wybt.net/engelsystem/trac/">Development Platform</a></li>
<li><a href="?p=credits">Credits</a></li>
</ul>
</div>
<div class="col-md-2" style="margin-top: 28px;">%menu%</div>
%content%
<div class="row">
<div class="col-md-12">
<hr />
<div class="text-center footer">
<a href="%faq_url%">FAQ</a> · <a href="mailto:erzengel@lists.ccc.de"><span class="glyphicon glyphicon-envelope"></span> Contact</a> · <a href="mailto:bugs@engelsystem.de"><span class="glyphicon glyphicon-envelope"></span> Bugs / Features</a> · <a
href="https://vcs.wybt.net/engelsystem/trac/">Development Platform</a> · <a href="?p=credits">Credits</a>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@ -6,3 +6,7 @@ $icon-font-path: "../fonts/";
body {
padding-top: 50px;
}
.footer a {
color: $text-muted;
}

View File

@ -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 `<code>`, `<kbd>`, and `<pre>`.
$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";