Skip to content

Commit a10f4be

Browse files
committed
feature: organise on save
1 parent 977427a commit a10f4be

File tree

13 files changed

+142
-18
lines changed

13 files changed

+142
-18
lines changed

β€Ž.github/README.mdβ€Ž

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Is your backoffice a bit untidy?
1111
- Media Types
1212
- Member Types
1313
- Data Types
14+
- Automatically sorts on save (configurable)
1415

1516
![A screenshot of the Back Office Organiser in action](https://raw.githubusercontent.com/jcdcdev/Umbraco.Community.BackOfficeOrganiser/main/docs/screenshots/backoffice.png)
1617

@@ -27,13 +28,25 @@ Is your backoffice a bit untidy?
2728
Add the following to your `appsettings.json` file
2829

2930
```JSON
30-
"BackOfficeOrganiser": {
31-
"DataTypes": {
32-
"InternalFolderName": "Internal",
33-
"ThirdPartyFolderName": "Third Party",
34-
"CustomFolderName": "Custom"
35-
}
36-
}
31+
{
32+
"BackOfficeOrganiser": {
33+
"DataTypes": {
34+
"InternalFolderName": "Internal",
35+
"ThirdPartyFolderName": "Third Party",
36+
"CustomFolderName": "Custom",
37+
"OrganiseOnSave": true
38+
},
39+
"ContentTypes": {
40+
"OrganiseOnSave": true
41+
},
42+
"MediaTypes": {
43+
"OrganiseOnSave": true
44+
},
45+
"MemberTypes": {
46+
"OrganiseOnSave": true
47+
}
48+
}
49+
}
3750
```
3851

3952
## Extending

β€Žsrc/TestSite.14/Program.csβ€Ž

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
using Microsoft.AspNetCore.Builder;
2-
using Umbraco.Cms.Core.DependencyInjection;
3-
using Umbraco.Extensions;
4-
51
var builder = WebApplication.CreateBuilder(args);
62

73
builder.CreateUmbracoBuilder()
@@ -27,4 +23,4 @@
2723
u.UseWebsiteEndpoints();
2824
});
2925

30-
await app.RunAsync();
26+
await app.RunAsync();
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
@using Umbraco.Cms.Web.Common.PublishedModels;
2-
@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage
1+
@inherits UmbracoViewPage
32
@{
43
Layout = null;
54
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
using Microsoft.Extensions.Options;
2+
using Umbraco.Cms.Core.Events;
3+
using Umbraco.Cms.Core.Notifications;
4+
using Umbraco.Community.BackOfficeOrganiser.Models;
5+
using Umbraco.Community.BackOfficeOrganiser.Organisers.ContentTypes;
6+
using Umbraco.Community.BackOfficeOrganiser.Organisers.DataTypes;
7+
using Umbraco.Community.BackOfficeOrganiser.Organisers.MediaTypes;
8+
using Umbraco.Community.BackOfficeOrganiser.Organisers.MemberTypes;
9+
10+
namespace Umbraco.Community.BackOfficeOrganiser.Composing;
11+
12+
public class BackofficeOrganiserNotificationHandler :
13+
INotificationAsyncHandler<DataTypeSavedNotification>,
14+
INotificationAsyncHandler<ContentTypeSavedNotification>,
15+
INotificationAsyncHandler<MemberTypeSavedNotification>,
16+
INotificationAsyncHandler<MediaTypeSavedNotification>
17+
{
18+
private readonly ContentTypeOrganiser _contentTypeOrganiser;
19+
private readonly DataTypeOrganiser _dataTypeOrganiser;
20+
private readonly MediaTypeOrganiser _mediaTypeOrganiser;
21+
private readonly MemberTypeOrganiser _memberTypeOrganiser;
22+
private readonly BackOfficeOrganiserOptions _options;
23+
24+
public BackofficeOrganiserNotificationHandler(
25+
DataTypeOrganiser dataTypeOrganiser,
26+
ContentTypeOrganiser contentTypeOrganiser,
27+
MediaTypeOrganiser mediaTypeOrganiser,
28+
MemberTypeOrganiser memberTypeOrganiser,
29+
IOptions<BackOfficeOrganiserOptions> options)
30+
{
31+
_dataTypeOrganiser = dataTypeOrganiser;
32+
_contentTypeOrganiser = contentTypeOrganiser;
33+
_mediaTypeOrganiser = mediaTypeOrganiser;
34+
_memberTypeOrganiser = memberTypeOrganiser;
35+
_options = options.Value;
36+
}
37+
38+
public async Task HandleAsync(ContentTypeSavedNotification notification, CancellationToken cancellationToken)
39+
{
40+
if (!_options.ContentTypes.OrganiseOnSave)
41+
{
42+
return;
43+
}
44+
45+
foreach (var item in notification.SavedEntities)
46+
{
47+
await _contentTypeOrganiser.OrganiseTypeAsync(item);
48+
}
49+
}
50+
51+
public async Task HandleAsync(DataTypeSavedNotification notification, CancellationToken cancellationToken)
52+
{
53+
if (!_options.DataTypes.OrganiseOnSave)
54+
{
55+
return;
56+
}
57+
58+
foreach (var dataType in notification.SavedEntities)
59+
{
60+
await _dataTypeOrganiser.OrganiseAsync(dataType);
61+
}
62+
}
63+
64+
public async Task HandleAsync(MediaTypeSavedNotification notification, CancellationToken cancellationToken)
65+
{
66+
if (!_options.MediaTypes.OrganiseOnSave)
67+
{
68+
return;
69+
}
70+
71+
foreach (var item in notification.SavedEntities)
72+
{
73+
await _mediaTypeOrganiser.OrganiseTypeAsync(item);
74+
}
75+
}
76+
77+
public async Task HandleAsync(MemberTypeSavedNotification notification, CancellationToken cancellationToken)
78+
{
79+
if (!_options.MemberTypes.OrganiseOnSave)
80+
{
81+
return;
82+
}
83+
84+
foreach (var item in notification.SavedEntities)
85+
{
86+
await _memberTypeOrganiser.OrganiseTypeAsync(item);
87+
}
88+
}
89+
}

β€Žsrc/Umbraco.Community.BackOfficeOrganiser/Composing/Composer.csβ€Ž

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Microsoft.Extensions.DependencyInjection;
22
using Umbraco.Cms.Core.Composing;
33
using Umbraco.Cms.Core.DependencyInjection;
4+
using Umbraco.Cms.Core.Notifications;
45
using Umbraco.Community.BackOfficeOrganiser.Models;
56
using Umbraco.Community.BackOfficeOrganiser.Organisers.ContentTypes;
67
using Umbraco.Community.BackOfficeOrganiser.Organisers.DataTypes;
@@ -23,10 +24,15 @@ public void Compose(IUmbracoBuilder builder)
2324
builder.Services.AddSingleton<ContentTypeOrganiser>();
2425
builder.Services.AddSingleton<MemberTypeOrganiser>();
2526
builder.Services.AddSingleton<MediaTypeOrganiser>();
26-
27+
2728
builder.DataTypeOrganiseActions().Append<DefaultDataTypeOrganiseAction>();
2829
builder.ContentTypeOrganiseActions().Append<DefaultContentTypeOrganiseAction>();
2930
builder.MediaTypeOrganiseActions().Append<DefaultMediaTypeOrganiseAction>();
3031
builder.MemberTypeOrganiseActions().Append<DefaultMemberTypeOrganiseAction>();
32+
33+
builder.AddNotificationAsyncHandler<DataTypeSavedNotification, BackofficeOrganiserNotificationHandler>();
34+
builder.AddNotificationAsyncHandler<MediaTypeSavedNotification, BackofficeOrganiserNotificationHandler>();
35+
builder.AddNotificationAsyncHandler<MemberTypeSavedNotification, BackofficeOrganiserNotificationHandler>();
36+
builder.AddNotificationAsyncHandler<ContentTypeSavedNotification, BackofficeOrganiserNotificationHandler>();
3137
}
3238
}

