Incremental work on event details view.

This commit is contained in:
sfmskywalker
2014-06-01 14:53:50 +02:00
parent f3c78a1785
commit 45beff3fe0
27 changed files with 280 additions and 45 deletions

View File

@@ -68,9 +68,12 @@ namespace Orchard.AuditTrail.Controllers {
return new HttpUnauthorizedResult();
var record = _auditTrailManager.GetRecord(id);
var recordShape = _displayBuilder.BuildDisplay(record, "Detail");
var descriptor = _auditTrailManager.Describe(record.Event);
var detailsShape = _displayBuilder.BuildDisplay(record, "Detail");
var viewModel = new AuditTrailDetailsViewModel {
Record = recordShape
Record = record,
Descriptor = descriptor,
DetailsShape = detailsShape
};
return View(viewModel);
}

View File

@@ -101,9 +101,26 @@
<Content Include="Views\AuditTrailEvent-ContentPart-PartSettingsUpdated.SummaryAdmin.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentPart-FieldAdded.SummaryAdmin.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentPart-FieldRemoved.SummaryAdmin.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentType-PartSettingsUpdated.SummaryAdmin.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentType-PartSettingsUpdated.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentPart-FieldSettingsUpdated.SummaryAdmin.cshtml" />
<Content Include="Views\EditorTemplates\Parts.AuditTrailSiteSettings.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentPart-Created.cshtml" />
<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-Removed.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentType-Created.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentType-PartAdded.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentType-PartRemoved.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentType-PartSettingsUpdated.SummaryAdmin.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentType-Removed.cshtml" />
<Content Include="Views\AuditTrailEvent-ContentType-TypeSettingsUpdated.cshtml" />
<Content Include="Views\AuditTrailEvent-Role-PermissionAdded.cshtml" />
<Content Include="Views\AuditTrailEvent-Role-PermissionRemoved.cshtml" />
<Content Include="Views\AuditTrailEvent-Role-RoleCreated.cshtml" />
<Content Include="Views\AuditTrailEvent-Role-RoleRenamed.cshtml" />
<Content Include="Views\AuditTrailEvent-User.cshtml" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Orchard\Orchard.Framework.csproj">
@@ -120,6 +137,7 @@
<Compile Include="Controllers\AdminController.cs" />
<Compile Include="Drivers\AuditTrailSiteSettingsPartDriver.cs" />
<Compile Include="Models\AuditTrailEventRecordResult.cs" />
<Compile Include="Providers\Content\ContentAuditTrailEventShapes.cs" />
<Compile Include="ViewModels\AuditTrailCategorySettingsViewModel.cs" />
<Compile Include="ViewModels\AuditTrailEventSettingsViewModel.cs" />
<Compile Include="ViewModels\AuditTrailSiteSettingsViewModel.cs" />

View File

@@ -0,0 +1,33 @@
using System.Collections.Generic;
using Orchard.AuditTrail.Helpers;
using Orchard.AuditTrail.Models;
using Orchard.ContentManagement;
using Orchard.DisplayManagement.Descriptors;
using Orchard.Environment;
namespace Orchard.AuditTrail.Providers.Content {
public class ContentAuditTrailEventShapes : IShapeTableProvider {
private readonly Work<IContentManager> _contentManager;
public ContentAuditTrailEventShapes(Work<IContentManager> contentManager) {
_contentManager = contentManager;
}
public void Discover(ShapeTableBuilder builder) {
builder.Describe("AuditTrailEvent").OnDisplaying(context => {
var record = (AuditTrailEventRecord)context.Shape.Record;
if (record.Category != "Content" || context.ShapeMetadata.DisplayType != "Detail")
return;
var eventData = (IDictionary<string, object>)context.Shape.EventData;
var contentItemId = eventData.Get<int>("ContentItemId");
var previousContentItemVersionId = eventData.Get<int>("PreviousContentItemVersionId");
var contentItem = _contentManager.Value.Get(contentItemId);
var previousVersion = previousContentItemVersionId > 0 ? _contentManager.Value.Get(contentItemId, VersionOptions.VersionRecord(previousContentItemVersionId)) : default(ContentItem);
context.Shape.ContentItem = contentItem;
context.Shape.PreviousVersion = previousVersion;
});
}
}
}

