diff --git a/src/Umbraco.Core/Logging/DisposableTimer.cs b/src/Umbraco.Core/Logging/DisposableTimer.cs
index db530e5339..e0e6227159 100644
--- a/src/Umbraco.Core/Logging/DisposableTimer.cs
+++ b/src/Umbraco.Core/Logging/DisposableTimer.cs
@@ -84,15 +84,15 @@ namespace Umbraco.Core.Logging
{
if (_failed)
{
- _logger.Error(_loggerType, _failException, "[Timing {TimingId}] {FailMessage} ({TimingDuration}ms)", _timingId, _failMessage, Stopwatch.ElapsedMilliseconds);
+ _logger.Error(_loggerType, _failException, "[Timing {TimingId}] {FailMessage} ({Duration}ms)", _timingId, _failMessage, Stopwatch.ElapsedMilliseconds);
}
else switch (_level)
{
case LogLevel.Debug:
- _logger.Debug(_loggerType, "[Timing {TimingId}] {EndMessage} ({TimingDuration}ms)", _timingId, _endMessage, Stopwatch.ElapsedMilliseconds);
+ _logger.Debug(_loggerType, "[Timing {TimingId}] {EndMessage} ({Duration}ms)", _timingId, _endMessage, Stopwatch.ElapsedMilliseconds);
break;
case LogLevel.Information:
- _logger.Info(_loggerType, "[Timing {TimingId}] {EndMessage} ({TimingDuration}ms)", _timingId, _endMessage, Stopwatch.ElapsedMilliseconds);
+ _logger.Info(_loggerType, "[Timing {TimingId}] {EndMessage} ({Duration}ms)", _timingId, _endMessage, Stopwatch.ElapsedMilliseconds);
break;
// filtered in the ctor
//default:
diff --git a/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpRequestIdEnricher.cs b/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpRequestIdEnricher.cs
new file mode 100644
index 0000000000..856b50bce5
--- /dev/null
+++ b/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpRequestIdEnricher.cs
@@ -0,0 +1,61 @@
+using System;
+using System.Web;
+using Serilog.Core;
+using Serilog.Events;
+
+namespace Umbraco.Core.Logging.Serilog.Enrichers
+{
+ ///
+ /// Enrich log events with a HttpRequestId GUID.
+ /// Original source - https://github.com/serilog-web/classic/blob/master/src/SerilogWeb.Classic/Classic/Enrichers/HttpRequestIdEnricher.cs
+ /// Nupkg: 'Serilog.Web.Classic' contains handlers & extra bits we do not want
+ ///
+ internal class HttpRequestIdEnricher : ILogEventEnricher
+ {
+ ///
+ /// The property name added to enriched log events.
+ ///
+ public const string HttpRequestIdPropertyName = "HttpRequestId";
+
+ static readonly string RequestIdItemName = typeof(HttpRequestIdEnricher).Name + "+RequestId";
+
+ ///
+ /// Enrich the log event with an id assigned to the currently-executing HTTP request, if any.
+ ///
+ /// The log event to enrich.
+ /// Factory for creating new properties to add to the event.
+ public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
+ {
+ if (logEvent == null) throw new ArgumentNullException("logEvent");
+
+ Guid requestId;
+ if (!TryGetCurrentHttpRequestId(out requestId))
+ return;
+
+ var requestIdProperty = new LogEventProperty(HttpRequestIdPropertyName, new ScalarValue(requestId));
+ logEvent.AddPropertyIfAbsent(requestIdProperty);
+ }
+
+ ///
+ /// Retrieve the id assigned to the currently-executing HTTP request, if any.
+ ///
+ /// The request id.
+ /// true if there is a request in progress; false otherwise.
+ public static bool TryGetCurrentHttpRequestId(out Guid requestId)
+ {
+ if (HttpContext.Current == null)
+ {
+ requestId = default(Guid);
+ return false;
+ }
+
+ var requestIdItem = HttpContext.Current.Items[RequestIdItemName];
+ if (requestIdItem == null)
+ HttpContext.Current.Items[RequestIdItemName] = requestId = Guid.NewGuid();
+ else
+ requestId = (Guid)requestIdItem;
+
+ return true;
+ }
+ }
+}
diff --git a/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpRequestNumberEnricher.cs b/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpRequestNumberEnricher.cs
new file mode 100644
index 0000000000..48415cccbc
--- /dev/null
+++ b/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpRequestNumberEnricher.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Threading;
+using System.Web;
+using Serilog.Core;
+using Serilog.Events;
+
+namespace Umbraco.Core.Logging.Serilog.Enrichers
+{
+ ///
+ /// Enrich log events with a HttpRequestNumber unique within the current
+ /// logging session.
+ /// Original source - https://github.com/serilog-web/classic/blob/master/src/SerilogWeb.Classic/Classic/Enrichers/HttpRequestNumberEnricher.cs
+ /// Nupkg: 'Serilog.Web.Classic' contains handlers & extra bits we do not want
+ ///
+ internal class HttpRequestNumberEnricher : ILogEventEnricher
+ {
+ ///
+ /// The property name added to enriched log events.
+ ///
+ public const string HttpRequestNumberPropertyName = "HttpRequestNumber";
+
+ static int _lastRequestNumber;
+ static readonly string RequestNumberItemName = typeof(HttpRequestNumberEnricher).Name + "+RequestNumber";
+
+ ///
+ /// Enrich the log event with the number assigned to the currently-executing HTTP request, if any.
+ ///
+ /// The log event to enrich.
+ /// Factory for creating new properties to add to the event.
+ public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
+ {
+ if (logEvent == null) throw new ArgumentNullException("logEvent");
+
+ if (HttpContext.Current == null)
+ return;
+
+ int requestNumber;
+ var requestNumberItem = HttpContext.Current.Items[RequestNumberItemName];
+ if (requestNumberItem == null)
+ HttpContext.Current.Items[RequestNumberItemName] = requestNumber = Interlocked.Increment(ref _lastRequestNumber);
+ else
+ requestNumber = (int)requestNumberItem;
+
+ var requestNumberProperty = new LogEventProperty(HttpRequestNumberPropertyName, new ScalarValue(requestNumber));
+ logEvent.AddPropertyIfAbsent(requestNumberProperty);
+ }
+ }
+}
diff --git a/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpSessionIdEnricher.cs b/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpSessionIdEnricher.cs
new file mode 100644
index 0000000000..d2fbfd4627
--- /dev/null
+++ b/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpSessionIdEnricher.cs
@@ -0,0 +1,39 @@
+using Serilog.Core;
+using Serilog.Events;
+using System;
+using System.Web;
+
+namespace Umbraco.Core.Logging.Serilog.Enrichers
+{
+ ///
+ /// Enrich log events with the HttpSessionId property.
+ /// Original source - https://github.com/serilog-web/classic/blob/master/src/SerilogWeb.Classic/Classic/Enrichers/HttpSessionIdEnricher.cs
+ /// Nupkg: 'Serilog.Web.Classic' contains handlers & extra bits we do not want
+ ///
+ internal class HttpSessionIdEnricher : ILogEventEnricher
+ {
+ ///
+ /// The property name added to enriched log events.
+ ///
+ public const string HttpSessionIdPropertyName = "HttpSessionId";
+
+ ///
+ /// Enrich the log event with the current ASP.NET session id, if sessions are enabled.
+ /// The log event to enrich.
+ /// Factory for creating new properties to add to the event.
+ public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
+ {
+ if (logEvent == null) throw new ArgumentNullException("logEvent");
+
+ if (HttpContext.Current == null)
+ return;
+
+ if (HttpContext.Current.Session == null)
+ return;
+
+ var sessionId = HttpContext.Current.Session.SessionID;
+ var sessionIdProperty = new LogEventProperty(HttpSessionIdPropertyName, new ScalarValue(sessionId));
+ logEvent.AddPropertyIfAbsent(sessionIdProperty);
+ }
+ }
+}
diff --git a/src/Umbraco.Core/Logging/Serilog/Log4NetLevelMapperEnricher.cs b/src/Umbraco.Core/Logging/Serilog/Enrichers/Log4NetLevelMapperEnricher.cs
similarity index 96%
rename from src/Umbraco.Core/Logging/Serilog/Log4NetLevelMapperEnricher.cs
rename to src/Umbraco.Core/Logging/Serilog/Enrichers/Log4NetLevelMapperEnricher.cs
index 1424fa0b55..0c255fa8b4 100644
--- a/src/Umbraco.Core/Logging/Serilog/Log4NetLevelMapperEnricher.cs
+++ b/src/Umbraco.Core/Logging/Serilog/Enrichers/Log4NetLevelMapperEnricher.cs
@@ -1,7 +1,7 @@
using Serilog.Core;
using Serilog.Events;
-namespace Umbraco.Core.Logging.Serilog
+namespace Umbraco.Core.Logging.Serilog.Enrichers
{
///
/// This is used to create a new property in Logs called 'Log4NetLevel'
diff --git a/src/Umbraco.Core/Logging/Serilog/LoggerConfigExtensions.cs b/src/Umbraco.Core/Logging/Serilog/LoggerConfigExtensions.cs
index 8861c808df..2d333ed916 100644
--- a/src/Umbraco.Core/Logging/Serilog/LoggerConfigExtensions.cs
+++ b/src/Umbraco.Core/Logging/Serilog/LoggerConfigExtensions.cs
@@ -3,6 +3,7 @@ using System.Web;
using Serilog;
using Serilog.Events;
using Serilog.Formatting.Compact;
+using Umbraco.Core.Logging.Serilog.Enrichers;
namespace Umbraco.Core.Logging.Serilog
{
@@ -21,7 +22,7 @@ namespace Umbraco.Core.Logging.Serilog
//Set this environment variable - so that it can be used in external config file
//add key="serilog:write-to:RollingFile.pathFormat" value="%BASEDIR%\logs\log.txt" />
Environment.SetEnvironmentVariable("BASEDIR", AppDomain.CurrentDomain.BaseDirectory, EnvironmentVariableTarget.Process);
-
+
logConfig.MinimumLevel.Verbose() //Set to highest level of logging (as any sinks may want to restrict it to Errors only)
.Enrich.WithProcessId()
.Enrich.WithProcessName()
@@ -29,8 +30,11 @@ namespace Umbraco.Core.Logging.Serilog
.Enrich.WithProperty("AppDomainId", AppDomain.CurrentDomain.Id)
.Enrich.WithProperty("AppDomainAppId", HttpRuntime.AppDomainAppId.ReplaceNonAlphanumericChars(string.Empty))
.Enrich.WithProperty("MachineName", Environment.MachineName)
- .Enrich.With();
-
+ .Enrich.With()
+ .Enrich.With()
+ .Enrich.With()
+ .Enrich.With();
+
return logConfig;
}
diff --git a/src/Umbraco.Core/Runtime/CoreRuntime.cs b/src/Umbraco.Core/Runtime/CoreRuntime.cs
index de86ea929f..8f3b8991e4 100644
--- a/src/Umbraco.Core/Runtime/CoreRuntime.cs
+++ b/src/Umbraco.Core/Runtime/CoreRuntime.cs
@@ -363,7 +363,7 @@ namespace Umbraco.Core.Runtime
_state.CurrentMigrationState = state;
_state.FinalMigrationState = umbracoPlan.FinalState;
- logger.Debug("Final upgrade state is '{FinalMigrationState}', database contains {DatabaseState}", _state.FinalMigrationState, state ?? "");
+ logger.Debug("Final upgrade state is {FinalMigrationState}, database contains {DatabaseState}", _state.FinalMigrationState, state ?? "");
return state == _state.FinalMigrationState;
}
diff --git a/src/Umbraco.Core/RuntimeState.cs b/src/Umbraco.Core/RuntimeState.cs
index d09bd95081..0177619a68 100644
--- a/src/Umbraco.Core/RuntimeState.cs
+++ b/src/Umbraco.Core/RuntimeState.cs
@@ -117,7 +117,7 @@ namespace Umbraco.Core
var change = url != null && !_applicationUrls.Contains(url);
if (change)
{
- _logger.Info(typeof(ApplicationUrlHelper), "New url '{Url}' detected, re-discovering application url.", url);
+ _logger.Info(typeof(ApplicationUrlHelper), "New url {Url} detected, re-discovering application url.", url);
_applicationUrls.Add(url);
}
diff --git a/src/Umbraco.Core/Services/Implement/ContentService.cs b/src/Umbraco.Core/Services/Implement/ContentService.cs
index 0bb00ef5a4..da59615126 100644
--- a/src/Umbraco.Core/Services/Implement/ContentService.cs
+++ b/src/Umbraco.Core/Services/Implement/ContentService.cs
@@ -2178,7 +2178,7 @@ namespace Umbraco.Core.Services.Implement
// raise Publishing event
if (scope.Events.DispatchCancelable(Publishing, this, new PublishEventArgs(content, evtMsgs)))
{
- Logger.Info("Document '{ContentName}' (id={ContentId}) cannot be published: {Reason}", content.Name, content.Id, "publishing was cancelled");
+ Logger.Info("Document {ContentName} (id={ContentId}) cannot be published: {Reason}", content.Name, content.Id, "publishing was cancelled");
return new PublishResult(PublishResultType.FailedCancelledByEvent, evtMsgs, content);
}
@@ -2186,7 +2186,7 @@ namespace Umbraco.Core.Services.Implement
// either because it is 'publishing' or because it already has a published version
if (((Content) content).PublishedState != PublishedState.Publishing && content.PublishedVersionId == 0)
{
- Logger.Info("Document '{ContentName}' (id={ContentId}) cannot be published: {Reason}", content.Name, content.Id, "document does not have published values");
+ Logger.Info("Document {ContentName} (id={ContentId}) cannot be published: {Reason}", content.Name, content.Id, "document does not have published values");
return new PublishResult(PublishResultType.FailedNoPublishedValues, evtMsgs, content);
}
@@ -2194,15 +2194,15 @@ namespace Umbraco.Core.Services.Implement
switch (content.Status)
{
case ContentStatus.Expired:
- Logger.Info("Document '{ContentName}' (id={ContentId}) cannot be published: {Reason}", content.Name, content.Id, "document has expired");
+ Logger.Info("Document {ContentName} (id={ContentId}) cannot be published: {Reason}", content.Name, content.Id, "document has expired");
return new PublishResult(PublishResultType.FailedHasExpired, evtMsgs, content);
case ContentStatus.AwaitingRelease:
- Logger.Info("Document '{ContentName}' (id={ContentId}) cannot be published: {Reason}", content.Name, content.Id, "document is awaiting release");
+ Logger.Info("Document {ContentName} (id={ContentId}) cannot be published: {Reason}", content.Name, content.Id, "document is awaiting release");
return new PublishResult(PublishResultType.FailedAwaitingRelease, evtMsgs, content);
case ContentStatus.Trashed:
- Logger.Info("Document '{ContentName}' (id={ContentId}) cannot be published: {Reason}", content.Name, content.Id, "document is trashed");
+ Logger.Info("Document {ContentName} (id={ContentId}) cannot be published: {Reason}", content.Name, content.Id, "document is trashed");
return new PublishResult(PublishResultType.FailedIsTrashed, evtMsgs, content);
}
@@ -2214,7 +2214,7 @@ namespace Umbraco.Core.Services.Implement
var pathIsOk = content.ParentId == Constants.System.Root || IsPathPublished(GetParent(content));
if (pathIsOk == false)
{
- Logger.Info("Document '{ContentName}' (id={ContentId}) cannot be published: {Reason}", content.Name, content.Id, "parent is not published");
+ Logger.Info("Document {ContentName} (id={ContentId}) cannot be published: {Reason}", content.Name, content.Id, "parent is not published");
return new PublishResult(PublishResultType.FailedPathNotPublished, evtMsgs, content);
}
@@ -2238,7 +2238,7 @@ namespace Umbraco.Core.Services.Implement
// change state to publishing
((Content) content).PublishedState = PublishedState.Publishing;
- Logger.Info("Document '{ContentName}' (id={ContentId}) has been published.", content.Name, content.Id);
+ Logger.Info("Document {ContentName} (id={ContentId}) has been published.", content.Name, content.Id);
return result;
}
@@ -2248,7 +2248,7 @@ namespace Umbraco.Core.Services.Implement
// raise UnPublishing event
if (scope.Events.DispatchCancelable(UnPublishing, this, new PublishEventArgs(content, evtMsgs)))
{
- Logger.Info("Document '{ContentName}' (id={ContentId}) cannot be unpublished: unpublishing was cancelled.", content.Name, content.Id);
+ Logger.Info("Document {ContentName} (id={ContentId}) cannot be unpublished: unpublishing was cancelled.", content.Name, content.Id);
return new UnpublishResult(UnpublishResultType.FailedCancelledByEvent, evtMsgs, content);
}
@@ -2271,13 +2271,13 @@ namespace Umbraco.Core.Services.Implement
if (content.ReleaseDate.HasValue && content.ReleaseDate.Value <= DateTime.Now)
{
content.ReleaseDate = null;
- Logger.Info("Document '{ContentName}' (id={ContentId}) had its release date removed, because it was unpublished.", content.Name, content.Id);
+ Logger.Info("Document {ContentName} (id={ContentId}) had its release date removed, because it was unpublished.", content.Name, content.Id);
}
// change state to unpublishing
((Content) content).PublishedState = PublishedState.Unpublishing;
- Logger.Info("Document '{ContentName}' (id={ContentId}) has been unpublished.", content.Name, content.Id);
+ Logger.Info("Document {ContentName} (id={ContentId}) has been unpublished.", content.Name, content.Id);
return attempt;
}
diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj
index f584621fc0..b747b0960f 100644
--- a/src/Umbraco.Core/Umbraco.Core.csproj
+++ b/src/Umbraco.Core/Umbraco.Core.csproj
@@ -328,8 +328,11 @@
+
+
+
-
+
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js
index d857e8b8dd..fc790b13f1 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js
@@ -1,10 +1,10 @@
(function () {
'use strict';
- function ContentEditController($rootScope, $scope, $routeParams, $q, $timeout, $window, $location,
- appState, contentResource, entityResource, navigationService, notificationsService, angularHelper,
- serverValidationManager, contentEditingHelper, treeService, fileManager, formHelper, umbRequestHelper,
- keyboardService, umbModelMapper, editorState, $http, eventsService, relationResource, overlayService, localizationService) {
+ function ContentEditController($rootScope, $scope, $routeParams, $q, $window,
+ appState, contentResource, entityResource, navigationService, notificationsService,
+ serverValidationManager, contentEditingHelper, treeService, formHelper, umbRequestHelper,
+ editorState, $http, eventsService, relationResource, overlayService) {
var evts = [];
var infiniteMode = $scope.infiniteModel && $scope.infiniteModel.infiniteMode;
@@ -46,10 +46,6 @@
}
bindEvents();
-
- // set first app to active
- // We need to track active
- $scope.content.apps[0].active = true;
resetVariantFlags();
}
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantcontent.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantcontent.directive.js
index b2045fcb2d..5ad7a9079a 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantcontent.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantcontent.directive.js
@@ -15,7 +15,8 @@
openVariants: "<",
onCloseSplitView: "&",
onSelectVariant: "&",
- onOpenSplitView: "&"
+ onOpenSplitView: "&",
+ onSelectApp: "&"
},
controllerAs: 'vm',
controller: umbVariantContentController
@@ -32,7 +33,7 @@
vm.selectVariant = selectVariant;
vm.openSplitView = openSplitView;
- vm.backToListView = backToListView;
+ vm.selectApp = selectApp;
/** Called when the component has linked all elements, this is when the form controller is available */
function postLink() {
@@ -51,10 +52,6 @@
}
}
- function backToListView() {
- $location.path(vm.page.listViewPath);
- };
-
/**
* Used to proxy a callback
* @param {any} variant
@@ -65,6 +62,16 @@
}
}
+ /**
+ * Used to proxy a callback
+ * @param {any} item
+ */
+ function selectApp(item) {
+ if(vm.onSelectApp) {
+ vm.onSelectApp({"app": item});
+ }
+ }
+
/**
* Used to proxy a callback
* @param {any} variant
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantcontenteditors.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantcontenteditors.directive.js
index 4366a883f7..7d6d5dc131 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantcontenteditors.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantcontenteditors.directive.js
@@ -15,11 +15,12 @@
controller: umbVariantContentEditorsController
};
- function umbVariantContentEditorsController($scope, $element, $location, $timeout) {
+ function umbVariantContentEditorsController($scope, $location, $timeout) {
var prevContentDateUpdated = null;
var vm = this;
+ var activeAppAlias = null;
vm.$onInit = onInit;
vm.$onChanges = onChanges;
@@ -29,6 +30,7 @@
vm.openSplitView = openSplitView;
vm.closeSplitView = closeSplitView;
vm.selectVariant = selectVariant;
+ vm.selectApp = selectApp;
//Used to track how many content views there are (for split view there will be 2, it could support more in theory)
vm.editors = [];
@@ -37,6 +39,8 @@
/** Called when the component initializes */
function onInit() {
+ // set first app to active
+ vm.content.apps[0].active = true;
prevContentDateUpdated = angular.copy(vm.content.updateDate);
setActiveCulture();
}
@@ -141,7 +145,7 @@
//with a copy of the contentApps. This is required because each editor renders it's own
//header and content apps section and the content apps contains the view for editing content itself
//and we need to assign a view model to the subView so that it is scoped to the current
- //editor so that split views work.
+ //editor so that split views work.
//copy the apps from the main model if not assigned yet to the variant
if (!variant.apps) {
@@ -191,6 +195,16 @@
vm.openVariants[editorIndex] = variant.language.culture;
}
+ // make sure the same app it set to active in the new variant
+ if(activeAppAlias) {
+ angular.forEach(variant.apps, function(app) {
+ app.active = false;
+ if(app.alias === activeAppAlias) {
+ app.active = true;
+ }
+ });
+ }
+
return variant;
}
/**
@@ -288,6 +302,17 @@
}
}
+
+ /**
+ * Stores the active app in a variable so we can remember it when changing language
+ * @param {any} app This is the model of the selected app
+ */
+ function selectApp(app) {
+ if(app && app.alias) {
+ activeAppAlias = app.alias;
+ }
+ }
+
}
angular.module('umbraco.directives').component('umbVariantContentEditors', umbVariantContentEditors);
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorcontentheader.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorcontentheader.directive.js
new file mode 100644
index 0000000000..3cdcd5b12a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorcontentheader.directive.js
@@ -0,0 +1,124 @@
+(function () {
+ 'use strict';
+
+ function EditorContentHeader($location, $routeParams) {
+
+ function link(scope, el, attr, ctrl) {
+
+ if (!scope.serverValidationNameField) {
+ scope.serverValidationNameField = "Name";
+ }
+ if (!scope.serverValidationAliasField) {
+ scope.serverValidationAliasField = "Alias";
+ }
+
+ scope.vm = {};
+ scope.vm.dropdownOpen = false;
+ scope.vm.currentVariant = "";
+
+ function onInit() {
+ setCurrentVariant();
+ }
+
+ function setCurrentVariant() {
+ angular.forEach(scope.variants, function (variant) {
+ if (variant.active) {
+ scope.vm.currentVariant = variant;
+ }
+ });
+ }
+
+ scope.goBack = function () {
+ $location.path('/' + $routeParams.section + '/' + $routeParams.tree + '/' + $routeParams.method + '/' + scope.menu.currentNode.parentId);
+ };
+
+ scope.selectVariant = function (event, variant) {
+
+ if (scope.onSelectVariant) {
+ scope.vm.dropdownOpen = false;
+ scope.onSelectVariant({ "variant": variant });
+ }
+ };
+
+ scope.selectNavigationItem = function(item) {
+ if(scope.onSelectNavigationItem) {
+ scope.onSelectNavigationItem({"item": item});
+ }
+ }
+
+ scope.closeSplitView = function () {
+ if (scope.onCloseSplitView) {
+ scope.onCloseSplitView();
+ }
+ };
+
+ scope.openInSplitView = function (event, variant) {
+ if (scope.onOpenInSplitView) {
+ scope.vm.dropdownOpen = false;
+ scope.onOpenInSplitView({ "variant": variant });
+ }
+ };
+
+ /**
+ * keep track of open variants - this is used to prevent the same variant to be open in more than one split view
+ * @param {any} culture
+ */
+ scope.variantIsOpen = function(culture) {
+ if(scope.openVariants.indexOf(culture) !== -1) {
+ return true;
+ }
+ }
+
+ onInit();
+
+ //watch for the active culture changing, if it changes, update the current variant
+ if (scope.variants) {
+ scope.$watch(function () {
+ for (var i = 0; i < scope.variants.length; i++) {
+ var v = scope.variants[i];
+ if (v.active) {
+ return v.language.culture;
+ }
+ }
+ return scope.vm.currentVariant.language.culture; //should never get here
+ }, function (newValue, oldValue) {
+ if (newValue !== scope.vm.currentVariant.language.culture) {
+ setCurrentVariant();
+ }
+ });
+ }
+ }
+
+
+ var directive = {
+ transclude: true,
+ restrict: 'E',
+ replace: true,
+ templateUrl: 'views/components/editor/umb-editor-content-header.html',
+ scope: {
+ name: "=",
+ nameLocked: "=",
+ menu: "=",
+ hideMenu: "",
+ variants: "=",
+ openVariants: "<",
+ hideChangeVariant: "",
+ navigation: "=",
+ onSelectNavigationItem: "&?",
+ showBackButton: "",
+ splitViewOpen: "=?",
+ onOpenInSplitView: "&?",
+ onCloseSplitView: "&?",
+ onSelectVariant: "&?",
+ serverValidationNameField: "@?",
+ serverValidationAliasField: "@?"
+ },
+ link: link
+ };
+
+ return directive;
+ }
+
+ angular.module('umbraco.directives').directive('umbEditorContentHeader', EditorContentHeader);
+
+})();
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js
index 6bb9f4e1f6..deb9f4c1ac 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js
@@ -204,47 +204,25 @@ Use this directive to construct a header inside the main editor window.
(function () {
'use strict';
- function EditorHeaderDirective($timeout, editorService, $location, $routeParams) {
+ function EditorHeaderDirective(editorService) {
- function link(scope, el, attr, ctrl) {
-
-
- if (!scope.serverValidationNameField) {
- scope.serverValidationNameField = "Name";
- }
- if (!scope.serverValidationAliasField) {
- scope.serverValidationAliasField = "Alias";
- }
+ function link(scope) {
scope.vm = {};
scope.vm.dropdownOpen = false;
scope.vm.currentVariant = "";
- function onInit() {
- setCurrentVariant();
- }
-
- function setCurrentVariant() {
- angular.forEach(scope.variants, function (variant) {
- if (variant.active) {
- scope.vm.currentVariant = variant;
- }
- });
- }
-
scope.goBack = function () {
if (scope.onBack) {
- $location.path('/' + $routeParams.section + '/' + $routeParams.tree + '/' + $routeParams.method + '/' + scope.menu.currentNode.parentId);
+ scope.onBack();
}
};
- scope.selectVariant = function (event, variant) {
-
- if (scope.onSelectVariant) {
- scope.vm.dropdownOpen = false;
- scope.onSelectVariant({ "variant": variant });
+ scope.selectNavigationItem = function(item) {
+ if(scope.onSelectNavigationItem) {
+ scope.onSelectNavigationItem({"item": item});
}
- };
+ }
scope.openIconPicker = function () {
var iconPicker = {
@@ -269,58 +247,14 @@ Use this directive to construct a header inside the main editor window.
editorService.iconPicker(iconPicker);
};
- scope.closeSplitView = function () {
- if (scope.onCloseSplitView) {
- scope.onCloseSplitView();
- }
- };
-
- scope.openInSplitView = function (event, variant) {
- if (scope.onOpenInSplitView) {
- scope.vm.dropdownOpen = false;
- scope.onOpenInSplitView({ "variant": variant });
- }
- };
-
- /**
- * keep track of open variants - this is used to prevent the same variant to be open in more than one split view
- * @param {any} culture
- */
- scope.variantIsOpen = function(culture) {
- if(scope.openVariants.indexOf(culture) !== -1) {
- return true;
- }
- }
-
- onInit();
-
- //watch for the active culture changing, if it changes, update the current variant
- if (scope.variants) {
- scope.$watch(function () {
- for (var i = 0; i < scope.variants.length; i++) {
- var v = scope.variants[i];
- if (v.active) {
- return v.language.culture;
- }
- }
- return scope.vm.currentVariant.language.culture; //should never get here
- }, function (newValue, oldValue) {
- if (newValue !== scope.vm.currentVariant.language.culture) {
- setCurrentVariant();
- }
- });
- }
}
-
var directive = {
transclude: true,
restrict: 'E',
replace: true,
templateUrl: 'views/components/editor/umb-editor-header.html',
scope: {
- tabs: "=",
- actions: "=",
name: "=",
nameLocked: "=",
menu: "=",
@@ -332,19 +266,11 @@ Use this directive to construct a header inside the main editor window.
description: "=",
hideDescription: "@",
descriptionLocked: "@",
- variants: "=",
- openVariants: "<",
- hideChangeVariant: "",
navigation: "=",
+ onSelectNavigationItem: "&?",
key: "=",
onBack: "&?",
- showBackButton: "",
- splitViewOpen: "=?",
- onOpenInSplitView: "&?",
- onCloseSplitView: "&?",
- onSelectVariant: "&?",
- serverValidationNameField: "@?",
- serverValidationAliasField: "@?"
+ showBackButton: ""
},
link: link
};
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditornavigation.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditornavigation.directive.js
index 3eda8974d6..943d2232c2 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditornavigation.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditornavigation.directive.js
@@ -20,8 +20,11 @@
scope.clickNavigationItem = function (selectedItem) {
scope.showDropdown = false;
runItemAction(selectedItem);
- eventsService.emit("app.tabChange", selectedItem);
setItemToActive(selectedItem);
+ if(scope.onSelect) {
+ scope.onSelect({"item": selectedItem});
+ }
+ eventsService.emit("app.tabChange", selectedItem);
};
scope.toggleDropdown = function () {
@@ -124,7 +127,8 @@
replace: true,
templateUrl: 'views/components/editor/umb-editor-navigation.html',
scope: {
- navigation: "="
+ navigation: "=",
+ onSelect: "&"
},
link: link
};
diff --git a/src/Umbraco.Web.UI.Client/src/preview/preview.controller.js b/src/Umbraco.Web.UI.Client/src/preview/preview.controller.js
index e8b5ff9e8c..e87f3a59bf 100644
--- a/src/Umbraco.Web.UI.Client/src/preview/preview.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/preview/preview.controller.js
@@ -1,6 +1,6 @@
/*********************************************************************************************************/
-/* Canvasdesigner panel app and controller */
+/* Preview app and controller */
/*********************************************************************************************************/
var app = angular.module("umbraco.preview", ['umbraco.resources', 'umbraco.services'])
@@ -100,7 +100,6 @@ var app = angular.module("umbraco.preview", ['umbraco.resources', 'umbraco.servi
$scope.openPreviewDevice = function () {
$scope.showDevicesPreview = true;
- $scope.closeIntelCanvasdesigner();
}
})
diff --git a/src/Umbraco.Web.UI.Client/src/views/components/content/edit.html b/src/Umbraco.Web.UI.Client/src/views/components/content/edit.html
index bd71eb6691..f7eaedf3be 100644
--- a/src/Umbraco.Web.UI.Client/src/views/components/content/edit.html
+++ b/src/Umbraco.Web.UI.Client/src/views/components/content/edit.html
@@ -6,9 +6,10 @@
-
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-variant-content-editors.html b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-variant-content-editors.html
index 9d2a95d9ae..9d879fac22 100644
--- a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-variant-content-editors.html
+++ b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-variant-content-editors.html
@@ -12,7 +12,8 @@
open-variants="vm.openVariants"
on-open-split-view="vm.openSplitView(variant)"
on-close-split-view="vm.closeSplitView($index)"
- on-select-variant="vm.selectVariant(variant, $index)">
+ on-select-variant="vm.selectVariant(variant, $index)"
+ on-select-app="vm.selectApp(app)">
diff --git a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-variant-content.html b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-variant-content.html
index 50b9e6d85e..19e741ee29 100644
--- a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-variant-content.html
+++ b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-variant-content.html
@@ -1,28 +1,27 @@
-
+
-
-
+
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-content-header.html b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-content-header.html
new file mode 100644
index 0000000000..bc20745018
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-content-header.html
@@ -0,0 +1,83 @@
+
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html
index 6cc84d8cea..267d805d0a 100644
--- a/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html
+++ b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html
@@ -34,7 +34,7 @@
ng-model="name"
ng-class="{'name-is-empty': $parent.name===null || $parent.name===''}"
umb-auto-focus
- val-server-field="{{serverValidationNameField}}"
+ val-server-field="Name"
required
autocomplete="off" />
@@ -45,28 +45,9 @@
alias="$parent.alias"
alias-from="$parent.name"
enable-lock="true"
- server-validation-field="{{serverValidationAliasField}}">
+ server-validation-field="Alias">
-
- {{vm.currentVariant.language.name}}
-
-
-
-
- {{vm.currentVariant.language.name}}
-
-
-
-
-
- {{variant.language.name}}
-
-
- Open in split view
-
-
-
@@ -85,22 +66,19 @@
-
-
-
-
-
+
-
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/media/media.edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/media/media.edit.controller.js
index 39fe794bf3..cc63b5f9f0 100644
--- a/src/Umbraco.Web.UI.Client/src/views/media/media.edit.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/media/media.edit.controller.js
@@ -6,7 +6,7 @@
* @description
* The controller for the media editor
*/
-function mediaEditController($scope, $routeParams, $q, appState, mediaResource, entityResource, navigationService, notificationsService, angularHelper, serverValidationManager, contentEditingHelper, fileManager, treeService, formHelper, umbModelMapper, editorState, umbRequestHelper, $http, eventsService) {
+function mediaEditController($scope, $routeParams, $q, appState, mediaResource, entityResource, navigationService, notificationsService, angularHelper, serverValidationManager, contentEditingHelper, fileManager, formHelper, editorState, umbRequestHelper, $http, eventsService) {
var evts = [];
var nodeId = null;
@@ -79,10 +79,7 @@ function mediaEditController($scope, $routeParams, $q, appState, mediaResource,
editorState.set($scope.content);
- // We don't get the info tab from the server from version 7.8 so we need to manually add it
- //contentEditingHelper.addInfoTab($scope.content.tabs);
-
- init($scope.content);
+ init();
$scope.page.loading = false;
@@ -96,29 +93,7 @@ function mediaEditController($scope, $routeParams, $q, appState, mediaResource,
});
}
- function init(content) {
-
- // prototype content and info apps
- var contentApp = {
- "name": "Content",
- "alias": "content",
- "icon": "icon-document",
- "view": "views/media/apps/content/content.html"
- };
-
- var infoApp = {
- "name": "Info",
- "alias": "info",
- "icon": "icon-info",
- "view": "views/media/apps/info/info.html"
- };
-
- var listview = {
- "name": "Child items",
- "alias": "childItems",
- "icon": "icon-list",
- "view": "views/media/apps/listview/listview.html"
- };
+ function init() {
// set first app to active
$scope.content.apps[0].active = true;
@@ -154,7 +129,7 @@ function mediaEditController($scope, $routeParams, $q, appState, mediaResource,
syncTreeNode($scope.content, data.path);
- init($scope.content);
+ init();
$scope.page.saveButtonState = "success";
@@ -216,10 +191,7 @@ function mediaEditController($scope, $routeParams, $q, appState, mediaResource,
});
}
- // We don't get the info tab from the server from version 7.8 so we need to manually add it
- //contentEditingHelper.addInfoTab($scope.content.tabs);
-
- init($scope.content);
+ init();
$scope.page.loading = false;
diff --git a/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs
index 4ce8edbdc2..1334cb1572 100644
--- a/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs
+++ b/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs
@@ -1,4 +1,5 @@
-using System.Linq;
+using System;
+using System.Linq;
using AutoMapper;
using Umbraco.Core;
using Umbraco.Core.Models;
@@ -80,6 +81,8 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(dest => dest.ContentTypeAlias, opt => opt.MapFrom(src => src.ContentType.Alias))
.ForMember(dest => dest.Alias, opt => opt.Ignore())
.ForMember(dest => dest.AdditionalData, opt => opt.Ignore())
+ .ForMember(dest => dest.UpdateDate, opt => opt.ResolveUsing())
+ .ForMember(dest => dest.Published, opt => opt.ResolveUsing())
.ForMember(dest => dest.Name, opt => opt.ResolveUsing());
//FROM IContent TO ContentPropertyCollectionDto
@@ -88,11 +91,53 @@ namespace Umbraco.Web.Models.Mapping
}
}
+ internal class CultureUpdateDateResolver : IValueResolver, DateTime>
+ {
+ public DateTime Resolve(IContent source, ContentItemBasic destination, DateTime destMember, ResolutionContext context)
+ {
+ var culture = context.GetCulture();
+
+ //a culture needs to be in the context for a variant content item
+ if (culture == null || source.ContentType.VariesByCulture() == false)
+ return source.UpdateDate;
+
+ var pubDate = source.GetPublishDate(culture);
+ return pubDate.HasValue ? pubDate.Value : source.UpdateDate;
+ }
+ }
+
+ internal class CulturePublishedResolver : IValueResolver, bool>
+ {
+ public bool Resolve(IContent source, ContentItemBasic destination, bool destMember, ResolutionContext context)
+ {
+ var culture = context.GetCulture();
+
+ //a culture needs to be in the context for a variant content item
+ if (culture == null || source.ContentType.VariesByCulture() == false)
+ return source.Published;
+
+ return source.IsCulturePublished(culture);
+ }
+ }
+
internal class CultureNameResolver : IValueResolver, string>
{
public string Resolve(IContent source, ContentItemBasic destination, string destMember, ResolutionContext context)
{
- return source.GetCultureName(context.GetCulture());
+ var culture = context.GetCulture();
+
+ //a culture needs to be in the context for a variant content item
+ if (culture == null || source.ContentType.VariesByCulture() == false)
+ return source.Name;
+
+ if (source.CultureNames.TryGetValue(culture, out var name) && !string.IsNullOrWhiteSpace(name))
+ {
+ return name;
+ }
+ else
+ {
+ return $"({ source.Name })";
+ }
}
}
}
diff --git a/src/Umbraco.Web/PublishedCache/NuCache/PublishedSnapshotService.cs b/src/Umbraco.Web/PublishedCache/NuCache/PublishedSnapshotService.cs
index 5bcb2f70d4..a39f034a39 100644
--- a/src/Umbraco.Web/PublishedCache/NuCache/PublishedSnapshotService.cs
+++ b/src/Umbraco.Web/PublishedCache/NuCache/PublishedSnapshotService.cs
@@ -303,7 +303,7 @@ namespace Umbraco.Web.PublishedCache.NuCache
var kits = _dataSource.GetAllContentSources(scope);
_contentStore.SetAll(kits);
sw.Stop();
- _logger.Debug("Loaded content from database ({ElapsedMilliseconds}ms)", sw.ElapsedMilliseconds);
+ _logger.Debug("Loaded content from database ({Duration}ms)", sw.ElapsedMilliseconds);
}
private void LoadContentFromLocalDbLocked(IScope scope)
@@ -317,7 +317,7 @@ namespace Umbraco.Web.PublishedCache.NuCache
var kits = _localContentDb.Select(x => x.Value).OrderBy(x => x.Node.Level);
_contentStore.SetAll(kits);
sw.Stop();
- _logger.Debug("Loaded content from local db ({ElapsedMilliseconds}ms)", sw.ElapsedMilliseconds);
+ _logger.Debug("Loaded content from local db ({Duration}ms)", sw.ElapsedMilliseconds);
}
// keep these around - might be useful
@@ -370,7 +370,7 @@ namespace Umbraco.Web.PublishedCache.NuCache
var kits = _dataSource.GetAllMediaSources(scope);
_mediaStore.SetAll(kits);
sw.Stop();
- _logger.Debug("Loaded media from database ({ElapsedMilliseconds}ms)", sw.ElapsedMilliseconds);
+ _logger.Debug("Loaded media from database ({Duration}ms)", sw.ElapsedMilliseconds);
}
private void LoadMediaFromLocalDbLocked(IScope scope)
@@ -384,7 +384,7 @@ namespace Umbraco.Web.PublishedCache.NuCache
var kits = _localMediaDb.Select(x => x.Value);
_mediaStore.SetAll(kits);
sw.Stop();
- _logger.Debug("Loaded media from local db ({ElapsedMilliseconds}ms)", sw.ElapsedMilliseconds);
+ _logger.Debug("Loaded media from local db ({Duration}ms)", sw.ElapsedMilliseconds);
}
// keep these around - might be useful
diff --git a/src/Umbraco.Web/Routing/ContentFinderByRedirectUrl.cs b/src/Umbraco.Web/Routing/ContentFinderByRedirectUrl.cs
index d50951161c..ee495b6d7d 100644
--- a/src/Umbraco.Web/Routing/ContentFinderByRedirectUrl.cs
+++ b/src/Umbraco.Web/Routing/ContentFinderByRedirectUrl.cs
@@ -48,7 +48,7 @@ namespace Umbraco.Web.Routing
if (redirectUrl == null)
{
- _logger.Debug("No match for route: '{Route}'", route);
+ _logger.Debug("No match for route: {Route}", route);
return false;
}
@@ -56,11 +56,11 @@ namespace Umbraco.Web.Routing
var url = content == null ? "#" : content.Url;
if (url.StartsWith("#"))
{
- _logger.Debug("Route '{Route}' matches content {ContentId} which has no url.", route, redirectUrl.ContentId);
+ _logger.Debug("Route {Route} matches content {ContentId} which has no url.", route, redirectUrl.ContentId);
return false;
}
- _logger.Debug("Route '{Route}' matches content {ContentId} with url '{Url}', redirecting.", route, content.Id, url);
+ _logger.Debug("Route {Route} matches content {ContentId} with url '{Url}', redirecting.", route, content.Id, url);
frequest.SetRedirectPermanent(url);
return true;
}
diff --git a/src/Umbraco.Web/Routing/ContentFinderByUrl.cs b/src/Umbraco.Web/Routing/ContentFinderByUrl.cs
index a3c54406a8..a0dceb23ad 100644
--- a/src/Umbraco.Web/Routing/ContentFinderByUrl.cs
+++ b/src/Umbraco.Web/Routing/ContentFinderByUrl.cs
@@ -46,7 +46,7 @@ namespace Umbraco.Web.Routing
{
if (docreq == null) throw new System.ArgumentNullException(nameof(docreq));
- Logger.Debug("Test route '{Route}'", route);
+ Logger.Debug("Test route {Route}", route);
var node = docreq.UmbracoContext.ContentCache.GetByRoute(route, culture: docreq.Culture?.Name);
if (node != null)
diff --git a/src/Umbraco.Web/Routing/PublishedRouter.cs b/src/Umbraco.Web/Routing/PublishedRouter.cs
index f23473e369..42137d3b9e 100644
--- a/src/Umbraco.Web/Routing/PublishedRouter.cs
+++ b/src/Umbraco.Web/Routing/PublishedRouter.cs
@@ -276,7 +276,7 @@ namespace Umbraco.Web.Routing
// note - we are not handling schemes nor ports here.
- _logger.Debug("{TracePrefix}Uri='{RequestUri}'", tracePrefix, request.Uri);
+ _logger.Debug("{TracePrefix}Uri={RequestUri}", tracePrefix, request.Uri);
var domainsCache = request.UmbracoContext.PublishedSnapshot.Domains;
var domains = domainsCache.GetAll(includeWildcards: false).ToList();
@@ -313,7 +313,7 @@ namespace Umbraco.Web.Routing
if (domainAndUri != null)
{
// matching an existing domain
- _logger.Debug("{TracePrefix}Matches domain='{Domain}', rootId={RootContentId}, culture='{Culture}'", tracePrefix, domainAndUri.Name, domainAndUri.ContentId, domainAndUri.Culture);
+ _logger.Debug("{TracePrefix}Matches domain={Domain}, rootId={RootContentId}, culture={Culture}", tracePrefix, domainAndUri.Name, domainAndUri.ContentId, domainAndUri.Culture);
request.Domain = domainAndUri;
request.Culture = domainAndUri.Culture;
@@ -333,7 +333,7 @@ namespace Umbraco.Web.Routing
request.Culture = defaultCulture == null ? CultureInfo.CurrentUICulture : new CultureInfo(defaultCulture);
}
- _logger.Debug("{TracePrefix}Culture='{CultureName}'", tracePrefix, request.Culture.Name);
+ _logger.Debug("{TracePrefix}Culture={CultureName}", tracePrefix, request.Culture.Name);
return request.Domain != null;
}
@@ -349,7 +349,7 @@ namespace Umbraco.Web.Routing
return;
var nodePath = request.PublishedContent.Path;
- _logger.Debug("{TracePrefix}Path='{NodePath}'", tracePrefix, nodePath);
+ _logger.Debug("{TracePrefix}Path={NodePath}", tracePrefix, nodePath);
var rootNodeId = request.HasDomain ? request.Domain.ContentId : (int?)null;
var domain = DomainHelper.FindWildcardDomainInPath(request.UmbracoContext.PublishedSnapshot.Domains.GetAll(true), nodePath, rootNodeId);
@@ -357,7 +357,7 @@ namespace Umbraco.Web.Routing
if (domain != null)
{
request.Culture = domain.Culture;
- _logger.Debug("{TracePrefix}Got domain on node {DomainContentId}, set culture to '{CultureName}'", tracePrefix, domain.ContentId, request.Culture.Name);
+ _logger.Debug("{TracePrefix}Got domain on node {DomainContentId}, set culture to {CultureName}", tracePrefix, domain.ContentId, request.Culture.Name);
}
else
{
@@ -434,7 +434,7 @@ namespace Umbraco.Web.Routing
/// A value indicating whether a document and template were found.
private void FindPublishedContentAndTemplate(PublishedRequest request)
{
- _logger.Debug("FindPublishedContentAndTemplate: Path='{UriAbsolutePath}'", request.Uri.AbsolutePath);
+ _logger.Debug("FindPublishedContentAndTemplate: Path={UriAbsolutePath}", request.Uri.AbsolutePath);
// run the document finders
FindPublishedContent(request);
@@ -540,7 +540,7 @@ namespace Umbraco.Web.Routing
if (i == maxLoop || j == maxLoop)
{
- _logger.Debug("HandlePublishedContent: Looks like we're running into an infinite loop, abort");
+ _logger.Debug("HandlePublishedContent: Looks like we are running into an infinite loop, abort");
request.PublishedContent = null;
}
@@ -712,7 +712,7 @@ namespace Umbraco.Web.Routing
if (request.HasTemplate)
_logger.Debug("FindTemplate: Has a template already, but also an alternative template.");
- _logger.Debug("FindTemplate: Look for alternative template alias='{AltTemplate}'", altTemplate);
+ _logger.Debug("FindTemplate: Look for alternative template alias={AltTemplate}", altTemplate);
// IsAllowedTemplate deals both with DisableAlternativeTemplates and ValidateAlternativeTemplates settings
if (request.PublishedContent.IsAllowedTemplate(altTemplate))
@@ -723,16 +723,16 @@ namespace Umbraco.Web.Routing
if (template != null)
{
request.TemplateModel = template;
- _logger.Debug("FindTemplate: Got alternative template id={TemplateId} alias='{TemplateAlias}'", template.Id, template.Alias);
+ _logger.Debug("FindTemplate: Got alternative template id={TemplateId} alias={TemplateAlias}", template.Id, template.Alias);
}
else
{
- _logger.Debug("FindTemplate: The alternative template with alias='{AltTemplate}' does not exist, ignoring.", altTemplate);
+ _logger.Debug("FindTemplate: The alternative template with alias={AltTemplate} does not exist, ignoring.", altTemplate);
}
}
else
{
- _logger.Warn("FindTemplate: Alternative template '{TemplateAlias}' is not allowed on node {NodeId}, ignoring.", altTemplate, request.PublishedContent.Id);
+ _logger.Warn("FindTemplate: Alternative template {TemplateAlias} is not allowed on node {NodeId}, ignoring.", altTemplate, request.PublishedContent.Id);
// no allowed, back to default
var templateId = request.PublishedContent.TemplateId;
@@ -755,7 +755,7 @@ namespace Umbraco.Web.Routing
}
else
{
- _logger.Debug("FindTemplate: Running with template id={TemplateId} alias='{TemplateAlias}'", request.TemplateModel.Id, request.TemplateModel.Alias);
+ _logger.Debug("FindTemplate: Running with template id={TemplateId} alias={TemplateAlias}", request.TemplateModel.Id, request.TemplateModel.Alias);
}
}
@@ -772,7 +772,7 @@ namespace Umbraco.Web.Routing
var template = _services.FileService.GetTemplate(templateId);
if (template == null)
throw new InvalidOperationException("The template with Id " + templateId + " does not exist, the page cannot render.");
- _logger.Debug("GetTemplateModel: Got template id={TemplateId} alias=\"{TemplateAlias}\"", template.Id, template.Alias);
+ _logger.Debug("GetTemplateModel: Got template id={TemplateId} alias={TemplateAlias}", template.Id, template.Alias);
return template;
}
diff --git a/src/Umbraco.Web/Templates/TemplateUtilities.cs b/src/Umbraco.Web/Templates/TemplateUtilities.cs
index 782878b5c0..4ad14cb7ca 100644
--- a/src/Umbraco.Web/Templates/TemplateUtilities.cs
+++ b/src/Umbraco.Web/Templates/TemplateUtilities.cs
@@ -100,7 +100,7 @@ namespace Umbraco.Web.Templates
{
// find all relative urls (ie. urls that contain ~)
var tags = ResolveUrlPattern.Matches(text);
- Current.Logger.Debug(typeof(IOHelper), "After regex: {ElapsedMilliseconds} matched: {TagsCount}", timer.Stopwatch.ElapsedMilliseconds, tags.Count);
+ Current.Logger.Debug(typeof(IOHelper), "After regex: {Duration} matched: {TagsCount}", timer.Stopwatch.ElapsedMilliseconds, tags.Count);
foreach (Match tag in tags)
{
var url = "";
diff --git a/src/Umbraco.Web/UmbracoModule.cs b/src/Umbraco.Web/UmbracoModule.cs
index 2094781ee0..d0ad7568e0 100644
--- a/src/Umbraco.Web/UmbracoModule.cs
+++ b/src/Umbraco.Web/UmbracoModule.cs
@@ -21,6 +21,7 @@ using Umbraco.Core.Security;
using Umbraco.Core.Services;
using Umbraco.Web.Composing;
using Umbraco.Web.PublishedCache;
+using Umbraco.Core.Logging.Serilog.Enrichers;
namespace Umbraco.Web
{
@@ -558,10 +559,13 @@ namespace Umbraco.Web
{
var httpContext = ((HttpApplication) sender).Context;
- //Create a new Request ID/GUID
- requestId = Guid.NewGuid();
+ var httpRequestId = Guid.Empty;
+ HttpRequestIdEnricher.TryGetCurrentHttpRequestId(out httpRequestId);
+
+ Logger.Verbose("Begin request [{HttpRequestId}]: {RequestUrl}",
+ httpRequestId,
+ httpContext.Request.Url);
- Logger.Verbose("Begin request [{RequestId}]: {RequestUrl}", requestId, httpContext.Request.Url);
BeginRequest(new HttpContextWrapper(httpContext));
};
@@ -604,9 +608,12 @@ namespace Umbraco.Web
if (UmbracoContext.Current != null)
{
+ var httpRequestId = Guid.Empty;
+ HttpRequestIdEnricher.TryGetCurrentHttpRequestId(out httpRequestId);
+
Logger.Verbose(
- "End Request [{RequestId}]: {RequestUrl} ({RequestTotalMilliseconds}ms)",
- requestId,
+ "End request [{HttpRequestId}]: {RequestUrl} took {Duration}ms",
+ httpRequestId,
httpContext.Request.Url,
DateTime.Now.Subtract(UmbracoContext.Current.ObjectCreated).TotalMilliseconds);
}