You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Browse filesBrowse the repository at this point in the historyBrowse files
authored
fix(shell): compose the runtime manifest instead of replacing the app's own (#559)
* fix(shell): compose the runtime manifest instead of replacing the app's own
Reproduced on a clean instance rather than reasoned about, and the finding is
worse than the 13 failing tests suggested: with tier 3, launchpad rendered
NOTHING on a fresh install. `#workspace-vue` held 7 bytes, an empty comment,
against 43,564 for the same instance on the commit before tier 3.
`GET /api/manifest` is not this app's manifest. ManifestController says so in
its own docblock: it assembles a document from the user's OpenRegister dashboard
objects, one page and one menu entry per dashboard, and "when the user has no
dashboards the manifest returns empty pages/menu".
App.vue read `runtimeManifest?.value ?? this.manifest`. An empty object is
truthy, so a user with no dashboards got a manifest with no pages and no menu,
and tier 3 builds both the router and the nav from the manifest. A user WITH
dashboards was no better off, only less obviously: the runtime document still
replaced the nine declared pages, the ADR-114 footer and the walkthrough, which
is what the chrome and routing specs have been failing on.
So the two are composed, which is what each is for. The bundled manifest owns
the declared surfaces; the runtime one contributes the dashboards only the
server knows about, and the live `runtime` block.
THE SETUP WIZARD CAME WITH CnAppRoot, and nothing accounted for it. CnAppRoot
opens CnSetupWizard while ANY step is outstanding, optional or not
(nextcloud-vue#806) — and `completed` is not `settled`: the status endpoint
answered `"completed": true` while still reporting `demo-data` and
`load-demo-data` as `done: false`. `cn-wizard-dialog` is an aria-modal that
intercepts pointer events, so every click landed on it. Measured locally: with
the wizard up, dashboard-sharing failed 4 of 4; with the choice recorded,
runtime-shell-canEdit and add-widget-modal ran 10 passed, 0 failed. globalSetup
now records the choice once, because the marker is per user and settling it per
spec makes the suite order-dependent.
Three manifest references could never resolve. The `dashboards` menu entry and
two walkthrough steps pointed at `dashboard-detail`, whose path is
`/dashboards/:id`, so vue-router threw `Missing required param "id"` on every
render. They were inert until tier 3 gave the manifest a real router. A third
step named the `Flows` PAGE where a menu-entry id belongs.
Six labels were raw i18n keys. `launchpad.menu.dashboards` and five others
render as the key itself in all 36 locales but Dutch, which is the only one
carrying them. They are plain English now, like every other entry in this menu
already was. Dutch loses a translation it only ever had for these six; that is
the same position `Flows`, `Store` and `Reports` are already in, and worth a
follow-up for all of them together rather than a special case for these.
682 unit tests pass. The development push run is the E2E proof, since that leg
does not run on a pull request.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(nav): the admin entry is not called Settings, because the foldout already is
gate-63 caught the label I chose. ADR-079 reserves `settings`, `appsettings` and
`app settings` for a settings-foldout entry, because NcAppNavigation's foldout is
ITSELF labelled "Settings" — an entry by that name renders as Settings >
Settings, which is the duplication ADR-079 D1 removed a whole menu to stop.
Replacing the raw `launchpad.menu.adminSettings` key with "Settings" walked
straight into it. "Admin settings" says where the entry goes — it redirects to
/settings/admin/launchpad — and is not reserved.
⚠️ FOLLOW-UP, NOT SILENTLY FIXED HERE: this entry now carries the same label as
the one nc-vue's shared chrome already renders, and both lead to the same admin
page. ADR-079 D1's precedent says an in-app duplicate of the Nextcloud admin
settings page should go, not be renamed. Removing a menu surface is a product
decision rather than a gate fix, so it is named here instead of taken.
Verified locally: gate-63 reports `checked 2 manifest(s): 0 failure(s)`, 682
unit tests pass, webpack build clean.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(l10n): the new admin label has a Dutch key, so it does not render English
gate-102 caught what my last commit deferred, and it was right to: a manifest
string with no `l10n/nl.json` key renders its English source to a Dutch user, and
nothing else reports it. `check:l10n-js` compares nl.json to nl.js, and a string
absent from BOTH is in sync.
⚠️ CORRECTION TO THAT COMMIT MESSAGE. It said Dutch loses a translation it only
ever had for these six labels. That was wrong, and the gate is what measured it:
five of the six English strings I introduced — Dashboards, Templates, Settings,
Dashboard — were ALREADY keys in nl.json, so replacing the dotted i18n keys cost
Dutch nothing there. Only "Admin settings" was new, because only that label had
no prior English form to have been catalogued under.
So there is no follow-up owed for the other five, and the one that was genuinely
missing is added rather than noted: "Beheerinstellingen", matching the file's own
"Instellingen > Beheer" and "beheerder".
Verified locally: gate-102 `checked 51 manifest string(s)` with no findings,
gate-63 `0 failure(s)`, prettier clean, 682 unit tests pass.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Conduction Release Bot <release-bot@conduction.nl>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: l10n/nl.json
+2-1Lines changed: 2 additions & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -1135,6 +1135,7 @@
1135
1135
"Version": "Versie",
1136
1136
"How many dashboards there are, and who they belong to.": "Hoeveel dashboards er zijn, en van wie ze zijn.",
1137
1137
"Store": "Store",
1138
-
"Install dashboard configurations that other organisations have published: a set of tiles, a layout, or the flows behind them.": "Installeer registers, schema's en flows die andere organisaties hebben gepubliceerd."
1138
+
"Install dashboard configurations that other organisations have published: a set of tiles, a layout, or the flows behind them.": "Installeer registers, schema's en flows die andere organisaties hebben gepubliceerd.",
Copy file name to clipboardExpand all lines: src/manifest.json
+11-11Lines changed: 11 additions & 11 deletions
Original file line number
Diff line number
Diff line change
@@ -96,22 +96,22 @@
96
96
"menu": [
97
97
{
98
98
"id": "dashboards",
99
-
"label": "launchpad.menu.dashboards",
99
+
"label": "Dashboards",
100
100
"icon": "ViewDashboardOutline",
101
-
"route": "dashboard-detail",
101
+
"route": "Workspace",
102
102
"section": "main"
103
103
},
104
104
{
105
105
"id": "admin-templates",
106
-
"label": "launchpad.menu.adminTemplates",
106
+
"label": "Templates",
107
107
"icon": "FileReplaceOutline",
108
108
"route": "/admin/templates",
109
109
"section": "settings",
110
110
"permission": "admin"
111
111
},
112
112
{
113
113
"id": "admin-settings",
114
-
"label": "launchpad.menu.adminSettings",
114
+
"label": "Admin settings",
115
115
"icon": "CogOutline",
116
116
"route": "/admin/settings",
117
117
"section": "settings",
@@ -183,7 +183,7 @@
183
183
"id": "dashboard-detail",
184
184
"route": "/dashboards/:id",
185
185
"type": "custom",
186
-
"title": "launchpad.pages.dashboard",
186
+
"title": "Dashboard",
187
187
"_note": "type:custom for the same reason as Workspace: this is the grid addressed by dashboard id, not a declarative dashboard page. The :id selects the active dashboard (dashboard-deeplinking).",
188
188
"widgets": [],
189
189
"config": {
@@ -195,7 +195,7 @@
195
195
"id": "admin-templates-index",
196
196
"route": "/admin/templates",
197
197
"type": "custom",
198
-
"title": "launchpad.pages.adminTemplates",
198
+
"title": "Templates",
199
199
"component": "AdminSettingsRedirect",
200
200
"_note": "REDIRECTS to /settings/admin/launchpad. TemplatesPage is a TAB inside the Nextcloud admin section, not a page of its own; routing it in-app would render half an admin surface next to the real one.",
201
201
"config": {
@@ -206,7 +206,7 @@
206
206
"id": "admin-settings",
207
207
"route": "/admin/settings",
208
208
"type": "custom",
209
-
"title": "launchpad.pages.adminSettings",
209
+
"title": "Admin settings",
210
210
"component": "AdminSettingsRedirect",
211
211
"_note": "REDIRECTS to /settings/admin/launchpad. The admin surface is a Nextcloud settings section (lib/Settings/LaunchPadAdmin.php, mounted by src/admin.js), not an in-app page — the component this once named, AdminSettingsPage, has never existed. The route resolves so the menu entry is not a dead link, and lands where the functionality is."
212
212
},
@@ -491,7 +491,7 @@
491
491
"body": "A short tour of the main screens. It takes under a minute, and you can close it at any point and pick it up again from the help menu.",
0 commit comments