From 4cfb422ad4bf8e2d2a562a3ec7220450140ea218 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Thu, 3 Jul 2025 07:21:26 +0200 Subject: [PATCH] * Fixed Focus issues in Grid --- .../Components/Layout/MainLayout.razor.css | 9 + .../Components/Pages/WarehousePackList.razor | 186 ++++++++++++------ 2 files changed, 140 insertions(+), 55 deletions(-) diff --git a/OrdersManagement/Components/Layout/MainLayout.razor.css b/OrdersManagement/Components/Layout/MainLayout.razor.css index 038baf1..a72fb73 100644 --- a/OrdersManagement/Components/Layout/MainLayout.razor.css +++ b/OrdersManagement/Components/Layout/MainLayout.razor.css @@ -94,3 +94,12 @@ main { right: 0.75rem; top: 0.5rem; } + +.e-grid .e-row.e-selection { + background-color: #D3D3D3 !important; /* Jasny szary */ +} + +/* Domyślny styl dla wierszy (na wszelki wypadek) */ +.e-grid .e-row { + background-color: #FFFFFF; /* Biały, domyślny kolor */ +} diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor index 52ed7d8..f23dcfb 100644 --- a/OrdersManagement/Components/Pages/WarehousePackList.razor +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -37,7 +37,7 @@ CssClass="e-outline"/> + CssClass="e-outline" @ref="_scanner"/> + PrefixIcon="e-icons e-split-horizontal" OnClick="ShowSplitDialog" + Disabled="IsDisabled"/> @@ -72,7 +73,8 @@ HeaderText="Ilość w Dostawie" Width="80"> - @@ -114,15 +116,17 @@ - +

Błąd skanowania! Wystąpił jeden z wyjątków (Zeskanowana wartość '@ScannedValue'):

  • Zeskanowano niepoprawny Numer Partii SL (nieistniejący w tabeli)

  • -
  • Zeskanowano niepoprawny numer Partii Meyle (niezaczynający się od @($"{DateTime.Now.Year - 2000}X"))

  • -
  • Numer Palety nie jest większy niż 0 (aktualnie wybrany numer palety: '@PalletNumber')

  • +
  • Zeskanowano niepoprawny numer Partii Meyle (niezaczynający się od + @($"{DateTime.Now.Year - 2000}X"))

  • +
  • Numer Palety nie jest większy niż 0 (aktualnie wybrany numer palety: + '@PalletNumber')

@@ -131,10 +135,24 @@
- + - +

Błąd skanowania! Wybierz NUMER PALETY większy niż 0 (Aktualnie '@PalletNumber'):

+
+
+ + + +
+ + + + + @@ -165,13 +183,14 @@ private List SelectedRows { get; set; } = new(); private string WzNumber { get; set; } = string.Empty; - + private bool _isValid; private bool Visibility { get; set; } private bool VisibilityValidation { get; set; } private bool VisibilityLineSplitter { get; set; } - + public bool VisibilityPalletNumber { get; set; } + private string? EmailAddresses { get; set; } = string.Empty; private string PalletNumber { get; set; } = "0"; @@ -187,6 +206,7 @@ Visibility = false; VisibilityValidation = false; VisibilityLineSplitter = false; + VisibilityPalletNumber = false; LastScannedValue = ScannedValue; ScannedValue = string.Empty; @@ -200,9 +220,9 @@ { _wzHeader = await WarehouseService.GetWzHeaderByIdAsync(WzHeader); WzRowsMeyle = (await WarehouseService.GetWzRowsByWzHeaderId(WzHeader)).ToList(); - + TransactionModelsByPartNumber = await GetTransactionModels(); - + EmailAddresses = _wzHeader.EmailAddresses; WzNumber = _wzHeader.WzNumbers ?? string.Empty; @@ -213,7 +233,7 @@ } private async Task SaveChanges() - { + { if (!string.IsNullOrWhiteSpace(EmailAddresses)) { await WarehouseService.AddEmailsToWzHeaderAsync(WzHeader, EmailAddresses); @@ -258,21 +278,21 @@ if (string.IsNullOrWhiteSpace(obj.Value)) return; if (int.Parse(PalletNumber) <= 0) { - ShowValidationMessage(); + VisibilityPalletNumber = true; return; } ScannedValue = obj.Value.Trim(); - + StateHasChanged(); - + TransactionModelsByPartNumber.TryGetValue(obj.Value.Trim(), out List? materialTransactionsByPartNumber); TransactionModel? materialTransactionByPartNumber = materialTransactionsByPartNumber?.FirstOrDefault(); if (materialTransactionByPartNumber == null && IsValidScannedValue(obj.Value)) { FillMeylePartNumber(ScannedValue); - + LastScannedValue = ScannedValue; ScannedValue = string.Empty; @@ -290,7 +310,7 @@ ShowValidationMessage(); return; } - + LastScannedValue = ScannedValue; ScannedValue = string.Empty; @@ -306,13 +326,12 @@ return scannedValue.StartsWith(format); } - private void FillMeylePartNumber(string scannedValue) - { - if (SelectedRow != null) + private async Task FillMeylePartNumber(string scannedValue) + { + var rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == SelectedRow?.FaIndex && x.Quantity == SelectedRow?.Quantity); + + if (SelectedRow != null && !SelectedRows.Any()) { - var rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == SelectedRow?.ItemNumber && x.Quantity == SelectedRow?.Quantity); - FocusGridRow(rowIndex); - SelectedRow.PartNumber = scannedValue; ChangedRecords.Add(SelectedRow); } @@ -323,65 +342,92 @@ ChangedRecords.Add(wzRowMeyleDto); } - SaveChanges(); - InvokeAsync(StateHasChanged); - _grid.Refresh(); - _scanner.FocusAsync(); + await SaveChanges(); + ChangedRecords.Clear(); + SelectedRows.Clear(); + + FocusGridRow(rowIndex); + await _scanner.FocusAsync(); } - private void FillFaPartNumberAndPalletNumber(TransactionModel materialTransactionByPartNumber, string scannedValue) + private async Task FillFaPartNumberAndPalletNumber(TransactionModel materialTransactionByPartNumber, string scannedValue) { - var rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber && x.Quantity == materialTransactionByPartNumber.Quantity); + await _grid.ClearSelectionAsync(); + await _grid.Refresh(); + await InvokeAsync(StateHasChanged); + + List selectedIndices = new List(); + int palletNumber = int.Parse(PalletNumber); + int rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber && x.Quantity == materialTransactionByPartNumber.Quantity); switch (rowIndex) { - case -1 when int.Parse(PalletNumber) <= 0: - ShowValidationMessage(); - LastScannedValue = ScannedValue; - ScannedValue = string.Empty; - return; case -1: { SelectedRows = WzRowsMeyle.Where(x => x.FaIndex == materialTransactionByPartNumber.ItemNumber).ToList(); - + if (SelectedRows.Count == 0) { ShowValidationMessage(); return; } - foreach (WzRowMeyleDto wzRowMeyleDto in SelectedRows) + rowIndex = WzRowsMeyle.FindIndex(x => x.FaIndex == SelectedRows.First().FaIndex && x.Quantity == SelectedRows.First().Quantity); + + var validCombinations = FindCombinations(SelectedRows, (int?)materialTransactionByPartNumber.Quantity ?? 0); + + foreach (var combination in validCombinations) { - wzRowMeyleDto.PartNumberSl = scannedValue; - ChangedRecords.Add(wzRowMeyleDto); + foreach (var record in combination) + { + record.PartNumberSl = scannedValue; + ChangedRecords.Add(record); + + int index = WzRowsMeyle.IndexOf(record); + if (index >= 0) + { + selectedIndices.Add(index); + Console.WriteLine($"Dodano indeks: {index}"); // Debugowanie + } + } } + SelectedRows.Clear(); + SelectedRows.AddRange(ChangedRecords); + break; } default: { - FocusGridRow(rowIndex); - SelectedRow = WzRowsMeyle[rowIndex]; + selectedIndices.Add(rowIndex); - SelectedRow.PartNumberSl = ScannedValue; - SelectedRow.PalletNumber = int.Parse(PalletNumber); + SelectedRow.PartNumberSl = scannedValue; + SelectedRow.PalletNumber = palletNumber; if (ChangedRecords.All(x => x.TransactionNumber != SelectedRow.TransactionNumber)) { ChangedRecords.Add(SelectedRow); } - + break; } } - SaveChanges(); - InvokeAsync(StateHasChanged); - _grid.Refresh(); - _scanner.FocusAsync(); + await SaveChanges(); ChangedRecords.Clear(); + + if (selectedIndices.Any()) + { + await _grid.SelectRowsAsync(selectedIndices.ToArray()); + } + + await _grid.Refresh(); + await InvokeAsync(StateHasChanged); + + FocusGridRow(rowIndex); + await _scanner.FocusAsync(); } private void FocusGridRow(int rowIndex) @@ -391,10 +437,10 @@ int pageSize = _grid.PageSettings.PageSize; int targetPage = (rowIndex / pageSize) + 1; _grid.GoToPageAsync(targetPage); - + rowIndex %= pageSize; } - + _grid.SelectRowAsync(rowIndex); _grid.ScrollIntoViewAsync(rowIndex: rowIndex); _grid.FocusAsync(); @@ -438,18 +484,20 @@ OrderNumber = SelectedRow.OrderNumber, PalletNumber = SelectedRow.PalletNumber, WzNumber = SelectedRow.WzNumber, - TransactionNumber = SelectedRow.TransactionNumber += 10000 + TransactionNumber = SelectedRow.TransactionNumber += 10000, + PartNumberSl = SelectedRow.PartNumberSl, + PartNumber = SelectedRow.PartNumber }; - + WzRowsMeyle.Add(splitRow); SelectedRow.Quantity -= newQuantity; - + ChangedRecords.Add(SelectedRow); await WarehouseService.CreateWzRowsMeyleAsync(new List { splitRow }); await UpdateRows(ChangedRecords); - } - + } + VisibilityLineSplitter = false; } @@ -464,4 +512,32 @@ SelectedRow = obj.Data; } + private List> FindCombinations(List records, int targetSum) + { + var result = new List>(); + var currentCombination = new List(); + + void Backtrack(int start, int currentSum) + { + if (currentSum == targetSum) + { + result.Add(new List(currentCombination)); + return; + } + + for (int i = start; i < records.Count; i++) + { + if (currentSum + records[i].Quantity <= targetSum) + { + currentCombination.Add(records[i]); + Backtrack(i + 1, currentSum + records[i].Quantity ?? 0); + currentCombination.RemoveAt(currentCombination.Count - 1); + } + } + } + + Backtrack(0, 0); + return result; + } + } \ No newline at end of file