View File

@@ -22,12 +22,14 @@ namespace Orchard.AuditTrail.Providers.Content {
}
protected override void Updated(UpdateContentContext context) {
// TODO: Update ContentManager to expose the previous version of the updated content item.
RecordAuditTrail(ContentAuditTrailEventProvider.Saved, context.ContentItem, context.ContentItem.VersionRecord);
var currentVersion = context.UpdatingItemVersionRecord;
var previousVersion = GetPreviousVersion(currentVersion);
RecordAuditTrail(ContentAuditTrailEventProvider.Saved, context.ContentItem, previousVersion);
}
protected override void Published(PublishContentContext context) {
RecordAuditTrail(ContentAuditTrailEventProvider.Published, context.ContentItem);
var previousVersion = context.PreviousItemVersionRecord;
RecordAuditTrail(ContentAuditTrailEventProvider.Published, context.ContentItem, previousVersion);
}
protected override void Unpublished(PublishContentContext context) {
@@ -38,6 +40,17 @@ namespace Orchard.AuditTrail.Providers.Content {
RecordAuditTrail(ContentAuditTrailEventProvider.Removed, context.ContentItem);
}
private ContentItemVersionRecord GetPreviousVersion(ContentItemVersionRecord currentVersion) {
var number = currentVersion.Number;
var previousVersion = default(ContentItemVersionRecord);
while (previousVersion == null) {
var contentItem = _contentManager.Get(currentVersion.ContentItemRecord.Id, VersionOptions.Number(--number));
previousVersion = contentItem != null ? contentItem.VersionRecord : default(ContentItemVersionRecord);
}
return previousVersion;
}
private void RecordAuditTrail(string eventName, IContent content, ContentItemVersionRecord previousContentItemVersion = null) {
var title = _contentManager.GetItemMetadata(content).DisplayText;

View File

@@ -25,7 +25,7 @@ namespace Orchard.AuditTrail.Services {
metaData.Alternates.Add(String.Format("AuditTrailEvent_{0}", displayType));
metaData.Alternates.Add(String.Format("AuditTrailEvent__{0}", record.Category));
metaData.Alternates.Add(String.Format("AuditTrailEvent_{0}__{1}", displayType, record.Category));
metaData.Alternates.Add(String.Format("AuditTrailEvent_{0}__{1}", record.Category, GetShortName(record.Event)));
metaData.Alternates.Add(String.Format("AuditTrailEvent__{0}__{1}", record.Category, GetShortName(record.Event)));
metaData.Alternates.Add(String.Format("AuditTrailEvent_{0}__{1}__{2}", displayType, record.Category, GetShortName(record.Event)));
return auditTrailEventShape;
}

View File

@@ -10,7 +10,7 @@
font-size: 0.8em;
}
.audit-trail-record-details fieldset legend span {
.audit-trail-event fieldset legend span {
font-size: 0.8em;
}

View File

@@ -1,5 +1,9 @@
using Orchard.AuditTrail.Models;
namespace Orchard.AuditTrail.ViewModels {
public class AuditTrailDetailsViewModel {
public dynamic Record { get; set; }
public AuditTrailEventRecord Record { get; set; }
public AuditTrailEventDescriptor Descriptor { get; set; }
public dynamic DetailsShape { get; set; }
}
}

View File

@@ -2,6 +2,21 @@
@{
Style.Include("admin.css");
}
<section class="audit-trail-details">
@Display(Model.Record)
@{
var record = Model.Record;
var descriptor = Model.Descriptor;
}
<section class="audit-trail-event">
<fieldset>
<legend>@descriptor.Name - <span>@descriptor.CategoryDescriptor.Name</span></legend>
<div>
<span>@Display.DateTime(DateTimeUtc: record.CreatedUtc, CustomFormat: T("g"))</span>
@if (!String.IsNullOrWhiteSpace(record.UserName)) {
@T(" | ")<span>@record.UserName</span>
}
</div>
</fieldset>
</section>
<section class="audit-trail-event-details">
@Display(Model.DetailsShape)
</section>

View File

@@ -1,21 +1,16 @@
@using Orchard.AuditTrail.Helpers
@using Orchard.AuditTrail.Models
@using Orchard.ContentManagement
@{
var record = (AuditTrailEventRecord)Model.Record;
var descriptor = (AuditTrailEventDescriptor) Model.Descriptor;
var eventData = (IDictionary<string, object>)Model.EventData;
var title = eventData.Get<string>("Title");
var contentItemId = eventData.Get<int>("ContentItemId");
var contentItemVersionNumber = eventData.Get<int>("ContentItemVersionNumber");
var contentItem = (ContentItem) Model.ContentItem;
var previousVersion = (ContentItem) Model.PreviousVersion;
}
<div class="audit-trail-record-details">
<fieldset>
<legend>@descriptor.Name - <span>@descriptor.CategoryDescriptor.Name</span></legend>
<div>
<span>@Display.DateTime(DateTimeUtc: record.CreatedUtc, CustomFormat: T("g"))</span>
@if (!String.IsNullOrWhiteSpace(record.UserName)) {
@T(" | ")<span>@record.UserName</span>
}
</div>
</fieldset>
</div>
<div>
@T("This version:")
@Html.ItemEditLink(contentItem)
</div>
@if (previousVersion != null) {
<div>
@T("Previous version:")
@Html.ItemEditLink(previousVersion)
</div>
}

View File

@@ -0,0 +1,9 @@
@using Orchard.AuditTrail.Helpers
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var contentPartName = eventData.Get<string>("ContentPartName");
}
<section class="event-content-part">
@T("Created the <strong>{0}</strong> content part.", contentPartName)
</section>

View File

@@ -0,0 +1,12 @@
@using Orchard.AuditTrail.Helpers
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var contentPartName = eventData.Get<string>("ContentPartName");
var contentFieldName = eventData.Get<string>("ContentFieldName");
var contentFieldTypeName = eventData.Get<string>("ContentFieldTypeName");
var contentDisplayName = eventData.Get<string>("ContentDisplayName");
}
<section class="event-content-part">
@T("Added the <strong>{0}</strong> content field of type <strong>{1}</strong> to the <strong>{2}</strong> content part.", contentFieldName, contentFieldTypeName, contentPartName)
</section>

