diff --git a/forgetest/forgetest/page.py b/forgetest/forgetest/page.py index af860d8..a430d91 100644 --- a/forgetest/forgetest/page.py +++ b/forgetest/forgetest/page.py @@ -43,6 +43,28 @@ table{width:100%;border-collapse:collapse} th{font-size:11.5px;color:var(--dim);text-align:left;font-weight:600;padding:6px 8px;border-bottom:1px solid var(--line)} td{padding:7px 8px;border-bottom:1px solid var(--line);vertical-align:top} tr:last-child td{border-bottom:0} +/* One grid for every subsystem. The groups are separate tables, so + left to themselves each sizes its own columns from its own content + and no two line up. Fixed widths put them all on the same rails. */ +#groups .grp{overflow-x:auto} +#groups table{table-layout:fixed;min-width:700px} +#groups col.k{width:132px} +#groups col.s{width:250px} +#groups col.l{width:210px} +#groups col.a{width:96px} +/* Why a test stands where it does reads as one block under Status. It + used to sit under the Start button, where a requires list of three + test ids wrapped into a ragged stack and dragged that group's columns + out of line with every other group's. */ +#groups .req{overflow-wrap:break-word} +/* The details sit in a full-width row of their own: inside the Test + cell they would have to be read through a column, and opening one + would push that group's grid out of step with the rest. */ +#groups td{border-bottom:0} +#groups tr.detrow td{padding:0 8px;border-bottom:1px solid var(--line)} +#groups tr.detrow:last-child td{border-bottom:0} +#groups .details{margin:2px 0 8px} +#groups .details .dsc{margin-bottom:6px} .tid{color:var(--dim);font-size:11.5px;font-family:ui-monospace,Consolas,monospace} .badge{display:inline-block;font-size:10.5px;padding:2px 6px;border-radius:9px;margin-right:4px;background:#e8e9ec;color:#444;font-weight:600;letter-spacing:.2px;text-transform:uppercase} .badge.live{background:#fbe1e1;color:#a11} @@ -257,21 +279,25 @@ function renderGroups(){var ids=[];catalog.forEach(function(t){ids.push(t.id)}); var sig=catalogHash+'|'+ids.join(','); if(sig!==groupsKey){groupsKey=sig;buildGroups()} updateGroups()} +var COLS="
| Test | Kind | Status | Last result | |
|---|---|---|---|---|
| Test | Kind | Status | Last result | |
|---|---|---|---|---|
"+esc(t.title)+" "+d+" details "+det+
- " | "+badges+" | "+ - " | "+ - " | |
"+esc(t.title)+" "+d+" details "+
+ " | "+badges+" | "+ + ""+ + " | "+ + " | |
| "+det+" | ||||
| %s | " % h, html) + self.assertEqual(len(re.findall(r"", html) + # the status cell carries the status, the unmet note and the row + # message; the action cell carries the button and nothing else + self.assertIn(" | ", html) + self.assertIn(" | ", html) + def test_page_is_self_contained_ascii(self): html = page.render("0" * 32) self.assertNotIn("__TOKEN__", html) |
|---|