diff --git a/includes/model/Shifts_model.php b/includes/model/Shifts_model.php
index 3d3fa356..2db0a3d3 100644
--- a/includes/model/Shifts_model.php
+++ b/includes/model/Shifts_model.php
@@ -133,6 +133,24 @@ function Shift_signup_allowed($user, $shift, $angeltype, $user_angeltype = null,
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']) {
// you can only join if the shift is in future
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);
}
- if ($user_shifts == null) {
- $user_shifts = Shifts_by_user($user);
- }
-
if (Shift_collides($shift, $user_shifts)) {
// you cannot join if user alread joined a parallel or this shift
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!
return new ShiftSignupState(ShiftSignupState::FREE, $free_entries);
}
diff --git a/includes/sys_template.php b/includes/sys_template.php
index 5d450493..bd53ecaa 100644
--- a/includes/sys_template.php
+++ b/includes/sys_template.php
@@ -19,6 +19,18 @@ function mute($text) {
return '' . $text . '';
}
+/**
+ * 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 '' . $content . '';
+}
+
function progress_bar($valuemin, $valuemax, $valuenow, $class = '', $content = '') {
return '
';
}
diff --git a/includes/view/ShiftCalendarRenderer.php b/includes/view/ShiftCalendarRenderer.php
index 989bd890..89c1be4c 100644
--- a/includes/view/ShiftCalendarRenderer.php
+++ b/includes/view/ShiftCalendarRenderer.php
@@ -25,7 +25,7 @@ class ShiftCalendarRenderer {
private $shiftsFilter;
private $firstBlockStartTime = null;
-
+
private $lastBlockEndTime = null;
private $blocksPerSlot = null;
@@ -85,7 +85,7 @@ class ShiftCalendarRenderer {
public function getFirstBlockStartTime() {
return $this->firstBlockStartTime;
}
-
+
public function getLastBlockEndTime() {
return $this->lastBlockEndTime;
}
@@ -106,7 +106,7 @@ class ShiftCalendarRenderer {
return div('shift-calendar', [
$this->renderTimeLane(),
$this->renderShiftLanes()
- ]);
+ ]) . $this->renderLegend();
}
/**
@@ -222,6 +222,19 @@ class ShiftCalendarRenderer {
private function calcBlocksPerSlot() {
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')
+ ]);
+ }
}
?>
\ No newline at end of file
diff --git a/public/css/theme0.css b/public/css/theme0.css
index daba1eba..02bdeb7f 100644
--- a/public/css/theme0.css
+++ b/public/css/theme0.css
@@ -6730,6 +6730,24 @@ body {
.footer a {
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 {
display: flex;
flex-direction: row;
@@ -6744,7 +6762,7 @@ body {
flex-grow: 1;
}
.shift-calendar .lane .header {
- background: #fff;
+ background: #ffffff;
height: 30px;
padding: 5px;
}
diff --git a/public/css/theme1.css b/public/css/theme1.css
index e9b6b4cd..d9cf7b73 100644
--- a/public/css/theme1.css
+++ b/public/css/theme1.css
@@ -6753,6 +6753,24 @@ body {
.footer a {
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 {
display: flex;
flex-direction: row;
@@ -6767,7 +6785,7 @@ body {
flex-grow: 1;
}
.shift-calendar .lane .header {
- background: #fff;
+ background: #222222;
height: 30px;
padding: 5px;
}
diff --git a/public/css/theme2.css b/public/css/theme2.css
index 7646f08b..4b6b1d67 100644
--- a/public/css/theme2.css
+++ b/public/css/theme2.css
@@ -6730,6 +6730,24 @@ body {
.footer a {
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 {
display: flex;
flex-direction: row;
@@ -6744,7 +6762,7 @@ body {
flex-grow: 1;
}
.shift-calendar .lane .header {
- background: #fff;
+ background: #ffffff;
height: 30px;
padding: 5px;
}
diff --git a/public/css/theme3.css b/public/css/theme3.css
index 014fee12..dd65c030 100644
--- a/public/css/theme3.css
+++ b/public/css/theme3.css
@@ -6739,6 +6739,24 @@ body {
.footer a {
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 {
display: flex;
flex-direction: row;
@@ -6753,7 +6771,7 @@ body {
flex-grow: 1;
}
.shift-calendar .lane .header {
- background: #fff;
+ background: #ffffff;
height: 30px;
padding: 5px;
}
diff --git a/themes/base.less b/themes/base.less
index 98c12514..3cef3d11 100644
--- a/themes/base.less
+++ b/themes/base.less
@@ -10,6 +10,30 @@ body {
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 {
display: flex;
flex-direction: row;
@@ -29,7 +53,7 @@ body {
flex-grow: 1;
.header {
- background: #fff;
+ background: @panel-bg;
height: 30px;
padding: 5px;
}