View File

@@ -0,0 +1,10 @@
@using Orchard.AuditTrail.Helpers
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var contentPartName = eventData.Get<string>("ContentPartName");
var contentFieldName = eventData.Get<string>("ContentFieldName");
}
<section class="event-content-part">
@T("Removed the <strong>{0}</strong> content field from the <strong>{1}</strong> content part.", contentFieldName, contentPartName)
</section>

View File

@@ -0,0 +1,10 @@
@using Orchard.AuditTrail.Helpers
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var contentPartName = eventData.Get<string>("ContentPartName");
var contentFieldName = eventData.Get<string>("ContentFieldName");
}
<section class="event-content-part">
@T("Settings for the <strong>{0}</strong> content field of the <strong>{1}</strong> content part were updated.", contentFieldName, contentPartName)
</section>

View File

@@ -0,0 +1,9 @@
@using Orchard.AuditTrail.Helpers
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var contentPartName = eventData.Get<string>("ContentPartName");
}
<section class="event-content-part">
@T("Settings for the <strong>{0}</strong> content part were updated.", contentPartName)
</section>

View File

@@ -0,0 +1,9 @@
@using Orchard.AuditTrail.Helpers
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var contentPartName = eventData.Get<string>("ContentPartName");
}
<section class="event-content-part">
@T("Removed the <strong>{0}</strong> content part.", contentPartName)
</section>

View File

@@ -0,0 +1,10 @@
@using Orchard.AuditTrail.Helpers
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var contentTypeName = eventData.Get<string>("ContentTypeName");
var contentTypeDisplayName = eventData.Get<string>("ContentTypeDisplayName");
}
<section class="event-content-type">
@T("Created the <strong>{0}</strong> content type.", contentTypeName)
</section>

View File

