# Company-channel card row and in-page generation confirmation ## Metadata - Date: 2026-07-31 - Scope: `arr_web/static/index.html`, `arr_web/static/styles.css`, `arr_web/static/app.js`, `tests/test_arr_web.py` - Change type: UI composition and interaction affordance only - Business-data mutation: none ## Behavior facts - The large `生成报表` surface now contains one desktop row ordered `上传 Excel 报表`, `第一期`, `第二期`, `第三期`. The layout falls back to two columns at the tablet breakpoint and one column on narrow mobile screens. - The `报表月份` input remains an accessible month control but its visible label is visually hidden. It sits in the setup header's upper-right corner, continues to drive C/O release/history filtering, and is still submitted as `report_month` after confirmation. - Period card CTAs now visibly read `生成`; the period range, C/O range and release state remain visible in each card. - Clicking a released period opens a styled in-page `` with the selected month and period. The dialog uses a restrained light card, backdrop blur, explicit `取消`/`确认生成` actions and focus on `取消` when opened. - Cancel, Escape and backdrop dismissal close the dialog without calling the generation API. Explicit confirmation keeps the existing POST body (`report_month`, `period`) and then uses the existing job save/poll/render path. Errors remain inline in the dialog for retry or cancellation. No `window.confirm` remains in the generation path. ## Verification - `node --check arr_web/static/app.js`: passed. - HTML parser check: passed. - Focused suite: `28 tests`, `OK` (`tests.test_arr_web`, `tests.test_arr_web_company_reports`). - Full discovery: `348 tests`, `OK (skipped=10)`. - Isolated authenticated fake-server browser QA did not upload, extract, delete, activate or submit a report. At 1280x720 all four cards share one row; at 390x844 the layout is single-column and `scrollWidth` equals the viewport. The generation dialog opened with `确认生成`, showed `2026年07月,01-10`, and cancel/Escape both closed it without mutation. Browser console warnings/errors: none. - The isolated QA server on port 8876 was stopped after verification. Shared port 8766 was restarted at 14:26:56 +08; its `/healthz` endpoint returns `ready`.