diff --git a/.github/README.md b/.github/README.md index 74f9762040..e8a9889916 100644 --- a/.github/README.md +++ b/.github/README.md @@ -46,4 +46,5 @@ Umbraco is contribution focused and community driven. If you want to contribute Another way you can contribute to Umbraco is by providing issue reports. For information on how to submit an issue report refer to our [online guide for reporting issues](https://github.com/umbraco/Umbraco-CMS/blob/dev-v7/.github/CONTRIBUTING.md). -To view existing issues, please visit [http://issues.umbraco.org](http://issues.umbraco.org). +You can comment and report issues on the [github issue tracker](https://github.com/umbraco/Umbraco-CMS/issues). +Since [September 2018](https://umbraco.com/blog/a-second-take-on-umbraco-issue-tracker-hello-github-issues/) the old issue tracker is in read only mode, but can still be found at [http://issues.umbraco.org](http://issues.umbraco.org). diff --git a/build/Modules/Umbraco.Build/Get-UmbracoBuildEnv.ps1 b/build/Modules/Umbraco.Build/Get-UmbracoBuildEnv.ps1 index 9b465fd78d..2a1e9e6831 100644 --- a/build/Modules/Umbraco.Build/Get-UmbracoBuildEnv.ps1 +++ b/build/Modules/Umbraco.Build/Get-UmbracoBuildEnv.ps1 @@ -94,14 +94,14 @@ function Get-UmbracoBuildEnv } # ensure we have node - $node = "$path\node-v6.9.1-win-x86" - $source = "http://nodejs.org/dist/v6.9.1/node-v6.9.1-win-x86.7z" + $node = "$path\node-v8.12.0-win-x86" + $source = "http://nodejs.org/dist/v8.12.0/node-v8.12.0-win-x86.7z " if (-not (test-path $node)) { Write-Host "Download Node..." - Invoke-WebRequest $source -OutFile "$path\node-v6.9.1-win-x86.7z" - &$sevenZip x "$path\node-v6.9.1-win-x86.7z" -o"$path" -aos > $nul - Remove-File "$path\node-v6.9.1-win-x86.7z" + Invoke-WebRequest $source -OutFile "$path\node-v8.12.0-win-x86.7z" + &$sevenZip x "$path\node-v8.12.0-win-x86.7z" -o"$path" -aos > $nul + Remove-File "$path\node-v8.12.0-win-x86.7z" } # note: why? node already brings everything we need! diff --git a/build/NuSpecs/UmbracoCms.Core.nuspec b/build/NuSpecs/UmbracoCms.Core.nuspec index 1b0e082aa8..0ae9591c97 100644 --- a/build/NuSpecs/UmbracoCms.Core.nuspec +++ b/build/NuSpecs/UmbracoCms.Core.nuspec @@ -28,7 +28,7 @@ - + diff --git a/build/NuSpecs/tools/Readme.txt b/build/NuSpecs/tools/Readme.txt index aa648caaaa..100e29ab7f 100644 --- a/build/NuSpecs/tools/Readme.txt +++ b/build/NuSpecs/tools/Readme.txt @@ -21,6 +21,6 @@ The following items will now be automatically included when creating a deploy pa system: umbraco, umbraco_client, config\splashes and global.asax. Please read the release notes on our.umbraco.com: -http://our.umbraco.com/contribute/releases +https://our.umbraco.com/download/releases -- Umbraco \ No newline at end of file +- Umbraco diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwelveZero/SetDefaultTagsStorageType.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwelveZero/SetDefaultTagsStorageType.cs index 8e13fa1013..6172c60b2c 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwelveZero/SetDefaultTagsStorageType.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwelveZero/SetDefaultTagsStorageType.cs @@ -24,7 +24,7 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenTwelveZ // We need to get all datatypes with an alias of "umbraco.tags" so we can loop over them and set the missing values if needed var datatypes = Context.Database.Fetch("SELECT * FROM cmsDataType"); var tagsDataTypes = datatypes.Where(x => string.Equals(x.PropertyEditorAlias, Constants.PropertyEditors.TagsAlias, StringComparison.InvariantCultureIgnoreCase)); - var dataTypePreValues = Context.Database.Fetch("SELECT * FROM cmsDataTypePrevalues"); + var dataTypePreValues = Context.Database.Fetch("SELECT * FROM cmsDataTypePreValues"); foreach (var datatype in tagsDataTypes) { @@ -36,7 +36,7 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenTwelveZ // if the "storageType" has not been set we do so by adding a new row in the table for the nodid and set it if (result == null) { - Insert.IntoTable("CmsDataTypePrevalues").Row(new + Insert.IntoTable("cmsDataTypePreValues").Row(new { datatypeNodeId = datatype.DataTypeId, value = "Csv", diff --git a/src/Umbraco.Core/Persistence/Repositories/AuditRepository.cs b/src/Umbraco.Core/Persistence/Repositories/AuditRepository.cs index f7c8b0d3cd..e602358cf6 100644 --- a/src/Umbraco.Core/Persistence/Repositories/AuditRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/AuditRepository.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text.RegularExpressions; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.Membership; @@ -47,43 +48,32 @@ namespace Umbraco.Core.Persistence.Repositories var sql = GetBaseQuery(false); if (query == null) query = new Query(); + var queryHasWhereClause = query.GetWhereClauses().Any(); var translatorIds = new SqlTranslator(sql, query); var translatedQuery = translatorIds.Translate(); - var customFilterWheres = customFilter != null ? customFilter.GetWhereClauses().ToArray() : null; + var customFilterWheres = customFilter?.GetWhereClauses().ToArray(); var hasCustomFilter = customFilterWheres != null && customFilterWheres.Length > 0; if (hasCustomFilter) { var filterSql = new Sql(); - var first = true; - foreach (var filterClaus in customFilterWheres) + foreach (var filterClause in customFilterWheres) { - if (first == false) - { - filterSql.Append(" AND "); - } - filterSql.Append(string.Format("({0})", filterClaus.Item1), filterClaus.Item2); - first = false; + filterSql.Append($"AND ({filterClause.Item1})", filterClause.Item2); } - translatedQuery = GetFilteredSqlForPagedResults(translatedQuery, filterSql); + translatedQuery = GetFilteredSqlForPagedResults(translatedQuery, filterSql, queryHasWhereClause); } if (auditTypeFilter.Length > 0) { var filterSql = new Sql(); - var first = true; - foreach (var filterClaus in auditTypeFilter) + foreach (var filterClause in auditTypeFilter) { - if (first == false || hasCustomFilter) - { - filterSql.Append(" AND "); - } - filterSql.Append("(logHeader = @logHeader)", new {logHeader = filterClaus.ToString() }); - first = false; + filterSql.Append("AND (logHeader = @logHeader)", new { logHeader = filterClause.ToString() }); } - translatedQuery = GetFilteredSqlForPagedResults(translatedQuery, filterSql); + translatedQuery = GetFilteredSqlForPagedResults(translatedQuery, filterSql, queryHasWhereClause || hasCustomFilter); } if (orderDirection == Direction.Descending) @@ -99,7 +89,7 @@ namespace Umbraco.Core.Persistence.Repositories dto => new AuditItem(dto.Id, dto.Comment, Enum.ParseOrNull(dto.Header) ?? AuditType.Custom, dto.UserId)).ToArray(); //Mapping the DateStamp - for (int i = 0; i < pages.Length; i++) + for (var i = 0; i < pages.Length; i++) { pages[i].CreateDate = pagedResult.Items[i].Datestamp; } @@ -169,14 +159,17 @@ namespace Umbraco.Core.Persistence.Repositories } #endregion - private Sql GetFilteredSqlForPagedResults(Sql sql, Sql filterSql) + private Sql GetFilteredSqlForPagedResults(Sql sql, Sql filterSql, bool hasWhereClause) { Sql filteredSql; // Apply filter if (filterSql != null) { - var sqlFilter = " WHERE " + filterSql.SQL.TrimStart("AND "); + //ensure we don't append a WHERE if there is already one + var sqlFilter = hasWhereClause + ? filterSql.SQL + : " WHERE " + filterSql.SQL.TrimStart("AND "); //NOTE: this is certainly strange - NPoco handles this much better but we need to re-create the sql // instance a couple of times to get the parameter order correct, for some reason the first diff --git a/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs b/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs index fb3f7b56ee..4dab83a8c5 100644 --- a/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs @@ -4,6 +4,7 @@ using System.ComponentModel; using System.Linq; using System.Linq.Expressions; using System.Text; +using System.Text.RegularExpressions; using System.Web.Security; using Newtonsoft.Json; using Umbraco.Core.Configuration; @@ -710,10 +711,10 @@ ORDER BY colName"; - private IEnumerable GetPagedResultsByQuery(IQuery query, long pageIndex, int pageSize, out long totalRecords, string orderBy, Direction orderDirection, - string[] includeUserGroups = null, - string[] excludeUserGroups = null, - UserState[] userState = null, + private IEnumerable GetPagedResultsByQuery(IQuery query, long pageIndex, int pageSize, out long totalRecords, string orderBy, Direction orderDirection, + string[] includeUserGroups = null, + string[] excludeUserGroups = null, + UserState[] userState = null, IQuery customFilter = null) { if (string.IsNullOrWhiteSpace(orderBy)) throw new ArgumentException("Value cannot be null or whitespace.", "orderBy"); @@ -721,23 +722,23 @@ ORDER BY colName"; Sql filterSql = null; var customFilterWheres = customFilter != null ? customFilter.GetWhereClauses().ToArray() : null; - var hasCustomFilter = customFilterWheres != null && customFilterWheres.Length > 0; + var hasCustomFilter = customFilterWheres != null && customFilterWheres.Length > 0; if (hasCustomFilter - || (includeUserGroups != null && includeUserGroups.Length > 0) || (excludeUserGroups != null && excludeUserGroups.Length > 0) - || (userState != null && userState.Length > 0 && userState.Contains(UserState.All) == false)) - filterSql = new Sql(); + || (includeUserGroups != null && includeUserGroups.Length > 0) || (excludeUserGroups != null && excludeUserGroups.Length > 0) + || (userState != null && userState.Length > 0 && userState.Contains(UserState.All) == false)) + filterSql = new Sql(); if (hasCustomFilter) { foreach (var filterClause in customFilterWheres) { - filterSql.Append(string.Format("AND ({0})", filterClause.Item1), filterClause.Item2); + filterSql.Append($"AND ({filterClause.Item1})", filterClause.Item2); } - } + } if (includeUserGroups != null && includeUserGroups.Length > 0) { - var subQuery = @"AND (umbracoUser.id IN (SELECT DISTINCT umbracoUser.id + const string subQuery = @"AND (umbracoUser.id IN (SELECT DISTINCT umbracoUser.id FROM umbracoUser INNER JOIN umbracoUser2UserGroup ON umbracoUser2UserGroup.userId = umbracoUser.id INNER JOIN umbracoUserGroup ON umbracoUserGroup.id = umbracoUser2UserGroup.userGroupId @@ -747,21 +748,21 @@ ORDER BY colName"; if (excludeUserGroups != null && excludeUserGroups.Length > 0) { - var subQuery = @"AND (umbracoUser.id NOT IN (SELECT DISTINCT umbracoUser.id + const string subQuery = @"AND (umbracoUser.id NOT IN (SELECT DISTINCT umbracoUser.id FROM umbracoUser INNER JOIN umbracoUser2UserGroup ON umbracoUser2UserGroup.userId = umbracoUser.id INNER JOIN umbracoUserGroup ON umbracoUserGroup.id = umbracoUser2UserGroup.userGroupId WHERE umbracoUserGroup.userGroupAlias IN (@userGroups)))"; filterSql.Append(subQuery, new { userGroups = excludeUserGroups }); - } + } if (userState != null && userState.Length > 0) - { + { //the "ALL" state doesn't require any filtering so we ignore that, if it exists in the list we don't do any filtering if (userState.Contains(UserState.All) == false) { var sb = new StringBuilder("("); - var appended = false; + var appended = false; if (userState.Contains(UserState.Active)) { @@ -797,67 +798,81 @@ ORDER BY colName"; filterSql.Append("AND " + sb); } - } - - // Get base query for returning IDs - var sqlBaseIds = GetBaseQuery("id"); - + } + + // Get base query for returning IDs + var sqlBaseIds = GetBaseQuery("id"); + if (query == null) query = new Query(); + var queryHasWhereClause = query.GetWhereClauses().Any(); var translatorIds = new SqlTranslator(sqlBaseIds, query); - var sqlQueryIds = translatorIds.Translate(); - - //get sorted and filtered sql + var sqlQueryIds = translatorIds.Translate(); + var sqlBaseFull = GetBaseQuery("umbracoUser.*, umbracoUserGroup.*, umbracoUserGroup2App.*, umbracoUserStartNode.*"); + var translatorFull = new SqlTranslator(sqlBaseFull, query); + + //get sorted and filtered sql var sqlNodeIdsWithSort = GetSortedSqlForPagedResults( - GetFilteredSqlForPagedResults(sqlQueryIds, filterSql), + GetFilteredSqlForPagedResults(sqlQueryIds, filterSql, queryHasWhereClause), orderDirection, orderBy); // Get page of results and total count var pagedResult = Database.Page(pageIndex + 1, pageSize, sqlNodeIdsWithSort); - totalRecords = Convert.ToInt32(pagedResult.TotalItems); - - //NOTE: We need to check the actual items returned, not the 'totalRecords', that is because if you request a page number - // that doesn't actually have any data on it, the totalRecords will still indicate there are records but there are none in - // the pageResult. + totalRecords = Convert.ToInt32(pagedResult.TotalItems); + + //NOTE: We need to check the actual items returned, not the 'totalRecords', that is because if you request a page number + // that doesn't actually have any data on it, the totalRecords will still indicate there are records but there are none in + // the pageResult. if (pagedResult.Items.Any()) { //Create the inner paged query that was used above to get the paged result, we'll use that as the inner sub query var args = sqlNodeIdsWithSort.Arguments; string sqlStringCount, sqlStringPage; Database.BuildPageQueries(pageIndex * pageSize, pageSize, sqlNodeIdsWithSort.SQL, ref args, out sqlStringCount, out sqlStringPage); + + var sqlQueryFull = translatorFull.Translate(); - var sqlQueryFull = GetBaseQuery("umbracoUser.*, umbracoUserGroup.*, umbracoUserGroup2App.*, umbracoUserStartNode.*"); - - var fullQueryWithPagedInnerJoin = sqlQueryFull - .Append("INNER JOIN (") - //join the paged query with the paged query arguments + //We need to make this FULL query an inner join on the paged ID query + var splitQuery = sqlQueryFull.SQL.Split(new[] { "WHERE " }, StringSplitOptions.None); + var fullQueryWithPagedInnerJoin = new Sql(splitQuery[0]) + .Append("INNER JOIN (") + //join the paged query with the paged query arguments .Append(sqlStringPage, args) .Append(") temp ") .Append("ON umbracoUser.id = temp.id"); AddGroupLeftJoin(fullQueryWithPagedInnerJoin); + if (splitQuery.Length > 1) + { + //add the original where clause back with the original arguments + fullQueryWithPagedInnerJoin.Where(splitQuery[1], sqlQueryIds.Arguments); + } + //get sorted and filtered sql var fullQuery = GetSortedSqlForPagedResults( - GetFilteredSqlForPagedResults(fullQueryWithPagedInnerJoin, filterSql), + GetFilteredSqlForPagedResults(fullQueryWithPagedInnerJoin, filterSql, queryHasWhereClause), orderDirection, orderBy); var users = ConvertFromDtos(Database.Fetch(new UserGroupRelator().Map, fullQuery)) .ToArray(); // important so we don't iterate twice, if we don't do this we can end up with null values in cache if we were caching. return users; - } + } return Enumerable.Empty(); } - private Sql GetFilteredSqlForPagedResults(Sql sql, Sql filterSql) + private Sql GetFilteredSqlForPagedResults(Sql sql, Sql filterSql, bool hasWhereClause) { Sql filteredSql; // Apply filter if (filterSql != null) { - var sqlFilter = " WHERE " + filterSql.SQL.TrimStart("AND "); + //ensure we don't append a WHERE if there is already one + var sqlFilter = hasWhereClause + ? filterSql.SQL + : " WHERE " + filterSql.SQL.TrimStart("AND "); //NOTE: this is certainly strange - NPoco handles this much better but we need to re-create the sql // instance a couple of times to get the parameter order correct, for some reason the first diff --git a/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs index 883b05b2fd..aa7566a4c3 100644 --- a/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs +++ b/src/Umbraco.Core/Persistence/Repositories/VersionableRepositoryBase.cs @@ -290,6 +290,9 @@ namespace Umbraco.Core.Persistence.Repositories // Apply filter if (defaultFilter != null) { + //NOTE: It is assumed here that the `sql` already contains a WHERE clause, see UserRepository.GetFilteredSqlForPagedResults + // for an example of when it's not assumed there's already a WHERE clause + var filterResult = defaultFilter(); //NOTE: this is certainly strange - NPoco handles this much better but we need to re-create the sql @@ -993,4 +996,4 @@ ORDER BY contentNodeId, versionId, propertytypeid } } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Core/Services/ServerRegistrationService.cs b/src/Umbraco.Core/Services/ServerRegistrationService.cs index 6f311019af..cdd06d6c3e 100644 --- a/src/Umbraco.Core/Services/ServerRegistrationService.cs +++ b/src/Umbraco.Core/Services/ServerRegistrationService.cs @@ -77,7 +77,7 @@ namespace Umbraco.Core.Services regs = xr.Repository.GetAll().ToArray(); // default role is single server, but if registrations contain more - // than one active server, then role is master or slave + // than one active server, then role is master or replica _currentServerRole = regs.Count(x => x.IsActive) > 1 ? (server.IsMaster ? ServerRole.Master : ServerRole.Slave) : ServerRole.Single; @@ -175,4 +175,4 @@ namespace Umbraco.Core.Services return _currentServerRole; } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Core/StringExtensions.cs b/src/Umbraco.Core/StringExtensions.cs index d2a1d97709..c6b4da96eb 100644 --- a/src/Umbraco.Core/StringExtensions.cs +++ b/src/Umbraco.Core/StringExtensions.cs @@ -1574,5 +1574,29 @@ namespace Umbraco.Core guid[left] = guid[right]; guid[right] = temp; } + + /// + /// Converts a file name to a friendly name for a content item + /// + /// + /// + public static string ToFriendlyName(this string fileName) + { + // strip the file extension + fileName = fileName.StripFileExtension(); + + // underscores and dashes to spaces + fileName = fileName.ReplaceMany(new[] { '_', '-' }, ' '); + + // any other conversions ? + + // Pascalcase (to be done last) + fileName = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(fileName); + + // Replace multiple consecutive spaces with a single space + fileName = string.Join(" ", fileName.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)); + + return fileName; + } } } diff --git a/src/Umbraco.Core/Sync/ServerRole.cs b/src/Umbraco.Core/Sync/ServerRole.cs index cbc121c4bc..11f8811771 100644 --- a/src/Umbraco.Core/Sync/ServerRole.cs +++ b/src/Umbraco.Core/Sync/ServerRole.cs @@ -16,7 +16,7 @@ namespace Umbraco.Core.Sync Single = 1, /// - /// In a multi-servers environment, the server is a slave server. + /// In a multi-servers environment, the server is a replica server. /// Slave = 2, @@ -25,4 +25,4 @@ namespace Umbraco.Core.Sync /// Master = 3 } -} \ No newline at end of file +} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 4b933bf728..aa3b2db784 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -1,4 +1,4 @@ - + Debug @@ -45,8 +45,8 @@ ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.Net4.dll - - ..\packages\ClientDependency.1.9.6\lib\net45\ClientDependency.Core.dll + + ..\packages\ClientDependency.1.9.7\lib\net45\ClientDependency.Core.dll ..\packages\HtmlAgilityPack.1.4.9.5\lib\Net45\HtmlAgilityPack.dll @@ -567,8 +567,8 @@ - - + + @@ -638,7 +638,7 @@ - + @@ -1688,4 +1688,4 @@ --> - + \ No newline at end of file diff --git a/src/Umbraco.Core/packages.config b/src/Umbraco.Core/packages.config index eaeddb1627..4d7c2380b4 100644 --- a/src/Umbraco.Core/packages.config +++ b/src/Umbraco.Core/packages.config @@ -1,7 +1,7 @@  - + diff --git a/src/Umbraco.Tests/ApplicationUrlHelperTests.cs b/src/Umbraco.Tests/ApplicationUrlHelperTests.cs index 578a569104..0eb4f53ac2 100644 --- a/src/Umbraco.Tests/ApplicationUrlHelperTests.cs +++ b/src/Umbraco.Tests/ApplicationUrlHelperTests.cs @@ -129,7 +129,7 @@ namespace Umbraco.Tests public void SetApplicationUrlFromDcSettingsSsl2() { // set from distributed call settings - // other servers are slave servers + // other servers are replica servers var settings = Mock.Of(section => section.DistributedCall == Mock.Of(callSection => callSection.Enabled == true && callSection.Servers == new IServer[] @@ -224,7 +224,7 @@ namespace Umbraco.Tests [Test] public void ServerRoleUnknown2() { - // distributed call enabled, cannot find server, assume it's an undeclared slave + // distributed call enabled, cannot find server, assume it's an undeclared replica var settings = Mock.Of(section => section.DistributedCall == Mock.Of(callSection => callSection.Enabled == true && callSection.Servers == new IServer[] @@ -301,4 +301,4 @@ namespace Umbraco.Tests Assert.AreEqual("httpx://whatever.com/umbraco", appCtx._umbracoApplicationUrl); } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Tests/Persistence/Repositories/AuditRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/AuditRepositoryTest.cs index 04677c208b..e6f8f44019 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/AuditRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/AuditRepositoryTest.cs @@ -66,6 +66,46 @@ namespace Umbraco.Tests.Persistence.Repositories } } + [Test] + public void Get_Paged_Items_By_User_Id_With_Query_And_Filter() + { + var provider = new PetaPocoUnitOfWorkProvider(Logger); + var unitOfWork = provider.GetUnitOfWork(); + using (var repo = new AuditRepository(unitOfWork, CacheHelper, Logger, SqlSyntax)) + { + for (int i = 0; i < 100; i++) + { + repo.AddOrUpdate(new AuditItem(i, string.Format("Content {0} created", i), AuditType.New, 0)); + repo.AddOrUpdate(new AuditItem(i, string.Format("Content {0} published", i), AuditType.Publish, 0)); + } + unitOfWork.Commit(); + } + + using (var repo = new AuditRepository(unitOfWork, CacheHelper, Logger, SqlSyntax)) + { + var query = Query.Builder.Where(x => x.UserId == 0); + + try + { + DatabaseContext.Database.EnableSqlTrace = true; + DatabaseContext.Database.EnableSqlCount(); + + var page = repo.GetPagedResultsByQuery(query, 0, 10, out var total, Direction.Descending, + new[] { AuditType.Publish }, + Query.Builder.Where(x => x.UserId > -1)); + + Assert.AreEqual(10, page.Count()); + Assert.AreEqual(100, total); + } + finally + { + DatabaseContext.Database.EnableSqlTrace = false; + DatabaseContext.Database.DisableSqlCount(); + } + } + } + + [Test] public void Get_Paged_Items_With_AuditType_Filter() { @@ -83,14 +123,24 @@ namespace Umbraco.Tests.Persistence.Repositories using (var repo = new AuditRepository(unitOfWork, CacheHelper, Logger, SqlSyntax)) { - long total; - var page = repo.GetPagedResultsByQuery(Query.Builder, 0, 9, out total, Direction.Descending, - new[] {AuditType.Publish}, null) - .ToArray(); + try + { + DatabaseContext.Database.EnableSqlTrace = true; + DatabaseContext.Database.EnableSqlCount(); - Assert.AreEqual(9, page.Length); - Assert.IsTrue(page.All(x => x.AuditType == AuditType.Publish)); - Assert.AreEqual(100, total); + var page = repo.GetPagedResultsByQuery(Query.Builder, 0, 9, out var total, Direction.Descending, + new[] { AuditType.Publish }, null) + .ToArray(); + + Assert.AreEqual(9, page.Length); + Assert.IsTrue(page.All(x => x.AuditType == AuditType.Publish)); + Assert.AreEqual(100, total); + } + finally + { + DatabaseContext.Database.EnableSqlTrace = false; + DatabaseContext.Database.DisableSqlCount(); + } } } @@ -111,15 +161,25 @@ namespace Umbraco.Tests.Persistence.Repositories using (var repo = new AuditRepository(unitOfWork, CacheHelper, Logger, SqlSyntax)) { - long total; - var page = repo.GetPagedResultsByQuery(Query.Builder, 0, 8, out total, Direction.Descending, - null, Query.Builder.Where(item => item.Comment == "Content created")) - .ToArray(); + try + { + DatabaseContext.Database.EnableSqlTrace = true; + DatabaseContext.Database.EnableSqlCount(); - Assert.AreEqual(8, page.Length); - Assert.IsTrue(page.All(x => x.Comment == "Content created")); - Assert.AreEqual(100, total); + var page = repo.GetPagedResultsByQuery(Query.Builder, 0, 8, out var total, Direction.Descending, + null, Query.Builder.Where(item => item.Comment == "Content created")) + .ToArray(); + + Assert.AreEqual(8, page.Length); + Assert.IsTrue(page.All(x => x.Comment == "Content created")); + Assert.AreEqual(100, total); + } + finally + { + DatabaseContext.Database.EnableSqlTrace = false; + DatabaseContext.Database.DisableSqlCount(); + } } } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs index 334c4f98c2..3fa490e742 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs @@ -6,6 +6,7 @@ using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models.Membership; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.UnitOfWork; @@ -392,7 +393,71 @@ namespace Umbraco.Tests.Persistence.Repositories var result = repository.Count(query); // Assert - Assert.That(result, Is.GreaterThanOrEqualTo(2)); + Assert.AreEqual(2, result); + } + } + + [Test] + public void Can_Get_Paged_Results_By_Query_And_Filter_And_Groups() + { + // Arrange + var provider = new PetaPocoUnitOfWorkProvider(Logger); + var unitOfWork = provider.GetUnitOfWork(); + using (var repository = CreateRepository(unitOfWork)) + { + var users = CreateAndCommitMultipleUsers(repository, unitOfWork); + var query = Query.Builder.Where(x => x.Username == "TestUser1" || x.Username == "TestUser2"); + + try + { + DatabaseContext.Database.EnableSqlTrace = true; + DatabaseContext.Database.EnableSqlCount(); + + // Act + var result = repository.GetPagedResultsByQuery(query, 0, 10, out var totalRecs, user => user.Id, Direction.Ascending, + excludeUserGroups: new[] { Constants.Security.TranslatorGroupAlias }, + filter: Query.Builder.Where(x => x.Id > -1)); + + // Assert + Assert.AreEqual(2, totalRecs); + } + finally + { + DatabaseContext.Database.EnableSqlTrace = false; + DatabaseContext.Database.DisableSqlCount(); + } + } + } + + [Test] + public void Can_Get_Paged_Results_With_Filter_And_Groups() + { + // Arrange + var provider = new PetaPocoUnitOfWorkProvider(Logger); + var unitOfWork = provider.GetUnitOfWork(); + using (var repository = CreateRepository(unitOfWork)) + { + var users = CreateAndCommitMultipleUsers(repository, unitOfWork); + + try + { + DatabaseContext.Database.EnableSqlTrace = true; + DatabaseContext.Database.EnableSqlCount(); + + // Act + var result = repository.GetPagedResultsByQuery(null, 0, 10, out var totalRecs, user => user.Id, Direction.Ascending, + includeUserGroups: new[] { Constants.Security.AdminGroupAlias, Constants.Security.SensitiveDataGroupAlias }, + excludeUserGroups: new[] { Constants.Security.TranslatorGroupAlias }, + filter: Query.Builder.Where(x => x.Id == 0)); + + // Assert + Assert.AreEqual(1, totalRecs); + } + finally + { + DatabaseContext.Database.EnableSqlTrace = false; + DatabaseContext.Database.DisableSqlCount(); + } } } @@ -439,4 +504,4 @@ namespace Umbraco.Tests.Persistence.Repositories return new IUser[] { user1, user2, user3 }; } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Web.UI.Client/src/less/belle.less b/src/Umbraco.Web.UI.Client/src/less/belle.less index a391e16635..2eaabe7842 100644 --- a/src/Umbraco.Web.UI.Client/src/less/belle.less +++ b/src/Umbraco.Web.UI.Client/src/less/belle.less @@ -126,6 +126,7 @@ @import "components/umb-querybuilder.less"; @import "components/umb-pagination.less"; @import "components/umb-mini-list-view.less"; +@import "components/umb-multiple-textbox.less"; @import "components/umb-badge.less"; @import "components/umb-nested-content.less"; @import "components/umb-checkmark.less"; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-multiple-textbox.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-multiple-textbox.less new file mode 100644 index 0000000000..21f59a3e2d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-multiple-textbox.less @@ -0,0 +1,34 @@ +.umb-multiple-textbox .textbox-wrapper { + align-items: center; + margin-bottom: 15px; +} + +.umb-multiple-textbox .textbox-wrapper .umb-editor { + margin-bottom: 0; +} + +.umb-multiple-textbox .textbox-wrapper i { + margin-right: 5px; +} + +.umb-multiple-textbox .textbox-wrapper i.handle { + margin-left: 5px; +} + +.umb-multiple-textbox .textbox-wrapper a.remove { + margin-left: 5px; + text-decoration: none; +} + +.umb-multiple-textbox .add-link { + &:extend(.umb-node-preview-add); +} + +.umb-editor-wrapper .umb-multiple-textbox .add-link { + &:extend(.umb-editor-wrapper .umb-node-preview); +} + +.umb-modal .umb-multiple-textbox .textbox-wrapper .umb-editor { + flex: 1 1 auto; + width: auto; +} diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/textarea/textarea.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/textarea/textarea.html index ffb692ced0..51938bd676 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/textarea/textarea.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/textarea/textarea.html @@ -1,9 +1,9 @@
- + Required
{{model.count}} characters left
-
\ No newline at end of file + diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index e3ea93b98e..b4beacbf1d 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -1,1103 +1,1103 @@ - - - - - - - 9.0.30729 - 2.0 - {4C4C194C-B5E4-4991-8F87-4373E24CC19F} - {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} - Debug - AnyCPU - - - - - Umbraco.Web.UI - - - JScript - Grid - IE50 - false - Library - Umbraco.Web.UI - OnBuildSuccess - - - - - - - - - - - - - - - 4.0 - v4.5 - - true - - - enabled - disabled - false - ..\ - true - true - - - - - - - bin\ - false - 285212672 - false - - - TRACE;DEBUG - - - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - AllRules.ruleset - false - ..\bin\Debug\ - true - ..\Package\Umbraco.Web.UI.zip - - - bin\ - false - 285212672 - false - - - TRACE - bin\Umbraco.Web.UI.XML - true - 4096 - false - - - true - false - false - false - 4 - pdbonly - prompt - AllRules.ruleset - false - ..\bin\Release\ - - - - {07fbc26b-2927-4a22-8d96-d644c667fecc} - UmbracoExamine - - - ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.dll - True - - - ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.Net4.dll - True - - - ..\packages\ClientDependency.1.9.6\lib\net45\ClientDependency.Core.dll - - - ..\packages\ClientDependency-Mvc5.1.8.0.0\lib\net45\ClientDependency.Core.Mvc.dll - True - - - ..\packages\dotless.1.5.2\lib\dotless.Core.dll - - - ..\packages\Examine.0.1.89\lib\net45\Examine.dll - - - ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll - - - ..\packages\ImageProcessor.2.5.6\lib\net45\ImageProcessor.dll - - - ..\packages\ImageProcessor.Web.4.8.7\lib\net45\ImageProcessor.Web.dll - - - ..\packages\log4net.2.0.8\lib\net45-full\log4net.dll - - - ..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll - - - ..\packages\Microsoft.AspNet.Identity.Core.2.2.1\lib\net45\Microsoft.AspNet.Identity.Core.dll - True - - - False - ..\packages\Microsoft.AspNet.Identity.Owin.2.2.1\lib\net45\Microsoft.AspNet.Identity.Owin.dll - - - ..\packages\Microsoft.CodeAnalysis.Common.1.0.0\lib\net45\Microsoft.CodeAnalysis.dll - - - ..\packages\Microsoft.CodeAnalysis.CSharp.1.0.0\lib\net45\Microsoft.CodeAnalysis.CSharp.dll - - - ..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll - - - - ..\packages\Microsoft.IO.RecyclableMemoryStream.1.2.2\lib\net45\Microsoft.IO.RecyclableMemoryStream.dll - - - ..\packages\Microsoft.Owin.3.1.0\lib\net45\Microsoft.Owin.dll - - - ..\packages\Microsoft.Owin.Host.SystemWeb.3.1.0\lib\net45\Microsoft.Owin.Host.SystemWeb.dll - - - ..\packages\Microsoft.Owin.Security.3.1.0\lib\net45\Microsoft.Owin.Security.dll - - - ..\packages\Microsoft.Owin.Security.Cookies.3.1.0\lib\net45\Microsoft.Owin.Security.Cookies.dll - - - ..\packages\Microsoft.Owin.Security.OAuth.3.1.0\lib\net45\Microsoft.Owin.Security.OAuth.dll - - - True - ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll - - - False - ..\packages\MiniProfiler.2.1.0\lib\net40\MiniProfiler.dll - - - ..\packages\MySql.Data.6.9.9\lib\net45\MySql.Data.dll - - - ..\packages\Newtonsoft.Json.10.0.2\lib\net45\Newtonsoft.Json.dll - - - ..\packages\Owin.1.0\lib\net40\Owin.dll - True - - - System - - - ..\packages\System.Collections.Immutable.1.1.36\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll - - - - - System.Data - - - - ..\packages\SqlServerCE.4.0.0.1\lib\System.Data.SqlServerCe.dll - True - - - ..\packages\SqlServerCE.4.0.0.1\lib\System.Data.SqlServerCe.Entity.dll - True - - - - - - - False - False - - - False - ..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll - - - False - False - - - ..\packages\System.Reflection.Metadata.1.0.21\lib\portable-net45+win8\System.Reflection.Metadata.dll - - - - - System.Web - - - 3.5 - - - - - - - - ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.Helpers.dll - True - - - False - ..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll - - - False - ..\packages\Microsoft.AspNet.WebApi.WebHost.5.2.3\lib\net45\System.Web.Http.WebHost.dll - - - ..\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dll - True - - - ..\packages\Microsoft.AspNet.Razor.3.2.3\lib\net45\System.Web.Razor.dll - True - - - System.Web.Services - - - ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.dll - True - - - ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Deployment.dll - True - - - ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Razor.dll - True - - - System.XML - - - {5BA5425F-27A7-4677-865E-82246498AA2E} - SqlCE4Umbraco - - - {31785bc3-256c-4613-b2f5-a1b0bdded8c1} - Umbraco.Core - - - {255F5DF1-4E43-4758-AC05-7A0B68EB021B} - umbraco.editorControls - - - {89C09045-1064-466B-B94A-DB3AFE2A5853} - umbraco.MacroEngines - - - {6EDD2061-82F2-461B-BB6E-879245A832DE} - umbraco.controls - - - umbraco.businesslogic - {E469A9CE-1BEC-423F-AC44-713CD72457EA} - {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - {CCD75EC3-63DB-4184-B49D-51C1DD337230} - umbraco.cms - - - {C7CB79F0-1C97-4B33-BFA7-00731B579AE2} - umbraco.datalayer - - - umbraco.interfaces - {511F6D8D-7717-440A-9A57-A507E9A8B27F} - {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - {651E1350-91B6-44B7-BD60-7207006D7003} - Umbraco.Web - - - {D7636876-0756-43CB-A192-138C6F0D5E42} - umbraco.providers - - - - ..\packages\Umbraco.ModelsBuilder.3.0.10\lib\Umbraco.ModelsBuilder.dll - - - - - Properties\SolutionInfo.cs - - - noNodes.aspx - ASPXCodeBehind - - - noNodes.aspx - ASPXCodeBehind - - - - True - True - Settings.settings - - - create.aspx - ASPXCodeBehind - - - create.aspx - - - xslt.ascx - ASPXCodeBehind - - - xslt.ascx - - - UserControlProxy.aspx - ASPXCodeBehind - - - UserControlProxy.aspx - - - editMacro.aspx - ASPXCodeBehind - - - editMacro.aspx - - - directoryBrowser.aspx - ASPXCodeBehind - - - directoryBrowser.aspx - - - ChangeDocType.aspx - ASPXCodeBehind - - - ChangeDocType.aspx - - - EditMacro.aspx - ASPXCodeBehind - - - sort.aspx - ASPXCodeBehind - - - sort.aspx - ASPXCodeBehind - - - EditMacro.aspx - - - publish.aspx - ASPXCodeBehind - - - publish.aspx - - - default.Master - ASPXCodeBehind - - - default.Master - - - ASPXCodeBehind - - - umbracoDialog.Master - - - ASPXCodeBehind - - - umbracoPage.Master - - - QuickSearch.ascx - ASPXCodeBehind - - - QuickSearch.ascx - - - editstylesheet.aspx - ASPXCodeBehind - - - editstylesheet.aspx - - - EditStyleSheetProperty.aspx - ASPXCodeBehind - - - EditStyleSheetProperty.aspx - - - treeInit.aspx - ASPXCodeBehind - - - treeInit.aspx - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - umbraco.aspx - ASPXCodeBehind - - - umbraco.aspx - - - - - - - - - - - - 404handlers.config - - - - ClientDependency.config - Designer - - - Designer - - - BaseRestExtensions.config - - - - - Designer - - - log4net.config - - - FileSystemProviders.config - - - EmbeddedMedia.config - - - Designer - - - HealthChecks.config - Designer - - - umbracoSettings.config - Designer - - - trees.config - - - tinyMceConfig.config - Designer - - - scripting.config - - - ExamineSettings.config - - - feedProxy.config - - - ExamineIndex.config - Designer - - - Dashboard.config - Designer - - - - - Designer - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - UI.xml - - - - - - - - - - - - - - - - - - - - - ASPXCodeBehind - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Designer - - - - - - - - Designer - - - - Designer - - - - - - Designer - - - applications.config - Designer - - - - - - - - - Code - - - - - - - Code - - - - - - - - - - - - - - Designer - - - Designer - - - - - - - - - - - - - - - - - - - - - - - - - - - Web.Template.config - Designer - - - Web.Template.config - Designer - - - - - - - - - - - - - - - UserControl - - - - UserControl - - - - - - - - - - - - - - - - Form - - - Form - - - Form - - - - - - - - - - - - - - Form - - - - - - - Form - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Designer - - - - Designer - - - Designer - - - Designer - - - - - - - - - - - - - - - 11.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v11.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v15.0 - - - - xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.1\amd64\*.* "$(TargetDir)amd64\" /Y /F /E /I /C /D -xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.1\x86\*.* "$(TargetDir)x86\" /Y /F /E /I /C /D - - - - - - - - - - True - True - 7130 - / - http://localhost:7130 - False - False - - - False - - - - - - - - $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v15.0\Web\Microsoft.Web.Publishing.Tasks.dll - - - $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.Tasks.dll - - - $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.Tasks.dll - - - $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v11.0\Web\Microsoft.Web.Publishing.Tasks.dll - - - $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - + + + + + + + 9.0.30729 + 2.0 + {4C4C194C-B5E4-4991-8F87-4373E24CC19F} + {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Debug + AnyCPU + + + + + Umbraco.Web.UI + + + JScript + Grid + IE50 + false + Library + Umbraco.Web.UI + OnBuildSuccess + + + + + + + + + + + + + + + 4.0 + v4.5 + + true + + + enabled + disabled + false + ..\ + true + true + + + + + + + bin\ + false + 285212672 + false + + + TRACE;DEBUG + + + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + AllRules.ruleset + false + ..\bin\Debug\ + true + ..\Package\Umbraco.Web.UI.zip + + + bin\ + false + 285212672 + false + + + TRACE + bin\Umbraco.Web.UI.XML + true + 4096 + false + + + true + false + false + false + 4 + pdbonly + prompt + AllRules.ruleset + false + ..\bin\Release\ + + + + {07fbc26b-2927-4a22-8d96-d644c667fecc} + UmbracoExamine + + + ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.dll + True + + + ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.Net4.dll + True + + + ..\packages\ClientDependency.1.9.7\lib\net45\ClientDependency.Core.dll + + + ..\packages\ClientDependency-Mvc5.1.8.0.0\lib\net45\ClientDependency.Core.Mvc.dll + True + + + ..\packages\dotless.1.5.2\lib\dotless.Core.dll + + + ..\packages\Examine.0.1.89\lib\net45\Examine.dll + + + ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll + + + ..\packages\ImageProcessor.2.5.6\lib\net45\ImageProcessor.dll + + + ..\packages\ImageProcessor.Web.4.8.7\lib\net45\ImageProcessor.Web.dll + + + ..\packages\log4net.2.0.8\lib\net45-full\log4net.dll + + + ..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll + + + ..\packages\Microsoft.AspNet.Identity.Core.2.2.1\lib\net45\Microsoft.AspNet.Identity.Core.dll + True + + + False + ..\packages\Microsoft.AspNet.Identity.Owin.2.2.1\lib\net45\Microsoft.AspNet.Identity.Owin.dll + + + ..\packages\Microsoft.CodeAnalysis.Common.1.0.0\lib\net45\Microsoft.CodeAnalysis.dll + + + ..\packages\Microsoft.CodeAnalysis.CSharp.1.0.0\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + + + ..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll + + + + ..\packages\Microsoft.IO.RecyclableMemoryStream.1.2.2\lib\net45\Microsoft.IO.RecyclableMemoryStream.dll + + + ..\packages\Microsoft.Owin.3.1.0\lib\net45\Microsoft.Owin.dll + + + ..\packages\Microsoft.Owin.Host.SystemWeb.3.1.0\lib\net45\Microsoft.Owin.Host.SystemWeb.dll + + + ..\packages\Microsoft.Owin.Security.3.1.0\lib\net45\Microsoft.Owin.Security.dll + + + ..\packages\Microsoft.Owin.Security.Cookies.3.1.0\lib\net45\Microsoft.Owin.Security.Cookies.dll + + + ..\packages\Microsoft.Owin.Security.OAuth.3.1.0\lib\net45\Microsoft.Owin.Security.OAuth.dll + + + True + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll + + + False + ..\packages\MiniProfiler.2.1.0\lib\net40\MiniProfiler.dll + + + ..\packages\MySql.Data.6.9.9\lib\net45\MySql.Data.dll + + + ..\packages\Newtonsoft.Json.10.0.2\lib\net45\Newtonsoft.Json.dll + + + ..\packages\Owin.1.0\lib\net40\Owin.dll + True + + + System + + + ..\packages\System.Collections.Immutable.1.1.36\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll + + + + + System.Data + + + + ..\packages\SqlServerCE.4.0.0.1\lib\System.Data.SqlServerCe.dll + True + + + ..\packages\SqlServerCE.4.0.0.1\lib\System.Data.SqlServerCe.Entity.dll + True + + + + + + + False + False + + + False + ..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll + + + False + False + + + ..\packages\System.Reflection.Metadata.1.0.21\lib\portable-net45+win8\System.Reflection.Metadata.dll + + + + + System.Web + + + 3.5 + + + + + + + + ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.Helpers.dll + True + + + False + ..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll + + + False + ..\packages\Microsoft.AspNet.WebApi.WebHost.5.2.3\lib\net45\System.Web.Http.WebHost.dll + + + ..\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dll + True + + + ..\packages\Microsoft.AspNet.Razor.3.2.3\lib\net45\System.Web.Razor.dll + True + + + System.Web.Services + + + ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.dll + True + + + ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Deployment.dll + True + + + ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Razor.dll + True + + + System.XML + + + {5BA5425F-27A7-4677-865E-82246498AA2E} + SqlCE4Umbraco + + + {31785bc3-256c-4613-b2f5-a1b0bdded8c1} + Umbraco.Core + + + {255F5DF1-4E43-4758-AC05-7A0B68EB021B} + umbraco.editorControls + + + {89C09045-1064-466B-B94A-DB3AFE2A5853} + umbraco.MacroEngines + + + {6EDD2061-82F2-461B-BB6E-879245A832DE} + umbraco.controls + + + umbraco.businesslogic + {E469A9CE-1BEC-423F-AC44-713CD72457EA} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + + + {CCD75EC3-63DB-4184-B49D-51C1DD337230} + umbraco.cms + + + {C7CB79F0-1C97-4B33-BFA7-00731B579AE2} + umbraco.datalayer + + + umbraco.interfaces + {511F6D8D-7717-440A-9A57-A507E9A8B27F} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + + + {651E1350-91B6-44B7-BD60-7207006D7003} + Umbraco.Web + + + {D7636876-0756-43CB-A192-138C6F0D5E42} + umbraco.providers + + + + ..\packages\Umbraco.ModelsBuilder.3.0.10\lib\Umbraco.ModelsBuilder.dll + + + + + Properties\SolutionInfo.cs + + + noNodes.aspx + ASPXCodeBehind + + + noNodes.aspx + ASPXCodeBehind + + + + True + True + Settings.settings + + + create.aspx + ASPXCodeBehind + + + create.aspx + + + xslt.ascx + ASPXCodeBehind + + + xslt.ascx + + + UserControlProxy.aspx + ASPXCodeBehind + + + UserControlProxy.aspx + + + editMacro.aspx + ASPXCodeBehind + + + editMacro.aspx + + + directoryBrowser.aspx + ASPXCodeBehind + + + directoryBrowser.aspx + + + ChangeDocType.aspx + ASPXCodeBehind + + + ChangeDocType.aspx + + + EditMacro.aspx + ASPXCodeBehind + + + sort.aspx + ASPXCodeBehind + + + sort.aspx + ASPXCodeBehind + + + EditMacro.aspx + + + publish.aspx + ASPXCodeBehind + + + publish.aspx + + + default.Master + ASPXCodeBehind + + + default.Master + + + ASPXCodeBehind + + + umbracoDialog.Master + + + ASPXCodeBehind + + + umbracoPage.Master + + + QuickSearch.ascx + ASPXCodeBehind + + + QuickSearch.ascx + + + editstylesheet.aspx + ASPXCodeBehind + + + editstylesheet.aspx + + + EditStyleSheetProperty.aspx + ASPXCodeBehind + + + EditStyleSheetProperty.aspx + + + treeInit.aspx + ASPXCodeBehind + + + treeInit.aspx + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + umbraco.aspx + ASPXCodeBehind + + + umbraco.aspx + + + + + + + + + + + + 404handlers.config + + + + ClientDependency.config + Designer + + + Designer + + + BaseRestExtensions.config + + + + + Designer + + + log4net.config + + + FileSystemProviders.config + + + EmbeddedMedia.config + + + Designer + + + HealthChecks.config + Designer + + + umbracoSettings.config + Designer + + + trees.config + + + tinyMceConfig.config + Designer + + + scripting.config + + + ExamineSettings.config + + + feedProxy.config + + + ExamineIndex.config + Designer + + + Dashboard.config + Designer + + + + + Designer + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + UI.xml + + + + + + + + + + + + + + + + + + + + + ASPXCodeBehind + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Designer + + + + + + + + Designer + + + + Designer + + + + + + Designer + + + applications.config + Designer + + + + + + + + + Code + + + + + + + Code + + + + + + + + + + + + + + Designer + + + Designer + + + + + + + + + + + + + + + + + + + + + + + + + + + Web.Template.config + Designer + + + Web.Template.config + Designer + + + + + + + + + + + + + + + UserControl + + + + UserControl + + + + + + + + + + + + + + + + Form + + + Form + + + Form + + + + + + + + + + + + + + Form + + + + + + + Form + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Designer + + + + Designer + + + Designer + + + Designer + + + + + + + + + + + + + + + 11.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v11.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v15.0 + + + + xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.1\amd64\*.* "$(TargetDir)amd64\" /Y /F /E /I /C /D +xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.1\x86\*.* "$(TargetDir)x86\" /Y /F /E /I /C /D + + + + + + + + + + True + True + 7130 + / + http://localhost:7130 + False + False + + + False + + + + + + + + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v15.0\Web\Microsoft.Web.Publishing.Tasks.dll + + + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.Tasks.dll + + + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.Tasks.dll + + + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v11.0\Web\Microsoft.Web.Publishing.Tasks.dll + + + $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + \ No newline at end of file diff --git a/src/Umbraco.Web.UI/packages.config b/src/Umbraco.Web.UI/packages.config index 677d5da297..55f638f76c 100644 --- a/src/Umbraco.Web.UI/packages.config +++ b/src/Umbraco.Web.UI/packages.config @@ -1,7 +1,7 @@  - + diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs index e22c83cbeb..59693e94a2 100644 --- a/src/Umbraco.Web/Editors/MediaController.cs +++ b/src/Umbraco.Web/Editors/MediaController.cs @@ -717,15 +717,7 @@ namespace Umbraco.Web.Editors mediaType = result.FormData["contentTypeAlias"]; } - //TODO: make the media item name "nice" since file names could be pretty ugly, we have - // string extensions to do much of this but we'll need: - // * Pascalcase the name (use string extensions) - // * strip the file extension - // * underscores to spaces - // * probably remove 'ugly' characters - let's discuss - // All of this logic should exist in a string extensions method and be unit tested - // http://issues.umbraco.org/issue/U4-5572 - var mediaItemName = fileName; + var mediaItemName = fileName.ToFriendlyName(); var f = mediaService.CreateMedia(mediaItemName, parentId, mediaType, Security.CurrentUser.Id); diff --git a/src/Umbraco.Web/Mvc/MasterControllerFactory.cs b/src/Umbraco.Web/Mvc/MasterControllerFactory.cs index c60e9d883e..1bfadbee4b 100644 --- a/src/Umbraco.Web/Mvc/MasterControllerFactory.cs +++ b/src/Umbraco.Web/Mvc/MasterControllerFactory.cs @@ -17,11 +17,11 @@ namespace Umbraco.Web.Mvc /// internal class MasterControllerFactory : DefaultControllerFactory { - private readonly FilteredControllerFactoriesResolver _slaveFactories; + private readonly FilteredControllerFactoriesResolver _replicaFactories; public MasterControllerFactory(FilteredControllerFactoriesResolver factoryResolver) { - _slaveFactories = factoryResolver; + _replicaFactories = factoryResolver; } /// @@ -36,7 +36,7 @@ namespace Umbraco.Web.Mvc /// public override IController CreateController(RequestContext requestContext, string controllerName) { - var factory = _slaveFactories.Factories.FirstOrDefault(x => x.CanHandle(requestContext)); + var factory = _replicaFactories.Factories.FirstOrDefault(x => x.CanHandle(requestContext)); return factory != null ? factory.CreateController(requestContext, controllerName) : base.CreateController(requestContext, controllerName); @@ -53,7 +53,7 @@ namespace Umbraco.Web.Mvc /// The name of the controller. internal Type GetControllerTypeInternal(RequestContext requestContext, string controllerName) { - var factory = _slaveFactories.Factories.FirstOrDefault(x => x.CanHandle(requestContext)); + var factory = _replicaFactories.Factories.FirstOrDefault(x => x.CanHandle(requestContext)); if (factory != null) { //check to see if the factory is of type UmbracoControllerFactory which exposes the GetControllerType method so we don't have to create @@ -88,7 +88,7 @@ namespace Umbraco.Web.Mvc if (controller is Controller) { var requestContext = ((Controller)controller).ControllerContext.RequestContext; - var factory = _slaveFactories.Factories.FirstOrDefault(x => x.CanHandle(requestContext)); + var factory = _replicaFactories.Factories.FirstOrDefault(x => x.CanHandle(requestContext)); if (factory != null) { factory.ReleaseController(controller); @@ -98,4 +98,4 @@ namespace Umbraco.Web.Mvc if (!released) base.ReleaseController(controller); } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Web/PropertyEditors/TextAreaPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/TextAreaPropertyEditor.cs index 659b1b3224..5c17449df6 100644 --- a/src/Umbraco.Web/PropertyEditors/TextAreaPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/TextAreaPropertyEditor.cs @@ -19,7 +19,10 @@ namespace Umbraco.Web.PropertyEditors internal class TextAreaPreValueEditor : PreValueEditor { [PreValueField("maxChars", "Maximum allowed characters", "number", Description = "If empty - no character limit")] - public bool MaxChars { get; set; } + public int MaxChars { get; set; } + + [PreValueField("rows", "Number of rows", "number", Description = "If empty - 10 rows would be set as the default value")] + public int Rows { get; set; } } } } diff --git a/src/Umbraco.Web/Routing/RedirectTrackingEventHandler.cs b/src/Umbraco.Web/Routing/RedirectTrackingEventHandler.cs index 77577e26e2..75cce71f73 100644 --- a/src/Umbraco.Web/Routing/RedirectTrackingEventHandler.cs +++ b/src/Umbraco.Web/Routing/RedirectTrackingEventHandler.cs @@ -241,8 +241,8 @@ namespace Umbraco.Web.Routing /// private void PageCacheRefresher_CacheUpdated(PageCacheRefresher sender, CacheRefresherEventArgs cacheRefresherEventArgs) { - // only on master / single, not on slaves! - if (IsSlaveServer) return; + // only on master / single, not on replicas! + if (IsReplicaServer) return; // simply getting OldRoutes will register it in the request cache, // so whatever we do with it, try/finally it to ensure it's cleared @@ -299,8 +299,8 @@ namespace Umbraco.Web.Routing return route == null; } - // gets a value indicating whether server is 'slave' - private static bool IsSlaveServer + // gets a value indicating whether server is 'replica' + private static bool IsReplicaServer { get { diff --git a/src/Umbraco.Web/Scheduling/HealthCheckNotifier.cs b/src/Umbraco.Web/Scheduling/HealthCheckNotifier.cs index c10c1c5315..d6e72f936b 100644 --- a/src/Umbraco.Web/Scheduling/HealthCheckNotifier.cs +++ b/src/Umbraco.Web/Scheduling/HealthCheckNotifier.cs @@ -31,7 +31,7 @@ namespace Umbraco.Web.Scheduling switch (_appContext.GetCurrentServerRole()) { case ServerRole.Slave: - LogHelper.Debug("Does not run on slave servers."); + LogHelper.Debug("Does not run on replica servers."); return true; // DO repeat, server role can change case ServerRole.Unknown: LogHelper.Debug("Does not run on servers with unknown role."); @@ -80,4 +80,4 @@ namespace Umbraco.Web.Scheduling get { return true; } } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Web/Scheduling/KeepAlive.cs b/src/Umbraco.Web/Scheduling/KeepAlive.cs index 0e6c2c7fb4..eb41fa4c82 100644 --- a/src/Umbraco.Web/Scheduling/KeepAlive.cs +++ b/src/Umbraco.Web/Scheduling/KeepAlive.cs @@ -33,7 +33,7 @@ namespace Umbraco.Web.Scheduling switch (_appContext.GetCurrentServerRole()) { case ServerRole.Slave: - Logger.Debug("Does not run on slave servers."); + Logger.Debug("Does not run on replica servers."); return true; // DO repeat, server role can change case ServerRole.Unknown: Logger.Debug("Does not run on servers with unknown role."); diff --git a/src/Umbraco.Web/Scheduling/LogScrubber.cs b/src/Umbraco.Web/Scheduling/LogScrubber.cs index 9000fc72cf..c525f537d0 100644 --- a/src/Umbraco.Web/Scheduling/LogScrubber.cs +++ b/src/Umbraco.Web/Scheduling/LogScrubber.cs @@ -63,7 +63,7 @@ namespace Umbraco.Web.Scheduling switch (_appContext.GetCurrentServerRole()) { case ServerRole.Slave: - LogHelper.Debug("Does not run on slave servers."); + LogHelper.Debug("Does not run on replica servers."); return true; // DO repeat, server role can change case ServerRole.Unknown: LogHelper.Debug("Does not run on servers with unknown role."); @@ -94,4 +94,4 @@ namespace Umbraco.Web.Scheduling get { return false; } } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Web/Scheduling/ScheduledPublishing.cs b/src/Umbraco.Web/Scheduling/ScheduledPublishing.cs index 52cca003b7..bf82f6cb67 100644 --- a/src/Umbraco.Web/Scheduling/ScheduledPublishing.cs +++ b/src/Umbraco.Web/Scheduling/ScheduledPublishing.cs @@ -41,7 +41,7 @@ namespace Umbraco.Web.Scheduling switch (_appContext.GetCurrentServerRole()) { case ServerRole.Slave: - Logger.Debug("Does not run on slave servers."); + Logger.Debug("Does not run on replica servers."); return true; // DO repeat, server role can change case ServerRole.Unknown: Logger.Debug("Does not run on servers with unknown role."); @@ -106,4 +106,4 @@ namespace Umbraco.Web.Scheduling get { return false; } } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Web/Scheduling/ScheduledTasks.cs b/src/Umbraco.Web/Scheduling/ScheduledTasks.cs index ad7fef5fd9..41daf796d6 100644 --- a/src/Umbraco.Web/Scheduling/ScheduledTasks.cs +++ b/src/Umbraco.Web/Scheduling/ScheduledTasks.cs @@ -92,7 +92,7 @@ namespace Umbraco.Web.Scheduling switch (_appContext.GetCurrentServerRole()) { case ServerRole.Slave: - LogHelper.Debug("Does not run on slave servers."); + LogHelper.Debug("Does not run on replica servers."); return true; // DO repeat, server role can change case ServerRole.Unknown: LogHelper.Debug("Does not run on servers with unknown role."); diff --git a/src/Umbraco.Web/Scheduling/Scheduler.cs b/src/Umbraco.Web/Scheduling/Scheduler.cs index 5a8d409a8c..4a74aaa55c 100644 --- a/src/Umbraco.Web/Scheduling/Scheduler.cs +++ b/src/Umbraco.Web/Scheduling/Scheduler.cs @@ -104,13 +104,13 @@ namespace Umbraco.Web.Scheduling _keepAliveRunner.TryAdd(tasks[0]); // scheduled publishing/unpublishing - // install on all, will only run on non-slaves servers + // install on all, will only run on non-replica servers _publishingRunner.TryAdd(tasks[1]); _tasksRunner.TryAdd(tasks[2]); // log scrubbing - // install on all, will only run on non-slaves servers + // install on all, will only run on non-replica servers _scrubberRunner.TryAdd(tasks[3]); if (healthCheckConfig.NotificationSettings.Enabled) diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index e970c09fca..7e961bf7af 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -107,8 +107,8 @@ ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.Net4.dll True - - ..\packages\ClientDependency.1.9.6\lib\net45\ClientDependency.Core.dll + + ..\packages\ClientDependency.1.9.7\lib\net45\ClientDependency.Core.dll ..\packages\dotless.1.5.2\lib\dotless.Core.dll diff --git a/src/Umbraco.Web/packages.config b/src/Umbraco.Web/packages.config index 0acf6ef32e..e03c088146 100644 --- a/src/Umbraco.Web/packages.config +++ b/src/Umbraco.Web/packages.config @@ -1,7 +1,7 @@  - + diff --git a/src/umbraco.cms/packages.config b/src/umbraco.cms/packages.config index 7514fb8672..404427fb5c 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 c38dbb2d2c..31e1faecac 100644 --- a/src/umbraco.cms/umbraco.cms.csproj +++ b/src/umbraco.cms/umbraco.cms.csproj @@ -106,8 +106,8 @@ false - - ..\packages\ClientDependency.1.9.6\lib\net45\ClientDependency.Core.dll + + ..\packages\ClientDependency.1.9.7\lib\net45\ClientDependency.Core.dll ..\packages\HtmlAgilityPack.1.4.9.5\lib\Net45\HtmlAgilityPack.dll diff --git a/src/umbraco.controls/packages.config b/src/umbraco.controls/packages.config index de6a15b59a..cbccba27be 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 d8b17c9240..e1b190b701 100644 --- a/src/umbraco.controls/umbraco.controls.csproj +++ b/src/umbraco.controls/umbraco.controls.csproj @@ -68,8 +68,8 @@ false - - ..\packages\ClientDependency.1.9.6\lib\net45\ClientDependency.Core.dll + + ..\packages\ClientDependency.1.9.7\lib\net45\ClientDependency.Core.dll diff --git a/src/umbraco.editorControls/packages.config b/src/umbraco.editorControls/packages.config index de6a15b59a..cbccba27be 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/umbraco.editorControls.csproj b/src/umbraco.editorControls/umbraco.editorControls.csproj index 5ff7ca7184..1bbd3b8a24 100644 --- a/src/umbraco.editorControls/umbraco.editorControls.csproj +++ b/src/umbraco.editorControls/umbraco.editorControls.csproj @@ -114,8 +114,8 @@ {651E1350-91B6-44B7-BD60-7207006D7003} Umbraco.Web - - ..\packages\ClientDependency.1.9.6\lib\net45\ClientDependency.Core.dll + + ..\packages\ClientDependency.1.9.7\lib\net45\ClientDependency.Core.dll System