From bc7bbea6507c4d5ed3345d16b7403216780dd1e2 Mon Sep 17 00:00:00 2001 From: Tim Geyssens Date: Fri, 13 Sep 2013 13:46:19 +0200 Subject: [PATCH 1/5] Initial checkin of the rte embed option --- .../src/common/services/dialog.service.js | 13 ++++ .../views/common/dialogs/embed.controller.js | 23 ++++++ .../src/views/common/dialogs/embed.html | 35 +++++++++ .../propertyeditors/rte/rte.controller.js | 17 ++++- src/Umbraco.Web/Editors/EmbedController.cs | 76 +++++++++++++++++++ src/Umbraco.Web/Umbraco.Web.csproj | 1 + 6 files changed, 163 insertions(+), 2 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.controller.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.html create mode 100644 src/Umbraco.Web/Editors/EmbedController.cs diff --git a/src/Umbraco.Web.UI.Client/src/common/services/dialog.service.js b/src/Umbraco.Web.UI.Client/src/common/services/dialog.service.js index bb51ca6c7a..bc8961da09 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/dialog.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/dialog.service.js @@ -376,6 +376,19 @@ angular.module('umbraco.services') return openDialog(options); }, + /** + * @ngdoc method + * @name umbraco.services.dialogService#ysodDialog + * @methodOf umbraco.services.dialogService + * + * @description + * Opens a dialog to an embed dialog + */ + embedDialog: function (options) { + options.template = 'views/common/dialogs/embed.html'; + options.show = true; + return openDialog(options); + }, /** * @ngdoc method * @name umbraco.services.dialogService#ysodDialog diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.controller.js new file mode 100644 index 0000000000..38d147edcf --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.controller.js @@ -0,0 +1,23 @@ +angular.module("umbraco").controller("Umbraco.Dialogs.EmbedController", function ($scope, $http) { + $scope.url = ""; + $scope.width = 500; + $scope.height = 300; + $scope.constrain = true; + $scope.preview = ""; + + $scope.showPreview = function () { + + $http({ method: 'POST', url: '/umbraco/UmbracoApi/Embed/Embed', params: { url: $scope.url, width: $scope.width, height: $scope.height } }) + .success(function (data) { + $scope.preview = data.Markup; + }) + .error(function () { + + }); + + }; + + $scope.insert = function () { + $scope.submit($scope.preview); + }; +}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.html b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.html new file mode 100644 index 0000000000..c27c9e8f3e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.html @@ -0,0 +1,35 @@ +
+ + +
+
+
+ +
+
+
+ + +
+
+
+ + + + + + + + x + + + + +
+ +
+
+
+
+ +
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.controller.js index b93e860a82..13c0d72f85 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.controller.js @@ -11,7 +11,7 @@ angular.module("umbraco") menubar : false, statusbar: false, height: 340, - toolbar: "bold italic | styleselect | alignleft aligncenter alignright | bullist numlist | outdent indent | link image mediapicker iconpicker", + toolbar: "bold italic | styleselect | alignleft aligncenter alignright | bullist numlist | outdent indent | link image mediapicker iconpicker embeddialog", setup : function(editor) { @@ -69,7 +69,20 @@ angular.module("umbraco") editor.insertContent(i); }}); } - }); + }); + + + editor.addButton('embeddialog', { + icon: 'media', + tooltip: 'Embed', + onclick: function () { + dialogService.embedDialog({ + scope: $scope, callback: function (data) { + editor.insertContent(data); + } + }); + } + }); } }); diff --git a/src/Umbraco.Web/Editors/EmbedController.cs b/src/Umbraco.Web/Editors/EmbedController.cs new file mode 100644 index 0000000000..b84fdff99f --- /dev/null +++ b/src/Umbraco.Web/Editors/EmbedController.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Xml; +using Umbraco.Core.Configuration; +using Umbraco.Web.Mvc; +using Umbraco.Web.WebApi.Filters; +using Constants = Umbraco.Core.Constants; +using Umbraco.Core.Media; +using System.IO; + +namespace Umbraco.Web.Editors +{ + [PluginController("UmbracoApi")] + public class EmbedController : UmbracoAuthorizedJsonController + { + public Result Embed(string url, int width, int height) + { + var result = new Result(); + + //todo cache embed doc + var xmlConfig = new XmlDocument(); + xmlConfig.Load(GlobalSettings.FullpathToRoot + Path.DirectorySeparatorChar + "config" + Path.DirectorySeparatorChar + "EmbeddedMedia.config"); + + foreach (XmlNode node in xmlConfig.SelectNodes("//provider")) + { + var regexPattern = new Regex(node.SelectSingleNode("./urlShemeRegex").InnerText, RegexOptions.IgnoreCase); + + if (regexPattern.IsMatch(url)) + { + var prov = (IEmbedProvider)Activator.CreateInstance(Type.GetType(node.Attributes["type"].Value)); + + if (node.Attributes["supportsDimensions"] != null) + result.SupportsDimensions = node.Attributes["supportsDimensions"].Value == "True"; + else + result.SupportsDimensions = prov.SupportsDimensions; + + var settings = node.ChildNodes.Cast().ToDictionary(settingNode => settingNode.Name); + + foreach (var prop in prov.GetType().GetProperties().Where(prop => prop.IsDefined(typeof(ProviderSetting), true))) + { + + if (settings.Any(s => s.Key.ToLower() == prop.Name.ToLower())) + { + var setting = settings.FirstOrDefault(s => s.Key.ToLower() == prop.Name.ToLower()).Value; + var settingType = typeof(Media.EmbedProviders.Settings.String); + + if (setting.Attributes["type"] != null) + settingType = Type.GetType(setting.Attributes["type"].Value); + + var settingProv = (IEmbedSettingProvider)Activator.CreateInstance(settingType); + prop.SetValue(prov, settingProv.GetSetting(settings.FirstOrDefault(s => s.Key.ToLower() == prop.Name.ToLower()).Value), null); + } + } + try + { + result.Markup = prov.GetMarkup(url, width, height); + result.Status = Status.Success; + } + catch + { + result.Status = Status.Error; + } + + return result; + } + } + + result.Status = Status.NotSupported; + return result; + } + } +} diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 565e298c46..f8acec4882 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -304,6 +304,7 @@ + From dd4b094b66ce926c3f96c9e7fdeed7053bbb3004 Mon Sep 17 00:00:00 2001 From: Tim Geyssens Date: Fri, 13 Sep 2013 13:54:15 +0200 Subject: [PATCH 2/5] Adds a comment to the embed controller --- src/Umbraco.Web/Editors/EmbedController.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Umbraco.Web/Editors/EmbedController.cs b/src/Umbraco.Web/Editors/EmbedController.cs index b84fdff99f..15dfd51a97 100644 --- a/src/Umbraco.Web/Editors/EmbedController.cs +++ b/src/Umbraco.Web/Editors/EmbedController.cs @@ -14,6 +14,9 @@ using System.IO; namespace Umbraco.Web.Editors { + /// + /// A controller used for the embed dialog + /// [PluginController("UmbracoApi")] public class EmbedController : UmbracoAuthorizedJsonController { From d3f1d6bb6bd2906e4a31810153a25132f0c3164c Mon Sep 17 00:00:00 2001 From: Tim Geyssens Date: Fri, 13 Sep 2013 14:06:56 +0200 Subject: [PATCH 3/5] Small change to embed controller js --- .../src/views/common/dialogs/embed.controller.js | 2 +- src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.controller.js index 38d147edcf..fab4bde322 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.controller.js @@ -5,7 +5,7 @@ $scope.constrain = true; $scope.preview = ""; - $scope.showPreview = function () { + $scope.preview = function () { $http({ method: 'POST', url: '/umbraco/UmbracoApi/Embed/Embed', params: { url: $scope.url, width: $scope.width, height: $scope.height } }) .success(function (data) { diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.html b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.html index c27c9e8f3e..f2c5048883 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.html @@ -15,7 +15,7 @@
- + From 2a16e05699b4342329f9e207a106f9160642106c Mon Sep 17 00:00:00 2001 From: Tim Geyssens Date: Fri, 13 Sep 2013 14:13:58 +0200 Subject: [PATCH 4/5] Some more small changes to the embed dialog --- .../views/common/dialogs/embed.controller.js | 20 ++++++++++++------- .../src/views/common/dialogs/embed.html | 2 +- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.controller.js index fab4bde322..e6c1e58a97 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.controller.js @@ -4,16 +4,22 @@ $scope.height = 300; $scope.constrain = true; $scope.preview = ""; - + $scope.success = false; + $scope.preview = function () { + if ($scope.url != "") { + $scope.success = false; - $http({ method: 'POST', url: '/umbraco/UmbracoApi/Embed/Embed', params: { url: $scope.url, width: $scope.width, height: $scope.height } }) - .success(function (data) { - $scope.preview = data.Markup; - }) - .error(function () { + $http({ method: 'POST', url: '/umbraco/UmbracoApi/Embed/Embed', params: { url: $scope.url, width: $scope.width, height: $scope.height } }) + .success(function(data) { + $scope.preview = data.Markup; + $scope.success = true; + }) + .error(function() { - }); + }); + + } }; diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.html b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.html index f2c5048883..d76e5b52a7 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.html @@ -4,7 +4,7 @@
- +
From 34bc27745eef155b7c7642c98bb35f4f7f54ec68 Mon Sep 17 00:00:00 2001 From: Tim Geyssens Date: Fri, 13 Sep 2013 14:22:01 +0200 Subject: [PATCH 5/5] Adds loader animation --- .../src/views/common/dialogs/embed.controller.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.controller.js index e6c1e58a97..9082dc5326 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/embed.controller.js @@ -7,7 +7,11 @@ $scope.success = false; $scope.preview = function () { + if ($scope.url != "") { + + $scope.preview = "
"; + $scope.success = false; $http({ method: 'POST', url: '/umbraco/UmbracoApi/Embed/Embed', params: { url: $scope.url, width: $scope.width, height: $scope.height } }) @@ -16,7 +20,7 @@ $scope.success = true; }) .error(function() { - + $scope.preview = ""; }); }