From 794f30af39f7193d69da9cf3408ac256894b3d9f Mon Sep 17 00:00:00 2001 From: Hannan Azam Khan Date: Fri, 14 Oct 2016 00:31:49 +0500 Subject: [PATCH] [Fixes 6759] Replace Media Item: Replacing an Image/OEmbed with new one (#7160) Fixes #6759 --- .../Controllers/AdminController.cs | 27 +++- .../Controllers/ClientStorageController.cs | 147 ++++++++++++++---- .../Controllers/FolderController.cs | 6 +- .../Controllers/OEmbedController.cs | 120 +++++++++++--- .../Controllers/WebSearchController.cs | 144 +++++++++++++---- .../Drivers/MediaPartDriver.cs | 5 + .../Factories/AudioFactory.cs | 3 - .../Factories/DocumentFactory.cs | 6 +- .../Factories/ImageFactory.cs | 32 ---- .../Factories/VectorImageFactory.cs | 2 +- .../Factories/VideoFactory.cs | 3 - .../Handlers/MediaPartHandler.cs | 54 ++++++- .../Scripts/media-library.js | 11 ++ .../Services/IMediaLibraryService.cs | 21 +++ .../Services/MediaLibraryService.cs | 2 + .../Styles/orchard-oembed-admin.css | 19 +++ .../ViewModels/ImportMediaViewModel.cs | 5 +- .../ViewModels/MediaManagerImportViewModel.cs | 2 + .../MediaManagerMediaItemsViewModel.cs | 1 - .../ViewModels/OEmbedViewModel.cs | 6 +- .../Views/Admin/Import.cshtml | 17 +- .../Views/Admin/Index.cshtml | 3 + .../Views/ClientStorage/Index.cshtml | 53 ++++--- .../Views/OEmbed/Index.cshtml | 31 ++-- .../Views/Parts/Media.Actions.cshtml | 2 + .../Views/Parts/Media.SummaryAdmin.cshtml | 2 +- .../Views/WebSearch/Index.cshtml | 99 +++++++----- src/Orchard/Orchard.Framework.csproj | 8 +- 28 files changed, 614 insertions(+), 217 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/AdminController.cs index 3e2c2aa4e..a07b42503 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/AdminController.cs @@ -79,10 +79,15 @@ namespace Orchard.MediaLibrary.Controllers { return View(viewModel); } - public ActionResult Import(string folderPath) { + public ActionResult Import(string folderPath, int? replaceId = null) { if (!Services.Authorizer.Authorize(Permissions.ManageOwnMedia, T("Cannot import media"))) return new HttpUnauthorizedResult(); + // Check permission + if (!Services.Authorizer.Authorize(Permissions.ManageMediaContent) && !_mediaLibraryService.CanManageMediaFolder(folderPath)) { + return new HttpUnauthorizedResult(); + } + var mediaProviderMenu = _navigationManager.BuildMenu("mediaproviders"); var imageSets = _navigationManager.BuildImageSets("mediaproviders"); @@ -90,9 +95,17 @@ namespace Orchard.MediaLibrary.Controllers { Menu = mediaProviderMenu, ImageSets = imageSets, FolderPath = folderPath, - MediaTypes = _mediaLibraryService.GetMediaTypes() + MediaTypes = _mediaLibraryService.GetMediaTypes(), }; + if (replaceId != null) { + var replaceMedia = Services.ContentManager.Get(replaceId.Value).As(); + if (replaceMedia == null) + return HttpNotFound(); + + viewModel.Replace = replaceMedia; + } + return View(viewModel); } @@ -101,7 +114,7 @@ namespace Orchard.MediaLibrary.Controllers { if (!Services.Authorizer.Authorize(Permissions.ManageOwnMedia, T("Cannot view media"))) return new HttpUnauthorizedResult(); - // Check permission.var rootMediaFolder = _mediaLibraryService.GetRootMediaFolder(); + // Check permission if (!Services.Authorizer.Authorize(Permissions.ManageMediaContent) && !_mediaLibraryService.CanManageMediaFolder(folderPath)) { var model = new MediaManagerMediaItemsViewModel { MediaItems = new List(), @@ -134,7 +147,7 @@ namespace Orchard.MediaLibrary.Controllers { if (!Services.Authorizer.Authorize(Permissions.ManageOwnMedia, T("Cannot get child folder listing"))) return new HttpUnauthorizedResult(); - // Check permission. + // Check permission var rootMediaFolder = _mediaLibraryService.GetRootMediaFolder(); if (!Services.Authorizer.Authorize(Permissions.ManageMediaContent) && !_mediaLibraryService.CanManageMediaFolder(folderPath)) { var model = new MediaManagerChildFoldersViewModel { @@ -213,7 +226,8 @@ namespace Orchard.MediaLibrary.Controllers { } return Json(true); - } catch (Exception e) { + } + catch (Exception e) { Logger.Error(e, "Could not delete media items."); return Json(false); } @@ -247,7 +261,8 @@ namespace Orchard.MediaLibrary.Controllers { Services.ContentManager.Publish(clonedContentItem); return Json(true); - } catch (Exception e) { + } + catch (Exception e) { Logger.Error(e, "Could not clone media item."); return Json(false); } diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/ClientStorageController.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/ClientStorageController.cs index 745724fc9..b64e6dbad 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/ClientStorageController.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/ClientStorageController.cs @@ -10,18 +10,20 @@ using Orchard.UI.Admin; using Orchard.MediaLibrary.Models; using Orchard.Localization; using System.Linq; +using Orchard.FileSystems.Media; namespace Orchard.MediaLibrary.Controllers { [Admin, Themed(false)] public class ClientStorageController : Controller { private readonly IMediaLibraryService _mediaLibraryService; + private readonly IMimeTypeProvider _mimeTypeProvider; public ClientStorageController( - IMediaLibraryService mediaManagerService, - IContentManager contentManager, - IOrchardServices orchardServices) { + IMediaLibraryService mediaManagerService, + IOrchardServices orchardServices, + IMimeTypeProvider mimeTypeProvider) { _mediaLibraryService = mediaManagerService; - Services = orchardServices; + _mimeTypeProvider = mimeTypeProvider; Services = orchardServices; T = NullLocalizer.Instance; } @@ -29,34 +31,39 @@ namespace Orchard.MediaLibrary.Controllers { public IOrchardServices Services { get; set; } public Localizer T { get; set; } - public ActionResult Index(string folderPath, string type) { + public ActionResult Index(string folderPath, string type, int? replaceId = null) { if (!Services.Authorizer.Authorize(Permissions.ManageOwnMedia)) { return new HttpUnauthorizedResult(); } - - // Check permission. - var rootMediaFolder = _mediaLibraryService.GetRootMediaFolder(); + // Check permission if (!Services.Authorizer.Authorize(Permissions.ManageMediaContent) && !_mediaLibraryService.CanManageMediaFolder(folderPath)) { return new HttpUnauthorizedResult(); } var viewModel = new ImportMediaViewModel { FolderPath = folderPath, - Type = type + Type = type, }; + if (replaceId != null) { + var replaceMedia = Services.ContentManager.Get(replaceId.Value); + if (replaceMedia == null) + return HttpNotFound(); + + viewModel.Replace = replaceMedia; + } + return View(viewModel); } - + [HttpPost] public ActionResult Upload(string folderPath, string type) { - if (!Services.Authorizer.Authorize(Permissions.ManageOwnMedia)) { + if (!Services.Authorizer.Authorize(Permissions.ManageOwnMedia)) { return new HttpUnauthorizedResult(); } - // Check permission. - var rootMediaFolder = _mediaLibraryService.GetRootMediaFolder(); + // Check permission if (!Services.Authorizer.Authorize(Permissions.ManageMediaContent) && !_mediaLibraryService.CanManageMediaFolder(folderPath)) { return new HttpUnauthorizedResult(); } @@ -64,7 +71,7 @@ namespace Orchard.MediaLibrary.Controllers { var statuses = new List(); var settings = Services.WorkContext.CurrentSite.As(); var allowedExtensions = (settings.UploadAllowedFileTypeWhitelist ?? "") - .Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries) + .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .Where(x => x.StartsWith(".")); // Loop through each file in the request @@ -72,15 +79,15 @@ namespace Orchard.MediaLibrary.Controllers { // Pointer to file var file = HttpContext.Request.Files[i]; var filename = Path.GetFileName(file.FileName); - + // if the file has been pasted, provide a default name if (file.ContentType.Equals("image/png", StringComparison.InvariantCultureIgnoreCase) && !filename.EndsWith(".png", StringComparison.InvariantCultureIgnoreCase)) { filename = "clipboard.png"; } // skip file if the allowed extensions is defined and doesn't match - if(allowedExtensions.Any()) { - if(!allowedExtensions.Any(e => filename.EndsWith(e, StringComparison.OrdinalIgnoreCase))) { + if (allowedExtensions.Any()) { + if (!allowedExtensions.Any(e => filename.EndsWith(e, StringComparison.OrdinalIgnoreCase))) { statuses.Add(new { error = T("This file type is not allowed: {0}", Path.GetExtension(filename)).Text, progress = 1.0, @@ -89,21 +96,107 @@ namespace Orchard.MediaLibrary.Controllers { } } - var mediaPart = _mediaLibraryService.ImportMedia(file.InputStream, folderPath, filename, type); - Services.ContentManager.Create(mediaPart); + try { + var mediaPart = _mediaLibraryService.ImportMedia(file.InputStream, folderPath, filename, type); + Services.ContentManager.Create(mediaPart); - statuses.Add(new { - id = mediaPart.Id, - name = mediaPart.Title, - type = mediaPart.MimeType, - size = file.ContentLength, - progress = 1.0, - url= mediaPart.FileName, - }); + statuses.Add(new { + id = mediaPart.Id, + name = mediaPart.Title, + type = mediaPart.MimeType, + size = file.ContentLength, + progress = 1.0, + url = mediaPart.FileName, + }); + } + catch (Exception ex) { + statuses.Add(new { + error = T(ex.Message).Text, + progress = 1.0, + }); + } } // Return JSON return Json(statuses, JsonRequestBehavior.AllowGet); } + + [HttpPost] + public ActionResult Replace(int replaceId, string type) { + if (!Services.Authorizer.Authorize(Permissions.ManageOwnMedia)) + return new HttpUnauthorizedResult(); + + var replaceMedia = Services.ContentManager.Get(replaceId); + if (replaceMedia == null) + return HttpNotFound(); + + // Check permission + if (!Services.Authorizer.Authorize(Permissions.ManageMediaContent) && !_mediaLibraryService.CanManageMediaFolder(replaceMedia.FolderPath)) { + return new HttpUnauthorizedResult(); + } + + var statuses = new List(); + + var settings = Services.WorkContext.CurrentSite.As(); + var allowedExtensions = (settings.UploadAllowedFileTypeWhitelist ?? "") + .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) + .Where(x => x.StartsWith(".")); + + // Loop through each file in the request + for (int i = 0; i < HttpContext.Request.Files.Count; i++) { + // Pointer to file + var file = HttpContext.Request.Files[i]; + var filename = Path.GetFileName(file.FileName); + + // if the file has been pasted, provide a default name + if (file.ContentType.Equals("image/png", StringComparison.InvariantCultureIgnoreCase) && !filename.EndsWith(".png", StringComparison.InvariantCultureIgnoreCase)) { + filename = "clipboard.png"; + } + + // skip file if the allowed extensions is defined and doesn't match + if (allowedExtensions.Any()) { + if (!allowedExtensions.Any(e => filename.EndsWith(e, StringComparison.OrdinalIgnoreCase))) { + statuses.Add(new { + error = T("This file type is not allowed: {0}", Path.GetExtension(filename)).Text, + progress = 1.0, + }); + continue; + } + } + + try { + var mimeType = _mimeTypeProvider.GetMimeType(filename); + + string replaceContentType = _mediaLibraryService.MimeTypeToContentType(file.InputStream, mimeType, type) ?? type; + if (!replaceContentType.Equals(replaceMedia.TypeDefinition.Name, StringComparison.OrdinalIgnoreCase)) + throw new Exception(T("Cannot replace {0} with {1}", replaceMedia.TypeDefinition.Name, replaceContentType).Text); + + _mediaLibraryService.DeleteFile(replaceMedia.FolderPath, replaceMedia.FileName); + _mediaLibraryService.UploadMediaFile(replaceMedia.FolderPath, replaceMedia.FileName, file.InputStream); + replaceMedia.MimeType = mimeType; + + // Force a publish event which will update relevant Media properties + replaceMedia.ContentItem.VersionRecord.Published = false; + Services.ContentManager.Publish(replaceMedia.ContentItem); + + statuses.Add(new { + id = replaceMedia.Id, + name = replaceMedia.Title, + type = replaceMedia.MimeType, + size = file.ContentLength, + progress = 1.0, + url = replaceMedia.FileName, + }); + } + catch (Exception ex) { + statuses.Add(new { + error = T(ex.Message).Text, + progress = 1.0, + }); + } + } + + return Json(statuses, JsonRequestBehavior.AllowGet); + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/FolderController.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/FolderController.cs index 33927b245..936d59c58 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/FolderController.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/FolderController.cs @@ -17,7 +17,7 @@ namespace Orchard.MediaLibrary.Controllers { private readonly IMediaLibraryService _mediaLibraryService; public FolderController( - IOrchardServices services, + IOrchardServices services, IMediaLibraryService mediaManagerService ) { _mediaLibraryService = mediaManagerService; @@ -111,7 +111,7 @@ namespace Orchard.MediaLibrary.Controllers { } // Shouldn't be able to rename the root folder - if(IsRootFolder(viewModel.FolderPath)) { + if (IsRootFolder(viewModel.FolderPath)) { return new HttpUnauthorizedResult(); } @@ -179,7 +179,7 @@ namespace Orchard.MediaLibrary.Controllers { private bool IsRootFolder(string folderPath) { var rootMediaFolder = _mediaLibraryService.GetRootMediaFolder(); - + return rootMediaFolder == null ? string.IsNullOrEmpty(folderPath) : string.Equals(rootMediaFolder.MediaPath, folderPath, StringComparison.OrdinalIgnoreCase); diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/OEmbedController.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/OEmbedController.cs index 824dc0267..e1b1c3241 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/OEmbedController.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/OEmbedController.cs @@ -10,6 +10,8 @@ using Orchard.Themes; using Orchard.UI.Admin; using Orchard.ContentManagement; using Orchard.MediaLibrary.Services; +using Orchard.Localization; +using Orchard.UI.Notify; namespace Orchard.MediaLibrary.Controllers { [Admin, Themed(false)] @@ -19,40 +21,64 @@ namespace Orchard.MediaLibrary.Controllers { public OEmbedController( IOrchardServices services, IMediaLibraryService mediaManagerService) { - Services = services; _mediaLibraryService = mediaManagerService; + Services = services; + T = NullLocalizer.Instance; } public IOrchardServices Services { get; set; } + public Localizer T { get; set; } + + public ActionResult Index(string folderPath, string type, int? replaceId) { + if (!Services.Authorizer.Authorize(Permissions.ManageOwnMedia)) + return new HttpUnauthorizedResult(); + + // Check permission + if (!Services.Authorizer.Authorize(Permissions.ManageMediaContent) && !_mediaLibraryService.CanManageMediaFolder(folderPath)) { + return new HttpUnauthorizedResult(); + } - public ActionResult Index(string folderPath, string type) { var viewModel = new OEmbedViewModel { FolderPath = folderPath, - Type = type }; + if (replaceId != null) { + var replaceMedia = Services.ContentManager.Get(replaceId.Value); + if (replaceMedia == null) + return HttpNotFound(); + + viewModel.Replace = replaceMedia; + + if (!replaceMedia.TypeDefinition.Name.Equals("OEmbed")) + Services.Notifier.Error(T("Cannot replace {0} with OEmbed", replaceMedia.ContentItem.TypeDefinition.Name)); + } + return View(viewModel); } [HttpPost] [ActionName("Index")] [ValidateInput(false)] - public ActionResult IndexPOST(string folderPath, string url, string type, string title, string html, string thumbnail, string width, string height, string description) { - if (!Services.Authorizer.Authorize(Permissions.ManageOwnMedia)) - return new HttpUnauthorizedResult(); - - // Check permission. - var rootMediaFolder = _mediaLibraryService.GetRootMediaFolder(); - if (!Services.Authorizer.Authorize(Permissions.ManageMediaContent) && !_mediaLibraryService.CanManageMediaFolder(folderPath)) { - return new HttpUnauthorizedResult(); - } - + public ActionResult IndexPOST(string folderPath, string url, string type, string title, string html, string thumbnail, string width, string height, string description, int? replaceId) { var viewModel = new OEmbedViewModel { Url = url, - FolderPath = folderPath + FolderPath = folderPath, }; - var webClient = new WebClient {Encoding = Encoding.UTF8}; + if (replaceId != null) { + var replaceMedia = Services.ContentManager.Get(replaceId.Value); + if (replaceMedia == null) + return HttpNotFound(); + + viewModel.Replace = replaceMedia; + + if (!replaceMedia.ContentItem.TypeDefinition.Name.Equals("OEmbed")) { + Services.Notifier.Error(T("Cannot replace {0} with OEmbed", replaceMedia.ContentItem.TypeDefinition.Name)); + return View(viewModel); + } + } + + var webClient = new WebClient { Encoding = Encoding.UTF8 }; try { // @@ -120,12 +146,21 @@ namespace Orchard.MediaLibrary.Controllers { } [HttpPost, ValidateInput(false)] - public ActionResult MediaPost(string folderPath, string url, string document) { + public ActionResult Import(string folderPath, string url, string document) { + if (!Services.Authorizer.Authorize(Permissions.ManageOwnMedia)) { + return new HttpUnauthorizedResult(); + } + + // Check permission + if (!Services.Authorizer.Authorize(Permissions.ManageMediaContent) && !_mediaLibraryService.CanManageMediaFolder(folderPath)) { + return new HttpUnauthorizedResult(); + } + var content = XDocument.Parse(document); var oembed = content.Root; var part = Services.ContentManager.New("OEmbed"); - + part.MimeType = "text/html"; part.FolderPath = folderPath; part.LogicalType = "OEmbed"; @@ -151,13 +186,56 @@ namespace Orchard.MediaLibrary.Controllers { } Services.ContentManager.Create(oembedPart); + Services.Notifier.Information(T("Media imported successfully.")); } - var viewModel = new OEmbedViewModel { - FolderPath = folderPath - }; + return RedirectToAction("Index", new { folderPath = folderPath }); + } - return View("Index", viewModel); + [HttpPost, ValidateInput(false)] + public ActionResult Replace(int replaceId, string url, string document) { + if (!Services.Authorizer.Authorize(Permissions.ManageOwnMedia)) { + return new HttpUnauthorizedResult(); + } + + var replaceMedia = Services.ContentManager.Get(replaceId); + if (replaceMedia == null) + return HttpNotFound(); + + // Check permission + if (!Services.Authorizer.Authorize(Permissions.ManageMediaContent) && !_mediaLibraryService.CanManageMediaFolder(replaceMedia.FolderPath)) { + return new HttpUnauthorizedResult(); + } + + var content = XDocument.Parse(document); + var oembed = content.Root; + + if (oembed.Element("title") != null) { + replaceMedia.Title = oembed.Element("title").Value; + } + else { + replaceMedia.Title = oembed.Element("url").Value; + } + if (oembed.Element("description") != null) { + replaceMedia.Caption = oembed.Element("description").Value; + } + + var oembedPart = replaceMedia.As(); + + if (oembedPart != null) { + replaceMedia.ContentItem.Record.Infoset.Element.Element("OEmbedPart").Remove(); + + oembedPart.Source = url; + + foreach (var element in oembed.Elements()) { + oembedPart[element.Name.LocalName] = element.Value; + } + + Services.ContentManager.Publish(oembedPart.ContentItem); + Services.Notifier.Information(T("Media replaced successfully.")); + } + + return RedirectToAction("Index", new { folderPath = replaceMedia.FolderPath, replaceId = replaceMedia.Id }); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/WebSearchController.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/WebSearchController.cs index 4d5e930c9..4cce84264 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/WebSearchController.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/WebSearchController.cs @@ -7,63 +7,149 @@ using Orchard.MediaLibrary.Services; using Orchard.MediaLibrary.ViewModels; using Orchard.Themes; using Orchard.UI.Admin; +using Orchard.FileSystems.Media; +using Orchard.MediaLibrary.Models; +using System.Linq; +using Orchard.Localization; namespace Orchard.MediaLibrary.Controllers { [Admin, Themed(false)] public class WebSearchController : Controller { private readonly IMediaLibraryService _mediaLibraryService; private readonly IContentManager _contentManager; - + private readonly IMimeTypeProvider _mimeTypeProvider; + public WebSearchController( - IMediaLibraryService mediaManagerService, + IMediaLibraryService mediaManagerService, IContentManager contentManager, - IOrchardServices orchardServices) { + IOrchardServices orchardServices, + IMimeTypeProvider mimeTypeProvider) { _mediaLibraryService = mediaManagerService; _contentManager = contentManager; - + _mimeTypeProvider = mimeTypeProvider; Services = orchardServices; + T = NullLocalizer.Instance; } public IOrchardServices Services { get; set; } + public Localizer T { get; set; } - public ActionResult Index(string folderPath, string type) { - var viewModel = new ImportMediaViewModel { - FolderPath = folderPath, - Type = type - }; - - return View(viewModel); - } - - - [HttpPost] - public ActionResult ImagePost(string folderPath, string type, string url) { - if (!Services.Authorizer.Authorize(Permissions.ManageOwnMedia)) + public ActionResult Index(string folderPath, string type, int? replaceId = null) { + if (!Services.Authorizer.Authorize(Permissions.ManageOwnMedia)) { return new HttpUnauthorizedResult(); + } - // Check permission. - var rootMediaFolder = _mediaLibraryService.GetRootMediaFolder(); + // Check permission if (!Services.Authorizer.Authorize(Permissions.ManageMediaContent) && !_mediaLibraryService.CanManageMediaFolder(folderPath)) { return new HttpUnauthorizedResult(); } + var viewModel = new ImportMediaViewModel { + FolderPath = folderPath, + Type = type, + }; + + if (replaceId != null) { + var replaceMedia = Services.ContentManager.Get(replaceId.Value); + if (replaceMedia == null) + return HttpNotFound(); + + viewModel.Replace = replaceMedia; + } + + return View(viewModel); + } + + [HttpPost] + public ActionResult Import(string folderPath, string type, string url) { + if (!Services.Authorizer.Authorize(Permissions.ManageOwnMedia)) + return new HttpUnauthorizedResult(); + + // Check permission + if (!Services.Authorizer.Authorize(Permissions.ManageMediaContent) && !_mediaLibraryService.CanManageMediaFolder(folderPath)) { + return new HttpUnauthorizedResult(); + } + + var settings = Services.WorkContext.CurrentSite.As(); + var allowedExtensions = (settings.UploadAllowedFileTypeWhitelist ?? "") + .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) + .Where(x => x.StartsWith(".")); + try { + var filename = Path.GetFileName(url); + + // skip file if the allowed extensions is defined and doesn't match + if (allowedExtensions.Any()) { + if (!allowedExtensions.Any(e => filename.EndsWith(e, StringComparison.OrdinalIgnoreCase))) { + throw new Exception(T("This file type is not allowed: {0}", Path.GetExtension(filename)).Text); + } + } + var buffer = new WebClient().DownloadData(url); var stream = new MemoryStream(buffer); - - var mediaPart = _mediaLibraryService.ImportMedia(stream, folderPath, Path.GetFileName(url), type); + + var mediaPart = _mediaLibraryService.ImportMedia(stream, folderPath, filename, type); _contentManager.Create(mediaPart); - return new JsonResult { - Data = new {folderPath, MediaPath = mediaPart.FileName} - }; + return new JsonResult { Data = new { folderPath, MediaPath = mediaPart.FileName } }; + } - catch(Exception e) { - return new JsonResult { - Data = new { error= e.Message } - }; + catch (Exception e) { + return new JsonResult { Data = new { error = e.Message } }; + } + } + + [HttpPost] + public ActionResult Replace(int replaceId, string type, string url) { + if (!Services.Authorizer.Authorize(Permissions.ManageOwnMedia)) + return new HttpUnauthorizedResult(); + + var replaceMedia = Services.ContentManager.Get(replaceId); + if (replaceMedia == null) + return HttpNotFound(); + + // Check permission + if (!Services.Authorizer.Authorize(Permissions.ManageMediaContent) && !_mediaLibraryService.CanManageMediaFolder(replaceMedia.FolderPath)) { + return new HttpUnauthorizedResult(); + } + + var settings = Services.WorkContext.CurrentSite.As(); + var allowedExtensions = (settings.UploadAllowedFileTypeWhitelist ?? "") + .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) + .Where(x => x.StartsWith(".")); + + try { + var filename = Path.GetFileName(url); + + // skip file if the allowed extensions is defined and doesn't match + if (allowedExtensions.Any()) { + if (!allowedExtensions.Any(e => filename.EndsWith(e, StringComparison.OrdinalIgnoreCase))) { + throw new Exception(T("This file type is not allowed: {0}", Path.GetExtension(filename)).Text); + } + } + + var buffer = new WebClient().DownloadData(url); + var stream = new MemoryStream(buffer); + + var mimeType = _mimeTypeProvider.GetMimeType(filename); + + string replaceContentType = _mediaLibraryService.MimeTypeToContentType(stream, mimeType, type) ?? type; + if (!replaceContentType.Equals(replaceMedia.TypeDefinition.Name, StringComparison.OrdinalIgnoreCase)) + throw new Exception(T("Cannot replace {0} with {1}", replaceMedia.TypeDefinition.Name, replaceContentType).Text); + + _mediaLibraryService.DeleteFile(replaceMedia.FolderPath, replaceMedia.FileName); + _mediaLibraryService.UploadMediaFile(replaceMedia.FolderPath, replaceMedia.FileName, stream); + replaceMedia.MimeType = mimeType; + + // Force a publish event which will update relevant Media properties + replaceMedia.ContentItem.VersionRecord.Published = false; + Services.ContentManager.Publish(replaceMedia.ContentItem); + + return new JsonResult { Data = new { replaceMedia.FolderPath, MediaPath = replaceMedia.FileName } }; + } + catch (Exception e) { + return new JsonResult { Data = new { Success = false, error = e.Message } }; } - } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/MediaPartDriver.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/MediaPartDriver.cs index be304dfe9..47ab58a61 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/MediaPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/MediaPartDriver.cs @@ -60,6 +60,10 @@ namespace Orchard.MediaLibrary.Drivers { context.ImportAttribute(part.PartDefinition.Name, "FileName", fileName => part.FileName = fileName ); + + context.ImportAttribute(part.PartDefinition.Name, "LogicalType", logicalType => + part.LogicalType = logicalType + ); } protected override void Exporting(MediaPart part, ContentManagement.Handlers.ExportContentContext context) { @@ -68,6 +72,7 @@ namespace Orchard.MediaLibrary.Drivers { context.Element(part.PartDefinition.Name).SetAttributeValue("AlternateText", part.AlternateText); context.Element(part.PartDefinition.Name).SetAttributeValue("FolderPath", part.FolderPath); context.Element(part.PartDefinition.Name).SetAttributeValue("FileName", part.FileName); + context.Element(part.PartDefinition.Name).SetAttributeValue("LogicalType", part.LogicalType); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/AudioFactory.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/AudioFactory.cs index 54cefbe63..89a461842 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/AudioFactory.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/AudioFactory.cs @@ -57,13 +57,10 @@ namespace Orchard.MediaLibrary.Factories { part.Title = Path.GetFileNameWithoutExtension(path); var audioPart = part.As(); - if (audioPart == null) { return null; } - audioPart.Length = 0; - return part; } } diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/DocumentFactory.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/DocumentFactory.cs index e8d335485..e8c9fb261 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/DocumentFactory.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/DocumentFactory.cs @@ -27,7 +27,7 @@ namespace Orchard.MediaLibrary.Factories { return null; } } - + return new MediaFactorySelectorResult { Priority = -10, MediaFactory = new DocumentFactory(_contentManager) @@ -43,7 +43,6 @@ namespace Orchard.MediaLibrary.Factories { } public MediaPart CreateMedia(Stream stream, string path, string mimeType, string contentType) { - if (String.IsNullOrEmpty(contentType)) { contentType = "Document"; } @@ -55,12 +54,9 @@ namespace Orchard.MediaLibrary.Factories { part.Title = Path.GetFileNameWithoutExtension(path); var documentPart = part.As(); - if (documentPart == null) { return null; } - - documentPart.Length = stream.Length; return part; } diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/ImageFactory.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/ImageFactory.cs index 0455f7934..3ed45ae22 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/ImageFactory.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/ImageFactory.cs @@ -5,7 +5,6 @@ using System.Linq; using Orchard.ContentManagement; using Orchard.ContentManagement.MetaData; using Orchard.MediaLibrary.Models; -using Image = System.Drawing.Image; namespace Orchard.MediaLibrary.Factories { @@ -18,7 +17,6 @@ namespace Orchard.MediaLibrary.Factories { _contentDefinitionManager = contentDefinitionManager; } - public MediaFactorySelectorResult GetMediaFactory(Stream stream, string mimeType, string contentType) { if (!mimeType.StartsWith("image/")) { return null; @@ -38,7 +36,6 @@ namespace Orchard.MediaLibrary.Factories { Priority = -5, MediaFactory = new ImageFactory(_contentManager) }; - } } @@ -65,36 +62,7 @@ namespace Orchard.MediaLibrary.Factories { return null; } - try { - using (var image = Image.FromStream(stream)) { - imagePart.Width = image.Width; - imagePart.Height = image.Height; - } - } - catch (ArgumentException) { - // Still trying to get .ico dimensions when it's blocked in System.Drawing, see: https://github.com/OrchardCMS/Orchard/issues/4473 - - if (mimeType != "image/x-icon" && mimeType != "image/vnd.microsoft.icon") { - throw; - } - - TryFillDimensionsForIco(stream, imagePart); - } - return part; } - - private void TryFillDimensionsForIco(Stream stream, ImagePart imagePart) { - stream.Position = 0; - using (var binaryReader = new BinaryReader(stream)) { - // Reading out the necessary bytes that indicate the image dimensions. For the file format see: - // http://en.wikipedia.org/wiki/ICO_%28file_format%29 - // Reading out leading bytes containing unneded information. - binaryReader.ReadBytes(6); - // Reading out dimensions. If there are multiple icons bundled in the same file then this is the first image. - imagePart.Width = binaryReader.ReadByte(); - imagePart.Height = binaryReader.ReadByte(); - } - } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/VectorImageFactory.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/VectorImageFactory.cs index 63ab94784..8e23ee490 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/VectorImageFactory.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/VectorImageFactory.cs @@ -21,7 +21,7 @@ namespace Orchard.MediaLibrary.Factories { if (!mimeType.StartsWith("image/svg")) { return null; } - + if (!String.IsNullOrEmpty(contentType)) { var contentDefinition = _contentDefinitionManager.GetTypeDefinition(contentType); if (contentDefinition == null || contentDefinition.Parts.All(x => x.PartDefinition.Name != typeof(VectorImagePart).Name)) { diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/VideoFactory.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/VideoFactory.cs index ff45d822b..09b23f2e5 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/VideoFactory.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/VideoFactory.cs @@ -55,13 +55,10 @@ namespace Orchard.MediaLibrary.Factories { part.Title = Path.GetFileNameWithoutExtension(path); var videoPart = part.As(); - if (videoPart == null) { return null; } - videoPart.Length = 0; - return part; } } diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Handlers/MediaPartHandler.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Handlers/MediaPartHandler.cs index 69a62cb4c..0376feca3 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Handlers/MediaPartHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Handlers/MediaPartHandler.cs @@ -3,14 +3,20 @@ using Orchard.ContentManagement.Handlers; using Orchard.Data; using Orchard.MediaLibrary.Services; using Orchard.MediaLibrary.Models; +using System.IO; +using Orchard.FileSystems.Media; +using Orchard.ContentManagement; namespace Orchard.MediaLibrary.Handlers { public class MediaPartHandler : ContentHandler { private readonly IMediaLibraryService _mediaLibraryService; + private readonly IStorageProvider _storageProvider; public MediaPartHandler( + IStorageProvider storageProvider, IMediaLibraryService mediaLibraryService, IRepository repository) { + _storageProvider = storageProvider; _mediaLibraryService = mediaLibraryService; Filters.Add(StorageFilter.For(repository)); @@ -21,7 +27,7 @@ namespace Orchard.MediaLibrary.Handlers { } }); - OnIndexing((context, part) => + OnIndexing((context, part) => context.DocumentIndex .Add("media-folderpath", Normalize(part.FolderPath)).Store() .Add("media-filename", Normalize(part.FileName)).Store() @@ -30,22 +36,55 @@ namespace Orchard.MediaLibrary.Handlers { .Add("media-alternatetext", part.AlternateText).Analyze() ); + OnPublished((context, part) => { + var mediaPart = part.As(); + var file = _storageProvider.GetFile(_storageProvider.Combine(mediaPart.FolderPath, mediaPart.FileName)); + + using (var stream = file.OpenRead()) { + try { + using (var image = System.Drawing.Image.FromStream(stream)) { + part.Width = image.Width; + part.Height = image.Height; + } + } + catch (ArgumentException) { + // Still trying to get .ico dimensions when it's blocked in System.Drawing, see: https://github.com/OrchardCMS/Orchard/issues/4473 + if (mediaPart.MimeType != "image/x-icon" && mediaPart.MimeType != "image/vnd.microsoft.icon") + throw; + TryFillDimensionsForIco(stream, part); + } + } + }); + OnIndexing((context, part) => context.DocumentIndex .Add("image-height", part.Height).Analyze().Store() .Add("image-width", part.Width).Analyze().Store() ); + OnPublished((context, part) => { + var mediaPart = part.As(); + var file = _storageProvider.GetFile(_storageProvider.Combine(mediaPart.FolderPath, mediaPart.FileName)); + + using (var stream = file.OpenRead()) { + part.Length = stream.Length; + } + }); + OnIndexing((context, part) => context.DocumentIndex .Add("document-length", part.Length).Analyze().Store() ); + OnPublished((context, part) => part.Length = 0); + OnIndexing((context, part) => context.DocumentIndex .Add("video-length", part.Length).Analyze().Store() ); + OnPublished((context, part) => part.Length = 0); + OnIndexing((context, part) => context.DocumentIndex .Add("audio-length", part.Length).Analyze().Store() @@ -67,5 +106,18 @@ namespace Orchard.MediaLibrary.Handlers { // when not indexed with Analyze() searches are case sensitive return text.Replace("\\", "/").ToLowerInvariant(); } + + private void TryFillDimensionsForIco(Stream stream, ImagePart imagePart) { + stream.Position = 0; + using (var binaryReader = new BinaryReader(stream)) { + // Reading out the necessary bytes that indicate the image dimensions. For the file format see: + // http://en.wikipedia.org/wiki/ICO_%28file_format%29 + // Reading out leading bytes containing unneded information. + binaryReader.ReadBytes(6); + // Reading out dimensions. If there are multiple icons bundled in the same file then this is the first image. + imagePart.Width = binaryReader.ReadByte(); + imagePart.Height = binaryReader.ReadByte(); + } + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Scripts/media-library.js b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Scripts/media-library.js index bd59e82fc..fb1d5f342 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Scripts/media-library.js +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Scripts/media-library.js @@ -327,6 +327,17 @@ $(function () { window.location = url; }; + self.replaceMedia = function (item) { + var url = settings.replaceUrl; + var ids = []; + var folder = ""; + if (self.displayed()) { + folder = self.displayed(); + } + viewModel.selection().forEach(function (item) { ids.push(item.data.id); }); + var actionurl = url + '?folderPath=' + encodeURIComponent(folder) + "&replaceId=" + encodeURIComponent(ids[0]); + window.location = actionurl; + } var selectFolderOrRecent = function () { if (self.displayed()) { self.selectFolder(self.displayed()); diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Services/IMediaLibraryService.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Services/IMediaLibraryService.cs index 03bf6b382..092876cf6 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Services/IMediaLibraryService.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Services/IMediaLibraryService.cs @@ -167,5 +167,26 @@ namespace Orchard.MediaLibrary.Services { return folderPath; } + + public static string MimeTypeToContentType(this IMediaLibraryService service, Stream stream, string mimeType, string contentType) { + var mediaFactory = service.GetMediaFactory(stream, mimeType, contentType); + if (mediaFactory == null) + return null; + + switch (mediaFactory.GetType().Name) { + case "ImageFactory": + return "Image"; + case "AudioFactory": + return "Audio"; + case "DocumentFactory": + return "Document"; + case "VectorImageFactory": + return "VectorImage"; + case "VideoFactory": + return "Video"; + default: + return null; + } + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Services/MediaLibraryService.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Services/MediaLibraryService.cs index 082191121..01aec9503 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Services/MediaLibraryService.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Services/MediaLibraryService.cs @@ -174,6 +174,8 @@ namespace Orchard.MediaLibrary.Services { using (var stream = storageFile.OpenRead()) { var mediaFactory = GetMediaFactory(stream, mimeType, contentType); + if (mediaFactory == null) + throw new Exception(T("No media factory available to handle this resource.").Text); var mediaPart = mediaFactory.CreateMedia(stream, mediaFile.Name, mimeType, contentType); if (mediaPart != null) { mediaPart.FolderPath = relativePath; diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Styles/orchard-oembed-admin.css b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Styles/orchard-oembed-admin.css index 12e9e7327..2a015e42b 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Styles/orchard-oembed-admin.css +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Styles/orchard-oembed-admin.css @@ -46,4 +46,23 @@ border-top-left-radius: 0; border-bottom-left-radius: 0; font-size: 18px; +} + +/* Messages */ +.message { + margin:10px 0 4px 0; + padding:4px; + clear:both; +} + +.message-Information { + background:#e6f1c9; /* green */ + border:1px solid #cfe493; + color:#062232; +} + +.message-Error { + background:#e68585; /* red */ + border:1px solid #990808; + color:#fff; } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/ImportMediaViewModel.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/ImportMediaViewModel.cs index e0916cf5b..96f674315 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/ImportMediaViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/ImportMediaViewModel.cs @@ -1,6 +1,9 @@ -namespace Orchard.MediaLibrary.ViewModels { +using Orchard.MediaLibrary.Models; + +namespace Orchard.MediaLibrary.ViewModels { public class ImportMediaViewModel { public string FolderPath { get; set; } public string Type { get; set; } + public MediaPart Replace { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/MediaManagerImportViewModel.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/MediaManagerImportViewModel.cs index ce4ead84c..2d9ae2a42 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/MediaManagerImportViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/MediaManagerImportViewModel.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using Orchard.ContentManagement.MetaData.Models; using Orchard.UI.Navigation; +using Orchard.MediaLibrary.Models; namespace Orchard.MediaLibrary.ViewModels { public class MediaManagerImportViewModel { @@ -8,5 +9,6 @@ namespace Orchard.MediaLibrary.ViewModels { public IEnumerable ImageSets { get; set; } public string FolderPath { get; set; } public IEnumerable MediaTypes { get; set; } + public MediaPart Replace { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/MediaManagerMediaItemsViewModel.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/MediaManagerMediaItemsViewModel.cs index baf47daa6..5a546201b 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/MediaManagerMediaItemsViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/MediaManagerMediaItemsViewModel.cs @@ -12,5 +12,4 @@ namespace Orchard.MediaLibrary.ViewModels { public MediaPart MediaPart { get; set; } public dynamic Shape { get; set; } } - } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/OEmbedViewModel.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/OEmbedViewModel.cs index c9d81746c..6d5a1eb44 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/OEmbedViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/OEmbedViewModel.cs @@ -1,11 +1,11 @@ -using System.Xml.Linq; +using Orchard.MediaLibrary.Models; +using System.Xml.Linq; namespace Orchard.MediaLibrary.ViewModels { public class OEmbedViewModel { public string FolderPath { get; set; } public string Url { get; set; } public XDocument Content { get; set; } - public bool Success { get; set; } - public string Type { get; set; } + public MediaPart Replace { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Admin/Import.cshtml b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Admin/Import.cshtml index 20e7e24c9..abc3ac650 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Admin/Import.cshtml +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Admin/Import.cshtml @@ -18,16 +18,15 @@
- - + - - @T("Close") + + @T("Close")
@Html.ActionLink(T("Media Library").ToString(), "Index", "Admin", new { area = "Orchard.MediaLibrary" }, null) @@ -37,11 +36,15 @@
- @foreach (var menuItem in Model.Menu) { + @foreach (var menuItem in Model.Menu) + { string sectionHeaderTextHint = menuItem.Text.TextHint; var itemClassName = "navicon-" + sectionHeaderTextHint.HtmlClassify(); - - + if (Model.Replace == null) { + + } else { + + } }
diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Admin/Index.cshtml b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Admin/Index.cshtml index 0b16a8a00..159d6c119 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Admin/Index.cshtml +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Admin/Index.cshtml @@ -68,6 +68,7 @@
+
@@ -96,11 +97,13 @@ var mediaLibrarySettings = { moveActionUrl: '@Url.Action("Move", "Folder", new {area = "Orchard.MediaLibrary"})', deleteActionUrl: '@Url.Action("Delete", "Admin", new {area = "Orchard.MediaLibrary"})', cloneActionUrl: '@Url.Action("Clone", "Admin", new {area = "Orchard.MediaLibrary"})', + replaceUrl: '@Url.Action("Import", "Admin", new {area = "Orchard.MediaLibrary" })' , hasFolderPath: @(!string.IsNullOrEmpty(viewModel.FolderPath) ? "true" : "false"), folderPath: '@HttpUtility.JavaScriptStringEncode(viewModel.FolderPath)', rootFolderPath: '@HttpUtility.JavaScriptStringEncode(viewModel.RootFolderPath ?? "")', deleteConfirmationMessage: '@HttpUtility.JavaScriptStringEncode(T("Are you sure you want to delete these media items ?").Text)', cloneConfirmationMessage: '@HttpUtility.JavaScriptStringEncode(T("Are you sure you want to clone this media item ?").Text)', + replaceConfirmationMessage: '@HttpUtility.JavaScriptStringEncode(T("Are you sure you want to replace this media item ?").Text)', errorMessage: '@HttpUtility.JavaScriptStringEncode(T("An unexpected error occured, please refresh the page and try again.").Text)', antiForgeryToken: '@Html.AntiForgeryTokenValueOrchard()', childFolders: (@Display.Partial(TemplateName: "ChildFolders", Model: viewModel.ChildFoldersViewModel))['childFolders'] diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/ClientStorage/Index.cshtml b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/ClientStorage/Index.cshtml index 3f79ee4c6..cf1d393db 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/ClientStorage/Index.cshtml +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/ClientStorage/Index.cshtml @@ -1,5 +1,4 @@ @model Orchard.MediaLibrary.ViewModels.ImportMediaViewModel - @@ -21,11 +20,10 @@ @Display.StyleSheetLinks() -
@T("Click here, Drop files or Paste images")
- + multiple="multiple" } >
  • @@ -36,15 +34,12 @@
-
-
- - - @using(Script.Foot()) { + + @using (Script.Foot()) { } diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/OEmbed/Index.cshtml b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/OEmbed/Index.cshtml index 39889b802..25c730404 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/OEmbed/Index.cshtml +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/OEmbed/Index.cshtml @@ -46,14 +46,18 @@ @Display.StyleSheetLinks() -
+ @if (Layout.Messages != null) { +
+ @Display(Layout.Messages) +
+ }
@using (Html.BeginFormAntiForgeryPost()) {
@T("Please enter the URL of the embeddable media you want to integrate (requires an oEmbed compatible media provider such as YouTube):")
- +
@@ -126,15 +130,24 @@
} - using (Html.BeginFormAntiForgeryPost(Url.Action("MediaPost"))) { - @Html.Hidden("url", Model.Url) - @Html.Hidden("folderPath", Model.FolderPath) - @Html.Hidden("document", Model.Content.ToString()) -
- + if (Model.Replace == null) { + using (Html.BeginFormAntiForgeryPost(Url.Action("Import"))) { + @Html.Hidden("folderPath", Model.FolderPath) + @Html.Hidden("url", Model.Url) + @Html.Hidden("document", Model.Content.ToString()) +
+ + } + } else { + using (Html.BeginFormAntiForgeryPost(Url.Action("Replace"), FormMethod.Post, new { onsubmit = "window.parent.$('a.button.close')[0].click();" })) { + @Html.Hidden("replaceId", Model.Replace) + @Html.Hidden("url", Model.Url) + @Html.Hidden("document", Model.Content.ToString()) +
+ + } } } -
@Display.FootScripts() diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Parts/Media.Actions.cshtml b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Parts/Media.Actions.cshtml index 476ce0619..e65370b4d 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Parts/Media.Actions.cshtml +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Parts/Media.Actions.cshtml @@ -27,7 +27,9 @@ var self = $(this); var href = self.attr('href'); var containsQueryString = href.indexOf("?") >= 0; + if (href.indexOf("returnUrl") == -1) { var returnUrl = href + (containsQueryString ? "&" : "?") + "returnUrl=" + encodeURIComponent(window.location); + } self.attr('href', returnUrl); }); //]]> diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Parts/Media.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Parts/Media.SummaryAdmin.cshtml index 6182a22c5..bb29e8806 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Parts/Media.SummaryAdmin.cshtml +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Parts/Media.SummaryAdmin.cshtml @@ -11,7 +11,7 @@ @if (HasText(mediaUrl)) { }
diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/WebSearch/Index.cshtml b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/WebSearch/Index.cshtml index a9ea2ee33..409caf9d7 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/WebSearch/Index.cshtml +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/WebSearch/Index.cshtml @@ -70,12 +70,12 @@

@T("SELECTION")

- +
  • -
    +
  • @@ -83,42 +83,38 @@
- @Html.Hidden("antiforgerytoken", Html.AntiForgeryTokenValueOrchard()) - @Html.Hidden("action", Url.Action("ImagePost")) - @Html.Hidden("folderPath", Model.FolderPath) - @Html.Hidden("type", Model.Type) - @using(Script.Foot()) { } diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 02187c3eb..bac59dfe2 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -933,7 +933,9 @@ - + + ASPXCodeBehind + @@ -1013,7 +1015,9 @@ - + + ASPXCodeBehind +