diff --git a/src/Umbraco.Core/Models/PropertyType.cs b/src/Umbraco.Core/Models/PropertyType.cs index d38a516911..28a34f0e5e 100644 --- a/src/Umbraco.Core/Models/PropertyType.cs +++ b/src/Umbraco.Core/Models/PropertyType.cs @@ -406,7 +406,9 @@ namespace Umbraco.Core.Models } } - + + //TODO: We must ensure that the property value can actually be saved based on the specified database type + //TODO Add PropertyEditor validation when its relevant to introduce /*if (value is IEditorModel && DataTypeControlId != Guid.Empty) { diff --git a/src/Umbraco.Web.UI/umbraco_client/Application/Extensions.js b/src/Umbraco.Web.UI/umbraco_client/Application/Extensions.js index 04173f8749..66c97c4db7 100644 --- a/src/Umbraco.Web.UI/umbraco_client/Application/Extensions.js +++ b/src/Umbraco.Web.UI/umbraco_client/Application/Extensions.js @@ -256,7 +256,21 @@ contentType: 'application/json; charset=utf-8', error: function (x, t, e) { if (x.status.toString().startsWith("500")) { - $u.Sys.ApiMgr.getApp().handleAjaxException(x, t, e); + //show ysod overlay if we can + if (UmbClientMgr) { + var startIndex = x.responseText.indexOf(""); + var body = x.responseText.substring(startIndex, endIndex + 7); + var $div = $(body.replace("", "
").replace("", "
")); + $div.appendTo($(UmbClientMgr.mainWindow().document.getElementsByTagName("body")[0])); + UmbClientMgr.openModalWindowForContent($div, "ysod", true, 640, 640, null, null, null, function() { + //remove the $div + $div.closest(".umbModalBox").remove(); + }); + } + else { + alert("Unhandled exception occurred.\nStatus: " + x.status + "\nMessage: " + x.statusText + "\n\n" + x.responseText); + } } } }); diff --git a/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoClientManager.js b/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoClientManager.js index fc9d9ac572..77d615b6fe 100644 --- a/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoClientManager.js +++ b/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoClientManager.js @@ -177,6 +177,26 @@ Umbraco.Sys.registerNamespace("Umbraco.Application"); } } }, + openModalWindowForContent: function (jQueryElement, name, showHeader, width, height, top, leftOffset, closeTriggers, onCloseCallback) { + //need to create the modal on the top window if the top window has a client manager, if not, create it on the current window + + //if this is the top window, or if the top window doesn't have a client manager, create the modal in this manager + if (window == this.mainWindow() || !this.mainWindow().UmbClientMgr) { + var m = new Umbraco.Controls.ModalWindow(); + this._modal.push(m); + m.show(jQueryElement, name, showHeader, width, height, top, leftOffset, closeTriggers, onCloseCallback); + } + else { + //if the main window has a client manager, then call the main window's open modal method whilst keeping the context of it's manager. + if (this.mainWindow().UmbClientMgr) { + this.mainWindow().UmbClientMgr.openModalWindowForContent.apply(this.mainWindow().UmbClientMgr, + [jQueryElement, name, showHeader, width, height, top, leftOffset, closeTriggers, onCloseCallback]); + } + else { + return; //exit recurse. + } + } + }, closeModalWindow: function(rVal) { /// /// will close the latest open modal window. diff --git a/src/Umbraco.Web.UI/umbraco_client/modal/modal.js b/src/Umbraco.Web.UI/umbraco_client/modal/modal.js index 597c95476f..c2c2812b0e 100644 --- a/src/Umbraco.Web.UI/umbraco_client/modal/modal.js +++ b/src/Umbraco.Web.UI/umbraco_client/modal/modal.js @@ -118,6 +118,7 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); /// The callback will receive one parameter with 2 properties: /// modalContent = the jQuery object for the popup window to query against /// outVal = the value passed to the close window method that was used to close the window (if it was specified) + /// /// The generated jquery object bound to the modal window @@ -355,7 +356,7 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); $.fn.jqmAddClose = function(e) { return hs(this, e, 'jqmHide'); }; $.fn.jqmAddTrigger = function(e) { return hs(this, e, 'jqmShow'); }; $.fn.jqmShow = function(t) { return this.each(function() { $.jqm.open(this._jqm, t); }); }; - $.fn.jqmHide = function(t) { return this.each(function() { $.jqm.close(this._jqm, t) }); }; + $.fn.jqmHide = function(t) { return this.each(function() { $.jqm.close(this._jqm, t); }); }; $.jqm = { hash: {}, diff --git a/src/Umbraco.Web/Security/Providers/UmbracoMembershipProvider.cs b/src/Umbraco.Web/Security/Providers/UmbracoMembershipProvider.cs index d2f520b86d..8673cfc80b 100644 --- a/src/Umbraco.Web/Security/Providers/UmbracoMembershipProvider.cs +++ b/src/Umbraco.Web/Security/Providers/UmbracoMembershipProvider.cs @@ -330,7 +330,10 @@ namespace Umbraco.Web.Security.Providers { member.LastLoginDate = DateTime.Now; member.UpdateDate = DateTime.Now; - MemberService.Save(member); + //don't raise events for this! It just sets the member dates, if we do raise events this will + // cause all distributed cache to execute - which will clear out some caches we don't want. + // http://issues.umbraco.org/issue/U4-3451 + MemberService.Save(member, false); } return ConvertToMembershipUser(member); @@ -356,7 +359,10 @@ namespace Umbraco.Web.Security.Providers { member.LastLoginDate = DateTime.Now; member.UpdateDate = DateTime.Now; - MemberService.Save(member); + //don't raise events for this! It just sets the member dates, if we do raise events this will + // cause all distributed cache to execute - which will clear out some caches we don't want. + // http://issues.umbraco.org/issue/U4-3451 + MemberService.Save(member, false); } return ConvertToMembershipUser(member); @@ -530,7 +536,11 @@ namespace Umbraco.Web.Security.Providers member.LastLoginDate = DateTime.Now; } - MemberService.Save(member); + //don't raise events for this! It just sets the member dates, if we do raise events this will + // cause all distributed cache to execute - which will clear out some caches we don't want. + // http://issues.umbraco.org/issue/U4-3451 + MemberService.Save(member, false); + return authenticated; } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentTypeControlNew.ascx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentTypeControlNew.ascx.cs index 7a94afced9..0f1fc3a090 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentTypeControlNew.ascx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentTypeControlNew.ascx.cs @@ -18,6 +18,7 @@ using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.Logging; using Umbraco.Core.Models; +using Umbraco.Core.Strings; using Umbraco.Web.UI.Controls; using umbraco.BusinessLogic; using umbraco.cms.businesslogic; diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/create/nodetypeTasks.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/create/nodetypeTasks.cs index 0b54756b74..07c33f3dc4 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/create/nodetypeTasks.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/create/nodetypeTasks.cs @@ -8,6 +8,7 @@ using Umbraco.Core.Models; using Umbraco.Core.Strings; using Umbraco.Web.UI; using umbraco.BusinessLogic; +using Umbraco.Core.Strings; using umbraco.DataLayer; using umbraco.BasePages; using Umbraco.Core.IO; diff --git a/src/umbraco.cms/businesslogic/member/Member.cs b/src/umbraco.cms/businesslogic/member/Member.cs index f4be10a842..a2400dbc9c 100644 --- a/src/umbraco.cms/businesslogic/member/Member.cs +++ b/src/umbraco.cms/businesslogic/member/Member.cs @@ -578,11 +578,11 @@ namespace umbraco.cms.businesslogic.member Version = MemberItem.Version; } - /// - /// Used to persist object changes to the database. In Version3.0 it's just a stub for future compatibility + /// Used to persist object changes to the database /// - public override void Save() + /// + public void Save(bool raiseEvents) { var provider = MembershipProviderExtensions.GetMembersMembershipProvider(); //Due to backwards compatibility with this API we need to check for duplicate emails here if required. @@ -596,17 +596,19 @@ namespace umbraco.cms.businesslogic.member } var e = new SaveEventArgs(); - FireBeforeSave(e); + if (raiseEvents) + { + FireBeforeSave(e); + } foreach (var property in GenericProperties) { MemberItem.SetValue(property.PropertyType.Alias, property.Value); } - if (!e.Cancel) + if (e.Cancel == false) { - - ApplicationContext.Current.Services.MemberService.Save(MemberItem); + ApplicationContext.Current.Services.MemberService.Save(MemberItem, raiseEvents); //base.VersionDate = MemberItem.UpdateDate; @@ -622,88 +624,19 @@ namespace umbraco.cms.businesslogic.member SavePreviewXml(generateXmlWithoutSaving(xd), Guid.NewGuid()); } - FireAfterSave(e); + if (raiseEvents) + { + FireAfterSave(e); + } } + } - //var e = new SaveEventArgs(); - //FireBeforeSave(e); - - //if (!e.Cancel) - //{ - // var db = ApplicationContext.Current.DatabaseContext.Database; - // using (var transaction = db.GetTransaction()) - // { - // foreach (var property in GenericProperties) - // { - // var poco = new PropertyDataDto - // { - // Id = property.Id, - // PropertyTypeId = property.PropertyType.Id, - // NodeId = Id, - // VersionId = property.VersionId - // }; - // if (property.Value != null) - // { - // string dbType = property.PropertyType.DataTypeDefinition.DbType; - // if (dbType.Equals("Integer")) - // { - // if (property.Value is bool || property.PropertyType.DataTypeDefinition.DataType.Id == new Guid("38b352c1-e9f8-4fd8-9324-9a2eab06d97a")) - // { - // poco.Integer = property.Value != null && string.IsNullOrEmpty(property.Value.ToString()) - // ? 0 - // : Convert.ToInt32(property.Value); - // } - // else - // { - // int value = 0; - // if (int.TryParse(property.Value.ToString(), out value)) - // { - // poco.Integer = value; - // } - // } - // } - // else if (dbType.Equals("Date")) - // { - // DateTime date; - - // if (DateTime.TryParse(property.Value.ToString(), out date)) - // poco.Date = date; - // } - // else if (dbType.Equals("Nvarchar")) - // { - // poco.VarChar = property.Value.ToString(); - // } - // else - // { - // poco.Text = property.Value.ToString(); - // } - // } - // bool isNew = db.IsNew(poco); - // if (isNew) - // { - // db.Insert(poco); - // } - // else - // { - // db.Update(poco); - // } - // } - // transaction.Complete(); - // } - - // // re-generate xml - // var xd = new XmlDocument(); - // XmlGenerate(xd); - - // // generate preview for blame history? - // if (UmbracoSettings.EnableGlobalPreviewStorage) - // { - // // Version as new guid to ensure different versions are generated as members are not versioned currently! - // SavePreviewXml(generateXmlWithoutSaving(xd), Guid.NewGuid()); - // } - - // FireAfterSave(e); - //} + /// + /// Used to persist object changes to the database. In Version3.0 it's just a stub for future compatibility + /// + public override void Save() + { + Save(true); } /// diff --git a/src/umbraco.providers/members/UmbracoMembershipProvider.cs b/src/umbraco.providers/members/UmbracoMembershipProvider.cs index 5109221a76..a1ddd50260 100644 --- a/src/umbraco.providers/members/UmbracoMembershipProvider.cs +++ b/src/umbraco.providers/members/UmbracoMembershipProvider.cs @@ -512,6 +512,11 @@ namespace umbraco.providers.members if (userIsOnline && LastLoginPropertyTypeAlias.IsNullOrWhiteSpace() == false) { UpdateMemberProperty(m, LastLoginPropertyTypeAlias, DateTime.Now); + + //don't raise events for this! It just sets the member dates, if we do raise events this will + // cause all distributed cache to execute - which will clear out some caches we don't want. + // http://issues.umbraco.org/issue/U4-3451 + m.Save(false); } return ConvertToMembershipUser(m); @@ -534,6 +539,10 @@ namespace umbraco.providers.members if (userIsOnline && LastLoginPropertyTypeAlias.IsNullOrWhiteSpace() == false) { UpdateMemberProperty(m, LastLoginPropertyTypeAlias, DateTime.Now); + //don't raise events for this! It just sets the member dates, if we do raise events this will + // cause all distributed cache to execute - which will clear out some caches we don't want. + // http://issues.umbraco.org/issue/U4-3451 + m.Save(false); } return ConvertToMembershipUser(m); } @@ -544,6 +553,10 @@ namespace umbraco.providers.members if (userIsOnline && LastLoginPropertyTypeAlias.IsNullOrWhiteSpace() == false) { UpdateMemberProperty(m, LastLoginPropertyTypeAlias, DateTime.Now); + //don't raise events for this! It just sets the member dates, if we do raise events this will + // cause all distributed cache to execute - which will clear out some caches we don't want. + // http://issues.umbraco.org/issue/U4-3451 + m.Save(false); } return ConvertToMembershipUser(m); } @@ -744,7 +757,11 @@ namespace umbraco.providers.members } // persist data - m.Save(); + + //don't raise events for this! It just sets the member dates, if we do raise events this will + // cause all distributed cache to execute - which will clear out some caches we don't want. + // http://issues.umbraco.org/issue/U4-3451 + m.Save(false); return true; } @@ -768,7 +785,11 @@ namespace umbraco.providers.members UpdateMemberProperty(m, LastLockedOutPropertyTypeAlias, DateTime.Now); LogHelper.Info("Member " + username + " is now locked out, max invalid password attempts exceeded"); } - m.Save(); + + //don't raise events for this! It just sets the member dates, if we do raise events this will + // cause all distributed cache to execute - which will clear out some caches we don't want. + // http://issues.umbraco.org/issue/U4-3451 + m.Save(false); } }