Buchungsseite + Fancy Kalender
This commit is contained in:
parent
de2c369350
commit
059218eb19
139
OnProfNext.Client/Pages/Bookings/BookingEntry.razor
Normal file
139
OnProfNext.Client/Pages/Bookings/BookingEntry.razor
Normal file
@ -0,0 +1,139 @@
|
||||
@page "/booking-entry"
|
||||
@using OnProfNext.Client.Services
|
||||
@using OnProfNext.Shared.Models.DTOs
|
||||
@inject BookingApiService BookingService
|
||||
@inject OrderApiService OrderService
|
||||
@inject NavigationManager Navigation
|
||||
|
||||
<h3 class="mb-4 d-flex justify-content-between align-items-center">
|
||||
<span class="text-primary">Zeit buchen</span>
|
||||
<button class="btn btn-outline-secondary" @onclick="GoBack">
|
||||
<i class="bi bi-arrow-left"></i> Zurück
|
||||
</button>
|
||||
</h3>
|
||||
|
||||
@if (isLoading)
|
||||
{
|
||||
<div class="text-center mt-5">
|
||||
<div class="spinner-border text-primary" role="status"></div>
|
||||
<p class="mt-3 text-secondary">Daten werden geladen...</p>
|
||||
</div>
|
||||
}
|
||||
else if (errorMessage is not null)
|
||||
{
|
||||
<div class="alert alert-danger">@errorMessage</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<ul class="nav nav-tabs mb-3">
|
||||
<li class="nav-item">
|
||||
<button class="nav-link @(activeView == ViewType.Classic ? "active" : "")"
|
||||
@onclick="() => activeView = ViewType.Classic">
|
||||
<i class="bi bi-calendar-month me-1"></i> Klassische Ansicht
|
||||
</button>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<button class="nav-link @(activeView == ViewType.Fancy ? "active" : "")"
|
||||
@onclick="() => activeView = ViewType.Fancy">
|
||||
<i class="bi bi-calendar-week me-1"></i> Fancy Ansicht
|
||||
</button>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content p-3 border rounded bg-white shadow-sm">
|
||||
@if (activeView == ViewType.Classic)
|
||||
{
|
||||
<ClassicView Bookings="MyBookings" Orders="AvailableOrders"
|
||||
OnBookingCreated="ReloadBookings" OnError="ShowError" />
|
||||
}
|
||||
else
|
||||
{
|
||||
<FancyView Bookings="MyBookings" Orders="AvailableOrders"
|
||||
OnBookingCreated="ReloadBookings" OnError="ShowError" />
|
||||
}
|
||||
</div>
|
||||
}
|
||||
|
||||
@code {
|
||||
private enum ViewType { Classic, Fancy }
|
||||
private ViewType activeView = ViewType.Classic;
|
||||
private bool isLoading = true;
|
||||
private string? errorMessage;
|
||||
private List<BookingDto> MyBookings = new();
|
||||
private List<OrderDto> AvailableOrders = new();
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
await LoadDataAsync();
|
||||
isLoading = false;
|
||||
}
|
||||
|
||||
private async Task LoadDataAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
// Lade Bookings des Users
|
||||
var (bookingSuccess, bookings, bookingError) = await BookingService.GetMyBookingsAsync();
|
||||
if (!bookingSuccess)
|
||||
{
|
||||
errorMessage = bookingError;
|
||||
return;
|
||||
}
|
||||
MyBookings = bookings ?? new();
|
||||
|
||||
// Lade Orders des Users
|
||||
var (orderSuccess, orders, orderError) = await OrderService.GetMyOrdersAsync();
|
||||
if (!orderSuccess)
|
||||
{
|
||||
errorMessage = orderError;
|
||||
return;
|
||||
}
|
||||
AvailableOrders = orders ?? new();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errorMessage = $"Fehler beim Laden der Daten: {ex.Message}";
|
||||
}
|
||||
}
|
||||
|
||||
private async Task ReloadBookings()
|
||||
{
|
||||
var (success, bookings, error) = await BookingService.GetMyBookingsAsync();
|
||||
if (success)
|
||||
{
|
||||
MyBookings = bookings ?? new();
|
||||
StateHasChanged();
|
||||
}
|
||||
else
|
||||
{
|
||||
errorMessage = error;
|
||||
}
|
||||
}
|
||||
|
||||
private void ShowError(string error)
|
||||
{
|
||||
errorMessage = error;
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private void GoBack() => Navigation.NavigateTo("/projects");
|
||||
}
|
||||
|
||||
<style>
|
||||
.nav-tabs .nav-link {
|
||||
color: #495057;
|
||||
border: none;
|
||||
border-bottom: 3px solid transparent;
|
||||
}
|
||||
|
||||
.nav-tabs .nav-link.active {
|
||||
color: #0d6efd;
|
||||
font-weight: 600;
|
||||
border-color: #0d6efd;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.tab-content {
|
||||
border-radius: 0.5rem;
|
||||
}
|
||||
</style>
|
||||
209
OnProfNext.Client/Pages/Bookings/ClassicView.razor
Normal file
209
OnProfNext.Client/Pages/Bookings/ClassicView.razor
Normal file
@ -0,0 +1,209 @@
|
||||
@using OnProfNext.Client.Services
|
||||
@using OnProfNext.Shared.Models.DTOs
|
||||
@inject BookingApiService BookingService
|
||||
|
||||
<div class="card shadow-sm border-0 mb-4">
|
||||
<div class="card-body">
|
||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
||||
<button class="btn btn-outline-primary" @onclick="PreviousMonth">
|
||||
<i class="bi bi-chevron-left"></i> Vorheriger Monat
|
||||
</button>
|
||||
<h5 class="text-primary m-0">@CurrentMonth.ToString("MMMM yyyy")</h5>
|
||||
<button class="btn btn-outline-primary" @onclick="NextMonth">
|
||||
Nächster Monat <i class="bi bi-chevron-right"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div class="monthly-calendar">
|
||||
<table class="table table-bordered text-center">
|
||||
<thead class="table-light">
|
||||
<tr>
|
||||
<th>Mo</th>
|
||||
<th>Di</th>
|
||||
<th>Mi</th>
|
||||
<th>Do</th>
|
||||
<th>Fr</th>
|
||||
<th>Sa</th>
|
||||
<th>So</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var week in GetCalendarWeeks())
|
||||
{
|
||||
<tr>
|
||||
@foreach (var day in week)
|
||||
{
|
||||
<td class="@(day.Month == CurrentMonth.Month ? "" : "text-muted") @(IsWeekend(day) ? "weekend" : "")"
|
||||
@onclick="() => OpenModal(day)">
|
||||
@day.Day
|
||||
<br />
|
||||
<small class="@GetHoursColorClass(day)">@GetHoursForDay(day) h</small>
|
||||
</td>
|
||||
}
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if (showModal)
|
||||
{
|
||||
<div class="modal fade show d-block" tabindex="-1" style="background-color: rgba(0,0,0,0.5);">
|
||||
<div class="modal-dialog modal-dialog-centered" @onclick:stopPropagation>
|
||||
<div class="modal-content border-0 shadow">
|
||||
<div class="modal-header bg-primary text-white">
|
||||
<h5 class="modal-title">Buchung für @selectedDate.ToString("dd.MM.yyyy")</h5>
|
||||
<button type="button" class="btn-close btn-close-white" @onclick="CloseModal"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<EditForm Model="newBooking" OnValidSubmit="SaveBookingAsync">
|
||||
<DataAnnotationsValidator />
|
||||
<ValidationSummary />
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label">Auftrag</label>
|
||||
<InputSelect class="form-select" @bind-Value="newBooking.OrderId">
|
||||
<option value="0" disabled>Auswählen...</option>
|
||||
@foreach (var order in Orders)
|
||||
{
|
||||
<option value="@order.Id">@order.Titel (@order.Auftragsnummer)</option>
|
||||
}
|
||||
</InputSelect>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label">Stunden</label>
|
||||
<InputNumber class="form-control" @bind-Value="newBooking.Hours" />
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label">Beschreibung</label>
|
||||
<InputTextArea class="form-control" @bind-Value="newBooking.Description" />
|
||||
</div>
|
||||
|
||||
<div class="d-flex justify-content-end">
|
||||
<button type="button" class="btn btn-secondary me-2" @onclick="CloseModal">Abbrechen</button>
|
||||
<button type="submit" class="btn btn-success">Speichern</button>
|
||||
</div>
|
||||
</EditForm>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@code {
|
||||
[Parameter] public List<BookingDto> Bookings { get; set; } = new();
|
||||
[Parameter] public List<OrderDto> Orders { get; set; } = new();
|
||||
[Parameter] public EventCallback OnBookingCreated { get; set; }
|
||||
[Parameter] public EventCallback<string> OnError { get; set; }
|
||||
|
||||
private DateTime CurrentMonth = DateTime.Today;
|
||||
private bool showModal;
|
||||
private DateTime selectedDate;
|
||||
private BookingCreateDto newBooking = new();
|
||||
|
||||
private void PreviousMonth()
|
||||
{
|
||||
CurrentMonth = CurrentMonth.AddMonths(-1);
|
||||
}
|
||||
|
||||
private void NextMonth()
|
||||
{
|
||||
CurrentMonth = CurrentMonth.AddMonths(1);
|
||||
}
|
||||
|
||||
private List<DateTime[]> GetCalendarWeeks()
|
||||
{
|
||||
var weeks = new List<DateTime[]>();
|
||||
var firstDayOfMonth = new DateTime(CurrentMonth.Year, CurrentMonth.Month, 1);
|
||||
var firstMonday = firstDayOfMonth.AddDays(-(int)firstDayOfMonth.DayOfWeek + (firstDayOfMonth.DayOfWeek == DayOfWeek.Sunday ? 0 : 1));
|
||||
var currentDay = firstMonday;
|
||||
|
||||
for (int weekCount = 0; weekCount < 6; weekCount++)
|
||||
{
|
||||
// Prüfe, ob currentDay noch im gültigen DateTime-Bereich liegt
|
||||
if (currentDay.Year >= DateTime.MaxValue.Year)
|
||||
break;
|
||||
|
||||
var week = new DateTime[7];
|
||||
for (int i = 0; i < 7; i++)
|
||||
{
|
||||
week[i] = currentDay;
|
||||
// Prüfe, ob das Hinzufügen eines Tages möglich ist
|
||||
if (currentDay < DateTime.MaxValue.AddDays(-1))
|
||||
currentDay = currentDay.AddDays(1);
|
||||
else
|
||||
break;
|
||||
}
|
||||
weeks.Add(week);
|
||||
|
||||
// Wenn currentDay nicht mehr incrementiert werden kann, beende die Schleife
|
||||
if (currentDay >= DateTime.MaxValue.AddDays(-1))
|
||||
break;
|
||||
}
|
||||
return weeks;
|
||||
}
|
||||
|
||||
private bool IsWeekend(DateTime day)
|
||||
{
|
||||
return day.DayOfWeek == DayOfWeek.Saturday || day.DayOfWeek == DayOfWeek.Sunday;
|
||||
}
|
||||
|
||||
private decimal GetHoursForDay(DateTime day)
|
||||
{
|
||||
return Bookings.Where(b => b.Date.Date == day.Date).Sum(b => b.Hours);
|
||||
}
|
||||
|
||||
private string GetHoursColorClass(DateTime day)
|
||||
{
|
||||
var hours = GetHoursForDay(day);
|
||||
if (hours >= 8)
|
||||
return "text-success";
|
||||
else if (hours > 6 && hours < 8)
|
||||
return "text-warning";
|
||||
else
|
||||
return "text-danger";
|
||||
}
|
||||
|
||||
private void OpenModal(DateTime date)
|
||||
{
|
||||
selectedDate = date;
|
||||
newBooking = new() { Date = date, MandantId = 1 };
|
||||
showModal = true;
|
||||
}
|
||||
|
||||
private void CloseModal() => showModal = false;
|
||||
|
||||
private async Task SaveBookingAsync()
|
||||
{
|
||||
var (success, error) = await BookingService.CreateBookingAsync(newBooking);
|
||||
if (success)
|
||||
{
|
||||
await OnBookingCreated.InvokeAsync();
|
||||
CloseModal();
|
||||
}
|
||||
else
|
||||
{
|
||||
await OnError.InvokeAsync(error ?? "Fehler beim Speichern der Buchung.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
<style>
|
||||
.monthly-calendar td {
|
||||
cursor: pointer;
|
||||
padding: 10px;
|
||||
vertical-align: top;
|
||||
height: 80px;
|
||||
}
|
||||
|
||||
.monthly-calendar td:hover {
|
||||
background-color: #f8f9fa;
|
||||
}
|
||||
|
||||
.monthly-calendar td.weekend {
|
||||
background-color: #f8f9fa;
|
||||
}
|
||||
</style>
|
||||
282
OnProfNext.Client/Pages/Bookings/FancyView.razor
Normal file
282
OnProfNext.Client/Pages/Bookings/FancyView.razor
Normal file
@ -0,0 +1,282 @@
|
||||
@using OnProfNext.Client.Services
|
||||
@using OnProfNext.Shared.Models.DTOs
|
||||
@inject BookingApiService BookingService
|
||||
@inject IJSRuntime JSRuntime
|
||||
|
||||
<div class="fancy-layout d-flex">
|
||||
<div class="orders-sidebar card shadow-sm border-0 me-3" style="width: 250px;">
|
||||
<div class="card-body">
|
||||
<h5 class="text-primary mb-3">Verfügbare Aufträge</h5>
|
||||
<div class="list-group">
|
||||
@if (Orders == null || !Orders.Any())
|
||||
{
|
||||
<p class="text-muted">Keine Aufträge verfügbar</p>
|
||||
}
|
||||
else
|
||||
{
|
||||
@foreach (var order in Orders)
|
||||
{
|
||||
<div class="list-group-item list-group-item-action draggable-order"
|
||||
draggable="true" @ondragstart="() => StartDrag(order.Id)">
|
||||
@order.Titel (@order.Auftragsnummer)
|
||||
</div>
|
||||
}
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="week-calendar flex-grow-1">
|
||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
||||
<button class="btn btn-outline-primary" @onclick="PreviousWeek">
|
||||
<i class="bi bi-chevron-left"></i> Vorherige Woche
|
||||
</button>
|
||||
<h5 class="text-primary m-0">
|
||||
Woche vom @CurrentWeekStart.ToString("dd.MM.yyyy") bis @CurrentWeekStart.AddDays(6).ToString("dd.MM.yyyy")
|
||||
</h5>
|
||||
<button class="btn btn-outline-primary" @onclick="NextWeek">
|
||||
Nächste Woche <i class="bi bi-chevron-right"></i>
|
||||
</button>
|
||||
</div>
|
||||
<table class="table table-bordered text-center">
|
||||
<thead class="table-light">
|
||||
<tr>
|
||||
<th style="width: 80px;">Zeit</th>
|
||||
@foreach (var day in WeekDays)
|
||||
{
|
||||
<th class="@(IsWeekend(day) ? "weekend" : "")">
|
||||
@day.ToString("dd.MM") (@day.ToString("ddd"))
|
||||
<br />
|
||||
<small class="@GetHoursColorClass(day)">@GetHoursForDay(day) h</small>
|
||||
</th>
|
||||
}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@for (int hour = 8; hour <= 18; hour++)
|
||||
{
|
||||
var localHour = hour;
|
||||
<tr>
|
||||
<td>@localHour:00</td>
|
||||
@foreach (var day in WeekDays)
|
||||
{
|
||||
var localDay = day;
|
||||
<td class="@(IsWeekend(localDay) ? "weekend" : "")"
|
||||
@ondrop="() => DropOnSlot(localDay, localHour)" @ondragover="AllowDrop"
|
||||
style="height: 50px; position: relative;">
|
||||
@foreach (var booking in GetBookingsForSlot(localDay, localHour))
|
||||
{
|
||||
<div class="booking-item bg-primary text-white p-1"
|
||||
style="position: absolute; top: 0; left: 0; right: 0; height: @(booking.Hours * 50)px;"
|
||||
title="@booking.OrderTitle: @booking.Hours h">
|
||||
@booking.OrderTitle - @booking.Hours h
|
||||
<button class="btn btn-sm btn-danger float-end"
|
||||
@onclick="() => DeleteBooking(booking.Id)">
|
||||
<i class="bi bi-trash"></i>
|
||||
</button>
|
||||
</div>
|
||||
}
|
||||
</td>
|
||||
}
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@code {
|
||||
[Parameter] public List<BookingDto>? Bookings { get; set; }
|
||||
[Parameter] public List<OrderDto>? Orders { get; set; }
|
||||
[Parameter] public EventCallback OnBookingCreated { get; set; }
|
||||
[Parameter] public EventCallback<string> OnError { get; set; }
|
||||
|
||||
private DateTime CurrentWeekStart = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + 1);
|
||||
private List<DateTime> WeekDays => Enumerable.Range(0, 7).Select(d => CurrentWeekStart.AddDays(d)).ToList();
|
||||
private int? draggedOrderId;
|
||||
|
||||
private void PreviousWeek()
|
||||
{
|
||||
if (CurrentWeekStart.Year > DateTime.MinValue.Year)
|
||||
{
|
||||
CurrentWeekStart = CurrentWeekStart.AddDays(-7);
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private void NextWeek()
|
||||
{
|
||||
if (CurrentWeekStart.Year < DateTime.MaxValue.Year)
|
||||
{
|
||||
CurrentWeekStart = CurrentWeekStart.AddDays(7);
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private void StartDrag(int orderId)
|
||||
{
|
||||
draggedOrderId = orderId;
|
||||
Console.WriteLine($"Start drag for Order ID: {orderId}");
|
||||
}
|
||||
|
||||
private async Task AllowDrop()
|
||||
{
|
||||
await JSRuntime.InvokeVoidAsync("onProfNext.preventDefault");
|
||||
}
|
||||
|
||||
private async Task DropOnSlot(DateTime day, int hour)
|
||||
{
|
||||
if (draggedOrderId == null) return;
|
||||
|
||||
var bookingDate = new DateTime(day.Year, day.Month, day.Day, hour, 0, 0, DateTimeKind.Local);
|
||||
Console.WriteLine($"Calculated booking date: {bookingDate.ToString("dd.MM.yyyy HH:mm")} (Kind: {bookingDate.Kind})");
|
||||
|
||||
var newBooking = new BookingCreateDto
|
||||
{
|
||||
OrderId = draggedOrderId.Value,
|
||||
Date = bookingDate,
|
||||
Hours = 1,
|
||||
MandantId = 1
|
||||
};
|
||||
|
||||
Console.WriteLine($"Sending to API: Date={newBooking.Date.ToString("dd.MM.yyyy HH:mm")} (Kind: {newBooking.Date.Kind})");
|
||||
|
||||
try
|
||||
{
|
||||
var (success, error) = await BookingService.CreateBookingAsync(newBooking);
|
||||
if (success)
|
||||
{
|
||||
await OnBookingCreated.InvokeAsync();
|
||||
Console.WriteLine("Booking created successfully.");
|
||||
}
|
||||
else
|
||||
{
|
||||
await OnError.InvokeAsync(error ?? "Fehler beim Erstellen der Buchung.");
|
||||
Console.WriteLine($"API error: {error}");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
await OnError.InvokeAsync($"Fehler beim Erstellen der Buchung: {ex.Message}");
|
||||
Console.WriteLine($"Exception in DropOnSlot: {ex.Message}");
|
||||
}
|
||||
|
||||
draggedOrderId = null;
|
||||
}
|
||||
|
||||
private async Task DeleteBooking(int bookingId)
|
||||
{
|
||||
try
|
||||
{
|
||||
var (success, error) = await BookingService.DeleteBookingAsync(bookingId);
|
||||
if (success)
|
||||
{
|
||||
await OnBookingCreated.InvokeAsync();
|
||||
Console.WriteLine("Booking deleted successfully.");
|
||||
}
|
||||
else
|
||||
{
|
||||
await OnError.InvokeAsync(error ?? "Fehler beim Löschen der Buchung.");
|
||||
Console.WriteLine($"API error: {error}");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
await OnError.InvokeAsync($"Fehler beim Löschen der Buchung: {ex.Message}");
|
||||
Console.WriteLine($"Exception in DeleteBooking: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private List<BookingDto> GetBookingsForSlot(DateTime day, int hour)
|
||||
{
|
||||
var bookings = Bookings?.Where(b => b.Date.Date == day.Date && b.Date.Hour == hour).ToList() ?? new();
|
||||
if (bookings.Any())
|
||||
{
|
||||
Console.WriteLine($"Bookings for {day.ToString("dd.MM.yyyy")} {hour}:00: {bookings.Count}");
|
||||
foreach (var booking in bookings)
|
||||
{
|
||||
Console.WriteLine($"Booking ID={booking.Id}, Date={booking.Date.ToString("dd.MM.yyyy HH:mm")}, Hours={booking.Hours}");
|
||||
}
|
||||
}
|
||||
return bookings;
|
||||
}
|
||||
|
||||
private bool IsWeekend(DateTime day)
|
||||
{
|
||||
return day.DayOfWeek == DayOfWeek.Saturday || day.DayOfWeek == DayOfWeek.Sunday;
|
||||
}
|
||||
|
||||
private decimal GetHoursForDay(DateTime day)
|
||||
{
|
||||
var hours = Bookings?.Where(b => b.Date.Date == day.Date).Sum(b => b.Hours) ?? 0;
|
||||
if (hours > 0)
|
||||
{
|
||||
Console.WriteLine($"Hours for {day.ToString("dd.MM.yyyy")}: {hours}");
|
||||
}
|
||||
return hours;
|
||||
}
|
||||
|
||||
private string GetHoursColorClass(DateTime day)
|
||||
{
|
||||
var hours = GetHoursForDay(day);
|
||||
if (hours >= 8)
|
||||
return "text-success";
|
||||
else if (hours > 6 && hours < 8)
|
||||
return "text-warning";
|
||||
else
|
||||
return "text-danger";
|
||||
}
|
||||
}
|
||||
|
||||
<style>
|
||||
.orders-sidebar {
|
||||
min-width: 200px;
|
||||
}
|
||||
|
||||
.draggable-order {
|
||||
cursor: grab;
|
||||
padding: 10px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.week-calendar td {
|
||||
vertical-align: top;
|
||||
min-height: 50px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.week-calendar th.weekend {
|
||||
background-color: #f8f9fa;
|
||||
}
|
||||
|
||||
.week-calendar td.weekend {
|
||||
background-color: #f8f9fa;
|
||||
}
|
||||
|
||||
.week-calendar td:hover {
|
||||
background-color: #e9ecef;
|
||||
}
|
||||
|
||||
.week-calendar td.weekend:hover {
|
||||
background-color: #e2e6ea;
|
||||
}
|
||||
|
||||
.booking-item {
|
||||
border-radius: 4px;
|
||||
margin: 2px;
|
||||
font-size: 0.9em;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.text-success {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.text-warning {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.text-danger {
|
||||
font-weight: bold;
|
||||
}
|
||||
</style>
|
||||
@ -69,7 +69,7 @@
|
||||
|
||||
private void GoToBookings()
|
||||
{
|
||||
Nav.NavigateTo("/bookings");
|
||||
Nav.NavigateTo("/booking-entry");
|
||||
}
|
||||
|
||||
private void GoToAnalysis()
|
||||
|
||||
@ -29,6 +29,10 @@ builder.Services.AddHttpClient<OrderApiService>(client =>
|
||||
client.BaseAddress = new Uri("https://localhost:7271/");
|
||||
}).AddHttpMessageHandler<AuthorizationMessageHandler>();
|
||||
|
||||
builder.Services.AddHttpClient<BookingApiService>(client =>
|
||||
{
|
||||
client.BaseAddress = new Uri("https://localhost:7271/");
|
||||
}).AddHttpMessageHandler<AuthorizationMessageHandler>();
|
||||
|
||||
builder.Services.AddScoped(sp => new HttpClient
|
||||
{
|
||||
|
||||
104
OnProfNext.Client/Services/BookingApiService.cs
Normal file
104
OnProfNext.Client/Services/BookingApiService.cs
Normal file
@ -0,0 +1,104 @@
|
||||
using OnProfNext.Shared.Models.DTOs;
|
||||
using System.Net.Http.Json;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace OnProfNext.Client.Services
|
||||
{
|
||||
public class BookingApiService
|
||||
{
|
||||
private readonly HttpClient _httpClient;
|
||||
|
||||
public BookingApiService(HttpClient httpClient)
|
||||
{
|
||||
_httpClient = httpClient;
|
||||
}
|
||||
|
||||
public async Task<(bool Success, List<BookingDto>? Data, string? Error)> GetMyBookingsAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
var bookings = await _httpClient.GetFromJsonAsync<List<BookingDto>>("api/bookings/mine");
|
||||
Console.WriteLine($"Received bookings: {JsonSerializer.Serialize(bookings, new JsonSerializerOptions { WriteIndented = true })}");
|
||||
return (true, bookings ?? new(), null);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return (false, null, $"Fehler beim Laden der Buchungen: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<(bool Success, List<BookingDto>? Data, string? Error)> GetBookingsByOrderAsync(int orderId)
|
||||
{
|
||||
try
|
||||
{
|
||||
var bookings = await _httpClient.GetFromJsonAsync<List<BookingDto>>($"api/bookings/byorder/{orderId}");
|
||||
Console.WriteLine($"Received bookings for order {orderId}: {JsonSerializer.Serialize(bookings, new JsonSerializerOptions { WriteIndented = true })}");
|
||||
return (true, bookings ?? new(), null);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return (false, null, $"Fehler beim Laden der Buchungen: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<(bool Success, string? Error)> CreateBookingAsync(BookingCreateDto dto)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Explizite Serialisierung für Debugging
|
||||
var jsonPayload = JsonSerializer.Serialize(new
|
||||
{
|
||||
dto.OrderId,
|
||||
date = dto.Date.ToString("yyyy-MM-ddTHH:mm:ss"),
|
||||
dto.Hours,
|
||||
dto.MandantId,
|
||||
dto.Description
|
||||
}, new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
|
||||
Console.WriteLine($"Sending booking to API: {jsonPayload}");
|
||||
|
||||
var content = new StringContent(jsonPayload, System.Text.Encoding.UTF8, "application/json");
|
||||
var response = await _httpClient.PostAsync("api/bookings", content);
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
Console.WriteLine("Booking API call successful.");
|
||||
return (true, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
Console.WriteLine($"API error response: {errorContent}");
|
||||
return (false, $"Fehler beim Speichern: {response.ReasonPhrase}");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Exception in CreateBookingAsync: {ex.Message}");
|
||||
return (false, ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<(bool Success, string? Error)> DeleteBookingAsync(int id)
|
||||
{
|
||||
try
|
||||
{
|
||||
var response = await _httpClient.DeleteAsync($"api/bookings/{id}");
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
Console.WriteLine("Delete booking API call successful.");
|
||||
return (true, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
Console.WriteLine($"API error response: {errorContent}");
|
||||
return (false, $"Fehler beim Löschen: {response.ReasonPhrase}");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Exception in DeleteBookingAsync: {ex.Message}");
|
||||
return (false, ex.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -125,6 +125,23 @@ namespace OnProfNext.Client.Services
|
||||
}
|
||||
|
||||
|
||||
// In OrderApiService.cs
|
||||
public async Task<(bool Success, List<OrderDto>? Data, string? Error)> GetMyOrdersAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
var orders = await _httpClient.GetFromJsonAsync<List<OrderDto>>("api/orders/mine");
|
||||
return (true, orders ?? new List<OrderDto>(), null);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return (false, null, $"Fehler beim Laden der Aufträge: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
@ -1,7 +1,7 @@
|
||||
{
|
||||
"mainAssemblyName": "OnProfNext.Client",
|
||||
"resources": {
|
||||
"hash": "sha256-7KW3Qfm9CxYkbtb9+tRJYPyzmuj07fziiiVYwg4iZ/Y=",
|
||||
"hash": "sha256-urElDnrJHnNHhcoIgh4qPQgw0DvL1p3uD2eDB4Wd3+M=",
|
||||
"fingerprinting": {
|
||||
"BlazorBootstrap.ym6tnrklwx.wasm": "BlazorBootstrap.wasm",
|
||||
"Blazored.Typeahead.5g65vcuhxb.wasm": "Blazored.Typeahead.wasm",
|
||||
@ -215,10 +215,10 @@
|
||||
"icudt_CJK.tjcz0u77k5.dat": "icudt_CJK.dat",
|
||||
"icudt_EFIGS.tptq2av103.dat": "icudt_EFIGS.dat",
|
||||
"icudt_no_CJK.lfu7j35m59.dat": "icudt_no_CJK.dat",
|
||||
"OnProfNext.Shared.ycdkuu8x8h.wasm": "OnProfNext.Shared.wasm",
|
||||
"OnProfNext.Shared.bi3s6hw0ov.pdb": "OnProfNext.Shared.pdb",
|
||||
"OnProfNext.Client.xxw7n209sx.wasm": "OnProfNext.Client.wasm",
|
||||
"OnProfNext.Client.mwqxl9mbte.pdb": "OnProfNext.Client.pdb"
|
||||
"OnProfNext.Shared.lyqfg82b63.wasm": "OnProfNext.Shared.wasm",
|
||||
"OnProfNext.Shared.r9uf34g1jf.pdb": "OnProfNext.Shared.pdb",
|
||||
"OnProfNext.Client.0dluezm643.wasm": "OnProfNext.Client.wasm",
|
||||
"OnProfNext.Client.ape4q24e07.pdb": "OnProfNext.Client.pdb"
|
||||
},
|
||||
"jsModuleNative": {
|
||||
"dotnet.native.9ih887ebfz.js": "sha256-oS7IRiQoVt9ThQ7Y2UM3XoeY0JqPD02cg9IvRdufn2w="
|
||||
@ -442,12 +442,12 @@
|
||||
"WindowsBase.vy2l5u79y6.wasm": "sha256-ufB9Mo5joMyUs3DzXWWBFFIZNEVrt6h9N5stYB6Oln4=",
|
||||
"mscorlib.xd6mv31d55.wasm": "sha256-1YSLR2eZt3ceALFV//vZUF2AloxVil3VlrW1zZYPSEI=",
|
||||
"netstandard.kaml52uspo.wasm": "sha256-HLEwBpLfzKw2/zGSVzHzFJxznCkt/WIjahrziiMrOpA=",
|
||||
"OnProfNext.Shared.ycdkuu8x8h.wasm": "sha256-olapogpfRGpDGxXuzau/hIQ5o4cyZhq8h7xg3+iq8E4=",
|
||||
"OnProfNext.Client.xxw7n209sx.wasm": "sha256-haEY6AqSymUCGlI0dfz7DhNA7AgCZibKuDrAYQRP8YA="
|
||||
"OnProfNext.Shared.lyqfg82b63.wasm": "sha256-w7kYJP/DLlO8NXzgUXym1hiG2ch5+jRuO/UZ6krRm6w=",
|
||||
"OnProfNext.Client.0dluezm643.wasm": "sha256-pOEBoGoioxlzoi9tDgJmWxFEJw9FAZpIlohDGRMcHvw="
|
||||
},
|
||||
"pdb": {
|
||||
"OnProfNext.Shared.bi3s6hw0ov.pdb": "sha256-PVU32sYeYWTHZ/OZrfTWLqQEkEcm060yrjFwRiK7vs4=",
|
||||
"OnProfNext.Client.mwqxl9mbte.pdb": "sha256-dh/Pyivioxp3QQaW9jirXIoZFcucZBQ24pD2oJva5IQ="
|
||||
"OnProfNext.Shared.r9uf34g1jf.pdb": "sha256-AQbfy8ggW02znMrieOv1c4vomUo5cXk/ptky3fB99YI=",
|
||||
"OnProfNext.Client.ape4q24e07.pdb": "sha256-knq9IhCJxfvepTeExvxDRJhO5nGuddjspkNtCOcBkIY="
|
||||
}
|
||||
},
|
||||
"cacheBootResources": true,
|
||||
|
||||
Binary file not shown.
@ -13,7 +13,7 @@ using System.Reflection;
|
||||
[assembly: System.Reflection.AssemblyCompanyAttribute("OnProfNext.Client")]
|
||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+910ed8b8f84357d5f19f7be7f67be8f98b22e9c9")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+de2c3693508bfb15c93127034ea928d860f4ac56")]
|
||||
[assembly: System.Reflection.AssemblyProductAttribute("OnProfNext.Client")]
|
||||
[assembly: System.Reflection.AssemblyTitleAttribute("OnProfNext.Client")]
|
||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||
|
||||
@ -1 +1 @@
|
||||
23ad94e3cb51159ce56923b4c951a2f464f99f297debd052bd2c2b60700174d6
|
||||
08aa3947a1274dbcd1ed8260838c173be7b9ae8231ae4f43fbcf8b894f4cc2ea
|
||||
|
||||
@ -39,6 +39,18 @@ build_metadata.AdditionalFiles.CssScope =
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xTaGFyZWRcUmVkaXJlY3RUb0xvZ2luLnJhem9y
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/DEVQPDC/Proj2/OnProfNext/OnProfNext.Client/Pages/Bookings/BookingEntry.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = UGFnZXNcQm9va2luZ3NcQm9va2luZ0VudHJ5LnJhem9y
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/DEVQPDC/Proj2/OnProfNext/OnProfNext.Client/Pages/Bookings/ClassicView.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = UGFnZXNcQm9va2luZ3NcQ2xhc3NpY1ZpZXcucmF6b3I=
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/DEVQPDC/Proj2/OnProfNext/OnProfNext.Client/Pages/Bookings/FancyView.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = UGFnZXNcQm9va2luZ3NcRmFuY3lWaWV3LnJhem9y
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[C:/DEVQPDC/Proj2/OnProfNext/OnProfNext.Client/Pages/Component.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = UGFnZXNcQ29tcG9uZW50LnJhem9y
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
Binary file not shown.
@ -1 +1 @@
|
||||
b0b466ffbae46d8d02c9d283d2f26aafd6ee7de33cb9196e648f9e322f4b5669
|
||||
50f06df8b13f05293ac10043b87476aa4a048151949bf50c4255adb1c0e403ae
|
||||
|
||||
@ -1130,7 +1130,6 @@ C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\36w3eu
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\mfzx4sb2rv-79hai7knhw.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\eojifsclv0-7t9tbfaemk.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\m2wv0pszba-ym6tnrklwx.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\9988w5h4ds-d03dgo8viw.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\Blazored.Typeahead.5g65vcuhxb.wasm
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\Microsoft.Extensions.Localization.Abstractions.o4jp2hcm79.wasm
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\Microsoft.Extensions.Localization.bvn14pws96.wasm
|
||||
@ -1159,16 +1158,19 @@ C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\scopedcss\Compone
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\scopedcss\Components\Layout\NavMenu.razor.rz.scp.css
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\cmx4u86mij-jq0bgzcoc4.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\b3tztoi1cm-ob0l47m3ye.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Client.mwqxl9mbte.pdb
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Client.xxw7n209sx.wasm
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Shared.bi3s6hw0ov.pdb
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Shared.ycdkuu8x8h.wasm
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Client.mwqxl9mbte.pdb.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Client.xxw7n209sx.wasm.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Shared.ycdkuu8x8h.wasm.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Shared.bi3s6hw0ov.pdb.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\kzp5jtqdfd-ycdkuu8x8h.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\po7udqtwl2-bi3s6hw0ov.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\cez1jk5yrk-xxw7n209sx.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\b9lx0cbjbg-mwqxl9mbte.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\xzgxwa2yd7-2n5b5i9hx5.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\eb56ryutr6-wfgcz1v7r2.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\9988w5h4ds-804ig5h2xb.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\yyex9setpd-oxan0pzjgj.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Shared.r9uf34g1jf.pdb
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Shared.lyqfg82b63.wasm
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Shared.lyqfg82b63.wasm.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Shared.r9uf34g1jf.pdb.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\kzp5jtqdfd-lyqfg82b63.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\po7udqtwl2-r9uf34g1jf.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Client.ape4q24e07.pdb
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Client.0dluezm643.wasm
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Client.ape4q24e07.pdb.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\bin\Debug\net9.0\wwwroot\_framework\OnProfNext.Client.0dluezm643.wasm.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\cez1jk5yrk-0dluezm643.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\b9lx0cbjbg-ape4q24e07.gz
|
||||
C:\DEVQPDC\Proj2\OnProfNext\OnProfNext.Client\obj\Debug\net9.0\compressed\xzgxwa2yd7-n8izp0ydfq.gz
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@ -1,7 +1,7 @@
|
||||
{
|
||||
"mainAssemblyName": "OnProfNext.Client",
|
||||
"resources": {
|
||||
"hash": "sha256-7KW3Qfm9CxYkbtb9+tRJYPyzmuj07fziiiVYwg4iZ/Y=",
|
||||
"hash": "sha256-urElDnrJHnNHhcoIgh4qPQgw0DvL1p3uD2eDB4Wd3+M=",
|
||||
"fingerprinting": {
|
||||
"BlazorBootstrap.ym6tnrklwx.wasm": "BlazorBootstrap.wasm",
|
||||
"Blazored.Typeahead.5g65vcuhxb.wasm": "Blazored.Typeahead.wasm",
|
||||
@ -215,10 +215,10 @@
|
||||
"icudt_CJK.tjcz0u77k5.dat": "icudt_CJK.dat",
|
||||
"icudt_EFIGS.tptq2av103.dat": "icudt_EFIGS.dat",
|
||||
"icudt_no_CJK.lfu7j35m59.dat": "icudt_no_CJK.dat",
|
||||
"OnProfNext.Shared.ycdkuu8x8h.wasm": "OnProfNext.Shared.wasm",
|
||||
"OnProfNext.Shared.bi3s6hw0ov.pdb": "OnProfNext.Shared.pdb",
|
||||
"OnProfNext.Client.xxw7n209sx.wasm": "OnProfNext.Client.wasm",
|
||||
"OnProfNext.Client.mwqxl9mbte.pdb": "OnProfNext.Client.pdb"
|
||||
"OnProfNext.Shared.lyqfg82b63.wasm": "OnProfNext.Shared.wasm",
|
||||
"OnProfNext.Shared.r9uf34g1jf.pdb": "OnProfNext.Shared.pdb",
|
||||
"OnProfNext.Client.0dluezm643.wasm": "OnProfNext.Client.wasm",
|
||||
"OnProfNext.Client.ape4q24e07.pdb": "OnProfNext.Client.pdb"
|
||||
},
|
||||
"jsModuleNative": {
|
||||
"dotnet.native.9ih887ebfz.js": "sha256-oS7IRiQoVt9ThQ7Y2UM3XoeY0JqPD02cg9IvRdufn2w="
|
||||
@ -442,12 +442,12 @@
|
||||
"WindowsBase.vy2l5u79y6.wasm": "sha256-ufB9Mo5joMyUs3DzXWWBFFIZNEVrt6h9N5stYB6Oln4=",
|
||||
"mscorlib.xd6mv31d55.wasm": "sha256-1YSLR2eZt3ceALFV//vZUF2AloxVil3VlrW1zZYPSEI=",
|
||||
"netstandard.kaml52uspo.wasm": "sha256-HLEwBpLfzKw2/zGSVzHzFJxznCkt/WIjahrziiMrOpA=",
|
||||
"OnProfNext.Shared.ycdkuu8x8h.wasm": "sha256-olapogpfRGpDGxXuzau/hIQ5o4cyZhq8h7xg3+iq8E4=",
|
||||
"OnProfNext.Client.xxw7n209sx.wasm": "sha256-haEY6AqSymUCGlI0dfz7DhNA7AgCZibKuDrAYQRP8YA="
|
||||
"OnProfNext.Shared.lyqfg82b63.wasm": "sha256-w7kYJP/DLlO8NXzgUXym1hiG2ch5+jRuO/UZ6krRm6w=",
|
||||
"OnProfNext.Client.0dluezm643.wasm": "sha256-pOEBoGoioxlzoi9tDgJmWxFEJw9FAZpIlohDGRMcHvw="
|
||||
},
|
||||
"pdb": {
|
||||
"OnProfNext.Shared.bi3s6hw0ov.pdb": "sha256-PVU32sYeYWTHZ/OZrfTWLqQEkEcm060yrjFwRiK7vs4=",
|
||||
"OnProfNext.Client.mwqxl9mbte.pdb": "sha256-dh/Pyivioxp3QQaW9jirXIoZFcucZBQ24pD2oJva5IQ="
|
||||
"OnProfNext.Shared.r9uf34g1jf.pdb": "sha256-AQbfy8ggW02znMrieOv1c4vomUo5cXk/ptky3fB99YI=",
|
||||
"OnProfNext.Client.ape4q24e07.pdb": "sha256-knq9IhCJxfvepTeExvxDRJhO5nGuddjspkNtCOcBkIY="
|
||||
}
|
||||
},
|
||||
"cacheBootResources": true,
|
||||
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
@ -1 +1 @@
|
||||
{"GlobalPropertiesHash":"mM8eeq7khgiV1Ho7QUmOpk+VtYcA7aET/3LQ1YVdmDk=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"R7Rea/YQmcweqCbKffD9oUelggfpJQX85r65aYZsas0=","InputHashes":["C0eOV9gOfsDqwL4SXmPo6JNLJCydTRLhkcoGopWE9zQ=","vH/H9umpzRku3bgc\u002BiW4S4uDtfRsbDxcDhLs2PsS30Q=","7WZ82wMbbKcJw5Bzbb6647eKVFT/bZswI1Tk5t/ft5c=","ic5b/oaCLRQ\u002BvimSCWMq87l01yIcHTPJx4IuEZbLqrQ=","1e6daLPfiNZ0xKyqXPZvlwnXNr5eNjSY9c8Z3RnpvOs=","DZJCRz9YgqDdyZ\u002B/alouUKBy2KmMsXUiWCxebbKZcLY=","vWEBwblz5Jyt6V3p5EhyGwNxk3wMO63rfUkzfFOe3Co=","C9OcPNxT/zZbgwoL1WFZpq/GpBvLVPp8hPakIqiapo4=","Kx8ACKSK3MtMAbYi7KCFurKiYppxi7vo\u002BEhh02NZdzQ=","yxPUUzlxTy4BFltCWE3KIA\u002BWyQYUg/IIzcE3ijpMcYA=","ImICJyEJwrMtMlwpdR3TUm1zynu8xRKgqQt/SKRWgb0=","TjgCDOh\u002B6hXrsF/SShk3ow5T50/kMKkKCND23t3bb\u002BE=","e9PcF/sfWnqLkh3xeQ7K0Y4jCrIxSFd3uA1X1PFIM5I=","Btp7jyWETg/2eqdAkcMf9vwDjYzaNjWz3CqRvFY2M/Y=","ceaaFJWn2DLR\u002BtltiUns0zSUqZdF95jtCiE8BsA8jCk=","HcuvE7OIR66cL63FjKUiVO27/7jyrWAkalbBFAty5\u002BY=","DLbhHN0wNZ5TZTU/daLOgA6HIQdIppdZ\u002B3ix\u002Bs0q00A=","h/xl0jd8/ccKraqSbuHrqHDKWlgX6yEhialHDeLi9Iw=","IWYbnI783m87kixei3nIgUzSgOSdvDKjZB7TBy1gZnw=","s580H7QKmm/8JfqJ1qQutyar6VmBZ2AS0yK3JBkUhEU=","cjzijXWkKx5xmzo7UM2\u002B\u002BlKHuiTCUBC6DbZKzZzvXRc=","y/HHWIq4FmFCjw1i5XGnkQFK9XF2josRhuQY2UApulw=","JsDoy0qI9Uyk0tJTn0NDNkmt4UmamBvAatx4XlfUC7o=","CvbWU7Giprnv46eIMwfS2bczbDe733bXEYIdjr9jRnc=","Q2XlrbHGFatJOngyPfc6Zcrv1B67MTXKJ\u002BIDqO25R00=","c814YcgxmsuSE3XnK1Nq1Hpb/DSHdHv707R8\u002BsMQUbw=","Tx7xdcxtqfZTa7P9vSMOGgAjrEUDs6YGz/BCDc9zoGs=","qhVXZuy2nCiZw2Uis/Ugu\u002BiclH4afrFxFZCNa2yxE74=","OSAu0TIFhkdeb0xVLS6et8a4aUHkzeUWk3v3s\u002BUn/Y8=","gQojZbGh9zdA6sHRPQKxtDLqvqsJtMNWSvtPxM60tlk=","ue76wb7ZOtUAF2M1UT3LzQtfATbywtmhro/\u002BDVQFo2E=","ujshobx1Okba2\u002BKCptByJRdUhAjHCnL7OEilWHSxvSE=","IMLMtCoq94G/iom6Kc9QnMjl26QBzo9A\u002BUpe\u002Bir5hSk=","cKIyhiSlhxBTpm0tfQp0N73HmTJ0PSk6OasdMHHU6hg=","5/pQTkPDIDKVOIdLIr8K2pqUMYjedXEDzrx/8i2FyMc=","ie4elz0/Yt0Jor8ZOASn7uqtUMQVIIi7iyxpmc\u002BP/3A=","/eDlK\u002BJ5ECzHYnnwNfs1ll7OzscxHc/T9AXptg3xTII=","iZtB7IwVOScbKME8XNDUHe8/LADtOuBuD5iUzZ\u002BTBHA=","VI7hpNtzA0lQFbtSBh2M5HmTFjxD4uLPevcNJtBDECY=","vpPBvnXuysK0e8FBbSO7k6I35HOVZLmZfMhVxlKPzck=","hdgfzdMO3XxPwCGNKDabyl/9YRagIr9KXozaMve1DE4=","4UP6pofGTsyh1E5XO2QVGfORoUAttdjUWvf1A4Mgngw=","AuV7BOj9roSnoQn4CCZRgJiQ9aP\u002Buuc3FxUaAtL4FUk=","3KIGpeODnLLCBrAStJV1hHEo7FwY/hgl7zW1wNeg/Wc=","a2NEK0jnyneLb7plUPbXxhY8oQ9LD9Lc35UnzZUXwJI=","B2ua8h4cGI1Vv8qhyD7sFVXpbxEgmYZbecw9dY4/rFA=","sp9HgH8YqRbHdraJhNz5JJIDCLSscO457uul374ES4I=","wMHpeMWv1hOAkS9kqsiqEALVMDdWAsC3p85glRB/FqI=","/KUhUbxyo/3Nrk2MhF57PAEu8wbud9Cg8Bp1MbxsxoA=","2DvTDD9FORsb164IPm6/PKUGfxUsYAOheM6lMXeQcuQ="],"CachedAssets":{},"CachedCopyCandidates":{}}
|
||||
{"GlobalPropertiesHash":"mM8eeq7khgiV1Ho7QUmOpk+VtYcA7aET/3LQ1YVdmDk=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"R7Rea/YQmcweqCbKffD9oUelggfpJQX85r65aYZsas0=","InputHashes":["C0eOV9gOfsDqwL4SXmPo6JNLJCydTRLhkcoGopWE9zQ=","vH/H9umpzRku3bgc\u002BiW4S4uDtfRsbDxcDhLs2PsS30Q=","7WZ82wMbbKcJw5Bzbb6647eKVFT/bZswI1Tk5t/ft5c=","STdNBMOgbym9plIqVfeTQ5bMv4lCD2PqmCxFkhEIveY=","1e6daLPfiNZ0xKyqXPZvlwnXNr5eNjSY9c8Z3RnpvOs=","usnoV0rd/ueHPT6Pi8sOt97KMDrhrYfd19DwaKRbZLY=","DZJCRz9YgqDdyZ\u002B/alouUKBy2KmMsXUiWCxebbKZcLY=","vWEBwblz5Jyt6V3p5EhyGwNxk3wMO63rfUkzfFOe3Co=","C9OcPNxT/zZbgwoL1WFZpq/GpBvLVPp8hPakIqiapo4=","Kx8ACKSK3MtMAbYi7KCFurKiYppxi7vo\u002BEhh02NZdzQ=","yxPUUzlxTy4BFltCWE3KIA\u002BWyQYUg/IIzcE3ijpMcYA=","ImICJyEJwrMtMlwpdR3TUm1zynu8xRKgqQt/SKRWgb0=","TjgCDOh\u002B6hXrsF/SShk3ow5T50/kMKkKCND23t3bb\u002BE=","e9PcF/sfWnqLkh3xeQ7K0Y4jCrIxSFd3uA1X1PFIM5I=","Btp7jyWETg/2eqdAkcMf9vwDjYzaNjWz3CqRvFY2M/Y=","ceaaFJWn2DLR\u002BtltiUns0zSUqZdF95jtCiE8BsA8jCk=","HcuvE7OIR66cL63FjKUiVO27/7jyrWAkalbBFAty5\u002BY=","DLbhHN0wNZ5TZTU/daLOgA6HIQdIppdZ\u002B3ix\u002Bs0q00A=","h/xl0jd8/ccKraqSbuHrqHDKWlgX6yEhialHDeLi9Iw=","IWYbnI783m87kixei3nIgUzSgOSdvDKjZB7TBy1gZnw=","s580H7QKmm/8JfqJ1qQutyar6VmBZ2AS0yK3JBkUhEU=","cjzijXWkKx5xmzo7UM2\u002B\u002BlKHuiTCUBC6DbZKzZzvXRc=","y/HHWIq4FmFCjw1i5XGnkQFK9XF2josRhuQY2UApulw=","JsDoy0qI9Uyk0tJTn0NDNkmt4UmamBvAatx4XlfUC7o=","CvbWU7Giprnv46eIMwfS2bczbDe733bXEYIdjr9jRnc=","Q2XlrbHGFatJOngyPfc6Zcrv1B67MTXKJ\u002BIDqO25R00=","c814YcgxmsuSE3XnK1Nq1Hpb/DSHdHv707R8\u002BsMQUbw=","Tx7xdcxtqfZTa7P9vSMOGgAjrEUDs6YGz/BCDc9zoGs=","qhVXZuy2nCiZw2Uis/Ugu\u002BiclH4afrFxFZCNa2yxE74=","OSAu0TIFhkdeb0xVLS6et8a4aUHkzeUWk3v3s\u002BUn/Y8=","gQojZbGh9zdA6sHRPQKxtDLqvqsJtMNWSvtPxM60tlk=","ue76wb7ZOtUAF2M1UT3LzQtfATbywtmhro/\u002BDVQFo2E=","ujshobx1Okba2\u002BKCptByJRdUhAjHCnL7OEilWHSxvSE=","IMLMtCoq94G/iom6Kc9QnMjl26QBzo9A\u002BUpe\u002Bir5hSk=","cKIyhiSlhxBTpm0tfQp0N73HmTJ0PSk6OasdMHHU6hg=","5/pQTkPDIDKVOIdLIr8K2pqUMYjedXEDzrx/8i2FyMc=","ie4elz0/Yt0Jor8ZOASn7uqtUMQVIIi7iyxpmc\u002BP/3A=","/eDlK\u002BJ5ECzHYnnwNfs1ll7OzscxHc/T9AXptg3xTII=","iZtB7IwVOScbKME8XNDUHe8/LADtOuBuD5iUzZ\u002BTBHA=","VI7hpNtzA0lQFbtSBh2M5HmTFjxD4uLPevcNJtBDECY=","vpPBvnXuysK0e8FBbSO7k6I35HOVZLmZfMhVxlKPzck=","hdgfzdMO3XxPwCGNKDabyl/9YRagIr9KXozaMve1DE4=","4UP6pofGTsyh1E5XO2QVGfORoUAttdjUWvf1A4Mgngw=","AuV7BOj9roSnoQn4CCZRgJiQ9aP\u002Buuc3FxUaAtL4FUk=","3KIGpeODnLLCBrAStJV1hHEo7FwY/hgl7zW1wNeg/Wc=","a2NEK0jnyneLb7plUPbXxhY8oQ9LD9Lc35UnzZUXwJI=","2DvTDD9FORsb164IPm6/PKUGfxUsYAOheM6lMXeQcuQ=","B2ua8h4cGI1Vv8qhyD7sFVXpbxEgmYZbecw9dY4/rFA=","sp9HgH8YqRbHdraJhNz5JJIDCLSscO457uul374ES4I=","wMHpeMWv1hOAkS9kqsiqEALVMDdWAsC3p85glRB/FqI=","/KUhUbxyo/3Nrk2MhF57PAEu8wbud9Cg8Bp1MbxsxoA=","Xz7qwBV8mKNupyCnNDp6b\u002BbbCDqQIuiz/hLvV6WeHmw="],"CachedAssets":{},"CachedCopyCandidates":{}}
|
||||
@ -1 +1 @@
|
||||
{"GlobalPropertiesHash":"HQrK/c2YdUjsysKaYGSoybSEyDguxRws1HNGGkzNr68=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["wMWPZGfJtGeKkPw89r\u002BuOnYPKqx9sEcbqVKHPoYpTbg=","puDy0dzI5QvIsFKrWO6hrkZZcZnbTNSWaBqIyd5vS9E=","bNNyXhlBr3jQbNMkCOe8xcZdSkB7XoUpSNnehjUQlxA=","3Q171G9uNkjZ3lAgJDZDLi2eJw/8ixjkaHrw3rOC/vo=","TDAOXjznXPMZY6da8pxBF7r\u002BgikX9nuv6RoxA3r\u002BE1M=","HwFAFTSvCp26cdo1kx5ecfdA/\u002BXAkxgIq5fu6m8nIA0=","SHr5eqYzJxZNE5/PlzkQfEBMjakT5PcfDexn2iCZjyI=","rovhGZeu5lwGm9t06s1govZ9ZDUAyhGquT/zYxV9EMA=","n90/VXHLh5f/b\u002BenXJx5LvC2wVhxMsmGXsKTtLP1rGE=","M2F\u002BdirWJXRBR8xTEBUsBQq5ZBlMsGLrQuDu2Xoflo8=","QQfqB2d2lyRaoRCXHlFI1qDyAV8sb3YBC6sabNep4T8=","sCLTILGPMYZmM4Cq6VeXFDRKEU4zUeqi0zh34Zyl1\u002Bg=","KPtl\u002BIcYzJanv3TdGEjfu/58zjjSte7onQyK1z2UpSs=","UOD2algC0YxakRPAo\u002BdHBxw2nz\u002Bf3inCW8K/2sYv4hk=","2a4AqN7uSgiGGPijKrbGYp3zTiFaYviYMC4je9251Gg=","S1JDFpdG6oeT7HQg1q6p3OLFEq6MSuMk9DrbZZf85U0=","FcAp\u002BB\u002BMdtU4Jqt1qd8ZU0XGQCyIO1UaSwwwKyFcuRI=","KicT\u002BJLs/7POfopY2e6knubWrx25hvaxJ1zNKezbz9Y=","xL7/ma/CChAYqsGMi59uK6yIstcESmcirrh1RzpvMEw=","dnRdnpQc61NJ56ASQrUFLZkDTGNM0KNu\u002BtR3NDDE34A=","Grv4g6vNrL73s12N910v2w8Bfa5b3fgn3knYM4SPbTo=","biFvXP\u002Bh3VCB//g0WfQTKnZXpYAq5NNK8FOtNrSlluc=","JbXwwQIUN/GSNZKsNiMjv4ebWU2SviyhnVdlqdpCpmg=","nz\u002BZycBj/r0qxn/lLFHWJ8J6wFGlMsV/1mlRmZUo/4I=","aQycidQhGUbn4VCw/EJfF5iFRrN1xIgwHoIJjbOVZps=","qgUM6A/uKHiUkWc1/Ln9WXX1SAX8JoRvV74Ma6ZFmng=","iKkyE9MQsJaeQ\u002BwNmzP/yqlnE0DgDcGv\u002BmjdLoDxrRo=","uTVPNnHOvOCd/yTop9dVCWOMKn4tFTh\u002B\u002BvDB36ISZPs=","mfZpFq\u002BvCmodLP7zO9b0YsEWC/OcDyBoxhYqFD56fFk=","YWOs7JAKIsqIOVQG0w8okz7vUzx0CLjYsgFSeEvd8dY=","mhyeOUDBL5xq9Rlm12fZKRW\u002BewVdAloH3HpGO\u002B7GqeM=","dwYRUoBX6sjNOpgOukCSK6FYozMx5nQPuanV9jF0pug=","ozbr8RdoOPcWGZFTphPnXiPHqUXsUX48rNHT9DPxQQQ=","zNy/\u002Beenwd4rP3KmszLj/P9L4RfeJcIG51tiUMGKZUI=","JqnKg76tBTEDi4ygNmSbT8906THHzJuCJTZbK0K6Oe8=","JcACn0ymzW4JpJ5CgWCxT1NdaSHZxnxp\u002BAiJJM/kC6k=","k71DltJbtRqVXA3rGahMZgUq0B9sodbz2R43hsUcD1I=","aouiJcQV84ezpO9Cwpg\u002BId9XaiZVlGhgxGvxD6PaAGM=","b/Jk0Mr/B4BWzcJa6nZHbXC\u002BzU0I1a30M2AcH5fdjKY=","aK2OxKAVYxUxIEDqZnknDAW9qelpdYKLvlGPA3\u002B5OIE=","E4QT\u002B435PZZ\u002BRTzgvECRD1bOtElnkqeWREaoDzYrMdc=","FBxckgU98gb7vgTEM5V4Q\u002BEWV1Ztcp3Bssbx92n1keA=","gv3iSaKsj0CmcWFWMhUhYcA7l4\u002BnVTp1Jj85xAmbA8E=","mRQfJZfYrp6FVuPsI1970i6\u002Bg1zC7cMX1qaaf5X\u002BoCQ=","5BtfX2AAiOmDTGL34icHscY4eUpH3nbfHN/rb4e62rY=","6rueZEktdPrxLkoO8WfJXCckClsIUsg6sBnN1LTessM=","SZJz\u002B71xnWFevxgzVgPPCqih4KkGwhQhHvoh6BgiWFc=","u2aOXUOrTOrwIgVam12G9HzaU7QEbOQG66Q7IDjlMYY=","8DlE0XjBA/lhOGHaXiPZ5cQswwpo6NEUaebI9my2F4s=","1ldijbG/u6m3Wwq0OUgI3unhWdjWhqvOD\u002BI1PauI9GI=","WtqR0aLtM7t6m3NDyJiTfyz81jhBwyuQkg/iDou5f/k=","aNqGJzJ5xa0dNxSytzanVzqK6xNl85ZkIZfdb\u002BKhxHY=","TpcHV4OB3FaN8hILgTJGBWj6cGx2APNuu6cH90cA2Yw=","y2O\u002BMtvYW\u002BJsiXwnsSGokrtLoPU1BZKq/Rs6jBLWkBA=","XfkTfnoOOODr5Ke\u002BIvlGksb7y1tdjO9D3cio6nfgb6o=","sbScjs7uLbfBbWbJKERtvGeL8se13w0V5s0ufS/zDaQ=","9hC0wthPXB9k40lIbDKdWYtaw2axqBb91\u002BojeVYtTEY=","xLFIqNnTxWnQP99MmbgJqozQM9NzpZ0mMYZdGkZnBU4=","qOlED1ak4sYSTrFn1g6Y7mnsz3UFQEQ/RV3qKJGx0DQ=","Ijp03RBmTBHzhcCv1Sg/aWUghcNgib2sblPmYlOuDYk=","HCsDlEON4uTuZHQ/mLhoZSnOhDE/0YmD0\u002BPzbGk55jk=","DIlQgc8O3Rampq4\u002BuAU34qvAhOQ76ih6rEWZRuXbpGs=","87pLnLY3BRAM5qVJkJZ6NFQjQse85QaOsaRqbVei3f8=","gb5K/PglhYNjQ6udVditV5mmWe8pBL0bkbfqmDZJR3Q=","c//884XNSMx2fHCDDouqzztU4ZLBdyPK5IazFjEu3xg=","A5FwpPfGidgr2NgPt1ofZxg2nxXAcuozNEFd9BE7nsk="],"CachedAssets":{},"CachedCopyCandidates":{}}
|
||||
{"GlobalPropertiesHash":"HQrK/c2YdUjsysKaYGSoybSEyDguxRws1HNGGkzNr68=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["wMWPZGfJtGeKkPw89r\u002BuOnYPKqx9sEcbqVKHPoYpTbg=","puDy0dzI5QvIsFKrWO6hrkZZcZnbTNSWaBqIyd5vS9E=","bNNyXhlBr3jQbNMkCOe8xcZdSkB7XoUpSNnehjUQlxA=","e00HwqbAs5\u002BQP/isIc/1wdQEkEVLrYL4mZkRFgflGxc=","/pGZ5Ne8ls0AltJgWOhL5Yc9\u002BzFbkQwUFLLaEuzhySM=","TDAOXjznXPMZY6da8pxBF7r\u002BgikX9nuv6RoxA3r\u002BE1M=","PAgoRnO8hSCWHTmmLUrKojqhvOGsbhB9PUCqEOnuYrg=","HwFAFTSvCp26cdo1kx5ecfdA/\u002BXAkxgIq5fu6m8nIA0=","SHr5eqYzJxZNE5/PlzkQfEBMjakT5PcfDexn2iCZjyI=","rovhGZeu5lwGm9t06s1govZ9ZDUAyhGquT/zYxV9EMA=","n90/VXHLh5f/b\u002BenXJx5LvC2wVhxMsmGXsKTtLP1rGE=","M2F\u002BdirWJXRBR8xTEBUsBQq5ZBlMsGLrQuDu2Xoflo8=","QQfqB2d2lyRaoRCXHlFI1qDyAV8sb3YBC6sabNep4T8=","sCLTILGPMYZmM4Cq6VeXFDRKEU4zUeqi0zh34Zyl1\u002Bg=","KPtl\u002BIcYzJanv3TdGEjfu/58zjjSte7onQyK1z2UpSs=","UOD2algC0YxakRPAo\u002BdHBxw2nz\u002Bf3inCW8K/2sYv4hk=","2a4AqN7uSgiGGPijKrbGYp3zTiFaYviYMC4je9251Gg=","S1JDFpdG6oeT7HQg1q6p3OLFEq6MSuMk9DrbZZf85U0=","FcAp\u002BB\u002BMdtU4Jqt1qd8ZU0XGQCyIO1UaSwwwKyFcuRI=","KicT\u002BJLs/7POfopY2e6knubWrx25hvaxJ1zNKezbz9Y=","xL7/ma/CChAYqsGMi59uK6yIstcESmcirrh1RzpvMEw=","dnRdnpQc61NJ56ASQrUFLZkDTGNM0KNu\u002BtR3NDDE34A=","Grv4g6vNrL73s12N910v2w8Bfa5b3fgn3knYM4SPbTo=","biFvXP\u002Bh3VCB//g0WfQTKnZXpYAq5NNK8FOtNrSlluc=","JbXwwQIUN/GSNZKsNiMjv4ebWU2SviyhnVdlqdpCpmg=","nz\u002BZycBj/r0qxn/lLFHWJ8J6wFGlMsV/1mlRmZUo/4I=","aQycidQhGUbn4VCw/EJfF5iFRrN1xIgwHoIJjbOVZps=","qgUM6A/uKHiUkWc1/Ln9WXX1SAX8JoRvV74Ma6ZFmng=","iKkyE9MQsJaeQ\u002BwNmzP/yqlnE0DgDcGv\u002BmjdLoDxrRo=","uTVPNnHOvOCd/yTop9dVCWOMKn4tFTh\u002B\u002BvDB36ISZPs=","mfZpFq\u002BvCmodLP7zO9b0YsEWC/OcDyBoxhYqFD56fFk=","YWOs7JAKIsqIOVQG0w8okz7vUzx0CLjYsgFSeEvd8dY=","mhyeOUDBL5xq9Rlm12fZKRW\u002BewVdAloH3HpGO\u002B7GqeM=","dwYRUoBX6sjNOpgOukCSK6FYozMx5nQPuanV9jF0pug=","ozbr8RdoOPcWGZFTphPnXiPHqUXsUX48rNHT9DPxQQQ=","zNy/\u002Beenwd4rP3KmszLj/P9L4RfeJcIG51tiUMGKZUI=","JqnKg76tBTEDi4ygNmSbT8906THHzJuCJTZbK0K6Oe8=","JcACn0ymzW4JpJ5CgWCxT1NdaSHZxnxp\u002BAiJJM/kC6k=","k71DltJbtRqVXA3rGahMZgUq0B9sodbz2R43hsUcD1I=","aouiJcQV84ezpO9Cwpg\u002BId9XaiZVlGhgxGvxD6PaAGM=","b/Jk0Mr/B4BWzcJa6nZHbXC\u002BzU0I1a30M2AcH5fdjKY=","aK2OxKAVYxUxIEDqZnknDAW9qelpdYKLvlGPA3\u002B5OIE=","E4QT\u002B435PZZ\u002BRTzgvECRD1bOtElnkqeWREaoDzYrMdc=","FBxckgU98gb7vgTEM5V4Q\u002BEWV1Ztcp3Bssbx92n1keA=","gv3iSaKsj0CmcWFWMhUhYcA7l4\u002BnVTp1Jj85xAmbA8E=","mRQfJZfYrp6FVuPsI1970i6\u002Bg1zC7cMX1qaaf5X\u002BoCQ=","5BtfX2AAiOmDTGL34icHscY4eUpH3nbfHN/rb4e62rY=","6rueZEktdPrxLkoO8WfJXCckClsIUsg6sBnN1LTessM=","SZJz\u002B71xnWFevxgzVgPPCqih4KkGwhQhHvoh6BgiWFc=","u2aOXUOrTOrwIgVam12G9HzaU7QEbOQG66Q7IDjlMYY=","8DlE0XjBA/lhOGHaXiPZ5cQswwpo6NEUaebI9my2F4s=","1ldijbG/u6m3Wwq0OUgI3unhWdjWhqvOD\u002BI1PauI9GI=","WtqR0aLtM7t6m3NDyJiTfyz81jhBwyuQkg/iDou5f/k=","aNqGJzJ5xa0dNxSytzanVzqK6xNl85ZkIZfdb\u002BKhxHY=","TpcHV4OB3FaN8hILgTJGBWj6cGx2APNuu6cH90cA2Yw=","y2O\u002BMtvYW\u002BJsiXwnsSGokrtLoPU1BZKq/Rs6jBLWkBA=","XfkTfnoOOODr5Ke\u002BIvlGksb7y1tdjO9D3cio6nfgb6o=","wcROe0zOlvSplfU1neaBc6O9UQx0shY6TJh9t2ZSBYs=","10qLnXFiRep12dfNyKPtD4BUjDi86nt7iUeaDRzdFFg=","Aq6Wb82cwzIR34t\u002BKjNx2Bsbl4xPKot/OiCPUr8NcaA=","sbScjs7uLbfBbWbJKERtvGeL8se13w0V5s0ufS/zDaQ=","9hC0wthPXB9k40lIbDKdWYtaw2axqBb91\u002BojeVYtTEY=","oHrJ\u002Blbd6RhXKDeATc8FabZLEDUjbHWnd18rZBRbNBE=","qOlED1ak4sYSTrFn1g6Y7mnsz3UFQEQ/RV3qKJGx0DQ=","bkU1JrXkWH3R/7pZTq912KiH0qHTMuWrKp6\u002B3V8nWE0=","HCsDlEON4uTuZHQ/mLhoZSnOhDE/0YmD0\u002BPzbGk55jk=","DIlQgc8O3Rampq4\u002BuAU34qvAhOQ76ih6rEWZRuXbpGs=","87pLnLY3BRAM5qVJkJZ6NFQjQse85QaOsaRqbVei3f8=","gb5K/PglhYNjQ6udVditV5mmWe8pBL0bkbfqmDZJR3Q=","c//884XNSMx2fHCDDouqzztU4ZLBdyPK5IazFjEu3xg=","A5FwpPfGidgr2NgPt1ofZxg2nxXAcuozNEFd9BE7nsk="],"CachedAssets":{},"CachedCopyCandidates":{}}
|
||||
@ -1 +1 @@
|
||||
{"GlobalPropertiesHash":"Q5kcht8XOSaXwErDHawVS9gd2nNuRy7EEG55Mop5u7E=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["wMWPZGfJtGeKkPw89r\u002BuOnYPKqx9sEcbqVKHPoYpTbg=","puDy0dzI5QvIsFKrWO6hrkZZcZnbTNSWaBqIyd5vS9E=","bNNyXhlBr3jQbNMkCOe8xcZdSkB7XoUpSNnehjUQlxA=","3Q171G9uNkjZ3lAgJDZDLi2eJw/8ixjkaHrw3rOC/vo=","TDAOXjznXPMZY6da8pxBF7r\u002BgikX9nuv6RoxA3r\u002BE1M=","HwFAFTSvCp26cdo1kx5ecfdA/\u002BXAkxgIq5fu6m8nIA0=","SHr5eqYzJxZNE5/PlzkQfEBMjakT5PcfDexn2iCZjyI=","rovhGZeu5lwGm9t06s1govZ9ZDUAyhGquT/zYxV9EMA=","n90/VXHLh5f/b\u002BenXJx5LvC2wVhxMsmGXsKTtLP1rGE=","M2F\u002BdirWJXRBR8xTEBUsBQq5ZBlMsGLrQuDu2Xoflo8=","QQfqB2d2lyRaoRCXHlFI1qDyAV8sb3YBC6sabNep4T8=","sCLTILGPMYZmM4Cq6VeXFDRKEU4zUeqi0zh34Zyl1\u002Bg=","KPtl\u002BIcYzJanv3TdGEjfu/58zjjSte7onQyK1z2UpSs=","UOD2algC0YxakRPAo\u002BdHBxw2nz\u002Bf3inCW8K/2sYv4hk=","2a4AqN7uSgiGGPijKrbGYp3zTiFaYviYMC4je9251Gg=","S1JDFpdG6oeT7HQg1q6p3OLFEq6MSuMk9DrbZZf85U0=","FcAp\u002BB\u002BMdtU4Jqt1qd8ZU0XGQCyIO1UaSwwwKyFcuRI=","KicT\u002BJLs/7POfopY2e6knubWrx25hvaxJ1zNKezbz9Y=","xL7/ma/CChAYqsGMi59uK6yIstcESmcirrh1RzpvMEw=","dnRdnpQc61NJ56ASQrUFLZkDTGNM0KNu\u002BtR3NDDE34A=","Grv4g6vNrL73s12N910v2w8Bfa5b3fgn3knYM4SPbTo=","biFvXP\u002Bh3VCB//g0WfQTKnZXpYAq5NNK8FOtNrSlluc=","JbXwwQIUN/GSNZKsNiMjv4ebWU2SviyhnVdlqdpCpmg=","nz\u002BZycBj/r0qxn/lLFHWJ8J6wFGlMsV/1mlRmZUo/4I=","aQycidQhGUbn4VCw/EJfF5iFRrN1xIgwHoIJjbOVZps=","qgUM6A/uKHiUkWc1/Ln9WXX1SAX8JoRvV74Ma6ZFmng=","iKkyE9MQsJaeQ\u002BwNmzP/yqlnE0DgDcGv\u002BmjdLoDxrRo=","uTVPNnHOvOCd/yTop9dVCWOMKn4tFTh\u002B\u002BvDB36ISZPs=","mfZpFq\u002BvCmodLP7zO9b0YsEWC/OcDyBoxhYqFD56fFk=","YWOs7JAKIsqIOVQG0w8okz7vUzx0CLjYsgFSeEvd8dY=","mhyeOUDBL5xq9Rlm12fZKRW\u002BewVdAloH3HpGO\u002B7GqeM=","dwYRUoBX6sjNOpgOukCSK6FYozMx5nQPuanV9jF0pug=","ozbr8RdoOPcWGZFTphPnXiPHqUXsUX48rNHT9DPxQQQ=","zNy/\u002Beenwd4rP3KmszLj/P9L4RfeJcIG51tiUMGKZUI=","JqnKg76tBTEDi4ygNmSbT8906THHzJuCJTZbK0K6Oe8=","JcACn0ymzW4JpJ5CgWCxT1NdaSHZxnxp\u002BAiJJM/kC6k=","k71DltJbtRqVXA3rGahMZgUq0B9sodbz2R43hsUcD1I=","aouiJcQV84ezpO9Cwpg\u002BId9XaiZVlGhgxGvxD6PaAGM=","b/Jk0Mr/B4BWzcJa6nZHbXC\u002BzU0I1a30M2AcH5fdjKY=","aK2OxKAVYxUxIEDqZnknDAW9qelpdYKLvlGPA3\u002B5OIE=","E4QT\u002B435PZZ\u002BRTzgvECRD1bOtElnkqeWREaoDzYrMdc=","FBxckgU98gb7vgTEM5V4Q\u002BEWV1Ztcp3Bssbx92n1keA=","gv3iSaKsj0CmcWFWMhUhYcA7l4\u002BnVTp1Jj85xAmbA8E=","mRQfJZfYrp6FVuPsI1970i6\u002Bg1zC7cMX1qaaf5X\u002BoCQ=","5BtfX2AAiOmDTGL34icHscY4eUpH3nbfHN/rb4e62rY=","6rueZEktdPrxLkoO8WfJXCckClsIUsg6sBnN1LTessM=","SZJz\u002B71xnWFevxgzVgPPCqih4KkGwhQhHvoh6BgiWFc=","u2aOXUOrTOrwIgVam12G9HzaU7QEbOQG66Q7IDjlMYY=","8DlE0XjBA/lhOGHaXiPZ5cQswwpo6NEUaebI9my2F4s=","1ldijbG/u6m3Wwq0OUgI3unhWdjWhqvOD\u002BI1PauI9GI=","WtqR0aLtM7t6m3NDyJiTfyz81jhBwyuQkg/iDou5f/k=","aNqGJzJ5xa0dNxSytzanVzqK6xNl85ZkIZfdb\u002BKhxHY=","TpcHV4OB3FaN8hILgTJGBWj6cGx2APNuu6cH90cA2Yw=","y2O\u002BMtvYW\u002BJsiXwnsSGokrtLoPU1BZKq/Rs6jBLWkBA=","XfkTfnoOOODr5Ke\u002BIvlGksb7y1tdjO9D3cio6nfgb6o=","sbScjs7uLbfBbWbJKERtvGeL8se13w0V5s0ufS/zDaQ=","9hC0wthPXB9k40lIbDKdWYtaw2axqBb91\u002BojeVYtTEY=","xLFIqNnTxWnQP99MmbgJqozQM9NzpZ0mMYZdGkZnBU4=","qOlED1ak4sYSTrFn1g6Y7mnsz3UFQEQ/RV3qKJGx0DQ=","Ijp03RBmTBHzhcCv1Sg/aWUghcNgib2sblPmYlOuDYk=","HCsDlEON4uTuZHQ/mLhoZSnOhDE/0YmD0\u002BPzbGk55jk=","DIlQgc8O3Rampq4\u002BuAU34qvAhOQ76ih6rEWZRuXbpGs=","87pLnLY3BRAM5qVJkJZ6NFQjQse85QaOsaRqbVei3f8=","gb5K/PglhYNjQ6udVditV5mmWe8pBL0bkbfqmDZJR3Q=","c//884XNSMx2fHCDDouqzztU4ZLBdyPK5IazFjEu3xg=","A5FwpPfGidgr2NgPt1ofZxg2nxXAcuozNEFd9BE7nsk="],"CachedAssets":{},"CachedCopyCandidates":{}}
|
||||
{"GlobalPropertiesHash":"Q5kcht8XOSaXwErDHawVS9gd2nNuRy7EEG55Mop5u7E=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["wMWPZGfJtGeKkPw89r\u002BuOnYPKqx9sEcbqVKHPoYpTbg=","puDy0dzI5QvIsFKrWO6hrkZZcZnbTNSWaBqIyd5vS9E=","bNNyXhlBr3jQbNMkCOe8xcZdSkB7XoUpSNnehjUQlxA=","e00HwqbAs5\u002BQP/isIc/1wdQEkEVLrYL4mZkRFgflGxc=","/pGZ5Ne8ls0AltJgWOhL5Yc9\u002BzFbkQwUFLLaEuzhySM=","TDAOXjznXPMZY6da8pxBF7r\u002BgikX9nuv6RoxA3r\u002BE1M=","PAgoRnO8hSCWHTmmLUrKojqhvOGsbhB9PUCqEOnuYrg=","HwFAFTSvCp26cdo1kx5ecfdA/\u002BXAkxgIq5fu6m8nIA0=","SHr5eqYzJxZNE5/PlzkQfEBMjakT5PcfDexn2iCZjyI=","rovhGZeu5lwGm9t06s1govZ9ZDUAyhGquT/zYxV9EMA=","n90/VXHLh5f/b\u002BenXJx5LvC2wVhxMsmGXsKTtLP1rGE=","M2F\u002BdirWJXRBR8xTEBUsBQq5ZBlMsGLrQuDu2Xoflo8=","QQfqB2d2lyRaoRCXHlFI1qDyAV8sb3YBC6sabNep4T8=","sCLTILGPMYZmM4Cq6VeXFDRKEU4zUeqi0zh34Zyl1\u002Bg=","KPtl\u002BIcYzJanv3TdGEjfu/58zjjSte7onQyK1z2UpSs=","UOD2algC0YxakRPAo\u002BdHBxw2nz\u002Bf3inCW8K/2sYv4hk=","2a4AqN7uSgiGGPijKrbGYp3zTiFaYviYMC4je9251Gg=","S1JDFpdG6oeT7HQg1q6p3OLFEq6MSuMk9DrbZZf85U0=","FcAp\u002BB\u002BMdtU4Jqt1qd8ZU0XGQCyIO1UaSwwwKyFcuRI=","KicT\u002BJLs/7POfopY2e6knubWrx25hvaxJ1zNKezbz9Y=","xL7/ma/CChAYqsGMi59uK6yIstcESmcirrh1RzpvMEw=","dnRdnpQc61NJ56ASQrUFLZkDTGNM0KNu\u002BtR3NDDE34A=","Grv4g6vNrL73s12N910v2w8Bfa5b3fgn3knYM4SPbTo=","biFvXP\u002Bh3VCB//g0WfQTKnZXpYAq5NNK8FOtNrSlluc=","JbXwwQIUN/GSNZKsNiMjv4ebWU2SviyhnVdlqdpCpmg=","nz\u002BZycBj/r0qxn/lLFHWJ8J6wFGlMsV/1mlRmZUo/4I=","aQycidQhGUbn4VCw/EJfF5iFRrN1xIgwHoIJjbOVZps=","qgUM6A/uKHiUkWc1/Ln9WXX1SAX8JoRvV74Ma6ZFmng=","iKkyE9MQsJaeQ\u002BwNmzP/yqlnE0DgDcGv\u002BmjdLoDxrRo=","uTVPNnHOvOCd/yTop9dVCWOMKn4tFTh\u002B\u002BvDB36ISZPs=","mfZpFq\u002BvCmodLP7zO9b0YsEWC/OcDyBoxhYqFD56fFk=","YWOs7JAKIsqIOVQG0w8okz7vUzx0CLjYsgFSeEvd8dY=","mhyeOUDBL5xq9Rlm12fZKRW\u002BewVdAloH3HpGO\u002B7GqeM=","dwYRUoBX6sjNOpgOukCSK6FYozMx5nQPuanV9jF0pug=","ozbr8RdoOPcWGZFTphPnXiPHqUXsUX48rNHT9DPxQQQ=","zNy/\u002Beenwd4rP3KmszLj/P9L4RfeJcIG51tiUMGKZUI=","JqnKg76tBTEDi4ygNmSbT8906THHzJuCJTZbK0K6Oe8=","JcACn0ymzW4JpJ5CgWCxT1NdaSHZxnxp\u002BAiJJM/kC6k=","k71DltJbtRqVXA3rGahMZgUq0B9sodbz2R43hsUcD1I=","aouiJcQV84ezpO9Cwpg\u002BId9XaiZVlGhgxGvxD6PaAGM=","b/Jk0Mr/B4BWzcJa6nZHbXC\u002BzU0I1a30M2AcH5fdjKY=","aK2OxKAVYxUxIEDqZnknDAW9qelpdYKLvlGPA3\u002B5OIE=","E4QT\u002B435PZZ\u002BRTzgvECRD1bOtElnkqeWREaoDzYrMdc=","FBxckgU98gb7vgTEM5V4Q\u002BEWV1Ztcp3Bssbx92n1keA=","gv3iSaKsj0CmcWFWMhUhYcA7l4\u002BnVTp1Jj85xAmbA8E=","mRQfJZfYrp6FVuPsI1970i6\u002Bg1zC7cMX1qaaf5X\u002BoCQ=","5BtfX2AAiOmDTGL34icHscY4eUpH3nbfHN/rb4e62rY=","6rueZEktdPrxLkoO8WfJXCckClsIUsg6sBnN1LTessM=","SZJz\u002B71xnWFevxgzVgPPCqih4KkGwhQhHvoh6BgiWFc=","u2aOXUOrTOrwIgVam12G9HzaU7QEbOQG66Q7IDjlMYY=","8DlE0XjBA/lhOGHaXiPZ5cQswwpo6NEUaebI9my2F4s=","1ldijbG/u6m3Wwq0OUgI3unhWdjWhqvOD\u002BI1PauI9GI=","WtqR0aLtM7t6m3NDyJiTfyz81jhBwyuQkg/iDou5f/k=","aNqGJzJ5xa0dNxSytzanVzqK6xNl85ZkIZfdb\u002BKhxHY=","TpcHV4OB3FaN8hILgTJGBWj6cGx2APNuu6cH90cA2Yw=","y2O\u002BMtvYW\u002BJsiXwnsSGokrtLoPU1BZKq/Rs6jBLWkBA=","XfkTfnoOOODr5Ke\u002BIvlGksb7y1tdjO9D3cio6nfgb6o=","wcROe0zOlvSplfU1neaBc6O9UQx0shY6TJh9t2ZSBYs=","10qLnXFiRep12dfNyKPtD4BUjDi86nt7iUeaDRzdFFg=","Aq6Wb82cwzIR34t\u002BKjNx2Bsbl4xPKot/OiCPUr8NcaA=","sbScjs7uLbfBbWbJKERtvGeL8se13w0V5s0ufS/zDaQ=","9hC0wthPXB9k40lIbDKdWYtaw2axqBb91\u002BojeVYtTEY=","oHrJ\u002Blbd6RhXKDeATc8FabZLEDUjbHWnd18rZBRbNBE=","qOlED1ak4sYSTrFn1g6Y7mnsz3UFQEQ/RV3qKJGx0DQ=","bkU1JrXkWH3R/7pZTq912KiH0qHTMuWrKp6\u002B3V8nWE0=","HCsDlEON4uTuZHQ/mLhoZSnOhDE/0YmD0\u002BPzbGk55jk=","DIlQgc8O3Rampq4\u002BuAU34qvAhOQ76ih6rEWZRuXbpGs=","87pLnLY3BRAM5qVJkJZ6NFQjQse85QaOsaRqbVei3f8=","gb5K/PglhYNjQ6udVditV5mmWe8pBL0bkbfqmDZJR3Q=","c//884XNSMx2fHCDDouqzztU4ZLBdyPK5IazFjEu3xg=","A5FwpPfGidgr2NgPt1ofZxg2nxXAcuozNEFd9BE7nsk="],"CachedAssets":{},"CachedCopyCandidates":{}}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1 +1 @@
|
||||
uItkRxd8HGmDpOGXSZUcgBl9qNJmoTF2VPg7ZNs3V00=
|
||||
+3s8TTPcc657CtZZeHB/FwXsD8EuOVIHrdrZEjeJb9A=
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -42,6 +42,8 @@
|
||||
<script src="js/init.js"></script>
|
||||
<script src="_framework/blazor.webassembly.js"></script>
|
||||
<script src="_content/Blazor.Bootstrap/blazor.bootstrap.js"></script>
|
||||
<script src="js/onProfNext.js"></script>
|
||||
<script src="js/dragDrop.js"></script>
|
||||
</body>
|
||||
|
||||
|
||||
|
||||
37
OnProfNext.Client/wwwroot/js/dragDrop.js
Normal file
37
OnProfNext.Client/wwwroot/js/dragDrop.js
Normal file
@ -0,0 +1,37 @@
|
||||
window.onProfNext = {
|
||||
preventDefault: function (event) {
|
||||
if (event) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
}
|
||||
},
|
||||
startResize: function (event, bookingId, onResizeCallback) {
|
||||
event.preventDefault();
|
||||
const element = event.target.closest('.booking-item');
|
||||
if (!element) return;
|
||||
|
||||
let startY = event.clientY;
|
||||
let startHeight = parseInt(element.style.height) || 50; // Default 50px (1 hour)
|
||||
const minHeight = 25; // Minimum 0.5 hours
|
||||
const maxHeight = 400; // Maximum 8 hours
|
||||
|
||||
function onMouseMove(e) {
|
||||
const deltaY = e.clientY - startY;
|
||||
let newHeight = Math.max(minHeight, Math.min(maxHeight, startHeight + deltaY));
|
||||
newHeight = Math.round(newHeight / 25) * 25; // Round to nearest 0.5 hours
|
||||
element.style.height = `${newHeight}px`;
|
||||
|
||||
const hours = newHeight / 50; // 50px = 1 hour
|
||||
window.onProfNext.currentHours = hours;
|
||||
}
|
||||
|
||||
function onMouseUp() {
|
||||
document.removeEventListener('mousemove', onMouseMove);
|
||||
document.removeEventListener('mouseup', onMouseUp);
|
||||
DotNet.invokeMethodAsync('OnProfNext.Client', 'UpdateBookingHours', bookingId, window.onProfNext.currentHours);
|
||||
}
|
||||
|
||||
document.addEventListener('mousemove', onMouseMove);
|
||||
document.addEventListener('mouseup', onMouseUp);
|
||||
}
|
||||
};
|
||||
15
OnProfNext.Client/wwwroot/js/onProfNext.js
Normal file
15
OnProfNext.Client/wwwroot/js/onProfNext.js
Normal file
@ -0,0 +1,15 @@
|
||||
|
||||
window.onProfNext = {
|
||||
preventDefault: function () {
|
||||
// Diese Funktion wird von Blazor aufgerufen, um preventDefault zu setzen
|
||||
// Sie muss an einem Ort aufgerufen werden, wo das Event verfügbar ist
|
||||
// In Blazor wird sie über @ondragover aufgerufen
|
||||
return true; // Signalisiert, dass der Aufruf erfolgreich war
|
||||
}
|
||||
};
|
||||
|
||||
// Event-Listener für dragover, um preventDefault zu setzen
|
||||
document.addEventListener('dragover', (event) => {
|
||||
event.preventDefault();
|
||||
event.dataTransfer.dropEffect = 'move';
|
||||
});
|
||||
46
OnProfNext.Server/Configurations/BookingConfiguration.cs
Normal file
46
OnProfNext.Server/Configurations/BookingConfiguration.cs
Normal file
@ -0,0 +1,46 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
||||
using OnProfNext.Shared.Models;
|
||||
|
||||
namespace OnProfNext.Server.Data.Configurations
|
||||
{
|
||||
public class BookingConfiguration : IEntityTypeConfiguration<Booking>
|
||||
{
|
||||
public void Configure(EntityTypeBuilder<Booking> builder)
|
||||
{
|
||||
builder.ToTable("Bookings");
|
||||
|
||||
builder.HasKey(b => b.Id);
|
||||
|
||||
builder.Property(b => b.Hours)
|
||||
.HasColumnType("decimal(5,2)")
|
||||
.IsRequired();
|
||||
|
||||
builder.Property(b => b.Date)
|
||||
.IsRequired();
|
||||
|
||||
builder.Property(b => b.Description)
|
||||
.HasMaxLength(500);
|
||||
|
||||
builder.Property(b => b.MandantId)
|
||||
.IsRequired();
|
||||
|
||||
|
||||
builder.HasOne(b => b.Order)
|
||||
.WithMany()
|
||||
.HasForeignKey(b => b.OrderId)
|
||||
.OnDelete(DeleteBehavior.Cascade);
|
||||
|
||||
builder.HasOne(b => b.User)
|
||||
.WithMany()
|
||||
.HasForeignKey(b => b.UserId)
|
||||
.OnDelete(DeleteBehavior.Restrict);
|
||||
|
||||
builder.Property(b => b.CreatedAt)
|
||||
.HasDefaultValueSql("GETUTCDATE()");
|
||||
|
||||
builder.Property(b => b.UpdatedAt)
|
||||
.HasDefaultValueSql("GETUTCDATE()");
|
||||
}
|
||||
}
|
||||
}
|
||||
163
OnProfNext.Server/Controllers/BookingsController.cs
Normal file
163
OnProfNext.Server/Controllers/BookingsController.cs
Normal file
@ -0,0 +1,163 @@
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using OnProfNext.Server.Data;
|
||||
using OnProfNext.Shared.Models;
|
||||
using OnProfNext.Shared.Models.DTOs;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace OnProfNext.Server.Controllers
|
||||
{
|
||||
[ApiController]
|
||||
[Route("api/[controller]")]
|
||||
[Authorize]
|
||||
public class BookingsController : ControllerBase
|
||||
{
|
||||
private readonly AppDbContext _context;
|
||||
|
||||
public BookingsController(AppDbContext context)
|
||||
{
|
||||
_context = context;
|
||||
}
|
||||
|
||||
private int GetCurrentUserId()
|
||||
{
|
||||
var userIdClaim = User.FindFirst("UserId")?.Value;
|
||||
if (string.IsNullOrEmpty(userIdClaim))
|
||||
throw new UnauthorizedAccessException("Kein User-Claim im Token gefunden.");
|
||||
|
||||
return int.Parse(userIdClaim);
|
||||
}
|
||||
|
||||
[HttpGet("mine")]
|
||||
public async Task<ActionResult<IEnumerable<BookingDto>>> GetMyBookings()
|
||||
{
|
||||
var userId = GetCurrentUserId();
|
||||
|
||||
var bookings = await _context.Bookings
|
||||
.Include(b => b.Order)
|
||||
.Where(b => b.UserId == userId)
|
||||
.OrderByDescending(b => b.Date)
|
||||
.Select(b => new BookingDto
|
||||
{
|
||||
Id = b.Id,
|
||||
OrderId = b.OrderId,
|
||||
OrderTitle = b.Order != null ? b.Order.Titel : "",
|
||||
UserId = b.UserId,
|
||||
Date = b.Date,
|
||||
Hours = b.Hours,
|
||||
Description = b.Description,
|
||||
MandantId = b.MandantId,
|
||||
IsPending = false
|
||||
})
|
||||
.ToListAsync();
|
||||
|
||||
Console.WriteLine($"Returning bookings: {JsonSerializer.Serialize(bookings, new JsonSerializerOptions { WriteIndented = true })}");
|
||||
return Ok(bookings);
|
||||
}
|
||||
|
||||
[HttpGet("byproject/{projectId}")]
|
||||
public async Task<ActionResult<IEnumerable<BookingDto>>> GetBookingsByProject(int projectId)
|
||||
{
|
||||
var bookings = await _context.Bookings
|
||||
.Include(b => b.Order)
|
||||
.ThenInclude(o => o.Project)
|
||||
.Include(b => b.User)
|
||||
.Where(b => b.Order!.ProjectId == projectId)
|
||||
.Select(b => new BookingDto
|
||||
{
|
||||
Id = b.Id,
|
||||
OrderId = b.OrderId,
|
||||
OrderTitle = b.Order!.Titel,
|
||||
UserId = b.UserId,
|
||||
Username = $"{b.User!.FirstName} {b.User.LastName}",
|
||||
Date = b.Date,
|
||||
Hours = b.Hours,
|
||||
Description = b.Description,
|
||||
MandantId = b.MandantId,
|
||||
IsPending = false
|
||||
})
|
||||
.ToListAsync();
|
||||
|
||||
Console.WriteLine($"Returning bookings for project {projectId}: {JsonSerializer.Serialize(bookings, new JsonSerializerOptions { WriteIndented = true })}");
|
||||
return Ok(bookings);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public async Task<ActionResult<BookingDto>> CreateBooking([FromBody] BookingCreateDto dto)
|
||||
{
|
||||
var userId = GetCurrentUserId();
|
||||
|
||||
// Logge die rohe HTTP-Payload
|
||||
var rawRequest = await new StreamReader(Request.BodyReader.AsStream()).ReadToEndAsync();
|
||||
Console.WriteLine($"Raw HTTP request body: {rawRequest}");
|
||||
Console.WriteLine($"Received booking DTO: {JsonSerializer.Serialize(dto, new JsonSerializerOptions { WriteIndented = true })}");
|
||||
Console.WriteLine($"Received booking: Date={dto.Date.ToString("dd.MM.yyyy HH:mm:ss")} (Kind: {dto.Date.Kind})");
|
||||
|
||||
var booking = new Booking
|
||||
{
|
||||
OrderId = dto.OrderId,
|
||||
UserId = userId,
|
||||
Date = dto.Date,
|
||||
Hours = dto.Hours,
|
||||
Description = dto.Description,
|
||||
MandantId = dto.MandantId,
|
||||
CreatedAt = DateTime.UtcNow,
|
||||
UpdatedAt = DateTime.UtcNow
|
||||
};
|
||||
|
||||
_context.Bookings.Add(booking);
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
var createdDto = new BookingDto
|
||||
{
|
||||
Id = booking.Id,
|
||||
OrderId = booking.OrderId,
|
||||
UserId = booking.UserId,
|
||||
Date = booking.Date,
|
||||
Hours = booking.Hours,
|
||||
Description = booking.Description,
|
||||
MandantId = booking.MandantId,
|
||||
IsPending = false
|
||||
};
|
||||
|
||||
Console.WriteLine($"Created booking: ID={booking.Id}, Date={booking.Date.ToString("dd.MM.yyyy HH:mm:ss")} (Kind: {booking.Date.Kind})");
|
||||
return CreatedAtAction(nameof(GetMyBookings), new { id = booking.Id }, createdDto);
|
||||
}
|
||||
|
||||
[HttpPut("{id}")]
|
||||
public async Task<IActionResult> UpdateBooking(int id, BookingCreateDto dto)
|
||||
{
|
||||
var userId = GetCurrentUserId();
|
||||
Console.WriteLine($"Updating booking ID={id}: Date={dto.Date.ToString("dd.MM.yyyy HH:mm:ss")} (Kind: {dto.Date.Kind})");
|
||||
|
||||
var booking = await _context.Bookings.FirstOrDefaultAsync(b => b.Id == id && b.UserId == userId);
|
||||
if (booking == null) return NotFound();
|
||||
|
||||
booking.OrderId = dto.OrderId;
|
||||
booking.Date = dto.Date;
|
||||
booking.Hours = dto.Hours;
|
||||
booking.Description = dto.Description;
|
||||
booking.UpdatedAt = DateTime.UtcNow;
|
||||
|
||||
await _context.SaveChangesAsync();
|
||||
Console.WriteLine($"Updated booking ID={id}: Date={booking.Date.ToString("dd.MM.yyyy HH:mm:ss")} (Kind: {booking.Date.Kind})");
|
||||
return NoContent();
|
||||
}
|
||||
|
||||
[HttpDelete("{id}")]
|
||||
public async Task<IActionResult> DeleteBooking(int id)
|
||||
{
|
||||
var userId = GetCurrentUserId();
|
||||
var booking = await _context.Bookings.FirstOrDefaultAsync(b => b.Id == id && b.UserId == userId);
|
||||
if (booking == null)
|
||||
return NotFound();
|
||||
|
||||
Console.WriteLine($"Deleting booking ID={id}");
|
||||
_context.Bookings.Remove(booking);
|
||||
await _context.SaveChangesAsync();
|
||||
Console.WriteLine($"Deleted booking ID={id}");
|
||||
return NoContent();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -178,5 +178,52 @@ namespace OnProfNext.Server.Controllers
|
||||
|
||||
return NoContent();
|
||||
}
|
||||
|
||||
private int GetCurrentUserId()
|
||||
{
|
||||
var userIdClaim = User.FindFirst("UserId")?.Value;
|
||||
if (string.IsNullOrEmpty(userIdClaim))
|
||||
throw new UnauthorizedAccessException("Kein User-Claim im Token gefunden.");
|
||||
|
||||
return int.Parse(userIdClaim);
|
||||
}
|
||||
|
||||
[HttpGet("mine")]
|
||||
public async Task<ActionResult<IEnumerable<OrderDto>>> GetMyOrders()
|
||||
{
|
||||
var userId = GetCurrentUserId();
|
||||
|
||||
var orders = await _context.Orders
|
||||
.Include(o => o.OrderUsers)
|
||||
.ThenInclude(ou => ou.User)
|
||||
.Where(o => o.OrderUsers.Any(ou => ou.UserId == userId))
|
||||
.AsNoTracking()
|
||||
.Select(o => new OrderDto
|
||||
{
|
||||
Id = o.Id,
|
||||
ProjectId = o.ProjectId,
|
||||
Auftragsnummer = o.Auftragsnummer,
|
||||
Titel = o.Titel,
|
||||
Status = o.Status,
|
||||
Planstunden = o.Planstunden,
|
||||
Iststunden = o.Iststunden,
|
||||
Projektcode = o.Projektcode,
|
||||
MandantId = o.MandantId,
|
||||
CreatedAt = o.CreatedAt,
|
||||
UpdatedAt = o.UpdatedAt,
|
||||
Mitarbeiter = o.OrderUsers
|
||||
.Select(ou => new UserDto
|
||||
{
|
||||
Id = ou.User!.Id,
|
||||
Username = ou.User.Username,
|
||||
FirstName = ou.User.FirstName,
|
||||
LastName = ou.User.LastName,
|
||||
Email = ou.User.Email
|
||||
}).ToList()
|
||||
})
|
||||
.ToListAsync();
|
||||
|
||||
return Ok(orders);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using OnProfNext.Server.Configurations;
|
||||
using OnProfNext.Server.Data.Configurations;
|
||||
using OnProfNext.Shared.Models;
|
||||
|
||||
namespace OnProfNext.Server.Data
|
||||
@ -15,6 +16,7 @@ namespace OnProfNext.Server.Data
|
||||
public DbSet<ProjectUser> ProjectUsers => Set<ProjectUser>();
|
||||
public DbSet<OrderUser> OrderUsers => Set<OrderUser>();
|
||||
public DbSet<Order> Orders => Set<Order>();
|
||||
public DbSet<Booking> Bookings => Set<Booking>();
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
@ -26,6 +28,7 @@ namespace OnProfNext.Server.Data
|
||||
modelBuilder.ApplyConfiguration(new ProjectUserConfiguration());
|
||||
modelBuilder.ApplyConfiguration(new OrderUserConfiguration());
|
||||
modelBuilder.ApplyConfiguration(new OrderConfiguration());
|
||||
modelBuilder.ApplyConfiguration(new BookingConfiguration());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
368
OnProfNext.Server/Migrations/20251015131954_AddBookingsConfiguration.Designer.cs
generated
Normal file
368
OnProfNext.Server/Migrations/20251015131954_AddBookingsConfiguration.Designer.cs
generated
Normal file
@ -0,0 +1,368 @@
|
||||
// <auto-generated />
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
using Microsoft.EntityFrameworkCore.Metadata;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||
using OnProfNext.Server.Data;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace OnProfNext.Server.Migrations
|
||||
{
|
||||
[DbContext(typeof(AppDbContext))]
|
||||
[Migration("20251015131954_AddBookingsConfiguration")]
|
||||
partial class AddBookingsConfiguration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||
{
|
||||
#pragma warning disable 612, 618
|
||||
modelBuilder
|
||||
.HasAnnotation("ProductVersion", "9.0.9")
|
||||
.HasAnnotation("Relational:MaxIdentifierLength", 128);
|
||||
|
||||
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
|
||||
|
||||
modelBuilder.Entity("OnProfNext.Shared.Models.Booking", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int");
|
||||
|
||||
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<DateTime>("CreatedAt")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("datetime2")
|
||||
.HasDefaultValueSql("GETUTCDATE()");
|
||||
|
||||
b.Property<DateTime>("Date")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<string>("Description")
|
||||
.HasMaxLength(500)
|
||||
.HasColumnType("nvarchar(500)");
|
||||
|
||||
b.Property<decimal>("Hours")
|
||||
.HasColumnType("decimal(5,2)");
|
||||
|
||||
b.Property<int>("MandantId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("OrderId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<DateTime>("UpdatedAt")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("datetime2")
|
||||
.HasDefaultValueSql("GETUTCDATE()");
|
||||
|
||||
b.Property<int>("UserId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("OrderId");
|
||||
|
||||
b.HasIndex("UserId");
|
||||
|
||||
b.ToTable("Bookings", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("OnProfNext.Shared.Models.Order", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int");
|
||||
|
||||
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<string>("Auftragsnummer")
|
||||
.IsRequired()
|
||||
.HasMaxLength(50)
|
||||
.HasColumnType("nvarchar(50)");
|
||||
|
||||
b.Property<DateTime>("CreatedAt")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("datetime2")
|
||||
.HasDefaultValueSql("GETUTCDATE()");
|
||||
|
||||
b.Property<decimal>("Iststunden")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasPrecision(10, 2)
|
||||
.HasColumnType("decimal(10,2)")
|
||||
.HasDefaultValue(0m);
|
||||
|
||||
b.Property<int>("MandantId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<decimal>("Planstunden")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasPrecision(10, 2)
|
||||
.HasColumnType("decimal(10,2)")
|
||||
.HasDefaultValue(0m);
|
||||
|
||||
b.Property<int>("ProjectId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<string>("Projektcode")
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<string>("Status")
|
||||
.IsRequired()
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasMaxLength(50)
|
||||
.HasColumnType("nvarchar(50)")
|
||||
.HasDefaultValue("Geplant");
|
||||
|
||||
b.Property<string>("Titel")
|
||||
.IsRequired()
|
||||
.HasMaxLength(255)
|
||||
.HasColumnType("nvarchar(255)");
|
||||
|
||||
b.Property<DateTime>("UpdatedAt")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("datetime2")
|
||||
.HasDefaultValueSql("GETUTCDATE()");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("ProjectId");
|
||||
|
||||
b.ToTable("Orders", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("OnProfNext.Shared.Models.OrderUser", b =>
|
||||
{
|
||||
b.Property<int>("OrderId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("UserId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.HasKey("OrderId", "UserId");
|
||||
|
||||
b.HasIndex("UserId");
|
||||
|
||||
b.ToTable("OrderUsers", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("OnProfNext.Shared.Models.Project", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int");
|
||||
|
||||
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<DateTime>("CreatedAt")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("datetime2")
|
||||
.HasDefaultValueSql("SYSDATETIME()");
|
||||
|
||||
b.Property<string>("Description")
|
||||
.HasMaxLength(1000)
|
||||
.HasColumnType("nvarchar(1000)");
|
||||
|
||||
b.Property<DateTime?>("EndDate")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<int>("MandantId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int")
|
||||
.HasDefaultValue(1);
|
||||
|
||||
b.Property<string>("ProjectManager")
|
||||
.HasMaxLength(100)
|
||||
.HasColumnType("nvarchar(100)");
|
||||
|
||||
b.Property<string>("ProjectName")
|
||||
.IsRequired()
|
||||
.HasMaxLength(200)
|
||||
.HasColumnType("nvarchar(200)");
|
||||
|
||||
b.Property<DateTime>("StartDate")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("datetime2")
|
||||
.HasDefaultValueSql("SYSDATETIME()");
|
||||
|
||||
b.Property<string>("Status")
|
||||
.IsRequired()
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasMaxLength(50)
|
||||
.HasColumnType("nvarchar(50)")
|
||||
.HasDefaultValue("Geplant");
|
||||
|
||||
b.Property<DateTime>("UpdatedAt")
|
||||
.ValueGeneratedOnAddOrUpdate()
|
||||
.HasColumnType("datetime2")
|
||||
.HasDefaultValueSql("SYSDATETIME()");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.ToTable("Projects", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("OnProfNext.Shared.Models.ProjectUser", b =>
|
||||
{
|
||||
b.Property<int>("ProjectId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("UserId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.HasKey("ProjectId", "UserId");
|
||||
|
||||
b.HasIndex("UserId");
|
||||
|
||||
b.ToTable("ProjectUsers", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("OnProfNext.Shared.Models.User", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int");
|
||||
|
||||
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<DateTime>("CreatedAt")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("datetime2")
|
||||
.HasDefaultValueSql("SYSDATETIME()");
|
||||
|
||||
b.Property<string>("Email")
|
||||
.IsRequired()
|
||||
.HasMaxLength(100)
|
||||
.HasColumnType("nvarchar(100)");
|
||||
|
||||
b.Property<string>("FirstName")
|
||||
.IsRequired()
|
||||
.HasMaxLength(100)
|
||||
.HasColumnType("nvarchar(100)");
|
||||
|
||||
b.Property<bool>("IsActive")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("bit")
|
||||
.HasDefaultValue(true);
|
||||
|
||||
b.Property<string>("LastName")
|
||||
.IsRequired()
|
||||
.HasMaxLength(100)
|
||||
.HasColumnType("nvarchar(100)");
|
||||
|
||||
b.Property<int>("MandantId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int")
|
||||
.HasDefaultValue(1);
|
||||
|
||||
b.Property<string>("PasswordHash")
|
||||
.IsRequired()
|
||||
.HasMaxLength(512)
|
||||
.HasColumnType("nvarchar(512)");
|
||||
|
||||
b.Property<DateTime>("UpdatedAt")
|
||||
.ValueGeneratedOnAddOrUpdate()
|
||||
.HasColumnType("datetime2")
|
||||
.HasDefaultValueSql("SYSDATETIME()");
|
||||
|
||||
b.Property<string>("Username")
|
||||
.IsRequired()
|
||||
.HasMaxLength(50)
|
||||
.HasColumnType("nvarchar(50)");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.ToTable("Users", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("OnProfNext.Shared.Models.Booking", b =>
|
||||
{
|
||||
b.HasOne("OnProfNext.Shared.Models.Order", "Order")
|
||||
.WithMany()
|
||||
.HasForeignKey("OrderId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("OnProfNext.Shared.Models.User", "User")
|
||||
.WithMany()
|
||||
.HasForeignKey("UserId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Order");
|
||||
|
||||
b.Navigation("User");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("OnProfNext.Shared.Models.Order", b =>
|
||||
{
|
||||
b.HasOne("OnProfNext.Shared.Models.Project", "Project")
|
||||
.WithMany("Orders")
|
||||
.HasForeignKey("ProjectId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Project");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("OnProfNext.Shared.Models.OrderUser", b =>
|
||||
{
|
||||
b.HasOne("OnProfNext.Shared.Models.Order", "Order")
|
||||
.WithMany("OrderUsers")
|
||||
.HasForeignKey("OrderId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("OnProfNext.Shared.Models.User", "User")
|
||||
.WithMany()
|
||||
.HasForeignKey("UserId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Order");
|
||||
|
||||
b.Navigation("User");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("OnProfNext.Shared.Models.ProjectUser", b =>
|
||||
{
|
||||
b.HasOne("OnProfNext.Shared.Models.Project", "Project")
|
||||
.WithMany("ProjectUsers")
|
||||
.HasForeignKey("ProjectId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("OnProfNext.Shared.Models.User", "User")
|
||||
.WithMany("ProjectUsers")
|
||||
.HasForeignKey("UserId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Project");
|
||||
|
||||
b.Navigation("User");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("OnProfNext.Shared.Models.Order", b =>
|
||||
{
|
||||
b.Navigation("OrderUsers");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("OnProfNext.Shared.Models.Project", b =>
|
||||
{
|
||||
b.Navigation("Orders");
|
||||
|
||||
b.Navigation("ProjectUsers");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("OnProfNext.Shared.Models.User", b =>
|
||||
{
|
||||
b.Navigation("ProjectUsers");
|
||||
});
|
||||
#pragma warning restore 612, 618
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,64 @@
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace OnProfNext.Server.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class AddBookingsConfiguration : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Bookings",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<int>(type: "int", nullable: false)
|
||||
.Annotation("SqlServer:Identity", "1, 1"),
|
||||
OrderId = table.Column<int>(type: "int", nullable: false),
|
||||
UserId = table.Column<int>(type: "int", nullable: false),
|
||||
Date = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||
Hours = table.Column<decimal>(type: "decimal(5,2)", nullable: false),
|
||||
Description = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: true),
|
||||
MandantId = table.Column<int>(type: "int", nullable: false),
|
||||
CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, defaultValueSql: "GETUTCDATE()"),
|
||||
UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, defaultValueSql: "GETUTCDATE()")
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_Bookings", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_Bookings_Orders_OrderId",
|
||||
column: x => x.OrderId,
|
||||
principalTable: "Orders",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
table.ForeignKey(
|
||||
name: "FK_Bookings_Users_UserId",
|
||||
column: x => x.UserId,
|
||||
principalTable: "Users",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Bookings_OrderId",
|
||||
table: "Bookings",
|
||||
column: "OrderId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Bookings_UserId",
|
||||
table: "Bookings",
|
||||
column: "UserId");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "Bookings");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -22,6 +22,52 @@ namespace OnProfNext.Server.Migrations
|
||||
|
||||
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
|
||||
|
||||
modelBuilder.Entity("OnProfNext.Shared.Models.Booking", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("int");
|
||||
|
||||
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<DateTime>("CreatedAt")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("datetime2")
|
||||
.HasDefaultValueSql("GETUTCDATE()");
|
||||
|
||||
b.Property<DateTime>("Date")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<string>("Description")
|
||||
.HasMaxLength(500)
|
||||
.HasColumnType("nvarchar(500)");
|
||||
|
||||
b.Property<decimal>("Hours")
|
||||
.HasColumnType("decimal(5,2)");
|
||||
|
||||
b.Property<int>("MandantId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("OrderId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<DateTime>("UpdatedAt")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("datetime2")
|
||||
.HasDefaultValueSql("GETUTCDATE()");
|
||||
|
||||
b.Property<int>("UserId")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("OrderId");
|
||||
|
||||
b.HasIndex("UserId");
|
||||
|
||||
b.ToTable("Bookings", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("OnProfNext.Shared.Models.Order", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
@ -229,6 +275,25 @@ namespace OnProfNext.Server.Migrations
|
||||
b.ToTable("Users", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("OnProfNext.Shared.Models.Booking", b =>
|
||||
{
|
||||
b.HasOne("OnProfNext.Shared.Models.Order", "Order")
|
||||
.WithMany()
|
||||
.HasForeignKey("OrderId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("OnProfNext.Shared.Models.User", "User")
|
||||
.WithMany()
|
||||
.HasForeignKey("UserId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Order");
|
||||
|
||||
b.Navigation("User");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("OnProfNext.Shared.Models.Order", b =>
|
||||
{
|
||||
b.HasOne("OnProfNext.Shared.Models.Project", "Project")
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -13,7 +13,7 @@ using System.Reflection;
|
||||
[assembly: System.Reflection.AssemblyCompanyAttribute("OnProfNext.Server")]
|
||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+910ed8b8f84357d5f19f7be7f67be8f98b22e9c9")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+de2c3693508bfb15c93127034ea928d860f4ac56")]
|
||||
[assembly: System.Reflection.AssemblyProductAttribute("OnProfNext.Server")]
|
||||
[assembly: System.Reflection.AssemblyTitleAttribute("OnProfNext.Server")]
|
||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||
|
||||
@ -1 +1 @@
|
||||
9c6fea68571aa14755a5757920f4a71a3ea78617a0cb2d16e4a85d871afee2d4
|
||||
6191c4c96e4f8f9f841e487d0768c67ec53b0fed8c42c63b4c486985ad7f5fd2
|
||||
|
||||
Binary file not shown.
@ -1 +1 @@
|
||||
8805535874ac805970a5fc9ba19ba7716e78a205f536b46f85b434f940fcc2fa
|
||||
067ac0315eda1d3c337d3bdde0526e8a65108b2be306c92658058c3200f07343
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1 +1 @@
|
||||
{"GlobalPropertiesHash":"FgKIeBZ9Ztoqric5Nb7d8Ix++iErS9q0YOlj6fkVIbM=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["PmzPzDLX5kem67gWwuODY2y/hyQd8nKfjwCe/ukzc7c=","LY\u002BzkbCH4BDCRNsN4e4hLpvYL/q343HA7aPqxLAnut4=","JcRKU2Zb4DUaR9Im1Nhj21bq9CS6zqrEyUlIptRQGPk=","oWGMgCB3vBEn8UDnk8gLGSmHUQp9nje0xZwa9jbcJds=","j4zvFombPCFDsE\u002BVLdnMhkrq8OLrHidrxFTLuLU5vMQ=","KJJmmS83E4AFqRDn5z9krFmkNtj5EIaWLgIS37POGr8=","xQg7Ozplq1cFDQPPrR5U6g5tfTz0Tx8zEGJriilBzbY=","xXIxgYvMtC9sEkafVNlrcH1Pv5l0FLdyBQPAp5BPAeY=","tf9mfbbiGyrn8DwXufw5UsDjSSX2bb4/v03tlENYAyQ=","HCEmdDnOaqxSVlCudFM7kXBMB\u002BTnSOIqCZaIDo2\u002BkmY=","OKkUjMjTxHumPV8kCwmKIe5EWTGXpicq5nPdBf1UjgU=","nGJ1y3WFrH56ZKC6r2VTpPKOcPajDLQnhXocDhcXmRg=","cGx77cv7nA0DdmaIS2X36NmMdiNb53a\u002BFYrSSYo5FuI=","FtlA9l0oAxySvxoKIT9fzLZajRC\u002Bb\u002B5TJipa9p57wiQ=","eFkUF78KbACBytwdzYneghMgzZWrsA02z0/ACTjf1LY=","YMmNzNRYlNUaY02cz66xLjTOWrv1loEdDwImShCe1jo=","PeS/S8mByULK0UONqH\u002ByZPgxm1uqX9tdeBSbGFZXR4s=","jKTJ7g0eCxEdDl05oVJEtlTpRXiB2qnvMi2PxRdZ9zc=","rzYf1UGwzK\u002Bt/dnYYqlMR7QuKGfkx/vU7t8YI/Qdey0=","Ww0AK17g0XIkjndgpYH6uveAS5QZvgE6TKFMPxHZgK8=","GA1u7GN8CpPjgtVF9p5meRcHD1sfLghHWP4j/Dqg1Lg=","SF9qmJCiNAHDHHnVc2cEt2z1mO82I0VggENUI8NSZqk=","qCDwNzaKuXnkV0G76t21N4pVOCPzJWmMDrEdjFbCXoc=","iMVw0eiXFIR8VogqY0SuhHCe3w\u002BRtCVecwImsxPMzTw=","HZFxsQaTWeyRUw50nxUt9gRfpEPRI3OFp6NOU5frds0=","2E2DXizaWyyz5hJGy5kQ608yc9QroQLLKm2qQtr4/kU=","GJfwFUk2fZZkZmk0TMk\u002BrB1iqzGaYrLg7MFHXI9oaQM=","XFwG7JLxXxSp7GJoSb8NffDaAy8YL0bpfxI4XZ0qH0s=","rpaQmELSXW5qZL9CsRJ8FOFKY1yeKUdSxG9xjxoX0is=","M\u002BbooiExb8jG2y5dZyG\u002BDf0sAUlX/4mYxMHP4XWh2d4="],"CachedAssets":{},"CachedCopyCandidates":{}}
|
||||
{"GlobalPropertiesHash":"FgKIeBZ9Ztoqric5Nb7d8Ix++iErS9q0YOlj6fkVIbM=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["PmzPzDLX5kem67gWwuODY2y/hyQd8nKfjwCe/ukzc7c=","LY\u002BzkbCH4BDCRNsN4e4hLpvYL/q343HA7aPqxLAnut4=","JcRKU2Zb4DUaR9Im1Nhj21bq9CS6zqrEyUlIptRQGPk=","oWGMgCB3vBEn8UDnk8gLGSmHUQp9nje0xZwa9jbcJds=","j4zvFombPCFDsE\u002BVLdnMhkrq8OLrHidrxFTLuLU5vMQ=","KJJmmS83E4AFqRDn5z9krFmkNtj5EIaWLgIS37POGr8=","xQg7Ozplq1cFDQPPrR5U6g5tfTz0Tx8zEGJriilBzbY=","xXIxgYvMtC9sEkafVNlrcH1Pv5l0FLdyBQPAp5BPAeY=","tf9mfbbiGyrn8DwXufw5UsDjSSX2bb4/v03tlENYAyQ=","HCEmdDnOaqxSVlCudFM7kXBMB\u002BTnSOIqCZaIDo2\u002BkmY=","OKkUjMjTxHumPV8kCwmKIe5EWTGXpicq5nPdBf1UjgU=","nGJ1y3WFrH56ZKC6r2VTpPKOcPajDLQnhXocDhcXmRg=","cGx77cv7nA0DdmaIS2X36NmMdiNb53a\u002BFYrSSYo5FuI=","FtlA9l0oAxySvxoKIT9fzLZajRC\u002Bb\u002B5TJipa9p57wiQ=","eFkUF78KbACBytwdzYneghMgzZWrsA02z0/ACTjf1LY=","YMmNzNRYlNUaY02cz66xLjTOWrv1loEdDwImShCe1jo=","PeS/S8mByULK0UONqH\u002ByZPgxm1uqX9tdeBSbGFZXR4s=","jKTJ7g0eCxEdDl05oVJEtlTpRXiB2qnvMi2PxRdZ9zc=","rzYf1UGwzK\u002Bt/dnYYqlMR7QuKGfkx/vU7t8YI/Qdey0=","Ww0AK17g0XIkjndgpYH6uveAS5QZvgE6TKFMPxHZgK8=","GA1u7GN8CpPjgtVF9p5meRcHD1sfLghHWP4j/Dqg1Lg=","SF9qmJCiNAHDHHnVc2cEt2z1mO82I0VggENUI8NSZqk=","qCDwNzaKuXnkV0G76t21N4pVOCPzJWmMDrEdjFbCXoc=","iMVw0eiXFIR8VogqY0SuhHCe3w\u002BRtCVecwImsxPMzTw=","HZFxsQaTWeyRUw50nxUt9gRfpEPRI3OFp6NOU5frds0=","2E2DXizaWyyz5hJGy5kQ608yc9QroQLLKm2qQtr4/kU=","GJfwFUk2fZZkZmk0TMk\u002BrB1iqzGaYrLg7MFHXI9oaQM=","XFwG7JLxXxSp7GJoSb8NffDaAy8YL0bpfxI4XZ0qH0s=","rpaQmELSXW5qZL9CsRJ8FOFKY1yeKUdSxG9xjxoX0is=","z9QzyKI\u002BWUa1kxi33RqVyzyLVbCve834yD/zpLFlt2Q="],"CachedAssets":{},"CachedCopyCandidates":{}}
|
||||
@ -1 +1 @@
|
||||
{"GlobalPropertiesHash":"TJ2LTRuPMY5dh+Ys0sp6meZCDAgoVVT755nQ9dkxJ+U=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["PmzPzDLX5kem67gWwuODY2y/hyQd8nKfjwCe/ukzc7c=","LY\u002BzkbCH4BDCRNsN4e4hLpvYL/q343HA7aPqxLAnut4=","JcRKU2Zb4DUaR9Im1Nhj21bq9CS6zqrEyUlIptRQGPk=","oWGMgCB3vBEn8UDnk8gLGSmHUQp9nje0xZwa9jbcJds=","j4zvFombPCFDsE\u002BVLdnMhkrq8OLrHidrxFTLuLU5vMQ=","KJJmmS83E4AFqRDn5z9krFmkNtj5EIaWLgIS37POGr8=","xQg7Ozplq1cFDQPPrR5U6g5tfTz0Tx8zEGJriilBzbY=","xXIxgYvMtC9sEkafVNlrcH1Pv5l0FLdyBQPAp5BPAeY=","tf9mfbbiGyrn8DwXufw5UsDjSSX2bb4/v03tlENYAyQ=","HCEmdDnOaqxSVlCudFM7kXBMB\u002BTnSOIqCZaIDo2\u002BkmY=","OKkUjMjTxHumPV8kCwmKIe5EWTGXpicq5nPdBf1UjgU=","nGJ1y3WFrH56ZKC6r2VTpPKOcPajDLQnhXocDhcXmRg=","cGx77cv7nA0DdmaIS2X36NmMdiNb53a\u002BFYrSSYo5FuI=","FtlA9l0oAxySvxoKIT9fzLZajRC\u002Bb\u002B5TJipa9p57wiQ=","eFkUF78KbACBytwdzYneghMgzZWrsA02z0/ACTjf1LY=","YMmNzNRYlNUaY02cz66xLjTOWrv1loEdDwImShCe1jo=","PeS/S8mByULK0UONqH\u002ByZPgxm1uqX9tdeBSbGFZXR4s=","jKTJ7g0eCxEdDl05oVJEtlTpRXiB2qnvMi2PxRdZ9zc=","rzYf1UGwzK\u002Bt/dnYYqlMR7QuKGfkx/vU7t8YI/Qdey0=","Ww0AK17g0XIkjndgpYH6uveAS5QZvgE6TKFMPxHZgK8=","GA1u7GN8CpPjgtVF9p5meRcHD1sfLghHWP4j/Dqg1Lg=","SF9qmJCiNAHDHHnVc2cEt2z1mO82I0VggENUI8NSZqk=","qCDwNzaKuXnkV0G76t21N4pVOCPzJWmMDrEdjFbCXoc=","iMVw0eiXFIR8VogqY0SuhHCe3w\u002BRtCVecwImsxPMzTw=","HZFxsQaTWeyRUw50nxUt9gRfpEPRI3OFp6NOU5frds0=","2E2DXizaWyyz5hJGy5kQ608yc9QroQLLKm2qQtr4/kU=","GJfwFUk2fZZkZmk0TMk\u002BrB1iqzGaYrLg7MFHXI9oaQM=","XFwG7JLxXxSp7GJoSb8NffDaAy8YL0bpfxI4XZ0qH0s=","rpaQmELSXW5qZL9CsRJ8FOFKY1yeKUdSxG9xjxoX0is=","M\u002BbooiExb8jG2y5dZyG\u002BDf0sAUlX/4mYxMHP4XWh2d4="],"CachedAssets":{},"CachedCopyCandidates":{}}
|
||||
{"GlobalPropertiesHash":"TJ2LTRuPMY5dh+Ys0sp6meZCDAgoVVT755nQ9dkxJ+U=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["PmzPzDLX5kem67gWwuODY2y/hyQd8nKfjwCe/ukzc7c=","LY\u002BzkbCH4BDCRNsN4e4hLpvYL/q343HA7aPqxLAnut4=","JcRKU2Zb4DUaR9Im1Nhj21bq9CS6zqrEyUlIptRQGPk=","oWGMgCB3vBEn8UDnk8gLGSmHUQp9nje0xZwa9jbcJds=","j4zvFombPCFDsE\u002BVLdnMhkrq8OLrHidrxFTLuLU5vMQ=","KJJmmS83E4AFqRDn5z9krFmkNtj5EIaWLgIS37POGr8=","xQg7Ozplq1cFDQPPrR5U6g5tfTz0Tx8zEGJriilBzbY=","xXIxgYvMtC9sEkafVNlrcH1Pv5l0FLdyBQPAp5BPAeY=","tf9mfbbiGyrn8DwXufw5UsDjSSX2bb4/v03tlENYAyQ=","HCEmdDnOaqxSVlCudFM7kXBMB\u002BTnSOIqCZaIDo2\u002BkmY=","OKkUjMjTxHumPV8kCwmKIe5EWTGXpicq5nPdBf1UjgU=","nGJ1y3WFrH56ZKC6r2VTpPKOcPajDLQnhXocDhcXmRg=","cGx77cv7nA0DdmaIS2X36NmMdiNb53a\u002BFYrSSYo5FuI=","FtlA9l0oAxySvxoKIT9fzLZajRC\u002Bb\u002B5TJipa9p57wiQ=","eFkUF78KbACBytwdzYneghMgzZWrsA02z0/ACTjf1LY=","YMmNzNRYlNUaY02cz66xLjTOWrv1loEdDwImShCe1jo=","PeS/S8mByULK0UONqH\u002ByZPgxm1uqX9tdeBSbGFZXR4s=","jKTJ7g0eCxEdDl05oVJEtlTpRXiB2qnvMi2PxRdZ9zc=","rzYf1UGwzK\u002Bt/dnYYqlMR7QuKGfkx/vU7t8YI/Qdey0=","Ww0AK17g0XIkjndgpYH6uveAS5QZvgE6TKFMPxHZgK8=","GA1u7GN8CpPjgtVF9p5meRcHD1sfLghHWP4j/Dqg1Lg=","SF9qmJCiNAHDHHnVc2cEt2z1mO82I0VggENUI8NSZqk=","qCDwNzaKuXnkV0G76t21N4pVOCPzJWmMDrEdjFbCXoc=","iMVw0eiXFIR8VogqY0SuhHCe3w\u002BRtCVecwImsxPMzTw=","HZFxsQaTWeyRUw50nxUt9gRfpEPRI3OFp6NOU5frds0=","2E2DXizaWyyz5hJGy5kQ608yc9QroQLLKm2qQtr4/kU=","GJfwFUk2fZZkZmk0TMk\u002BrB1iqzGaYrLg7MFHXI9oaQM=","XFwG7JLxXxSp7GJoSb8NffDaAy8YL0bpfxI4XZ0qH0s=","rpaQmELSXW5qZL9CsRJ8FOFKY1yeKUdSxG9xjxoX0is=","z9QzyKI\u002BWUa1kxi33RqVyzyLVbCve834yD/zpLFlt2Q="],"CachedAssets":{},"CachedCopyCandidates":{}}
|
||||
41
OnProfNext.Shared/Models/Booking.cs
Normal file
41
OnProfNext.Shared/Models/Booking.cs
Normal file
@ -0,0 +1,41 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace OnProfNext.Shared.Models
|
||||
{
|
||||
public class Booking
|
||||
{
|
||||
[Key]
|
||||
public int Id { get; set; }
|
||||
|
||||
[Required]
|
||||
public int OrderId { get; set; }
|
||||
|
||||
[Required]
|
||||
public int UserId { get; set; }
|
||||
|
||||
[Required]
|
||||
public DateTime Date { get; set; }
|
||||
|
||||
[Required]
|
||||
[Column(TypeName = "decimal(5,2)")]
|
||||
public decimal Hours { get; set; }
|
||||
|
||||
[MaxLength(500)]
|
||||
public string? Description { get; set; }
|
||||
|
||||
public int MandantId { get; set; } = 1;
|
||||
|
||||
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
|
||||
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
|
||||
|
||||
//Nav Properties
|
||||
public virtual Order? Order { get; set; }
|
||||
public virtual User? User { get; set; }
|
||||
}
|
||||
}
|
||||
27
OnProfNext.Shared/Models/DTOs/BookingCreateDto.cs
Normal file
27
OnProfNext.Shared/Models/DTOs/BookingCreateDto.cs
Normal file
@ -0,0 +1,27 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.Json.Serialization;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace OnProfNext.Shared.Models.DTOs
|
||||
{
|
||||
public class BookingCreateDto
|
||||
{
|
||||
public int OrderId { get; set; }
|
||||
[JsonIgnore]
|
||||
public DateTime Date { get; set; }
|
||||
|
||||
[JsonPropertyName("date")]
|
||||
public string DateAsString
|
||||
{
|
||||
get => Date.ToString("yyyy-MM-ddTHH:mm:ss");
|
||||
set => Date = DateTime.Parse(value, null, System.Globalization.DateTimeStyles.AssumeLocal);
|
||||
}
|
||||
|
||||
public decimal Hours { get; set; }
|
||||
public string? Description { get; set; }
|
||||
public int MandantId { get; set; } = 1;
|
||||
}
|
||||
}
|
||||
22
OnProfNext.Shared/Models/DTOs/BookingDto.cs
Normal file
22
OnProfNext.Shared/Models/DTOs/BookingDto.cs
Normal file
@ -0,0 +1,22 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace OnProfNext.Shared.Models.DTOs
|
||||
{
|
||||
public class BookingDto
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public int OrderId { get; set; }
|
||||
public string? OrderTitle { get; set; }
|
||||
public int UserId { get; set; }
|
||||
public string? Username { get; set; }
|
||||
public DateTime Date { get; set; } = DateTime.UtcNow;
|
||||
public decimal Hours { get; set; }
|
||||
public string? Description { get; set; }
|
||||
public int MandantId { get; set; }
|
||||
public bool IsPending { get; set; }
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
@ -1,6 +1,7 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
@ -13,7 +14,7 @@ using System.Reflection;
|
||||
[assembly: System.Reflection.AssemblyCompanyAttribute("OnProfNext.Shared")]
|
||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+910ed8b8f84357d5f19f7be7f67be8f98b22e9c9")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+de2c3693508bfb15c93127034ea928d860f4ac56")]
|
||||
[assembly: System.Reflection.AssemblyProductAttribute("OnProfNext.Shared")]
|
||||
[assembly: System.Reflection.AssemblyTitleAttribute("OnProfNext.Shared")]
|
||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||
|
||||
@ -1 +1 @@
|
||||
57cdff878469b70b9b012776a3c6832ee54e415f6e69489a92366cc8882adf20
|
||||
9968ae41b8342606115e05ef64f540975f553877571d12df6c981aad7138922c
|
||||
|
||||
@ -1 +1 @@
|
||||
fa8e53161e67297b52957cf0faf7326687b0354015518dfaa162c27176b15dc3
|
||||
6327964d4d933dfc1cc0dac3925a1a78b9c313c4d98dae3b1838f8af318b5a96
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user