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

View File

@@ -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
};
}
}
}
}
}

View File

@@ -103,7 +103,7 @@
<Content Include="Views\AuditTrailEvent-ContentPart-FieldAdded.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentPart-FieldRemoved.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-ContentType-Created.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentType-PartAdded.cshtml" />
@@ -132,6 +132,10 @@
<Content Include="Views\AuditTrailEvent-AuditTrailSettings-EventsChanged.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentType-TypeDisplayNameUpdated.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>
<ProjectReference Include="..\..\..\Orchard\Orchard.Framework.csproj">
@@ -172,6 +176,7 @@
<Compile Include="Handlers\AuditTrailTrimmingSettingsPartHandler.cs" />
<Compile Include="Helpers\FiltersExtensions.cs" />
<Compile Include="Helpers\DateTimeExtensions.cs" />
<Compile Include="Helpers\SettingsDictionaryExtensions.cs" />
<Compile Include="Helpers\XmlHelper.cs" />
<Compile Include="Helpers\StringExtensions.cs" />
<Compile Include="ImportExport\AuditTrailExportStep.cs" />
@@ -196,6 +201,9 @@
<Compile Include="Services\AuditTrailTrimmingBackgroundTask.cs" />
<Compile Include="Shapes\AuditTrailFilterShapes.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\AuditTrailSettingsEventShape.cs" />
<Compile Include="Services\Models\Diff.cs" />

View File

@@ -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);

View File

@@ -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<string, object> {
{"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<string, object> {
{"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<string, object> {
// {"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<string, object> {
// {"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<string, object> {
{"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) {
_auditTrailManager.CreateRecord<ContentTypeAuditTrailEventProvider>(eventName, _wca.GetContext().CurrentUser, properties: null, eventData: eventData, eventFilterKey: "contenttype", eventFilterData: contentTypeName);

View File

@@ -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;
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -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<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 = GetDiff(oldSettings, newSettings);
var diff = oldSettings.GetDiff(newSettings);
context.Shape.OldSettings = oldSettings;
context.Shape.NewSettings = newSettings;
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
};
}
}
}
}
}

View File

@@ -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;
}

View File

@@ -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>

View File

@@ -1,9 +1,36 @@
@using Orchard.AuditTrail.Helpers
@using Orchard.AuditTrail.Services.Models
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var contentPartName = eventData.Get<string>("ContentPartName");
Style.Include("audittrail-contenttype-event.css");
}
<section class="audittrail-contentpart-summary">
@T("Settings for the <strong>{0}</strong> content part were updated.", contentPartName)
@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">
<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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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("<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-summary">
@T("Settings for the <strong>{0}</strong> content part attached to the <strong>{1}</strong> content type were updated.", contentPartName, contentTypeName)
<section class="audittrail-contenttype-event">
<h2>@T("Settings for <strong>{0}</strong> attached to the <strong>{1}</strong> content type were updated:", 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>

View File

@@ -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("<empty>") : 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 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>
@T("The following <strong>{0}</strong> settings were changed:", contentTypeName)<br/>
@Html.Raw(descriptions)
<section class="audittrail-contenttype-event">
@T("The following <strong>{0}</strong> settings were changed:", contentTypeName)<br />
<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>

View File

@@ -11,7 +11,7 @@
@{
var eventData = (IDictionary<string, object>) Model.EventData;
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">
<h2>@T("The following <strong>{0}</strong> settings were changed", contentTypeName)</h2>
@@ -24,11 +24,11 @@
</tr>
</thead>
<tbody class="audittrail-category">
@foreach (var diff in differences) {
@foreach (var setting in diff) {
<tr>
<td>@diff.Key</td>
<td>@ToFriendlyEmpty(diff.Value.OldValue)</td>
<td>@ToFriendlyEmpty(diff.Value.NewValue)</td>
<td>@setting.Key</td>
<td>@ToFriendlyEmpty(setting.Value.OldValue)</td>
<td>@ToFriendlyEmpty(setting.Value.NewValue)</td>
</tr>
}
</tbody>

View File

@@ -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));

View File

@@ -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);
});
}

View File

@@ -86,7 +86,7 @@ namespace Orchard.ContentManagement.MetaData.Builders {
_partDefinition = part;
}
public ContentPartFieldDefinition Build() {
public override ContentPartFieldDefinition Build() {
return new ContentPartFieldDefinition(_fieldDefinition, _fieldName, _settings);
}

View File

@@ -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();
}
}

View File

@@ -86,7 +86,7 @@ namespace Orchard.ContentManagement.MetaData.Builders {
_partDefinition = part.PartDefinition;
}
public ContentTypePartDefinition Build() {
public override ContentTypePartDefinition Build() {
return new ContentTypePartDefinition(_partDefinition, _settings);
}
}

View File

@@ -18,5 +18,7 @@ namespace Orchard.ContentManagement.MetaData.Builders {
_settings[name] = value;
return this;
}
public abstract ContentTypePartDefinition Build();
}
}