@@ -0,0 +1,10 @@
@using Orchard.AuditTrail.Helpers
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var contentTypeName = eventData.Get<string>("ContentTypeName");
var contentPartName = eventData.Get<string>("ContentPartName");
}
<section class="event-content-type">
@T("Added the <strong>{0}</strong> content part to the <strong>{1}</strong> content type.", contentPartName, contentTypeName)
</section>

View File

@@ -0,0 +1,10 @@
@using Orchard.AuditTrail.Helpers
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var contentTypeName = eventData.Get<string>("ContentTypeName");
var contentPartName = eventData.Get<string>("ContentPartName");
}
<section class="event-content-type">
@T("Removed the <strong>{0}</strong> content part from the <strong>{1}</strong> content type.", contentPartName, contentTypeName)
</section>

View File

@@ -0,0 +1,10 @@
@using Orchard.AuditTrail.Helpers
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var contentTypeName = eventData.Get<string>("ContentTypeName");
var contentPartName = eventData.Get<string>("ContentPartName");
}
<section class="event-content-type">
@T("Settings for the <strong>{0}</strong> content part attached to the <strong>{1}</strong> content type were updated.", contentPartName, contentTypeName)
</section>

View File

@@ -0,0 +1,10 @@
@using Orchard.AuditTrail.Helpers
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var contentTypeName = eventData.Get<string>("ContentTypeName");
var contentTypeDisplayName = eventData.Get<string>("ContentTypeDisplayName");
}
<section class="event-content-type">
@T("Removed the <strong>{0}</strong> content type.", contentTypeName)
</section>

View File

@@ -0,0 +1,9 @@
@using Orchard.AuditTrail.Helpers
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var contentTypeName = eventData.Get<string>("ContentTypeName");
}
<section class="event-content-type">
@T("Settings for the <strong>{0}</strong> content type were updated.", contentTypeName)
</section>

View File

@@ -0,0 +1,10 @@
@using Orchard.AuditTrail.Helpers
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var roleName = eventData.Get<string>("RoleName");
var permissionName = eventData.Get<string>("PermissionName");
}
<section class="event-role">
@T("Added the <strong>{0}</strong> permission to the <strong>{1}</strong> role.", permissionName, roleName)
</section>

View File

@@ -0,0 +1,10 @@
@using Orchard.AuditTrail.Helpers
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var roleName = eventData.Get<string>("RoleName");
var permissionName = eventData.Get<string>("PermissionName");
}
<section class="event-role">
@T("Removed the <strong>{0}</strong> permission from the <strong>{1}</strong> role.", permissionName, roleName)
</section>

View File

@@ -0,0 +1,9 @@
@using Orchard.AuditTrail.Helpers
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var roleName = eventData.Get<string>("RoleName");
}
<section class="event-role">
@T("Created <strong>{0}</strong> role.", roleName)
</section>

View File

@@ -0,0 +1,10 @@
@using Orchard.AuditTrail.Helpers
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var previousRoleName = eventData.Get<string>("PreviousRoleName");
var newRoleName = eventData.Get<string>("NewRoleName");
}
<section class="event-role">
@T("Renamed <strong>{0}</strong> to <strong>{1}</strong>.", previousRoleName, newRoleName)
</section>

View File

@@ -0,0 +1,9 @@
@using Orchard.AuditTrail.Helpers
@{
var eventData = (IDictionary<string, object>) Model.EventData;
var userName = eventData.Get<string>("UserName");
}
<section class="event-user">
<span>@userName</span>
</section>

View File

@@ -1,15 +1,3 @@
@using Orchard.AuditTrail.Models
@{
var record = (AuditTrailEventRecord)Model.Record;
}
<div class="audit-trail-record-details">
<fieldset>
<legend>@record.Event - <span>@record.Category</span></legend>
<div>
<span>@Display.DateTime(DateTimeUtc: record.CreatedUtc, CustomFormat: T("g"))</span>
@if (!String.IsNullOrWhiteSpace(record.UserName)) {
@T(" | ")<span>@record.UserName</span>
}
</div>
</fieldset>
</div>
@{
var model = Model;
}