Merge branch 'deingithub-dep-board-ui'

This commit is contained in:
Birte Kristina Friesel 2023-10-27 18:36:35 +02:00
commit adb830baa9
No known key found for this signature in database
GPG key ID: 19E6E524EBB177BA
12 changed files with 319 additions and 164 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -298,6 +298,20 @@ $(document).ready(function() {
$('a[href]').click(function() { $('a[href]').click(function() {
$('nav .preloader-wrapper').addClass('active'); $('nav .preloader-wrapper').addClass('active');
}); });
$('a[href="#now"]').keydown(function(event) {
// also trigger click handler on keyboard enter
if (event.keyCode == 13) {
event.preventDefault();
event.target.click();
}
});
$('a[href="#now"]').click(function(event) {
event.preventDefault();
$('nav .preloader-wrapper').removeClass('active');
now_el = $('#now')[0];
now_el.previousElementSibling.querySelector(".dep-time").focus();
now_el.scrollIntoView({behavior: "smooth", block: "center"});
});
const elems = document.querySelectorAll('.carousel'); const elems = document.querySelectorAll('.carousel');
const instances = M.Carousel.init(elems, { const instances = M.Carousel.init(elems, {
fullWidth: true, fullWidth: true,

File diff suppressed because one or more lines are too long

View file

@ -21,10 +21,6 @@
color: #f5c4ce !important; color: #f5c4ce !important;
} }
td.cancelled {
text-decoration: line-through;
}
.wagons span { .wagons span {
margin-right: 0.5ex; margin-right: 0.5ex;
color: #808080; color: #808080;
@ -72,7 +68,153 @@ ul.suggestions {
} }
} }
table.departures tr.now td {
padding-top: 2em; .departures li {
padding-bottom: 2em; transition: background .3s;
display: grid;
grid-template-columns: 10ch 10ch 1fr;
align-items: center;
&:not(#now):hover, &:focus-within {
background-color: $departures-highlight-color;
outline: 2px solid $link-color;
}
&.cancelled {
background-color: $departures-cancelled-color;
font-style: italic;
.dep-line {
background-color: transparent;
border: 1px solid;
color: $off-black;
}
.dep-time::after {
content: "";
font-style: normal;
}
}
&#now {
background-color: $departures-highlight-color;
padding: 2rem 20px;
grid-template-columns: 10ch 1fr;
strong {
font-weight: bold;
}
}
}
.departures .dep-time {
color: $off-black;
&:focus {
outline: none;
}
}
.departures .dep-dest {
margin-left: 0.8rem;
.followee-checkin {
font-size: 0.9rem;
display: block;
i.material-icons {
vertical-align: middle;
}
}
}
.departures .dep-line {
text-align: center;
padding: .2rem;
color: white;
background: color('grey', 'darken-3');
border-radius: .2rem;
display: inline-block;
font-weight: 600;
line-height: 1;
height: fit-content;
width: fit-content;
min-width: 6ch;
margin: 0 auto;
&.Bus, &.RUF, &.AST {
background-color: #a3167e;
border-radius: 5rem;
padding: .2rem .5rem;
}
&.STR {
background-color: #c5161c;
border-radius: 5rem;
padding: .2rem .5rem;
}
&.S, &.RS, &.RER, &.SKW {
background-color: #008d4f;
border-radius: 5rem;
padding: .2rem .5rem;
}
&.U, &.STB, &.M {
background-color: #014e8d;
border-radius: 5rem;
padding: .2rem .5rem;
}
&.RE, &.IRE, &.REX {
background-color: #ff4f00;
}
&.RB, &.MEX, &.TER, &.R {
background-color: #1f4a87;
}
// DE
&.IC, &.ICE, &.EC, &.ECE, &.D,
// CH
&.IR,
// FR
&.TGV, &.OGV, &.EST,
// PL
&.TLK, &.EIC {
background-color: #ff0404;
font-weight: 900;
font-style: italic;
padding: .2rem;
}
&.RJ, &.RJX {
background-color: #c63131;
}
&.NJ, &.EN {
background-color: #29255b;
}
&.WB {
background-color: #2e85ce;
}
&.FLX {
background-color: #71d800;
color: black;
}
}
.departures.connections {
li {
grid-template-columns: 15ch 10ch 1fr;
}
.connect-platform-wrapper {
text-align: center;
span {
display: block;
}
}
}
@media screen and (max-width: 600px) {
.departures li {
grid-template-columns: 10ch 1fr;
.dep-line, .dep-time, .connect-platform-wrapper {
grid-column: 1;
text-align: center;
}
.dep-dest {
grid-column: 2;
grid-row: 1 / span 2;
}
}
.departures.connections li {
grid-template-columns: 15ch 1fr;
.connect-platform-wrapper span {
display: inline;
}
}
} }

View file

@ -21,3 +21,6 @@ $table-striped-color: color('grey', 'darken-4');
$button-flat-color: $off-black; $button-flat-color: $off-black;
$card-bg-color: color('grey', 'darken-4'); $card-bg-color: color('grey', 'darken-4');
$card-link-color: $link-color; $card-link-color: $link-color;
$departures-highlight-color: $table-striped-color;
$departures-cancelled-color: #702020;

View file

@ -6,3 +6,5 @@ $collection-link-color: color('shades', 'black');
$card-bg-color: color('blue-grey', 'lighten-5'); $card-bg-color: color('blue-grey', 'lighten-5');
$inactive-color: color('grey', 'darken-2'); $inactive-color: color('grey', 'darken-2');
$input-label-color: color('shades', 'black'); $input-label-color: color('shades', 'black');
$departures-highlight-color: color('grey', 'lighten-3');
$departures-cancelled-color: color('red', 'lighten-4');

View file

@ -1,39 +1,48 @@
<div><table class="striped"><tbody> <ul class="collection departures connections">
% for my $res (@{$connections}) { % for my $res (@{$connections}) {
% my ($train, $via, $via_arr, $load) = @{$res}; % my ($train, $via, $via_arr, $load) = @{$res};
% $via_arr = $via_arr ? $via_arr->strftime('%H:%M') : q{}; % $via_arr = $via_arr ? $via_arr->strftime('%H:%M') : q{};
% my $td_class = ''; % my $row_class = '';
% my $link_class = 'action-checkin'; % my $link_class = 'action-checkin';
% if ($train->is_cancelled) { % if ($train->is_cancelled) {
% $td_class = 'cancelled'; % $row_class = 'cancelled';
% $link_class = 'action-cancelled-from'; % $link_class = 'action-cancelled-from';
% } % }
% if ($checkin_from) { % if ($checkin_from) {
<tr class="<%= $link_class %>" data-station="<%= $train->station_uic %>" data-train="<%= $train->train_id %>" data-ts="<%= ($train->sched_departure // $train->departure)->epoch %>" data-dest="<%= $via->{name} %>"> <li class="collection-item <%= $row_class %> <%= $link_class %>"
data-station="<%= $train->station_uic %>"
data-train="<%= $train->train_id %>"
data-ts="<%= ($train->sched_departure // $train->departure)->epoch %>"
data-dest="<%= $via->{name} %>">
% } % }
% else { % else {
<tr> <li class="collection-item">
% } % }
<td class="<%= $td_class %>"> <a class="dep-time" href="#">
% if ($train->platform) { % if ($train->departure_is_cancelled) {
% if ($checkin_from) { %= $train->sched_departure->strftime('%H:%M')
<a>Gleis <%= $train->platform %></a>
% }
% else {
Gleis <%= $train->platform %>
% }
<br/>
% }
% if ($checkin_from) {
<a><%= $train->line %></a>
% } % }
% else { % else {
%= $train->line %= $train->departure->strftime('%H:%M')
% } % }
</td> % if ($via_arr) {
<td class="<%= $td_class %>"> → <%= $via_arr %>
% if ($checkin_from) { % }
<a><%= $via->{name} %></a> % if ($train->departure_delay) {
%= sprintf('(%+d)', $train->departure_delay)
% }
</a>
<span class="connect-platform-wrapper">
% if ($train->platform) {
<span>Gleis <%= $train->platform %></span>
% }
<span class="dep-line <%= $train->type // q{} %>">
%= $train->line
</span>
</span>
<span class="dep-dest">
% if ($train->is_cancelled) {
Fahrt nach <%= $via->{name} %> entfällt
% } % }
% else { % else {
%= $via->{name} %= $via->{name}
@ -61,22 +70,7 @@
% if ($train->{message_id}{70} or $train->{message_id}{71}) { % if ($train->{message_id}{70} or $train->{message_id}{71}) {
<i class="material-icons tiny" aria-label="Ohne WLAN">portable_wifi_off</i> <i class="material-icons tiny" aria-label="Ohne WLAN">portable_wifi_off</i>
% } % }
</td> </span>
<td> </li>
% if ($train->departure_is_cancelled) {
%= $train->sched_departure->strftime('%H:%M')
% }
% else {
%= $train->departure->strftime('%H:%M')
% }
% if ($via_arr) {
→ <%= $via_arr %>
% }
% if ($train->departure_delay) {
%= sprintf('(%+d)', $train->departure_delay)
% }
</td>
</tr>
% } % }
</tbody></table></div> </ul>

View file

@ -1,48 +1,26 @@
<div><table class="striped"><tbody> <ul class="collection departures connections">
% for my $res (@{$connections}) { % for my $res (@{$connections}) {
% my ($train, $via, $via_arr) = @{$res}; % my ($train, $via, $via_arr) = @{$res};
% $via_arr = $via_arr ? $via_arr->strftime('%H:%M') : q{}; % $via_arr = $via_arr ? $via_arr->strftime('%H:%M') : q{};
% my $td_class = ''; % my $row_class = '';
% my $link_class = 'action-checkin'; % my $link_class = 'action-checkin';
% if ($train->is_cancelled) { % if ($train->is_cancelled) {
% $td_class = 'cancelled'; % $row_class = 'cancelled';
% $link_class = 'action-cancelled-from'; % $link_class = 'action-cancelled-from';
% } % }
% if ($checkin_from) { % if ($checkin_from) {
<tr class="<%= $link_class %>" data-station="<%= $train->station_eva %>" data-train="<%= $train->id %>" data-ts="<%= ($train->sched_datetime // $train->datetime)->epoch %>" data-dest="<%= $via->{name} %>"> <li class="collection-item <%= $row_class %> <%= $link_class %>"
data-station="<%= $train->station_eva %>"
data-train="<%= $train->id %>"
data-ts="<%= ($train->sched_datetime // $train->datetime)->epoch %>"
data-dest="<%= $via->{name} %>">
% } % }
% else { % else {
<tr> <li class="collection-item">
% } % }
<td class="<%= $td_class %>"> <a class="dep-time" href="#">
% if ($train->platform) {
% if ($checkin_from) {
<a>Gleis <%= $train->platform %></a>
% }
% else {
Gleis <%= $train->platform %>
% }
<br/>
% }
% if ($checkin_from) {
<a><%= $train->line %></a>
% }
% else {
%= $train->line
% }
</td>
<td class="<%= $td_class %>">
% if ($checkin_from) {
<a><%= $via->{name} %></a>
% }
% else {
%= $via->{name}
% }
</td>
<td>
% if ($train->is_cancelled) { % if ($train->is_cancelled) {
%= $train->sched_datetime->strftime('%H:%M') %= $train->sched_datetime->strftime('%H:%M')
% } % }
% else { % else {
%= $train->datetime->strftime('%H:%M') %= $train->datetime->strftime('%H:%M')
@ -53,7 +31,18 @@
% if ($train->delay) { % if ($train->delay) {
%= sprintf('(%+d)', $train->delay) %= sprintf('(%+d)', $train->delay)
% } % }
</td> </a>
</tr> <span class="connect-platform-wrapper">
% if ($train->platform) {
<span>Gleis <%= $train->platform %></span>
% }
<span class="dep-line <%= $train->type // q{} %>">
%= $train->line
</span>
</span>
<span class="dep-dest">
%= $via->{name}
</span>
</li>
% } % }
</tbody></table></div> </ul>

View file

@ -1,39 +1,28 @@
<table class="striped departures"> <ul class="collection departures">
<tbody>
% my $orientation_bar_shown = param('train'); % my $orientation_bar_shown = param('train');
% my $now_epoch = now->epoch; % my $now_epoch = now->epoch;
% for my $result (@{$results}) { % for my $result (@{$results}) {
% my $td_class = ''; % my $row_class = '';
% my $link_class = 'action-checkin'; % my $link_class = 'action-checkin';
% if ($result->is_cancelled) { % if ($result->is_cancelled) {
% $td_class = "cancelled"; % $row_class = "cancelled";
% $link_class = 'action-cancelled-from'; % $link_class = 'action-cancelled-from';
% } % }
% if (not $orientation_bar_shown and $result->datetime->epoch < $now_epoch) { % if (not $orientation_bar_shown and $result->datetime->epoch < $now_epoch) {
% $orientation_bar_shown = 1; % $orientation_bar_shown = 1;
<tr class="now"> <li class="collection-item" id="now">
<td> <strong class="dep-time">
</td>
<td>
<strong>— Anfragezeitpunkt —</strong>
</td>
<td><strong>
%= now->strftime('%H:%M') %= now->strftime('%H:%M')
</strong></td> </strong>
</tr> <strong>— Anfragezeitpunkt —</strong>
</li>
% } % }
<tr class="<%= $link_class %>" data-station="<%= $result->station_eva %>" data-train="<%= $result->id %>" data-ts="<%= ($result->sched_datetime // $result->datetime)->epoch %>" data-tr="3"> <li class="collection-item <%= $link_class %> <%= $row_class %>"
<td> data-station="<%= $result->station_eva %>"
<a> data-train="<%= $result->id %>"
<%= $result->line %> data-ts="<%= ($result->sched_datetime // $result->datetime)->epoch %>"
</a> >
</td> <a class="dep-time" href="#">
<td class="<%= $td_class %>">
<a>
<%= $result->destination %>
</a>
</td>
<td class="<%= $td_class %>">
%= $result->datetime->strftime('%H:%M') %= $result->datetime->strftime('%H:%M')
% if ($result->delay) { % if ($result->delay) {
(<%= sprintf('%+d', $result->delay) %>) (<%= sprintf('%+d', $result->delay) %>)
@ -41,8 +30,24 @@
% elsif (not defined $result->delay and not $result->is_cancelled) { % elsif (not defined $result->delay and not $result->is_cancelled) {
<i class="material-icons" aria-label="Keine Echtzeitdaten vorhanden" style="font-size: 16px;">gps_off</i> <i class="material-icons" aria-label="Keine Echtzeitdaten vorhanden" style="font-size: 16px;">gps_off</i>
% } % }
</td> </a>
</tr> <span class="dep-line <%= $result->type // q{} %>">
%= $result->line
</span>
<span class="dep-dest">
% if ($result->is_cancelled) {
Fahrt nach <%= $result->destination %> entfällt
% }
% else {
%= $result->destination
% for my $checkin (@{$checkin_by_train->{$result->id} // []}) {
<span class="followee-checkin">
<i class="material-icons tiny" aria-label="Eine Person, der du folgst, ist hier eingecheckt">people</i>
<%= $checkin->{followee_name} %> → <%= $checkin->{arr_name} // '???' %>
</span>
% }
% }
</span>
</li>
% } % }
</tbody> </ul>
</table>

View file

@ -1,42 +1,28 @@
<table class="striped departures"> <ul class="collection departures">
<tbody>
% my $orientation_bar_shown = param('train'); % my $orientation_bar_shown = param('train');
% my $now_epoch = now->epoch; % my $now_epoch = now->epoch;
% for my $result (@{$results}) { % for my $result (@{$results}) {
% my $td_class = ''; % my $row_class = '';
% my $link_class = 'action-checkin'; % my $link_class = 'action-checkin';
% if ($result->departure_is_cancelled) { % if ($result->departure_is_cancelled) {
% $td_class = "cancelled"; % $row_class = "cancelled";
% $link_class = 'action-cancelled-from'; % $link_class = 'action-cancelled-from';
% } % }
% if (not $orientation_bar_shown and $result->departure->epoch < $now_epoch) { % if (not $orientation_bar_shown and $result->departure->epoch < $now_epoch) {
% $orientation_bar_shown = 1; % $orientation_bar_shown = 1;
<tr class="now"> <li class="collection-item" id="now">
<td> <strong class="dep-time">
</td>
<td>
<strong>— Anfragezeitpunkt —</strong>
</td>
<td><strong>
%= now->strftime('%H:%M') %= now->strftime('%H:%M')
</strong></td> </strong>
</tr> <strong>— Anfragezeitpunkt —</strong>
</li>
% } % }
<tr class="<%= $link_class %>" data-station="<%= $result->station_uic %>" data-train="<%= $result->train_id %>" data-ts="<%= ($result->sched_departure // $result->departure)->epoch %>" data-tr="3"> <li class="collection-item <%= $link_class %> <%= $row_class %>"
<td> data-station="<%= $result->station_uic %>"
<a> data-train="<%= $result->train_id %>"
<%= $result->line %> data-ts="<%= ($result->sched_departure // $result->departure)->epoch %>"
</a> >
</td> <a class="dep-time" href="#">
<td class="<%= $td_class %>">
<a>
<%= $result->destination %>
</a>
% for my $checkin (@{$checkin_by_train->{$result->train_id} // []}) {
<br/>(<%= $checkin->{followee_name} %> → <%= $checkin->{arr_name} // '???' %>)
% }
</td>
<td class="<%= $td_class %>">
% if ($result->departure_hidden) { % if ($result->departure_hidden) {
(<%= $result->departure->strftime('%H:%M') %>) (<%= $result->departure->strftime('%H:%M') %>)
% } % }
@ -49,8 +35,24 @@
% elsif (not $result->has_realtime and $result->start->epoch < $now_epoch) { % elsif (not $result->has_realtime and $result->start->epoch < $now_epoch) {
<i class="material-icons" aria-label="Keine Echtzeitdaten vorhanden" style="font-size: 16px;">gps_off</i> <i class="material-icons" aria-label="Keine Echtzeitdaten vorhanden" style="font-size: 16px;">gps_off</i>
% } % }
</td> </a>
</tr> <span class="dep-line <%= $result->type // q{} %>">
%= $result->line
</span>
<span class="dep-dest">
% if ($result->departure_is_cancelled) {
Fahrt nach <%= $result->destination %> entfällt
% }
% else {
%= $result->destination
% for my $checkin (@{$checkin_by_train->{$result->train_id} // []}) {
<span class="followee-checkin">
<i class="material-icons tiny" aria-label="Eine Person, der du folgst, ist hier eingecheckt">people</i>
<%= $checkin->{followee_name} %> → <%= $checkin->{arr_name} // '???' %>
</span>
% }
% }
</span>
</li>
% } % }
</tbody> </ul>
</table>

View file

@ -1,24 +1,28 @@
<div class="row"> <div class="row">
<div class="col s12 center-align"> <div class="col s12">
<i class="tiny material-icons "><%= param('hafas') ? 'directions' : 'train' %></i> <h2>
<b><%= $station %></b> <i class="material-icons " aria-hidden="true"><%= param('hafas') ? 'directions' : 'train' %></i>
<%= $station %>
</h2>
% for my $related_station (sort { $a->{name} cmp $b->{name} } @{$related_stations}) { % for my $related_station (sort { $a->{name} cmp $b->{name} } @{$related_stations}) {
<br/>+ <%= $related_station->{name} %> + <%= $related_station->{name} %> <br/>
% } % }
</div> </div>
</div> </div>
% if ($api_link) { <div class="row">
<div class="row"> <div class="col s12">
<div class="col s12 center-align"> % if ($api_link) {
% if (param('hafas')) { % if (param('hafas')) {
<a href="<%= $api_link %>">zum Schienenverkehr</a> <a href="<%= $api_link %>" class="btn-small"><i class="material-icons left" aria-hidden="true">train</i>zum Schienenverkehr</a>
% } % }
% else { % else {
<a href="<%= $api_link %>">zum Nahverkehr</a> <a href="<%= $api_link %>" class="btn-small"><i class="material-icons left" aria-hidden="true">directions</i>zum Nahverkehr</a>
% } % }
</div> % }
<a class="btn-small" href="#now"><i class="material-icons left" aria-hidden="true">vertical_align_center</i>Jetzt</a>
</div> </div>
% } </div>
% my $have_connections = 0; % my $have_connections = 0;
% if ($user_status->{checked_in}) { % if ($user_status->{checked_in}) {
<div class="row"> <div class="row">
@ -49,7 +53,7 @@
<i class="material-icons left" aria-hidden="true">undo</i> Rückgängig <i class="material-icons left" aria-hidden="true">undo</i> Rückgängig
</a> </a>
<a class="action-checkout right" data-station="<%= $eva %>" data-force="1"> <a class="action-checkout right" data-station="<%= $eva %>" data-force="1">
<i class="material-icons left">gps_off</i> <i class="material-icons left" aria-hidden="true">gps_off</i>
Hier auschecken Hier auschecken
</a> </a>
% } % }