Skip to content

fix(gate-55): the side column and a sections widget place their widgets - #847

Merged
rubenvdlinde merged 1 commit into
mainfrom
fix/gate-55-side-column-and-sections
Oct 12, 2026
Merged

rubenvdlinde merged 1 commit into
mainfrom
fix/gate-55-side-column-and-sections

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

What changes

Gate 55 rule 8 says every widget on a detail page is placed exactly once. The check knew two placements: a config.layout grid cell, and a tabs or container widget. A detail page in the v2 shape has three more, and the gate read each as "maps to 0 layout cell(s)":

  • config.sideColumn: a string entry is the id of a page widget, which CnDetailPage renders beside the body.
  • a sections widget: content.sections[].widgetId names the widget each section shows.
  • a tabs entry with widgetIds: a stack of cards in one tab.

Measured on portaliq development (7b7ae1fd): 18 findings on five detail pages. Ten widgets sit in a side column and eight in a sections widget. All 18 render. The manifest is right and the gate was behind the library (nextcloud-vue 2.81.0, CnDetailPage.sideColumnWidgets and CnSectionsWidget).

The gate still fails what it should

  • A widget with no placement at all still fails. pipelinq's ClientDetail keeps its five findings (client-summary-* are declared and placed nowhere).
  • New: a side column widget that also has a grid cell is reported as a double render.
  • New: the same id twice in the side column is reported.
  • New: a side column id that names no declared widget is reported. CnDetailPage drops such a card without a word.

Not reported, on purpose: the same widget in the side column and in a tab. pipelinq's ContactDetail and shillinq's CustomerDetail ship a History card beside the body and a History tab. That is a design call, so the gate leaves it alone.

Measured across the fleet (old checker against new, local checkouts)

App Old New New findings
portaliq 18 0 0
pipelinq 31 5 0
shillinq 13 0 0
dossiq 6 0 0
humaniq 1 0 0
13 other apps 0 0 0

No app gets a finding it did not have.

Verified

Check Exit code
test_check_detail_page_placement.py (new, 14 tests) 0
the same suite against the old checker 1, 12 of 14 fail (the two that pass are controls that hold on both)
test_check_detail_page_cross_app.py, test_check_detail_page_icon_registry.py 0
test_gate_45_to_55_acceptance.sh (74 cases) 0

Also red on portaliq, not from this gate

Gates 22 and 53 reject @row.hostname in a row action payload. The library accepts it since 2.81.0 (schema 2.89.0); the vendored schema here is 2.76.0 and #842 carries 2.85.0. diff_schema_strictness.js between the vendored copy and 2.81.0's schema prints none. I started the schema sync workflow so its pull request follows 2.81.0.

Rule 8 read a widget named by config.sideColumn, by a sections widget's
content.sections[].widgetId or by a tab's widgetIds stack as unplaced.
portaliq's development carried 18 such findings on five detail pages, all
rendered. A widget with no placement still fails; a side column widget with
a grid cell and a side column id that names no widget are reported.
@rubenvdlinde
rubenvdlinde merged commit 30ba651 into main Oct 12, 2026
47 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