Features

Single Click

With a single click your Back Office will be organised!

Sensible (and Opinionated)

A "one size fits all" organiser for

  • Data Types
  • Document Types
  • Media Types
  • Member Types

Extensible

All "Organise Actions" can be extended and replaced.

Organise your Back Office just how you want it.

Versions

Umbraco icon
Umbraco CMS

13.1.9alpha0012

Version Support Policy

Pre-release - not recommended for production use.
Umbraco will be released on 14/12/2023
This is a Long Term Support (LTS) version
Umbraco icon
Umbraco CMS

16.0.5alpha0009

Version Support Policy

Pre-release - not recommended for production use.
Umbraco will be released on 12/06/2025
Umbraco icon
Umbraco CMS

17.0.0

Version Support Policy

Feature updates until 27/11/2027
Security updates until 27/11/2028
This is a Long Term Support (LTS) version

Readme

Quick Start

  • Go to the backoffice
  • Click Settings
  • Click Organise
  • Select the types you wish to organise
  • Click submit and confirm
  • Refresh your page and enjoy a cleaner backoffice ✨

Configuration

Add the following to your appsettings.json file

appsettings.json
"BackOfficeOrganiser": {
"DataTypes": {
"InternalFolderName": "Internal",
"ThirdPartyFolderName": "Third Party",
"CustomFolderName": "Custom"
}
}

Extending

You can implement your own Organise Action, a method that determines where a type should be moved to. Implement the following interfaces:

  • Document Types => IContentTypeOrganiseAction
  • Media Types => IMediaTypeOrganiseAction
  • Member Types => IMemberTypeOrganiseAction
  • Data Types => IDataTypeOrganiseAction

Example

ExampleContentTypeOrganiseAction.cs
using jcdcdev.Umbraco.Core.Extensions;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Services;
namespace Umbraco.Community.BackOfficeOrganiser.Organisers.ContentTypes;
public class ExampleContentTypeOrganiseAction : IContentTypeOrganiseAction
{
// Handle all but container types (Folders)
public bool CanMove(IContentType contentType, IContentTypeService contentTypeService) => !contentType.IsContainer;
public void Move(IContentType contentType, IContentTypeService contentTypeService)
{
var folderId = -1;
var folderName = string.Empty;
var isComposition = contentTypeService.GetComposedOf(contentType.Id).Any();
if (contentType.AllowedTemplates?.Any() ?? false)
{
folderName = "Pages";
}
else if (isComposition)
{
folderName = "Compositions";
}
else if (contentType.IsElement)
{
folderName = "Element Types";
}
if (!folderName.IsNullOrWhiteSpace())
{
folderId = contentTypeService.GetOrCreateFolder(folderName).Id;
}
contentTypeService.Move(contentType, folderId);
}
}
public class Composer : IComposer
{
public void Compose(IUmbracoBuilder builder)
{
// Make sure you register your action BEFORE the default!
builder.ContentTypeOrganiseActions().Insert<ExampleContentTypeOrganiseAction>();
}
}

Contributing

Contributions to this package are most welcome! Please visit the Contributing page.

Acknowledgements (Thanks)