Incremental work on content type events.

This commit is contained in:
Sipke Schoorstra
2014-07-17 00:08:29 -07:00
parent 236ecd2201
commit 63c8bd1101
23 changed files with 427 additions and 75 deletions
@@ -0,0 +1,39 @@
using Orchard.AuditTrail.Services.Models;
using Orchard.ContentManagement.MetaData.Models;
namespace Orchard.AuditTrail.Helpers {
public static class SettingsDictionaryExtensions {
public static DiffDictionary<string, string> GetDiff(this SettingsDictionary oldSettings, SettingsDictionary newSettings) {
var dictionary = new DiffDictionary<string, string>();
BuildDiff(dictionary, newSettings, oldSettings);
BuildDiff(dictionary, oldSettings, newSettings);
return dictionary;
}
private static void BuildDiff(DiffDictionary<string, string> dictionary, SettingsDictionary settingsA, SettingsDictionary settingsB) {
foreach (var settingA in settingsA) {
string oldValue, newValue;
if (settingsB.ContainsKey(settingA.Key)) {
oldValue = settingA.Value;
newValue = settingsB[settingA.Key];
}
else {
oldValue = settingA.Value;
newValue = settingsB[settingA.Key] = default(string);
}
if (oldValue != newValue) {
dictionary[settingA.Key] = new Diff<string> {
NewValue = newValue,
OldValue = oldValue
};
}
}
}
}
}
@@ -103,7 +103,7 @@
<Content Include="Views\AuditTrailEvent-ContentPart-FieldAdded.cshtml" /> <Content Include="Views\AuditTrailEvent-ContentPart-FieldAdded.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentPart-FieldRemoved.cshtml" /> <Content Include="Views\AuditTrailEvent-ContentPart-FieldRemoved.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentPart-FieldSettingsUpdated.cshtml" /> <Content Include="Views\AuditTrailEvent-ContentPart-FieldSettingsUpdated.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentPart-PartSettingsUpdated.cshtml" /> <Content Include="Views\AuditTrailEvent-ContentPart-PartSettingsUpdated.SummaryAdmin.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentPart-Removed.cshtml" /> <Content Include="Views\AuditTrailEvent-ContentPart-Removed.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentType-Created.cshtml" /> <Content Include="Views\AuditTrailEvent-ContentType-Created.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentType-PartAdded.cshtml" /> <Content Include="Views\AuditTrailEvent-ContentType-PartAdded.cshtml" />
@@ -132,6 +132,10 @@
<Content Include="Views\AuditTrailEvent-AuditTrailSettings-EventsChanged.cshtml" /> <Content Include="Views\AuditTrailEvent-AuditTrailSettings-EventsChanged.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentType-TypeDisplayNameUpdated.cshtml" /> <Content Include="Views\AuditTrailEvent-ContentType-TypeDisplayNameUpdated.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentType-TypeSettingsUpdated.cshtml" /> <Content Include="Views\AuditTrailEvent-ContentType-TypeSettingsUpdated.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentType-PartSettingsUpdated.SummaryAdmin.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentType-FieldSettingsUpdated.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentType-FieldSettingsUpdated.SummaryAdmin.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentPart-PartSettingsUpdated.cshtml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\..\Orchard\Orchard.Framework.csproj"> <ProjectReference Include="..\..\..\Orchard\Orchard.Framework.csproj">
@@ -172,6 +176,7 @@
<Compile Include="Handlers\AuditTrailTrimmingSettingsPartHandler.cs" /> <Compile Include="Handlers\AuditTrailTrimmingSettingsPartHandler.cs" />
<Compile Include="Helpers\FiltersExtensions.cs" /> <Compile Include="Helpers\FiltersExtensions.cs" />
<Compile Include="Helpers\DateTimeExtensions.cs" /> <Compile Include="Helpers\DateTimeExtensions.cs" />
<Compile Include="Helpers\SettingsDictionaryExtensions.cs" />
<Compile Include="Helpers\XmlHelper.cs" /> <Compile Include="Helpers\XmlHelper.cs" />
<Compile Include="Helpers\StringExtensions.cs" /> <Compile Include="Helpers\StringExtensions.cs" />
<Compile Include="ImportExport\AuditTrailExportStep.cs" /> <Compile Include="ImportExport\AuditTrailExportStep.cs" />
@@ -196,6 +201,9 @@
<Compile Include="Services\AuditTrailTrimmingBackgroundTask.cs" /> <Compile Include="Services\AuditTrailTrimmingBackgroundTask.cs" />
<Compile Include="Shapes\AuditTrailFilterShapes.cs" /> <Compile Include="Shapes\AuditTrailFilterShapes.cs" />
<Compile Include="Shapes\AuditTrailEventShapeAlteration.cs" /> <Compile Include="Shapes\AuditTrailEventShapeAlteration.cs" />
<Compile Include="Shapes\ContentTypeFieldSettingsUpdatedEventShape.cs" />
<Compile Include="Shapes\ContentPartSettingsUpdatedEventShape.cs" />
<Compile Include="Shapes\ContentTypePartSettingsUpdatedEventShape.cs" />
<Compile Include="Shapes\ContentTypeSettingsUpdatedEventShape.cs" /> <Compile Include="Shapes\ContentTypeSettingsUpdatedEventShape.cs" />
<Compile Include="Shapes\AuditTrailSettingsEventShape.cs" /> <Compile Include="Shapes\AuditTrailSettingsEventShape.cs" />
<Compile Include="Services\Models\Diff.cs" /> <Compile Include="Services\Models\Diff.cs" />
@@ -22,6 +22,7 @@ namespace Orchard.AuditTrail.Providers.ContentDefinition {
public const string TypeDisplayNameUpdated = "TypeDisplayNameUpdated"; public const string TypeDisplayNameUpdated = "TypeDisplayNameUpdated";
public const string TypeSettingsUpdated = "TypeSettingsUpdated"; public const string TypeSettingsUpdated = "TypeSettingsUpdated";
public const string PartSettingsUpdated = "PartSettingsUpdated"; public const string PartSettingsUpdated = "PartSettingsUpdated";
public const string FieldSettingsUpdated = "FieldSettingsUpdated";
public override void Describe(DescribeContext context) { public override void Describe(DescribeContext context) {
context.For("ContentType", T("Content Type")) context.For("ContentType", T("Content Type"))
@@ -31,7 +32,8 @@ namespace Orchard.AuditTrail.Providers.ContentDefinition {
.Event(this, PartRemoved, T("Part removed"), T("A content part was removed from a content type."), enableByDefault: true) .Event(this, PartRemoved, T("Part removed"), T("A content part was removed from a content type."), enableByDefault: true)
.Event(this, TypeDisplayNameUpdated, T("Type display name updated"), T("The display name of a content type was updated."), enableByDefault: true) .Event(this, TypeDisplayNameUpdated, T("Type display name updated"), T("The display name of a content type was updated."), enableByDefault: true)
.Event(this, TypeSettingsUpdated, T("Type settings updated"), T("The settings of a content type were updated."), enableByDefault: true) .Event(this, TypeSettingsUpdated, T("Type settings updated"), T("The settings of a content type were updated."), enableByDefault: true)
.Event(this, PartSettingsUpdated, T("Part settings updated"), T("The settings of a content part on a content type were updated."), enableByDefault: true); .Event(this, PartSettingsUpdated, T("Part settings updated"), T("The settings of a content part on a content type were updated."), enableByDefault: true)
.Event(this, FieldSettingsUpdated, T("Field settings updated"), T("The settings of a content field on a content part on a content type were updated."), enableByDefault: true);
context.QueryFilter(QueryFilter); context.QueryFilter(QueryFilter);
context.DisplayFilter(DisplayFilter); context.DisplayFilter(DisplayFilter);
@@ -1,14 +1,14 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq; using System.Xml.Linq;
using Orchard.AuditTrail.Services; using Orchard.AuditTrail.Services;
using Orchard.ContentManagement;
using Orchard.ContentManagement.MetaData; using Orchard.ContentManagement.MetaData;
using Orchard.ContentManagement.MetaData.Builders; using Orchard.ContentManagement.MetaData.Builders;
using Orchard.ContentManagement.MetaData.Models; using Orchard.ContentManagement.MetaData.Models;
using Orchard.ContentManagement.MetaData.Services; using Orchard.ContentManagement.MetaData.Services;
using Orchard.ContentManagement.ViewModels;
using Orchard.ContentTypes.Services; using Orchard.ContentTypes.Services;
using Orchard.ContentTypes.ViewModels;
using Orchard.Environment.Extensions; using Orchard.Environment.Extensions;
namespace Orchard.AuditTrail.Providers.ContentDefinition { namespace Orchard.AuditTrail.Providers.ContentDefinition {
@@ -17,9 +17,13 @@ namespace Orchard.AuditTrail.Providers.ContentDefinition {
private readonly IAuditTrailManager _auditTrailManager; private readonly IAuditTrailManager _auditTrailManager;
private readonly IWorkContextAccessor _wca; private readonly IWorkContextAccessor _wca;
private readonly IContentDefinitionService _contentDefinitionService; private readonly IContentDefinitionService _contentDefinitionService;
private string _oldContentTypeDisplayName;
private SettingsDictionary _oldContentTypeSettings;
private readonly ISettingsFormatter _settingsFormatter; private readonly ISettingsFormatter _settingsFormatter;
private string _oldContentTypeDisplayName;
private EditTypeViewModel _currentContentType;
private SettingsDictionary _oldContentTypeSettings;
private SettingsDictionary _oldContentTypePartSettings;
private SettingsDictionary _oldContentPartFieldSettings;
private SettingsDictionary _oldPartSettings;
public GlobalContentDefinitionEditorEvents( public GlobalContentDefinitionEditorEvents(
IAuditTrailManager auditTrailManager, IAuditTrailManager auditTrailManager,
@@ -35,6 +39,7 @@ namespace Orchard.AuditTrail.Providers.ContentDefinition {
public override void TypeEditorUpdating(ContentTypeDefinitionBuilder definition) { public override void TypeEditorUpdating(ContentTypeDefinitionBuilder definition) {
var contentType = _contentDefinitionService.GetType(definition.Name); var contentType = _contentDefinitionService.GetType(definition.Name);
_currentContentType = contentType;
_oldContentTypeDisplayName = contentType.DisplayName; _oldContentTypeDisplayName = contentType.DisplayName;
_oldContentTypeSettings = new SettingsDictionary(contentType.Settings); _oldContentTypeSettings = new SettingsDictionary(contentType.Settings);
} }
@@ -64,33 +69,66 @@ namespace Orchard.AuditTrail.Providers.ContentDefinition {
} }
public override void TypePartEditorUpdating(ContentTypePartDefinitionBuilder builder) { public override void TypePartEditorUpdating(ContentTypePartDefinitionBuilder builder) {
// TODO: record current values var contentTypeDefinition = _contentDefinitionService.GetType(builder.TypeName);
var contentPart = contentTypeDefinition.Parts.Single(x => x.PartDefinition.Name == builder.Name);
_oldContentTypePartSettings = contentPart.Settings;
} }
public override void TypePartEditorUpdated(ContentTypePartDefinitionBuilder builder) { public override void TypePartEditorUpdated(ContentTypePartDefinitionBuilder builder) {
// TODO: compare old values with new values. var contentTypePartDefinition = builder.Build();
var eventData = new Dictionary<string, object> { var newSettings = contentTypePartDefinition.Settings;
{"ContentPartName", builder.Name},
{"ContentTypeName", builder.TypeName} if (!AreEqual(newSettings, _oldContentTypePartSettings)) {
}; var eventData = new Dictionary<string, object> {
RecordContentTypeAuditTrail(ContentTypeAuditTrailEventProvider.PartSettingsUpdated, eventData, builder.TypeName); {"ContentPartName", builder.Name},
{"ContentTypeName", builder.TypeName},
{"OldSettings", ToXml(_oldContentTypePartSettings)},
{"NewSettings", ToXml(newSettings)}
};
RecordContentTypeAuditTrail(ContentTypeAuditTrailEventProvider.PartSettingsUpdated, eventData, builder.TypeName);
}
} }
//public override void PartEditorUpdated(ContentPartDefinitionBuilder builder) { public override void PartFieldEditorUpdating(ContentPartFieldDefinitionBuilder builder) {
// var eventData = new Dictionary<string, object> { var contentPart = _contentDefinitionService.GetPart(builder.PartName);
// {"ContentPartName", builder.Name} var contentField = contentPart.Fields.Single(x => x.Name == builder.Name);
// }; _oldContentPartFieldSettings = contentField.Settings;
// RecordContentPartAuditTrail(ContentPartAuditTrailEventProvider.PartSettingsUpdated, eventData, builder.Name); }
//}
//public override void PartFieldEditorUpdated(ContentPartFieldDefinitionBuilder builder) { public override void PartFieldEditorUpdated(ContentPartFieldDefinitionBuilder builder) {
// var eventData = new Dictionary<string, object> { var contentPartFieldDefinition = builder.Build();
// {"ContentFieldName", builder.Name}, var newSettings = contentPartFieldDefinition.Settings;
// {"ContentFieldType", builder.FieldType},
// {"ContentPartName", builder.PartName} if (!AreEqual(newSettings, _oldContentPartFieldSettings)) {
// }; var eventData = new Dictionary<string, object> {
// RecordContentPartAuditTrail(ContentPartAuditTrailEventProvider.FieldSettingsUpdated, eventData, builder.PartName); {"ContentFieldName", builder.Name},
//} {"ContentPartName", builder.PartName},
{"ContentTypeName", _currentContentType.Name},
{"OldSettings", ToXml(_oldContentPartFieldSettings)},
{"NewSettings", ToXml(newSettings)}
};
RecordContentTypeAuditTrail(ContentTypeAuditTrailEventProvider.FieldSettingsUpdated, eventData, _currentContentType.Name);
}
}
public override void PartEditorUpdating(ContentPartDefinitionBuilder builder) {
var contentPart = _contentDefinitionService.GetPart(builder.Name);
_oldPartSettings = contentPart.Settings;
}
public override void PartEditorUpdated(ContentPartDefinitionBuilder builder) {
var contentPartDefinition = builder.Build();
var newSettings = contentPartDefinition.Settings;
if (!AreEqual(newSettings, _oldPartSettings)) {
var eventData = new Dictionary<string, object> {
{"ContentPartName", builder.Name},
{"OldSettings", ToXml(_oldPartSettings)},
{"NewSettings", ToXml(newSettings)}
};
RecordContentPartAuditTrail(ContentPartAuditTrailEventProvider.PartSettingsUpdated, eventData, builder.Name);
}
}
private void RecordContentTypeAuditTrail(string eventName, IDictionary<string, object> eventData, string contentTypeName) { private void RecordContentTypeAuditTrail(string eventName, IDictionary<string, object> eventData, string contentTypeName) {
_auditTrailManager.CreateRecord<ContentTypeAuditTrailEventProvider>(eventName, _wca.GetContext().CurrentUser, properties: null, eventData: eventData, eventFilterKey: "contenttype", eventFilterData: contentTypeName); _auditTrailManager.CreateRecord<ContentTypeAuditTrailEventProvider>(eventName, _wca.GetContext().CurrentUser, properties: null, eventData: eventData, eventFilterKey: "contenttype", eventFilterData: contentTypeName);
@@ -0,0 +1,29 @@
using System.Collections.Generic;
using Orchard.AuditTrail.Helpers;
using Orchard.AuditTrail.Providers.ContentDefinition;
using Orchard.ContentManagement.MetaData.Services;
using Orchard.DisplayManagement.Implementation;
namespace Orchard.AuditTrail.Shapes {
public class ContentPartSettingsUpdatedEventShape : AuditTrailEventShapeAlteration<ContentPartAuditTrailEventProvider> {
private readonly ISettingsFormatter _settingsFormatter;
public ContentPartSettingsUpdatedEventShape(ISettingsFormatter settingsFormatter) {
_settingsFormatter = settingsFormatter;
}
protected override string EventName {
get { return ContentPartAuditTrailEventProvider.PartSettingsUpdated; }
}
protected override void OnAlterShape(ShapeDisplayingContext context) {
var eventData = (IDictionary<string, object>)context.Shape.EventData;
var oldSettings = _settingsFormatter.Map(XmlHelper.Parse((string)eventData["OldSettings"]));
var newSettings = _settingsFormatter.Map(XmlHelper.Parse((string)eventData["NewSettings"]));
var diff = oldSettings.GetDiff(newSettings);
context.Shape.OldSettings = oldSettings;
context.Shape.NewSettings = newSettings;
context.Shape.Diff = diff;
}
}
}
@@ -0,0 +1,29 @@
using System.Collections.Generic;
using Orchard.AuditTrail.Helpers;
using Orchard.AuditTrail.Providers.ContentDefinition;
using Orchard.ContentManagement.MetaData.Services;
using Orchard.DisplayManagement.Implementation;
namespace Orchard.AuditTrail.Shapes {
public class ContentTypeFieldSettingsUpdatedEventShape : AuditTrailEventShapeAlteration<ContentTypeAuditTrailEventProvider> {
private readonly ISettingsFormatter _settingsFormatter;
public ContentTypeFieldSettingsUpdatedEventShape(ISettingsFormatter settingsFormatter) {
_settingsFormatter = settingsFormatter;
}
protected override string EventName {
get { return ContentTypeAuditTrailEventProvider.FieldSettingsUpdated; }
}
protected override void OnAlterShape(ShapeDisplayingContext context) {
var eventData = (IDictionary<string, object>)context.Shape.EventData;
var oldSettings = _settingsFormatter.Map(XmlHelper.Parse((string)eventData["OldSettings"]));
var newSettings = _settingsFormatter.Map(XmlHelper.Parse((string)eventData["NewSettings"]));
var diff = oldSettings.GetDiff(newSettings);
context.Shape.OldSettings = oldSettings;
context.Shape.NewSettings = newSettings;
context.Shape.Diff = diff;
}
}
}
@@ -0,0 +1,29 @@
using System.Collections.Generic;
using Orchard.AuditTrail.Helpers;
using Orchard.AuditTrail.Providers.ContentDefinition;
using Orchard.ContentManagement.MetaData.Services;
using Orchard.DisplayManagement.Implementation;
namespace Orchard.AuditTrail.Shapes {
public class ContentTypePartSettingsUpdatedEventShape : AuditTrailEventShapeAlteration<ContentTypeAuditTrailEventProvider> {
private readonly ISettingsFormatter _settingsFormatter;
public ContentTypePartSettingsUpdatedEventShape(ISettingsFormatter settingsFormatter) {
_settingsFormatter = settingsFormatter;
}
protected override string EventName {
get { return ContentTypeAuditTrailEventProvider.PartSettingsUpdated; }
}
protected override void OnAlterShape(ShapeDisplayingContext context) {
var eventData = (IDictionary<string, object>)context.Shape.EventData;
var oldSettings = _settingsFormatter.Map(XmlHelper.Parse((string)eventData["OldSettings"]));
var newSettings = _settingsFormatter.Map(XmlHelper.Parse((string)eventData["NewSettings"]));
var diff = oldSettings.GetDiff(newSettings);
context.Shape.OldSettings = oldSettings;
context.Shape.NewSettings = newSettings;
context.Shape.Diff = diff;
}
}
}
@@ -1,8 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using Orchard.AuditTrail.Helpers; using Orchard.AuditTrail.Helpers;
using Orchard.AuditTrail.Providers.ContentDefinition; using Orchard.AuditTrail.Providers.ContentDefinition;
using Orchard.AuditTrail.Services.Models;
using Orchard.ContentManagement.MetaData.Models;
using Orchard.ContentManagement.MetaData.Services; using Orchard.ContentManagement.MetaData.Services;
using Orchard.DisplayManagement.Implementation; using Orchard.DisplayManagement.Implementation;
@@ -21,34 +19,11 @@ namespace Orchard.AuditTrail.Shapes {
var eventData = (IDictionary<string, object>)context.Shape.EventData; var eventData = (IDictionary<string, object>)context.Shape.EventData;
var oldSettings = _settingsFormatter.Map(XmlHelper.Parse((string)eventData["OldSettings"])); var oldSettings = _settingsFormatter.Map(XmlHelper.Parse((string)eventData["OldSettings"]));
var newSettings = _settingsFormatter.Map(XmlHelper.Parse((string)eventData["NewSettings"])); var newSettings = _settingsFormatter.Map(XmlHelper.Parse((string)eventData["NewSettings"]));
var diff = GetDiff(oldSettings, newSettings); var diff = oldSettings.GetDiff(newSettings);
context.Shape.OldSettings = oldSettings; context.Shape.OldSettings = oldSettings;
context.Shape.NewSettings = newSettings; context.Shape.NewSettings = newSettings;
context.Shape.Diff = diff; context.Shape.Diff = diff;
} }
private static DiffDictionary<string, string> GetDiff(SettingsDictionary oldSettings, SettingsDictionary newSettings) {
var dictionary = new DiffDictionary<string, string>();
BuildDiff(dictionary, newSettings, oldSettings);
BuildDiff(dictionary, oldSettings, newSettings);
return dictionary;
}
private static void BuildDiff(DiffDictionary<string, string> dictionary, SettingsDictionary settingsA, SettingsDictionary settingsB) {
foreach (var settingA in settingsB) {
var b = settingsA.ContainsKey(settingA.Key) ? settingsA[settingA.Key] : default(string);
if (b != settingA.Value) {
dictionary[settingA.Key] = new Diff<string> {
NewValue = settingA.Value,
OldValue = b
};
}
}
}
} }
} }
@@ -14,4 +14,13 @@ section.audittrail-contenttype-event table.items {
section.audittrail-contenttype-event table.items thead th { section.audittrail-contenttype-event table.items thead th {
font-weight: bold; font-weight: bold;
}
section.audittrail-contenttype-event ul {
list-style-type: square;
margin-left: 1.5em;
}
section.audittrail-contenttype-event ul li {
padding-left: 0.5em;
} }
@@ -0,0 +1,25 @@
@using Orchard.AuditTrail.Helpers
@using Orchard.AuditTrail.Services.Models
@{
Style.Include("audittrail-contenttype-event.css");
}
@functions {
string ToFriendlyEmpty(string value) {
return String.IsNullOrWhiteSpace(value) ? Html.Encode(T("<empty>").Text) : value;
}
}
@{
var eventData = (IDictionary<string, object>)Model.EventData;
var contentPartName = eventData.Get<string>("ContentPartName");
var diff = (DiffDictionary<string, string>)Model.Diff;
}
<section class="audittrail-contenttype-event">
<div>@T("Settings for <strong>{0}</strong> were updated:", contentPartName)</div>
<ul>
@foreach (var setting in diff) {
<li>
@T("<strong>{0}</strong> was changed from <strong>{1}</strong> to <strong>{2}</strong>.", setting.Key, ToFriendlyEmpty(setting.Value.OldValue), ToFriendlyEmpty(setting.Value.NewValue))
</li>
}
</ul>
</section>
@@ -1,9 +1,36 @@
@using Orchard.AuditTrail.Helpers @using Orchard.AuditTrail.Helpers
@using Orchard.AuditTrail.Services.Models
@{ @{
var eventData = (IDictionary<string, object>) Model.EventData; Style.Include("audittrail-contenttype-event.css");
var contentPartName = eventData.Get<string>("ContentPartName");
} }
@functions {
<section class="audittrail-contentpart-summary"> string ToFriendlyEmpty(string value) {
@T("Settings for the <strong>{0}</strong> content part were updated.", contentPartName) return String.IsNullOrWhiteSpace(value) ? Html.Encode(T("<empty>").Text) : value;
}
}
@{
var eventData = (IDictionary<string, object>)Model.EventData;
var contentPartName = eventData.Get<string>("ContentPartName");
var diff = (DiffDictionary<string, string>)Model.Diff;
}
<section class="audittrail-contenttype-event">
<h2>@T("Settings for <strong>{0}</strong> were updated:", contentPartName)</h2>
<table class="items">
<thead>
<tr>
<th>@T("Setting")</th>
<th>@T("From")</th>
<th>@T("To")</th>
</tr>
</thead>
<tbody class="audittrail-category">
@foreach (var setting in diff) {
<tr>
<td>@setting.Key</td>
<td>@ToFriendlyEmpty(setting.Value.OldValue)</td>
<td>@ToFriendlyEmpty(setting.Value.NewValue)</td>
</tr>
}
</tbody>
</table>
</section> </section>
@@ -0,0 +1,29 @@
@using Orchard.AuditTrail.Helpers
@using Orchard.AuditTrail.Services.Models
@{
Style.Include("audittrail-contenttype-event.css");
}
@functions {
string ToFriendlyEmpty(string value) {
return String.IsNullOrWhiteSpace(value) ? Html.Encode(T("<empty>").Text) : value;
}
}
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var contentTypeName = eventData.Get<string>("ContentTypeName");
var contentPartName = eventData.Get<string>("ContentPartName");
var contentFieldName = eventData.Get<string>("ContentFieldName");
var diff = (DiffDictionary<string, string>)Model.Diff;
var isImplicitPart = contentTypeName == contentPartName;
var captionTemplate = isImplicitPart ? "Settings for <strong>{0}</strong> attached the <strong>{1}</strong> content type were updated:" : "Settings for <strong>{0}</strong> attached to <strong>{1}</strong> of the <strong>{2}</strong> content type were updated:";
}
<section class="audittrail-contenttype-event">
<div>@T(captionTemplate, contentFieldName, contentPartName, contentTypeName)</div>
<ul>
@foreach (var setting in diff) {
<li>
@T("<strong>{0}</strong> was changed from <strong>{1}</strong> to <strong>{2}</strong>.", setting.Key, ToFriendlyEmpty(setting.Value.OldValue), ToFriendlyEmpty(setting.Value.NewValue))
</li>
}
</ul>
</section>
@@ -0,0 +1,40 @@
@using Orchard.AuditTrail.Helpers
@using Orchard.AuditTrail.Services.Models
@{
Style.Include("audittrail-contenttype-event.css");
}
@functions {
string ToFriendlyEmpty(string value) {
return String.IsNullOrWhiteSpace(value) ? T("<empty>").Text : value;
}
}
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var contentTypeName = eventData.Get<string>("ContentTypeName");
var contentPartName = eventData.Get<string>("ContentPartName");
var contentFieldName = eventData.Get<string>("ContentFieldName");
var diff = (DiffDictionary<string, string>)Model.Diff;
var isImplicitPart = contentTypeName == contentPartName;
var captionTemplate = isImplicitPart ? "Settings for <strong>{0}</strong> attached the <strong>{1}</strong> content type were updated:" : "Settings for <strong>{0}</strong> attached to <strong>{1}</strong> of the <strong>{2}</strong> content type were updated:";
}
<section class="audittrail-contenttype-event">
<h2>@T(captionTemplate, contentFieldName, contentPartName, contentTypeName)</h2>
<table class="items">
<thead>
<tr>
<th>@T("Setting")</th>
<th>@T("From")</th>
<th>@T("To")</th>
</tr>
</thead>
<tbody class="audittrail-category">
@foreach (var setting in diff) {
<tr>
<td>@setting.Key</td>
<td>@ToFriendlyEmpty(setting.Value.OldValue)</td>
<td>@ToFriendlyEmpty(setting.Value.NewValue)</td>
</tr>
}
</tbody>
</table>
</section>
@@ -0,0 +1,26 @@
@using Orchard.AuditTrail.Helpers
@using Orchard.AuditTrail.Services.Models
@{
Style.Include("audittrail-contenttype-event.css");
}
@functions {
string ToFriendlyEmpty(string value) {
return String.IsNullOrWhiteSpace(value) ? Html.Encode(T("<empty>").Text) : value;
}
}
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var contentTypeName = eventData.Get<string>("ContentTypeName");
var contentPartName = eventData.Get<string>("ContentPartName");
var diff = (DiffDictionary<string, string>)Model.Diff;
}
<section class="audittrail-contenttype-event">
<div>@T("Settings for <strong>{0}</strong> attached to the <strong>{1}</strong> content type were updated:", contentPartName, contentTypeName)</div>
<ul>
@foreach (var setting in diff) {
<li>
@T("<strong>{0}</strong> was changed from <strong>{1}</strong> to <strong>{2}</strong>.", setting.Key, ToFriendlyEmpty(setting.Value.OldValue), ToFriendlyEmpty(setting.Value.NewValue))
</li>
}
</ul>
</section>
@@ -1,10 +1,37 @@
@using Orchard.AuditTrail.Helpers @using Orchard.AuditTrail.Helpers
@using Orchard.AuditTrail.Services.Models
@{
Style.Include("audittrail-contenttype-event.css");
}
@functions {
string ToFriendlyEmpty(string value) {
return String.IsNullOrWhiteSpace(value) ? Html.Encode(T("<empty>").Text) : value;
}
}
@{ @{
var eventData = (IDictionary<string, object>) Model.EventData; var eventData = (IDictionary<string, object>) Model.EventData;
var contentTypeName = eventData.Get<string>("ContentTypeName"); var contentTypeName = eventData.Get<string>("ContentTypeName");
var contentPartName = eventData.Get<string>("ContentPartName"); var contentPartName = eventData.Get<string>("ContentPartName");
var diff = (DiffDictionary<string, string>)Model.Diff;
} }
<section class="audittrail-contenttype-event">
<section class="audittrail-contenttype-summary"> <h2>@T("Settings for <strong>{0}</strong> attached to the <strong>{1}</strong> content type were updated:", contentPartName, contentTypeName)</h2>
@T("Settings for the <strong>{0}</strong> content part attached to the <strong>{1}</strong> content type were updated.", contentPartName, contentTypeName) <table class="items">
<thead>
<tr>
<th>@T("Setting")</th>
<th>@T("From")</th>
<th>@T("To")</th>
</tr>
</thead>
<tbody class="audittrail-category">
@foreach (var setting in diff) {
<tr>
<td>@setting.Key</td>
<td>@ToFriendlyEmpty(setting.Value.OldValue)</td>
<td>@ToFriendlyEmpty(setting.Value.NewValue)</td>
</tr>
}
</tbody>
</table>
</section> </section>
@@ -1,18 +1,26 @@
@using Orchard.AuditTrail.Helpers @using Orchard.AuditTrail.Helpers
@using Orchard.AuditTrail.Services.Models @using Orchard.AuditTrail.Services.Models
@{
Style.Include("audittrail-contenttype-event.css");
}
@functions { @functions {
string ToFriendlyEmpty(string value) { string ToFriendlyEmpty(string value) {
return String.IsNullOrWhiteSpace(value) ? Html.Encode("<empty>") : value; return String.IsNullOrWhiteSpace(value) ? Html.Encode(T("<empty>").Text) : value;
} }
} }
@{ @{
var eventData = (IDictionary<string, object>) Model.EventData; var eventData = (IDictionary<string, object>) Model.EventData;
var contentTypeName = eventData.Get<string>("ContentTypeName"); var contentTypeName = eventData.Get<string>("ContentTypeName");
var diff = (DiffDictionary<string, string>) Model.Diff; var diff = (DiffDictionary<string, string>) Model.Diff;
var descriptions = String.Join("<br/>", diff.Select(x => T("<strong>{0}</strong> was changed from <strong>{1}</strong> to <strong>{2}</strong>.", x.Key, ToFriendlyEmpty(x.Value.OldValue), ToFriendlyEmpty(x.Value.NewValue)).Text));
} }
<section> <section class="audittrail-contenttype-event">
@T("The following <strong>{0}</strong> settings were changed:", contentTypeName)<br/> @T("The following <strong>{0}</strong> settings were changed:", contentTypeName)<br />
@Html.Raw(descriptions) <ul>
@foreach (var setting in diff) {
<li>
@T("<strong>{0}</strong> was changed from <strong>{1}</strong> to <strong>{2}</strong>.", setting.Key, ToFriendlyEmpty(setting.Value.OldValue), ToFriendlyEmpty(setting.Value.NewValue))
</li>
}
</ul>
</section> </section>
@@ -11,7 +11,7 @@
@{ @{
var eventData = (IDictionary<string, object>) Model.EventData; var eventData = (IDictionary<string, object>) Model.EventData;
var contentTypeName = eventData.Get<string>("ContentTypeName"); var contentTypeName = eventData.Get<string>("ContentTypeName");
var differences = (DiffDictionary<string, string>) Model.Diff; var diff = (DiffDictionary<string, string>) Model.Diff;
} }
<section class="audittrail-contenttype-event"> <section class="audittrail-contenttype-event">
<h2>@T("The following <strong>{0}</strong> settings were changed", contentTypeName)</h2> <h2>@T("The following <strong>{0}</strong> settings were changed", contentTypeName)</h2>
@@ -24,11 +24,11 @@
</tr> </tr>
</thead> </thead>
<tbody class="audittrail-category"> <tbody class="audittrail-category">
@foreach (var diff in differences) { @foreach (var setting in diff) {
<tr> <tr>
<td>@diff.Key</td> <td>@setting.Key</td>
<td>@ToFriendlyEmpty(diff.Value.OldValue)</td> <td>@ToFriendlyEmpty(setting.Value.OldValue)</td>
<td>@ToFriendlyEmpty(diff.Value.NewValue)</td> <td>@ToFriendlyEmpty(setting.Value.NewValue)</td>
</tr> </tr>
} }
</tbody> </tbody>
@@ -621,8 +621,14 @@ namespace Orchard.ContentTypes.Controllers {
return HttpNotFound(); return HttpNotFound();
} }
field.DisplayName = viewModel.DisplayName; _contentDefinitionManager.AlterPartDefinition(partViewModel.Name, partBuilder => {
_contentDefinitionManager.StorePartDefinition(partViewModel._Definition); partBuilder.WithField(viewModel.Name, fieldBuilder => {
fieldBuilder.WithDisplayName(viewModel.DisplayName);
});
});
//field.DisplayName = viewModel.DisplayName;
//_contentDefinitionManager.StorePartDefinition(partViewModel._Definition);
Services.Notifier.Information(T("Display name changed to {0}.", viewModel.DisplayName)); Services.Notifier.Information(T("Display name changed to {0}.", viewModel.DisplayName));
@@ -245,7 +245,9 @@ namespace Orchard.ContentTypes.Services {
public void AlterPart(EditPartViewModel partViewModel, IUpdateModel updateModel) { public void AlterPart(EditPartViewModel partViewModel, IUpdateModel updateModel) {
var updater = new Updater(updateModel); var updater = new Updater(updateModel);
_contentDefinitionManager.AlterPartDefinition(partViewModel.Name, partBuilder => { _contentDefinitionManager.AlterPartDefinition(partViewModel.Name, partBuilder => {
_contentDefinitionEditorEvents.PartEditorUpdating(partBuilder);
partViewModel.Templates = _contentDefinitionEditorEvents.PartEditorUpdate(partBuilder, updater); partViewModel.Templates = _contentDefinitionEditorEvents.PartEditorUpdate(partBuilder, updater);
_contentDefinitionEditorEvents.PartEditorUpdated(partBuilder);
}); });
} }
@@ -86,7 +86,7 @@ namespace Orchard.ContentManagement.MetaData.Builders {
_partDefinition = part; _partDefinition = part;
} }
public ContentPartFieldDefinition Build() { public override ContentPartFieldDefinition Build() {
return new ContentPartFieldDefinition(_fieldDefinition, _fieldName, _settings); return new ContentPartFieldDefinition(_fieldDefinition, _fieldName, _settings);
} }
@@ -25,5 +25,7 @@ namespace Orchard.ContentManagement.MetaData.Builders {
public abstract ContentPartFieldDefinitionBuilder OfType(ContentFieldDefinition fieldDefinition); public abstract ContentPartFieldDefinitionBuilder OfType(ContentFieldDefinition fieldDefinition);
public abstract ContentPartFieldDefinitionBuilder OfType(string fieldType); public abstract ContentPartFieldDefinitionBuilder OfType(string fieldType);
public abstract ContentPartFieldDefinition Build();
} }
} }
@@ -86,7 +86,7 @@ namespace Orchard.ContentManagement.MetaData.Builders {
_partDefinition = part.PartDefinition; _partDefinition = part.PartDefinition;
} }
public ContentTypePartDefinition Build() { public override ContentTypePartDefinition Build() {
return new ContentTypePartDefinition(_partDefinition, _settings); return new ContentTypePartDefinition(_partDefinition, _settings);
} }
} }
@@ -18,5 +18,7 @@ namespace Orchard.ContentManagement.MetaData.Builders {
_settings[name] = value; _settings[name] = value;
return this; return this;
} }
public abstract ContentTypePartDefinition Build();
} }
} }