mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
DEV: Make admin experimental sidebar config more forgiving (#24236)
Followup to b53449eac9,
it was too easy to add broken routes which would break
configuration for the whole site, so now we validate ember
routes on save.
This commit is contained in:
@@ -14,7 +14,17 @@
|
||||
or a
|
||||
<code>href</code>, if you want to link to a specific page but don't know the
|
||||
Ember route. You can also use the Ember Inspector extension to find route
|
||||
names, for example for plugin routes which are not auto-generated here.</p>
|
||||
names, for example for plugin routes which are not auto-generated here.
|
||||
<br /><br />
|
||||
<code>routeModels</code>
|
||||
is an array of values that correspond to parts of the route; for example the
|
||||
topic route may be
|
||||
<code>/t/:id</code>, so to get a link to topic with ID 123 you would do
|
||||
<code>routeModels: [123]</code>.</p>
|
||||
|
||||
<p>All configuration options for a section and its links looks like this:</p>
|
||||
|
||||
<pre><code>{{this.exampleJson}}</code></pre>
|
||||
|
||||
<DButton
|
||||
@action={{this.resetToDefault}}
|
||||
|
||||
@@ -13,12 +13,36 @@ import { ADMIN_PANEL } from "discourse/services/sidebar-state";
|
||||
export default class AdminConfigAreaSidebarExperiment extends Component {
|
||||
@service adminSidebarExperimentStateManager;
|
||||
@service toasts;
|
||||
@service router;
|
||||
@tracked editedNavConfig;
|
||||
|
||||
validRouteNames = new Set();
|
||||
|
||||
get defaultAdminNav() {
|
||||
return JSON.stringify(ADMIN_NAV_MAP, null, 2);
|
||||
}
|
||||
|
||||
get exampleJson() {
|
||||
return JSON.stringify(
|
||||
{
|
||||
name: "section-name",
|
||||
text: "Section Name",
|
||||
links: [
|
||||
{
|
||||
name: "admin-revamp",
|
||||
route: "admin-revamp",
|
||||
routeModels: [123],
|
||||
text: "Revamp",
|
||||
href: "https://forum.site.com/t/123",
|
||||
icon: "rocket",
|
||||
},
|
||||
],
|
||||
},
|
||||
null,
|
||||
2
|
||||
);
|
||||
}
|
||||
|
||||
@action
|
||||
loadDefaultNavConfig() {
|
||||
const savedConfig = this.adminSidebarExperimentStateManager.navConfig;
|
||||
@@ -48,6 +72,40 @@ export default class AdminConfigAreaSidebarExperiment extends Component {
|
||||
return;
|
||||
}
|
||||
|
||||
let invalidRoutes = [];
|
||||
config.forEach((section) => {
|
||||
section.links.forEach((link) => {
|
||||
if (!link.route) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.validRouteNames.has(link.route)) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
this.router._router._routerMicrolib.recognizer.handlersFor(
|
||||
link.route
|
||||
);
|
||||
this.validRouteNames.add(link.route);
|
||||
} catch {
|
||||
invalidRoutes.push(link.route);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
if (invalidRoutes.length) {
|
||||
this.toasts.error({
|
||||
duration: 3000,
|
||||
data: {
|
||||
message: `There was an error with one or more of the routes provided: ${invalidRoutes.join(
|
||||
", "
|
||||
)}`,
|
||||
},
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
this.#saveConfig(config);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user