What this surface does
This surface is the embedded Manage URLs modal opened from CMS Page Editor for one page key.
Operators use it to maintain the URL rows attached to the current page without leaving the page editor workspace.
Where it appears
- parent flow: CMS Page Editor
- surface type: modal, not a standalone route
- page scope: one
urlPageKeyat a time - trigger:
URLsbutton in the CMS Page Editor
What operators can do here
- review all URLs already linked to the current page
- add a new row
- change the locale code for a row
- change the stored path
- remove an existing row
- save the full page-level URL set in one action
Row behavior
Add URLcreates a local row with:urlId: 0urlLocale: anyurlType: directurlPageKeyset to the current page key
- The table is sorted in the FE by
createdAt. - New unsaved rows are removed locally.
- Persisted rows call the core delete flow first, then are removed from the current modal state.
Important caveats
Save URLsuses the bulk update workflow. New rows are created and existing rows are updated through the same save action.Save URLsis debounced by1000msbefore the save request is sent.- Closing the modal resets the FE state back to the last loaded URL list.
- The modal helper copy says URLs can be set as
directorredirect, but the current visible row editor only exposesLocaleandURL. There is no visible control forurlTypeor redirect destination on this surface today. - Row order is sorted by
createdAtinside the modal for display. It is not a ranking control and it does not change URL priority. - Persisted-row delete is risky from an operator-feedback perspective: the verified FE delete hook is configured not to throw, and the row is removed from local modal state after the delete call returns. Reload the modal if you need to confirm the row was actually removed from core storage.
- The core save route is audit-tracked. The standalone create route also exists, but this modal saves through the bulk page-level workflow.
Validation rules
- every row must have a URL value
- every URL must start with
/ - URLs in the same save set must be unique
- backend uniqueness is also enforced globally by URL path, not only per page key
- backend validation also requires redirect records to carry
urlSettings.redirect.to