diff --git a/README.md b/README.md index f842afd3c2..61a16083d0 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Umbraco CMS **More than 177,000 sites trust Umbraco** -For the first time on the Microsoft platform a free user and developer friendly CMS that makes it quick and easy to create websites - or a breeze to build complex web applications. Umbraco has award-winning integration capabilities and supports your ASP.NET User and Custom Controls out of the box. It's a developers dream and your users will love it too. +For the first time on the Microsoft platform a free user and developer friendly CMS that makes it quick and easy to create websites - or a breeze to build complex web applications. Umbraco has award-winning integration capabilities and supports ASP.NET MVC or Web Forms, including User and Custom Controls, out of the box. It's a developers dream and your users will love it too. Used by more than 177,000 active websites including [http://daviscup.com](http://daviscup.com), [http://heinz.com](http://heinz.com), [http://peugeot.com](http://peugeot.com), [http://www.hersheys.com/](http://www.hersheys.com/) and **The Official ASP.NET and IIS.NET website from Microsoft** ([http://asp.net](http://asp.net) / [http://iis.net](http://iis.net)) you can be sure that the technology is proven, stable and scales. @@ -16,7 +16,7 @@ To view more examples please visit [http://umbraco.com/why-umbraco/#caseStudies] ## Downloading ## -The downloadable Umbraco releases live at [http://our.umbraco.org/contribute/releases](http://our.umbraco.org/contribute/releases). +The downloadable Umbraco releases live at [http://our.umbraco.org/download](http://our.umbraco.org/download). ## Forums ## diff --git a/build/NuSpecs/UmbracoCms.nuspec b/build/NuSpecs/UmbracoCms.nuspec index 82be656204..e84ebc8e2e 100644 --- a/build/NuSpecs/UmbracoCms.nuspec +++ b/build/NuSpecs/UmbracoCms.nuspec @@ -10,8 +10,8 @@ http://umbraco.com/ http://umbraco.com/media/357769/100px_transparent.png false - Installs Umbraco Cms in your Visual Studio ASP.NET Webforms project - Installs Umbraco Cms in your Visual Studio ASP.NET Webforms project + Installs Umbraco Cms in your Visual Studio ASP.NET project + Installs Umbraco Cms in your Visual Studio ASP.NET project en-US umbraco diff --git a/src/Umbraco.Core/Configuration/UmbracoSettings.cs b/src/Umbraco.Core/Configuration/UmbracoSettings.cs index 9eadbb2f34..4ed5027539 100644 --- a/src/Umbraco.Core/Configuration/UmbracoSettings.cs +++ b/src/Umbraco.Core/Configuration/UmbracoSettings.cs @@ -1305,6 +1305,25 @@ namespace Umbraco.Core.Configuration } } + /// + /// Gets the default document type property used when adding new properties through the back-office + /// + /// Configured text for the default document type property + /// If undefined, 'Textstring' is the default + public static string DefaultDocumentTypeProperty + { + get + { + var defaultDocumentTypeProperty = GetKey("/settings/content/defaultDocumentTypeProperty"); + if (string.IsNullOrEmpty(defaultDocumentTypeProperty)) + { + defaultDocumentTypeProperty = "Textstring"; + } + + return defaultDocumentTypeProperty; + } + } + /// /// Configuration regarding webservices /// diff --git a/src/Umbraco.Core/DatabaseContext.cs b/src/Umbraco.Core/DatabaseContext.cs index 420831d299..214636153a 100644 --- a/src/Umbraco.Core/DatabaseContext.cs +++ b/src/Umbraco.Core/DatabaseContext.cs @@ -169,6 +169,20 @@ namespace Umbraco.Core Initialize(providerName); } + /// + /// Configures a ConnectionString for the Umbraco database that uses Microsoft SQL Server integrated security. + /// + /// Name or address of the database server + /// Name of the database + public void ConfigureIntegratedSecurityDatabaseConnection(string server, string databaseName) + { + const string providerName = "System.Data.SqlClient"; + string connectionString = String.Format("Server={0};Database={1};Integrated Security=true", server, databaseName); + + SaveConnectionString(connectionString, providerName); + Initialize(providerName); + } + internal string BuildAzureConnectionString(string server, string databaseName, string user, string password) { if (server.Contains(".") && ServerStartsWithTcp(server) == false) diff --git a/src/Umbraco.Core/DateTimeExtensions.cs b/src/Umbraco.Core/DateTimeExtensions.cs new file mode 100644 index 0000000000..74460814b3 --- /dev/null +++ b/src/Umbraco.Core/DateTimeExtensions.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Umbraco.Core +{ + public static class DateTimeExtensions + { + + /// + /// Returns the DateTime as an ISO formatted string that is globally expectable + /// + /// + /// + public static string ToIsoString(this DateTime dt) + { + return dt.ToString("yyyy-MM-dd HH:mm:ss"); + } + + } +} diff --git a/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs b/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs index e79b61ed5d..6a53e8bc5c 100644 --- a/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs +++ b/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs @@ -1,9 +1,11 @@ using System; +using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Runtime.Caching; using System.Threading; +using System.Web; using Umbraco.Core.Models.EntityBase; namespace Umbraco.Core.Persistence.Caching @@ -11,6 +13,19 @@ namespace Umbraco.Core.Persistence.Caching /// /// The Runtime Cache provider looks up objects in the Runtime cache for fast retrival /// + /// + /// + /// If a web session is detected then the HttpRuntime.Cache will be used for the runtime cache, otherwise a custom + /// MemoryCache instance will be used. It is important to use the HttpRuntime.Cache when a web session is detected so + /// that the memory management of cache in IIS can be handled appopriately. + /// + /// When a web sessions is detected we will pre-fix all HttpRuntime.Cache entries so that when we clear it we are only + /// clearing items that have been inserted by this provider. + /// + /// NOTE: These changes are all temporary until we finalize the ApplicationCache implementation which will support static cache, runtime cache + /// and request based cache which will all live in one central location so it is easily managed. + /// + /// internal sealed class RuntimeCacheProvider : IRepositoryCacheProvider { #region Singleton @@ -21,19 +36,25 @@ namespace Umbraco.Core.Persistence.Caching private RuntimeCacheProvider() { + if (HttpContext.Current == null) + { + _memoryCache = new MemoryCache("in-memory"); + } } #endregion //TODO Save this in cache as well, so its not limited to a single server usage private readonly ConcurrentHashSet _keyTracker = new ConcurrentHashSet(); - private ObjectCache _memoryCache = new MemoryCache("in-memory"); + private ObjectCache _memoryCache; private static readonly ReaderWriterLockSlim ClearLock = new ReaderWriterLockSlim(); public IEntity GetById(Type type, Guid id) { var key = GetCompositeId(type, id); - var item = _memoryCache.Get(key); + var item = HttpContext.Current == null + ? _memoryCache.Get(key) + : HttpRuntime.Cache.Get(key); return item as IEntity; } @@ -41,7 +62,11 @@ namespace Umbraco.Core.Persistence.Caching { foreach (var guid in ids) { - yield return _memoryCache.Get(GetCompositeId(type, guid)) as IEntity; + var item = HttpContext.Current == null + ? _memoryCache.Get(GetCompositeId(type, guid)) + : HttpRuntime.Cache.Get(GetCompositeId(type, guid)); + + yield return item as IEntity; } } @@ -51,7 +76,11 @@ namespace Umbraco.Core.Persistence.Caching { if (key.StartsWith(type.Name)) { - yield return _memoryCache.Get(key) as IEntity; + var item = HttpContext.Current == null + ? _memoryCache.Get(key) + : HttpRuntime.Cache.Get(key); + + yield return item as IEntity; } } } @@ -59,21 +88,34 @@ namespace Umbraco.Core.Persistence.Caching public void Save(Type type, IEntity entity) { var key = GetCompositeId(type, entity.Id); - var exists = _memoryCache.GetCacheItem(key) != null; + _keyTracker.TryAdd(key); - if (exists) + + //NOTE: Before we were checking if it already exists but the MemoryCache.Set handles this implicitly and does + // an add or update, same goes for HttpRuntime.Cache.Insert. + + if (HttpContext.Current == null) { _memoryCache.Set(key, entity, new CacheItemPolicy { SlidingExpiration = TimeSpan.FromMinutes(5) }); - return; } - - _memoryCache.Add(key, entity, new CacheItemPolicy { SlidingExpiration = TimeSpan.FromMinutes(5) }); + else + { + HttpRuntime.Cache.Insert(key, entity, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(5)); + } } public void Delete(Type type, IEntity entity) { var key = GetCompositeId(type, entity.Id); - _memoryCache.Remove(key); + if (HttpContext.Current == null) + { + _memoryCache.Remove(key); + } + else + { + HttpRuntime.Cache.Remove(key); + } + _keyTracker.Remove(key); } @@ -88,14 +130,21 @@ namespace Umbraco.Core.Persistence.Caching var keys = new string[_keyTracker.Count]; _keyTracker.CopyTo(keys, 0); var keysToRemove = new List(); - foreach (var key in keys.Where(x => x.StartsWith(string.Format("{0}-", type.Name)))) + foreach (var key in keys.Where(x => x.StartsWith(string.Format("{0}{1}-", CacheItemPrefix, type.Name)))) { _keyTracker.Remove(key); keysToRemove.Add(key); } foreach (var key in keysToRemove) { - _memoryCache.Remove(key); + if (HttpContext.Current == null) + { + _memoryCache.Remove(key); + } + else + { + HttpRuntime.Cache.Remove(key); + } } } } @@ -105,19 +154,40 @@ namespace Umbraco.Core.Persistence.Caching using (new WriteLock(ClearLock)) { _keyTracker.Clear(); - _memoryCache.DisposeIfDisposable(); - _memoryCache = new MemoryCache("in-memory"); + + if (HttpContext.Current == null) + { + _memoryCache.DisposeIfDisposable(); + _memoryCache = new MemoryCache("in-memory"); + } + else + { + foreach (DictionaryEntry c in HttpRuntime.Cache) + { + if (c.Key is string && ((string)c.Key).InvariantStartsWith(CacheItemPrefix)) + { + if (HttpRuntime.Cache[(string)c.Key] == null) return; + HttpRuntime.Cache.Remove((string)c.Key); + } + } + } } } + /// + /// We prefix all cache keys with this so that we know which ones this class has created when + /// using the HttpRuntime cache so that when we clear it we don't clear other entries we didn't create. + /// + private const string CacheItemPrefix = "umbrtmche_"; + private string GetCompositeId(Type type, Guid id) { - return string.Format("{0}-{1}", type.Name, id.ToString()); + return string.Format("{0}{1}-{2}", CacheItemPrefix, type.Name, id.ToString()); } private string GetCompositeId(Type type, int id) { - return string.Format("{0}-{1}", type.Name, id.ToGuid()); + return string.Format("{0}{1}-{2}", CacheItemPrefix, type.Name, id.ToGuid()); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs b/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs index 6faf4d637a..51ae2638b0 100644 --- a/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs +++ b/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs @@ -74,7 +74,11 @@ namespace Umbraco.Core.Persistence //get all columns but not the primary key if it is auto-incremental var cols = string.Join(", ", ( from c in pd.Columns - where c.Value.ResultColumn == false + where + //don't return ResultColumns + !c.Value.ResultColumn + //if the table is auto-incremental, don't return the primary key + && (pd.TableInfo.AutoIncrement && c.Key != pd.TableInfo.PrimaryKey) select tableName + "." + db.EscapeSqlIdentifier(c.Key)) .ToArray()); @@ -87,10 +91,10 @@ namespace Umbraco.Core.Persistence var values = new List(); foreach (var i in pd.Columns) { - //if (pd.TableInfo.AutoIncrement && i.Key == pd.TableInfo.PrimaryKey) - //{ - // continue; - //} + if (pd.TableInfo.AutoIncrement && i.Key == pd.TableInfo.PrimaryKey) + { + continue; + } values.Add(string.Format("{0}{1}", "@", index++)); db.AddParam(cmd, i.Value.GetValue(poco), "@"); } diff --git a/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs b/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs index 7a65fe33bc..470a098fd8 100644 --- a/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs +++ b/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs @@ -455,8 +455,11 @@ namespace Umbraco.Core.Persistence.Querying if (fieldType == typeof(decimal)) return ((decimal)value).ToString(CultureInfo.InvariantCulture); - if (fieldType == typeof(DateTime)) - return "'" + EscapeParam(((DateTime)value).ToString(CultureInfo.InvariantCulture)) + "'"; + if (fieldType == typeof (DateTime)) + { + return "'" + EscapeParam(((DateTime)value).ToIsoString()) + "'"; + } + if (fieldType == typeof(bool)) return ((bool)value) ? Convert.ToString(1, CultureInfo.InvariantCulture) : Convert.ToString(0, CultureInfo.InvariantCulture); diff --git a/src/Umbraco.Core/Persistence/Querying/PocoToSqlExpressionHelper.cs b/src/Umbraco.Core/Persistence/Querying/PocoToSqlExpressionHelper.cs index 456607a348..d065849102 100644 --- a/src/Umbraco.Core/Persistence/Querying/PocoToSqlExpressionHelper.cs +++ b/src/Umbraco.Core/Persistence/Querying/PocoToSqlExpressionHelper.cs @@ -465,8 +465,11 @@ namespace Umbraco.Core.Persistence.Querying if (fieldType == typeof(decimal)) return ((decimal)value).ToString(CultureInfo.InvariantCulture); - if(fieldType == typeof(DateTime)) - return "'" + EscapeParam(((DateTime)value).ToString(CultureInfo.InvariantCulture)) + "'"; + if (fieldType == typeof (DateTime)) + { + return "'" + EscapeParam(((DateTime)value).ToIsoString()) + "'"; + } + if (fieldType == typeof(bool)) return ((bool)value) ? Convert.ToString(1, CultureInfo.InvariantCulture) : Convert.ToString(0, CultureInfo.InvariantCulture); diff --git a/src/Umbraco.Core/Persistence/RepositoryFactory.cs b/src/Umbraco.Core/Persistence/RepositoryFactory.cs index 73c7b290f9..d8d4b1c7e2 100644 --- a/src/Umbraco.Core/Persistence/RepositoryFactory.cs +++ b/src/Umbraco.Core/Persistence/RepositoryFactory.cs @@ -118,7 +118,7 @@ namespace Umbraco.Core.Persistence public virtual ITemplateRepository CreateTemplateRepository(IDatabaseUnitOfWork uow) { - return new TemplateRepository(uow, NullCacheProvider.Current); + return new TemplateRepository(uow, RuntimeCacheProvider.Current); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index 41a536fc46..8929922320 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -1135,6 +1135,9 @@ namespace Umbraco.Core.Services Audit.Add(AuditTypes.Copy, "Copy Content performed by user", content.WriterId, content.Id); + + //TODO: Don't think we need this here because cache should be cleared by the event listeners + // and the correct ICacheRefreshers!? RuntimeCacheProvider.Current.Clear(); return copy; diff --git a/src/Umbraco.Core/Sync/ConfigServerRegistrar.cs b/src/Umbraco.Core/Sync/ConfigServerRegistrar.cs index e037eb148d..5c1a8c2784 100644 --- a/src/Umbraco.Core/Sync/ConfigServerRegistrar.cs +++ b/src/Umbraco.Core/Sync/ConfigServerRegistrar.cs @@ -35,12 +35,20 @@ namespace Umbraco.Core.Sync if (_addresses == null) { _addresses = new List(); - var nodes = _xmlServers.SelectNodes("./server"); - foreach (XmlNode n in nodes) - { - _addresses.Add(new ConfigServerAddress(n)); - } + + if (_xmlServers != null) + { + var nodes = _xmlServers.SelectNodes("./server"); + if (nodes != null) + { + foreach (XmlNode n in nodes) + { + _addresses.Add(new ConfigServerAddress(n)); + } + } + } } + return _addresses; } } diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 3e4db2e6ae..5600a8da26 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -149,6 +149,7 @@ + diff --git a/src/Umbraco.Tests/Persistence/Querying/QueryBuilderTests.cs b/src/Umbraco.Tests/Persistence/Querying/QueryBuilderTests.cs index 5823970874..25fc2c3d35 100644 --- a/src/Umbraco.Tests/Persistence/Querying/QueryBuilderTests.cs +++ b/src/Umbraco.Tests/Persistence/Querying/QueryBuilderTests.cs @@ -12,6 +12,22 @@ namespace Umbraco.Tests.Persistence.Querying [TestFixture] public class QueryBuilderTests : BaseUsingSqlCeSyntax { + [Test] + public void Dates_Formatted_Properly() + { + var sql = new Sql(); + sql.Select("*").From(); + + var dt = new DateTime(2013, 11, 21, 13, 25, 55); + + var query = Query.Builder.Where(x => x.ExpireDate <= dt); + var translator = new SqlTranslator(sql, query); + + var result = translator.Translate(); + + Assert.IsTrue(result.SQL.Contains("[expireDate] <= '2013-11-21 13:25:55'")); + } + [Test] public void Can_Build_StartsWith_Query_For_IContent() { diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index e8236c813f..66d25afd0a 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -104,13 +104,13 @@ {07fbc26b-2927-4a22-8d96-d644c667fecc} UmbracoExamine - + False - ..\packages\ClientDependency.1.7.0.3\lib\ClientDependency.Core.dll + ..\packages\ClientDependency.1.7.0.4\lib\ClientDependency.Core.dll - + False - ..\packages\ClientDependency-Mvc.1.7.0.3\lib\ClientDependency.Core.Mvc.dll + ..\packages\ClientDependency-Mvc.1.7.0.4\lib\ClientDependency.Core.Mvc.dll False @@ -409,6 +409,13 @@ ContentTypeControlNew.ascx + + ASPXCodeBehind + ImageViewer.ascx + + + ImageViewer.ascx + create.aspx ASPXCodeBehind @@ -570,6 +577,14 @@ + + + + + + + + diff --git a/src/Umbraco.Web.UI/umbraco/images/pinnedIcons/task_content.ico b/src/Umbraco.Web.UI/Umbraco/Images/pinnedIcons/task_content.ico similarity index 100% rename from src/Umbraco.Web.UI/umbraco/images/pinnedIcons/task_content.ico rename to src/Umbraco.Web.UI/Umbraco/Images/pinnedIcons/task_content.ico diff --git a/src/Umbraco.Web.UI/umbraco/images/pinnedIcons/task_default.ico b/src/Umbraco.Web.UI/Umbraco/Images/pinnedIcons/task_default.ico similarity index 100% rename from src/Umbraco.Web.UI/umbraco/images/pinnedIcons/task_default.ico rename to src/Umbraco.Web.UI/Umbraco/Images/pinnedIcons/task_default.ico diff --git a/src/Umbraco.Web.UI/umbraco/images/pinnedIcons/task_developer.ico b/src/Umbraco.Web.UI/Umbraco/Images/pinnedIcons/task_developer.ico similarity index 100% rename from src/Umbraco.Web.UI/umbraco/images/pinnedIcons/task_developer.ico rename to src/Umbraco.Web.UI/Umbraco/Images/pinnedIcons/task_developer.ico diff --git a/src/Umbraco.Web.UI/umbraco/images/pinnedIcons/task_media.ico b/src/Umbraco.Web.UI/Umbraco/Images/pinnedIcons/task_media.ico similarity index 100% rename from src/Umbraco.Web.UI/umbraco/images/pinnedIcons/task_media.ico rename to src/Umbraco.Web.UI/Umbraco/Images/pinnedIcons/task_media.ico diff --git a/src/Umbraco.Web.UI/umbraco/images/pinnedIcons/task_member.ico b/src/Umbraco.Web.UI/Umbraco/Images/pinnedIcons/task_member.ico similarity index 100% rename from src/Umbraco.Web.UI/umbraco/images/pinnedIcons/task_member.ico rename to src/Umbraco.Web.UI/Umbraco/Images/pinnedIcons/task_member.ico diff --git a/src/Umbraco.Web.UI/umbraco/images/pinnedIcons/task_settings.ico b/src/Umbraco.Web.UI/Umbraco/Images/pinnedIcons/task_settings.ico similarity index 100% rename from src/Umbraco.Web.UI/umbraco/images/pinnedIcons/task_settings.ico rename to src/Umbraco.Web.UI/Umbraco/Images/pinnedIcons/task_settings.ico diff --git a/src/Umbraco.Web.UI/umbraco/images/pinnedIcons/task_users.ico b/src/Umbraco.Web.UI/Umbraco/Images/pinnedIcons/task_users.ico similarity index 100% rename from src/Umbraco.Web.UI/umbraco/images/pinnedIcons/task_users.ico rename to src/Umbraco.Web.UI/Umbraco/Images/pinnedIcons/task_users.ico diff --git a/src/Umbraco.Web.UI/umbraco/images/pinnedIcons/umb.ico b/src/Umbraco.Web.UI/Umbraco/Images/pinnedIcons/umb.ico similarity index 100% rename from src/Umbraco.Web.UI/umbraco/images/pinnedIcons/umb.ico rename to src/Umbraco.Web.UI/Umbraco/Images/pinnedIcons/umb.ico diff --git a/src/Umbraco.Web.UI/config/splashes/noNodes.aspx b/src/Umbraco.Web.UI/config/splashes/noNodes.aspx index 01b1505b43..6a71a740cb 100644 --- a/src/Umbraco.Web.UI/config/splashes/noNodes.aspx +++ b/src/Umbraco.Web.UI/config/splashes/noNodes.aspx @@ -9,7 +9,7 @@ Umbraco - no pages found - " /> + " /> diff --git a/src/Umbraco.Web.UI/config/umbracoSettings.Release.config b/src/Umbraco.Web.UI/config/umbracoSettings.Release.config index 537e7ca4ed..1758488f54 100644 --- a/src/Umbraco.Web.UI/config/umbracoSettings.Release.config +++ b/src/Umbraco.Web.UI/config/umbracoSettings.Release.config @@ -111,6 +111,9 @@ ashx,aspx,ascx,config,cshtml,vbhtml,asmx,air,axd + + + Textstring diff --git a/src/Umbraco.Web.UI/config/umbracoSettings.config b/src/Umbraco.Web.UI/config/umbracoSettings.config index e5e88a781a..4510e6ae2f 100644 --- a/src/Umbraco.Web.UI/config/umbracoSettings.config +++ b/src/Umbraco.Web.UI/config/umbracoSettings.config @@ -105,6 +105,9 @@ ashx,aspx,ascx,config,cshtml,vbhtml,asmx,air,axd + + + Textstring diff --git a/src/Umbraco.Web.UI/install/default.aspx b/src/Umbraco.Web.UI/install/default.aspx index c644336cc1..03ff1c0b30 100644 --- a/src/Umbraco.Web.UI/install/default.aspx +++ b/src/Umbraco.Web.UI/install/default.aspx @@ -12,7 +12,7 @@ - " /> + " /> diff --git a/src/Umbraco.Web.UI/install/steps/Database.ascx.cs b/src/Umbraco.Web.UI/install/steps/Database.ascx.cs index 800a025756..e482c5c6fe 100644 --- a/src/Umbraco.Web.UI/install/steps/Database.ascx.cs +++ b/src/Umbraco.Web.UI/install/steps/Database.ascx.cs @@ -189,19 +189,31 @@ namespace Umbraco.Web.UI.Install.Steps { try { + var dbContext = ApplicationContext.Current.DatabaseContext; + if (string.IsNullOrEmpty(ConnectionString.Text) == false) { - ApplicationContext.Current.DatabaseContext.ConfigureDatabaseConnection(ConnectionString.Text); + dbContext.ConfigureDatabaseConnection(ConnectionString.Text); } else if (IsEmbeddedDatabase) { - ApplicationContext.Current.DatabaseContext.ConfigureEmbeddedDatabaseConnection(); + dbContext.ConfigureEmbeddedDatabaseConnection(); } else { - ApplicationContext.Current.DatabaseContext.ConfigureDatabaseConnection(DatabaseServer.Text, DatabaseName.Text, - DatabaseUsername.Text, DatabasePassword.Text, - DatabaseType.SelectedValue); + var server = DatabaseServer.Text; + var databaseName = DatabaseName.Text; + + if (DatabaseType.SelectedValue == "SqlServer" && DatabaseIntegratedSecurity.Checked == true) + { + dbContext.ConfigureIntegratedSecurityDatabaseConnection(server, databaseName); + } + else + { + dbContext.ConfigureDatabaseConnection(server, databaseName, + DatabaseUsername.Text, DatabasePassword.Text, DatabaseType.SelectedValue + ); + } } } catch (Exception ex) diff --git a/src/Umbraco.Web.UI/install/steps/Database.ascx.designer.cs b/src/Umbraco.Web.UI/install/steps/Database.ascx.designer.cs index 320e92760d..f32fdbd669 100644 --- a/src/Umbraco.Web.UI/install/steps/Database.ascx.designer.cs +++ b/src/Umbraco.Web.UI/install/steps/Database.ascx.designer.cs @@ -102,6 +102,15 @@ namespace Umbraco.Web.UI.Install.Steps { /// protected global::System.Web.UI.WebControls.TextBox DatabaseName; + /// + /// DatabaseIntegratedSecurity control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox DatabaseIntegratedSecurity; + /// /// DatabaseUsernameItem control. /// diff --git a/src/Umbraco.Web.UI/install/steps/database.ascx b/src/Umbraco.Web.UI/install/steps/database.ascx index b1b46eeebd..834ed80b55 100644 --- a/src/Umbraco.Web.UI/install/steps/database.ascx +++ b/src/Umbraco.Web.UI/install/steps/database.ascx @@ -1,6 +1,6 @@ -<%@ Control Language="c#" AutoEventWireup="True" CodeBehind="database.ascx.cs" Inherits="Umbraco.Web.UI.Install.Steps.Database" - TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %> +<%@ Control Language="c#" AutoEventWireup="True" CodeBehind="database.ascx.cs" Inherits="Umbraco.Web.UI.Install.Steps.Database" %> <%@ Import Namespace="Umbraco.Core.Configuration" %> +
@@ -17,7 +17,6 @@
-
@@ -56,6 +55,46 @@
+
@@ -104,6 +143,12 @@
+ +
+ Integrated security: + +
+
Username: @@ -205,7 +250,6 @@
-
\ No newline at end of file diff --git a/src/Umbraco.Web.UI/umbraco/controls/Images/ImageViewer.ascx b/src/Umbraco.Web.UI/umbraco/controls/Images/ImageViewer.ascx index 0ceb3cd09a..659a04e68e 100644 --- a/src/Umbraco.Web.UI/umbraco/controls/Images/ImageViewer.ascx +++ b/src/Umbraco.Web.UI/umbraco/controls/Images/ImageViewer.ascx @@ -1,18 +1,19 @@ -<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ImageViewer.ascx.cs" Inherits="umbraco.controls.Images.ImageViewer" %> +<%@ Control Language="C#" AutoEventWireup="True" CodeBehind="ImageViewer.ascx.cs" Inherits="Umbraco.Web.UI.Umbraco.Controls.Images.ImageViewer" %> +<%@ Import Namespace="Umbraco.Core.IO" %> <%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %> -
+
- - + + + <%#AltText%> + + <%#AltText%> - - <%#AltText%> - - +
');">
@@ -23,26 +24,26 @@ <%--Register the javascript callback method if any.--%>
<%--Ensure that the client API is registered for the image.--%> diff --git a/src/Umbraco.Web.UI/umbraco/controls/Images/ImageViewer.ascx.cs b/src/Umbraco.Web.UI/umbraco/controls/Images/ImageViewer.ascx.cs new file mode 100644 index 0000000000..d0cfd28d01 --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco/controls/Images/ImageViewer.ascx.cs @@ -0,0 +1,8 @@ +using System; + +namespace Umbraco.Web.UI.Umbraco.Controls.Images +{ + public partial class ImageViewer : global::umbraco.controls.Images.ImageViewer + { + } +} \ No newline at end of file diff --git a/src/Umbraco.Web.UI/umbraco/controls/Images/ImageViewer.ascx.designer.cs b/src/Umbraco.Web.UI/umbraco/controls/Images/ImageViewer.ascx.designer.cs new file mode 100644 index 0000000000..164c636c69 --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco/controls/Images/ImageViewer.ascx.designer.cs @@ -0,0 +1,15 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Umbraco.Web.UI.Umbraco.Controls.Images { + + + public partial class ImageViewer { + } +} diff --git a/src/Umbraco.Web.UI/umbraco/dashboard/ExamineManagement.ascx b/src/Umbraco.Web.UI/umbraco/dashboard/ExamineManagement.ascx index 3c49b20c10..127ecac644 100644 --- a/src/Umbraco.Web.UI/umbraco/dashboard/ExamineManagement.ascx +++ b/src/Umbraco.Web.UI/umbraco/dashboard/ExamineManagement.ascx @@ -50,7 +50,7 @@
- +
diff --git a/src/Umbraco.Web.UI/umbraco/developer/Macros/editMacro.aspx b/src/Umbraco.Web.UI/umbraco/developer/Macros/editMacro.aspx index 20bbb8fe36..7018375a65 100644 --- a/src/Umbraco.Web.UI/umbraco/developer/Macros/editMacro.aspx +++ b/src/Umbraco.Web.UI/umbraco/developer/Macros/editMacro.aspx @@ -223,9 +223,28 @@ - + + + diff --git a/src/Umbraco.Web.UI/umbraco/plugins/uGoLive/Dashboard.ascx b/src/Umbraco.Web.UI/umbraco/plugins/uGoLive/Dashboard.ascx index d70e8c59c4..94b056f296 100644 --- a/src/Umbraco.Web.UI/umbraco/plugins/uGoLive/Dashboard.ascx +++ b/src/Umbraco.Web.UI/umbraco/plugins/uGoLive/Dashboard.ascx @@ -6,6 +6,7 @@ + \ No newline at end of file diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericProperty.ascx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericProperty.ascx.cs index 4106275165..e4dc39b3a2 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericProperty.ascx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericProperty.ascx.cs @@ -130,7 +130,7 @@ namespace umbraco.controls.GenericProperties tbValidation.Text = ""; tbDescription.Text = ""; ddlTab.SelectedIndex = 0; - ddlTypes.SelectedIndex = 0; + SetDefaultDocumentTypeProperty(); checkMandatory.Checked = false; } @@ -195,13 +195,24 @@ namespace umbraco.controls.GenericProperties if (_dataTypeDefinitions != null) { ddlTypes.Items.Clear(); + var itemSelected = false; foreach(cms.businesslogic.datatype.DataTypeDefinition dt in _dataTypeDefinitions) { - ListItem li = new ListItem(dt.Text, dt.Id.ToString()); - if (_pt != null && _pt.DataTypeDefinition.Id == dt.Id) - li.Selected = true; + var li = new ListItem(dt.Text, dt.Id.ToString()); + if ((_pt != null && _pt.DataTypeDefinition.Id == dt.Id)) + { + li.Selected = true; + itemSelected = true; + } + ddlTypes.Items.Add(li); } + + // If item not selected from previous edit or load, set to default according to settings + if (!itemSelected) + { + SetDefaultDocumentTypeProperty(); + } } // tabs @@ -234,6 +245,20 @@ namespace umbraco.controls.GenericProperties tbDescription.Text = _pt.GetRawDescription(); } + private void SetDefaultDocumentTypeProperty() + { + var itemToSelect = ddlTypes.Items.Cast().FirstOrDefault(item => item.Text.ToLowerInvariant() == UmbracoSettings.DefaultDocumentTypeProperty.ToLowerInvariant()); + + if (itemToSelect != null) + { + itemToSelect.Selected = true; + } + else + { + ddlTypes.SelectedIndex = -1; + } + } + protected void defaultDeleteHandler(object sender, System.EventArgs e) { diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx deleted file mode 100644 index 0ceb3cd09a..0000000000 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx +++ /dev/null @@ -1,48 +0,0 @@ -<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ImageViewer.ascx.cs" Inherits="umbraco.controls.Images.ImageViewer" %> -<%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %> - -
- - - - - <%#AltText%> - - - - <%#AltText%> - - -
');"> -
-
-
- - - <%--Register the javascript callback method if any.--%> - - -
-<%--Ensure that the client API is registered for the image.--%> - - - diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.cs index 115175d9c3..eaf2eb5b82 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.cs @@ -1,22 +1,19 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; using System.Web.UI; using System.Web.UI.WebControls; +using Umbraco.Core.IO; using umbraco.cms.businesslogic.media; -using umbraco.cms.businesslogic; using Umbraco.Core; namespace umbraco.controls.Images { - public partial class ImageViewer : System.Web.UI.UserControl + public partial class ImageViewer : UserControl { public ImageViewer() { MediaItemPath = "#"; - MediaItemThumbnailPath = umbraco.IO.IOHelper.ResolveUrl(umbraco.IO.SystemDirectories.Umbraco) + "/images/blank.png"; + MediaItemThumbnailPath = IOHelper.ResolveUrl(SystemDirectories.Umbraco) + "/images/blank.png"; AltText = "No Image"; ImageFound = false; ViewerStyle = Style.Basic; @@ -54,9 +51,9 @@ namespace umbraco.controls.Images protected bool ImageFound { get; private set; } - private int m_FileWidth = 0; - private int m_FileHeight = 0; - private bool m_IsBound = false; + private int m_FileWidth; + private int m_FileHeight; + private bool m_IsBound; /// /// automatically bind if it's not explicitly called. @@ -65,7 +62,11 @@ namespace umbraco.controls.Images protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); - if (!m_IsBound) + + View view = FindControl(ViewerStyle.ToString()) as View; + MultiView.SetActiveView(view); + + if (m_IsBound == false) { DataBind(); } @@ -95,7 +96,7 @@ namespace umbraco.controls.Images } MediaItemPath = pFile.Value != null && !string.IsNullOrEmpty(pFile.Value.ToString()) - ? umbraco.IO.IOHelper.ResolveUrl(pFile.Value.ToString()) + ? IOHelper.ResolveUrl(pFile.Value.ToString()) : "#"; AltText = MediaItemPath != "#" ? m.Text : ui.GetText("no") + " " + ui.GetText("media"); @@ -117,6 +118,55 @@ namespace umbraco.controls.Images { ImageFound = false; } - } - } + } + + #region Controls + + /// + /// JsInclude1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::ClientDependency.Core.Controls.JsInclude JsInclude1; + + /// + /// MultiView control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.MultiView MultiView; + + /// + /// Basic control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.View Basic; + + /// + /// ImageLink control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.View ImageLink; + + /// + /// ThumbnailPreview control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.View ThumbnailPreview; + + #endregion + } } \ No newline at end of file diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.designer.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.designer.cs deleted file mode 100644 index c5e0edd1b1..0000000000 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.designer.cs +++ /dev/null @@ -1,25 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.4927 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace umbraco.controls.Images { - - - public partial class ImageViewer { - - /// - /// JsInclude1 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::ClientDependency.Core.Controls.JsInclude JsInclude1; - } -} diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/create.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/create.aspx.cs index 3bfc65d285..c8ec4a581d 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/create.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/create.aspx.cs @@ -1,21 +1,11 @@ using System; -using System.Collections; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Web; -using System.Web.SessionState; -using System.Web.UI; using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; -using System.Xml.XPath; using System.Xml; using Umbraco.Core.IO; namespace umbraco.cms.presentation { - public class Create : BasePages.UmbracoEnsuredPage { [Obsolete("This property is no longer used")] @@ -44,18 +34,17 @@ namespace umbraco.cms.presentation { throw new ArgumentException("The create dialog for \"" + nodeType + "\" does not match anything defined in the \"" + SystemFiles.CreateUiXml + "\". This could mean an incorrectly installed package or a corrupt UI file"); } - //title.Text = ui.Text("create") + " " + ui.Text(def.SelectSingleNode("./header").FirstChild.Value.ToLower(), base.getUser()); + try { - //headerTitle.Text = title.Text; - UI.Controls.Add(LoadControl(SystemDirectories.Umbraco + def.SelectSingleNode("./usercontrol").FirstChild.Value)); + var virtualPath = SystemDirectories.Umbraco + def.SelectSingleNode("./usercontrol").FirstChild.Value; + var mainControl = LoadControl(virtualPath); + UI.Controls.Add(mainControl); } catch (Exception ex) { throw new ArgumentException("ERROR CREATING CONTROL FOR NODETYPE: " + nodeType, ex); } } - - } } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/sort.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/sort.aspx.cs index f6b257ad90..2b104404b4 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/sort.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/sort.aspx.cs @@ -83,14 +83,16 @@ namespace umbraco.cms.presentation } } - // "hack for stylesheet" - // TODO: I can't see where this is being used at all..? + // hack for stylesheet, used to sort stylesheet properties if (app == Constants.Applications.Settings) { icon = "../images/umbraco/settingCss.gif"; var ss = new StyleSheet(parentId); foreach (var child in ss.Properties) - _nodes.Add(CreateNode(child.Id, child.sortOrder, child.Text, child.CreateDateTime, icon)); + { + var node = new CMSNode(child.Id); + _nodes.Add(CreateNode(child.Id, node.sortOrder, child.Text, child.CreateDateTime, icon)); + } } bindNodesToList(string.Empty); diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs index 68412ec702..cf54379d96 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs @@ -1,5 +1,6 @@ using System; using System.Web.UI; +using System.Web.UI.Design.WebControls; using System.Web.UI.WebControls; using Umbraco.Core.IO; using umbraco.cms.businesslogic.member; @@ -142,10 +143,16 @@ namespace umbraco.cms.presentation.members void MemberEmailExistCheck_ServerValidate(object source, ServerValidateEventArgs args) { - var oldEmail = MemberEmail.Text.ToLower(); - var newEmail = _document.Email.ToLower(); + var oldEmail = _document.Email.ToLower(); + var newEmail = MemberEmail.Text.ToLower(); + var requireUniqueEmail = Membership.Providers[Member.UmbracoMemberProviderName].RequiresUniqueEmail; - var howManyMembersWithEmail = Member.GetMembersFromEmail(newEmail).Length; + + var howManyMembersWithEmail = 0; + var membersWithEmail = Member.GetMembersFromEmail(newEmail); + if (membersWithEmail != null) + howManyMembersWithEmail = membersWithEmail.Length; + if (((oldEmail == newEmail && howManyMembersWithEmail > 1) || (oldEmail != newEmail && howManyMembersWithEmail > 0)) && requireUniqueEmail) diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberGroup.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberGroup.aspx.cs index 26d5b2682a..8ed1b24570 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberGroup.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberGroup.aspx.cs @@ -33,6 +33,10 @@ namespace umbraco.presentation.members protected void Page_Load(object sender, System.EventArgs e) { _memberGroupId = !String.IsNullOrEmpty(memberGroupName.Value) ? memberGroupName.Value : Request.QueryString["id"]; + + // Restore any escaped apostrophe for name look up + _memberGroupId = _memberGroupId.Replace("\\'", "'"); + if (!IsPostBack) { ClientTools diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/members/MemberSearch.ascx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/members/MemberSearch.ascx.cs index 46c9ff7f70..c165310b3c 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/members/MemberSearch.ascx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/members/MemberSearch.ascx.cs @@ -1,16 +1,15 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Web; using System.Web.UI; -using System.Web.UI.WebControls; using Examine.LuceneEngine.SearchCriteria; +using Examine.SearchCriteria; using umbraco.cms.businesslogic.member; using System.Web.Security; namespace umbraco.presentation.umbraco.members { - public partial class MemberSearch : System.Web.UI.UserControl + public partial class MemberSearch : UserControl { protected void Page_Load(object sender, EventArgs e) { @@ -19,46 +18,30 @@ namespace umbraco.presentation.umbraco.members ButtonSearch.Text = ui.Text("search"); } - protected void ButtonSearch_Click(object sender, System.EventArgs e) + protected void ButtonSearch_Click(object sender, EventArgs e) { resultsPane.Visible = true; - if (!Member.InUmbracoMemberMode()) + if (Member.InUmbracoMemberMode()) { - - IEnumerable results; - if (searchQuery.Text.Contains("@")) - { - results = from MembershipUser x in Membership.FindUsersByEmail(searchQuery.Text) - select new MemberSearchResult() { Id = x.UserName, Email = x.Email, LoginName = x.UserName, Name = x.UserName }; - } - else - { - results = from MembershipUser x in Membership.FindUsersByName(searchQuery.Text + "%") - select new MemberSearchResult() { Id = x.UserName, Email = x.Email, LoginName = x.UserName, Name = x.UserName }; - } - - rp_members.DataSource = results; - rp_members.DataBind(); - } - else - { - - string query = searchQuery.Text.ToLower(); + var query = searchQuery.Text.ToLower(); var internalSearcher = UmbracoContext.Current.InternalMemberSearchProvider; - IEnumerable results; - if (!String.IsNullOrEmpty(query)) + if (String.IsNullOrEmpty(query) == false) { - var criteria = internalSearcher.CreateSearchCriteria("member", Examine.SearchCriteria.BooleanOperation.And); - var operation = criteria.Field("__nodeName", query.MultipleCharacterWildcard()); - results = internalSearcher.Search(operation.Compile()).Select(x => new MemberSearchResult() - { - Id = x["id"], - Name = x["nodeName"], - Email = x["email"], - LoginName = x["loginName"] - }); + var criteria = internalSearcher.CreateSearchCriteria("member", BooleanOperation.Or); + var fields = new[] {"id", "__nodeName", "email"}; + var term = new[] {query.ToLower().Escape()}; + var operation = criteria.GroupedOr(fields, term).Compile(); + + var results = internalSearcher.Search(operation) + .Select(x => new MemberSearchResult + { + Id = x["id"], + Name = x["nodeName"], + Email = x["email"], + LoginName = x["loginName"] + }); rp_members.DataSource = results; rp_members.DataBind(); } @@ -67,7 +50,39 @@ namespace umbraco.presentation.umbraco.members resultsPane.Visible = false; } } + else + { + IEnumerable results; + if (searchQuery.Text.Contains("@")) + { + results = from MembershipUser x in Membership.FindUsersByEmail(searchQuery.Text) + select + new MemberSearchResult() + { + Id = x.UserName, + Email = x.Email, + LoginName = x.UserName, + Name = x.UserName + }; + } + else + { + results = from MembershipUser x in Membership.FindUsersByName(searchQuery.Text + "%") + select + new MemberSearchResult() + { + Id = x.UserName, + Email = x.Email, + LoginName = x.UserName, + Name = x.UserName + }; + } + + rp_members.DataSource = results; + rp_members.DataBind(); + } } + public class MemberSearchResult { public string Id { get; set; } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/nodeFactory/Property.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/nodeFactory/Property.cs index caee1f6689..a7654c132e 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/nodeFactory/Property.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/nodeFactory/Property.cs @@ -22,7 +22,7 @@ namespace umbraco.NodeFactory private string _parsedValue; public string Value { - get { return _parsedValue ?? (_parsedValue = TemplateUtilities.ResolveUrlsFromTextString(_value)); } + get { return _parsedValue ?? (_parsedValue = TemplateUtilities.ParseInternalLinks(TemplateUtilities.ResolveUrlsFromTextString(_value))); } } public Guid Version diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/Item.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/Item.cs index a8be0b3a50..5d9e608fa8 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/Item.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/Item.cs @@ -6,6 +6,7 @@ using System.Security.Permissions; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; +using Umbraco.Core.Models; using umbraco.BusinessLogic.Actions; using umbraco.presentation.LiveEditing.Modules.ItemEditing; @@ -19,6 +20,7 @@ namespace umbraco.presentation.templateControls [Designer("umbraco.presentation.templateControls.ItemDesigner, umbraco")] public class Item : CompositeControl { + #region Private Fields /// The item's unique ID on the page. @@ -26,6 +28,12 @@ namespace umbraco.presentation.templateControls public AttributeCollectionAdapter LegacyAttributes; #endregion + /// + /// Used by the UmbracoHelper to assign an IPublishedContent to the Item which allows us to pass this in + /// to the 'item' ctor so that it renders with the new API instead of the old one. + /// + internal IPublishedContent ContentItem { get; private set; } + #region Public Control Properties /// @@ -191,6 +199,16 @@ namespace umbraco.presentation.templateControls : LiveEditingItemRenderer.Instance; } + /// + /// Internal ctor used to assign an IPublishedContent object. + /// + /// + internal Item(IPublishedContent contentItem) + :this() + { + ContentItem = contentItem; + } + #endregion #region Overriden Control Methods diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/ItemRenderer.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/ItemRenderer.cs index 37f6d4ad2f..6fc4e32ea5 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/ItemRenderer.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/ItemRenderer.cs @@ -110,13 +110,15 @@ namespace umbraco.presentation.templateControls if (cache == null) throw new InvalidOperationException("Unsupported IPublishedContentCache, only the Xml one is supported."); var xml = cache.GetXml(Umbraco.Web.UmbracoContext.Current, Umbraco.Web.UmbracoContext.Current.InPreviewMode); var itemPage = new page(xml.GetElementById(tempNodeId.ToString())); - tempElementContent = new item(itemPage.Elements, item.LegacyAttributes).FieldContent; + tempElementContent = + new item(item.ContentItem, itemPage.Elements, item.LegacyAttributes).FieldContent; } } else { // gets the field content from the current page (via the PageElements collection) - tempElementContent = new item(item.PageElements, item.LegacyAttributes).FieldContent; + tempElementContent = + new item(item.ContentItem, item.PageElements, item.LegacyAttributes).FieldContent; } return tempElementContent; diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/legacyAjaxCalls.asmx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/legacyAjaxCalls.asmx.cs index 6acd95c536..9510676701 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/legacyAjaxCalls.asmx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/legacyAjaxCalls.asmx.cs @@ -65,12 +65,12 @@ namespace umbraco.presentation.webservices //check which parameters to pass depending on the types passed in int intNodeId; - // Fix for #26965 - numeric member login gets parsed as nodeId - if (int.TryParse(nodeId, out intNodeId) && nodeType != "member") + if (nodeType == "memberGroup") + { + presentation.create.dialogHandler_temp.Delete(nodeType, 0, alias); + } + else if (int.TryParse(nodeId, out intNodeID) && nodeType != "member") // Fix for #26965 - numeric member login gets parsed as nodeId { - LegacyDialogHandler.Delete( - new HttpContextWrapper(HttpContext.Current), - UmbracoUser, nodeType, intNodeId, alias); } else diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/nodeSorter.asmx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/nodeSorter.asmx.cs index 348f07529e..a5b2102640 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/nodeSorter.asmx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/nodeSorter.asmx.cs @@ -92,6 +92,9 @@ namespace umbraco.presentation.webservices if (isMedia) SortMedia(ids); + + if (isContent == false && isMedia == false) + SortStylesheetProperties(ids); } private void SortMedia(string[] ids) @@ -116,6 +119,22 @@ namespace umbraco.presentation.webservices } } + private void SortStylesheetProperties(string[] ids) + { + try + { + for (var i = 0; i < ids.Length; i++) + { + var id = int.Parse(ids[i]); + new cms.businesslogic.CMSNode(id).sortOrder = i; + } + } + catch (Exception ex) + { + LogHelper.Error("Could not update stylesheet property sort order", ex); + } + } + private void SortContent(string[] ids, int parentId) { var contentService = base.ApplicationContext.Services.ContentService; diff --git a/src/umbraco.businesslogic/UmbracoSettings.cs b/src/umbraco.businesslogic/UmbracoSettings.cs index 1b82199d38..647ce1dd0a 100644 --- a/src/umbraco.businesslogic/UmbracoSettings.cs +++ b/src/umbraco.businesslogic/UmbracoSettings.cs @@ -581,6 +581,16 @@ namespace umbraco get { return Umbraco.Core.Configuration.UmbracoSettings.IconPickerBehaviour; } } + /// + /// Gets the default document type property used when adding new properties through the back-office + /// + /// Configured text for the default document type property + /// If undefined, 'Textstring' is the default + public static string DefaultDocumentTypeProperty + { + get { return Umbraco.Core.Configuration.UmbracoSettings.DefaultDocumentTypeProperty; } + } + /// /// Configuration regarding webservices /// diff --git a/src/umbraco.cms/businesslogic/Files/UmbracoFile.cs b/src/umbraco.cms/businesslogic/Files/UmbracoFile.cs index 475446921a..a37adad5b7 100644 --- a/src/umbraco.cms/businesslogic/Files/UmbracoFile.cs +++ b/src/umbraco.cms/businesslogic/Files/UmbracoFile.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; @@ -8,18 +7,11 @@ using System.Linq; using System.Web; using Umbraco.Core; using Umbraco.Core.IO; -using Encoder = System.Text.Encoder; namespace umbraco.cms.businesslogic.Files { public class UmbracoFile : IFile { - private readonly string _path; - private string _fileName; - private string _extension; - private string _url; - private long _length; - private readonly MediaFileSystem _fs; #region Constructors @@ -33,11 +25,11 @@ namespace umbraco.cms.businesslogic.Files { _fs = FileSystemProviderManager.Current.GetFileSystemProvider(); - _path = path; + Path = path; Initialize(); } - + #endregion #region Static Methods @@ -84,26 +76,19 @@ namespace umbraco.cms.businesslogic.Files private void Initialize() { - _fileName = _fs.GetFileName(_path); - _length = _fs.GetSize(_path); - _extension = _fs.GetExtension(_path) != null - ? _fs.GetExtension(_path).Substring(1).ToLowerInvariant() + Filename = _fs.GetFileName(Path); + Length = _fs.GetSize(Path); + Extension = _fs.GetExtension(Path) != null + ? _fs.GetExtension(Path).Substring(1).ToLowerInvariant() : ""; - _url = _fs.GetUrl(_path); + Url = _fs.GetUrl(Path); } #region IFile Members - public string Filename - { - get { return _fileName; } - } + public string Filename { get; private set; } - public string Extension - { - - get { return _extension; } - } + public string Extension { get; private set; } [Obsolete("LocalName is obsolete, please use Url instead", false)] public string LocalName @@ -111,43 +96,30 @@ namespace umbraco.cms.businesslogic.Files get { return Url; } } - public string Path - { - get { return _path; } - } + public string Path { get; private set; } - public string Url - { - get { return _url; } - } + public string Url { get; private set; } - public long Length - { - get { return _length; } - } + public long Length { get; private set; } public bool SupportsResizing { get { - if (("," + UmbracoSettings.ImageFileTypes + ",").Contains(string.Format(",{0},", _extension))) - { - return true; - } - return false; + return ("," + UmbracoSettings.ImageFileTypes + ",").Contains(string.Format(",{0},", Extension)); } } public string GetFriendlyName() { - return _fileName.SplitPascalCasing().ToFirstUpperInvariant(); + return Filename.SplitPascalCasing().ToFirstUpperInvariant(); } public System.Tuple GetDimensions() { - throwNotAnImageException(); + EnsureFileSupportsResizing(); - var fs = _fs.OpenFile(_path); + var fs = _fs.OpenFile(Path); var image = Image.FromStream(fs); var fileWidth = image.Width; var fileHeight = image.Height; @@ -159,16 +131,16 @@ namespace umbraco.cms.businesslogic.Files public string Resize(int width, int height) { - throwNotAnImageException(); + EnsureFileSupportsResizing(); - var fileNameThumb = DoResize(width, height, 0, String.Empty); + var fileNameThumb = DoResize(width, height, 0, string.Empty); return _fs.GetUrl(fileNameThumb); } public string Resize(int maxWidthHeight, string fileNameAddition) { - throwNotAnImageException(); + EnsureFileSupportsResizing(); var fileNameThumb = DoResize(GetDimensions().Item1, GetDimensions().Item2, maxWidthHeight, fileNameAddition); @@ -177,53 +149,44 @@ namespace umbraco.cms.businesslogic.Files private string DoResize(int width, int height, int maxWidthHeight, string fileNameAddition) { - var fs = _fs.OpenFile(_path); - var image = Image.FromStream(fs); - fs.Close(); + using (var fs = _fs.OpenFile(Path)) + { + using (var image = Image.FromStream(fs)) + { + var fileNameThumb = string.IsNullOrWhiteSpace(fileNameAddition) + ? string.Format("{0}_UMBRACOSYSTHUMBNAIL.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal))) + : string.Format("{0}_{1}.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal)), fileNameAddition); - string fileNameThumb = String.IsNullOrEmpty(fileNameAddition) ? - string.Format("{0}_UMBRACOSYSTHUMBNAIL.jpg", _path.Substring(0, _path.LastIndexOf("."))) : - string.Format("{0}_{1}.jpg", _path.Substring(0, _path.LastIndexOf(".")), fileNameAddition); - - fileNameThumb = generateThumbnail( - image, - maxWidthHeight, - width, - height, - _path, - _extension, - fileNameThumb, - maxWidthHeight == 0 - ).FileName; - - image.Dispose(); - - return fileNameThumb; + var thumbnail = GenerateThumbnail(image, maxWidthHeight, width, height, fileNameThumb, maxWidthHeight == 0); + + return thumbnail.FileName; + } + } } #endregion - private void throwNotAnImageException() + private void EnsureFileSupportsResizing() { - if (!SupportsResizing) - throw new NotAnImageException(string.Format("The file {0} is not an image, so can't get dimensions", _fileName)); + if (SupportsResizing == false) + throw new NotAnImageException(string.Format("The file {0} is not an image, so can't get dimensions", Filename)); } - - private ResizedImage generateThumbnail(System.Drawing.Image image, int maxWidthHeight, int fileWidth, int fileHeight, string fullFilePath, string ext, string thumbnailFileName, bool useFixedDimensions) + private ResizedImage GenerateThumbnail(Image image, int maxWidthHeight, int fileWidth, int fileHeight, string thumbnailFileName, bool useFixedDimensions) { // Generate thumbnail float f = 1; - if (!useFixedDimensions) + if (useFixedDimensions == false) { var fx = (float)image.Size.Width / (float)maxWidthHeight; var fy = (float)image.Size.Height / (float)maxWidthHeight; // must fit in thumbnail size - f = Math.Max(fx, fy); //if (f < 1) f = 1; + f = Math.Max(fx, fy); } - var widthTh = (int)Math.Round((float)fileWidth / f); int heightTh = (int)Math.Round((float)fileHeight / f); + var widthTh = (int)Math.Round((float)fileWidth / f); + var heightTh = (int)Math.Round((float)fileHeight / f); // fixes for empty width or height if (widthTh == 0) @@ -232,55 +195,50 @@ namespace umbraco.cms.businesslogic.Files heightTh = 1; // Create new image with best quality settings - var bp = new Bitmap(widthTh, heightTh); - var g = Graphics.FromImage(bp); - g.SmoothingMode = SmoothingMode.HighQuality; - g.InterpolationMode = InterpolationMode.HighQualityBicubic; - g.PixelOffsetMode = PixelOffsetMode.HighQuality; - g.CompositingQuality = CompositingQuality.HighQuality; + using (var bp = new Bitmap(widthTh, heightTh)) + { + using (var g = Graphics.FromImage(bp)) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.CompositingQuality = CompositingQuality.HighQuality; - // Copy the old image to the new and resized - var rect = new Rectangle(0, 0, widthTh, heightTh); - g.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel); + // Copy the old image to the new and resized + var rect = new Rectangle(0, 0, widthTh, heightTh); + g.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel); - // Copy metadata - var imageEncoders = ImageCodecInfo.GetImageEncoders(); - ImageCodecInfo codec = null; - if (Extension.ToLower() == "png" || Extension.ToLower() == "gif") - codec = imageEncoders.Single(t => t.MimeType.Equals("image/png")); - else - codec = imageEncoders.Single(t => t.MimeType.Equals("image/jpeg")); + // Copy metadata + var imageEncoders = ImageCodecInfo.GetImageEncoders(); + var codec = Extension.ToLower() == "png" || Extension.ToLower() == "gif" + ? imageEncoders.Single(t => t.MimeType.Equals("image/png")) + : imageEncoders.Single(t => t.MimeType.Equals("image/jpeg")); - // Set compresion ratio to 90% - var ep = new EncoderParameters(); - ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 90L); + // Set compresion ratio to 90% + var ep = new EncoderParameters(); + ep.Param[0] = new EncoderParameter(Encoder.Quality, 90L); - // Save the new image using the dimensions of the image - string newFileName = thumbnailFileName.Replace("UMBRACOSYSTHUMBNAIL", - string.Format("{0}x{1}", widthTh, heightTh)); - var ms = new MemoryStream(); - bp.Save(ms, codec, ep); - ms.Seek(0, 0); + // Save the new image using the dimensions of the image + var newFileName = thumbnailFileName.Replace("UMBRACOSYSTHUMBNAIL", string.Format("{0}x{1}", widthTh, heightTh)); + using (var ms = new MemoryStream()) + { + bp.Save(ms, codec, ep); + ms.Seek(0, 0); - _fs.AddFile(newFileName, ms); - - ms.Close(); - bp.Dispose(); - g.Dispose(); - - return new ResizedImage(widthTh, heightTh, newFileName); + _fs.AddFile(newFileName, ms); + } + return new ResizedImage(widthTh, heightTh, newFileName); + } + } } - - } internal class ResizedImage { public ResizedImage() { - } public ResizedImage(int width, int height, string fileName) diff --git a/src/umbraco.cms/businesslogic/member/Member.cs b/src/umbraco.cms/businesslogic/member/Member.cs index dd78840be4..947330b292 100644 --- a/src/umbraco.cms/businesslogic/member/Member.cs +++ b/src/umbraco.cms/businesslogic/member/Member.cs @@ -551,14 +551,19 @@ namespace umbraco.cms.businesslogic.member SqlHelper.CreateParameter("@id", Id)); } - return m_Email.ToLower(); + return string.IsNullOrWhiteSpace(m_Email) ? m_Email : m_Email.ToLower(); } set { var oldEmail = Email; - var newEmail = value.ToLower(); + var newEmail = string.IsNullOrWhiteSpace(value) ? value : value.ToLower(); var requireUniqueEmail = Membership.Providers[UmbracoMemberProviderName].RequiresUniqueEmail; - var howManyMembersWithEmail = Member.GetMembersFromEmail(newEmail).Length; + + var howManyMembersWithEmail = 0; + var membersWithEmail = GetMembersFromEmail(newEmail); + if (membersWithEmail != null) + howManyMembersWithEmail = membersWithEmail.Length; + if (((oldEmail == newEmail && howManyMembersWithEmail > 1) || (oldEmail != newEmail && howManyMembersWithEmail > 0)) && requireUniqueEmail) diff --git a/src/umbraco.cms/businesslogic/member/MemberGroup.cs b/src/umbraco.cms/businesslogic/member/MemberGroup.cs index ee115558fe..93494bbfb7 100644 --- a/src/umbraco.cms/businesslogic/member/MemberGroup.cs +++ b/src/umbraco.cms/businesslogic/member/MemberGroup.cs @@ -157,16 +157,16 @@ namespace umbraco.cms.businesslogic.member /// /// Get a membergroup by it's name /// - /// Name of the membergroup + /// Name of the membergroup /// If a MemberGroup with the given name exists, it will return this, else: null - public static MemberGroup GetByName(string Name) + public static MemberGroup GetByName(string name) { try { return new MemberGroup(SqlHelper.ExecuteScalar( "select id from umbracoNode where Text = @text and nodeObjectType = @objectType", - SqlHelper.CreateParameter("@text", Name), + SqlHelper.CreateParameter("@text", name), SqlHelper.CreateParameter("@objectType", _objectType))); } catch diff --git a/src/umbraco.cms/businesslogic/template/Template.cs b/src/umbraco.cms/businesslogic/template/Template.cs index 26e4ffdddd..7f58d40953 100644 --- a/src/umbraco.cms/businesslogic/template/Template.cs +++ b/src/umbraco.cms/businesslogic/template/Template.cs @@ -428,10 +428,10 @@ namespace umbraco.cms.businesslogic.template switch (DetermineRenderingEngine(t, design)) { case RenderingEngine.Mvc: - ViewHelper.CreateViewFile(t, true); + ViewHelper.CreateViewFile(t); break; case RenderingEngine.WebForms: - MasterPageHelper.CreateMasterPage(t, true); + MasterPageHelper.CreateMasterPage(t); break; } diff --git a/src/umbraco.cms/businesslogic/web/Access.cs b/src/umbraco.cms/businesslogic/web/Access.cs index 39a43ad6b7..64d43c8756 100644 --- a/src/umbraco.cms/businesslogic/web/Access.cs +++ b/src/umbraco.cms/businesslogic/web/Access.cs @@ -201,6 +201,7 @@ namespace umbraco.cms.businesslogic.web bool hasChange = false; if (oldRolename != newRolename) { + oldRolename = oldRolename.Replace("'", "'"); foreach (XmlNode x in AccessXml.SelectNodes("//group [@id = '" + oldRolename + "']")) { x.Attributes["id"].Value = newRolename; diff --git a/src/umbraco.cms/packages.config b/src/umbraco.cms/packages.config index 3a63559557..fb0f66ebab 100644 --- a/src/umbraco.cms/packages.config +++ b/src/umbraco.cms/packages.config @@ -1,6 +1,6 @@  - + diff --git a/src/umbraco.cms/umbraco.cms.csproj b/src/umbraco.cms/umbraco.cms.csproj index 3e2e8da4c2..4c0fc0d343 100644 --- a/src/umbraco.cms/umbraco.cms.csproj +++ b/src/umbraco.cms/umbraco.cms.csproj @@ -106,9 +106,9 @@ false - + False - ..\packages\ClientDependency.1.7.0.3\lib\ClientDependency.Core.dll + ..\packages\ClientDependency.1.7.0.4\lib\ClientDependency.Core.dll False diff --git a/src/umbraco.controls/packages.config b/src/umbraco.controls/packages.config index d30bbbe9c0..a432c3897a 100644 --- a/src/umbraco.controls/packages.config +++ b/src/umbraco.controls/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/src/umbraco.controls/umbraco.controls.csproj b/src/umbraco.controls/umbraco.controls.csproj index 520d173367..3b28d5a59a 100644 --- a/src/umbraco.controls/umbraco.controls.csproj +++ b/src/umbraco.controls/umbraco.controls.csproj @@ -68,9 +68,9 @@ false - + False - ..\packages\ClientDependency.1.7.0.3\lib\ClientDependency.Core.dll + ..\packages\ClientDependency.1.7.0.4\lib\ClientDependency.Core.dll diff --git a/src/umbraco.editorControls/DefaultDataKeyValue.cs b/src/umbraco.editorControls/DefaultDataKeyValue.cs index a08c51d7d5..26a32ffb18 100644 --- a/src/umbraco.editorControls/DefaultDataKeyValue.cs +++ b/src/umbraco.editorControls/DefaultDataKeyValue.cs @@ -1,4 +1,5 @@ using System; +using Umbraco.Core.Logging; using umbraco.DataLayer; namespace umbraco.editorControls @@ -19,25 +20,28 @@ namespace umbraco.editorControls public override System.Xml.XmlNode ToXMl(System.Xml.XmlDocument d) { // Get the value from - string v = ""; + var v = ""; try { - // Don't query if there's nothing to query for.. - if (string.IsNullOrWhiteSpace(Value.ToString()) == false) - { - IRecordsReader dr = SqlHelper.ExecuteReader("Select [value] from cmsDataTypeprevalues where id in (" + SqlHelper.EscapeString(Value.ToString()) + ")"); + // Don't query if there's nothing to query for.. + if (string.IsNullOrWhiteSpace(Value.ToString()) == false) + { + var dr = SqlHelper.ExecuteReader("Select [value] from cmsDataTypeprevalues where id in (" + SqlHelper.EscapeString(Value.ToString()) + ")"); - while (dr.Read()) - { - if (v.Length == 0) - v += dr.GetString("value"); - else - v += "," + dr.GetString("value"); - } - dr.Close(); - } - } - catch {} + while (dr.Read()) + { + if (v.Length == 0) + v += dr.GetString("value"); + else + v += "," + dr.GetString("value"); + } + dr.Close(); + } + } + catch (Exception ex) + { + LogHelper.Error("An exception occurred converting the property data to XML", ex); + } return d.CreateCDataSection(v); } } diff --git a/src/umbraco.editorControls/MultiNodeTreePicker/MNTP_DataEditor.cs b/src/umbraco.editorControls/MultiNodeTreePicker/MNTP_DataEditor.cs index 72d36c8fa2..b002218bd8 100644 --- a/src/umbraco.editorControls/MultiNodeTreePicker/MNTP_DataEditor.cs +++ b/src/umbraco.editorControls/MultiNodeTreePicker/MNTP_DataEditor.cs @@ -9,10 +9,10 @@ using System.Web.UI.WebControls; using System.Xml.Linq; using ClientDependency.Core; using Umbraco.Core; +using Umbraco.Core.IO; using umbraco.cms.presentation.Trees; using umbraco.controls.Images; using umbraco.controls.Tree; -using umbraco.IO; [assembly: WebResource("umbraco.editorControls.MultiNodeTreePicker.MultiNodePickerStyles.css", "text/css")] [assembly: WebResource("umbraco.editorControls.MultiNodeTreePicker.MultiNodePickerScripts.js", "application/x-javascript")] @@ -25,6 +25,7 @@ namespace umbraco.editorControls.MultiNodeTreePicker [ClientDependency(ClientDependencyType.Javascript, "ui/jqueryui.js", "UmbracoClient")] [ClientDependency(ClientDependencyType.Javascript, "ui/jquery.tooltip.min.js", "UmbracoClient")] [ClientDependency(ClientDependencyType.Javascript, "controls/Images/ImageViewer.js", "UmbracoRoot")] + [ValidationProperty("Value")] public class MNTP_DataEditor : Control, INamingContainer { #region Static Constructor @@ -93,9 +94,15 @@ namespace umbraco.editorControls.MultiNodeTreePicker ControlHeight = 200; } + /// + /// This is used for validation purposes only, see the [ValidationProperty("Value")] attribute above. + /// + public string Value + { + get { return string.Join(",", SelectedIds); } + } - - #region Protected members + #region Protected members /// /// @@ -374,9 +381,7 @@ namespace umbraco.editorControls.MultiNodeTreePicker this.Controls.Add(PickedValue); this.Controls.Add(RightColumn); } - - - + /// /// Ensure the repeater is data bound /// diff --git a/src/umbraco.editorControls/mediapicker/mediaChooser.cs b/src/umbraco.editorControls/mediapicker/mediaChooser.cs index 85a2ae4dba..e523298120 100644 --- a/src/umbraco.editorControls/mediapicker/mediaChooser.cs +++ b/src/umbraco.editorControls/mediapicker/mediaChooser.cs @@ -1,20 +1,13 @@ using System; using System.Web.UI; - +using Umbraco.Core.IO; using umbraco.cms.presentation.Trees; -using ClientDependency.Core; -using umbraco.presentation; -using ClientDependency.Core.Controls; using umbraco.interfaces; -using umbraco.IO; -using umbraco.BasePages; using umbraco.controls.Images; -using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; -using System.Resources; using umbraco.editorControls.mediapicker; -using umbraco.uicontrols.TreePicker; using umbraco.cms.businesslogic; + namespace umbraco.editorControls { /// @@ -23,8 +16,8 @@ namespace umbraco.editorControls [ValidationProperty("Value")] public class mediaChooser : BaseTreePickerEditor { - bool _showpreview; - bool _showadvanced; + readonly bool _showpreview; + readonly bool _showadvanced; protected ImageViewer ImgViewer; protected HtmlGenericControl PreviewContainer; @@ -51,7 +44,7 @@ namespace umbraco.editorControls { get { - return _showadvanced ? umbraco.IO.IOHelper.ResolveUrl(umbraco.IO.SystemDirectories.Umbraco) + "/dialogs/mediaPicker.aspx" : TreeService.GetPickerUrl(Umbraco.Core.Constants.Applications.Media, "media"); + return _showadvanced ? IOHelper.ResolveUrl(SystemDirectories.Umbraco) + "/dialogs/mediaPicker.aspx" : TreeService.GetPickerUrl(Umbraco.Core.Constants.Applications.Media, "media"); } } @@ -87,7 +80,7 @@ namespace umbraco.editorControls TreePickerUrl, ModalWidth.ToString(), ModalHeight.ToString(), - umbraco.IO.IOHelper.ResolveUrl(umbraco.IO.SystemDirectories.Umbraco).TrimEnd('/') + IOHelper.ResolveUrl(SystemDirectories.Umbraco).TrimEnd('/') }); } } @@ -119,14 +112,14 @@ namespace umbraco.editorControls //create the preview wrapper PreviewContainer = new HtmlGenericControl("div"); PreviewContainer.ID = "preview"; - this.Controls.Add(PreviewContainer); + Controls.Add(PreviewContainer); - ImgViewer = (ImageViewer)Page.LoadControl(umbraco.IO.IOHelper.ResolveUrl(umbraco.IO.SystemDirectories.Umbraco) + "/controls/Images/ImageViewer.ascx"); + ImgViewer = (ImageViewer)Page.LoadControl(IOHelper.ResolveUrl(SystemDirectories.Umbraco) + "/controls/Images/ImageViewer.ascx"); ImgViewer.ID = "ImgViewer"; - ImgViewer.ViewerStyle = ImageViewer.Style.ImageLink; + ImgViewer.ViewerStyle = ImageViewer.Style.ImageLink; PreviewContainer.Style.Add(HtmlTextWriterStyle.MarginTop, "5px"); - PreviewContainer.Controls.Add(ImgViewer); + PreviewContainer.Controls.Add(ImgViewer); } } @@ -159,23 +152,6 @@ namespace umbraco.editorControls ImgViewer.MediaId = int.Parse(ItemIdValue.Value); } } - - //if (ScriptManager.GetCurrent(Page).IsInAsyncPostBack) - //{ - // //renders the media picker JS class - // ScriptManager.RegisterStartupScript(this, this.GetType(), "MediaChooser", MediaChooserScripts.MediaPicker, true); - // ScriptManager.RegisterStartupScript(this, this.GetType(), this.ClientID + "MediaPicker", strScript, true); - - //} - //else - //{ - // //renders the media picker JS class - // Page.ClientScript.RegisterClientScriptBlock(typeof(mediaChooser), "MediaChooser", MediaChooserScripts.MediaPicker, true); - // Page.ClientScript.RegisterStartupScript(this.GetType(), this.ClientID + "MediaPicker", strScript, true); - - //} - } - } } diff --git a/src/umbraco.editorControls/packages.config b/src/umbraco.editorControls/packages.config index d30bbbe9c0..a432c3897a 100644 --- a/src/umbraco.editorControls/packages.config +++ b/src/umbraco.editorControls/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/src/umbraco.editorControls/tinymce/tinyMCEImageHelper.cs b/src/umbraco.editorControls/tinymce/tinyMCEImageHelper.cs index ac8bb63ee3..0bb52b4dd4 100644 --- a/src/umbraco.editorControls/tinymce/tinyMCEImageHelper.cs +++ b/src/umbraco.editorControls/tinymce/tinyMCEImageHelper.cs @@ -5,9 +5,7 @@ using System.Text.RegularExpressions; using System.Web; using Umbraco.Core.IO; using Umbraco.Core.Logging; -using umbraco.BusinessLogic; using umbraco.cms.businesslogic.Files; -using umbraco.IO; namespace umbraco.editorControls.tinymce { @@ -31,7 +29,7 @@ namespace umbraco.editorControls.tinymce // gather all attributes // TODO: This should be replaced with a general helper method - but for now we'll wanna leave umbraco.dll alone for this patch var ht = new Hashtable(); - var matches = Regex.Matches(tag.Value.Replace(">", " >"), "(?\\S*)=\"(?[^\"]*)\"|(?\\S*)=(?[^\"|\\s]*)\\s", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); + var matches = Regex.Matches(tag.Value.Replace(">", " >"), "(?\\S*?)=\"(?[^\"]*)\"|(?\\S*?)=(?[^\"|\\s]*)\\s", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); foreach (Match attributeSet in matches) { ht.Add(attributeSet.Groups["attributeName"].Value.ToLower(), @@ -134,7 +132,21 @@ namespace umbraco.editorControls.tinymce if (fs.FileExists(orgPath)) { var uf = new UmbracoFile(orgPath); - newSrc = uf.Resize(newWidth, newHeight); + + try + { + newSrc = uf.Resize(newWidth, newHeight); + } + catch (Exception ex) + { + LogHelper.Error(string.Format("The file {0} could not be resized, reverting the image src attribute to the original source: {1}", orgPath, orgSrc), ex); + newSrc = orgSrc; + } + } + else + { + LogHelper.Warn(string.Format("The file {0} does not exist, reverting the image src attribute to the original source: {1}", orgPath, orgSrc)); + newSrc = orgSrc; } } diff --git a/src/umbraco.editorControls/umbraco.editorControls.csproj b/src/umbraco.editorControls/umbraco.editorControls.csproj index c702e92e6a..8bb21115ee 100644 --- a/src/umbraco.editorControls/umbraco.editorControls.csproj +++ b/src/umbraco.editorControls/umbraco.editorControls.csproj @@ -114,9 +114,9 @@ {651E1350-91B6-44B7-BD60-7207006D7003} Umbraco.Web - + False - ..\packages\ClientDependency.1.7.0.3\lib\ClientDependency.Core.dll + ..\packages\ClientDependency.1.7.0.4\lib\ClientDependency.Core.dll System diff --git a/src/umbraco.macroRenderings/packages.config b/src/umbraco.macroRenderings/packages.config index c840bab970..38a750a6ff 100644 --- a/src/umbraco.macroRenderings/packages.config +++ b/src/umbraco.macroRenderings/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/src/umbraco.macroRenderings/umbraco.macroRenderings.csproj b/src/umbraco.macroRenderings/umbraco.macroRenderings.csproj index 7bb292dffd..8a261b77a7 100644 --- a/src/umbraco.macroRenderings/umbraco.macroRenderings.csproj +++ b/src/umbraco.macroRenderings/umbraco.macroRenderings.csproj @@ -106,9 +106,9 @@ false - + False - ..\packages\ClientDependency.1.7.0.3\lib\ClientDependency.Core.dll + ..\packages\ClientDependency.1.7.0.4\lib\ClientDependency.Core.dll False