@using Lagerbestand.Models @using Lagerbestand.Services @inject IStorageLocationService StorageLocationService @if (IsOpen) {
} @code { [Parameter] public bool IsOpen { get; set; } [Parameter] public EventCallback IsOpenChanged { get; set; } /// Currently selected location (pre-selected when opening). [Parameter] public Guid? SelectedLocationId { get; set; } /// Location that is about to be freed (e.g. during a swap) – shown as selectable. [Parameter] public Guid? HighlightLocationId { get; set; } [Parameter] public string? Subtitle { get; set; } [Parameter] public EventCallback OnSelected { get; set; } private bool isLoading; private bool wasOpen; private List allLocations = new(); private Dictionary<(AreaType, int, ShelfPosition, int), StorageLocation> lookup = new(); private StorageLocation? pendingLocation; protected override async Task OnParametersSetAsync() { if (IsOpen && !wasOpen) { wasOpen = true; await LoadAsync(); } else if (!IsOpen) { wasOpen = false; } } private async Task LoadAsync() { isLoading = true; try { allLocations = await StorageLocationService.GetAllAsync(); lookup = allLocations.ToDictionary(l => (l.Area, l.Row, l.Position, l.SlotNumber)); pendingLocation = SelectedLocationId.HasValue ? allLocations.FirstOrDefault(l => l.Id == SelectedLocationId.Value) : null; } finally { isLoading = false; } } private StorageLocation? GetLocation(AreaType area, int row, ShelfPosition pos, int slot) => lookup.TryGetValue((area, row, pos, slot), out var loc) ? loc : null; private void Select(StorageLocation? loc) { if (loc == null) return; pendingLocation = loc; } private async Task Confirm() { if (pendingLocation == null) return; await OnSelected.InvokeAsync(pendingLocation); await Close(); } private Task Cancel() => Close(); private async Task Close() { IsOpen = false; await IsOpenChanged.InvokeAsync(false); } private string GetTooltip(StorageLocation? loc, AreaType area, int row, ShelfPosition pos, int slot, bool isHighlighted) { var baseText = $"{area.GetDisplayName()}, Reihe {row}, {pos.GetDisplayName()}, Platz {slot}"; if (loc == null) return $"{baseText} – nicht angelegt"; if (isHighlighted) return $"{baseText} – wird frei"; if (!loc.IsAvailable) return $"{baseText} – gesperrt"; if (loc.IsOccupied) return $"{baseText} – belegt"; return $"{baseText} – frei"; } }