add shift legend and fix dark theme
This commit is contained in:
parent
0ab9f4f988
commit
f568141164
|
@ -133,6 +133,24 @@ function Shift_signup_allowed($user, $shift, $angeltype, $user_angeltype = null,
|
||||||
|
|
||||||
return new ShiftSignupState(ShiftSignupState::FREE, $free_entries);
|
return new ShiftSignupState(ShiftSignupState::FREE, $free_entries);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($user_shifts == null) {
|
||||||
|
$user_shifts = Shifts_by_user($user);
|
||||||
|
}
|
||||||
|
|
||||||
|
$signed_up = false;
|
||||||
|
foreach ($user_shifts as $user_shift) {
|
||||||
|
if ($user_shift['SID'] == $shift['SID']) {
|
||||||
|
$signed_up = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($signed_up) {
|
||||||
|
// you cannot join if you already singed up for this shift
|
||||||
|
return new ShiftSignupState(ShiftSignupState::SIGNED_UP, $free_entries);
|
||||||
|
}
|
||||||
|
|
||||||
if (time() > $shift['start']) {
|
if (time() > $shift['start']) {
|
||||||
// you can only join if the shift is in future
|
// you can only join if the shift is in future
|
||||||
return new ShiftSignupState(ShiftSignupState::SHIFT_ENDED, $free_entries);
|
return new ShiftSignupState(ShiftSignupState::SHIFT_ENDED, $free_entries);
|
||||||
|
@ -152,28 +170,11 @@ function Shift_signup_allowed($user, $shift, $angeltype, $user_angeltype = null,
|
||||||
return new ShiftSignupState(ShiftSignupState::ANGELTYPE, $free_entries);
|
return new ShiftSignupState(ShiftSignupState::ANGELTYPE, $free_entries);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($user_shifts == null) {
|
|
||||||
$user_shifts = Shifts_by_user($user);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Shift_collides($shift, $user_shifts)) {
|
if (Shift_collides($shift, $user_shifts)) {
|
||||||
// you cannot join if user alread joined a parallel or this shift
|
// you cannot join if user alread joined a parallel or this shift
|
||||||
return new ShiftSignupState(ShiftSignupState::COLLIDES, $free_entries);
|
return new ShiftSignupState(ShiftSignupState::COLLIDES, $free_entries);
|
||||||
}
|
}
|
||||||
|
|
||||||
$signed_up = false;
|
|
||||||
foreach ($user_shifts as $user_shift) {
|
|
||||||
if ($user_shift['SID'] == $shift['SID']) {
|
|
||||||
$signed_up = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($signed_up) {
|
|
||||||
// you cannot join if you already singed up for this shift
|
|
||||||
return new ShiftSignupState(ShiftSignupState::SIGNED_UP, $free_entries);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hooray, shift is free for you!
|
// Hooray, shift is free for you!
|
||||||
return new ShiftSignupState(ShiftSignupState::FREE, $free_entries);
|
return new ShiftSignupState(ShiftSignupState::FREE, $free_entries);
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,18 @@ function mute($text) {
|
||||||
return '<span class="text-muted">' . $text . '</span>';
|
return '<span class="text-muted">' . $text . '</span>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renders a bootstrap label with given content and class.
|
||||||
|
*
|
||||||
|
* @param string $content
|
||||||
|
* The text
|
||||||
|
* @param string $class
|
||||||
|
* default, primary, info, success, warning, danger
|
||||||
|
*/
|
||||||
|
function label($content, $class = 'default') {
|
||||||
|
return '<span class="label label-' . $class . '">' . $content . '</span>';
|
||||||
|
}
|
||||||
|
|
||||||
function progress_bar($valuemin, $valuemax, $valuenow, $class = '', $content = '') {
|
function progress_bar($valuemin, $valuemax, $valuenow, $class = '', $content = '') {
|
||||||
return '<div class="progress"><div class="progress-bar ' . $class . '" role="progressbar" aria-valuenow="' . $valuenow . '" aria-valuemin="' . $valuemin . '" aria-valuemax="' . $valuemax . '" style="width: ' . (($valuenow - $valuemin) * 100 / ($valuemax - $valuemin)) . '%">' . $content . '</div></div>';
|
return '<div class="progress"><div class="progress-bar ' . $class . '" role="progressbar" aria-valuenow="' . $valuenow . '" aria-valuemin="' . $valuemin . '" aria-valuemax="' . $valuemax . '" style="width: ' . (($valuenow - $valuemin) * 100 / ($valuemax - $valuemin)) . '%">' . $content . '</div></div>';
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ class ShiftCalendarRenderer {
|
||||||
private $shiftsFilter;
|
private $shiftsFilter;
|
||||||
|
|
||||||
private $firstBlockStartTime = null;
|
private $firstBlockStartTime = null;
|
||||||
|
|
||||||
private $lastBlockEndTime = null;
|
private $lastBlockEndTime = null;
|
||||||
|
|
||||||
private $blocksPerSlot = null;
|
private $blocksPerSlot = null;
|
||||||
|
@ -85,7 +85,7 @@ class ShiftCalendarRenderer {
|
||||||
public function getFirstBlockStartTime() {
|
public function getFirstBlockStartTime() {
|
||||||
return $this->firstBlockStartTime;
|
return $this->firstBlockStartTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getLastBlockEndTime() {
|
public function getLastBlockEndTime() {
|
||||||
return $this->lastBlockEndTime;
|
return $this->lastBlockEndTime;
|
||||||
}
|
}
|
||||||
|
@ -106,7 +106,7 @@ class ShiftCalendarRenderer {
|
||||||
return div('shift-calendar', [
|
return div('shift-calendar', [
|
||||||
$this->renderTimeLane(),
|
$this->renderTimeLane(),
|
||||||
$this->renderShiftLanes()
|
$this->renderShiftLanes()
|
||||||
]);
|
]) . $this->renderLegend();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -222,6 +222,19 @@ class ShiftCalendarRenderer {
|
||||||
private function calcBlocksPerSlot() {
|
private function calcBlocksPerSlot() {
|
||||||
return ceil(($this->getLastBlockEndTime() - $this->getFirstBlockStartTime()) / ShiftCalendarRenderer::SECONDS_PER_ROW);
|
return ceil(($this->getLastBlockEndTime() - $this->getFirstBlockStartTime()) / ShiftCalendarRenderer::SECONDS_PER_ROW);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renders a legend explaining the shift coloring
|
||||||
|
*/
|
||||||
|
private function renderLegend() {
|
||||||
|
return div('legend', [
|
||||||
|
label(_('Your shift'), 'primary'),
|
||||||
|
label(_('Help needed'), 'danger'),
|
||||||
|
label(_('Other angeltype needed / collides with my shifts'), 'warning'),
|
||||||
|
label(_('Shift is full'), 'success'),
|
||||||
|
label(_('Shift running/ended'), 'default')
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
|
@ -6730,6 +6730,24 @@ body {
|
||||||
.footer a {
|
.footer a {
|
||||||
color: #777777;
|
color: #777777;
|
||||||
}
|
}
|
||||||
|
.panel-primary .panel-heading a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.panel-default .panel-heading a {
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
.panel-info .panel-heading a {
|
||||||
|
color: #31708f;
|
||||||
|
}
|
||||||
|
.panel-success .panel-heading a {
|
||||||
|
color: #3c763d;
|
||||||
|
}
|
||||||
|
.panel-warning .panel-heading a {
|
||||||
|
color: #8a6d3b;
|
||||||
|
}
|
||||||
|
.panel-danger .panel-heading a {
|
||||||
|
color: #a94442;
|
||||||
|
}
|
||||||
.shift-calendar {
|
.shift-calendar {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
|
@ -6744,7 +6762,7 @@ body {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
}
|
}
|
||||||
.shift-calendar .lane .header {
|
.shift-calendar .lane .header {
|
||||||
background: #fff;
|
background: #ffffff;
|
||||||
height: 30px;
|
height: 30px;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6753,6 +6753,24 @@ body {
|
||||||
.footer a {
|
.footer a {
|
||||||
color: #888888;
|
color: #888888;
|
||||||
}
|
}
|
||||||
|
.panel-primary .panel-heading a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.panel-default .panel-heading a {
|
||||||
|
color: #888888;
|
||||||
|
}
|
||||||
|
.panel-info .panel-heading a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.panel-success .panel-heading a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.panel-warning .panel-heading a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.panel-danger .panel-heading a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
.shift-calendar {
|
.shift-calendar {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
|
@ -6767,7 +6785,7 @@ body {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
}
|
}
|
||||||
.shift-calendar .lane .header {
|
.shift-calendar .lane .header {
|
||||||
background: #fff;
|
background: #222222;
|
||||||
height: 30px;
|
height: 30px;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6730,6 +6730,24 @@ body {
|
||||||
.footer a {
|
.footer a {
|
||||||
color: #777777;
|
color: #777777;
|
||||||
}
|
}
|
||||||
|
.panel-primary .panel-heading a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.panel-default .panel-heading a {
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
.panel-info .panel-heading a {
|
||||||
|
color: #826045;
|
||||||
|
}
|
||||||
|
.panel-success .panel-heading a {
|
||||||
|
color: #638232;
|
||||||
|
}
|
||||||
|
.panel-warning .panel-heading a {
|
||||||
|
color: #bc8640;
|
||||||
|
}
|
||||||
|
.panel-danger .panel-heading a {
|
||||||
|
color: #694374;
|
||||||
|
}
|
||||||
.shift-calendar {
|
.shift-calendar {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
|
@ -6744,7 +6762,7 @@ body {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
}
|
}
|
||||||
.shift-calendar .lane .header {
|
.shift-calendar .lane .header {
|
||||||
background: #fff;
|
background: #ffffff;
|
||||||
height: 30px;
|
height: 30px;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6739,6 +6739,24 @@ body {
|
||||||
.footer a {
|
.footer a {
|
||||||
color: #777777;
|
color: #777777;
|
||||||
}
|
}
|
||||||
|
.panel-primary .panel-heading a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.panel-default .panel-heading a {
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
.panel-info .panel-heading a {
|
||||||
|
color: #6618f9;
|
||||||
|
}
|
||||||
|
.panel-success .panel-heading a {
|
||||||
|
color: #39ab50;
|
||||||
|
}
|
||||||
|
.panel-warning .panel-heading a {
|
||||||
|
color: #dad216;
|
||||||
|
}
|
||||||
|
.panel-danger .panel-heading a {
|
||||||
|
color: #da1639;
|
||||||
|
}
|
||||||
.shift-calendar {
|
.shift-calendar {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
|
@ -6753,7 +6771,7 @@ body {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
}
|
}
|
||||||
.shift-calendar .lane .header {
|
.shift-calendar .lane .header {
|
||||||
background: #fff;
|
background: #ffffff;
|
||||||
height: 30px;
|
height: 30px;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,30 @@ body {
|
||||||
color: @text-muted;
|
color: @text-muted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.panel-primary .panel-heading a {
|
||||||
|
color: @panel-primary-text;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-default .panel-heading a {
|
||||||
|
color: @panel-default-text;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-info .panel-heading a {
|
||||||
|
color: @panel-info-text;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-success .panel-heading a {
|
||||||
|
color: @panel-success-text;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-warning .panel-heading a {
|
||||||
|
color: @panel-warning-text;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-danger .panel-heading a {
|
||||||
|
color: @panel-danger-text;
|
||||||
|
}
|
||||||
|
|
||||||
.shift-calendar {
|
.shift-calendar {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
|
@ -29,7 +53,7 @@ body {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
|
|
||||||
.header {
|
.header {
|
||||||
background: #fff;
|
background: @panel-bg;
|
||||||
height: 30px;
|
height: 30px;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue