From ae6004166f351eb0c9f639dcb88acc7e85516aa1 Mon Sep 17 00:00:00 2001 From: Rasmus John Pedersen Date: Thu, 26 Sep 2019 18:39:54 +0200 Subject: [PATCH 01/50] Disallow deleting "Sensitive data" user group --- .../Models/Membership/UserGroupExtensions.cs | 13 +++++++++++++ .../users/views/groups/groups.controller.js | 2 +- .../src/views/users/views/groups/groups.html | 2 +- .../Filters/UserGroupValidateAttribute.cs | 13 ++++--------- .../Editors/UserGroupsController.cs | 4 ++-- .../Models/Mapping/UserMapDefinition.cs | 19 ++++++++++--------- 6 files changed, 31 insertions(+), 22 deletions(-) diff --git a/src/Umbraco.Core/Models/Membership/UserGroupExtensions.cs b/src/Umbraco.Core/Models/Membership/UserGroupExtensions.cs index 3903fe405b..b1d0189c56 100644 --- a/src/Umbraco.Core/Models/Membership/UserGroupExtensions.cs +++ b/src/Umbraco.Core/Models/Membership/UserGroupExtensions.cs @@ -15,6 +15,12 @@ namespace Umbraco.Core.Models.Membership return new ReadOnlyUserGroup(group.Id, group.Name, group.Icon, group.StartContentId, group.StartMediaId, group.Alias, group.AllowedSections, group.Permissions); } + public static bool IsSystemUserGroup(this IUserGroup group) => + IsSystemUserGroup(group.Alias); + + public static bool IsSystemUserGroup(this IReadOnlyUserGroup group) => + IsSystemUserGroup(group.Alias); + public static IReadOnlyUserGroup ToReadOnlyGroup(this UserGroupDto group) { return new ReadOnlyUserGroup(group.Id, group.Name, group.Icon, @@ -22,5 +28,12 @@ namespace Umbraco.Core.Models.Membership group.UserGroup2AppDtos.Select(x => x.AppAlias).ToArray(), group.DefaultPermissions == null ? Enumerable.Empty() : group.DefaultPermissions.ToCharArray().Select(x => x.ToString())); } + + private static bool IsSystemUserGroup(this string groupAlias) + { + return groupAlias == Constants.Security.AdminGroupAlias + || groupAlias == Constants.Security.SensitiveDataGroupAlias + || groupAlias == Constants.Security.TranslatorGroupAlias; + } } } diff --git a/src/Umbraco.Web.UI.Client/src/views/users/views/groups/groups.controller.js b/src/Umbraco.Web.UI.Client/src/views/users/views/groups/groups.controller.js index 1e51d4585e..b21859f5c4 100644 --- a/src/Umbraco.Web.UI.Client/src/views/users/views/groups/groups.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/users/views/groups/groups.controller.js @@ -81,7 +81,7 @@ } // Disallow selection of the admin/translators group, the checkbox is not visible in the UI, but clicking(and thus selecting) is still possible. // Currently selection can only be used for deleting, and the Controller will also disallow deleting the admin group. - if (userGroup.alias === "admin" || userGroup.alias === "translator") + if (userGroup.isSystemUserGroup) return; listViewHelper.selectHandler(userGroup, $index, vm.userGroups, vm.selection, $event); diff --git a/src/Umbraco.Web.UI.Client/src/views/users/views/groups/groups.html b/src/Umbraco.Web.UI.Client/src/views/users/views/groups/groups.html index 5d1496d90f..4d252a3ae0 100644 --- a/src/Umbraco.Web.UI.Client/src/views/users/views/groups/groups.html +++ b/src/Umbraco.Web.UI.Client/src/views/users/views/groups/groups.html @@ -86,7 +86,7 @@
+ ng-class="{'-selected': group.selected, '-selectable': group.hasAccess && !group.isSystemUserGroup}">
diff --git a/src/Umbraco.Web/Editors/Filters/UserGroupValidateAttribute.cs b/src/Umbraco.Web/Editors/Filters/UserGroupValidateAttribute.cs index 7d465a9ddc..78cd8e6a4d 100644 --- a/src/Umbraco.Web/Editors/Filters/UserGroupValidateAttribute.cs +++ b/src/Umbraco.Web/Editors/Filters/UserGroupValidateAttribute.cs @@ -51,16 +51,11 @@ namespace Umbraco.Web.Editors.Filters return; } - if (persisted.Alias != userGroupSave.Alias) + if (persisted.Alias != userGroupSave.Alias && persisted.IsSystemUserGroup()) { - if (persisted.Alias == Constants.Security.AdminGroupAlias - || persisted.Alias == Constants.Security.SensitiveDataGroupAlias - || persisted.Alias == Constants.Security.TranslatorGroupAlias) - { - var message = $"User group with alias: {persisted.Alias} cannot be changed"; - actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, message); - return; - } + var message = $"User group with alias: {persisted.Alias} cannot be changed"; + actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, message); + return; } //map the model to the persisted instance diff --git a/src/Umbraco.Web/Editors/UserGroupsController.cs b/src/Umbraco.Web/Editors/UserGroupsController.cs index 1b64722735..b081ca6137 100644 --- a/src/Umbraco.Web/Editors/UserGroupsController.cs +++ b/src/Umbraco.Web/Editors/UserGroupsController.cs @@ -154,8 +154,8 @@ namespace Umbraco.Web.Editors public HttpResponseMessage PostDeleteUserGroups([FromUri] int[] userGroupIds) { var userGroups = Services.UserService.GetAllUserGroups(userGroupIds) - //never delete the admin group or translators group - .Where(x => x.Alias != Constants.Security.AdminGroupAlias && x.Alias != Constants.Security.TranslatorGroupAlias) + //never delete the admin group, sensitive data or translators group + .Where(x => !x.IsSystemUserGroup()) .ToArray(); foreach (var userGroup in userGroups) { diff --git a/src/Umbraco.Web/Models/Mapping/UserMapDefinition.cs b/src/Umbraco.Web/Models/Mapping/UserMapDefinition.cs index abbb67c4aa..88960fb189 100644 --- a/src/Umbraco.Web/Models/Mapping/UserMapDefinition.cs +++ b/src/Umbraco.Web/Models/Mapping/UserMapDefinition.cs @@ -147,7 +147,9 @@ namespace Umbraco.Web.Models.Mapping target.Name = source.Name; target.ParentId = -1; target.Path = "-1," + source.Id; - MapUserGroupBasic(target, source.Alias, source.AllowedSections, source.StartContentId, source.StartMediaId, context); + target.IsSystemUserGroup = source.IsSystemUserGroup(); + + MapUserGroupBasic(target, source.AllowedSections, source.StartContentId, source.StartMediaId, context); } // Umbraco.Code.MapAll -ContentStartNode -MediaStartNode -Sections -Notifications @@ -162,7 +164,9 @@ namespace Umbraco.Web.Models.Mapping target.ParentId = -1; target.Path = "-1," + source.Id; target.UserCount = source.UserCount; - MapUserGroupBasic(target, source.Alias, source.AllowedSections, source.StartContentId, source.StartMediaId, context); + target.IsSystemUserGroup = source.IsSystemUserGroup(); + + MapUserGroupBasic(target, source.AllowedSections, source.StartContentId, source.StartMediaId, context); } // Umbraco.Code.MapAll -Udi -Trashed -AdditionalData -AssignedPermissions @@ -198,7 +202,7 @@ namespace Umbraco.Web.Models.Mapping } // Umbraco.Code.MapAll -ContentStartNode -MediaStartNode -Sections -Notifications -Udi - // Umbraco.Code.MapAll -Trashed -AdditionalData -Users -AssignedPermissions -IsSystemUserGroup + // Umbraco.Code.MapAll -Trashed -AdditionalData -Users -AssignedPermissions private void Map(IUserGroup source, UserGroupDisplay target, MapperContext context) { target.Alias = source.Alias; @@ -210,8 +214,9 @@ namespace Umbraco.Web.Models.Mapping target.ParentId = -1; target.Path = "-1," + source.Id; target.UserCount = source.UserCount; + target.IsSystemUserGroup = source.IsSystemUserGroup(); - MapUserGroupBasic(target, source.Alias, source.AllowedSections, source.StartContentId, source.StartMediaId, context); + MapUserGroupBasic(target, source.AllowedSections, source.StartContentId, source.StartMediaId, context); //Important! Currently we are never mapping to multiple UserGroupDisplay objects but if we start doing that // this will cause an N+1 and we'll need to change how this works. @@ -334,12 +339,8 @@ namespace Umbraco.Web.Models.Mapping // helpers - private void MapUserGroupBasic(UserGroupBasic target, string alias, IEnumerable sourceAllowedSections, int? sourceStartContentId, int? sourceStartMediaId, MapperContext context) + private void MapUserGroupBasic(UserGroupBasic target, IEnumerable sourceAllowedSections, int? sourceStartContentId, int? sourceStartMediaId, MapperContext context) { - target.IsSystemUserGroup = alias == Constants.Security.AdminGroupAlias - || alias == Constants.Security.TranslatorGroupAlias - || alias == Constants.Security.SensitiveDataGroupAlias; - var allSections = _sectionService.GetSections(); target.Sections = context.MapEnumerable(allSections.Where(x => sourceAllowedSections.Contains(x.Alias))); From d677ea618c8993390c8157f1b068a7253f75702a Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 1 Oct 2019 09:48:46 +0200 Subject: [PATCH 02/50] Fixes null reference caused in GridPropertyValueEditor when the value is empty --- src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs index f940ed5c15..0b37638afd 100644 --- a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs @@ -83,6 +83,9 @@ namespace Umbraco.Web.PropertyEditors // editorValue.Value is a JSON string of the grid var rawJson = editorValue.Value.ToString(); + if (rawJson.IsNullOrWhiteSpace()) + return null; + var grid = JsonConvert.DeserializeObject(rawJson); // Find all controls that use the RTE editor From 5b2d2d22c4f479c1b3e4b904fd550410c2abcbbd Mon Sep 17 00:00:00 2001 From: Florian Beijers Date: Tue, 1 Oct 2019 17:13:50 +0200 Subject: [PATCH 03/50] add aria markup to umb-toggle so it behaves like the checkbox it is --- .../src/views/components/buttons/umb-toggle.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/components/buttons/umb-toggle.html b/src/Umbraco.Web.UI.Client/src/views/components/buttons/umb-toggle.html index ded527b3f7..10a1b47735 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/buttons/umb-toggle.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/buttons/umb-toggle.html @@ -1,4 +1,4 @@ -
- +
+ +
From 76c1d10701aaa9dcca7368a1c6aa738fd1c4b22b Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Tue, 1 Oct 2019 22:53:26 +0200 Subject: [PATCH 05/50] Remove unused localization of search text --- .../views/common/infiniteeditors/copy/copy.controller.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/copy/copy.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/copy/copy.controller.js index e3d3f10ee8..67604aca44 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/copy/copy.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/copy/copy.controller.js @@ -13,7 +13,6 @@ vm.close = close; var dialogOptions = $scope.model; - var searchText = "Search..."; var node = dialogOptions.currentNode; $scope.model.relateToOriginal = true; @@ -34,17 +33,13 @@ var labelKeys = [ "general_copy", - "general_search", "defaultdialogs_relateToOriginalLabel" ]; localizationService.localizeMany(labelKeys).then(function (data) { vm.labels.title = data[0]; - - searchText = data[1] + "..."; - - vm.labels.relateToOriginal = data[2]; + vm.labels.relateToOriginal = data[1]; setTitle(vm.labels.title); }); From dbce1147a89a6d4b487d9486d988652b759d45b5 Mon Sep 17 00:00:00 2001 From: Steve Megson Date: Tue, 1 Oct 2019 22:31:42 +0100 Subject: [PATCH 06/50] Fix ContentService.DeleteVersions --- .../Implement/DocumentRepository.cs | 51 ++++++++++++++++++- .../Services/Implement/ContentService.cs | 2 +- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs index 344557d815..2649b9993f 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs @@ -248,14 +248,63 @@ namespace Umbraco.Core.Persistence.Repositories.Implement return dto == null ? null : MapDtoToContent(dto); } + // deletes a specific version + public override void DeleteVersion(int versionId) + { + // TODO: test object node type? + + // get the version we want to delete + var template = SqlContext.Templates.Get("Umbraco.Core.DocumentRepository.GetVersion", tsql => + tsql.Select() + .AndSelect() + .From() + .InnerJoin() + .On((c, d) => c.Id == d.Id) + .Where(x => x.Id == SqlTemplate.Arg("versionId")) + ); + var versionDto = Database.Fetch(template.Sql(new { versionId })).FirstOrDefault(); + + // nothing to delete + if (versionDto == null) + return; + + // don't delete the current or published version + if (versionDto.ContentVersionDto.Current) + throw new InvalidOperationException("Cannot delete the current version."); + else if (versionDto.Published) + throw new InvalidOperationException("Cannot delete the published version."); + + PerformDeleteVersion(versionDto.ContentVersionDto.NodeId, versionId); + } + + // deletes all versions of an entity, older than a date. + public override void DeleteVersions(int nodeId, DateTime versionDate) + { + // TODO: test object node type? + + // get the versions we want to delete, excluding the current one + var template = SqlContext.Templates.Get("Umbraco.Core.DocumentRepository.GetVersions", tsql => + tsql.Select() + .From() + .InnerJoin() + .On((c, d) => c.Id == d.Id) + .Where(x => x.NodeId == SqlTemplate.Arg("nodeId") && !x.Current && x.VersionDate < SqlTemplate.Arg("versionDate")) + .Where( x => !x.Published) + ); + var versionDtos = Database.Fetch(template.Sql(new { nodeId, versionDate })); + foreach (var versionDto in versionDtos) + PerformDeleteVersion(versionDto.NodeId, versionDto.Id); + } + protected override void PerformDeleteVersion(int id, int versionId) { // raise event first else potential FK issues OnUowRemovingVersion(new ScopedVersionEventArgs(AmbientScope, id, versionId)); Database.Delete("WHERE versionId = @versionId", new { versionId }); - Database.Delete("WHERE id = @versionId", new { versionId }); + Database.Delete("WHERE versionId = @versionId", new { versionId }); Database.Delete("WHERE id = @versionId", new { versionId }); + Database.Delete("WHERE id = @versionId", new { versionId }); } #endregion diff --git a/src/Umbraco.Core/Services/Implement/ContentService.cs b/src/Umbraco.Core/Services/Implement/ContentService.cs index ce63be9f2c..720713e9ad 100644 --- a/src/Umbraco.Core/Services/Implement/ContentService.cs +++ b/src/Umbraco.Core/Services/Implement/ContentService.cs @@ -1848,7 +1848,7 @@ namespace Umbraco.Core.Services.Implement scope.WriteLock(Constants.Locks.ContentTree); var c = _documentRepository.Get(id); - if (c.VersionId != versionId) // don't delete the current version + if (c.VersionId != versionId && c.PublishedVersionId != versionId) // don't delete the current or published version _documentRepository.DeleteVersion(versionId); scope.Events.Dispatch(DeletedVersions, this, new DeleteRevisionsEventArgs(id, false,/* specificVersion:*/ versionId)); From 4918fa0868bc8fe4e4a73431ca20ee9d37650b5a Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 2 Oct 2019 12:05:11 +0200 Subject: [PATCH 07/50] added timeout --- .../src/views/propertyeditors/rte/rte.controller.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.controller.js index 8ca698060a..c2bf5d0336 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.controller.js @@ -89,7 +89,10 @@ angular.module("umbraco") angular.extend(baseLineConfigObj, standardConfig); - tinymce.init(baseLineConfigObj); + // We need to wait for DOM to have rendered before we can find the element by ID. + $timeout(function () { + tinymce.init(baseLineConfigObj); + }, 150); //listen for formSubmitting event (the result is callback used to remove the event subscription) var unsubscribe = $scope.$on("formSubmitting", function () { From 72952db3b2a28775b3f75467c6daaa067237facc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 1 Oct 2019 12:17:23 +0200 Subject: [PATCH 08/50] fixing toolbar issues when sticky and RTE width in grid. --- .../src/common/services/tinymce.service.js | 13 ++++++++----- .../src/less/components/umb-grid.less | 4 ++++ src/Umbraco.Web.UI.Client/src/less/rte.less | 1 + 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js b/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js index 8fee11dbc9..da013d88ee 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js @@ -1188,6 +1188,7 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s var tinyMceRect = editor.editorContainer.getBoundingClientRect(); var tinyMceTop = tinyMceRect.top; var tinyMceBottom = tinyMceRect.bottom; + var tinyMceWidth = tinyMceRect.width; var tinyMceEditArea = tinyMce.find(".mce-edit-area"); @@ -1196,16 +1197,18 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s if (tinyMceTop < 177 && ((177 + toolbarHeight) < tinyMceBottom)) { toolbar - .css("visibility", "visible") .css("position", "fixed") .css("top", "177px") - .css("margin-top", "0"); + .css("left", "auto") + .css("right", "auto") + .css("width", tinyMceWidth); } else { toolbar - .css("visibility", "visible") .css("position", "absolute") - .css("top", "auto") - .css("margin-top", "0"); + .css("left", "") + .css("right", "") + .css("top", "") + .css("width", ""); } }, diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less index b3e729dfdd..277c2bcbe8 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less @@ -638,7 +638,11 @@ .umb-grid .mce-toolbar { border-bottom: 1px solid @gray-7; + background-color: white; display: none; + + left: 0; + right: 0; } .umb-grid .umb-control.-active .mce-toolbar { diff --git a/src/Umbraco.Web.UI.Client/src/less/rte.less b/src/Umbraco.Web.UI.Client/src/less/rte.less index f33617d03f..6dfccdd0a3 100644 --- a/src/Umbraco.Web.UI.Client/src/less/rte.less +++ b/src/Umbraco.Web.UI.Client/src/less/rte.less @@ -162,4 +162,5 @@ .umb-grid .umb-rte { border: 1px solid #d8d7d9; + max-width: none; } From 56695282533daabdbc792c92fc808e5e7a9171e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 1 Oct 2019 13:35:27 +0200 Subject: [PATCH 09/50] fixing icon issue in PreValueEditor --- src/Umbraco.Web.UI.Client/src/less/rte.less | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/less/rte.less b/src/Umbraco.Web.UI.Client/src/less/rte.less index 6dfccdd0a3..60065ee1d2 100644 --- a/src/Umbraco.Web.UI.Client/src/less/rte.less +++ b/src/Umbraco.Web.UI.Client/src/less/rte.less @@ -63,8 +63,9 @@ } /* Special case to support helviticons for the tiny mce button controls */ -.umb-rte .mce-ico.mce-i-custom[class^="icon-"], -.umb-rte .mce-ico.mce-i-custom[class*=" icon-"] { +// Also used in Prevalue editor. +.mce-ico.mce-i-custom[class^="icon-"], +.mce-ico.mce-i-custom[class*=" icon-"] { font-family: icomoon; font-size: 16px !important; } From 6d9af75fbedda66f36c9782c66d126366019e501 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 2 Oct 2019 13:49:50 +0200 Subject: [PATCH 10/50] Fixes the media refs within the RTE in the Grid --- .../PropertyEditors/GridPropertyEditor.cs | 50 ++++++++++++++++--- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs index f940ed5c15..719377ca72 100644 --- a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs @@ -1,5 +1,6 @@ using Newtonsoft.Json; using System; +using System.Collections.Generic; using System.Linq; using Umbraco.Core; using Umbraco.Core.Logging; @@ -83,12 +84,9 @@ namespace Umbraco.Web.PropertyEditors // editorValue.Value is a JSON string of the grid var rawJson = editorValue.Value.ToString(); - var grid = JsonConvert.DeserializeObject(rawJson); - - // Find all controls that use the RTE editor - var controls = grid.Sections.SelectMany(x => x.Rows.SelectMany(r => r.Areas).SelectMany(a => a.Controls)); - var rtes = controls.Where(x => x.Editor.Alias.ToLowerInvariant() == "rte"); + var grid = DeserializeGridValue(rawJson, out var rtes); + //process the rte values foreach(var rte in rtes) { // Parse the HTML @@ -96,13 +94,53 @@ namespace Umbraco.Web.PropertyEditors var userId = _umbracoContextAccessor.UmbracoContext?.Security.CurrentUser.Id ?? Constants.Security.SuperUserId; - var parsedHtml = TemplateUtilities.FindAndPersistPastedTempImages(html, mediaParentId, userId, _mediaService, _contentTypeBaseServiceProvider, _logger); + var editorValueWithMediaUrlsRemoved = TemplateUtilities.RemoveMediaUrlsFromTextString(html); + + var parsedHtml = TemplateUtilities.FindAndPersistPastedTempImages(editorValueWithMediaUrlsRemoved, mediaParentId, userId, _mediaService, _contentTypeBaseServiceProvider, _logger); rte.Value = parsedHtml; } // Convert back to raw JSON for persisting return JsonConvert.SerializeObject(grid); } + + /// + /// Ensures that the rich text editor values are processed within the grid + /// + /// + /// + /// + /// + /// + public override object ToEditor(Property property, IDataTypeService dataTypeService, string culture = null, string segment = null) + { + var val = property.GetValue(culture, segment); + if (val == null) return string.Empty; + + var grid = DeserializeGridValue(val.ToString(), out var rtes); + + //process the rte values + foreach (var rte in rtes.ToList()) + { + var html = rte.Value?.ToString(); + + var propertyValueWithMediaResolved = TemplateUtilities.ResolveMediaFromTextString(html); + rte.Value = propertyValueWithMediaResolved; + } + + return grid; + } + + private GridValue DeserializeGridValue(string rawJson, out IEnumerable richTextValues) + { + var grid = JsonConvert.DeserializeObject(rawJson); + + // Find all controls that use the RTE editor + var controls = grid.Sections.SelectMany(x => x.Rows.SelectMany(r => r.Areas).SelectMany(a => a.Controls)); + richTextValues = controls.Where(x => x.Editor.Alias.ToLowerInvariant() == "rte"); + + return grid; + } } } } From 033780cb90ad30275bc3e99f3c8508592468d2ff Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Wed, 2 Oct 2019 13:50:00 +0100 Subject: [PATCH 11/50] We only want to allow you to pick one folder in the media library for this prevalue editor --- .../src/views/prevalueeditors/mediafolderpicker.controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/mediafolderpicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/mediafolderpicker.controller.js index ddfca295d4..1f39c2423e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/mediafolderpicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/mediafolderpicker.controller.js @@ -27,7 +27,7 @@ function mediaFolderPickerController($scope, editorService, entityResource) { $scope.add = function() { var mediaPickerOptions = { view: "mediapicker", - multiPicker: true, + multiPicker: false, // We only want to allow you to pick one folder at a given time disableFolderSelect: false, onlyImages: false, onlyFolders: true, From 0e16d9cd3302e86e22a36253b478b3a07ddd65dc Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Wed, 2 Oct 2019 11:59:15 +0100 Subject: [PATCH 12/50] WIP: Try and support images in the RTE that are pasted/dragged in and are NOT in media yet to be able to update the ALT text --- .../src/common/services/tinymce.service.js | 86 +++++++++++++++---- .../mediapicker/mediapicker.controller.js | 23 +++-- 2 files changed, 84 insertions(+), 25 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js b/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js index 8fee11dbc9..0e4816953f 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js @@ -588,12 +588,15 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s var selectedElm = editor.selection.getNode(), - currentTarget; + currentTarget, + imgDomElement; if (selectedElm.nodeName === 'IMG') { var img = $(selectedElm); + imgDomElement = selectedElm; var hasUdi = img.attr("data-udi") ? true : false; + var hasDataTmpImg = img.attr("data-tmpimg") ? true : false; currentTarget = { altText: img.attr("alt"), @@ -605,12 +608,17 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s } else { currentTarget["id"] = img.attr("rel"); } + + if(hasDataTmpImg){ + currentTarget["tmpimg"] = img.attr("data-tmpimg"); + } } userService.getCurrentUser().then(function (userData) { if (callback) { angularHelper.safeApply($rootScope, function() { - callback(currentTarget, userData); + console.log('current data in create media picker', currentTarget); + callback(currentTarget, userData, imgDomElement); }); } }); @@ -618,25 +626,67 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s }); }, - insertMediaInEditor: function (editor, img) { + insertMediaInEditor: function (editor, img, imgDomElement) { if (img) { + // imgElement is only definied if updating an image + // if null/undefinied then its a BRAND new image + if(imgDomElement){ + console.log('UPDATING IMG', img); - var data = { - alt: img.altText || "", - src: (img.url) ? img.url : "nothing.jpg", - id: '__mcenew', - 'data-udi': img.udi - }; + // Check if the img src has changed + // If it has we will need to do some resizing/recalc again + var hasImageSrcChanged = false; - editor.selection.setContent(editor.dom.createHTML('img', data)); + if(img.url !== editor.dom.getAttrib(imgDomElement, "src")){ + console.log("IMG SRC CHANGED !!!!"); + hasImageSrcChanged = true; + } - $timeout(function () { - var imgElm = editor.dom.get('__mcenew'); - sizeImageInEditor(editor, imgElm, img.url); - editor.dom.setAttrib(imgElm, 'id', null); - editor.fire('Change'); + // If null/undefinied it will remove the attribute + editor.dom.setAttrib(imgDomElement, "alt", img.altText); - }, 500); + // It's possible to pick a NEW image - so need to ensure this gets updated + if(img.udi){ + editor.dom.setAttrib(imgDomElement, "data-udi", img.udi); + } + + // It's possible to pick a NEW image - so need to ensure this gets updated + if(img.url){ + editor.dom.setAttrib(imgDomElement, "src", img.url); + } + + // Remove width & height attributes (ONLY if imgSrc changed) + // So native image size is used as this needed to re-calc width & height + // For the function sizeImageInEditor() & apply the image resizing querystrings etc.. + if(hasImageSrcChanged){ + editor.dom.setAttrib(imgDomElement, "width", null); + editor.dom.setAttrib(imgDomElement, "height", null); + + //Re-calc the image dimensions + sizeImageInEditor(editor, imgDomElement, img.url); + } + + } else{ + console.log('CREATE NEW IMAGE', img); + // We need to create a NEW DOM element to insert + var data = { + alt: img.altText || "", + src: (img.url) ? img.url : "nothing.jpg", + id: "__mcenew", + "data-udi": img.udi + }; + editor.selection.setContent(editor.dom.createHTML('img', data)); + + // Insert a DOM element with an ID of __mcenew + // So we can select it after 500ms by that ID + // In order to call the sizeImageEditor function to size img correctly + $timeout(function () { + var imgElm = editor.dom.get("__mcenew"); + sizeImageInEditor(editor, imgElm, img.url); + editor.dom.setAttrib(imgElm, "id", null); + editor.fire("Change"); + }, 500); + } } }, @@ -1399,7 +1449,7 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s }); //Create the insert media plugin - self.createMediaPicker(args.editor, function (currentTarget, userData) { + self.createMediaPicker(args.editor, function (currentTarget, userData, imgDomElement) { var startNodeId, startNodeIsVirtual; if (!args.model.config.startNodeId) { @@ -1422,7 +1472,7 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s startNodeIsVirtual: startNodeIsVirtual, dataTypeKey: args.model.dataTypeKey, submit: function (model) { - self.insertMediaInEditor(args.editor, model.selection[0]); + self.insertMediaInEditor(args.editor, model.selection[0], imgDomElement); editorService.close(); }, close: function () { diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js index 837c0ebc9d..4b6cfb6969 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js @@ -98,21 +98,30 @@ angular.module("umbraco") gotoStartNode(); } } else { - //if a target is specified, go look it up - generally this target will just contain ids not the actual full - //media object so we need to look it up + // if a target is specified, go look it up - generally this target will just contain ids not the actual full + // media object so we need to look it up var id = $scope.target.udi ? $scope.target.udi : $scope.target.id; - var altText = $scope.target.altText; - entityResource.getById(id, "Media") + + // ID of a UDI or legacy int ID still could be null/undefinied here + // As user may dragged in an image that has not been saved to media section yet + if(id){ + entityResource.getById(id, "Media") .then(function (node) { - $scope.target = node; + //$scope.target = node; //Not 100% sure why we override it here?! if (ensureWithinStartNode(node)) { selectImage(node); - $scope.target.url = mediaHelper.resolveFile(node); - $scope.target.altText = altText; + //$scope.target.url = mediaHelper.resolveFile(node); + //$scope.target.altText = altText; $scope.openDetailsDialog(); } }, gotoStartNode); + } + else { + // No ID set - then this is going to be a tmpimg that has not been uploaded + // User editing this will want to be changing the ALT text + $scope.openDetailsDialog(); + } } } From 76dd7a667a92d6d7159485b89ffeb105909aaca4 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Wed, 2 Oct 2019 13:23:05 +0100 Subject: [PATCH 13/50] Remove console.logs --- .../src/common/services/tinymce.service.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js b/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js index 0e4816953f..4480968d0a 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js @@ -617,7 +617,6 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s userService.getCurrentUser().then(function (userData) { if (callback) { angularHelper.safeApply($rootScope, function() { - console.log('current data in create media picker', currentTarget); callback(currentTarget, userData, imgDomElement); }); } @@ -631,14 +630,11 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s // imgElement is only definied if updating an image // if null/undefinied then its a BRAND new image if(imgDomElement){ - console.log('UPDATING IMG', img); - // Check if the img src has changed // If it has we will need to do some resizing/recalc again var hasImageSrcChanged = false; if(img.url !== editor.dom.getAttrib(imgDomElement, "src")){ - console.log("IMG SRC CHANGED !!!!"); hasImageSrcChanged = true; } @@ -667,7 +663,6 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s } } else{ - console.log('CREATE NEW IMAGE', img); // We need to create a NEW DOM element to insert var data = { alt: img.altText || "", From 05ff51575bde05ca2e57352a71ae5646007d9148 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 2 Oct 2019 15:30:41 +0200 Subject: [PATCH 14/50] Wait for image to load, for measuring size. Removed the 500ms timeout that was prone to error if image was'nt loaded within time. --- .../src/common/services/tinymce.service.js | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js b/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js index 4480968d0a..3978cedd2d 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js @@ -664,23 +664,37 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s } else{ // We need to create a NEW DOM element to insert + // setting an attribute of ID to __mcenew, so we can gather a reference to the node, to be able to update its size accordingly to the size of the image. var data = { alt: img.altText || "", src: (img.url) ? img.url : "nothing.jpg", id: "__mcenew", "data-udi": img.udi }; + editor.selection.setContent(editor.dom.createHTML('img', data)); - - // Insert a DOM element with an ID of __mcenew - // So we can select it after 500ms by that ID - // In order to call the sizeImageEditor function to size img correctly + + // Using settimeout to wait for a DoM-render, so we can find the new element by ID. $timeout(function () { + var imgElm = editor.dom.get("__mcenew"); - sizeImageInEditor(editor, imgElm, img.url); editor.dom.setAttrib(imgElm, "id", null); - editor.fire("Change"); - }, 500); + + // When image is loaded we are ready to call sizeImageInEditor. + var onImageLoaded = function() { + sizeImageInEditor(editor, imgElm, img.url); + editor.fire("Change"); + } + + // Check if image already is loaded. + if(imgElm.complete === true) { + onImageLoaded(); + } else { + imgElm.onload = onImageLoaded; + } + + }); + } } }, From 03a4affbde4948afbcccc7fbea6a2327c97f8c40 Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 3 Oct 2019 10:12:41 +0200 Subject: [PATCH 15/50] Fixes order of parsing RTEs --- .../PropertyEditors/GridPropertyEditor.cs | 12 ++++++------ .../PropertyEditors/RichTextPropertyEditor.cs | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs index 719377ca72..41f38a33e1 100644 --- a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs @@ -86,18 +86,18 @@ namespace Umbraco.Web.PropertyEditors var rawJson = editorValue.Value.ToString(); var grid = DeserializeGridValue(rawJson, out var rtes); + var userId = _umbracoContextAccessor.UmbracoContext?.Security.CurrentUser.Id ?? Constants.Security.SuperUserId; + //process the rte values - foreach(var rte in rtes) + foreach (var rte in rtes) { // Parse the HTML var html = rte.Value?.ToString(); - var userId = _umbracoContextAccessor.UmbracoContext?.Security.CurrentUser.Id ?? Constants.Security.SuperUserId; + var parseAndSavedTempImages = TemplateUtilities.FindAndPersistPastedTempImages(html, mediaParentId, userId, _mediaService, _contentTypeBaseServiceProvider, _logger); + var editorValueWithMediaUrlsRemoved = TemplateUtilities.RemoveMediaUrlsFromTextString(parseAndSavedTempImages); - var editorValueWithMediaUrlsRemoved = TemplateUtilities.RemoveMediaUrlsFromTextString(html); - - var parsedHtml = TemplateUtilities.FindAndPersistPastedTempImages(editorValueWithMediaUrlsRemoved, mediaParentId, userId, _mediaService, _contentTypeBaseServiceProvider, _logger); - rte.Value = parsedHtml; + rte.Value = editorValueWithMediaUrlsRemoved; } // Convert back to raw JSON for persisting diff --git a/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs index d29b96c1db..3eed40c8bf 100644 --- a/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs @@ -114,16 +114,16 @@ namespace Umbraco.Web.PropertyEditors if (editorValue.Value == null) return null; - var editorValueWithMediaUrlsRemoved = TemplateUtilities.RemoveMediaUrlsFromTextString(editorValue.Value.ToString()); - var parsed = MacroTagParser.FormatRichTextContentForPersistence(editorValueWithMediaUrlsRemoved); - var userId = _umbracoContextAccessor.UmbracoContext?.Security.CurrentUser.Id ?? Constants.Security.SuperUserId; var config = editorValue.DataTypeConfiguration as RichTextConfiguration; var mediaParent = config?.MediaParentId; var mediaParentId = mediaParent == null ? Guid.Empty : mediaParent.Guid; - parsed = TemplateUtilities.FindAndPersistPastedTempImages(parsed, mediaParentId, userId, _mediaService, _contentTypeBaseServiceProvider, _logger); + var parseAndSavedTempImages = TemplateUtilities.FindAndPersistPastedTempImages(editorValue.Value.ToString(), mediaParentId, userId, _mediaService, _contentTypeBaseServiceProvider, _logger); + var editorValueWithMediaUrlsRemoved = TemplateUtilities.RemoveMediaUrlsFromTextString(parseAndSavedTempImages); + var parsed = MacroTagParser.FormatRichTextContentForPersistence(editorValueWithMediaUrlsRemoved); + return parsed; } } From c0fa66799f8e81a3d32ccd56da5ee18189140938 Mon Sep 17 00:00:00 2001 From: arkadiuszbiel Date: Fri, 4 Oct 2019 16:41:29 +0200 Subject: [PATCH 16/50] Split config and index creator to allow to override only config not whole index creator --- src/Umbraco.Examine/IUmbracoIndexConfig.cs | 12 +++++++ src/Umbraco.Examine/Umbraco.Examine.csproj | 2 ++ .../UmbracoUmbracoIndexConfig.cs | 34 +++++++++++++++++++ src/Umbraco.Web/Search/ExamineComposer.cs | 1 + .../Search/UmbracoIndexesCreator.cs | 27 ++++----------- 5 files changed, 55 insertions(+), 21 deletions(-) create mode 100644 src/Umbraco.Examine/IUmbracoIndexConfig.cs create mode 100644 src/Umbraco.Examine/UmbracoUmbracoIndexConfig.cs diff --git a/src/Umbraco.Examine/IUmbracoIndexConfig.cs b/src/Umbraco.Examine/IUmbracoIndexConfig.cs new file mode 100644 index 0000000000..798c173f5c --- /dev/null +++ b/src/Umbraco.Examine/IUmbracoIndexConfig.cs @@ -0,0 +1,12 @@ +using Examine; + +namespace Umbraco.Examine +{ + public abstract class IUmbracoIndexConfig + { + public abstract IContentValueSetValidator GetContentValueSetValidator(); + public abstract IContentValueSetValidator GetPublishedContentValueSetValidator(); + public abstract IValueSetValidator GetMemberValueSetValidator(); + + } +} diff --git a/src/Umbraco.Examine/Umbraco.Examine.csproj b/src/Umbraco.Examine/Umbraco.Examine.csproj index e28a8e674e..2bfa810b45 100644 --- a/src/Umbraco.Examine/Umbraco.Examine.csproj +++ b/src/Umbraco.Examine/Umbraco.Examine.csproj @@ -64,9 +64,11 @@ + + diff --git a/src/Umbraco.Examine/UmbracoUmbracoIndexConfig.cs b/src/Umbraco.Examine/UmbracoUmbracoIndexConfig.cs new file mode 100644 index 0000000000..0a9b8607e8 --- /dev/null +++ b/src/Umbraco.Examine/UmbracoUmbracoIndexConfig.cs @@ -0,0 +1,34 @@ +using Examine; +using Umbraco.Core.Services; +using Umbraco.Core.Services.Implement; + +namespace Umbraco.Examine +{ + public class UmbracoUmbracoIndexConfig : IUmbracoIndexConfig + { + public UmbracoUmbracoIndexConfig(IPublicAccessService publicAccessService) + { + PublicAccessService = publicAccessService; + } + + protected IPublicAccessService PublicAccessService { get; } + public override IContentValueSetValidator GetContentValueSetValidator() + { + return new ContentValueSetValidator(false, true, PublicAccessService); + } + + public override IContentValueSetValidator GetPublishedContentValueSetValidator() + { + return new ContentValueSetValidator(true, false, PublicAccessService); + } + + /// + /// Returns the for the member indexer + /// + /// + public override IValueSetValidator GetMemberValueSetValidator() + { + return new MemberValueSetValidator(); + } + } +} diff --git a/src/Umbraco.Web/Search/ExamineComposer.cs b/src/Umbraco.Web/Search/ExamineComposer.cs index 0ade432d70..ee07e3dd1e 100644 --- a/src/Umbraco.Web/Search/ExamineComposer.cs +++ b/src/Umbraco.Web/Search/ExamineComposer.cs @@ -29,6 +29,7 @@ namespace Umbraco.Web.Search composition.Register(Lifetime.Singleton); composition.Register(Lifetime.Singleton); + composition.RegisterUnique(); composition.RegisterUnique(); composition.RegisterUnique(factory => new ContentValueSetBuilder( diff --git a/src/Umbraco.Web/Search/UmbracoIndexesCreator.cs b/src/Umbraco.Web/Search/UmbracoIndexesCreator.cs index 5ac5529be5..beecb85ae6 100644 --- a/src/Umbraco.Web/Search/UmbracoIndexesCreator.cs +++ b/src/Umbraco.Web/Search/UmbracoIndexesCreator.cs @@ -19,18 +19,20 @@ namespace Umbraco.Web.Search public UmbracoIndexesCreator(IProfilingLogger profilingLogger, ILocalizationService languageService, IPublicAccessService publicAccessService, - IMemberService memberService) + IMemberService memberService, IUmbracoIndexConfig umbracoIndexConfig) { ProfilingLogger = profilingLogger ?? throw new System.ArgumentNullException(nameof(profilingLogger)); LanguageService = languageService ?? throw new System.ArgumentNullException(nameof(languageService)); PublicAccessService = publicAccessService ?? throw new System.ArgumentNullException(nameof(publicAccessService)); MemberService = memberService ?? throw new System.ArgumentNullException(nameof(memberService)); + UmbracoIndexConfig = umbracoIndexConfig; } protected IProfilingLogger ProfilingLogger { get; } protected ILocalizationService LanguageService { get; } protected IPublicAccessService PublicAccessService { get; } protected IMemberService MemberService { get; } + protected IUmbracoIndexConfig UmbracoIndexConfig { get; } /// /// Creates the Umbraco indexes @@ -55,7 +57,7 @@ namespace Umbraco.Web.Search new CultureInvariantWhitespaceAnalyzer(), ProfilingLogger, LanguageService, - GetContentValueSetValidator()); + UmbracoIndexConfig.GetContentValueSetValidator()); return index; } @@ -68,7 +70,7 @@ namespace Umbraco.Web.Search new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30), ProfilingLogger, LanguageService, - GetPublishedContentValueSetValidator()); + UmbracoIndexConfig.GetPublishedContentValueSetValidator()); return index; } @@ -80,28 +82,11 @@ namespace Umbraco.Web.Search CreateFileSystemLuceneDirectory(Constants.UmbracoIndexes.MembersIndexPath), new CultureInvariantWhitespaceAnalyzer(), ProfilingLogger, - GetMemberValueSetValidator()); + UmbracoIndexConfig.GetMemberValueSetValidator()); return index; } - - public virtual IContentValueSetValidator GetContentValueSetValidator() - { - return new ContentValueSetValidator(false, true, PublicAccessService); - } - public virtual IContentValueSetValidator GetPublishedContentValueSetValidator() - { - return new ContentValueSetValidator(true, false, PublicAccessService); - } - /// - /// Returns the for the member indexer - /// - /// - public virtual IValueSetValidator GetMemberValueSetValidator() - { - return new MemberValueSetValidator(); - } } } From 1ca35b2fbb91f9b48f32f014f5dab64900d800dd Mon Sep 17 00:00:00 2001 From: arkadiuszbiel Date: Sat, 5 Oct 2019 14:36:47 +0200 Subject: [PATCH 17/50] Obsolete instead of remove functions --- .../Search/UmbracoIndexesCreator.cs | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web/Search/UmbracoIndexesCreator.cs b/src/Umbraco.Web/Search/UmbracoIndexesCreator.cs index beecb85ae6..73b7343b16 100644 --- a/src/Umbraco.Web/Search/UmbracoIndexesCreator.cs +++ b/src/Umbraco.Web/Search/UmbracoIndexesCreator.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using Umbraco.Core.Logging; using Umbraco.Core.Services; using Umbraco.Examine; @@ -57,7 +58,8 @@ namespace Umbraco.Web.Search new CultureInvariantWhitespaceAnalyzer(), ProfilingLogger, LanguageService, - UmbracoIndexConfig.GetContentValueSetValidator()); + GetContentValueSetValidator() + ); return index; } @@ -70,7 +72,7 @@ namespace Umbraco.Web.Search new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30), ProfilingLogger, LanguageService, - UmbracoIndexConfig.GetPublishedContentValueSetValidator()); + GetPublishedContentValueSetValidator()); return index; } @@ -82,10 +84,30 @@ namespace Umbraco.Web.Search CreateFileSystemLuceneDirectory(Constants.UmbracoIndexes.MembersIndexPath), new CultureInvariantWhitespaceAnalyzer(), ProfilingLogger, - UmbracoIndexConfig.GetMemberValueSetValidator()); + GetMemberValueSetValidator() + ); return index; } + [Obsolete] + public virtual IContentValueSetValidator GetContentValueSetValidator() + { + return UmbracoIndexConfig.GetContentValueSetValidator(); + } + [Obsolete] + public virtual IContentValueSetValidator GetPublishedContentValueSetValidator() + { + return UmbracoIndexConfig.GetPublishedContentValueSetValidator(); + } + /// + /// Returns the for the member indexer + /// + /// + [Obsolete] + public virtual IValueSetValidator GetMemberValueSetValidator() + { + return UmbracoIndexConfig.GetMemberValueSetValidator(); + } } From 0e4727f5df4d8979be18eef905fd277d534414f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Kottal?= Date: Sat, 5 Oct 2019 21:56:16 +0200 Subject: [PATCH 18/50] Adds missing danish language keys, and changes a few others --- src/Umbraco.Web.UI/Umbraco/config/lang/da.xml | 80 ++++++++++++++++++- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml index 09c4283443..ff299b8e7f 100644 --- a/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml +++ b/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml @@ -11,6 +11,7 @@ Skift dokumenttype Kopier Opret + Eksportér Opret pakke Opret gruppe Slet @@ -69,6 +70,7 @@ Tillad adgang til at flytte en node Tillad adgang til at indstille og ændre offentlig adgang til en node Tillad adgang til at udgive en node + Tillad adgang til at afpublicere en node Tillad adgang til at ændre rettigheder for en node Tillad adgang til at returnere en node til en tidligere tilstand Tillad adgang til at sende en node til godkendelse før den udgives @@ -164,8 +166,10 @@ Brugeren har sorteret de underliggende sider Kopieret Udgivet + Udgivet Flyttet Gemt + Gemt Slettet Afpubliceret Indhold tilbagerullet @@ -230,14 +234,17 @@ Der er endnu ikke lavet nogle ændringer. Ingen dato valgt Sidetitel + Dette medie har ikke noget link Egenskaber Dette dokument er udgivet, men ikke synligt da den overliggende side '%0%' ikke er udgivet! + Dette sprog er udgivet, men ikke synligt, da den overliggende side '%0%' ikke er udgivet! Ups: dette dokument er udgivet, men er ikke i cachen (intern fejl) Kunne ikke hente url'en Dette dokument er udgivet, men dets url ville kollidere med indholdet %0% + Dette dokument er udgivet, men dets URL kan ikke dirigeres Udgiv Udgivet - Udgivet (Ventede ændringer) + Udgivet (Afventende ændringer) Udgivelsesstatus Udgiv med undersider for at udgive %0% og alle sider under og dermed gøre deres indhold offentligt tilgængelige.]]> Udgiv med undersider for at udgive de valgte sprog og de samme sprog for sider under og dermed gøre deres indhold offentligt tilgængelige.]]> @@ -267,6 +274,7 @@ Er du sikker på, at du vil slette dette element? Egenskaben %0% anvender editoren %1% som ikke er understøttet af Nested Content. Der er ikke konfigureret nogen indholdstyper for denne egenskab. + %0% fra %1% Tilføj en ny tekstboks Fjern denne tekstboks Indholdsrod @@ -325,7 +333,11 @@ Angiv et navn for mappen Vælg en type og skriv en titel "dokument typer".]]> + Den valgte side i træet tillader ikke at sider oprettes under den. + Rediger tilladelser for denne dokumenttype. "media typer".]]> + Det valgte medie i træet tillader ikke at medier oprettes under det. + Rediger tilladelser for denne medietype. Dokumenttype uden skabelon Ny mappe Ny datatype @@ -352,6 +364,8 @@ Kassér ændringer Du har ikke-gemte ændringer Er du sikker på du vil navigere væk fra denne side? - du har ikke-gemte ændringer + Udgivelse vil gøre de valgte sider synlige på sitet. + Afpublicering vil fjerne de valgte sider og deres undersider fra sitet. Afpublicering vil fjerne denne side og alle dets undersider fra websitet. Du har ikke-gemte ændringer. Hvis du ændrer dokumenttype, kasseres ændringerne. @@ -381,6 +395,7 @@ Link titel Link + Lokalt link / querystreng Navn på lokalt link Rediger domæner Luk denne dialog @@ -450,6 +465,10 @@ Ingen ikoner blev fundet Der er ingen parametre for denne makro Der er ikke tilføjet nogen makroer + Eksterne login-udbydere + Undtagelsesdetaljer + Stacktrace + Indre undtagelse Link dit Fjern link fra dit konto @@ -509,12 +528,17 @@ Indtast din e-mail Indtast en besked... Dit brugernavn er typisk din e-mailadresse + #value eller ?key=value Indtast alias... Genererer alias... + Opret element + Rediger + Navn Opret brugerdefineret listevisning Fjern brugerdefineret listevisning + En dokumenttype, medietype eller medlemstype med dette alias findes allerede Omdøbt @@ -560,6 +584,7 @@ OBS! Selvom CodeMirror er slået til i konfigurationen, så er den deaktiveret i Internet Explorer fordi den ikke er stabil nok. Du skal udfylde både Alias & Navn på den nye egenskabstype! Der mangler læse/skrive rettigheder til bestemte filer og mapper + Fejl ved indlæsning af Partial View script (fil: %0%) Skriv venligst en titel Du skal vælge en type Du er ved at gøre billedet større end originalen. Det vil forringe kvaliteten af billedet. Ønsker du at fortsætte? @@ -576,6 +601,7 @@ Muligheder Tilføj Alias + Alle Er du sikker? Tilbage Tilbage til oversigt @@ -601,6 +627,7 @@ Slettet Sletter... Design + Ordbog Dimensioner Ned Hent @@ -623,14 +650,17 @@ Id Importer Inkludér undermapper i søgning + Info Indre margen Indsæt Installér Ugyldig Justering + Mærke Sprog Sidste Layout + Links Henter Låst Log ind @@ -645,8 +675,11 @@ Næste Nej af + Fra OK Åben + Valgmuligheder + Til eller Sortér efter Kodeord @@ -681,6 +714,7 @@ Indsend Type Skriv for at søge... + under Op Opdatér Opdatér @@ -730,6 +764,7 @@ Move Lines Down Generelt Editor + Skift tillad sprogvarianter Baggrundsfarve @@ -993,6 +1028,10 @@ Mange hilsner fra Umbraco robotten + + %0% kunne ikke udgives, fordi et 3. parts modul annullerede handlingen Medtag ikke-udgivede undersider @@ -1028,6 +1067,8 @@ Mange hilsner fra Umbraco robotten Nulstil + Gem beskæring + Tilføj ny beskæring Acceptér Fortryd @@ -1075,6 +1116,8 @@ Mange hilsner fra Umbraco robotten Faneblad Titel på faneblad Faneblade + Opret tilsvarende skabelon + Tilføj ikon Sorteringsrækkefølge @@ -1091,6 +1134,7 @@ Mange hilsner fra Umbraco robotten Utilstrækkelige brugerrettigheder, kunne ikke fuldføre handlingen Annulleret Handlingen blev annulleret af et 3. part tilføjelsesprogram + Udgivelsen blev annulleret af et 3. part tilføjelsesprogram Property type eksisterer allerede Egenskabstype oprettet DataType: %1%]]> @@ -1104,6 +1148,7 @@ Mange hilsner fra Umbraco robotten Stylesheet gemt uden fejl Datatype gemt Ordbogsnøgle gemt + Udgivelse fejlede da overliggende side ikke er udgivet Indhold publiceret og nu synligt for besøgende Indhold gemt @@ -1148,6 +1193,11 @@ Mange hilsner fra Umbraco robotten Brugergrupper er blevet indstillet Låste %0% brugere op %0% er nu låst op + Brugeren %0% blev slettet + Invitér bruger + Invitationen blev gensendt til %0% + Dokumenttypen blev eksporteret til en fil + Der skete en fejl under eksport af en dokumenttype Tilføj style @@ -1312,7 +1362,9 @@ Mange hilsner fra Umbraco robotten Konfiguration Ja, slet blev flyttet til + blev kopieret til Vælg hvor + Vælg hvor skal flyttes til Alle dokumenttyper Alle dokumenter @@ -1324,8 +1376,15 @@ Mange hilsner fra Umbraco robotten og alle medier, som benytter denne type og alle medlemmer, som benytter denne type Medlem kan redigere + Tillad at denne egenskab kan redigeres af medlemmet på dets profil. + Er følsom data + Skjul værdien af denne egenskab for indholdsredaktører der ikke har adgang til at se følsomme data Vis på medlemsprofil + Tillad at denne egenskab kan vises på medlemmets profil. fane har ingen sorteringsrækkefølge + Hvor er denne komposition brugt? + Denne komposition brugt i kompositionen af de følgende indholdstyper: + Tillad sprogvariation Tillad at redaktører kan oprette indhold af denne type på flere sprog. Tillad sprogvariation Element-type @@ -1354,14 +1413,28 @@ Mange hilsner fra Umbraco robotten Definér de parametre der skal være tilgængelige, når du bruger denne makro. Vælg partial view makrofil + + Bygger modeller + dette kan tage lidt tid + Modeller genereret + Modeller kunne ikke genereres + Modelgeneration fejlet, se fejlmeddelelse i log + + Tilføj fallback felt + Fallback felt + Tilføj standard værdi + Standard værdi Alternativt felt Alternativ tekst Casing + Kodning Felt som skal indsættes Konvertér linieskift Erstatter et linieskift med html-tag'et &lt;br&gt; + Custom felter Ja, kun dato + Format og kodning Formatér som dato HTML indkod Vil erstatte specielle karakterer med deres HTML jævnbyrdige. @@ -1433,6 +1506,7 @@ Mange hilsner fra Umbraco robotten Scripts Stylesheets Skabeloner + Logfremviser Brugertilladelser Brugertyper Brugere @@ -1461,6 +1535,7 @@ Mange hilsner fra Umbraco robotten Gentag dit nye kodeord Du kan ændre dit kodeord, som giver dig adgang til Umbraco Back Office ved at udfylde formularen og klikke på knappen 'Skift dit kodeord' Indholdskanal + Opret endnu en bruger Opret nye brugere for at give dem adgang til Umbraco. Når en ny bruger oprettes, genereres der en adgangskode, som du kan dele med brugeren. Beskrivelsesfelt Deaktivér bruger @@ -1474,7 +1549,7 @@ Mange hilsner fra Umbraco robotten Invitér nye brugere til at give dem adgang til Umbraco. En invitation vil blive sendt via e-mail til brugeren med oplysninger om, hvordan man logger ind i Umbraco. Sprog Indstil det sprog, du vil se i menuer og dialoger - Seneste låst ude dato + Senest låst ude Seneste login Kodeord sidst ændret Brugernavn @@ -1523,6 +1598,7 @@ Mange hilsner fra Umbraco robotten er blevet inviteret En invitation er blevet sendt til den nye bruger med oplysninger om, hvordan man logger ind i Umbraco. Hej og velkommen til Umbraco! På bare 1 minut vil du være klar til at komme i gang, vi skal bare have dig til at oprette en adgangskode og tilføje et billede til din avatar. + Velkommen til Umbraco! Desværre er din invitation udløbet. Kontakt din administrator og bed om at gensende invitationen. Hvis du uploader et billede af dig selv, gør du det nemt for andre brugere at genkende dig. Klik på cirklen ovenfor for at uploade et billede. Forfatter Skift From 1ad3103d942da65220284633f30ebb35aacd3c84 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Mon, 7 Oct 2019 13:19:58 +0200 Subject: [PATCH 19/50] https://github.com/umbraco/Umbraco-CMS/issues/6516 - Revert uncommenting stuff, without knowing why the code was their. --- .../mediapicker/mediapicker.controller.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js index 4b6cfb6969..24b8b999fa 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js @@ -101,17 +101,18 @@ angular.module("umbraco") // if a target is specified, go look it up - generally this target will just contain ids not the actual full // media object so we need to look it up var id = $scope.target.udi ? $scope.target.udi : $scope.target.id; - + var altText = $scope.target.altText; + // ID of a UDI or legacy int ID still could be null/undefinied here // As user may dragged in an image that has not been saved to media section yet if(id){ entityResource.getById(id, "Media") .then(function (node) { - //$scope.target = node; //Not 100% sure why we override it here?! + $scope.target = node; if (ensureWithinStartNode(node)) { selectImage(node); - //$scope.target.url = mediaHelper.resolveFile(node); - //$scope.target.altText = altText; + $scope.target.url = mediaHelper.resolveFile(node); + $scope.target.altText = altText; $scope.openDetailsDialog(); } }, @@ -517,4 +518,4 @@ angular.module("umbraco") onInit(); - }); \ No newline at end of file + }); From 9d5f7a8a96575f57e11ecbabae69f1e216353bcf Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Tue, 8 Oct 2019 11:17:54 +0200 Subject: [PATCH 20/50] Removed rc from version --- src/SolutionInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SolutionInfo.cs b/src/SolutionInfo.cs index f26965eeae..a4e859988e 100644 --- a/src/SolutionInfo.cs +++ b/src/SolutionInfo.cs @@ -19,4 +19,4 @@ using System.Resources; // these are FYI and changed automatically [assembly: AssemblyFileVersion("8.2.0")] -[assembly: AssemblyInformationalVersion("8.2.0-rc")] +[assembly: AssemblyInformationalVersion("8.2.0")] From 646bfb02f2ceac5dc82652e9cd68c8b969e47bca Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Tue, 8 Oct 2019 18:55:44 +0200 Subject: [PATCH 21/50] Check if value is null or whitespace before reading grid configuration --- src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs index 2c2c69d181..f782f09289 100644 --- a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs @@ -78,20 +78,20 @@ namespace Umbraco.Web.PropertyEditors if (editorValue.Value == null) return null; - var config = editorValue.DataTypeConfiguration as GridConfiguration; - var mediaParent = config?.MediaParentId; - var mediaParentId = mediaParent == null ? Guid.Empty : mediaParent.Guid; - // editorValue.Value is a JSON string of the grid var rawJson = editorValue.Value.ToString(); if (rawJson.IsNullOrWhiteSpace()) return null; + var config = editorValue.DataTypeConfiguration as GridConfiguration; + var mediaParent = config?.MediaParentId; + var mediaParentId = mediaParent == null ? Guid.Empty : mediaParent.Guid; + var grid = DeserializeGridValue(rawJson, out var rtes); var userId = _umbracoContextAccessor.UmbracoContext?.Security.CurrentUser.Id ?? Constants.Security.SuperUserId; - //process the rte values + // Process the rte values foreach (var rte in rtes) { // Parse the HTML From 0567ed9a3483f29e2bac724505098a3156971730 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Tue, 8 Oct 2019 22:34:24 +0200 Subject: [PATCH 22/50] Fix incorrect path in member group mapping --- src/Umbraco.Web/Models/Mapping/MemberMapDefinition.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web/Models/Mapping/MemberMapDefinition.cs b/src/Umbraco.Web/Models/Mapping/MemberMapDefinition.cs index 96ca16e18b..8671bfe538 100644 --- a/src/Umbraco.Web/Models/Mapping/MemberMapDefinition.cs +++ b/src/Umbraco.Web/Models/Mapping/MemberMapDefinition.cs @@ -144,7 +144,7 @@ namespace Umbraco.Web.Models.Mapping target.Id = source.Id; target.Key = source.Key; target.Name = source.Name; - target.Path = "-1" + source.Id; + target.Path = $"-1,{source.Id}"; target.Udi = Udi.Create(Constants.UdiEntityType.MemberGroup, source.Key); } From 4e6bbcf6c29e0516a20f047b289c997e7b9c62f7 Mon Sep 17 00:00:00 2001 From: Paul Seal Date: Tue, 8 Oct 2019 23:52:11 +0100 Subject: [PATCH 23/50] - updated usage of EmptyRecycleBin to pass in the user id as instructed in warning messages --- src/Umbraco.Tests/Integration/ContentEventsTests.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Tests/Integration/ContentEventsTests.cs b/src/Umbraco.Tests/Integration/ContentEventsTests.cs index fa9e7b676b..7f103e13e4 100644 --- a/src/Umbraco.Tests/Integration/ContentEventsTests.cs +++ b/src/Umbraco.Tests/Integration/ContentEventsTests.cs @@ -1087,7 +1087,7 @@ namespace Umbraco.Tests.Integration [Test] public void EmptyRecycleBinContent() { - ServiceContext.ContentService.EmptyRecycleBin(); + ServiceContext.ContentService.EmptyRecycleBin(Constants.Security.SuperUserId); var content = CreateContent(); Assert.IsNotNull(content); @@ -1095,7 +1095,7 @@ namespace Umbraco.Tests.Integration ServiceContext.ContentService.MoveToRecycleBin(content); ResetEvents(); - ServiceContext.ContentService.EmptyRecycleBin(); + ServiceContext.ContentService.EmptyRecycleBin(Constants.Security.SuperUserId); Assert.AreEqual(2, _msgCount); Assert.AreEqual(2, _events.Count); @@ -1109,7 +1109,7 @@ namespace Umbraco.Tests.Integration [Test] public void EmptyRecycleBinContents() { - ServiceContext.ContentService.EmptyRecycleBin(); + ServiceContext.ContentService.EmptyRecycleBin(Constants.Security.SuperUserId); var content1 = CreateContent(); Assert.IsNotNull(content1); @@ -1120,7 +1120,7 @@ namespace Umbraco.Tests.Integration ServiceContext.ContentService.MoveToRecycleBin(content2); ResetEvents(); - ServiceContext.ContentService.EmptyRecycleBin(); + ServiceContext.ContentService.EmptyRecycleBin(Constants.Security.SuperUserId); Assert.AreEqual(3, _msgCount); Assert.AreEqual(4, _events.Count); @@ -1136,7 +1136,7 @@ namespace Umbraco.Tests.Integration [Test] public void EmptyRecycleBinBranch() { - ServiceContext.ContentService.EmptyRecycleBin(); + ServiceContext.ContentService.EmptyRecycleBin(Constants.Security.SuperUserId); var content1 = CreateBranch(); Assert.IsNotNull(content1); @@ -1151,7 +1151,7 @@ namespace Umbraco.Tests.Integration var content4C = Children(content1C[2]).ToArray(); var content5C = Children(content1C[3]).ToArray(); - ServiceContext.ContentService.EmptyRecycleBin(); + ServiceContext.ContentService.EmptyRecycleBin(Constants.Security.SuperUserId); Assert.AreEqual(14, _msgCount); Assert.AreEqual(14, _events.Count); From 6f5665f6a547881f85b393b7865723152c51a21e Mon Sep 17 00:00:00 2001 From: Paul Seal Date: Wed, 9 Oct 2019 00:03:24 +0100 Subject: [PATCH 24/50] - updated this in 3 more places --- src/Umbraco.Tests/Services/ContentServiceTests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Tests/Services/ContentServiceTests.cs b/src/Umbraco.Tests/Services/ContentServiceTests.cs index 7cfc650510..e26e764cd1 100644 --- a/src/Umbraco.Tests/Services/ContentServiceTests.cs +++ b/src/Umbraco.Tests/Services/ContentServiceTests.cs @@ -1616,7 +1616,7 @@ namespace Umbraco.Tests.Services Assert.IsTrue(descendants.All(x => x.Path.StartsWith("-1,-20,"))); Assert.True(descendants.All(x => x.Trashed)); - contentService.EmptyRecycleBin(); + contentService.EmptyRecycleBin(Constants.Security.SuperUserId); var trashed = contentService.GetPagedContentInRecycleBin(0, int.MaxValue, out var _).ToList(); Assert.IsEmpty(trashed); } @@ -1628,7 +1628,7 @@ namespace Umbraco.Tests.Services var contentService = ServiceContext.ContentService; // Act - contentService.EmptyRecycleBin(); + contentService.EmptyRecycleBin(Constants.Security.SuperUserId); var contents = contentService.GetPagedContentInRecycleBin(0, int.MaxValue, out var _).ToList(); // Assert @@ -1804,7 +1804,7 @@ namespace Umbraco.Tests.Services // Act ServiceContext.ContentService.MoveToRecycleBin(content1); - ServiceContext.ContentService.EmptyRecycleBin(); + ServiceContext.ContentService.EmptyRecycleBin(Constants.Security.SuperUserId); var contents = ServiceContext.ContentService.GetPagedContentInRecycleBin(0, int.MaxValue, out var _).ToList(); // Assert From 511751d1473a85fc19e01e958e66abbb2ea42e3c Mon Sep 17 00:00:00 2001 From: arkadiuszbiel Date: Thu, 10 Oct 2019 15:50:00 +0200 Subject: [PATCH 25/50] refactor based on shannon comments --- src/Umbraco.Examine/IUmbracoIndexConfig.cs | 8 ++++---- src/Umbraco.Examine/Umbraco.Examine.csproj | 2 +- ...racoUmbracoIndexConfig.cs => UmbracoIndexConfig.cs} | 10 +++++----- src/Umbraco.Web/Search/UmbracoIndexesCreator.cs | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) rename src/Umbraco.Examine/{UmbracoUmbracoIndexConfig.cs => UmbracoIndexConfig.cs} (65%) diff --git a/src/Umbraco.Examine/IUmbracoIndexConfig.cs b/src/Umbraco.Examine/IUmbracoIndexConfig.cs index 798c173f5c..02c6c51d0c 100644 --- a/src/Umbraco.Examine/IUmbracoIndexConfig.cs +++ b/src/Umbraco.Examine/IUmbracoIndexConfig.cs @@ -2,11 +2,11 @@ using Examine; namespace Umbraco.Examine { - public abstract class IUmbracoIndexConfig + public interface IUmbracoIndexConfig { - public abstract IContentValueSetValidator GetContentValueSetValidator(); - public abstract IContentValueSetValidator GetPublishedContentValueSetValidator(); - public abstract IValueSetValidator GetMemberValueSetValidator(); + IContentValueSetValidator GetContentValueSetValidator(); + IContentValueSetValidator GetPublishedContentValueSetValidator(); + IValueSetValidator GetMemberValueSetValidator(); } } diff --git a/src/Umbraco.Examine/Umbraco.Examine.csproj b/src/Umbraco.Examine/Umbraco.Examine.csproj index 2bfa810b45..e30d355dfe 100644 --- a/src/Umbraco.Examine/Umbraco.Examine.csproj +++ b/src/Umbraco.Examine/Umbraco.Examine.csproj @@ -68,7 +68,7 @@ - + diff --git a/src/Umbraco.Examine/UmbracoUmbracoIndexConfig.cs b/src/Umbraco.Examine/UmbracoIndexConfig.cs similarity index 65% rename from src/Umbraco.Examine/UmbracoUmbracoIndexConfig.cs rename to src/Umbraco.Examine/UmbracoIndexConfig.cs index 0a9b8607e8..7ad9c638d3 100644 --- a/src/Umbraco.Examine/UmbracoUmbracoIndexConfig.cs +++ b/src/Umbraco.Examine/UmbracoIndexConfig.cs @@ -4,20 +4,20 @@ using Umbraco.Core.Services.Implement; namespace Umbraco.Examine { - public class UmbracoUmbracoIndexConfig : IUmbracoIndexConfig + public class UmbracoIndexConfig : IUmbracoIndexConfig { - public UmbracoUmbracoIndexConfig(IPublicAccessService publicAccessService) + public UmbracoIndexConfig(IPublicAccessService publicAccessService) { PublicAccessService = publicAccessService; } protected IPublicAccessService PublicAccessService { get; } - public override IContentValueSetValidator GetContentValueSetValidator() + public IContentValueSetValidator GetContentValueSetValidator() { return new ContentValueSetValidator(false, true, PublicAccessService); } - public override IContentValueSetValidator GetPublishedContentValueSetValidator() + public IContentValueSetValidator GetPublishedContentValueSetValidator() { return new ContentValueSetValidator(true, false, PublicAccessService); } @@ -26,7 +26,7 @@ namespace Umbraco.Examine /// Returns the for the member indexer /// /// - public override IValueSetValidator GetMemberValueSetValidator() + public IValueSetValidator GetMemberValueSetValidator() { return new MemberValueSetValidator(); } diff --git a/src/Umbraco.Web/Search/UmbracoIndexesCreator.cs b/src/Umbraco.Web/Search/UmbracoIndexesCreator.cs index 73b7343b16..ec536b9d75 100644 --- a/src/Umbraco.Web/Search/UmbracoIndexesCreator.cs +++ b/src/Umbraco.Web/Search/UmbracoIndexesCreator.cs @@ -88,12 +88,12 @@ namespace Umbraco.Web.Search ); return index; } - [Obsolete] + [Obsolete("This method should not be used and will be removed in future versions. GetContentValueSetValidator was moved to IUmbracoIndexConfig")] public virtual IContentValueSetValidator GetContentValueSetValidator() { return UmbracoIndexConfig.GetContentValueSetValidator(); } - [Obsolete] + [Obsolete("This method should not be used and will be removed in future versions. GetPublishedContentValueSetValidator was moved to IUmbracoIndexConfig")] public virtual IContentValueSetValidator GetPublishedContentValueSetValidator() { return UmbracoIndexConfig.GetPublishedContentValueSetValidator(); @@ -103,7 +103,7 @@ namespace Umbraco.Web.Search /// Returns the for the member indexer /// /// - [Obsolete] + [Obsolete("This method should not be used and will be removed in future versions. GetMemberValueSetValidator was moved to IUmbracoIndexConfig")] public virtual IValueSetValidator GetMemberValueSetValidator() { return UmbracoIndexConfig.GetMemberValueSetValidator(); From a7412dfe79cc48888566d987c473daf8253a5cfe Mon Sep 17 00:00:00 2001 From: arkadiuszbiel Date: Thu, 10 Oct 2019 18:37:30 +0200 Subject: [PATCH 26/50] Correct name in DI --- src/Umbraco.Web/Search/ExamineComposer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web/Search/ExamineComposer.cs b/src/Umbraco.Web/Search/ExamineComposer.cs index ee07e3dd1e..b30f0cbe03 100644 --- a/src/Umbraco.Web/Search/ExamineComposer.cs +++ b/src/Umbraco.Web/Search/ExamineComposer.cs @@ -29,7 +29,7 @@ namespace Umbraco.Web.Search composition.Register(Lifetime.Singleton); composition.Register(Lifetime.Singleton); - composition.RegisterUnique(); + composition.RegisterUnique(); composition.RegisterUnique(); composition.RegisterUnique(factory => new ContentValueSetBuilder( From 79e6c106d32e8c0cc15cc0d8581fe5c19be08e80 Mon Sep 17 00:00:00 2001 From: Harmen Kooiker Date: Fri, 11 Oct 2019 09:38:43 +0200 Subject: [PATCH 27/50] Fix ContetIndexPopulator publishedQuery --- src/Umbraco.Examine/ContentIndexPopulator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Examine/ContentIndexPopulator.cs b/src/Umbraco.Examine/ContentIndexPopulator.cs index 51b9de4a0b..dd4176a774 100644 --- a/src/Umbraco.Examine/ContentIndexPopulator.cs +++ b/src/Umbraco.Examine/ContentIndexPopulator.cs @@ -52,7 +52,7 @@ namespace Umbraco.Examine if (sqlContext == null) throw new ArgumentNullException(nameof(sqlContext)); _contentService = contentService ?? throw new ArgumentNullException(nameof(contentService)); _contentValueSetBuilder = contentValueSetBuilder ?? throw new ArgumentNullException(nameof(contentValueSetBuilder)); - if (_publishedQuery != null) + if (_publishedQuery == null) _publishedQuery = sqlContext.Query().Where(x => x.Published); _publishedValuesOnly = publishedValuesOnly; _parentId = parentId; From 0dea83543ef8c7acadd2d598b601d811913564d8 Mon Sep 17 00:00:00 2001 From: Ronald Barendse Date: Mon, 14 Oct 2019 13:39:53 +0200 Subject: [PATCH 28/50] Removed Microsoft.Net.Compilers dependency (#6501) --- build/NuSpecs/UmbracoCms.nuspec | 1 - src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 6 +----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/build/NuSpecs/UmbracoCms.nuspec b/build/NuSpecs/UmbracoCms.nuspec index b7bfaaff5b..97e9ef3df2 100644 --- a/build/NuSpecs/UmbracoCms.nuspec +++ b/build/NuSpecs/UmbracoCms.nuspec @@ -30,7 +30,6 @@ - diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index 6c20e8c765..ceeb2d076a 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -94,10 +94,6 @@ - - all - - @@ -429,4 +425,4 @@ - + \ No newline at end of file From 16dc634cf9dd2cbc7285dc38d16814be5bbab5f9 Mon Sep 17 00:00:00 2001 From: Lee Kelleher Date: Mon, 14 Oct 2019 12:56:21 +0100 Subject: [PATCH 29/50] Boolean editors - adds ID attribute to umbToggle (#6512) --- .../directives/components/buttons/umbtoggle.directive.js | 2 ++ .../src/views/components/buttons/umb-toggle.html | 2 +- .../src/views/prevalueeditors/boolean.html | 1 + .../src/views/propertyeditors/boolean/boolean.html | 3 ++- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/buttons/umbtoggle.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/buttons/umbtoggle.directive.js index 0ea5006c4a..5d34ad2906 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/buttons/umbtoggle.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/buttons/umbtoggle.directive.js @@ -54,6 +54,7 @@ @param {boolean} checked Set to true or false to toggle the switch. +@param {string} inputId Set the id of the toggle. @param {callback} onClick The function which should be called when the toggle is clicked. @param {string=} showLabels Set to true or false to show a "On" or "Off" label next to the switch. @param {string=} labelOn Set a custom label for when the switched is turned on. It will default to "On". @@ -122,6 +123,7 @@ scope: { checked: "=", disabled: "=", + inputId: "@", onClick: "&", labelOn: "@?", labelOff: "@?", diff --git a/src/Umbraco.Web.UI.Client/src/views/components/buttons/umb-toggle.html b/src/Umbraco.Web.UI.Client/src/views/components/buttons/umb-toggle.html index 10a1b47735..185d852560 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/buttons/umb-toggle.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/buttons/umb-toggle.html @@ -1,4 +1,4 @@ -
- {{language.name}} +
diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml index 06ab61bb7a..a3f572fbc9 100644 --- a/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml +++ b/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml @@ -1711,5 +1711,7 @@ Mange hilsner fra Umbraco robotten Åben backoffice søgning Åben/Luk backoffice hjælp Åben/Luk dine profil indstillinger + Aktivt sprog + Skift sprog til diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/en.xml index 1b1471a0bc..d1f49e7178 100644 --- a/src/Umbraco.Web.UI/Umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/Umbraco/config/lang/en.xml @@ -2148,5 +2148,7 @@ To manage your website, simply open the Umbraco back office and start adding con Open backoffice search Open/Close backoffice help Open/Close your profile options + Current language + Switch language to diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml index 668faf377f..e70f255e93 100644 --- a/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml @@ -2162,5 +2162,7 @@ To manage your website, simply open the Umbraco back office and start adding con Open backoffice search Open/Close backoffice help Open/Close your profile options + Current language + Switch language to From a439606a05393ec8deec669843b5d4f390f8b5e2 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Mon, 14 Oct 2019 16:01:00 +0200 Subject: [PATCH 39/50] Adjust layout in profiler dashboard (#6539) --- .../views/dashboard/settings/profiler.html | 44 ++++++++++--------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/settings/profiler.html b/src/Umbraco.Web.UI.Client/src/views/dashboard/settings/profiler.html index 2a7419c0ea..e55dbe2298 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dashboard/settings/profiler.html +++ b/src/Umbraco.Web.UI.Client/src/views/dashboard/settings/profiler.html @@ -1,26 +1,30 @@ -
- +
+ +
+ +
+ +

Performance profiling

-

- Umbraco currently runs in debug mode. This means you can use the built-in performance profiler to assess the performance when rendering pages. -

-

- If you want to activate the profiler for a specific page rendering, simply add umbDebug=true to the querystring when requesting the page. -

-

- If you want the profiler to be activated by default for all page renderings, you can use the toggle below. - It will set a cookie in your browser, which then activates the profiler automatically. - In other words, the profiler will only be active by default in your browser - not everyone else's. -

-

 

-
-
-
Activate the profiler by default
-
-
- +
+

+ Umbraco currently runs in debug mode. This means you can use the built-in performance profiler to assess the performance when rendering pages. +

+

+ If you want to activate the profiler for a specific page rendering, simply add umbDebug=true to the querystring when requesting the page. +

+

+ If you want the profiler to be activated by default for all page renderings, you can use the toggle below. + It will set a cookie in your browser, which then activates the profiler automatically. + In other words, the profiler will only be active by default in your browser - not everyone else's. +

+
+
+
+ +

Friendly reminder

From d7b25fc4dc1eb81ccc442cbe363897fcbdd516af Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Mon, 14 Oct 2019 17:06:36 +0200 Subject: [PATCH 40/50] =?UTF-8?q?Replace=20checkbox=20with=20umb-checkbox?= =?UTF-8?q?=20in=20listview=20publish=20and=20unpu=E2=80=A6=20(#6544)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/content/overlays/publish.html | 6 +-- .../content/overlays/publishdescendants.html | 4 +- .../src/views/content/overlays/save.html | 6 +-- .../src/views/content/overlays/schedule.html | 4 +- .../views/content/overlays/sendtopublish.html | 4 +- .../src/views/content/overlays/unpublish.html | 4 +- .../listview/listview.controller.js | 1 + .../listview/overlays/listviewpublish.html | 45 ++++++++++--------- .../overlays/listviewunpublish.controller.js | 1 - .../listview/overlays/listviewunpublish.html | 39 +++++++++------- 10 files changed, 62 insertions(+), 52 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.html b/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.html index a9afdffda6..d4a3bdd2a0 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.html +++ b/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.html @@ -1,6 +1,6 @@
-
+

{{vm.headline}}

@@ -48,14 +48,14 @@
-
+

- {{ variant.language.name }} + {{variant.language.name}} *
diff --git a/src/Umbraco.Web.UI.Client/src/views/content/overlays/publishdescendants.html b/src/Umbraco.Web.UI.Client/src/views/content/overlays/publishdescendants.html index 4dcaeb6572..5002007e20 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/overlays/publishdescendants.html +++ b/src/Umbraco.Web.UI.Client/src/views/content/overlays/publishdescendants.html @@ -49,8 +49,8 @@ server-validation-field="{{variant.htmlId}}"/>
-