feat(ui): close the last gaps against the audit design (31/31)

check_design_parity.py reads its checklist from the audit page's own
proposals; it now reports every one of the 31 as implemented, with no
deliberate divergences left.

  * Schedule: the Kanban/Calendar drop-list became a pair of tabs, and the
    Running lane is outlined while it holds anything — dropping a card there
    starts the task for real, so it should not look like the other six.
  * Cowork: agent / routing / usage / folder moved out of the typing box into
    their own status strip beneath it, styled as status rather than a second
    toolbar. All of them stay interactive; the design's read-only strip would
    have cost features.
  * Folder: the path is written as the screen's title instead of sitting in a
    read-only text box that looked editable and cost a row.
  * GraphRAG: the second toolbar row is gone (Export joined the first), and
    the one button that relabelled itself became Đồ thị | Tin nhắn tabs, so
    the view you are NOT in is named too.
  * Settings gained the theme picker, so language / provider / theme are all
    reachable there as well as on the rail's account row.
  * Task editor: the five group boxes are grouped into three step tabs
    (Nội dung → Lịch chạy → Liên kết). All 22 fields verified present after
    the move; only the old section index is gone, replaced by the tabs.
  * The assistant dot now clears a screen's own bottom bar (Cowork's
    composer), measured from the composer's top edge in window coordinates.

Also adds .gitattributes: without it a Windows checkout records CRLF and
every file reads as fully rewritten to a Linux CI runner.

Verification: 7 check_*.py suites green, no screen clipped at 1920/1366/1280,
and no dialog scrolls sideways at 9/11/14pt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
NamPDT
2026-08-17 12:25:25 +09:00
co-authored by Claude Opus 5
parent 0fa61b6a95
commit cb68f87b35
15 changed files with 454 additions and 93 deletions
+26 -1
View File
@@ -30,6 +30,31 @@ def controls(dlg):
return n
def check_tabs(name, dlg, app, expect):
"""The Task editor uses step TABS, not an index — same goal, different
control, so it gets its own check."""
fails = []
print(f"--- {name} ---")
n_ctl = controls(dlg)
tabs = dlg.step_tabs
names = [tabs.tabText(i) for i in range(tabs.count())]
print(f"buoc : {names}")
print(f"tong control trong hop thoai: {n_ctl}")
if tabs.count() != expect:
fails.append(f"{name}: cho {expect} buoc, thay {tabs.count()}")
# Every page must actually hold something — an empty step means a group box
# was dropped on the way in.
for i in range(tabs.count()):
page = tabs.widget(i).widget()
kids = [w for w in page.findChildren(type(dlg)) ] or page.children()
n = len([c for c in page.findChildren(__import__(
"PySide6.QtWidgets", fromlist=["QWidget"]).QWidget) if c.parent() is page])
print(f" buoc {i + 1} co {n} khoi")
if n == 0:
fails.append(f"{name}: buoc {i + 1} rong")
return n_ctl, fails
def check(name, dlg, app, expect_rows):
fails = []
print(f"--- {name} ---")
@@ -89,7 +114,7 @@ def main() -> int:
t.resize(900, 600)
t.show()
app.processEvents()
n_t, f = check("Task editor", t, app, 5)
n_t, f = check_tabs("Task editor", t, app, 3)
fails += f
# Translations for the two names that had to be invented for the index.