β€Žsrc/Umbraco.Community.BackOfficeOrganiser/Controllers/BackOfficeOrganiserController.csβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public async Task<IActionResult> Organise([FromBody] OrganiseRequest model)
3939
return BadRequest(OrganiseResponse.Fail("Failed to organise"));
4040
}
4141

42-
return Ok(OrganiseResponse.Success($"Successfully organised πŸš€"));
42+
return Ok(OrganiseResponse.Success("Successfully organised \ud83d\ude80"));
4343
}
4444

4545
private static OrganiseType DetermineOrganiseType(string input)

β€Žsrc/Umbraco.Community.BackOfficeOrganiser/Models/BackOfficeOrganiserOptions.csβ€Ž

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,8 @@ namespace Umbraco.Community.BackOfficeOrganiser.Models;
33
public class BackOfficeOrganiserOptions
44
{
55
public DataTypeOptions DataTypes { get; set; } = new();
6+
public ContentTypeOptions ContentTypes { get; set; } = new();
7+
public MemberTypeOptions MemberTypes { get; set; } = new();
8+
public MediaTypeOptions MediaTypes { get; set; } = new();
69
public static string SectionName => "BackOfficeOrganiser";
710
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace Umbraco.Community.BackOfficeOrganiser.Models;
2+
3+
public class ContentTypeOptions
4+
{
5+
public bool OrganiseOnSave { get; set; } = true;
6+
}

β€Žsrc/Umbraco.Community.BackOfficeOrganiser/Models/DataTypeOptions.csβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ public class DataTypeOptions
55
public string InternalFolderName { get; set; } = "πŸ”’ Internal";
66
public string ThirdPartyFolderName { get; set; } = "πŸ¦„ Third Party";
77
public string CustomFolderName { get; set; } = "πŸ”§ Custom";
8+
public bool OrganiseOnSave { get; set; } = true;
89
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace Umbraco.Community.BackOfficeOrganiser.Models;
2+
3+
public class MediaTypeOptions
4+
{
5+
public bool OrganiseOnSave { get; set; } = true;
6+
}

0 commit comments

Comments
Β (0)