ShiftScheduler/Client/Pages/Index.razor
Copilot 7f8b2c4b8c
Enhance shift handling: Move storage to file system and add month selection (#36)
* Initial plan

* Initial setup: Downgrade .NET version to 8.0 for compatibility

Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>

* Implement enhanced shift handling with file system storage and month selection

Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>

* Move component styles from global app.css to Index.razor.css for proper component isolation

Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>
2025-08-28 19:47:12 +02:00

97 lines
3.8 KiB
Text

@page "/"
@using ShiftScheduler.Client.Components
<div class="top-nav-buttons">
<div class="month-selection">
<button class="btn month-btn @(_isCurrentMonth ? "" : "selected")" @onclick="SelectNextMonth" disabled="@_isLoadingInitial">Next Month</button>
<button class="btn month-btn @(_isCurrentMonth ? "selected" : "")" @onclick="SelectCurrentMonth" disabled="@_isLoadingInitial">Current Month</button>
</div>
<div class="action-buttons">
<button class="reset-btn" @onclick="ResetSchedule" disabled="@_isLoadingInitial">Reset Schedule</button>
<button class="btn export-btn" @onclick="ExportToIcs" disabled="@_isLoadingInitial">Export to ICS</button>
<button class="btn export-btn" @onclick="ExportToPdf" disabled="@_isLoadingInitial">Export to PDF</button>
<button class="btn config-btn" @onclick="ShowConfiguration" disabled="@_isLoadingInitial">⚙️ Configuration</button>
</div>
</div>
<h3>Shift Scheduler - @CurrentMonthYear</h3>
@if (!string.IsNullOrEmpty(_errorMessage))
{
<div class="alert alert-danger" role="alert">
@_errorMessage
<button type="button" class="btn-close" @onclick="() => _errorMessage = string.Empty"></button>
</div>
}
@if (!string.IsNullOrEmpty(_successMessage))
{
<div class="alert alert-success" role="alert">
@_successMessage
<button type="button" class="btn-close" @onclick="() => _successMessage = string.Empty"></button>
</div>
}
@if (_isLoadingInitial)
{
<div class="loading-overlay">
<div class="loading-content">
<div class="loading-spinner">⏳</div>
<p>Loading shifts and transport data...</p>
</div>
</div>
}
else
{
<div class="calendar-grid">
@foreach (var day in DaysInMonth)
{
<div class="day-cell">
<div class="day-header">
@day.ToString("dd.MM.yyyy") (@day.ToString("dddd"))
</div>
<div class="shifts">
@foreach (var shift in Shifts)
{
<div class="tooltip-wrapper">
<button class="shift-button @(SelectedSchedule.ContainsKey(day) && SelectedSchedule[day] == shift.Name ? "selected" : "")"
@onclick="() => SelectShift(day, shift.Name)"
disabled="@_isLoadingTransport">
@if (_isLoadingTransport && SelectedSchedule.ContainsKey(day) && SelectedSchedule[day] == shift.Name)
{
<span class="loading-spinner">⏳</span>
}
else
{
@if (shift.IsPngIcon)
{
<img src="icons\@shift.Icon" alt="@shift.Name" style="width: 24px; height: 24px;" />
}
else
{
@shift.Icon
}
}
</button>
<span class="tooltip">@shift.Name</span>
</div>
}
</div>
@if (SelectedSchedule.ContainsKey(day))
{
<div class="shift-times">
<small>@GetShiftTimes(day)</small>
</div>
<div class="transport-info">
<small>@GetTransportSummary(day)</small>
</div>
}
</div>
}
</div>
}
<ConfigurationDialog IsVisible="_showConfigDialog"
OnClose="HideConfiguration"
OnConfigurationChanged="OnConfigurationChanged" />