diff --git a/src/Umbraco.Core/Manifest/ManifestParser.cs b/src/Umbraco.Core/Manifest/ManifestParser.cs index e1489a6d75..47dbfacb45 100644 --- a/src/Umbraco.Core/Manifest/ManifestParser.cs +++ b/src/Umbraco.Core/Manifest/ManifestParser.cs @@ -128,7 +128,14 @@ namespace Umbraco.Core.Manifest { throw new FormatException("The manifest is not formatted correctly contains more than one 'javascript' element"); } - + + //validate the css + var cssinit = deserialized.Properties().Where(x => x.Name == "stylesheet").ToArray(); + if (cssinit.Length > 1) + { + throw new FormatException("The manifest is not formatted correctly contains more than one 'stylesheet' element"); + } + //validate the property editors section var propEditors = deserialized.Properties().Where(x => x.Name == "propertyEditors").ToArray(); if (propEditors.Length > 1) @@ -139,6 +146,9 @@ namespace Umbraco.Core.Manifest var jConfig = init.Any() ? (JArray)deserialized["javascript"] : new JArray(); ReplaceVirtualPaths(jConfig); + var cssConfig = cssinit.Any() ? (JArray)deserialized["stylesheet"] : new JArray(); + ReplaceVirtualPaths(cssConfig); + //replace virtual paths for each property editor if (deserialized["propertyEditors"] != null) { @@ -158,6 +168,7 @@ namespace Umbraco.Core.Manifest var manifest = new PackageManifest() { JavaScriptInitialize = jConfig, + StyleSheetInitialize = cssConfig, PropertyEditors = propEditors.Any() ? (JArray)deserialized["propertyEditors"] : new JArray(), ParameterEditors = propEditors.Any() ? (JArray)deserialized["parameterEditors"] : new JArray() }; diff --git a/src/Umbraco.Core/Manifest/PackageManifest.cs b/src/Umbraco.Core/Manifest/PackageManifest.cs index 7bf4a7c274..4426bb36fb 100644 --- a/src/Umbraco.Core/Manifest/PackageManifest.cs +++ b/src/Umbraco.Core/Manifest/PackageManifest.cs @@ -12,6 +12,11 @@ namespace Umbraco.Core.Manifest /// public JArray JavaScriptInitialize { get; set; } + /// + /// The json array used to initialize the application with the CSS dependencies required + /// + public JArray StyleSheetInitialize { get; set; } + /// /// The json array of property editors /// diff --git a/src/Umbraco.Web/Editors/BackOfficeController.cs b/src/Umbraco.Web/Editors/BackOfficeController.cs index 8c17fcc663..a8a5dc2a63 100644 --- a/src/Umbraco.Web/Editors/BackOfficeController.cs +++ b/src/Umbraco.Web/Editors/BackOfficeController.cs @@ -34,8 +34,13 @@ namespace Umbraco.Web.Editors { var plugins = new DirectoryInfo(Server.MapPath("~/App_Plugins")); var parser = new ManifestParser(plugins); - var requireJs = new JsInitialization(parser); - var result = requireJs.GetJavascriptInitialization(JsInitialization.GetDefaultInitialization()); + var initJs = new JsInitialization(parser); + var initCss = new CssInitialization(parser); + + + var result = initJs.GetJavascriptInitialization(JsInitialization.GetDefaultInitialization()); + result += initCss.GetStylesheetInitialization(); + return JavaScript(result); } diff --git a/src/Umbraco.Web/UI/JavaScript/CssInitialization.cs b/src/Umbraco.Web/UI/JavaScript/CssInitialization.cs new file mode 100644 index 0000000000..d7b486c46f --- /dev/null +++ b/src/Umbraco.Web/UI/JavaScript/CssInitialization.cs @@ -0,0 +1,51 @@ +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Umbraco.Core.IO; +using Umbraco.Core.Manifest; + +namespace Umbraco.Web.UI.JavaScript +{ + internal class CssInitialization + { + private readonly ManifestParser _parser; + + public CssInitialization(ManifestParser parser) + { + _parser = parser; + } + + /// + /// Processes all found manifest files and outputs yepnope.injectcss calls for all css files found in all manifests + /// + public string GetStylesheetInitialization() + { + JArray merged = new JArray(); + foreach (var m in _parser.GetManifests()) + { + ManifestParser.MergeJArrays(merged, m.StyleSheetInitialize); + } + + return ParseMain(merged); + } + + + /// + /// Parses the CssResources.Main and returns a yepnop.injectCss format + /// + /// + /// + internal static string ParseMain(JArray files) + { + StringBuilder sb = new StringBuilder(); + foreach (var file in files) + sb.AppendFormat("{0}yepnope.injectCss('{1}');", Environment.NewLine, file); + + return sb.ToString(); + } + + } +} diff --git a/src/Umbraco.Web/UI/JavaScript/JsInitialize.js b/src/Umbraco.Web/UI/JavaScript/JsInitialize.js index 9e936f7c87..42ed1c270e 100644 --- a/src/Umbraco.Web/UI/JavaScript/JsInitialize.js +++ b/src/Umbraco.Web/UI/JavaScript/JsInitialize.js @@ -27,8 +27,8 @@ */ /* temporary sorter lib, should be updated - 'lib/angular/angular-ui-sortable.js',*/ - 'lib/jquery/jquery.sortable/jquery.sortable.js', + 'lib/angular/angular-ui-sortable.js', + 'lib/jquery/jquery.sortable/jquery.sortable.js',*/ /* App-wide file-upload helper */ 'lib/jquery/jquery.upload/js/jquery.fileupload.js', diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index d6c4f74347..161e183bc4 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -373,6 +373,7 @@ + ASPXCodeBehind