Repository navigation
Conversation
The create dialog gets a menu editor. Every entry opens a view, a table or an external link, can carry an icon and can sit under the top-level entry above it, one level deep. - entries are reordered by dragging or with move buttons, and moved in and out of a parent with indent buttons, so the menu can be arranged with the keyboard - a parent moves together with its children; removing a parent moves its children to the top level Co-authored-by: Ruben van der Linde <ruben@conduction.nl> Assisted-by: ClaudeCode:claude-opus-5-5 Signed-off-by: Remko <remko@conduction.nl>
- the menu only offers tables and views the user can manage, like the resource picker - rows with a missing label, target or a bad link are marked, and creating waits until all are valid - the list operations are pure functions in utils/menuItems.js, covered by a component spec - option labels are translated as one string, and the label is taken from the option's title - only the handle starts a drag, so text in the fields stays selectable - buttons and rows name their item for screen readers - a slower icon load no longer replaces a newer one - no CSS fallbacks, capitalised comments and JSDoc on every method Assisted-by: ClaudeCode:claude-opus-5-5 Signed-off-by: Remko <remko@conduction.nl>
- a new menu item no longer starts red: a row shows its errors once a field of it was left - the target error goes through the select's own helper text, so screen readers announce it - releasing the drag handle anywhere, or a cancelled pointer, makes the row plain again Assisted-by: ClaudeCode:claude-opus-5-5 Signed-off-by: Remko <remko@conduction.nl>
- deleting an application retries on a retryable database error and removes the application row first, so on SQLite the transaction holds the write lock before it reads and no longer fails when another request writes meanwhile - Create application stays enabled: submitting shows every menu error and stops while the menu is invalid - the target error is shown in the error style, like the label and link errors Assisted-by: ClaudeCode:claude-opus-5-5 Signed-off-by: Remko <remko@conduction.nl>
|
Hello there, 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.) |
|
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. |
The create application dialog gets a menu editor, so an application can be created with its menu in one go.
What changes
MenuItemsEditor: an ordered list of menu items. Each item has an icon, a label and what it opens: a view, a page with widgets, a table or an external link. Only tables and views the user can manage are offered, since the server adds them to the application as resources. Picking a view or table fills in an empty label.ApplicationIcon: shows a material icon by name, used for the menu item icons.menuItems.js: the list operations of the editor, and turning its list into the API payload, includingparentIndexfor nested items.CreateContext: sends the menu with the new application.main, not caused by this stack): the delete removes the application first, inside a transaction that is retried, so it holds the write lock before it reads. On SQLite a delete that read first failed at once when another request wrote meanwhile.🖼️ Screenshots
🏁 Checklist
/backport to stableX.X🤖 AI (if applicable)