diff --git a/CutList.Web/Components/Pages/Jobs/Edit.razor b/CutList.Web/Components/Pages/Jobs/Edit.razor index 7daaca6..15a2232 100644 --- a/CutList.Web/Components/Pages/Jobs/Edit.razor +++ b/CutList.Web/Components/Pages/Jobs/Edit.razor @@ -1162,8 +1162,12 @@ else @foreach (var item in entry.Bin.Items) { - - @(string.IsNullOrWhiteSpace(item.Name) ? ArchUnits.FormatFromInches(item.Length) : $"{item.Name} ({ArchUnits.FormatFromInches(item.Length)})") + + @if (!string.IsNullOrWhiteSpace(item.Name)) + { + @item.Name + } + @ArchUnits.FormatFromInches(item.Length) } diff --git a/CutList.Web/wwwroot/css/app.css b/CutList.Web/wwwroot/css/app.css index f853fec..a0c6883 100644 --- a/CutList.Web/wwwroot/css/app.css +++ b/CutList.Web/wwwroot/css/app.css @@ -272,6 +272,11 @@ a, .btn-link { color: var(--accent-dark); } .table-actions .btn { align-items: center; display: inline-flex; justify-content: center; min-height: 2rem; min-width: 2rem; padding: .35rem .45rem; } .alert { border-radius: .4rem; border-width: 1px; } +/* Results cut badges keep the part number and its length visually distinct. */ +.cut-part-badge { background-color: #6c8ebf; display: inline-flex; font-weight: 500; overflow: hidden; padding: 0; } +.cut-part-badge-name { padding: .35em .55em; } +.cut-part-badge-length { background-color: #4c6680; padding: .35em .55em; } + /* Overview */ .overview-header { align-items: end; border-bottom: 1px solid var(--line); display: flex; gap: 2rem; justify-content: space-between; padding-bottom: 2rem; } .overview-header h1 { margin: .4rem 0 .75rem; max-width: 14ch; } diff --git a/tests/test_cut_badge_format.py b/tests/test_cut_badge_format.py new file mode 100644 index 0000000..d422e46 --- /dev/null +++ b/tests/test_cut_badge_format.py @@ -0,0 +1,38 @@ +"""Focused regression checks for split part-number and length cut badges.""" + +from __future__ import annotations + +import unittest +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parents[1] +JOB_EDITOR = REPO_ROOT / "CutList.Web/Components/Pages/Jobs/Edit.razor" +APP_CSS = REPO_ROOT / "CutList.Web/wwwroot/css/app.css" + + +class CutBadgeFormatTests(unittest.TestCase): + def test_named_cut_badge_renders_part_number_and_length_in_separate_sections(self) -> None: + markup = JOB_EDITOR.read_text() + results_start = markup.index("private RenderFragment RenderResultsTab()") + cuts_cell_start = markup.index("@foreach (var item in entry.Bin.Items)", results_start) + cut_rows_start = markup.rfind("", results_start, cuts_cell_start) + cut_rows = markup[cut_rows_start:markup.index("", cuts_cell_start)] + + self.assertIn('class="badge me-1 mb-1 fs-6 cut-part-badge"', cut_rows) + self.assertIn('class="cut-part-badge-name"', cut_rows) + self.assertIn('class="cut-part-badge-length"', cut_rows) + self.assertIn('@item.Name', cut_rows) + self.assertIn('@ArchUnits.FormatFromInches(item.Length)', cut_rows) + self.assertNotIn('$"{item.Name} (', cut_rows) + + def test_length_section_has_a_darker_background_than_the_part_number_section(self) -> None: + css = APP_CSS.read_text() + + self.assertIn('.cut-part-badge {', css) + self.assertIn('.cut-part-badge-name {', css) + self.assertIn('.cut-part-badge-length {', css) + self.assertIn('background-color: #4c6680;', css) + + +if __name__ == "__main__": + unittest.main()