From b9b4721295125ca16a481e2a2bfd83ff906887d6 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Mon, 19 Aug 2019 14:36:56 +0100 Subject: [PATCH] * Adds TinyMCE JS assets into init page load via script in default.cshtml view for Umbraco backoffice ng-app * Add TinyMCE JS assets array via NG app.value & uses assetsService to load (if not loaded in time by main init script above) --- .../propertyeditors/rte/rte.controller.js | 8 ++--- .../Umbraco/Views/Default.cshtml | 3 ++ .../Editors/BackOfficeController.cs | 23 ++++++++++++++ .../HtmlHelperBackOfficeExtensions.cs | 16 ++++++++++ .../JavaScript/JsInitialization.cs | 31 +++++++++++++++++++ .../JavaScript/Resources.Designer.cs | 12 +++++++ src/Umbraco.Web/JavaScript/Resources.resx | 5 ++- .../JavaScript/TinyMceInitialize.js | 19 ++++++++++++ src/Umbraco.Web/Umbraco.Web.csproj | 1 + 9 files changed, 113 insertions(+), 5 deletions(-) create mode 100644 src/Umbraco.Web/JavaScript/TinyMceInitialize.js 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 52b105201e..48170fb4b7 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 @@ -1,6 +1,6 @@ angular.module("umbraco") .controller("Umbraco.PropertyEditors.RTEController", - function ($scope, $q, assetsService, $timeout, tinyMceService, angularHelper) { + function ($scope, $q, assetsService, $timeout, tinyMceService, angularHelper, tinyMceAssets) { // TODO: A lot of the code below should be shared between the grid rte and the normal rte @@ -30,9 +30,9 @@ angular.module("umbraco") var promises = []; //queue file loading - if (typeof tinymce === "undefined") { // Don't reload tinymce if already loaded - promises.push(assetsService.loadJs("lib/tinymce/tinymce.min.js", $scope)); - } + tinyMceAssets.forEach(function (tinyJsAsset) { + promises.push(assetsService.loadJs(tinyJsAsset, $scope)); + }); //stores a reference to the editor var tinyMceEditor = null; diff --git a/src/Umbraco.Web.UI/Umbraco/Views/Default.cshtml b/src/Umbraco.Web.UI/Umbraco/Views/Default.cshtml index 3574d5d175..00ab8e0166 100644 --- a/src/Umbraco.Web.UI/Umbraco/Views/Default.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/Views/Default.cshtml @@ -119,6 +119,8 @@ document.angularReady = function(app) { @Html.AngularValueExternalLoginInfoScript(ViewData.GetExternalSignInError()) @Html.AngularValueResetPasswordCodeInfoScript(ViewData["PasswordResetCode"]) + @Html.AngularValueTinyMceAssets() + //required for the noscript trick document.getElementById("mainwrapper").style.display = "inherit"; } @@ -126,6 +128,7 @@ + @if (isDebug) { diff --git a/src/Umbraco.Web/Editors/BackOfficeController.cs b/src/Umbraco.Web/Editors/BackOfficeController.cs index 34022f8f9f..72a9d6f6b1 100644 --- a/src/Umbraco.Web/Editors/BackOfficeController.cs +++ b/src/Umbraco.Web/Editors/BackOfficeController.cs @@ -28,6 +28,7 @@ using Umbraco.Web.JavaScript; using Umbraco.Web.Security; using Constants = Umbraco.Core.Constants; using JArray = Newtonsoft.Json.Linq.JArray; +using System.Text; namespace Umbraco.Web.Editors { @@ -210,6 +211,28 @@ namespace Umbraco.Web.Editors return JavaScript(result); } + [MinifyJavaScriptResult(Order = 0)] + [OutputCache(Order = 1, VaryByParam = "none", Location = OutputCacheLocation.Server, Duration = 5000)] + public JavaScriptResult TinyMceEditor() + { + var files = JsInitialization.OptimizeTinyMceScriptFiles(HttpContext); + + var rawJS = new StringBuilder(); + rawJS.AppendLine("LazyLoad.js(["); + var first = true; + foreach (var file in files) + { + if (first) first = false; + else rawJS.AppendLine(","); + rawJS.Append("\""); + rawJS.Append(file); + rawJS.Append("\""); + + } + rawJS.Append("]);"); + return JavaScript(rawJS.ToString()); + } + /// /// Returns a js array of all of the manifest assets /// diff --git a/src/Umbraco.Web/HtmlHelperBackOfficeExtensions.cs b/src/Umbraco.Web/HtmlHelperBackOfficeExtensions.cs index 26a1d97f67..1d518fa1d3 100644 --- a/src/Umbraco.Web/HtmlHelperBackOfficeExtensions.cs +++ b/src/Umbraco.Web/HtmlHelperBackOfficeExtensions.cs @@ -13,6 +13,7 @@ using Umbraco.Web.Models; namespace Umbraco.Web { using Core.Configuration; + using Umbraco.Web.JavaScript; /// /// HtmlHelper extensions for the back office @@ -118,6 +119,21 @@ namespace Umbraco.Web sb.AppendLine(JsonConvert.SerializeObject(resetCodeModel)); sb.AppendLine(@"});"); + return html.Raw(sb.ToString()); + } + + public static IHtmlString AngularValueTinyMceAssets(this HtmlHelper html) + { + var ctx = new HttpContextWrapper(HttpContext.Current); + var files = JsInitialization.OptimizeTinyMceScriptFiles(ctx); + + var sb = new StringBuilder(); + + sb.AppendLine(@"app.value(""tinyMceAssets"","); + sb.AppendLine(JsonConvert.SerializeObject(files)); + sb.AppendLine(@");"); + + return html.Raw(sb.ToString()); } } diff --git a/src/Umbraco.Web/JavaScript/JsInitialization.cs b/src/Umbraco.Web/JavaScript/JsInitialization.cs index 638b1bf5b4..b8726e73c3 100644 --- a/src/Umbraco.Web/JavaScript/JsInitialization.cs +++ b/src/Umbraco.Web/JavaScript/JsInitialization.cs @@ -60,6 +60,26 @@ namespace Umbraco.Web.JavaScript return WriteScript(jarray.ToString(), IOHelper.ResolveUrl(SystemDirectories.Umbraco), angularModule); } + public static string GetTinyJavascriptInitialization(HttpContextBase httpContext, IEnumerable scripts) + { + var rawJs = new StringBuilder(); + rawJs.AppendLine("LazyLoad.js(["); + + var first = true; + foreach (var file in scripts) + { + if (first) first = false; + else rawJs.AppendLine(","); + rawJs.Append("\""); + rawJs.Append(file); + rawJs.Append("\""); + + } + rawJs.Append("]);"); + + return rawJs.ToString(); + } + /// /// Returns a list of optimized script paths for the back office /// @@ -131,6 +151,17 @@ namespace Umbraco.Web.JavaScript return resources.Where(x => x.Type == JTokenType.String).Select(x => x.ToString()); } + internal static IEnumerable GetTinyMceInitialization() + { + var resources = JsonConvert.DeserializeObject(Resources.TinyMceInitialize); + return resources.Where(x => x.Type == JTokenType.String).Select(x => x.ToString()); + } + + internal static IEnumerable OptimizeTinyMceScriptFiles(HttpContextBase httpContext) + { + return OptimizeScriptFiles(httpContext, GetTinyMceInitialization()); + } + /// /// Parses the JsResources.Main and replaces the replacement tokens accordingly. /// diff --git a/src/Umbraco.Web/JavaScript/Resources.Designer.cs b/src/Umbraco.Web/JavaScript/Resources.Designer.cs index ca571b1186..f11839f6ca 100644 --- a/src/Umbraco.Web/JavaScript/Resources.Designer.cs +++ b/src/Umbraco.Web/JavaScript/Resources.Designer.cs @@ -146,5 +146,17 @@ namespace Umbraco.Web.JavaScript { return ResourceManager.GetString("ServerVariables", resourceCulture); } } + + /// + /// Looks up a localized string similar to [ + /// '../lib/tinymce/tinymce.min.js', + ///] + ///. + /// + internal static string TinyMceInitialize { + get { + return ResourceManager.GetString("TinyMceInitialize", resourceCulture); + } + } } } diff --git a/src/Umbraco.Web/JavaScript/Resources.resx b/src/Umbraco.Web/JavaScript/Resources.resx index 95526f51e7..1adcaeeb4a 100644 --- a/src/Umbraco.Web/JavaScript/Resources.resx +++ b/src/Umbraco.Web/JavaScript/Resources.resx @@ -130,4 +130,7 @@ servervariables.js;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 - + + TinyMceInitialize.js;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + + \ No newline at end of file diff --git a/src/Umbraco.Web/JavaScript/TinyMceInitialize.js b/src/Umbraco.Web/JavaScript/TinyMceInitialize.js new file mode 100644 index 0000000000..1ffcce4a59 --- /dev/null +++ b/src/Umbraco.Web/JavaScript/TinyMceInitialize.js @@ -0,0 +1,19 @@ +[ + 'lib/tinymce/tinymce.min.js', + + 'lib/tinymce/langs/en_us.js', + + 'lib/tinymce/plugins/paste/plugin.min.js', + 'lib/tinymce/plugins/anchor/plugin.min.js', + 'lib/tinymce/plugins/charmap/plugin.min.js', + 'lib/tinymce/plugins/table/plugin.min.js', + 'lib/tinymce/plugins/lists/plugin.min.js', + 'lib/tinymce/plugins/advlist/plugin.min.js', + 'lib/tinymce/plugins/hr/plugin.min.js', + 'lib/tinymce/plugins/autolink/plugin.min.js', + 'lib/tinymce/plugins/directionality/plugin.min.js', + 'lib/tinymce/plugins/tabfocus/plugin.min.js', + 'lib/tinymce/plugins/searchreplace/plugin.min.js', + 'lib/tinymce/plugins/fullscreen/plugin.min.js', + 'lib/tinymce/plugins/noneditable/plugin.min.js' +] diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index dc06222209..36712a198c 100755 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -1205,6 +1205,7 @@ +