From b3a5327356c6f1b2d538f8aa810c5263f23ff049 Mon Sep 17 00:00:00 2001 From: Wojciech Tengler Date: Wed, 16 Sep 2020 09:43:31 +0200 Subject: [PATCH 01/16] Simple code reformat --- .../FilePicker/filepicker.controller.js | 7 ++- .../App_Plugins/FilePicker/folderpicker.html | 2 - .../Controllers/FilePickerApiController.cs | 11 ++-- .../Controllers/FolderTreeController.cs | 50 +++++++++++-------- 4 files changed, 40 insertions(+), 30 deletions(-) diff --git a/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/filepicker.controller.js b/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/filepicker.controller.js index cd79946..0722b51 100644 --- a/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/filepicker.controller.js +++ b/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/filepicker.controller.js @@ -20,11 +20,13 @@ function filePickerController($scope, dialogService) { function populate(data) { var file = $scope.model.config.folder + data; + if ($scope.model.value.indexOf(file) === -1) { $scope.model.value.push(file); } }; }; + angular.module("umbraco").controller("Our.Umbraco.FilePickerController", filePickerController); function folderPickerController($scope, dialogService) { @@ -34,11 +36,12 @@ function folderPickerController($scope, dialogService) { callback: populate }); }; + function populate(data) { $scope.model.value = "/" + data; }; - }; + angular.module("umbraco").controller("Our.Umbraco.FolderPickerController", folderPickerController); function filePickerDialogController($scope, dialogService) { @@ -48,6 +51,7 @@ function filePickerDialogController($scope, dialogService) { function nodeSelectHandler(ev, args) { args.event.preventDefault(); args.event.stopPropagation(); + if (args.node.icon !== "icon-folder") $scope.submit(args.node.id); }; @@ -64,4 +68,5 @@ function folderPickerDialogController($scope, dialogService) { $scope.submit(args.node.id); }; }; + angular.module("umbraco").controller("Our.Umbraco.FolderPickerDialogController", folderPickerDialogController); diff --git a/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/folderpicker.html b/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/folderpicker.html index 66e4f3d..9e9981f 100644 --- a/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/folderpicker.html +++ b/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/folderpicker.html @@ -1,5 +1,4 @@
- -
\ No newline at end of file diff --git a/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs b/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs index 6c809f0..491139d 100644 --- a/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs +++ b/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs @@ -14,9 +14,11 @@ public class FilePickerApiController : UmbracoAuthorizedJsonController public IEnumerable GetFolders(string folder, string[] filter) { var path = IOHelper.MapPath("~/" + folder.TrimStart('~', '/')); - if (filter != null && filter[0] != ".") + + if (filter != null && filter[0] != ".") { - IEnumerable dirs = new DirectoryInfo(path).EnumerateDirectories(); + var dirs = new DirectoryInfo(path).EnumerateDirectories(); + return dirs.Where(d => d.EnumerateFiles().Where(f => filter.Contains(f.Extension, StringComparer.OrdinalIgnoreCase)).Any()); } @@ -26,8 +28,8 @@ public IEnumerable GetFolders(string folder, string[] filter) public IEnumerable GetFiles(string folder, string[] filter ) { var path = IOHelper.MapPath("~/" + folder.TrimStart('~', '/')); - DirectoryInfo dir = new DirectoryInfo(path); - IEnumerable files = dir.EnumerateFiles(); + var dir = new DirectoryInfo(path); + var files = dir.EnumerateFiles(); if (filter != null && filter[0] != ".") return files.Where(f => filter.Contains(f.Extension, StringComparer.OrdinalIgnoreCase)); @@ -35,5 +37,4 @@ public IEnumerable GetFiles(string folder, string[] filter ) return new DirectoryInfo(path).GetFiles(); } } - } \ No newline at end of file diff --git a/Src/Our.Umbraco.FilePicker/Controllers/FolderTreeController.cs b/Src/Our.Umbraco.FilePicker/Controllers/FolderTreeController.cs index 228eabf..8688259 100644 --- a/Src/Our.Umbraco.FilePicker/Controllers/FolderTreeController.cs +++ b/Src/Our.Umbraco.FilePicker/Controllers/FolderTreeController.cs @@ -14,52 +14,58 @@ public class FolderTreeController : TreeController { protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection queryStrings) { - if (!string.IsNullOrWhiteSpace(queryStrings.Get("startfolder"))) + string qsStartFolder = queryStrings.Get("startfolder"); + + if (!string.IsNullOrWhiteSpace(qsStartFolder)) { - string folder = id == "-1" ? queryStrings.Get("startfolder") : id; - folder = folder.EnsureStartsWith("/"); - TreeNodeCollection tempTree = AddFolders(folder, queryStrings); - tempTree.AddRange(AddFiles(folder, queryStrings)); - return tempTree; + string folder = id == "-1" ? qsStartFolder : id; + + folder = folder.EnsureStartsWith("/"); + + var treeNodes = GetFolderTreeNodes(folder, queryStrings); + + treeNodes.AddRange(GetFileTreeNodes(folder, queryStrings)); + + return treeNodes; } - return AddFolders(id == "-1" ? "" : id, queryStrings); + return GetFolderTreeNodes(id == "-1" ? "" : id, queryStrings); } - private TreeNodeCollection AddFiles(string folder, FormDataCollection queryStrings) + private TreeNodeCollection GetFileTreeNodes(string folder, FormDataCollection queryStrings) { - var pickerApiController = new FilePickerApiController(); - //var str = queryStrings.Get("startfolder"); - if (string.IsNullOrWhiteSpace(folder)) return null; - var filter = queryStrings.Get("filter").Split(',').Select(a=>a.Trim().EnsureStartsWith(".")).ToArray(); - + var qsStartFolder = queryStrings.Get("startfolder"); + var filter = queryStrings.Get("filter").Split(',').Select(a=>a.Trim().EnsureStartsWith(".")).ToArray(); var path = IOHelper.MapPath(folder); var rootPath = IOHelper.MapPath(queryStrings.Get("startfolder")); - var treeNodeCollection = new TreeNodeCollection(); - treeNodeCollection.AddRange(pickerApiController.GetFiles(folder, filter) + + var treeNodes = new TreeNodeCollection(); + var pickerApiController = new FilePickerApiController(); + + treeNodes.AddRange(pickerApiController.GetFiles(folder, filter) .Select(file => CreateTreeNode(file.FullName.Replace(rootPath, "").Replace("\\", "/"), path, queryStrings, file.Name, "icon-document", false))); - return treeNodeCollection; + return treeNodes; } - private TreeNodeCollection AddFolders(string parent, FormDataCollection queryStrings) + private TreeNodeCollection GetFolderTreeNodes(string parent, FormDataCollection queryStrings) { - var pickerApiController = new FilePickerApiController(); - var filter = queryStrings.Get("filter").Split(',').Select(a => a.Trim().EnsureStartsWith(".")).ToArray(); - var treeNodeCollection = new TreeNodeCollection(); - treeNodeCollection.AddRange(pickerApiController.GetFolders(parent,filter) + var treeNodes = new TreeNodeCollection(); + var pickerApiController = new FilePickerApiController(); + + treeNodes.AddRange(pickerApiController.GetFolders(parent,filter) .Select(dir => CreateTreeNode(dir.FullName.Replace(IOHelper.MapPath("~"), "").Replace("\\", "/"), "~/" + parent, queryStrings, dir.Name, "icon-folder", filter[0]=="." ? dir.EnumerateDirectories().Any() || pickerApiController.GetFiles(dir.FullName.Replace(IOHelper.MapPath("~"), "").Replace("\\", "/"), filter).Any() : pickerApiController.GetFiles(dir.FullName.Replace(IOHelper.MapPath("~"), "").Replace("\\", "/"), filter).Any()))); - return treeNodeCollection; + return treeNodes; } protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings) From a5edec1d0660861f4a48e4e855ddeeb62a15efd3 Mon Sep 17 00:00:00 2001 From: Wojciech Tengler Date: Wed, 16 Sep 2020 10:07:49 +0200 Subject: [PATCH 02/16] Separate two helpful methods: CreateFileTreeNode and CreateFolderTreeNode for simplicity and improved debuging --- .../Controllers/FilePickerApiController.cs | 2 +- .../Controllers/FolderTreeController.cs | 34 ++++++++++++++----- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs b/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs index 491139d..5d7b4e9 100644 --- a/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs +++ b/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs @@ -11,7 +11,7 @@ namespace Our.Umbraco.FilePicker.Controllers [PluginController("FilePicker")] public class FilePickerApiController : UmbracoAuthorizedJsonController { - public IEnumerable GetFolders(string folder, string[] filter) + public IEnumerable GetDirectories(string folder, string[] filter) { var path = IOHelper.MapPath("~/" + folder.TrimStart('~', '/')); diff --git a/Src/Our.Umbraco.FilePicker/Controllers/FolderTreeController.cs b/Src/Our.Umbraco.FilePicker/Controllers/FolderTreeController.cs index 8688259..3b93295 100644 --- a/Src/Our.Umbraco.FilePicker/Controllers/FolderTreeController.cs +++ b/Src/Our.Umbraco.FilePicker/Controllers/FolderTreeController.cs @@ -1,7 +1,8 @@ +using System.IO; using System.Linq; using System.Net.Http.Formatting; -using Umbraco.Core.IO; using Umbraco.Core; +using Umbraco.Core.IO; using Umbraco.Web.Models.Trees; using Umbraco.Web.Mvc; using Umbraco.Web.Trees; @@ -46,9 +47,9 @@ private TreeNodeCollection GetFileTreeNodes(string folder, FormDataCollection qu var treeNodes = new TreeNodeCollection(); var pickerApiController = new FilePickerApiController(); - treeNodes.AddRange(pickerApiController.GetFiles(folder, filter) - .Select(file => CreateTreeNode(file.FullName.Replace(rootPath, "").Replace("\\", "/"), - path, queryStrings, file.Name, "icon-document", false))); + var files = pickerApiController.GetFiles(folder, filter); + + treeNodes.AddRange(files.Select(file => CreateFileTreeNode(rootPath, path, queryStrings, file))); return treeNodes; } @@ -60,15 +61,30 @@ private TreeNodeCollection GetFolderTreeNodes(string parent, FormDataCollection var treeNodes = new TreeNodeCollection(); var pickerApiController = new FilePickerApiController(); - treeNodes.AddRange(pickerApiController.GetFolders(parent,filter) - .Select(dir => CreateTreeNode(dir.FullName.Replace(IOHelper.MapPath("~"), "").Replace("\\", "/"), - "~/" + parent, queryStrings, dir.Name, - "icon-folder", filter[0]=="." ? dir.EnumerateDirectories().Any() || pickerApiController.GetFiles(dir.FullName.Replace(IOHelper.MapPath("~"), "").Replace("\\", "/"), filter).Any() : pickerApiController.GetFiles(dir.FullName.Replace(IOHelper.MapPath("~"), "").Replace("\\", "/"), filter).Any()))); + var dirs = pickerApiController.GetDirectories(parent, filter); + + treeNodes.AddRange(dirs.Select(dir => CreateFolderTreeNode(parent, queryStrings, pickerApiController, dir, filter))); return treeNodes; } - protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings) + private TreeNode CreateFileTreeNode(string rootPath, string path, FormDataCollection queryStrings, FileInfo file) + { + string id = file.FullName.Replace(rootPath, "").Replace("\\", "/"); + + return CreateTreeNode(id, path, queryStrings, file.Name, "icon-document", false); + } + + private TreeNode CreateFolderTreeNode(string parent, FormDataCollection queryStrings, FilePickerApiController pickerApiController, DirectoryInfo dir, string[] filter) + { + string id = dir.FullName.Replace(IOHelper.MapPath("~"), "").Replace("\\", "/"); + bool hasChildren = filter[0] == "." ? dir.EnumerateDirectories().Any() + || pickerApiController.GetFiles(id, filter).Any() : pickerApiController.GetFiles(id, filter).Any(); + + return CreateTreeNode(id, "~/" + parent, queryStrings, dir.Name, "icon-folder", hasChildren); + } + + protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings) { return null; } From 5288e90e27aaf64f6f0658dd4e112e7f8eaeee5a Mon Sep 17 00:00:00 2001 From: Wojciech Tengler Date: Wed, 16 Sep 2020 10:26:30 +0200 Subject: [PATCH 03/16] UNC path bugfix and refactoring (variables naming consistency) --- .../FilePicker/filepicker.controller.js | 4 +- .../Controllers/FilePickerApiController.cs | 10 +-- .../Controllers/FolderTreeController.cs | 62 +++++++++---------- 3 files changed, 35 insertions(+), 41 deletions(-) diff --git a/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/filepicker.controller.js b/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/filepicker.controller.js index 0722b51..e0c09b9 100644 --- a/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/filepicker.controller.js +++ b/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/filepicker.controller.js @@ -19,7 +19,7 @@ function filePickerController($scope, dialogService) { }; function populate(data) { - var file = $scope.model.config.folder + data; + var file = data; if ($scope.model.value.indexOf(file) === -1) { $scope.model.value.push(file); @@ -38,7 +38,7 @@ function folderPickerController($scope, dialogService) { }; function populate(data) { - $scope.model.value = "/" + data; + $scope.model.value = data; }; }; diff --git a/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs b/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs index 5d7b4e9..cd1bbfb 100644 --- a/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs +++ b/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs @@ -11,9 +11,9 @@ namespace Our.Umbraco.FilePicker.Controllers [PluginController("FilePicker")] public class FilePickerApiController : UmbracoAuthorizedJsonController { - public IEnumerable GetDirectories(string folder, string[] filter) + public IEnumerable GetDirectories(string virtualPath, string[] filter) { - var path = IOHelper.MapPath("~/" + folder.TrimStart('~', '/')); + var path = IOHelper.MapPath("~" + virtualPath); if (filter != null && filter[0] != ".") { @@ -25,10 +25,10 @@ public IEnumerable GetDirectories(string folder, string[] filter) return new DirectoryInfo(path).GetDirectories("*"); } - public IEnumerable GetFiles(string folder, string[] filter ) + public IEnumerable GetFiles(string virtualPath, string[] filter ) { - var path = IOHelper.MapPath("~/" + folder.TrimStart('~', '/')); - var dir = new DirectoryInfo(path); + var path = IOHelper.MapPath("~" + virtualPath); + var dir = new DirectoryInfo(path); var files = dir.EnumerateFiles(); if (filter != null && filter[0] != ".") diff --git a/Src/Our.Umbraco.FilePicker/Controllers/FolderTreeController.cs b/Src/Our.Umbraco.FilePicker/Controllers/FolderTreeController.cs index 3b93295..2aa3d0f 100644 --- a/Src/Our.Umbraco.FilePicker/Controllers/FolderTreeController.cs +++ b/Src/Our.Umbraco.FilePicker/Controllers/FolderTreeController.cs @@ -16,72 +16,66 @@ public class FolderTreeController : TreeController protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection queryStrings) { string qsStartFolder = queryStrings.Get("startfolder"); + string qsFilter = queryStrings.Get("filter"); + + string rootVirtualPath = !string.IsNullOrEmpty(qsStartFolder) ? qsStartFolder : "/"; + var rootPath = IOHelper.MapPath("~" + rootVirtualPath); + string virtualPath = id == "-1" ? "/" : id; + var filter = qsFilter.Split(',').Select(a => a.Trim().EnsureStartsWith(".")).ToArray(); if (!string.IsNullOrWhiteSpace(qsStartFolder)) { - string folder = id == "-1" ? qsStartFolder : id; - - folder = folder.EnsureStartsWith("/"); + virtualPath = id == "-1" ? qsStartFolder : id; - var treeNodes = GetFolderTreeNodes(folder, queryStrings); + var treeNodes = GetFolderTreeNodes(rootPath, rootVirtualPath, virtualPath, filter, queryStrings); + var fileTreeNodes = GetFileTreeNodes(rootPath, rootVirtualPath, virtualPath, filter, queryStrings); - treeNodes.AddRange(GetFileTreeNodes(folder, queryStrings)); + treeNodes.AddRange(fileTreeNodes); return treeNodes; } - return GetFolderTreeNodes(id == "-1" ? "" : id, queryStrings); - } - - private TreeNodeCollection GetFileTreeNodes(string folder, FormDataCollection queryStrings) - { - if (string.IsNullOrWhiteSpace(folder)) - return null; - - var qsStartFolder = queryStrings.Get("startfolder"); - var filter = queryStrings.Get("filter").Split(',').Select(a=>a.Trim().EnsureStartsWith(".")).ToArray(); - - var path = IOHelper.MapPath(folder); - var rootPath = IOHelper.MapPath(queryStrings.Get("startfolder")); + return GetFolderTreeNodes(rootPath, rootVirtualPath, virtualPath, filter, queryStrings); + } + private TreeNodeCollection GetFileTreeNodes(string rootPath, string rootVirtualPath, string virtualPath, string[] filter, FormDataCollection queryStrings) + { var treeNodes = new TreeNodeCollection(); var pickerApiController = new FilePickerApiController(); - var files = pickerApiController.GetFiles(folder, filter); + var files = pickerApiController.GetFiles(virtualPath, filter); - treeNodes.AddRange(files.Select(file => CreateFileTreeNode(rootPath, path, queryStrings, file))); + treeNodes.AddRange(files.Select(file => CreateFileTreeNode(rootPath, rootVirtualPath, virtualPath, queryStrings, file))); - return treeNodes; + return treeNodes; } - private TreeNodeCollection GetFolderTreeNodes(string parent, FormDataCollection queryStrings) - { - var filter = queryStrings.Get("filter").Split(',').Select(a => a.Trim().EnsureStartsWith(".")).ToArray(); - + private TreeNodeCollection GetFolderTreeNodes(string rootPath, string rootVirtualPath, string virtualPath, string[] filter, FormDataCollection queryStrings) + { var treeNodes = new TreeNodeCollection(); var pickerApiController = new FilePickerApiController(); - var dirs = pickerApiController.GetDirectories(parent, filter); + var dirs = pickerApiController.GetDirectories(virtualPath, filter); - treeNodes.AddRange(dirs.Select(dir => CreateFolderTreeNode(parent, queryStrings, pickerApiController, dir, filter))); + treeNodes.AddRange(dirs.Select(dir => CreateFolderTreeNode(rootPath, rootVirtualPath, virtualPath, queryStrings, pickerApiController, dir, filter))); - return treeNodes; + return treeNodes; } - private TreeNode CreateFileTreeNode(string rootPath, string path, FormDataCollection queryStrings, FileInfo file) + private TreeNode CreateFileTreeNode(string rootPath, string rootVirtualPath, string virtualPath, FormDataCollection queryStrings, FileInfo file) { - string id = file.FullName.Replace(rootPath, "").Replace("\\", "/"); + string id = file.FullName.Replace(rootPath, rootVirtualPath).Replace("\\", "/"); - return CreateTreeNode(id, path, queryStrings, file.Name, "icon-document", false); + return CreateTreeNode(id, virtualPath, queryStrings, file.Name, "icon-document", false); } - private TreeNode CreateFolderTreeNode(string parent, FormDataCollection queryStrings, FilePickerApiController pickerApiController, DirectoryInfo dir, string[] filter) + private TreeNode CreateFolderTreeNode(string rootPath, string rootVirtualPath, string virtualPath, FormDataCollection queryStrings, FilePickerApiController pickerApiController, DirectoryInfo dir, string[] filter) { - string id = dir.FullName.Replace(IOHelper.MapPath("~"), "").Replace("\\", "/"); + string id = dir.FullName.Replace(rootPath, rootVirtualPath).Replace("\\", "/"); bool hasChildren = filter[0] == "." ? dir.EnumerateDirectories().Any() || pickerApiController.GetFiles(id, filter).Any() : pickerApiController.GetFiles(id, filter).Any(); - return CreateTreeNode(id, "~/" + parent, queryStrings, dir.Name, "icon-folder", hasChildren); + return CreateTreeNode(id, virtualPath, queryStrings, dir.Name, "icon-folder", hasChildren); } protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings) From cc53c03542d6e34628ca66768b4378cba19f8c11 Mon Sep 17 00:00:00 2001 From: Wojciech Tengler Date: Wed, 16 Sep 2020 10:30:31 +0200 Subject: [PATCH 04/16] More logical implementation of methods in controller --- .../Controllers/FilePickerApiController.cs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs b/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs index cd1bbfb..50ed79b 100644 --- a/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs +++ b/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs @@ -14,27 +14,31 @@ public class FilePickerApiController : UmbracoAuthorizedJsonController public IEnumerable GetDirectories(string virtualPath, string[] filter) { var path = IOHelper.MapPath("~" + virtualPath); + var dir = new DirectoryInfo(path); if (filter != null && filter[0] != ".") { - var dirs = new DirectoryInfo(path).EnumerateDirectories(); + var dirs = dir.EnumerateDirectories(); return dirs.Where(d => d.EnumerateFiles().Where(f => filter.Contains(f.Extension, StringComparer.OrdinalIgnoreCase)).Any()); } - return new DirectoryInfo(path).GetDirectories("*"); + return dir.GetDirectories("*"); } public IEnumerable GetFiles(string virtualPath, string[] filter ) { var path = IOHelper.MapPath("~" + virtualPath); var dir = new DirectoryInfo(path); - var files = dir.EnumerateFiles(); - if (filter != null && filter[0] != ".") - return files.Where(f => filter.Contains(f.Extension, StringComparer.OrdinalIgnoreCase)); + if (filter != null && filter[0] != ".") + { + var files = dir.EnumerateFiles(); + + return files.Where(f => filter.Contains(f.Extension, StringComparer.OrdinalIgnoreCase)); + } - return new DirectoryInfo(path).GetFiles(); - } + return dir.GetFiles(); + } } } \ No newline at end of file From 1ae949c017a9b9c11a5775bda165df7c2300f01f Mon Sep 17 00:00:00 2001 From: Wojciech Tengler Date: Wed, 16 Sep 2020 10:31:04 +0200 Subject: [PATCH 05/16] Remove unnecesary filtering by star --- .../Controllers/FilePickerApiController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs b/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs index 50ed79b..1504776 100644 --- a/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs +++ b/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs @@ -23,7 +23,7 @@ public IEnumerable GetDirectories(string virtualPath, string[] fi return dirs.Where(d => d.EnumerateFiles().Where(f => filter.Contains(f.Extension, StringComparer.OrdinalIgnoreCase)).Any()); } - return dir.GetDirectories("*"); + return dir.GetDirectories(); } public IEnumerable GetFiles(string virtualPath, string[] filter ) From a568ff37e9f3208ec20298566acc295ae15abb59 Mon Sep 17 00:00:00 2001 From: Wojciech Tengler Date: Wed, 16 Sep 2020 11:16:22 +0200 Subject: [PATCH 06/16] Bugfix: Allow expand folder in tree when filter is applied and directory has another directories but no files children. We don't need to filter directories which don't contain files because better is to show empty directory without expand arrow next to them. Aditional StringSplitOptions.RemoveEmptyEntries flag used and simplicity filter checking. --- .../Controllers/FilePickerApiController.cs | 11 ++--------- .../Controllers/FolderTreeController.cs | 8 ++++---- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs b/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs index 1504776..608fd47 100644 --- a/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs +++ b/Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs @@ -11,18 +11,11 @@ namespace Our.Umbraco.FilePicker.Controllers [PluginController("FilePicker")] public class FilePickerApiController : UmbracoAuthorizedJsonController { - public IEnumerable GetDirectories(string virtualPath, string[] filter) + public IEnumerable GetDirectories(string virtualPath) { var path = IOHelper.MapPath("~" + virtualPath); var dir = new DirectoryInfo(path); - if (filter != null && filter[0] != ".") - { - var dirs = dir.EnumerateDirectories(); - - return dirs.Where(d => d.EnumerateFiles().Where(f => filter.Contains(f.Extension, StringComparer.OrdinalIgnoreCase)).Any()); - } - return dir.GetDirectories(); } @@ -31,7 +24,7 @@ public IEnumerable GetFiles(string virtualPath, string[] filter ) var path = IOHelper.MapPath("~" + virtualPath); var dir = new DirectoryInfo(path); - if (filter != null && filter[0] != ".") + if (filter != null && filter.Any()) { var files = dir.EnumerateFiles(); diff --git a/Src/Our.Umbraco.FilePicker/Controllers/FolderTreeController.cs b/Src/Our.Umbraco.FilePicker/Controllers/FolderTreeController.cs index 2aa3d0f..c8ea9df 100644 --- a/Src/Our.Umbraco.FilePicker/Controllers/FolderTreeController.cs +++ b/Src/Our.Umbraco.FilePicker/Controllers/FolderTreeController.cs @@ -1,3 +1,4 @@ +using System; using System.IO; using System.Linq; using System.Net.Http.Formatting; @@ -21,7 +22,7 @@ protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection string rootVirtualPath = !string.IsNullOrEmpty(qsStartFolder) ? qsStartFolder : "/"; var rootPath = IOHelper.MapPath("~" + rootVirtualPath); string virtualPath = id == "-1" ? "/" : id; - var filter = qsFilter.Split(',').Select(a => a.Trim().EnsureStartsWith(".")).ToArray(); + var filter = qsFilter.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(a => a.Trim().EnsureStartsWith(".")).ToArray(); if (!string.IsNullOrWhiteSpace(qsStartFolder)) { @@ -55,7 +56,7 @@ private TreeNodeCollection GetFolderTreeNodes(string rootPath, string rootVirtua var treeNodes = new TreeNodeCollection(); var pickerApiController = new FilePickerApiController(); - var dirs = pickerApiController.GetDirectories(virtualPath, filter); + var dirs = pickerApiController.GetDirectories(virtualPath); treeNodes.AddRange(dirs.Select(dir => CreateFolderTreeNode(rootPath, rootVirtualPath, virtualPath, queryStrings, pickerApiController, dir, filter))); @@ -72,8 +73,7 @@ private TreeNode CreateFileTreeNode(string rootPath, string rootVirtualPath, str private TreeNode CreateFolderTreeNode(string rootPath, string rootVirtualPath, string virtualPath, FormDataCollection queryStrings, FilePickerApiController pickerApiController, DirectoryInfo dir, string[] filter) { string id = dir.FullName.Replace(rootPath, rootVirtualPath).Replace("\\", "/"); - bool hasChildren = filter[0] == "." ? dir.EnumerateDirectories().Any() - || pickerApiController.GetFiles(id, filter).Any() : pickerApiController.GetFiles(id, filter).Any(); + bool hasChildren = pickerApiController.GetDirectories(id).Any() || pickerApiController.GetFiles(id, filter).Any(); return CreateTreeNode(id, virtualPath, queryStrings, dir.Name, "icon-folder", hasChildren); } From f093d0f5b7a02a8b1c18c09eec044441d91367f1 Mon Sep 17 00:00:00 2001 From: Wojciech Tengler Date: Wed, 16 Sep 2020 12:15:20 +0200 Subject: [PATCH 07/16] We don't need FilePickerApiControler for two methods used only by tree, so we can rename FolderTreeControler to more consistency name FilePickerTreeController --- .../FilePicker/filepickerdialog.html | 4 +- .../FilePicker/folderpickerdialog.html | 4 +- .../Controllers/FilePickerApiController.cs | 37 ---------------- ...troller.cs => FilePickerTreeController.cs} | 44 ++++++++++++++----- .../Our.Umbraco.FilePicker.csproj | 3 +- 5 files changed, 37 insertions(+), 55 deletions(-) delete mode 100644 Src/Our.Umbraco.FilePicker/Controllers/FilePickerApiController.cs rename Src/Our.Umbraco.FilePicker/Controllers/{FolderTreeController.cs => FilePickerTreeController.cs} (71%) diff --git a/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/filepickerdialog.html b/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/filepickerdialog.html index 44d89b0..bee0b3e 100644 --- a/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/filepickerdialog.html +++ b/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/filepickerdialog.html @@ -1,7 +1,7 @@
-
- GetDirectories(string virtualPath) - { - var path = IOHelper.MapPath("~" + virtualPath); - var dir = new DirectoryInfo(path); - - return dir.GetDirectories(); - } - - public IEnumerable GetFiles(string virtualPath, string[] filter ) - { - var path = IOHelper.MapPath("~" + virtualPath); - var dir = new DirectoryInfo(path); - - if (filter != null && filter.Any()) - { - var files = dir.EnumerateFiles(); - - return files.Where(f => filter.Contains(f.Extension, StringComparer.OrdinalIgnoreCase)); - } - - return dir.GetFiles(); - } - } -} \ No newline at end of file diff --git a/Src/Our.Umbraco.FilePicker/Controllers/FolderTreeController.cs b/Src/Our.Umbraco.FilePicker/Controllers/FilePickerTreeController.cs similarity index 71% rename from Src/Our.Umbraco.FilePicker/Controllers/FolderTreeController.cs rename to Src/Our.Umbraco.FilePicker/Controllers/FilePickerTreeController.cs index c8ea9df..f08f6b0 100644 --- a/Src/Our.Umbraco.FilePicker/Controllers/FolderTreeController.cs +++ b/Src/Our.Umbraco.FilePicker/Controllers/FilePickerTreeController.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http.Formatting; @@ -10,9 +11,9 @@ namespace Our.Umbraco.FilePicker.Controllers { - [Tree("dummy", "fileTree", "Folders")] + [Tree("filePickerDialog", "filePickerTree", "Folders and files")] [PluginController("FilePicker")] - public class FolderTreeController : TreeController + public class FilePickerTreeController : TreeController { protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection queryStrings) { @@ -42,9 +43,7 @@ protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection private TreeNodeCollection GetFileTreeNodes(string rootPath, string rootVirtualPath, string virtualPath, string[] filter, FormDataCollection queryStrings) { var treeNodes = new TreeNodeCollection(); - var pickerApiController = new FilePickerApiController(); - - var files = pickerApiController.GetFiles(virtualPath, filter); + var files = GetFiles(virtualPath, filter); treeNodes.AddRange(files.Select(file => CreateFileTreeNode(rootPath, rootVirtualPath, virtualPath, queryStrings, file))); @@ -54,11 +53,9 @@ private TreeNodeCollection GetFileTreeNodes(string rootPath, string rootVirtualP private TreeNodeCollection GetFolderTreeNodes(string rootPath, string rootVirtualPath, string virtualPath, string[] filter, FormDataCollection queryStrings) { var treeNodes = new TreeNodeCollection(); - var pickerApiController = new FilePickerApiController(); - - var dirs = pickerApiController.GetDirectories(virtualPath); + var dirs = GetDirectories(virtualPath); - treeNodes.AddRange(dirs.Select(dir => CreateFolderTreeNode(rootPath, rootVirtualPath, virtualPath, queryStrings, pickerApiController, dir, filter))); + treeNodes.AddRange(dirs.Select(dir => CreateFolderTreeNode(rootPath, rootVirtualPath, virtualPath, queryStrings, dir, filter))); return treeNodes; } @@ -70,10 +67,10 @@ private TreeNode CreateFileTreeNode(string rootPath, string rootVirtualPath, str return CreateTreeNode(id, virtualPath, queryStrings, file.Name, "icon-document", false); } - private TreeNode CreateFolderTreeNode(string rootPath, string rootVirtualPath, string virtualPath, FormDataCollection queryStrings, FilePickerApiController pickerApiController, DirectoryInfo dir, string[] filter) + private TreeNode CreateFolderTreeNode(string rootPath, string rootVirtualPath, string virtualPath, FormDataCollection queryStrings, DirectoryInfo dir, string[] filter) { string id = dir.FullName.Replace(rootPath, rootVirtualPath).Replace("\\", "/"); - bool hasChildren = pickerApiController.GetDirectories(id).Any() || pickerApiController.GetFiles(id, filter).Any(); + bool hasChildren = GetDirectories(id).Any() || GetFiles(id, filter).Any(); return CreateTreeNode(id, virtualPath, queryStrings, dir.Name, "icon-folder", hasChildren); } @@ -82,5 +79,28 @@ protected override MenuItemCollection GetMenuForNode(string id, FormDataCollecti { return null; } - } + + public IEnumerable GetDirectories(string virtualPath) + { + var path = IOHelper.MapPath("~" + virtualPath); + var dir = new DirectoryInfo(path); + + return dir.GetDirectories(); + } + + public IEnumerable GetFiles(string virtualPath, string[] filter) + { + var path = IOHelper.MapPath("~" + virtualPath); + var dir = new DirectoryInfo(path); + + if (filter != null && filter.Any()) + { + var files = dir.EnumerateFiles(); + + return files.Where(f => filter.Contains(f.Extension, StringComparer.OrdinalIgnoreCase)); + } + + return dir.GetFiles(); + } + } } diff --git a/Src/Our.Umbraco.FilePicker/Our.Umbraco.FilePicker.csproj b/Src/Our.Umbraco.FilePicker/Our.Umbraco.FilePicker.csproj index e4b85b1..77d205c 100644 --- a/Src/Our.Umbraco.FilePicker/Our.Umbraco.FilePicker.csproj +++ b/Src/Our.Umbraco.FilePicker/Our.Umbraco.FilePicker.csproj @@ -210,8 +210,7 @@ - - + From 0b63596061a7025be11d69d0110e77c5ad245d4c Mon Sep 17 00:00:00 2001 From: Wojciech Tengler Date: Wed, 16 Sep 2020 12:19:32 +0200 Subject: [PATCH 08/16] Icon add inside anchor --- .../App_Plugins/FilePicker/filepicker.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/filepicker.html b/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/filepicker.html index 222aabc..fe0a702 100644 --- a/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/filepicker.html +++ b/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/filepicker.html @@ -8,8 +8,8 @@
  • - + Add
  • From fc36e69e17adbb84f78439aee65f995961bcf43f Mon Sep 17 00:00:00 2001 From: Wojciech Tengler Date: Wed, 16 Sep 2020 12:39:09 +0200 Subject: [PATCH 09/16] Remove unnecesary files=true parameter --- .../App_Plugins/FilePicker/filepickerdialog.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/filepickerdialog.html b/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/filepickerdialog.html index bee0b3e..fb800d2 100644 --- a/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/filepickerdialog.html +++ b/Src/Our.Umbraco.FilePicker/App_Plugins/FilePicker/filepickerdialog.html @@ -6,7 +6,7 @@ hideoptions="true" hideheader="true" isdialog="true" - customtreeparams="startfolder={{dialogData.folder}}&filter={{dialogData.filter}}&files=true" + customtreeparams="startfolder={{dialogData.folder}}&filter={{dialogData.filter}}" />