From 9f0d4f37cea5a92e2b8ebac65b5d647359934b12 Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Fri, 16 Oct 2026 00:03:32 -0400 Subject: [PATCH 1/3] feat(browser): edit nest information without opening the nest --- .../Forms/SavedNestsFormTests.cs | 107 +++++++++++++++++- OpenNest/Forms/SavedNestsForm.cs | 99 +++++++++++++++- docs/nest-storage.md | 11 ++ 3 files changed, 210 insertions(+), 7 deletions(-) diff --git a/OpenNest.WinForms.Tests/Forms/SavedNestsFormTests.cs b/OpenNest.WinForms.Tests/Forms/SavedNestsFormTests.cs index bacc76d8..92994681 100644 --- a/OpenNest.WinForms.Tests/Forms/SavedNestsFormTests.cs +++ b/OpenNest.WinForms.Tests/Forms/SavedNestsFormTests.cs @@ -145,6 +145,80 @@ public class SavedNestsFormTests "The saved-nest dialog test did not complete."); } + [Theory] + [InlineData(true, false)] + [InlineData(false, false)] + [InlineData(true, true)] + public void NestInformation_SavesOnlyOnAccept_AndRefusesStaleWrites(bool accept, bool conflict) + { + StaTestThread.Run(() => + { + var record = Record("Current name"); + record.Revision = 3; + record.Comments = "Current metadata notes"; + record.Status = NestStatus.ToBeCut; + var repository = new FakeRepository(record) { Conflict = conflict }; + repository.Files[record.Id] = NestFile((Quantity: 2, Parts: 3)); + record.FileSize = repository.Files[record.Id].Length; + var original = repository.Files[record.Id].ToArray(); + using var form = new SavedNestsForm(repository, "http://nest-server:5000"); + form.Show(); + PumpUntil(() => Field(form, "nestGrid").Rows.Count == 1, "the nest page"); + var shown = false; + form.ShowNestInfoDialog = dialog => + { + shown = true; + Assert.Equal(record.Name, dialog.NestName); + Assert.Equal(record.Comments, dialog.Notes); + Assert.Equal(NestStatus.ToBeCut, dialog.Status); + dialog.Customer = "Updated customer"; + dialog.Notes = "Updated notes"; + dialog.Status = NestStatus.HasBeenCut; + dialog.MadeBy = "Operator"; + dialog.MaterialName = "Steel"; + dialog.Thickness = 0.25; + return accept ? DialogResult.OK : DialogResult.Cancel; + }; + var button = Field