# 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 `<dialog>` 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`.
