From 6de4bbbae66738ef9466137d7760f3420d27e203 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Wed, 11 Sep 2019 09:03:10 +0100 Subject: [PATCH 01/17] Adds new config option to RTE & Grid Property Editors - for now uses MediaPicker until we have a FolderPicker Angular PreValue view/editor --- src/Umbraco.Web/PropertyEditors/GridConfiguration.cs | 5 +++++ src/Umbraco.Web/PropertyEditors/RichTextConfiguration.cs | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/Umbraco.Web/PropertyEditors/GridConfiguration.cs b/src/Umbraco.Web/PropertyEditors/GridConfiguration.cs index b7a76ac960..5de7f4d554 100644 --- a/src/Umbraco.Web/PropertyEditors/GridConfiguration.cs +++ b/src/Umbraco.Web/PropertyEditors/GridConfiguration.cs @@ -1,4 +1,5 @@ using Newtonsoft.Json.Linq; +using Umbraco.Core; using Umbraco.Core.PropertyEditors; namespace Umbraco.Web.PropertyEditors @@ -20,5 +21,9 @@ namespace Umbraco.Web.PropertyEditors "Ignore User Start Nodes", "boolean", Description = "Selecting this option allows a user to choose nodes that they normally don't have access to.")] public bool IgnoreUserStartNodes { get; set; } + + [ConfigurationField("mediaParentId", "Store Pasted Images Folder", "MediaPicker", + Description = "Choose where images dragged or pasted into the editor get uploaded to")] + public GuidUdi MediaParentId { get; set; } } } diff --git a/src/Umbraco.Web/PropertyEditors/RichTextConfiguration.cs b/src/Umbraco.Web/PropertyEditors/RichTextConfiguration.cs index bd153c8e2f..b346e68be3 100644 --- a/src/Umbraco.Web/PropertyEditors/RichTextConfiguration.cs +++ b/src/Umbraco.Web/PropertyEditors/RichTextConfiguration.cs @@ -1,4 +1,5 @@ using Newtonsoft.Json.Linq; +using Umbraco.Core; using Umbraco.Core.PropertyEditors; namespace Umbraco.Web.PropertyEditors @@ -19,5 +20,9 @@ namespace Umbraco.Web.PropertyEditors "Ignore User Start Nodes", "boolean", Description = "Selecting this option allows a user to choose nodes that they normally don't have access to.")] public bool IgnoreUserStartNodes { get; set; } + + [ConfigurationField("mediaParentId", "Store Pasted Images Folder", "MediaPicker", + Description = "Choose where images dragged or pasted into the editor get uploaded to")] + public GuidUdi MediaParentId { get; set; } } } From fdeaaad738e61098ac910b47ed23bc5ea0e93c92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 11 Sep 2019 10:12:01 +0200 Subject: [PATCH 02/17] allow mediapicker to only pick folders --- .../components/umbmediagrid.directive.js | 22 ++++++++++++++++++- .../src/less/components/umb-media-grid.less | 20 +++++++++++++---- .../mediapicker/mediapicker.controller.js | 18 +++++++++------ .../mediapicker/mediapicker.html | 2 ++ .../src/views/components/umb-media-grid.html | 2 +- 5 files changed, 51 insertions(+), 13 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbmediagrid.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbmediagrid.directive.js index 6a11b07734..ec4469e56f 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbmediagrid.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbmediagrid.directive.js @@ -118,7 +118,9 @@ Use this directive to generate a thumbnail grid of media items. var item = scope.items[i]; setItemData(item); setOriginalSize(item, itemMaxHeight); - + + item.selectable = getSelectableState(item); + // remove non images when onlyImages is set to true if(scope.onlyImages === "true" && !item.isFolder && !item.thumbnail){ scope.items.splice(i, 1); @@ -188,6 +190,22 @@ Use this directive to generate a thumbnail grid of media items. } } } + + /** + * Returns wether a item should be selectable or not. + */ + function getSelectableState(item) { + + // check if item is a folder or image + if (item.isFolder) { + return !scope.disableFolderSelect && !scope.onlyImages; + } else { + return !scope.onlyFolders; + } + + return false; + + } function setOriginalSize(item, maxHeight) { @@ -331,7 +349,9 @@ Use this directive to generate a thumbnail grid of media items. itemMaxHeight: "@", itemMinWidth: "@", itemMinHeight: "@", + disableFolderSelect: "@", onlyImages: "@", + onlyFolders: "@", includeSubFolders: "@", currentFolderId: "@" }, diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less index 8c8e4b101c..840377647c 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less @@ -21,12 +21,19 @@ margin: 10px; position: relative; - user-select: none; - cursor: pointer; + user-select: none; box-shadow: 0 1px 1px 0 rgba(0,0,0,.2); transition: box-shadow 150ms ease-in-out; } +.umb-media-grid__item.-unselectable { + +} + +.umb-media-grid__item.-selectable { + cursor: pointer; +} + .umb-media-grid__item.-file { background-color: @white; } @@ -37,7 +44,8 @@ color: @ui-selected-type; } } -.umb-media-grid__item.-selected, .umb-media-grid__item:hover { +.umb-media-grid__item.-selected, +.umb-media-grid__item.-selectable:hover { &::before { content: ""; position: absolute; @@ -52,7 +60,7 @@ pointer-events: none; } } -.umb-media-grid__item:hover { +.umb-media-grid__item.-selectable:hover { &::before { opacity: .33; } @@ -159,6 +167,10 @@ } } +.umb-media-grid__item-name { + cursor: pointer; +} + .umb-media-grid__item-name { white-space: nowrap; overflow: hidden; 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 47182bfbee..faabb73708 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 @@ -2,7 +2,7 @@ angular.module("umbraco") .controller("Umbraco.Editors.MediaPickerController", function ($scope, mediaResource, entityResource, userService, mediaHelper, mediaTypeHelper, eventsService, treeService, localStorageService, localizationService, editorService) { - + if (!$scope.model.title) { localizationService.localizeMany(["defaultdialogs_selectMedia", "general_includeFromsubFolders"]) .then(function (data) { @@ -14,9 +14,10 @@ angular.module("umbraco") } var dialogOptions = $scope.model; - + $scope.disableFolderSelect = dialogOptions.disableFolderSelect; $scope.onlyImages = dialogOptions.onlyImages; + $scope.onlyFolders = dialogOptions.onlyFolders; $scope.showDetails = dialogOptions.showDetails; $scope.multiPicker = (dialogOptions.multiPicker && dialogOptions.multiPicker !== "0") ? true : false; $scope.startNodeId = dialogOptions.startNodeId ? dialogOptions.startNodeId : -1; @@ -188,26 +189,25 @@ angular.module("umbraco") }; $scope.clickHandler = function (image, event, index) { + if (image.isFolder) { if ($scope.disableFolderSelect) { $scope.gotoFolder(image); } else { - eventsService.emit("dialogs.mediaPicker.select", image); selectImage(image); } } else { - eventsService.emit("dialogs.mediaPicker.select", image); if ($scope.showDetails) { - + $scope.target = image; - + // handle both entity and full media object if (image.image) { $scope.target.url = image.image; } else { $scope.target.url = mediaHelper.resolveFile(image); } - + $scope.openDetailsDialog(); } else { selectImage(image); @@ -222,6 +222,9 @@ angular.module("umbraco") }; function selectImage(image) { + if(!image.selectable) { + return; + } if (image.selected) { for (var i = 0; $scope.model.selection.length > i; i++) { var imageInSelection = $scope.model.selection[i]; @@ -234,6 +237,7 @@ angular.module("umbraco") if (!$scope.multiPicker) { deselectAllImages($scope.model.selection); } + eventsService.emit("dialogs.mediaPicker.select", image); image.selected = true; $scope.model.selection.push(image); } diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.html index 6eee269cee..b57fa96d44 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.html @@ -98,7 +98,9 @@ item-max-height="150" item-min-width="100" item-min-height="100" + disable-folder-select={{disableFolderSelect}} only-images={{onlyImages}} + only-folder={{onlyFolders}} include-sub-folders={{showChilds}} current-Folder-id="{{currentFolder.id}}"> diff --git a/src/Umbraco.Web.UI.Client/src/views/components/umb-media-grid.html b/src/Umbraco.Web.UI.Client/src/views/components/umb-media-grid.html index 4cc4c105fc..60f407f06b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/umb-media-grid.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/umb-media-grid.html @@ -1,5 +1,5 @@
-
+
From 28a0e0aa6f2a334116e8b657c30e00c46d2a46a3 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Wed, 11 Sep 2019 10:02:59 +0100 Subject: [PATCH 03/17] Pass through a GUID that a media picker / new folder picker will use --- .../PropertyEditors/GridPropertyEditor.cs | 13 +++++++++++-- .../PropertyEditors/RichTextPropertyEditor.cs | 12 ++++++++++-- src/Umbraco.Web/Templates/TemplateUtilities.cs | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs index 98c65175af..24ab2edbb3 100644 --- a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs @@ -8,6 +8,7 @@ using Umbraco.Core.Models.Editors; using Umbraco.Web.Templates; using Umbraco.Web.Composing; using Umbraco.Core.Services; +using System; namespace Umbraco.Web.PropertyEditors { @@ -69,6 +70,15 @@ namespace Umbraco.Web.PropertyEditors if (editorValue.Value == null) return null; + var config = editorValue.DataTypeConfiguration as RichTextConfiguration; + var mediaParent = config?.MediaParentId; + Guid mediaParentId; + + if (mediaParent == null) + mediaParentId = Guid.Empty; + else + mediaParentId = mediaParent.Guid; + // editorValue.Value is a JSON string of the grid var rawJson = editorValue.Value.ToString(); var grid = JsonConvert.DeserializeObject(rawJson); @@ -84,8 +94,7 @@ namespace Umbraco.Web.PropertyEditors var userId = Current.UmbracoContext.Security.CurrentUser.Id; - // TODO: In future task(get the parent folder from this config) to save the media into - var parsedHtml = TemplateUtilities.FindAndPersistPastedTempImages(html, -1, userId, _mediaService, _contentTypeBaseServiceProvider); + var parsedHtml = TemplateUtilities.FindAndPersistPastedTempImages(html, mediaParentId, userId, _mediaService, _contentTypeBaseServiceProvider); rte.Value = parsedHtml; } diff --git a/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs index f9267315e4..3acd4bd25e 100644 --- a/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs @@ -115,8 +115,16 @@ namespace Umbraco.Web.PropertyEditors var userId = Current.UmbracoContext.Security.CurrentUser.Id; - // TODO: In future task(get the parent folder from this config) to save the media into - parsed = TemplateUtilities.FindAndPersistPastedTempImages(parsed, -1, userId, _mediaService, _contentTypeBaseServiceProvider); + var config = editorValue.DataTypeConfiguration as RichTextConfiguration; + var mediaParent = config?.MediaParentId; + Guid mediaParentId; + + if (mediaParent == null) + mediaParentId = Guid.Empty; + else + mediaParentId = mediaParent.Guid; + + parsed = TemplateUtilities.FindAndPersistPastedTempImages(parsed, mediaParentId, userId, _mediaService, _contentTypeBaseServiceProvider); return parsed; } } diff --git a/src/Umbraco.Web/Templates/TemplateUtilities.cs b/src/Umbraco.Web/Templates/TemplateUtilities.cs index 5969951072..24069bcc6f 100644 --- a/src/Umbraco.Web/Templates/TemplateUtilities.cs +++ b/src/Umbraco.Web/Templates/TemplateUtilities.cs @@ -187,7 +187,7 @@ namespace Umbraco.Web.Templates // see comment in ResolveMediaFromTextString for group reference => ResolveImgPattern.Replace(text, "$1$3$4$5"); - internal static string FindAndPersistPastedTempImages(string html, int mediaParentFolder, int userId, IMediaService mediaService, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider) + internal static string FindAndPersistPastedTempImages(string html, Guid mediaParentFolder, int userId, IMediaService mediaService, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider) { // Find all img's that has data-tmpimg attribute // Use HTML Agility Pack - https://html-agility-pack.net From f735c3eae37e833701752bbbc7352c83bd20ed19 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Wed, 11 Sep 2019 10:05:20 +0100 Subject: [PATCH 04/17] Updates view for Config to new PreValue editor that Niels L is working on --- src/Umbraco.Web/PropertyEditors/GridConfiguration.cs | 2 +- src/Umbraco.Web/PropertyEditors/RichTextConfiguration.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web/PropertyEditors/GridConfiguration.cs b/src/Umbraco.Web/PropertyEditors/GridConfiguration.cs index 5de7f4d554..e3ab340238 100644 --- a/src/Umbraco.Web/PropertyEditors/GridConfiguration.cs +++ b/src/Umbraco.Web/PropertyEditors/GridConfiguration.cs @@ -22,7 +22,7 @@ namespace Umbraco.Web.PropertyEditors Description = "Selecting this option allows a user to choose nodes that they normally don't have access to.")] public bool IgnoreUserStartNodes { get; set; } - [ConfigurationField("mediaParentId", "Store Pasted Images Folder", "MediaPicker", + [ConfigurationField("mediaParentId", "Store Pasted Images Folder", "MediaFolderPicker", Description = "Choose where images dragged or pasted into the editor get uploaded to")] public GuidUdi MediaParentId { get; set; } } diff --git a/src/Umbraco.Web/PropertyEditors/RichTextConfiguration.cs b/src/Umbraco.Web/PropertyEditors/RichTextConfiguration.cs index b346e68be3..7139149739 100644 --- a/src/Umbraco.Web/PropertyEditors/RichTextConfiguration.cs +++ b/src/Umbraco.Web/PropertyEditors/RichTextConfiguration.cs @@ -21,7 +21,7 @@ namespace Umbraco.Web.PropertyEditors Description = "Selecting this option allows a user to choose nodes that they normally don't have access to.")] public bool IgnoreUserStartNodes { get; set; } - [ConfigurationField("mediaParentId", "Store Pasted Images Folder", "MediaPicker", + [ConfigurationField("mediaParentId", "Store Pasted Images Folder", "MediaFolderPicker", Description = "Choose where images dragged or pasted into the editor get uploaded to")] public GuidUdi MediaParentId { get; set; } } From 313260a6ca625aca6cbd16a4af71db33c7b6e49c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 11 Sep 2019 11:07:15 +0200 Subject: [PATCH 05/17] remove double end tag --- .../src/views/propertyeditors/rte/rte.prevalues.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.prevalues.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.prevalues.html index ade75a1cd6..5141f19d2f 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.prevalues.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.prevalues.html @@ -6,7 +6,7 @@ - + @@ -24,7 +24,6 @@ text="{{css.name}}"/>
-
From 9167cad9fc0b36bb2e52e01cfd5fc7d74f3adaa2 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Wed, 11 Sep 2019 10:36:30 +0100 Subject: [PATCH 06/17] Update copy --- src/Umbraco.Web/PropertyEditors/GridConfiguration.cs | 4 ++-- src/Umbraco.Web/PropertyEditors/RichTextConfiguration.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web/PropertyEditors/GridConfiguration.cs b/src/Umbraco.Web/PropertyEditors/GridConfiguration.cs index e3ab340238..7c9a549aef 100644 --- a/src/Umbraco.Web/PropertyEditors/GridConfiguration.cs +++ b/src/Umbraco.Web/PropertyEditors/GridConfiguration.cs @@ -22,8 +22,8 @@ namespace Umbraco.Web.PropertyEditors Description = "Selecting this option allows a user to choose nodes that they normally don't have access to.")] public bool IgnoreUserStartNodes { get; set; } - [ConfigurationField("mediaParentId", "Store Pasted Images Folder", "MediaFolderPicker", - Description = "Choose where images dragged or pasted into the editor get uploaded to")] + [ConfigurationField("mediaParentId", "Image Upload Folder", "MediaFolderPicker", + Description = "Choose the upload location of pasted images")] public GuidUdi MediaParentId { get; set; } } } diff --git a/src/Umbraco.Web/PropertyEditors/RichTextConfiguration.cs b/src/Umbraco.Web/PropertyEditors/RichTextConfiguration.cs index 7139149739..c6d4e3ce70 100644 --- a/src/Umbraco.Web/PropertyEditors/RichTextConfiguration.cs +++ b/src/Umbraco.Web/PropertyEditors/RichTextConfiguration.cs @@ -21,8 +21,8 @@ namespace Umbraco.Web.PropertyEditors Description = "Selecting this option allows a user to choose nodes that they normally don't have access to.")] public bool IgnoreUserStartNodes { get; set; } - [ConfigurationField("mediaParentId", "Store Pasted Images Folder", "MediaFolderPicker", - Description = "Choose where images dragged or pasted into the editor get uploaded to")] + [ConfigurationField("mediaParentId", "Image Upload Folder", "MediaFolderPicker", + Description = "Choose the upload location of pasted images")] public GuidUdi MediaParentId { get; set; } } } From 0b55468e5c69c45a534c6b96f33f580ea48e2259 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 11 Sep 2019 13:17:26 +0200 Subject: [PATCH 07/17] make sure to check string boolean, since it arrives as string because of AngularJS --- .../directives/components/umbmediagrid.directive.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbmediagrid.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbmediagrid.directive.js index ec4469e56f..4fe823cae5 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbmediagrid.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbmediagrid.directive.js @@ -122,7 +122,7 @@ Use this directive to generate a thumbnail grid of media items. item.selectable = getSelectableState(item); // remove non images when onlyImages is set to true - if(scope.onlyImages === "true" && !item.isFolder && !item.thumbnail){ + if( scope.onlyImages === "true" && !item.isFolder && !item.thumbnail){ scope.items.splice(i, 1); i--; } @@ -197,10 +197,10 @@ Use this directive to generate a thumbnail grid of media items. function getSelectableState(item) { // check if item is a folder or image - if (item.isFolder) { - return !scope.disableFolderSelect && !scope.onlyImages; + if (item.isFolder === true) { + return scope.disableFolderSelect !== "true" && scope.onlyImages !== "true"; } else { - return !scope.onlyFolders; + return scope.onlyFolders !== "true"; } return false; From fd3fb4c937ae271e44d0a37d79d93d2dfe280c53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 11 Sep 2019 13:17:40 +0200 Subject: [PATCH 08/17] grey out not selectable media items in media grid. --- .../src/less/components/umb-media-grid.less | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less index 840377647c..d023a00138 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less @@ -27,7 +27,17 @@ } .umb-media-grid__item.-unselectable { - + &::before { + content: ""; + position: absolute; + z-index: 1; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(230, 230, 230, .5); + pointer-events: none; + } } .umb-media-grid__item.-selectable { From bb6c4ace9024566de55255300285cf409bb383df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 11 Sep 2019 13:18:04 +0200 Subject: [PATCH 09/17] ensure that we handle string values --- .../mediapicker/mediapicker.controller.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 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 faabb73708..b4aa5cef58 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 @@ -3,6 +3,7 @@ angular.module("umbraco") .controller("Umbraco.Editors.MediaPickerController", function ($scope, mediaResource, entityResource, userService, mediaHelper, mediaTypeHelper, eventsService, treeService, localStorageService, localizationService, editorService) { + if (!$scope.model.title) { localizationService.localizeMany(["defaultdialogs_selectMedia", "general_includeFromsubFolders"]) .then(function (data) { @@ -15,10 +16,10 @@ angular.module("umbraco") var dialogOptions = $scope.model; - $scope.disableFolderSelect = dialogOptions.disableFolderSelect; - $scope.onlyImages = dialogOptions.onlyImages; - $scope.onlyFolders = dialogOptions.onlyFolders; - $scope.showDetails = dialogOptions.showDetails; + $scope.disableFolderSelect = (dialogOptions.disableFolderSelect && dialogOptions.disableFolderSelect !== "0") ? true : false; + $scope.onlyImages = (dialogOptions.onlyImages && dialogOptions.onlyImages !== "0") ? true : false; + $scope.onlyFolders = (dialogOptions.onlyFolders && dialogOptions.onlyFolders !== "0") ? true : false; + $scope.showDetails = (dialogOptions.showDetails && dialogOptions.showDetails !== "0") ? true : false; $scope.multiPicker = (dialogOptions.multiPicker && dialogOptions.multiPicker !== "0") ? true : false; $scope.startNodeId = dialogOptions.startNodeId ? dialogOptions.startNodeId : -1; $scope.cropSize = dialogOptions.cropSize; From 9b4ccc78d4ebfef8af453d77d23f7043eb2d31eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 11 Sep 2019 13:18:14 +0200 Subject: [PATCH 10/17] corrected misspelling --- .../views/common/infiniteeditors/mediapicker/mediapicker.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.html index b57fa96d44..f8cba9fd04 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.html @@ -100,7 +100,7 @@ item-min-height="100" disable-folder-select={{disableFolderSelect}} only-images={{onlyImages}} - only-folder={{onlyFolders}} + only-folders={{onlyFolders}} include-sub-folders={{showChilds}} current-Folder-id="{{currentFolder.id}}"> From 3c137668e084e03dbb0d4054815df6f12446c67e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 11 Sep 2019 13:18:40 +0200 Subject: [PATCH 11/17] created prevalueeditor mediafolderpicker --- .../mediafolderpicker.controller.js | 56 +++++++++++++++++++ .../prevalueeditors/mediafolderpicker.html | 37 ++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/views/prevalueeditors/mediafolderpicker.controller.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/prevalueeditors/mediafolderpicker.html 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 new file mode 100644 index 0000000000..ddfca295d4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/mediafolderpicker.controller.js @@ -0,0 +1,56 @@ +function mediaFolderPickerController($scope, editorService, entityResource) { + + + $scope.folderName = ""; + + + function retriveFolderData() { + + var id = $scope.model.value; + + if (id == null) { + $scope.folderName = ""; + return; + } + + entityResource.getById(id, "Media").then( + function (media) { + $scope.media = media; + } + ); + } + + + retriveFolderData(); + + + $scope.add = function() { + var mediaPickerOptions = { + view: "mediapicker", + multiPicker: true, + disableFolderSelect: false, + onlyImages: false, + onlyFolders: true, + submit: function (model) { + + $scope.model.value = model.selection[0].udi; + + retriveFolderData(); + + editorService.close(); + }, + close: function () { + editorService.close(); + } + }; + editorService.mediaPicker(mediaPickerOptions); + }; + + $scope.remove = function () { + $scope.model.value = null; + retriveFolderData(); + }; + +} + +angular.module('umbraco').controller("Umbraco.PrevalueEditors.MediaFolderPickerController", mediaFolderPickerController); diff --git a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/mediafolderpicker.html b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/mediafolderpicker.html new file mode 100644 index 0000000000..52a190aeea --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/mediafolderpicker.html @@ -0,0 +1,37 @@ +
+ +
+
    +
  • + +

    + + +

    + + +
    + + + .{{media.extension}} + + {{media.name}} +
    + +
    + + + + +
    +
  • + +
  • + + + +
  • +
