Skip to content

feat(contexts): add a menu to applications - #3086

Closed
remko48 wants to merge 4 commits into
mainfrom
feat/noid/menu-model
Closed

remko48 wants to merge 4 commits into
mainfrom
feat/noid/menu-model

Conversation

@remko48

@remko48 remko48 commented Oct 13, 2026

Copy link
Copy Markdown

Applications (contexts) get a menu: an ordered list of items that each open a view, a table or a web link. This PR adds the data model and returns the menu with the application; saving it comes in the next PR.

What changes

  • Migration: new table tables_contexts_menu_item (label, icon, target type + id or url, technical name, order). Every item has a technical name, unique within one application, enforced by a unique index.
  • MenuItem entity + MenuItemMapper: the menus of all requested applications are loaded in one query (chunked for Oracle), not one per application.
  • Broken targets: an item whose view or table was deleted is not removed. It comes back with broken: true, worked out in the same query, so the UI can show it and the owner can fix it.
  • ContextMapper: the three copies of the "group joined rows per context" code are replaced by one formatResultSet(). The navigation bar query skips loading menus, since it doesn't show them; there menuItems is always empty.
  • Deleting an application also deletes its menu.
  • API: menuItems is added to the context response (OpenAPI and TS types regenerated).

🖼️ Screenshots

Backend only, no UI changes.

🏁 Checklist

  • ⛑️ Tests (unit and/or integration) are included or not needed
  • 🔙 Backport requests are created or not needed: /backport to stableX.X
  • 📅 Milestone is set
  • 🌸 PR title is meaningful (if it should be in the changelog: is it meaningful to users?)

🤖 AI (if applicable)

  • The content of this PR was partly or fully generated using AI

remko48 and others added 2 commits October 12, 2026 13:23
An application (context) gets a menu of items that each open a view, a
table or a link. Items are loaded with the context in one chunked query,
and an item whose view or table no longer exists is reported as broken,
computed in SQL. Deleting an application deletes its menu.

- a menu item's technical name is unique within its application, kept so
  by a unique index on (context_id, technical_name)
- the item target type is typed as view, table or url in the API
- the mapper groups the joined context rows in one place instead of three

Co-authored-by: Ruben van der Linde <ruben@conduction.nl>
Assisted-by: ClaudeCode:claude-opus-5-5
Signed-off-by: Remko <remko@conduction.nl>
…nu items

- MenuItemMapperTest runs against a real database: items pointing at a deleted
  view or table come back broken and links never do, items are ordered and
  grouped per application, and ContextMapper::findById() and findAll() carry
  the menu
- MenuItemTest serializes each of the three target types
- technicalName is a string in the entity and the API: the column is not null

Assisted-by: ClaudeCode:claude-opus-5-5
Signed-off-by: Remko <remko@conduction.nl>
@github-actions

Copy link
Copy Markdown
Contributor

Hello there,
Thank you so much for taking the time and effort to create a pull request to our Nextcloud project.

We hope that the review process is going smooth and is helpful for you. We want to ensure your pull request is reviewed to your satisfaction. If you have a moment, our community management team would very much appreciate your feedback on your experience with this PR review process.

Your feedback is valuable to us as we continuously strive to improve our community developer experience. Please take a moment to complete our short survey by clicking on the following link: https://cloud.nextcloud.com/apps/forms/s/i9Ago4EQRZ7TWxjfmeEpPkf6

Thank you for contributing to Nextcloud and we hope to hear from you soon!

(If you believe you should not receive this message, you can add yourself to the blocklist.)

@rubenvdlinde

Copy link
Copy Markdown

Closing this in favour of the new stack that starts at #3131. After the review on #3075, @enjeck's design in #3099 and #3100 replaced the model these PRs were built on, so they can't be updated in place.

The backend of grid pages and application menus is now in #3131 to #3138. The frontend follows in separate PRs. @remko48 is co-author on the menu commits there. Thanks to everyone who reviewed these.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants