diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/SettingsDictionaryExtensions.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/SettingsDictionaryExtensions.cs new file mode 100644 index 000000000..4225c915e --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/SettingsDictionaryExtensions.cs @@ -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 GetDiff(this SettingsDictionary oldSettings, SettingsDictionary newSettings) { + var dictionary = new DiffDictionary(); + + BuildDiff(dictionary, newSettings, oldSettings); + BuildDiff(dictionary, oldSettings, newSettings); + + return dictionary; + } + + private static void BuildDiff(DiffDictionary 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 { + NewValue = newValue, + OldValue = oldValue + }; + } + } + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj b/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj index d7779269f..d4c5d67a7 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj @@ -103,7 +103,7 @@ - + @@ -132,6 +132,10 @@ + + + + @@ -172,6 +176,7 @@ + @@ -196,6 +201,9 @@ + + + diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/ContentTypeAuditTrailEventProvider.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/ContentTypeAuditTrailEventProvider.cs index 2ecf9ee52..14f47b509 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/ContentTypeAuditTrailEventProvider.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/ContentTypeAuditTrailEventProvider.cs @@ -22,6 +22,7 @@ namespace Orchard.AuditTrail.Providers.ContentDefinition { public const string TypeDisplayNameUpdated = "TypeDisplayNameUpdated"; public const string TypeSettingsUpdated = "TypeSettingsUpdated"; public const string PartSettingsUpdated = "PartSettingsUpdated"; + public const string FieldSettingsUpdated = "FieldSettingsUpdated"; public override void Describe(DescribeContext context) { 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, 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, 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.DisplayFilter(DisplayFilter); diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/GlobalContentDefinitionEditorEvents.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/GlobalContentDefinitionEditorEvents.cs index d5ef2dda3..fddd6db9a 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/GlobalContentDefinitionEditorEvents.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/ContentDefinition/GlobalContentDefinitionEditorEvents.cs @@ -1,14 +1,14 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Xml.Linq; using Orchard.AuditTrail.Services; -using Orchard.ContentManagement; using Orchard.ContentManagement.MetaData; using Orchard.ContentManagement.MetaData.Builders; using Orchard.ContentManagement.MetaData.Models; using Orchard.ContentManagement.MetaData.Services; -using Orchard.ContentManagement.ViewModels; using Orchard.ContentTypes.Services; +using Orchard.ContentTypes.ViewModels; using Orchard.Environment.Extensions; namespace Orchard.AuditTrail.Providers.ContentDefinition { @@ -17,9 +17,13 @@ namespace Orchard.AuditTrail.Providers.ContentDefinition { private readonly IAuditTrailManager _auditTrailManager; private readonly IWorkContextAccessor _wca; private readonly IContentDefinitionService _contentDefinitionService; - private string _oldContentTypeDisplayName; - private SettingsDictionary _oldContentTypeSettings; private readonly ISettingsFormatter _settingsFormatter; + private string _oldContentTypeDisplayName; + private EditTypeViewModel _currentContentType; + private SettingsDictionary _oldContentTypeSettings; + private SettingsDictionary _oldContentTypePartSettings; + private SettingsDictionary _oldContentPartFieldSettings; + private SettingsDictionary _oldPartSettings; public GlobalContentDefinitionEditorEvents( IAuditTrailManager auditTrailManager, @@ -35,6 +39,7 @@ namespace Orchard.AuditTrail.Providers.ContentDefinition { public override void TypeEditorUpdating(ContentTypeDefinitionBuilder definition) { var contentType = _contentDefinitionService.GetType(definition.Name); + _currentContentType = contentType; _oldContentTypeDisplayName = contentType.DisplayName; _oldContentTypeSettings = new SettingsDictionary(contentType.Settings); } @@ -64,33 +69,66 @@ namespace Orchard.AuditTrail.Providers.ContentDefinition { } 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) { - // TODO: compare old values with new values. - var eventData = new Dictionary { - {"ContentPartName", builder.Name}, - {"ContentTypeName", builder.TypeName} - }; - RecordContentTypeAuditTrail(ContentTypeAuditTrailEventProvider.PartSettingsUpdated, eventData, builder.TypeName); + var contentTypePartDefinition = builder.Build(); + var newSettings = contentTypePartDefinition.Settings; + + if (!AreEqual(newSettings, _oldContentTypePartSettings)) { + var eventData = new Dictionary { + {"ContentPartName", builder.Name}, + {"ContentTypeName", builder.TypeName}, + {"OldSettings", ToXml(_oldContentTypePartSettings)}, + {"NewSettings", ToXml(newSettings)} + }; + RecordContentTypeAuditTrail(ContentTypeAuditTrailEventProvider.PartSettingsUpdated, eventData, builder.TypeName); + } } - //public override void PartEditorUpdated(ContentPartDefinitionBuilder builder) { - // var eventData = new Dictionary { - // {"ContentPartName", builder.Name} - // }; - // RecordContentPartAuditTrail(ContentPartAuditTrailEventProvider.PartSettingsUpdated, eventData, builder.Name); - //} + public override void PartFieldEditorUpdating(ContentPartFieldDefinitionBuilder builder) { + var contentPart = _contentDefinitionService.GetPart(builder.PartName); + var contentField = contentPart.Fields.Single(x => x.Name == builder.Name); + _oldContentPartFieldSettings = contentField.Settings; + } - //public override void PartFieldEditorUpdated(ContentPartFieldDefinitionBuilder builder) { - // var eventData = new Dictionary { - // {"ContentFieldName", builder.Name}, - // {"ContentFieldType", builder.FieldType}, - // {"ContentPartName", builder.PartName} - // }; - // RecordContentPartAuditTrail(ContentPartAuditTrailEventProvider.FieldSettingsUpdated, eventData, builder.PartName); - //} + public override void PartFieldEditorUpdated(ContentPartFieldDefinitionBuilder builder) { + var contentPartFieldDefinition = builder.Build(); + var newSettings = contentPartFieldDefinition.Settings; + + if (!AreEqual(newSettings, _oldContentPartFieldSettings)) { + var eventData = new Dictionary { + {"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 { + {"ContentPartName", builder.Name}, + {"OldSettings", ToXml(_oldPartSettings)}, + {"NewSettings", ToXml(newSettings)} + }; + RecordContentPartAuditTrail(ContentPartAuditTrailEventProvider.PartSettingsUpdated, eventData, builder.Name); + } + } private void RecordContentTypeAuditTrail(string eventName, IDictionary eventData, string contentTypeName) { _auditTrailManager.CreateRecord(eventName, _wca.GetContext().CurrentUser, properties: null, eventData: eventData, eventFilterKey: "contenttype", eventFilterData: contentTypeName); diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Shapes/ContentPartSettingsUpdatedEventShape.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Shapes/ContentPartSettingsUpdatedEventShape.cs new file mode 100644 index 000000000..348b752c1 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Shapes/ContentPartSettingsUpdatedEventShape.cs @@ -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 { + 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)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; + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Shapes/ContentTypeFieldSettingsUpdatedEventShape.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Shapes/ContentTypeFieldSettingsUpdatedEventShape.cs new file mode 100644 index 000000000..a3ea08f16 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Shapes/ContentTypeFieldSettingsUpdatedEventShape.cs @@ -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 { + 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)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; + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Shapes/ContentTypePartSettingsUpdatedEventShape.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Shapes/ContentTypePartSettingsUpdatedEventShape.cs new file mode 100644 index 000000000..cb3554a5c --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Shapes/ContentTypePartSettingsUpdatedEventShape.cs @@ -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 { + 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)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; + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Shapes/ContentTypeSettingsUpdatedEventShape.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Shapes/ContentTypeSettingsUpdatedEventShape.cs index 0606fe42e..e01fa8de0 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Shapes/ContentTypeSettingsUpdatedEventShape.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Shapes/ContentTypeSettingsUpdatedEventShape.cs @@ -1,8 +1,6 @@ using System.Collections.Generic; using Orchard.AuditTrail.Helpers; using Orchard.AuditTrail.Providers.ContentDefinition; -using Orchard.AuditTrail.Services.Models; -using Orchard.ContentManagement.MetaData.Models; using Orchard.ContentManagement.MetaData.Services; using Orchard.DisplayManagement.Implementation; @@ -21,34 +19,11 @@ namespace Orchard.AuditTrail.Shapes { var eventData = (IDictionary)context.Shape.EventData; var oldSettings = _settingsFormatter.Map(XmlHelper.Parse((string)eventData["OldSettings"])); 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.NewSettings = newSettings; context.Shape.Diff = diff; } - - private static DiffDictionary GetDiff(SettingsDictionary oldSettings, SettingsDictionary newSettings) { - var dictionary = new DiffDictionary(); - - BuildDiff(dictionary, newSettings, oldSettings); - BuildDiff(dictionary, oldSettings, newSettings); - - return dictionary; - } - - private static void BuildDiff(DiffDictionary 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 { - NewValue = settingA.Value, - OldValue = b - }; - } - } - } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Styles/audittrail-contenttype-event.css b/src/Orchard.Web/Modules/Orchard.AuditTrail/Styles/audittrail-contenttype-event.css index 08b085fd7..819cdf65d 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Styles/audittrail-contenttype-event.css +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Styles/audittrail-contenttype-event.css @@ -14,4 +14,13 @@ section.audittrail-contenttype-event table.items { section.audittrail-contenttype-event table.items thead th { 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; } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-PartSettingsUpdated.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-PartSettingsUpdated.SummaryAdmin.cshtml new file mode 100644 index 000000000..8ba2ea59e --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-PartSettingsUpdated.SummaryAdmin.cshtml @@ -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("").Text) : value; + } +} +@{ + var eventData = (IDictionary)Model.EventData; + var contentPartName = eventData.Get("ContentPartName"); + var diff = (DiffDictionary)Model.Diff; +} +
+
@T("Settings for {0} were updated:", contentPartName)
+
    + @foreach (var setting in diff) { +
  • + @T("{0} was changed from {1} to {2}.", setting.Key, ToFriendlyEmpty(setting.Value.OldValue), ToFriendlyEmpty(setting.Value.NewValue)) +
  • + } +
+
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-PartSettingsUpdated.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-PartSettingsUpdated.cshtml index d22fcf49a..b6935237e 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-PartSettingsUpdated.cshtml +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentPart-PartSettingsUpdated.cshtml @@ -1,9 +1,36 @@ @using Orchard.AuditTrail.Helpers +@using Orchard.AuditTrail.Services.Models @{ - var eventData = (IDictionary) Model.EventData; - var contentPartName = eventData.Get("ContentPartName"); + Style.Include("audittrail-contenttype-event.css"); } - -
- @T("Settings for the {0} content part were updated.", contentPartName) +@functions { + string ToFriendlyEmpty(string value) { + return String.IsNullOrWhiteSpace(value) ? Html.Encode(T("").Text) : value; + } +} +@{ + var eventData = (IDictionary)Model.EventData; + var contentPartName = eventData.Get("ContentPartName"); + var diff = (DiffDictionary)Model.Diff; +} +
+

@T("Settings for {0} were updated:", contentPartName)

+ + + + + + + + + + @foreach (var setting in diff) { + + + + + + } + +
@T("Setting")@T("From")@T("To")
@setting.Key@ToFriendlyEmpty(setting.Value.OldValue)@ToFriendlyEmpty(setting.Value.NewValue)
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-FieldSettingsUpdated.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-FieldSettingsUpdated.SummaryAdmin.cshtml new file mode 100644 index 000000000..7d6b42398 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-FieldSettingsUpdated.SummaryAdmin.cshtml @@ -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("").Text) : value; + } +} +@{ + var eventData = (IDictionary) Model.EventData; + var contentTypeName = eventData.Get("ContentTypeName"); + var contentPartName = eventData.Get("ContentPartName"); + var contentFieldName = eventData.Get("ContentFieldName"); + var diff = (DiffDictionary)Model.Diff; + var isImplicitPart = contentTypeName == contentPartName; + var captionTemplate = isImplicitPart ? "Settings for {0} attached the {1} content type were updated:" : "Settings for {0} attached to {1} of the {2} content type were updated:"; +} +
+
@T(captionTemplate, contentFieldName, contentPartName, contentTypeName)
+
    + @foreach (var setting in diff) { +
  • + @T("{0} was changed from {1} to {2}.", setting.Key, ToFriendlyEmpty(setting.Value.OldValue), ToFriendlyEmpty(setting.Value.NewValue)) +
  • + } +
+
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-FieldSettingsUpdated.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-FieldSettingsUpdated.cshtml new file mode 100644 index 000000000..27bce0b92 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-FieldSettingsUpdated.cshtml @@ -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("").Text : value; + } +} +@{ + var eventData = (IDictionary) Model.EventData; + var contentTypeName = eventData.Get("ContentTypeName"); + var contentPartName = eventData.Get("ContentPartName"); + var contentFieldName = eventData.Get("ContentFieldName"); + var diff = (DiffDictionary)Model.Diff; + var isImplicitPart = contentTypeName == contentPartName; + var captionTemplate = isImplicitPart ? "Settings for {0} attached the {1} content type were updated:" : "Settings for {0} attached to {1} of the {2} content type were updated:"; +} +
+

@T(captionTemplate, contentFieldName, contentPartName, contentTypeName)

+ + + + + + + + + + @foreach (var setting in diff) { + + + + + + } + +
@T("Setting")@T("From")@T("To")
@setting.Key@ToFriendlyEmpty(setting.Value.OldValue)@ToFriendlyEmpty(setting.Value.NewValue)
+
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-PartSettingsUpdated.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-PartSettingsUpdated.SummaryAdmin.cshtml new file mode 100644 index 000000000..52360ad99 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-PartSettingsUpdated.SummaryAdmin.cshtml @@ -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("").Text) : value; + } +} +@{ + var eventData = (IDictionary) Model.EventData; + var contentTypeName = eventData.Get("ContentTypeName"); + var contentPartName = eventData.Get("ContentPartName"); + var diff = (DiffDictionary)Model.Diff; +} +
+
@T("Settings for {0} attached to the {1} content type were updated:", contentPartName, contentTypeName)
+
    + @foreach (var setting in diff) { +
  • + @T("{0} was changed from {1} to {2}.", setting.Key, ToFriendlyEmpty(setting.Value.OldValue), ToFriendlyEmpty(setting.Value.NewValue)) +
  • + } +