+
+ +
From 54a3bd07d717a64bacf97cc719036b21acdc1b55 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Wed, 11 Sep 2019 14:24:52 +0100 Subject: [PATCH 12/17] Logic to use -1 Media root folder if no media folder is picked on the configuration of the RTE or the Grid --- src/Umbraco.Web/Templates/TemplateUtilities.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web/Templates/TemplateUtilities.cs b/src/Umbraco.Web/Templates/TemplateUtilities.cs index 32c778b559..0fd3b93fef 100644 --- a/src/Umbraco.Web/Templates/TemplateUtilities.cs +++ b/src/Umbraco.Web/Templates/TemplateUtilities.cs @@ -5,6 +5,7 @@ using System.Text.RegularExpressions; using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.IO; +using Umbraco.Core.Models; using Umbraco.Core.Services; using Umbraco.Web.Composing; using Umbraco.Web.PublishedCache; @@ -213,7 +214,13 @@ namespace Umbraco.Web.Templates var safeFileName = fileName.ToSafeFileName(); var mediaItemName = safeFileName.ToFriendlyName(); - var mediaFile = mediaService.CreateMedia(mediaItemName, mediaParentFolder, Constants.Conventions.MediaTypes.Image, userId); + IMedia mediaFile; + + if(mediaParentFolder == Guid.Empty) + mediaFile = mediaService.CreateMedia(mediaItemName, Constants.System.Root, Constants.Conventions.MediaTypes.Image, userId); + else + mediaFile = mediaService.CreateMedia(mediaItemName, mediaParentFolder, Constants.Conventions.MediaTypes.Image, userId); + var fileInfo = new FileInfo(absoluteTempImagePath); var fileStream = fileInfo.OpenReadWithRetry(); From 63914aec4fba6b06b9d5e84960b80543ba8b5847 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Fri, 13 Sep 2019 11:10:47 +0100 Subject: [PATCH 13/17] Couple of fixes --- src/Umbraco.Web/Editors/TinyMceController.cs | 2 +- src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web/Editors/TinyMceController.cs b/src/Umbraco.Web/Editors/TinyMceController.cs index 5bed080f7f..601095bd24 100644 --- a/src/Umbraco.Web/Editors/TinyMceController.cs +++ b/src/Umbraco.Web/Editors/TinyMceController.cs @@ -106,7 +106,7 @@ namespace Umbraco.Web.Editors // Now remove all old files so that the temp folder(s) never grow // Anything older than one day gets deleted - var tempFiles = Directory.GetFiles(SystemDirectories.TempFileUploads, "*", SearchOption.AllDirectories); + var tempFiles = Directory.GetFiles(IOHelper.MapPath(SystemDirectories.TempFileUploads), "*", SearchOption.AllDirectories); foreach (var tempFile in tempFiles) { if (DateTime.UtcNow - File.GetLastWriteTimeUtc(tempFile) > TimeSpan.FromDays(1)) diff --git a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs index ebb9b67f0d..92c82ab921 100644 --- a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs @@ -77,7 +77,7 @@ namespace Umbraco.Web.PropertyEditors if (editorValue.Value == null) return null; - var config = editorValue.DataTypeConfiguration as RichTextConfiguration; + var config = editorValue.DataTypeConfiguration as GridConfiguration; var mediaParent = config?.MediaParentId; Guid mediaParentId; From 14e33e0cb5bf8039a4668820b273ef3dd5e2af3f Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Mon, 16 Sep 2019 09:33:42 +0100 Subject: [PATCH 14/17] Update src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs Co-Authored-By: Bjarke Berg --- src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs index 92c82ab921..3798accb4e 100644 --- a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs @@ -99,7 +99,7 @@ namespace Umbraco.Web.PropertyEditors // Parse the HTML var html = rte.Value?.ToString(); - var userId = _umbracoContextAccessor.UmbracoContext?.Security.CurrentUser.Id ?? -1; + var userId = _umbracoContextAccessor.UmbracoContext?.Security.CurrentUser.Id ?? Constants.Security.SuperUserId; var parsedHtml = TemplateUtilities.FindAndPersistPastedTempImages(html, mediaParentId, userId, _mediaService, _contentTypeBaseServiceProvider, _logger); rte.Value = parsedHtml; From 0d4928887583afb2f73b0cc437d698797d04e5ea Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Mon, 16 Sep 2019 09:34:49 +0100 Subject: [PATCH 15/17] Update src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs Co-Authored-By: Bjarke Berg --- src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs index 60f68c3606..8696aa14e7 100644 --- a/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs @@ -117,7 +117,7 @@ namespace Umbraco.Web.PropertyEditors var editorValueWithMediaUrlsRemoved = TemplateUtilities.RemoveMediaUrlsFromTextString(editorValue.Value.ToString()); var parsed = MacroTagParser.FormatRichTextContentForPersistence(editorValueWithMediaUrlsRemoved); - var userId = _umbracoContextAccessor.UmbracoContext?.Security.CurrentUser.Id ?? -1; + var userId = _umbracoContextAccessor.UmbracoContext?.Security.CurrentUser.Id ?? Constants.Security.SuperUserId; var config = editorValue.DataTypeConfiguration as RichTextConfiguration; var mediaParent = config?.MediaParentId; From 11194314fbe347d0a6d06f7a7085a2fc09b8392c Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Tue, 17 Sep 2019 09:22:09 +0100 Subject: [PATCH 16/17] Be less verbose and assign in one line --- src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs | 7 +------ src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs | 7 +------ 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs index 3798accb4e..f940ed5c15 100644 --- a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs @@ -79,12 +79,7 @@ namespace Umbraco.Web.PropertyEditors var config = editorValue.DataTypeConfiguration as GridConfiguration; var mediaParent = config?.MediaParentId; - Guid mediaParentId; - - if (mediaParent == null) - mediaParentId = Guid.Empty; - else - mediaParentId = mediaParent.Guid; + var mediaParentId = mediaParent == null ? Guid.Empty : mediaParent.Guid; // editorValue.Value is a JSON string of the grid var rawJson = editorValue.Value.ToString(); diff --git a/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs index 8696aa14e7..d29b96c1db 100644 --- a/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs @@ -121,13 +121,8 @@ namespace Umbraco.Web.PropertyEditors var config = editorValue.DataTypeConfiguration as RichTextConfiguration; var mediaParent = config?.MediaParentId; - Guid mediaParentId; + var mediaParentId = mediaParent == null ? Guid.Empty : mediaParent.Guid; - if (mediaParent == null) - mediaParentId = Guid.Empty; - else - mediaParentId = mediaParent.Guid; - parsed = TemplateUtilities.FindAndPersistPastedTempImages(parsed, mediaParentId, userId, _mediaService, _contentTypeBaseServiceProvider, _logger); return parsed; } From 519fcab087b57148e5e75077347238da3ac18642 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Tue, 17 Sep 2019 09:25:26 +0100 Subject: [PATCH 17/17] Use the recrusive feature bool of Directory.Delete to delete the file at the same time :) --- src/Umbraco.Web/Templates/TemplateUtilities.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web/Templates/TemplateUtilities.cs b/src/Umbraco.Web/Templates/TemplateUtilities.cs index 56225df3d3..edccbcc9d4 100644 --- a/src/Umbraco.Web/Templates/TemplateUtilities.cs +++ b/src/Umbraco.Web/Templates/TemplateUtilities.cs @@ -250,9 +250,8 @@ namespace Umbraco.Web.Templates // for each image uploaded from TinyMceController var folderName = Path.GetDirectoryName(absoluteTempImagePath); try - { - File.Delete(absoluteTempImagePath); - Directory.Delete(folderName); + { + Directory.Delete(folderName, true); } catch (Exception ex) {