suedeapple (Paul)
07/17/2026, 2:48 PMLuuk Peters (Proud Nerds)
07/17/2026, 3:04 PMsuedeapple (Paul)
07/17/2026, 3:08 PMJanae
07/17/2026, 3:22 PMJanae
07/17/2026, 3:22 PMDean Leigh
07/17/2026, 3:29 PMRavi
07/17/2026, 8:19 PMMike Chambers
07/20/2026, 8:50 AMconfig/tree.config
And we used to move the dictionary out of settings, for a editor to access.
Though dictionary happily sits in the translation section these days so not such an issue...
But I wonder if you can do the same these days with other areas like Redirectmanagement....
Something along the lines of š¤·
csharp
public class DictionaryTreeComposer : IComposer
{
public void Compose(IUmbracoBuilder builder)
{
// Remove the default dictionary tree controller
builder.Trees().RemoveTreeController<DictionaryTreeController>();
// Add your custom tree controller
// where we've inhertited the default one and chaged the section?
builder.Trees().AddTreeController<CustomDictionaryTreeController>();
}
}
https://cdn.discordapp.com/attachments/1527688481172754563/1528685477589160028/trees.config?ex=6a5f32cb&is=6a5de14b&hm=391ec2148d6291bb7b77eaad3185666e05ad0297eec268b289c750a69c1ece9e&Mike Chambers
07/20/2026, 8:54 AMusing Umbraco.Cms.Core.Composing;
using Umbraco.Cms.Core.DependencyInjection;
using Umbraco.Cms.Core.Dashboards;
public class MoveRedirectDashboardComposer : IComposer
{
public void Compose(IUmbracoBuilder builder)
{
// Option A: Modify the existing dashboard's section mapping programmatically
builder.Dashboards.Configure(collection =>
{
var dashboard = collection.FirstOrDefault(x => x.Alias == "redirectUrlManagement");
if (dashboard != null)
{
// Change which section(s) the dashboard appears in
// (e.g., moving it from "content" to a custom section alias like "translation" or "settings")
dashboard.Sections = new[] { "translation" };
}
});
}
}
or package.manifest?
{
"dashboards": [
{
"alias": "redirectUrlManagement",
"sections": [
"translation"
],
"view": "/umbraco/backoffice/views/dashboard/redirecturlmanagement.html",
"weight": 10
}
]
}Jaddie
07/20/2026, 11:18 AMJaddie
07/20/2026, 11:18 AMsuedeapple (Paul)
07/20/2026, 2:56 PMjavascript
export const onInit = (_host, extensionRegistry) => {
const coreRedirectManagementManifest =
extensionRegistry.getByAlias("Umb.Dashboard.RedirectManagement");
extensionRegistry.exclude("Umb.Dashboard.RedirectManagement");
extensionRegistry.register({
type: "dashboard",
alias: "DashboardTweaks.RedirectManagement",
name: "Redirect Management",
element: coreRedirectManagementManifest?.element,
weight: 100,
meta: {
label: "Redirect Management",
pathname: "redirect-management"
},
conditions: [
{
alias: "Umb.Condition.SectionAlias",
match: "Umb.Section.Settings" // Or Library, etc.
}
]
});
};Luuk Peters (Proud Nerds)
07/21/2026, 6:23 AMMike Chambers
07/21/2026, 8:48 AMmatch: UMB_DOCUMENT_WORKSPACE_ALIAS, with any other workspace alias.. though might have to update those import filepaths too?
though that introduces a make sure we keep in sync with any umbraco future updates.. (though looks fairly simple so hopefully not constantly changing)
I think I do prefer @User of grab the existing element and replace by reuse... rather than reimplement?Ravi
07/21/2026, 1:20 PMsuedeapple (Paul)
07/21/2026, 3:21 PMMike Chambers
07/21/2026, 5:11 PMjson
{
"name": "Dashboard Customization",
"version": "1.0.0",
"extensions": [
{
"type": "backofficeEntryPoint",
"alias": "DashboardCustomization.EntryPoint",
"name": "Dashboard Customization Entry Point",
"js": "/App_Plugins/MoveRedirectManagementDashboard/dashboards-setup.js"
}
]
}
wwwroot\App_Plugins\MoveRedirectManagementDashboard\dashboards-setup.js
js
import { UMB_SETTINGS_SECTION_ALIAS } from '@umbraco-cms/backoffice/settings';
import { UMB_SECTION_ALIAS_CONDITION_ALIAS } from '@umbraco-cms/backoffice/section';
const REDIRECT_MANAGEMENT_DASHBOARD_ALIAS = 'Umb.Dashboard.RedirectManagement';
export const onInit = (_host, extensionRegistry) => {
const coreManifest = extensionRegistry.getByAlias(REDIRECT_MANAGEMENT_DASHBOARD_ALIAS);
if (!coreManifest) return;
coreManifest.conditions = [{
alias: UMB_SECTION_ALIAS_CONDITION_ALIAS,
match: UMB_SETTINGS_SECTION_ALIAS,
}];
};Mike Chambers
07/21/2026, 5:12 PMjs
extensionRegistry.appendCondition(REDIRECT_MANAGEMENT_DASHBOARD_ALIAS, {
alias: UMB_SECTION_ALIAS_CONDITION_ALIAS,
match: UMB_SETTINGS_SECTION_ALIAS,
});
which could be even simpler.. but no corresponding replaceCondition.Mike Chambers
07/21/2026, 5:14 PMjson
{
"name": "Dashboard Customization",
"version": "1.0.0",
"extensions": [
{
"type": "dashboard",
"alias": "MoveRedirectManagementDashboard.Override",
"name": "Redirect Management (Moved)",
"weight": 10,
"overwrites": "Umb.Dashboard.RedirectManagement",
"element": "/App_Plugins/UmbracoRedirectManagement/redirect-management-dashboard.element.js",
"meta": {
"label": "Redirect Management",
"pathname": "redirect-management"
},
"conditions": [
{
"alias": "Umb.Condition.SectionAlias",
"match": "Umb.Section.Settings"
}
]
}
]
}
but that didn't seem to do anything šLuuk Peters (Proud Nerds)
07/21/2026, 6:57 PMRavi
07/21/2026, 7:38 PMMike Chambers
07/22/2026, 8:41 AM"overwrites": "Umb.Dashboard.RedirectManagement", is the driver.. so whatever else the default implementation should be removed? I did think afterwards that the element would be cache busted, and checking the actuall request is.. /umbraco/backoffice/038d249741fdfbfa54eab7e101085aeed912c022/packages/documents/dashboard-redirect-management.element-BULrrh_Z.js
But still not sure why the overwrites is doing nothing...
Are you saying that the conditions are some how different with an overwrites.. and only overwrites when the condition is met? Rather than the overwrites being mutually exclusive and the condition working as normal for when the package should display?
That might make sense though would preclude overwriting to change conditions š and overwriting only for functionality change (or specifically weight)?suedeapple (Paul)
07/22/2026, 12:56 PM