From 7d3df87b7fd72429c5ebd44edb14896c82a973be Mon Sep 17 00:00:00 2001
From: BatJan <1932158+BatJan@users.noreply.github.com>
Date: Sat, 10 Oct 2020 23:04:46 +0200
Subject: [PATCH 01/17] Change if check to be more specific ensuring it works
in all picker instances
(cherry picked from commit 1c77ec156282875fbb332207a876056008e5b4f5)
---
.../src/views/common/overlays/itempicker/itempicker.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.html
index 405ca1d470..1e4cc70b7f 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.html
+++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.html
@@ -1,5 +1,5 @@
-
+
Date: Tue, 20 Oct 2020 12:26:40 +0100
Subject: [PATCH 02/17] Merge pull request #9215 from
umbraco/v8/bugfix/9129-keep-model-value-reference-after-empty
9129 keep model value reference after empty
---
.../blocklist/umbBlockListPropertyEditor.component.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/umbBlockListPropertyEditor.component.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/umbBlockListPropertyEditor.component.js
index 401ecc3a63..a162814f52 100644
--- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/umbBlockListPropertyEditor.component.js
+++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/umbBlockListPropertyEditor.component.js
@@ -138,10 +138,10 @@
// We need to ensure that the property model value is an object, this is needed for modelObject to recive a reference and keep that updated.
if (typeof newVal !== 'object' || newVal === null) {// testing if we have null or undefined value or if the value is set to another type than Object.
- newVal = {};
+ vm.model.value = newVal = {};
}
- modelObject.update(newVal, $scope);
+ modelObject.update(vm.model.value, $scope);
onLoaded();
}
From 657f1fcdc71181e7770a9aec6d51e846141fdb0d Mon Sep 17 00:00:00 2001
From: Shannon Deminick
Date: Thu, 22 Oct 2020 05:30:35 +1100
Subject: [PATCH 03/17] Fixes regression issue with property values being
updated in content repositories (#9146)
---
.../Implement/ContentRepositoryBase.cs | 71 +++++++++++++++++++
.../Implement/DocumentRepository.cs | 16 ++---
.../Repositories/Implement/MediaRepository.cs | 19 ++---
.../Implement/MemberRepository.cs | 36 ++--------
.../Services/ContentServiceTests.cs | 47 ++++++++++++
.../Services/MediaServiceTests.cs | 24 +++++++
.../Services/MemberServiceTests.cs | 9 ++-
src/Umbraco.Web/Search/ExamineComponent.cs | 10 ++-
8 files changed, 172 insertions(+), 60 deletions(-)
diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentRepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/ContentRepositoryBase.cs
index 13b687eb4e..2ea4914aaa 100644
--- a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentRepositoryBase.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/Implement/ContentRepositoryBase.cs
@@ -863,6 +863,77 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
}
+ ///
+ /// Inserts property values for the content entity
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ /// Used when creating a new entity
+ ///
+ protected void InsertPropertyValues(TEntity entity, int publishedVersionId, out bool edited, out HashSet editedCultures)
+ {
+ // persist the property data
+ var propertyDataDtos = PropertyFactory.BuildDtos(entity.ContentType.Variations, entity.VersionId, publishedVersionId, entity.Properties, LanguageRepository, out edited, out editedCultures);
+ foreach (var propertyDataDto in propertyDataDtos)
+ {
+ Database.Insert(propertyDataDto);
+ }
+ // TODO: we can speed this up: Use BulkInsert and then do one SELECT to re-retrieve the property data inserted with assigned IDs.
+ // This is a perfect thing to benchmark with Benchmark.NET to compare perf between Nuget releases.
+ }
+
+ ///
+ /// Used to atomically replace the property values for the entity version specified
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ protected void ReplacePropertyValues(TEntity entity, int versionId, int publishedVersionId, out bool edited, out HashSet editedCultures)
+ {
+ // Replace the property data.
+ // Lookup the data to update with a UPDLOCK (using ForUpdate()) this is because we need to be atomic
+ // and handle DB concurrency. Doing a clear and then re-insert is prone to concurrency issues.
+
+ var propDataSql = SqlContext.Sql().Select("*").From().Where(x => x.VersionId == versionId).ForUpdate();
+ var existingPropData = Database.Fetch(propDataSql);
+ var propertyTypeToPropertyData = new Dictionary<(int propertyTypeId, int versionId), PropertyDataDto>();
+ var existingPropDataIds = new List();
+ foreach (var p in existingPropData)
+ {
+ existingPropDataIds.Add(p.Id);
+ propertyTypeToPropertyData[(p.PropertyTypeId, p.VersionId)] = p;
+ }
+ var propertyDataDtos = PropertyFactory.BuildDtos(entity.ContentType.Variations, entity.VersionId, publishedVersionId, entity.Properties, LanguageRepository, out edited, out editedCultures);
+ foreach (var propertyDataDto in propertyDataDtos)
+ {
+ // Check if this already exists and update, else insert a new one
+ if (propertyTypeToPropertyData.TryGetValue((propertyDataDto.PropertyTypeId, propertyDataDto.VersionId), out var propData))
+ {
+ propertyDataDto.Id = propData.Id;
+ Database.Update(propertyDataDto);
+ }
+ else
+ {
+ // TODO: we can speed this up: Use BulkInsert and then do one SELECT to re-retrieve the property data inserted with assigned IDs.
+ // This is a perfect thing to benchmark with Benchmark.NET to compare perf between Nuget releases.
+ Database.Insert(propertyDataDto);
+ }
+
+ // track which ones have been processed
+ existingPropDataIds.Remove(propertyDataDto.Id);
+ }
+ // For any remaining that haven't been processed they need to be deleted
+ if (existingPropDataIds.Count > 0)
+ {
+ Database.Execute(SqlContext.Sql().Delete().WhereIn(x => x.Id, existingPropDataIds));
+ }
+ }
+
private class NodeIdKey
{
[Column("id")]
diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs
index a34aadd70f..2fdfc9afff 100644
--- a/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs
@@ -519,8 +519,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
protected override void PersistUpdatedItem(IContent entity)
{
- var entityBase = entity as EntityBase;
- var isEntityDirty = entityBase != null && entityBase.IsDirty();
+ var isEntityDirty = entity.IsDirty();
// check if we need to make any database changes at all
if ((entity.PublishedState == PublishedState.Published || entity.PublishedState == PublishedState.Unpublished)
@@ -597,17 +596,10 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
Database.Insert(documentVersionDto);
}
- // replace the property data (rather than updating)
+ // replace the property data
// only need to delete for the version that existed, the new version (if any) has no property data yet
- var versionToDelete = publishing ? entity.PublishedVersionId : entity.VersionId;
- var deletePropertyDataSql = Sql().Delete().Where(x => x.VersionId == versionToDelete);
- Database.Execute(deletePropertyDataSql);
-
- // insert property data
- var propertyDataDtos = PropertyFactory.BuildDtos(entity.ContentType.Variations, entity.VersionId, publishing ? entity.PublishedVersionId : 0,
- entity.Properties, LanguageRepository, out var edited, out var editedCultures);
- foreach (var propertyDataDto in propertyDataDtos)
- Database.Insert(propertyDataDto);
+ var versionToDelete = publishing ? entity.PublishedVersionId : entity.VersionId;
+ ReplacePropertyValues(entity, versionToDelete, publishing ? entity.PublishedVersionId : 0, out var edited, out var editedCultures);
// if !publishing, we may have a new name != current publish name,
// also impacts 'edited'
diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MediaRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/MediaRepository.cs
index 081efcfdf6..63cee80a8b 100644
--- a/src/Umbraco.Core/Persistence/Repositories/Implement/MediaRepository.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/Implement/MediaRepository.cs
@@ -219,7 +219,6 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
protected override void PersistNewItem(IMedia entity)
{
- var media = (Models.Media) entity;
entity.AddingEntity();
// ensure unique name on the same level
@@ -274,17 +273,15 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
contentVersionDto.NodeId = nodeDto.NodeId;
contentVersionDto.Current = true;
Database.Insert(contentVersionDto);
- media.VersionId = contentVersionDto.Id;
+ entity.VersionId = contentVersionDto.Id;
// persist the media version dto
var mediaVersionDto = dto.MediaVersionDto;
- mediaVersionDto.Id = media.VersionId;
+ mediaVersionDto.Id = entity.VersionId;
Database.Insert(mediaVersionDto);
// persist the property data
- var propertyDataDtos = PropertyFactory.BuildDtos(media.ContentType.Variations, media.VersionId, 0, entity.Properties, LanguageRepository, out _, out _);
- foreach (var propertyDataDto in propertyDataDtos)
- Database.Insert(propertyDataDto);
+ InsertPropertyValues(entity, 0, out _, out _);
// set tags
SetEntityTags(entity, _tagRepository);
@@ -298,10 +295,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
protected override void PersistUpdatedItem(IMedia entity)
{
- var media = (Models.Media) entity;
-
// update
- media.UpdatingEntity();
+ entity.UpdatingEntity();
// ensure unique name on the same level
entity.Name = EnsureUniqueNodeName(entity.ParentId, entity.Name, entity.Id);
@@ -339,11 +334,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
Database.Update(mediaVersionDto);
// replace the property data
- var deletePropertyDataSql = SqlContext.Sql().Delete().Where(x => x.VersionId == media.VersionId);
- Database.Execute(deletePropertyDataSql);
- var propertyDataDtos = PropertyFactory.BuildDtos(media.ContentType.Variations, media.VersionId, 0, entity.Properties, LanguageRepository, out _, out _);
- foreach (var propertyDataDto in propertyDataDtos)
- Database.Insert(propertyDataDto);
+ ReplacePropertyValues(entity, entity.VersionId, 0, out _, out _);
SetEntityTags(entity, _tagRepository);
diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/MemberRepository.cs
index 687e35aef3..78dbbe317a 100644
--- a/src/Umbraco.Core/Persistence/Repositories/Implement/MemberRepository.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/Implement/MemberRepository.cs
@@ -245,8 +245,6 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
}
entity.AddingEntity();
- var member = (Member) entity;
-
// ensure that strings don't contain characters that are invalid in xml
// TODO: do we really want to keep doing this here?
entity.SanitizeEntityPropertiesForXmlStorage();
@@ -304,7 +302,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
contentVersionDto.NodeId = nodeDto.NodeId;
contentVersionDto.Current = true;
Database.Insert(contentVersionDto);
- member.VersionId = contentVersionDto.Id;
+ entity.VersionId = contentVersionDto.Id;
// persist the member dto
dto.NodeId = nodeDto.NodeId;
@@ -321,9 +319,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
Database.Insert(dto);
// persist the property data
- var propertyDataDtos = PropertyFactory.BuildDtos(member.ContentType.Variations, member.VersionId, 0, entity.Properties, LanguageRepository, out _, out _);
- foreach (var propertyDataDto in propertyDataDtos)
- Database.Insert(propertyDataDto);
+ InsertPropertyValues(entity, 0, out _, out _);
SetEntityTags(entity, _tagRepository);
@@ -335,11 +331,9 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
}
protected override void PersistUpdatedItem(IMember entity)
- {
- var member = (Member) entity;
-
+ {
// update
- member.UpdatingEntity();
+ entity.UpdatingEntity();
// ensure that strings don't contain characters that are invalid in xml
// TODO: do we really want to keep doing this here?
@@ -385,27 +379,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
if (changedCols.Count > 0)
Database.Update(dto, changedCols);
- // Replace the property data
- // Lookup the data to update with a UPDLOCK (using ForUpdate()) this is because we have another method that doesn't take an explicit WriteLock
- // in SetLastLogin which is called very often and we want to avoid the lock timeout for the explicit lock table but we still need to ensure atomic
- // operations between that method and this one.
-
- var propDataSql = SqlContext.Sql().Select("*").From().Where(x => x.VersionId == member.VersionId).ForUpdate();
- var existingPropData = Database.Fetch(propDataSql).ToDictionary(x => x.PropertyTypeId);
- var propertyDataDtos = PropertyFactory.BuildDtos(member.ContentType.Variations, member.VersionId, 0, entity.Properties, LanguageRepository, out _, out _);
- foreach (var propertyDataDto in propertyDataDtos)
- {
- // Check if this already exists and update, else insert a new one
- if (existingPropData.TryGetValue(propertyDataDto.PropertyTypeId, out var propData))
- {
- propertyDataDto.Id = propData.Id;
- Database.Update(propertyDataDto);
- }
- else
- {
- Database.Insert(propertyDataDto);
- }
- }
+ ReplacePropertyValues(entity, entity.VersionId, 0, out _, out _);
SetEntityTags(entity, _tagRepository);
diff --git a/src/Umbraco.Tests/Services/ContentServiceTests.cs b/src/Umbraco.Tests/Services/ContentServiceTests.cs
index 92d2a68472..c0d9b47c37 100644
--- a/src/Umbraco.Tests/Services/ContentServiceTests.cs
+++ b/src/Umbraco.Tests/Services/ContentServiceTests.cs
@@ -1537,6 +1537,53 @@ namespace Umbraco.Tests.Services
Assert.That(content.HasIdentity, Is.True);
}
+ [Test]
+ public void Can_Update_Content_Property_Values()
+ {
+ IContentType contentType = MockedContentTypes.CreateSimpleContentType();
+ ServiceContext.ContentTypeService.Save(contentType);
+ IContent content = MockedContent.CreateSimpleContent(contentType, "hello");
+ content.SetValue("title", "title of mine");
+ content.SetValue("bodyText", "hello world");
+ ServiceContext.ContentService.SaveAndPublish(content);
+
+ // re-get
+ content = ServiceContext.ContentService.GetById(content.Id);
+ content.SetValue("title", "another title of mine"); // Change a value
+ content.SetValue("bodyText", null); // Clear a value
+ content.SetValue("author", "new author"); // Add a value
+ ServiceContext.ContentService.SaveAndPublish(content);
+
+ // re-get
+ content = ServiceContext.ContentService.GetById(content.Id);
+ Assert.AreEqual("another title of mine", content.GetValue("title"));
+ Assert.IsNull(content.GetValue("bodyText"));
+ Assert.AreEqual("new author", content.GetValue("author"));
+
+ content.SetValue("title", "new title");
+ content.SetValue("bodyText", "new body text");
+ content.SetValue("author", "new author text");
+ ServiceContext.ContentService.Save(content); // new non-published version
+
+ // re-get
+ content = ServiceContext.ContentService.GetById(content.Id);
+ content.SetValue("title", null); // Clear a value
+ content.SetValue("bodyText", null); // Clear a value
+ ServiceContext.ContentService.Save(content); // saving non-published version
+
+ // re-get
+ content = ServiceContext.ContentService.GetById(content.Id);
+ Assert.IsNull(content.GetValue("title")); // Test clearing the value worked with the non-published version
+ Assert.IsNull(content.GetValue("bodyText"));
+ Assert.AreEqual("new author text", content.GetValue("author"));
+
+ // make sure that the published version remained the same
+ var publishedContent = ServiceContext.ContentService.GetVersion(content.PublishedVersionId);
+ Assert.AreEqual("another title of mine", publishedContent.GetValue("title"));
+ Assert.IsNull(publishedContent.GetValue("bodyText"));
+ Assert.AreEqual("new author", publishedContent.GetValue("author"));
+ }
+
[Test]
public void Can_Bulk_Save_Content()
{
diff --git a/src/Umbraco.Tests/Services/MediaServiceTests.cs b/src/Umbraco.Tests/Services/MediaServiceTests.cs
index b3dc274c5e..52f26ecb4d 100644
--- a/src/Umbraco.Tests/Services/MediaServiceTests.cs
+++ b/src/Umbraco.Tests/Services/MediaServiceTests.cs
@@ -26,6 +26,30 @@ namespace Umbraco.Tests.Services
[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest, PublishedRepositoryEvents = true)]
public class MediaServiceTests : TestWithSomeContentBase
{
+ [Test]
+ public void Can_Update_Media_Property_Values()
+ {
+ IMediaType mediaType = MockedContentTypes.CreateSimpleMediaType("test", "Test");
+ ServiceContext.MediaTypeService.Save(mediaType);
+ IMedia media = MockedMedia.CreateSimpleMedia(mediaType, "hello", -1);
+ media.SetValue("title", "title of mine");
+ media.SetValue("bodyText", "hello world");
+ ServiceContext.MediaService.Save(media);
+
+ // re-get
+ media = ServiceContext.MediaService.GetById(media.Id);
+ media.SetValue("title", "another title of mine"); // Change a value
+ media.SetValue("bodyText", null); // Clear a value
+ media.SetValue("author", "new author"); // Add a value
+ ServiceContext.MediaService.Save(media);
+
+ // re-get
+ media = ServiceContext.MediaService.GetById(media.Id);
+ Assert.AreEqual("another title of mine", media.GetValue("title"));
+ Assert.IsNull(media.GetValue("bodyText"));
+ Assert.AreEqual("new author", media.GetValue("author"));
+ }
+
///
/// Used to list out all ambiguous events that will require dispatching with a name
///
diff --git a/src/Umbraco.Tests/Services/MemberServiceTests.cs b/src/Umbraco.Tests/Services/MemberServiceTests.cs
index ce84c2701b..00bfe59fa3 100644
--- a/src/Umbraco.Tests/Services/MemberServiceTests.cs
+++ b/src/Umbraco.Tests/Services/MemberServiceTests.cs
@@ -49,22 +49,27 @@ namespace Umbraco.Tests.Services
}
[Test]
- public void Can_Update_Member_Property_Value()
+ public void Can_Update_Member_Property_Values()
{
IMemberType memberType = MockedContentTypes.CreateSimpleMemberType();
ServiceContext.MemberTypeService.Save(memberType);
IMember member = MockedMember.CreateSimpleMember(memberType, "hello", "helloworld@test123.com", "hello", "hello");
member.SetValue("title", "title of mine");
+ member.SetValue("bodyText", "hello world");
ServiceContext.MemberService.Save(member);
// re-get
member = ServiceContext.MemberService.GetById(member.Id);
- member.SetValue("title", "another title of mine");
+ member.SetValue("title", "another title of mine"); // Change a value
+ member.SetValue("bodyText", null); // Clear a value
+ member.SetValue("author", "new author"); // Add a value
ServiceContext.MemberService.Save(member);
// re-get
member = ServiceContext.MemberService.GetById(member.Id);
Assert.AreEqual("another title of mine", member.GetValue("title"));
+ Assert.IsNull(member.GetValue("bodyText"));
+ Assert.AreEqual("new author", member.GetValue("author"));
}
[Test]
diff --git a/src/Umbraco.Web/Search/ExamineComponent.cs b/src/Umbraco.Web/Search/ExamineComponent.cs
index ca16aaee65..c9d7b7cf56 100644
--- a/src/Umbraco.Web/Search/ExamineComponent.cs
+++ b/src/Umbraco.Web/Search/ExamineComponent.cs
@@ -269,6 +269,14 @@ namespace Umbraco.Web.Search
DeleteIndexForEntity(c4.Id, false);
}
break;
+ case MessageType.RefreshByPayload:
+ var payload = (MemberCacheRefresher.JsonPayload[])args.MessageObject;
+ var members = payload.Select(x => _services.MemberService.GetById(x.Id));
+ foreach(var m in members)
+ {
+ ReIndexForMember(m);
+ }
+ break;
case MessageType.RefreshAll:
case MessageType.RefreshByJson:
default:
@@ -746,6 +754,6 @@ namespace Umbraco.Web.Search
}
#endregion
-
+
}
}
From f1724a68b2147859addb5dd905d641d59dff950a Mon Sep 17 00:00:00 2001
From: Warren Buckley
Date: Mon, 19 Oct 2020 14:26:15 +0100
Subject: [PATCH 04/17] When exporting package.xml it will now use the UDI/Key
so we can reimport with the same key
(cherry picked from commit 28954afcadbd6c00b81b1cf7486a08190789f114)
---
src/Umbraco.Core/Packaging/PackageDataInstallation.cs | 2 ++
src/Umbraco.Core/Services/Implement/EntityXmlSerializer.cs | 4 +++-
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/Umbraco.Core/Packaging/PackageDataInstallation.cs b/src/Umbraco.Core/Packaging/PackageDataInstallation.cs
index 6a5acb0dc7..d669600c44 100644
--- a/src/Umbraco.Core/Packaging/PackageDataInstallation.cs
+++ b/src/Umbraco.Core/Packaging/PackageDataInstallation.cs
@@ -604,6 +604,7 @@ namespace Umbraco.Core.Packaging
var defaultTemplateElement = infoElement.Element("DefaultTemplate");
contentType.Name = infoElement.Element("Name").Value;
+ contentType.Key = new Guid(infoElement.Element("Key").Value);
contentType.Icon = infoElement.Element("Icon").Value;
contentType.Thumbnail = infoElement.Element("Thumbnail").Value;
contentType.Description = infoElement.Element("Description").Value;
@@ -783,6 +784,7 @@ namespace Umbraco.Core.Packaging
var propertyType = new PropertyType(dataTypeDefinition, property.Element("Alias").Value)
{
Name = property.Element("Name").Value,
+ Key = new Guid(property.Element("Key").Value),
Description = (string)property.Element("Description"),
Mandatory = property.Element("Mandatory") != null
? property.Element("Mandatory").Value.ToLowerInvariant().Equals("true")
diff --git a/src/Umbraco.Core/Services/Implement/EntityXmlSerializer.cs b/src/Umbraco.Core/Services/Implement/EntityXmlSerializer.cs
index 5189b3422e..ea31226324 100644
--- a/src/Umbraco.Core/Services/Implement/EntityXmlSerializer.cs
+++ b/src/Umbraco.Core/Services/Implement/EntityXmlSerializer.cs
@@ -434,6 +434,7 @@ namespace Umbraco.Core.Services.Implement
var info = new XElement("Info",
new XElement("Name", contentType.Name),
new XElement("Alias", contentType.Alias),
+ new XElement("Key", contentType.Key),
new XElement("Icon", contentType.Icon),
new XElement("Thumbnail", contentType.Thumbnail),
new XElement("Description", contentType.Description),
@@ -484,8 +485,9 @@ namespace Umbraco.Core.Services.Implement
var genericProperty = new XElement("GenericProperty",
new XElement("Name", propertyType.Name),
new XElement("Alias", propertyType.Alias),
+ new XElement("Key", propertyType.Key),
new XElement("Type", propertyType.PropertyEditorAlias),
- new XElement("Definition", definition.Key),
+ new XElement("Definition", definition.Key),
new XElement("Tab", propertyGroup == null ? "" : propertyGroup.Name),
new XElement("SortOrder", propertyType.SortOrder),
new XElement("Mandatory", propertyType.Mandatory.ToString()),
From f3aad864133546793b3887eb7e917d41440e2b5e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20Lyngs=C3=B8?=
Date: Thu, 22 Oct 2020 09:08:00 +0200
Subject: [PATCH 05/17] updates CSS selector to match latest
(cherry picked from commit dc6c72c136831f6025e911a06baaf1fc0a394783)
---
.../src/less/components/umb-nested-content.less | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less
index 6ea5309d03..29a73bd524 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less
@@ -19,7 +19,7 @@
yeah so this is a pain, but we must be super specific in targeting the mandatory property labels,
otherwise all properties within a reqired, nested, nested content property will all appear mandatory
*/
- > ng-form > .control-group > .umb-el-wrap > .control-header label:after {
+ .umb-property > ng-form > .control-group > .umb-el-wrap > .control-header label:after {
content: '*';
color: @red;
}
From c903a01f15c317625b1af435af8b1d0d932d3cbe Mon Sep 17 00:00:00 2001
From: Sebastiaan Janssen
Date: Thu, 22 Oct 2020 09:53:02 +0200
Subject: [PATCH 06/17] Revert "Revert "umb-confirmation directive: move
trashcan into directive and address accessibility issues (#8198)""
This reverts commit 22a1423324fe1cdb2795e1dd8eb2a66faa97de8b.
---
.../components/umbconfirmaction.directive.js | 32 ++++++++------
.../less/components/umb-confirm-action.less | 5 +++
.../components/tags/umb-tags-editor.html | 5 +--
.../views/components/umb-confirm-action.html | 31 +++++++++-----
.../views/components/umb-groups-builder.html | 10 ++---
.../src/views/propertyeditors/grid/grid.html | 8 ++--
.../listview/layouts.prevalues.html | 42 +++++++++----------
.../multipletextbox/multipletextbox.html | 9 ++--
8 files changed, 78 insertions(+), 64 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbconfirmaction.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbconfirmaction.directive.js
index 1dcccda481..2f682205ad 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbconfirmaction.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbconfirmaction.directive.js
@@ -14,10 +14,10 @@ The prompt can be opened in four direction up, down, left or right.
-
@@ -71,17 +71,23 @@ The prompt can be opened in four direction up, down, left or right.
function link(scope, el, attr, ctrl) {
- scope.clickConfirm = function() {
- if(scope.onConfirm) {
- scope.onConfirm();
- }
- };
+ scope.clickButton = function (event) {
+ if(scope.onDelete) {
+ scope.onDelete({$event: event});
+ }
+ }
- scope.clickCancel = function() {
- if(scope.onCancel) {
- scope.onCancel();
- }
- };
+ scope.clickConfirm = function() {
+ if(scope.onConfirm) {
+ scope.onConfirm();
+ }
+ };
+
+ scope.clickCancel = function() {
+ if(scope.onCancel) {
+ scope.onCancel();
+ }
+ };
}
@@ -91,6 +97,8 @@ The prompt can be opened in four direction up, down, left or right.
templateUrl: 'views/components/umb-confirm-action.html',
scope: {
direction: "@",
+ show: "<",
+ onDelete: "&?",
onConfirm: "&",
onCancel: "&"
},
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-confirm-action.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-confirm-action.less
index 112194f012..a6548123ac 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/umb-confirm-action.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-confirm-action.less
@@ -1,3 +1,8 @@
+//WRAPPER
+.umb_confirm-action {
+ display: inline-block;
+}
+
// OVERLAY
.umb_confirm-action__overlay {
position: absolute;
diff --git a/src/Umbraco.Web.UI.Client/src/views/components/tags/umb-tags-editor.html b/src/Umbraco.Web.UI.Client/src/views/components/tags/umb-tags-editor.html
index 6251d0eed1..cce613782e 100644
--- a/src/Umbraco.Web.UI.Client/src/views/components/tags/umb-tags-editor.html
+++ b/src/Umbraco.Web.UI.Client/src/views/components/tags/umb-tags-editor.html
@@ -12,10 +12,9 @@
-
-
-
diff --git a/src/Umbraco.Web.UI.Client/src/views/components/umb-confirm-action.html b/src/Umbraco.Web.UI.Client/src/views/components/umb-confirm-action.html
index 1b88c9f988..39864c26fd 100644
--- a/src/Umbraco.Web.UI.Client/src/views/components/umb-confirm-action.html
+++ b/src/Umbraco.Web.UI.Client/src/views/components/umb-confirm-action.html
@@ -1,22 +1,31 @@
-