diff --git a/src/Umbraco.Web.UI/umbraco/plugins/TheOutfield/DesktopMediaUploader/dmu.ashx b/src/Umbraco.Web.UI/umbraco/plugins/TheOutfield/DesktopMediaUploader/dmu.ashx
new file mode 100644
index 0000000000..3dab7a3f91
--- /dev/null
+++ b/src/Umbraco.Web.UI/umbraco/plugins/TheOutfield/DesktopMediaUploader/dmu.ashx
@@ -0,0 +1 @@
+<%@ WebHandler Language="C#" CodeBehind="MediaUploader.ashx.cs" Class="umbraco.presentation.umbraco.webservices.MediaUploader" %>
diff --git a/src/Umbraco.Web.UI/umbraco_client/FolderBrowser/Js/folderbrowser.js b/src/Umbraco.Web.UI/umbraco_client/FolderBrowser/Js/folderbrowser.js
index cb380ba028..8d65f76e8f 100644
--- a/src/Umbraco.Web.UI/umbraco_client/FolderBrowser/Js/folderbrowser.js
+++ b/src/Umbraco.Web.UI/umbraco_client/FolderBrowser/Js/folderbrowser.js
@@ -4,7 +4,7 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls");
(function ($, Base, window, document, undefined) {
var itemMappingOptions = {
- 'create': function(o) {
+ 'create': function (o) {
var item = ko.mapping.fromJS(o.data);
item.selected = ko.observable(false);
item.toggleSelected = function (itm, e) {
@@ -115,6 +115,14 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls");
items: ko.observableArray([]),
queued: ko.observableArray([])
});
+
+ self._viewModel.filtered = ko.computed(function () {
+ return self._viewModel.items();
+ return ko.utils.arrayFilter(this.items(), function (item) {
+ return item.Name().toLowerCase().indexOf(self._viewModel.filterTerm()) > -1 ||
+ item.Tags().toLowerCase().indexOf(self._viewModel.filterTerm()) > -1;
+ });
+ }, self._viewModel);
self._viewModel.selected = ko.computed(function() {
return ko.utils.arrayFilter(this.items(), function(item) {
@@ -301,15 +309,16 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls");
start: function (e, ui) {
// Add dragging class to container
$(".umbFolderBrowser .items").addClass("ui-sortable-dragging");
-
- $(".umbFolderBrowser .items .ui-sortable-helper span").removeAttr("data-bind").text("Moving 1 item");
},
- update: function (e, ui) {
+ update: function (e, ui)
+ {
+ // Can't sort when filtered so just return
+ if (self._viewModel.filterTerm().length > 0)
+ return;
+
//var oldIndex = self._viewModel.items.indexOf(self._viewModel.tempItem());
var newIndex = ui.item.index();
- //TODO: Don't allow sorting on a filtered view
-
$(".umbFolderBrowser .items .selected").sort(function (a,b) {
return parseInt($(a).data("order")) > parseInt($(b).data("order")) ? 1 : -1;
}).each(function(idx, itm) {
@@ -327,7 +336,15 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls");
stop: function (e, ui) {
// Remove dragging class from container
$(".umbFolderBrowser .items").removeClass("ui-sortable-dragging");
- //TODO: Update on server
+
+ if (self._viewModel.filterTerm().length > 0) {
+ $(this).sortable("cancel");
+ alert("Can't sort items which have been filtered");
+ }
+ else
+ {
+ //TODO: Update on server
+ }
}
});
},
diff --git a/src/Umbraco.Web/UI/Controls/FolderBrowser.cs b/src/Umbraco.Web/UI/Controls/FolderBrowser.cs
index 272d83c8bb..cc0c4467bd 100644
--- a/src/Umbraco.Web/UI/Controls/FolderBrowser.cs
+++ b/src/Umbraco.Web/UI/Controls/FolderBrowser.cs
@@ -1,10 +1,13 @@
using System;
using System.Collections.Generic;
using System.Text;
+using System.Web;
+using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using ClientDependency.Core;
using umbraco.BasePages;
+using umbraco.BusinessLogic;
using umbraco.IO;
using umbraco.cms.businesslogic.media;
@@ -113,7 +116,7 @@ namespace Umbraco.Web.UI.Controls
sb.Append("
Filter:
");
// Create thumbnails container
- sb.Append("" +
+ sb.Append("");
@@ -121,11 +124,21 @@ namespace Umbraco.Web.UI.Controls
Controls.Add(panel);
+ var user = User.GetCurrent();
+ var ticket = new FormsAuthenticationTicket(1,
+ user != null ? user.LoginName : "",
+ DateTime.Now,
+ DateTime.Now,
+ false,
+ "");
+
Page.ClientScript.RegisterStartupScript(typeof(FolderBrowser),
"RegisterFolderBrowsers",
- string.Format("$(function () {{ $(\".umbFolderBrowser\").folderBrowser({{ umbracoPath : '{0}', basePath : '{1}' }}); }});",
+ string.Format("$(function () {{ $(\".umbFolderBrowser\").folderBrowser({{ umbracoPath : '{0}', basePath : '{1}', username: '{2}', ticket: '{3}' }}); }});",
IOHelper.ResolveUrl(SystemDirectories.Umbraco),
- IOHelper.ResolveUrl(SystemDirectories.Base)),
+ IOHelper.ResolveUrl(SystemDirectories.Base),
+ user != null ? user.LoginName : "",
+ FormsAuthentication.Encrypt(ticket)),
true);
}
diff --git a/src/Umbraco.Web/WebServices/FolderBrowserService.cs b/src/Umbraco.Web/WebServices/FolderBrowserService.cs
index ed281a7894..c4d44169c5 100644
--- a/src/Umbraco.Web/WebServices/FolderBrowserService.cs
+++ b/src/Umbraco.Web/WebServices/FolderBrowserService.cs
@@ -45,19 +45,21 @@ namespace Umbraco.Web.WebServices
var fileUrl = fileProp != null ? fileProp.Value.ToString() : "";
var thumbUrl = ThumbnailProviderManager.Current.GetThumbnailUrl(fileUrl);
-
- data.Add(new
+ var item = new
{
Id = child.Id,
Path = child.Path,
Name = child.Text,
+ Tags = string.Join(",", Tag.GetTags(child.Id).Select(x => x.TagCaption)),
MediaTypeAlias = child.ContentType.Alias,
EditUrl = string.Format("editMedia.aspx?id={0}", child.Id),
FileUrl = fileUrl,
- ThumbnailUrl = !string.IsNullOrEmpty(thumbUrl)
- ? thumbUrl
+ ThumbnailUrl = !string.IsNullOrEmpty(thumbUrl)
+ ? thumbUrl
: IOHelper.ResolveUrl(SystemDirectories.Umbraco + "/images/thumbnails/" + child.ContentType.Thumbnail)
- });
+ };
+
+ data.Add(item);
}
return new JavaScriptSerializer().Serialize(data);
diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/MediaUploader.ashx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/MediaUploader.ashx.cs
index 8c23e383a6..bab33aaa09 100644
--- a/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/MediaUploader.ashx.cs
+++ b/src/Umbraco.Web/umbraco.presentation/umbraco/webservices/MediaUploader.ashx.cs
@@ -6,8 +6,10 @@ using System.Linq;
using System.Text;
using System.Web;
using System.Web.Configuration;
+using System.Web.Script.Serialization;
using System.Web.Security;
using System.Xml;
+using System.Xml.Serialization;
using umbraco.BusinessLogic;
using umbraco.businesslogic.Exceptions;
using umbraco.cms.businesslogic.media;
@@ -25,75 +27,100 @@ namespace umbraco.presentation.umbraco.webservices
public void ProcessRequest(HttpContext context)
{
- context.Response.Clear();
- context.Response.ContentType = @"text\xml";
- context.Response.Charset = "UTF-8";
- context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
- context.Response.Cache.SetAllowResponseInBrowserHistory(true);
+ MediaResponse response = null;
- var xmlTextWriter = new XmlTextWriter(context.Response.OutputStream, Encoding.UTF8);
- xmlTextWriter.WriteStartDocument();
- xmlTextWriter.WriteStartElement("response");
+ var action = context.Request["action"];
- string action = context.Request["action"];
-
- if (IsValidRequest(context, xmlTextWriter) && !string.IsNullOrEmpty(action))
+ if (IsValidRequest(context) && !string.IsNullOrEmpty(action))
{
switch (action.ToLower())
{
case "config":
- ProcessConfigRequest(context, xmlTextWriter);
+ response = ProcessConfigRequest(context);
break;
case "folderlist":
- ProcessFolderListRequest(context, xmlTextWriter);
+ response = ProcessFolderListRequest(context);
break;
case "upload":
- ProcessUploadRequest(context, xmlTextWriter);
+ response = ProcessUploadRequest(context);
break;
}
}
- xmlTextWriter.WriteEndElement();
- xmlTextWriter.WriteEndDocument();
- xmlTextWriter.Flush();
- xmlTextWriter.Close();
+ // Set success flag
+ if (response != null)
+ response.success = true;
+ else
+ response = new MediaResponse { success = false };
+
+ context.Response.Clear();
+ context.Response.Charset = "UTF-8";
+ context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
+ context.Response.Cache.SetAllowResponseInBrowserHistory(true);
+
+ var format = context.Request["format"];
+ switch (format)
+ {
+ case "json":
+ // Format as JSON
+ context.Response.ContentType = @"application/json";
+
+ context.Response.Write(new JavaScriptSerializer().Serialize(response));
+
+ break;
+ default:
+ // Format as XML
+ context.Response.ContentType = @"text/xml";
+
+ var serializer = new XmlSerializer(response.GetType());
+ serializer.Serialize(context.Response.OutputStream, response);
+
+ break;
+ }
+
context.Response.End();
}
- public void ProcessConfigRequest(HttpContext context, XmlTextWriter xmlTextWriter)
+ public ConfigResponse ProcessConfigRequest(HttpContext context)
{
- xmlTextWriter.WriteElementString("displayName", new User(context.Request["username"]).Name);
- xmlTextWriter.WriteElementString("umbracoPath", VirtualPathUtility.ToAbsolute(GlobalSettings.Path));
- xmlTextWriter.WriteElementString("maxRequestLength", GetMaxRequestLength().ToString());
+ return new ConfigResponse
+ {
+ displayName = new User(context.Request["username"]).Name,
+ umbracoPath = VirtualPathUtility.ToAbsolute(GlobalSettings.Path),
+ maxRequestLength = GetMaxRequestLength()
+ };
}
- public void ProcessFolderListRequest(HttpContext context, XmlTextWriter xmlTextWriter)
+ public FolderListResponse ProcessFolderListRequest(HttpContext context)
{
- xmlTextWriter.WriteStartElement("folder");
+ var response = new FolderListResponse
+ {
+ folder = new FolderListItem()
+ };
var startMediaId = AuthenticatedUser.StartMediaId;
if (startMediaId < 1)
{
- xmlTextWriter.WriteAttributeString("id", "-1");
- xmlTextWriter.WriteAttributeString("name", "Media");
+ response.folder.id = -1;
+ response.folder.name = "Media";
- CreateMediaTree(Media.GetRootMedias(), xmlTextWriter);
+ CreateMediaTree(Media.GetRootMedias(), response.folder);
}
else
{
var root = new Media(startMediaId);
- xmlTextWriter.WriteAttributeString("id", root.Id.ToString());
- xmlTextWriter.WriteAttributeString("name", root.Text);
+ response.folder.id = root.Id;
+ response.folder.name = root.Text;
- CreateMediaTree(root.Children, xmlTextWriter);
+ CreateMediaTree(root.Children, response.folder);
}
- xmlTextWriter.WriteEndElement();
+ return response;
}
- public void ProcessUploadRequest(HttpContext context, XmlTextWriter xmlTextWriter)
+ public UploadResponse ProcessUploadRequest(HttpContext context)
{
int parentNodeId;
if (int.TryParse(context.Request["parentNodeId"], out parentNodeId) && context.Request.Files.Count > 0)
@@ -158,11 +185,13 @@ namespace umbraco.presentation.umbraco.webservices
// log error
Log.Add(LogTypes.Error, -1, "Parent node id is in incorrect format");
}
+
+ return new UploadResponse();
}
#region Helper Methods
- private bool IsValidRequest(HttpContext context, XmlTextWriter xmlTextWriter)
+ private bool IsValidRequest(HttpContext context)
{
// check for secure connection
if (GlobalSettings.UseSSL && !context.Request.IsSecureConnection)
@@ -196,25 +225,25 @@ namespace umbraco.presentation.umbraco.webservices
AuthenticatedUser = user;
}
- xmlTextWriter.WriteAttributeString("success", isValid.ToString().ToLower());
-
return isValid;
}
- private void CreateMediaTree(IEnumerable nodes, XmlWriter xmlTextWriter)
+ private void CreateMediaTree(IEnumerable nodes, FolderListItem folder)
{
foreach (var media in nodes.Where(media => media != null && media.ContentType != null && media.ContentType.Alias == "Folder"))
{
- xmlTextWriter.WriteStartElement("folder");
- xmlTextWriter.WriteAttributeString("id", media.Id.ToString());
- xmlTextWriter.WriteAttributeString("name", media.Text);
+ var subFolder = new FolderListItem
+ {
+ id = media.Id,
+ name = media.Text
+ };
if (media.HasChildren)
{
- CreateMediaTree(media.Children, xmlTextWriter);
+ CreateMediaTree(media.Children, subFolder);
}
- xmlTextWriter.WriteEndElement();
+ folder.folders.Add(subFolder);
}
}
@@ -266,4 +295,46 @@ namespace umbraco.presentation.umbraco.webservices
#endregion
}
+
+ public class MediaResponse
+ {
+ [XmlAttribute]
+ public bool success { get; set; }
+ }
+
+ [XmlRoot("response")]
+ public class ConfigResponse : MediaResponse
+ {
+ public string displayName { get; set; }
+ public string umbracoPath { get; set; }
+ public int maxRequestLength { get; set; }
+ }
+
+ [XmlRoot("response")]
+ public class FolderListResponse : MediaResponse
+ {
+ public FolderListItem folder { get; set; }
+ }
+
+ [XmlType("folder")]
+ public class FolderListItem
+ {
+ [XmlAttribute]
+ public int id { get; set; }
+
+ [XmlAttribute]
+ public string name { get; set; }
+
+ [XmlElement("folder")]
+ public List folders { get; set; }
+
+ public FolderListItem()
+ {
+ folders = new List();
+ }
+ }
+
+ [XmlRoot("response")]
+ public class UploadResponse : MediaResponse
+ { }
}
\ No newline at end of file