auto.bus_razor/TicketOffice/Pages/Routes/Index.cshtml
cuqmbr c47d67b15d feat: places' availability depends on bought tickets
if cities in route you're searching for intersects with cities in the smb's ticket for the route, taken place will be unavailable and capacity in the search results will be decreased
2022-05-28 20:10:50 +03:00

386 lines
21 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@page
@using System.Globalization
@using TicketOffice.Models
@model TicketOffice.Pages.Routes.IndexModel
@{
Layout = "~/Pages/Shared/_Layout.cshtml";
ViewData["Title"] = "Пошу маршрутів";
CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("uk-UA");
}
<link rel="stylesheet" href="~/css/Routes.css"/>
<link rel="stylesheet" href="~/css/CityListPopup.css"/>
<link rel="stylesheet" href="~/css/TicketOrderPopup.css"/>
<div class="wrapper">
<form class="search-block">
<div class="opt">
<div class="station">
<div class="title">
Звідки
</div>
<input class="search-input" type="text" autocomplete="off" asp-for="From">
</div>
<a class="change-dir"></a>
<div class="station">
<div class="title">
Куди
</div>
<input class="search-input" type="text" autocomplete="off" asp-for="To">
</div>
<div class="date">
<div class="title">
Дата відправлення
</div>
<input class="search-input" type="date" value="@Model.Date.ToString("yyyy-MM-dd")" asp-for="Date">
</div>
<div class="search-btn">
<input type="submit" class="search-btn" value="Пошук"/>
</div>
</div>
</form>
@if (Model.Routes != null && Model.Routes.Count > 0)
{
<div class="route-list">
<table>
<thead>
<tr>
<th>
№ автобуса
@if (Model.SortString == "increasingNumber")
{
<a class="link-btn-sort" asp-page-handler="SortByNumber" asp-route-SortString="descendingNumber" asp-route-From=@Model.From a in a asp-route-To=@Model.To asp-route-Date=@Model.Date.ToString("yyyy-MM-dd")>🠕</a>
}
else if (Model.SortString == "descendingNumber")
{
<a class="link-btn-sort" asp-page-handler="SortByNumber" asp-route-SortString="increasingNumber" asp-route-From=@Model.From a in a asp-route-To=@Model.To asp-route-Date=@Model.Date.ToString("yyyy-MM-dd")>🠗</a>
}
else
{
<a class="link-btn-sort" asp-page-handler="SortByNumber" asp-route-SortString="increasingNumber" asp-route-From=@Model.From a in a asp-route-To=@Model.To asp-route-Date=@Model.Date.ToString("yyyy-MM-dd")>⮁</a>
}
</th>
<th>
Звідки / Куди
</th>
<th>
Дата
</th>
<th>
<div class="departure">
Відправлення
@if (Model.SortString == "increasingDeparture")
{
<a class="link-btn-sort" asp-page-handler="SortByDeparture" asp-route-SortString="descendingDeparture" asp-route-From=@Model.From a in a asp-route-To=@Model.To asp-route-Date=@Model.Date.ToString("yyyy-MM-dd")>🠕</a>
}
else if (Model.SortString == "descendingDeparture")
{
<a class="link-btn-sort" asp-page-handler="SortByDeparture" asp-route-SortString="increasingDeparture" asp-route-From=@Model.From a in a asp-route-To=@Model.To asp-route-Date=@Model.Date.ToString("yyyy-MM-dd")>🠗</a>
}
else
{
<a class="link-btn-sort" asp-page-handler="SortByDeparture" asp-route-SortString="increasingDeparture" asp-route-From=@Model.From a in a asp-route-To=@Model.To asp-route-Date=@Model.Date.ToString("yyyy-MM-dd")>⮁</a>
}
</div>
<div class="arrival">
Прибуття
@if (Model.SortString == "increasingArrival")
{
<a class="link-btn-sort" asp-page-handler="SortByArrival" asp-route-SortString="descendingArrival" asp-route-From=@Model.From a in a asp-route-To=@Model.To asp-route-Date=@Model.Date.ToString("yyyy-MM-dd")>🠕</a>
}
else if (Model.SortString == "descendingArrival")
{
<a class="link-btn-sort" asp-page-handler="SortByArrival" asp-route-SortString="increasingArrival" asp-route-From=@Model.From a in a asp-route-To=@Model.To asp-route-Date=@Model.Date.ToString("yyyy-MM-dd")>🠗</a>
}
else
{
<a class="link-btn-sort" asp-page-handler="SortByArrival" asp-route-SortString="increasingArrival" asp-route-From=@Model.From a in a asp-route-To=@Model.To asp-route-Date=@Model.Date.ToString("yyyy-MM-dd")>⮁</a>
}
</div>
</th>
<th>
Тривалість
@if (Model.SortString == "increasingDuration")
{
<a class="link-btn-sort" asp-page-handler="SortByDuration" asp-route-SortString="descendingDuration" asp-route-From=@Model.From a in a asp-route-To=@Model.To asp-route-Date=@Model.Date.ToString("yyyy-MM-dd")>🠕</a>
}
else if (Model.SortString == "descendingDuration")
{
<a class="link-btn-sort" asp-page-handler="SortByDuration" asp-route-SortString="increasingDuration" asp-route-From=@Model.From a in a asp-route-To=@Model.To asp-route-Date=@Model.Date.ToString("yyyy-MM-dd")>🠗</a>
}
else
{
<a class="link-btn-sort" asp-page-handler="SortByDuration" asp-route-SortString="increasingDuration" asp-route-From=@Model.From a in a asp-route-To=@Model.To asp-route-Date=@Model.Date.ToString("yyyy-MM-dd")>⮁</a>
}
</th>
<th>
Вільніих місць
</th>
<th>
Дії
</th>
</tr>
</thead>
<tbody>
@foreach (var route in Model.Routes)
{
<tr class="table-row">
<td class="num">
<div>@route.Number</div>
<div class="city-list-btn"><a class="city-list-btn" onclick="document.getElementById('popup-city-list-@route.Id').style.display = 'inherit'">Маршрут</a></div>
</td>
<td class="city">
<div>@route.Cities.First().Name</div>
<div>@route.Cities.Last().Name</div>
</td>
<td>
<div class="route-date">
<span>
Відправлення
</span>
<span>
@route.Cities.First().ArrivalTime?.ToString("f").Split(",")[0].ToLower(),
@route.Cities.First().DepartureTime?.ToString("dd.MM.yyyy")
</span>
</div>
<div class="route-date">
<span>Прибуття</span>
<span>
@route.Cities.Last().ArrivalTime?.ToString("f").Split(",")[0].ToLower(),
@route.Cities.Last().ArrivalTime?.ToString("dd.MM.yyyy")
</span>
</div>
</td>
<td class="time">
<div>@route.Cities.First().DepartureTime?.ToString("HH:mm")</div>
<div>@route.Cities.Last().ArrivalTime?.ToString("HH:mm")</div>
</td>
<td class="duration">
@{ TimeSpan? duration = route.Cities.Last().ArrivalTime - route.Cities.First().DepartureTime; }
@($"{duration?.TotalHours.ToString().Split(",")[0]}:{duration?.Minutes}")
</td>
<td class="capacity">
@Model.GetRemainingCapacity(route)
</td>
<td class="action">
<a class="link-btn-choose" onclick="document.getElementById('popup-ticket-@route.Id').style.display = 'inherit'">Обрати</a>
</td>
</tr>
}
</tbody>
</table>
</div>
}
else if (Model.Routes == null)
{
<div class="search-error">
<p>Уведіть дату й місто відправлення або прибуття</p>
</div>
}
else
{
<div class="search-error">
<p>По заданому Вами напрямку місць немає</p>
</div>
}
</div>
@if (Model.Routes is not null)
{
foreach (var route in Model.Routes)
{
<div class="popup-container-city-list" id="popup-city-list-@route.Id">
<div class="popup-city-list">
<div class="popup-header-city-list">
Автобус №@route.Number
</div>
<div class="popup-body-city-list">
<table class="city-list">
<thead>
<tr class="tr-intermediate city-list">
<th class="th-route city-list">
Інформація
</th>
<th class="th-route city-list">
Місто
</th>
<th class="th-route city-list">
Час прибуття
</th>
<th class="th-route city-list">
Час відправлення
</th>
</tr>
</thead>
<tbody>
<tr class="tr-departure city-list">
<td class="td-route city-list">
Відправлення
</td>
<td class="td-route city-list">
@route.Cities.First().Name
</td>
<td class="td-route city-list">
-
</td>
<td class="td-route city-list">
@route.Cities.First().DepartureTime?.ToString("HH:mm")
</td>
</tr>
@for (int i = 1; i < route.Cities.Count - 1; i++)
{
<tr class="tr-intermediate city-list">
<td class="td-route city-list">
Проміжна станція
</td>
<td class="td-route city-list">
@route.Cities.ToList()[i].Name
</td>
<td class="td-route city-list">
@route.Cities.ToList()[i].ArrivalTime?.ToString("HH:mm")
</td>
<td class="td-route city-list">
@route.Cities.ToList()[i].DepartureTime?.ToString("HH:mm")
</td>
</tr>
}
<tr class="tr-arrival city-list">
<td class="td-route city-list">
Прибуття
</td>
<td class="td-route city-list">
@route.Cities.Last().Name
</td>
<td class="td-route city-list">
@route.Cities.Last().ArrivalTime?.ToString("HH:mm")
</td>
<td class="td-route city-list">
-
</td>
</tr>
</tbody>
</table>
</div>
<div class="popup-footer-city-list">
<a class="popup-footer-link-button-city-list" onclick="document.getElementById('popup-city-list-@route.Id').style.display = 'none'">Закрити</a>
</div>
</div>
</div>
<div class="popup-container-ticket-order" id="popup-ticket-@route.Id" style='display:@(Model.Ticket is not null && Model.Ticket.RouteId == route.Id ? "inherit" : "none")'>
<div class="ticket">
<div class="ticket-header">
Купити квиток
</div>
<div class="ticket-body">
<div class="ticket-body-main">
<form class="ticket-form" method="post" id="ticket-form-@route.Id" novalidate>
<div class="ticket-input-item" style="margin-right: 0.5rem">
@if (HttpContext.Session.GetInt32("UserId").HasValue)
{
<input class="ticket-input-lastname" type="text" placeholder="Прізвище" asp-for="Ticket.PassengerLastName"/>
}
else
{
<input class="ticket-input-lastname" type="text" placeholder="Прізвище" readonly/>
}
<div
class="ticket-validation-error"><span>@(Model.Ticket is not null && Model.Ticket.RouteId == route.Id ? Model.PassengerLastNameValidationError : "")</span></div>
</div>
<div class="ticket-input-item" style="margin-left: 0.5rem; margin-right: 0.5rem">
@if (HttpContext.Session.GetInt32("UserId").HasValue)
{
<input class="ticket-input-firstname" type="text" placeholder="Ім'я" asp-for="Ticket.PassengerFirstName"/>
}
else
{
<input class="ticket-input-firstname" type="text" placeholder="Ім'я" readonly/>
}
<div
class="ticket-validation-error"><span>@(Model.Ticket is not null && Model.Ticket.RouteId == route.Id ? Model.PassengerFirstNameValidationError : "")</span></div>
</div>
<div class="ticket-input-item" style="margin-left: 0.5rem">
<select class="ticket-place-select" required asp-for="Ticket.PassengerPlace">
<option selected disabled value="">Місце</option>
@for (int i = 1; i <= route.Capacity; i++)
{
if (route.Tickets.Any(t => @Model.GetCitiesNames(t.Cities.ToList()).Intersect(@Model.GetCitiesNames(route.Cities.ToList())).ToList().Any() && t.PassengerPlace == i))
{
<option value="@i" disabled>@i - Місце зайняте</option>
}
else
{
<option value="@i">@i</option>
}
}
</select>
<div
class="ticket-validation-error"><span>@(Model.Ticket is not null && Model.Ticket.RouteId == route.Id ? Model.PassengerPlaceValidationError : "")</span></div>
</div>
<input type="number" value="@route.Id" style="display: none;" asp-for="Ticket.RouteId"/>
<input type="number" value="@HttpContext.Session.GetInt32("UserId")" style="display: none;" asp-for="Ticket.UserId"/>
</form>
<div class="ticket-info">
<div class="ticket-info-line">
<div class="ticket-info-line-left">
Номер маршруту
</div>
<div class="ticket-info-line-right">
№ @route.Number
</div>
</div>
<div class="ticket-info-line">
<div class="ticket-info-line-left">
Дата відправлення
</div>
<div class="ticket-info-line-right">
@route.Cities.First().DepartureTime?.ToString("f").Split(",")[0].ToLower(),
@route.Cities.First().DepartureTime?.ToString("dd.MM.yyyy"),
@route.Cities.First().DepartureTime?.ToString("HH:mm"),
@route.Cities.First().Name
</div>
</div>
<div class="ticket-info-line">
<div class="ticket-info-line-left">
Дата прибуття
</div>
<div class="ticket-info-line-right">
<div class="ticket-info-line-right-block">
@route.Cities.Last().ArrivalTime?.ToString("f").Split(",")[0].ToLower(),&nbsp;
</div>
<div class="ticket-info-line-right-block">
@route.Cities.Last().ArrivalTime?.ToString("dd.MM.yyyy"),&nbsp;
</div>
<div class="ticket-info-line-right-block">
@route.Cities.Last().ArrivalTime?.ToString("HH:mm"),&nbsp;
</div>
<div class="ticket-info-line-right-block">
@route.Cities.Last().Name
</div>
</div>
</div>
</div>
</div>
<div class="ticket-body-footer">
<a class="popup-footer-link-button-ticket-order" onclick="document.getElementById('popup-ticket-@route.Id').style.display = 'none'">Закрити</a>
@if (HttpContext.Session.GetString("UserId") != null)
{
<input class="popup-footer-button-ticket-order" type="submit" form="ticket-form-@route.Id" value="Купити">
}
else
{
<a class="popup-footer-link-button-ticket-order" href="/Auth/Login">Авторизуватись</a>
}
</div>
</div>
</div>
</div>
}
}