Skip to content

feat(grid): show and edit grid views on their own page - #3082

Closed
remko48 wants to merge 8 commits into
feat/noid/grid-widget-formsfrom
feat/noid/grid-view-page
Closed

remko48 wants to merge 8 commits into
feat/noid/grid-widget-formsfrom
feat/noid/grid-view-page

Conversation

@remko48

@remko48 remko48 commented Oct 12, 2026

Copy link
Copy Markdown

A grid view now opens as a page: its widgets on the grid, with an edit mode to add, configure, move, resize and remove widgets.

What changes

  • GridView page: "Edit page" works on a copy of the grid; "Save" sends the whole grid in one update and "Cancel" throws the copy away. The server validates the grid on save (see the earlier backend PR). Leaving the page or switching views with unsaved changes asks first, and the browser warns before the tab is closed or reloaded.
  • GridViewSettings dialog: create a grid view (title, emoji, description) or edit those fields on an existing one. It takes no technical name, since a grid view is named by its id. Editing a grid view from its menu opens this dialog instead of the table view settings.
  • /view/{id} shows the grid page for a grid view; only users who can manage the view see the edit button.
  • Navigation: grid views get their own "Grid views" section with a create button, and are left out of the table and shared view lists. A grid view without an emoji gets its own icon, and actions that only make sense for rows (row count, duplicate, import) are hidden for them.
  • Store: insertStandaloneView creates a view through POST /api/2/views. Reloading the tables no longer drops shared views and grid views from the store.
  • Tests: a Playwright spec covers creating a grid view, adding and configuring widgets, editing its title and the unsaved-changes prompt.

🖼️ Screenshots

🏚️ Before 🏡 After
|

🏁 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 4 commits October 12, 2026 15:09
A grid view opens as a page of widgets. In edit mode widgets are added,
configured, moved and removed, and the whole grid is saved at once. A
dialog creates a grid view or edits its title, description and technical
name.

- grid views are kept out of the table view lists in the navigation
- views without a table survive a reload of the tables in the store

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

- the grid view dialog no longer sends a technical name, which the server
  refuses for a view without a table, and only sends the fields the create
  endpoint takes; its fields are labelled and Submit is disabled while saving
- grid views get their own list in the navigation, with an action to create
  one, so the create flow has an entry point
- leaving a grid page with unsaved changes asks first, and the browser warns
  before closing the tab
- loading the tables keeps shared views and grid views but drops views of
  tables that are gone again
- the grid page imports the layout helpers from gridLayout.js, disables move
  steps that cannot apply and hides them on a narrow canvas
- a Playwright spec covers creating, editing, configuring and saving a page

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

The draft, the stored grid, the unsaved-changes check and the discard
confirmation live in setup(), so the route guards use them directly and the
options API reads the same state, without getCurrentInstance().

Assisted-by: ClaudeCode:claude-opus-5-5
Signed-off-by: Remko <remko@conduction.nl>
Signed-off-by: Remko <remko@conduction.nl>
…type select in the e2e test

- the grid views list now follows the applications, which the Cypress
  helper for creating an application addresses as the second list
- the Playwright spec opens the widget type select from its indicator, like
  the other specs do, instead of clicking the component root

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

Escape only reaches the type select, which keeps the focus after a pick, so the dialog stayed open.

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