Skip to content

fix(index): one New board, always primary, Views buttons at the end - #68

Merged
HecFranco merged 2 commits into
mainfrom
fix/board-list-page
Nov 7, 2026
Merged

HecFranco merged 2 commits into
mainfrom
fix/board-list-page

Conversation

@HecFranco

Copy link
Copy Markdown
Contributor

Beacon's findings on the board list page, reported on 2.0.2 and confirmed in the code of 2.1.0. Target: 2.1.1.

Changes

  1. One New board. Previously two when there were no boards. The header's action now needs a board; the empty state keeps the same $canCreate. The page has no filter or search, and the scaffold draws the empty state whenever page.rows is empty, so a list emptied by list_roles or by board access keeps the button.
  2. New board is primary. _action.html.twig resolves action.variant ?: action_variants[kind], and UiKit documents that an explicit primary keeps the page's main action. Action::create() needs an href and this action opens a dialog, so it sets variant: 'primary'. No other TaskBoard page has this gap: this is the only create kind in the bundle.
  3. Views buttons at the end of the cell. Scoped to .nowo-ui-cell--end, with a reset inside the card container query. Measured in Chromium: at 390 and 320 px the buttons sit at exactly the same coordinates as before.
  4. Provider contract documented. Any scope shows New board without asking canCreateBoard(); a provider returns [] on a tenant's page where the user may not create. In the interface docblock and CONFIGURATION.md, because USAGE.md does not describe scope providers.

For hosts

  • With no boards, nowo-task-board-new is gone and nowo-task-board-new-empty is the only button.
  • A host replacing UiKit's empty partial must print empty.action.
  • New board is now primary on a host with action_variants: {create: secondary}.

No schema, configuration or permission change. Audit: re-verification pending, in the next batch.

Findings from Beacon on the board list page, seen on 2.0.2 and still in 2.1.0.

With no boards the page drew New board twice, in the header and in the empty
state. The header's action now needs a board; the empty state takes the same
$canCreate and the scaffold draws it whenever there are no rows, so a list
emptied by the list check or by board access keeps the only button.

New board had no variant, so action_variants {create: secondary} turned the
page's main action secondary. UiKit's partial reads the explicit variant first
and its docs say Action::create() stays primary for this reason. The action
opens a dialog and has no href, so it sets variant: 'primary' directly.

The Views cell is end-aligned but its buttons stayed at the start. They now end
in that cell only, and stay at the start in a card, as the kit keeps every
end-aligned column there. A host's list via _board_list_item does not change.

Documents the contract Beacon relies on: any scope shows New board without
asking canCreateBoard(), so a provider returns [] on a tenant's page where the
user may not create.
…block table

Audit HZ on PR #68: Pass (good) / Low, with two documentation findings.

HZ-L2: returning [] from scopes() hands the decision to canCreateBoard() for
the page's tenant; with a permissive checker the button shows and the create
route creates there without resolve(). Says so in the docblock, CONFIGURATION,
SECURITY and UPGRADING.

HZ-L3: a templates.index override that skips page.empty loses the button like
an empty partial without empty.action; only ?new=1 and the noscript form remain.

USAGE listed the 1.x index blocks removed in 2.0.0; it now lists the 2.0 ones.
Records the HZ verdict in SECURITY, CHANGELOG and UPGRADING.
@HecFranco
HecFranco merged commit d527568 into main Nov 7, 2026
17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant