diff --git a/src/Umbraco.Web/Trees/FileSystemTreeController.cs b/src/Umbraco.Web/Trees/FileSystemTreeController.cs index 070885d621..0d612b5d4e 100644 --- a/src/Umbraco.Web/Trees/FileSystemTreeController.cs +++ b/src/Umbraco.Web/Trees/FileSystemTreeController.cs @@ -1,7 +1,11 @@ using System; using System.IO; +using System.Net.Http.Formatting; +using umbraco.BusinessLogic.Actions; +using Umbraco.Core; using Umbraco.Core.IO; using Umbraco.Web.Models.Trees; +using Umbraco.Core.Services; namespace Umbraco.Web.Trees { @@ -22,7 +26,7 @@ namespace Umbraco.Web.Trees /// protected virtual void OnRenderFolderNode(ref TreeNode treeNode) { } - protected override TreeNodeCollection GetTreeNodes(string id, System.Net.Http.Formatting.FormDataCollection queryStrings) + protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection queryStrings) { var orgPath = ""; string path; @@ -43,15 +47,15 @@ namespace Umbraco.Web.Trees var nodes = new TreeNodeCollection(); foreach (var dir in dirInfos) { - if ((dir.Attributes & FileAttributes.Hidden) == 0) - { - var hasChildren = dir.GetFiles().Length > 0 || dir.GetDirectories().Length > 0; - var node = CreateTreeNode(orgPath + dir.Name, orgPath, queryStrings, dir.Name, "icon-folder", hasChildren); + if ((dir.Attributes & FileAttributes.Hidden) != 0) + continue; - OnRenderFolderNode(ref node); - if (node != null) - nodes.Add(node); - } + var hasChildren = dir.GetFiles().Length > 0 || dir.GetDirectories().Length > 0; + var node = CreateTreeNode(orgPath + dir.Name, orgPath, queryStrings, dir.Name, "icon-folder", hasChildren); + + OnRenderFolderNode(ref node); + if (node != null) + nodes.Add(node); } //this is a hack to enable file system tree to support multiple file extension look-up @@ -70,20 +74,82 @@ namespace Umbraco.Web.Trees foreach (var file in fileInfo) { - if ((file.Attributes & FileAttributes.Hidden) == 0) - { - if (filterByMultipleExtensions && Array.IndexOf(allowedExtensions, file.Extension.ToLower().Trim('.')) < 0) - continue; + if ((file.Attributes & FileAttributes.Hidden) != 0) + continue; - var node = CreateTreeNode(orgPath + file.Name, orgPath, queryStrings, file.Name, "icon-file", false); + if (filterByMultipleExtensions && Array.IndexOf(allowedExtensions, file.Extension.ToLower().Trim('.')) < 0) + continue; - OnRenderFileNode(ref node); + var withoutExt = Path.GetFileNameWithoutExtension(file.Name); + if (withoutExt.IsNullOrWhiteSpace()) + continue; - if (node != null) - nodes.Add(node); - } + var node = CreateTreeNode(orgPath + file.Name, orgPath, queryStrings, file.Name, "icon-file", false); + + OnRenderFileNode(ref node); + if (node != null) + nodes.Add(node); } + return nodes; } + + protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings) + { + var menu = new MenuItemCollection(); + + //if root node no need to visit the filesystem so lets just create the menu and return it + if (id == Constants.System.Root.ToInvariantString()) + { + //set the default to create + menu.DefaultMenuAlias = ActionNew.Instance.Alias; + //create action + menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionNew.Instance.Alias))); + //refresh action + menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionRefresh.Instance.Alias)), true); + + return menu; + } + + string path; + if (string.IsNullOrEmpty(id) == false) + { + var orgPath = System.Web.HttpUtility.UrlDecode(id); + path = IOHelper.MapPath(FilePath + "/" + orgPath); + } + else + { + path = IOHelper.MapPath(FilePath); + } + + var dirInfo = new DirectoryInfo(path); + //check if it's a directory + if (dirInfo.Attributes == FileAttributes.Directory) + { + //set the default to create + menu.DefaultMenuAlias = ActionNew.Instance.Alias; + //create action + menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionNew.Instance.Alias))); + + var hasChildren = dirInfo.GetFiles().Length > 0 || dirInfo.GetDirectories().Length > 0; + //We can only delete folders if it doesn't have any children (folders or files) + if (hasChildren == false) + { + //delete action + menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionDelete.Instance.Alias)), true); + } + + //refresh action + menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionRefresh.Instance.Alias)), true); + } + //if it's not a directory then we only allow to delete the item + else + { + //delete action + menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionDelete.Instance.Alias))); + } + + return menu; + } } } diff --git a/src/Umbraco.Web/Trees/FileSystemTreeController2.cs b/src/Umbraco.Web/Trees/FileSystemTreeController2.cs index 79735e7e68..d43d68ee77 100644 --- a/src/Umbraco.Web/Trees/FileSystemTreeController2.cs +++ b/src/Umbraco.Web/Trees/FileSystemTreeController2.cs @@ -58,16 +58,15 @@ namespace Umbraco.Web.Trees }); foreach (var file in files) - { + { var withoutExt = Path.GetFileNameWithoutExtension(file); - if (withoutExt.IsNullOrWhiteSpace() == false) - { - var name = Path.GetFileName(file); - var node = CreateTreeNode(HttpUtility.UrlEncode(file), path, queryStrings, name, FileIcon, false); - OnRenderFileNode(ref node); - if (node != null) - nodes.Add(node); - } + if (withoutExt.IsNullOrWhiteSpace()) continue; + + var name = Path.GetFileName(file); + var node = CreateTreeNode(HttpUtility.UrlEncode(file), path, queryStrings, name, FileIcon, false); + OnRenderFileNode(ref node); + if (node != null) + nodes.Add(node); } return nodes;