+
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-PartSettingsUpdated.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-PartSettingsUpdated.cshtml index c9f146706..5cbc92ef0 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-PartSettingsUpdated.cshtml +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-PartSettingsUpdated.cshtml @@ -1,10 +1,37 @@ @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("").Text) : value; + } +} @{ var eventData = (IDictionary) Model.EventData; var contentTypeName = eventData.Get("ContentTypeName"); var contentPartName = eventData.Get("ContentPartName"); + var diff = (DiffDictionary)Model.Diff; } - -
- @T("Settings for the {0} content part attached to the {1} content type were updated.", contentPartName, contentTypeName) +
+

@T("Settings for {0} attached to the {1} content type were updated:", contentPartName, contentTypeName)

+ + + + + + + + + + @foreach (var setting in diff) { + + + + + + } + +
@T("Setting")@T("From")@T("To")
@setting.Key@ToFriendlyEmpty(setting.Value.OldValue)@ToFriendlyEmpty(setting.Value.NewValue)
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-TypeSettingsUpdated.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-TypeSettingsUpdated.SummaryAdmin.cshtml index 2effc4849..0bcef5e06 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-TypeSettingsUpdated.SummaryAdmin.cshtml +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-TypeSettingsUpdated.SummaryAdmin.cshtml @@ -1,18 +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("") : value; + return String.IsNullOrWhiteSpace(value) ? Html.Encode(T("").Text) : value; } } @{ var eventData = (IDictionary) Model.EventData; var contentTypeName = eventData.Get("ContentTypeName"); var diff = (DiffDictionary) Model.Diff; - var descriptions = String.Join("
", diff.Select(x => T("{0} was changed from {1} to {2}.", x.Key, ToFriendlyEmpty(x.Value.OldValue), ToFriendlyEmpty(x.Value.NewValue)).Text)); } -
- @T("The following {0} settings were changed:", contentTypeName)
- @Html.Raw(descriptions) +
+ @T("The following {0} settings were changed:", contentTypeName)
+
    + @foreach (var setting in diff) { +
  • + @T("{0} was changed from {1} to {2}.", setting.Key, ToFriendlyEmpty(setting.Value.OldValue), ToFriendlyEmpty(setting.Value.NewValue)) +
  • + } +
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-TypeSettingsUpdated.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-TypeSettingsUpdated.cshtml index 4abf0ccbc..f773fb1fc 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-TypeSettingsUpdated.cshtml +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-ContentType-TypeSettingsUpdated.cshtml @@ -11,7 +11,7 @@ @{ var eventData = (IDictionary) Model.EventData; var contentTypeName = eventData.Get("ContentTypeName"); - var differences = (DiffDictionary) Model.Diff; + var diff = (DiffDictionary) Model.Diff; }

@T("The following {0} settings were changed", contentTypeName)

@@ -24,11 +24,11 @@ - @foreach (var diff in differences) { + @foreach (var setting in diff) { - @diff.Key - @ToFriendlyEmpty(diff.Value.OldValue) - @ToFriendlyEmpty(diff.Value.NewValue) + @setting.Key + @ToFriendlyEmpty(setting.Value.OldValue) + @ToFriendlyEmpty(setting.Value.NewValue) } diff --git a/src/Orchard.Web/Modules/Orchard.ContentTypes/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.ContentTypes/Controllers/AdminController.cs index fb851d967..9fe315ecf 100644 --- a/src/Orchard.Web/Modules/Orchard.ContentTypes/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.ContentTypes/Controllers/AdminController.cs @@ -621,8 +621,14 @@ namespace Orchard.ContentTypes.Controllers { return HttpNotFound(); } - field.DisplayName = viewModel.DisplayName; - _contentDefinitionManager.StorePartDefinition(partViewModel._Definition); + _contentDefinitionManager.AlterPartDefinition(partViewModel.Name, partBuilder => { + 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)); diff --git a/src/Orchard.Web/Modules/Orchard.ContentTypes/Services/ContentDefinitionService.cs b/src/Orchard.Web/Modules/Orchard.ContentTypes/Services/ContentDefinitionService.cs index 874ba40d7..0565ca92d 100644 --- a/src/Orchard.Web/Modules/Orchard.ContentTypes/Services/ContentDefinitionService.cs +++ b/src/Orchard.Web/Modules/Orchard.ContentTypes/Services/ContentDefinitionService.cs @@ -245,7 +245,9 @@ namespace Orchard.ContentTypes.Services { public void AlterPart(EditPartViewModel partViewModel, IUpdateModel updateModel) { var updater = new Updater(updateModel); _contentDefinitionManager.AlterPartDefinition(partViewModel.Name, partBuilder => { + _contentDefinitionEditorEvents.PartEditorUpdating(partBuilder); partViewModel.Templates = _contentDefinitionEditorEvents.PartEditorUpdate(partBuilder, updater); + _contentDefinitionEditorEvents.PartEditorUpdated(partBuilder); }); } diff --git a/src/Orchard/ContentManagement/MetaData/Builders/ContentPartDefinitionBuilder.cs b/src/Orchard/ContentManagement/MetaData/Builders/ContentPartDefinitionBuilder.cs index 6fd9a0853..d9965490f 100644 --- a/src/Orchard/ContentManagement/MetaData/Builders/ContentPartDefinitionBuilder.cs +++ b/src/Orchard/ContentManagement/MetaData/Builders/ContentPartDefinitionBuilder.cs @@ -86,7 +86,7 @@ namespace Orchard.ContentManagement.MetaData.Builders { _partDefinition = part; } - public ContentPartFieldDefinition Build() { + public override ContentPartFieldDefinition Build() { return new ContentPartFieldDefinition(_fieldDefinition, _fieldName, _settings); } diff --git a/src/Orchard/ContentManagement/MetaData/Builders/ContentPartFieldDefinitionBuilder.cs b/src/Orchard/ContentManagement/MetaData/Builders/ContentPartFieldDefinitionBuilder.cs index f975cbbc1..f748a0a4d 100644 --- a/src/Orchard/ContentManagement/MetaData/Builders/ContentPartFieldDefinitionBuilder.cs +++ b/src/Orchard/ContentManagement/MetaData/Builders/ContentPartFieldDefinitionBuilder.cs @@ -25,5 +25,7 @@ namespace Orchard.ContentManagement.MetaData.Builders { public abstract ContentPartFieldDefinitionBuilder OfType(ContentFieldDefinition fieldDefinition); public abstract ContentPartFieldDefinitionBuilder OfType(string fieldType); + + public abstract ContentPartFieldDefinition Build(); } } \ No newline at end of file diff --git a/src/Orchard/ContentManagement/MetaData/Builders/ContentTypeDefinitionBuilder.cs b/src/Orchard/ContentManagement/MetaData/Builders/ContentTypeDefinitionBuilder.cs index 7b7199139..50eda2d78 100644 --- a/src/Orchard/ContentManagement/MetaData/Builders/ContentTypeDefinitionBuilder.cs +++ b/src/Orchard/ContentManagement/MetaData/Builders/ContentTypeDefinitionBuilder.cs @@ -86,7 +86,7 @@ namespace Orchard.ContentManagement.MetaData.Builders { _partDefinition = part.PartDefinition; } - public ContentTypePartDefinition Build() { + public override ContentTypePartDefinition Build() { return new ContentTypePartDefinition(_partDefinition, _settings); } } diff --git a/src/Orchard/ContentManagement/MetaData/Builders/ContentTypePartDefinitionBuilder.cs b/src/Orchard/ContentManagement/MetaData/Builders/ContentTypePartDefinitionBuilder.cs index 35b73008e..b8b9a1d23 100644 --- a/src/Orchard/ContentManagement/MetaData/Builders/ContentTypePartDefinitionBuilder.cs +++ b/src/Orchard/ContentManagement/MetaData/Builders/ContentTypePartDefinitionBuilder.cs @@ -18,5 +18,7 @@ namespace Orchard.ContentManagement.MetaData.Builders { _settings[name] = value; return this; } + + public abstract ContentTypePartDefinition Build(); } }