From f860b4b0befd189266e0df7b30cdd6434093f812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 26 Aug 2020 16:30:15 +0200 Subject: [PATCH 1/5] ability to registrer paste resolvers --- .../src/common/services/clipboard.service.js | 52 ++++++++++++++++--- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/clipboard.service.js b/src/Umbraco.Web.UI.Client/src/common/services/clipboard.service.js index 0d2ca6623b..2ad4bec1ea 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/clipboard.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/clipboard.service.js @@ -14,6 +14,7 @@ function clipboardService(notificationsService, eventsService, localStorageServi var clearPropertyResolvers = []; + var pastePropertyResolvers = []; var STORAGE_KEY = "umbClipboardService"; @@ -95,8 +96,46 @@ function clipboardService(notificationsService, eventsService, localStorageServi } + + + function resolvePropertyForPaste(prop) { + for (var i=0; i Date: Wed, 26 Aug 2020 16:30:35 +0200 Subject: [PATCH 2/5] replace UDIs of Block Editors with new ones on paste --- .../common/services/blockeditor.service.js | 96 +++++++++++++++++-- 1 file changed, 88 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/blockeditor.service.js b/src/Umbraco.Web.UI.Client/src/common/services/blockeditor.service.js index ffb1971169..0a4e3b1af4 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/blockeditor.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/blockeditor.service.js @@ -4,39 +4,119 @@ * * @description * Added in Umbraco 8.7. Service for dealing with Block Editors. - * + * * Block Editor Service provides the basic features for a block editor. * The main feature is the ability to create a Model Object which takes care of your data for your Block Editor. - * - * + * + * * ##Samples * * ####Instantiate a Model Object for your property editor: - * + * *
  *     modelObject = blockEditorService.createModelObject(vm.model.value, vm.model.editor, vm.model.config.blocks, $scope);
  *     modelObject.load().then(onLoaded);
  * 
* - * + * * See {@link umbraco.services.blockEditorModelObject BlockEditorModelObject} for more samples. - * + * */ (function () { 'use strict'; + + /** + * When performing a runtime copy of Block Editors entries, we copy the ElementType Data Model and inner IDs are kept identical, to ensure new IDs are changed on paste we need to provide a resolver for the ClipboardService. + */ + angular.module('umbraco').run(['clipboardService', 'udiService', function (clipboardService, udiService) { + + function replaceUdi(obj, key, dataObject) { + var udi = obj[key]; + var newUdi = udiService.create("element"); + obj[key] = newUdi; + dataObject.forEach((data) => { + if (data.udi === udi) { + data.udi = newUdi; + } + }); + } + function replaceUdisOfObject(obj, propValue) { + for (var k in obj) { + if(k === "contentUdi") { + replaceUdi(obj, k, propValue.contentData); + } else if(k === "settingsUdi") { + replaceUdi(obj, k, propValue.settingsData); + } else { + var propType = typeof obj[k]; + if(propType === "object" || propType === "array") { + replaceUdisOfObject(obj[k], propValue) + } + } + } + } + + function replaceBlockListUDIsResolver(obj, propClearingMethod) { + + if (typeof obj === "object") { + + // 'obj' can both be a property object or the raw value of a inner property. + var value = obj; + + // if we got a property object from a ContentTypeModel we need to look at the value. We check for value and editor to, sort of, ensure this is the case. + if(obj.value !== undefined && obj.editor !== undefined) { + value = obj.value; + // If value isnt a object, lets break out. + if(typeof obj.value !== "object") { + return; + } + } + + // we got an object, and it has these three props then we are most likely dealing with a Block Editor. + if ((value.layout !== undefined && value.contentData !== undefined && value.settingsData !== undefined)) { + + replaceUdisOfObject(value.layout, value); + + // replace UDIs for inner properties of this Block Editors content data. + if(value.contentData.length > 0) { + value.contentData.forEach((item) => { + for (var k in item) { + propClearingMethod(item[k]); + } + }); + } + // replace UDIs for inner properties of this Block Editors settings data. + if(value.settingsData.length > 0) { + value.settingsData.forEach((item) => { + for (var k in item) { + propClearingMethod(item[k]); + } + }); + } + + } + } + } + + clipboardService.registerPastePropertyResolver(replaceBlockListUDIsResolver) + + }]); + + + + function blockEditorService(blockEditorModelObject) { /** * @ngdocs function * @name createModelObject * @methodOf umbraco.services.blockEditorService - * + * * @description * Create a new Block Editor Model Object. * See {@link umbraco.services.blockEditorModelObject blockEditorModelObject} - * + * * @see umbraco.services.blockEditorModelObject * @param {object} propertyModelValue data object of the property editor, usually model.value. * @param {string} propertyEditorAlias alias of the property. From fa07cf0ac9b810b68eed1fa76cd77e90d19abc8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 26 Aug 2020 16:30:48 +0200 Subject: [PATCH 3/5] use ClipboardService on Paste --- .../src/common/services/blockeditormodelobject.service.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/blockeditormodelobject.service.js b/src/Umbraco.Web.UI.Client/src/common/services/blockeditormodelobject.service.js index 86b5bdd0d0..6dc0fdd06f 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/blockeditormodelobject.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/blockeditormodelobject.service.js @@ -13,8 +13,7 @@ (function () { 'use strict'; - - function blockEditorModelObjectFactory($interpolate, $q, udiService, contentResource, localizationService, umbRequestHelper) { + function blockEditorModelObjectFactory($interpolate, $q, udiService, contentResource, localizationService, umbRequestHelper, clipboardService) { /** * Simple mapping from property model content entry to editing model, @@ -748,7 +747,9 @@ */ createFromElementType: function (elementTypeDataModel) { - elementTypeDataModel = Utilities.copy(elementTypeDataModel); + + elementTypeDataModel = clipboardService.parseContentForPaste(elementTypeDataModel); + var contentElementTypeKey = elementTypeDataModel.contentTypeKey; From 096f2b73d20844f821fe2c5f3e2cbe9f35b6cbd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 26 Aug 2020 16:33:03 +0200 Subject: [PATCH 4/5] remove space --- .../src/common/services/blockeditormodelobject.service.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/blockeditormodelobject.service.js b/src/Umbraco.Web.UI.Client/src/common/services/blockeditormodelobject.service.js index 6dc0fdd06f..df4c1b581e 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/blockeditormodelobject.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/blockeditormodelobject.service.js @@ -747,10 +747,8 @@ */ createFromElementType: function (elementTypeDataModel) { - elementTypeDataModel = clipboardService.parseContentForPaste(elementTypeDataModel); - var contentElementTypeKey = elementTypeDataModel.contentTypeKey; var layoutEntry = this.create(contentElementTypeKey); From 24ec954a7dca471f6e6fc130b653f528034dc920 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 26 Aug 2020 16:33:42 +0200 Subject: [PATCH 5/5] update Nested Content to run paste resolvers and update deprecated method name --- .../nestedcontent/nestedcontent.controller.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js index ee406caa8a..75d75298db 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js @@ -28,7 +28,7 @@ } } - clipboardService.registrerClearPropertyResolver(clearNestedContentPropertiesForStorage) + clipboardService.registerClearPropertyResolver(clearNestedContentPropertiesForStorage) function clearInnerNestedContentPropertiesForStorage(prop, propClearingMethod) { @@ -50,7 +50,7 @@ } } - clipboardService.registrerClearPropertyResolver(clearInnerNestedContentPropertiesForStorage) + clipboardService.registerClearPropertyResolver(clearInnerNestedContentPropertiesForStorage) }]); angular @@ -474,6 +474,8 @@ return; } + newNode = clipboardService.parseContentForPaste(newNode); + // generate a new key. newNode.key = String.CreateGuid();