diff --git a/src/Umbraco.Web.UI.Client/lib/umbraco/LegacyUmbClientMgr.js b/src/Umbraco.Web.UI.Client/lib/umbraco/LegacyUmbClientMgr.js index c1fe7ebab8..da0221cfe5 100644 --- a/src/Umbraco.Web.UI.Client/lib/umbraco/LegacyUmbClientMgr.js +++ b/src/Umbraco.Web.UI.Client/lib/umbraco/LegacyUmbClientMgr.js @@ -165,8 +165,12 @@ Umbraco.Sys.registerNamespace("Umbraco.Application"); //get our angular navigation service var injector = getRootInjector(); - var dialogService = injector.get("dialogService"); - + var dialogService = injector.get("dialogService"); + + var self = this; + + //TODO: need to get the closeTriggers working for compatibility too somehow. + var dialog = dialogService.open({ template: url, width: width, @@ -174,57 +178,29 @@ Umbraco.Sys.registerNamespace("Umbraco.Application"); iframe: true, show: true, callback: function (result) { + + if (typeof onCloseCallback == "function") { + onCloseCallback.apply(self, [result]); + } + dialog.hide(); } - }); - - // var m = new Umbraco.Controls.ModalWindow(); - // this._modal.push(m); - // m.open(url, name, showHeader, width, height, top, leftOffset, closeTriggers, onCloseCallback); - - //throw "Not implemented!"; - - ////if this is the top window, or if the top window doesn't have a client manager, create the modal in this manager - //if (window == this.mainWindow() || !this.mainWindow().UmbClientMgr) { - // var m = new Umbraco.Controls.ModalWindow(); - // this._modal.push(m); - // m.open(url, name, showHeader, width, height, top, leftOffset, closeTriggers, onCloseCallback); - //} - //else { - // //if the main window has a client manager, then call the main window's open modal method whilst keeping the context of it's manager. - // if (this.mainWindow().UmbClientMgr) { - // this.mainWindow().UmbClientMgr.openModalWindow.apply(this.mainWindow().UmbClientMgr, - // [url, name, showHeader, width, height, top, leftOffset, closeTriggers, onCloseCallback]); - // } - // else { - // return; //exit recurse. - // } - //} + }); + + return dialog; }, closeModalWindow: function(rVal) { - getRootScope().$emit("closeDialogs"); + if (rVal) { + //trigger the closeDialogs event with arguments, note: using the term 'outVal' since that is what is expected in the tree picker. + getRootScope().$emit("closeDialogs", { outVal: rVal }); + } + else { + //no arg vals + getRootScope().$emit("closeDialogs"); + } + - //if (this._modal != null && this._modal.length > 0) { - // this._modal.pop().close(rVal); - //} - //else { - // //this will recursively try to close a modal window until the parent window has a modal object or the window is the top and has the modal object - // var mgr = null; - // if (window.parent == null || window.parent == window) { - // //we are at the root window, check if we can close the modal window from here - // if (window.UmbClientMgr != null && window.UmbClientMgr._modal != null && window.UmbClientMgr._modal.length > 0) { - // mgr = window.UmbClientMgr; - // } - // else { - // return; //exit recursion. - // } - // } - // else if (typeof window.parent.UmbClientMgr != "undefined") { - // mgr = window.parent.UmbClientMgr; - // } - // mgr.closeModalWindow.call(mgr, rVal); - //} }, _debug: function(strMsg) { if (this._isDebug) { 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 d7d5a34734..327f6d54c8 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 @@ -34,16 +34,25 @@ angular.module('umbraco.services') var dialogs = []; /** Internal method that removes all dialogs */ - function removeAllDialogs() { + function removeAllDialogs(args) { for (var i = 0; i < dialogs.length; i++) { var dialog = dialogs[i]; - removeDialog(dialog); + removeDialog(dialog, args); dialogs.splice(i, 1); } } /** Internal method that handles closing a specific dialog */ - function removeDialog(dialog) { + function removeDialog(dialog, args) { + + //if there's arguments passed in then check if there's a callback registered in the current modal then call it. + //this occurs when the "closeDialogs" event is triggered with arguments. + + if (args && dialog.data("modalCb") != null && angular.isFunction(dialog.data("modalCb"))) { + var cb = dialog.data("modalCb"); + cb.apply(dialog, [args]); + } + dialog.modal("hide"); $timeout(function () { @@ -72,9 +81,7 @@ angular.module('umbraco.services') //Modal dom obj and unique id var $modal = $('
'); var id = templateUrl.replace('.html', '').replace('.aspx', '').replace(/[\/|\.|:\&\?\=]/g, "-") + '-' + scope.$id; - - if(options.inline){ animationClass = ""; modalClass = ""; @@ -115,6 +122,9 @@ angular.module('umbraco.services') $modal.modal('show'); } + //store the callback in the modal jquery data + $modal.data("modalCb", callback); + return $modal; } else { @@ -133,6 +143,9 @@ angular.module('umbraco.services') //append to body or other container element container.append($modal); + //store the callback in the modal jquery data + $modal.data("modalCb", callback); + // Compile modal content $timeout(function() { $compile($modal)(scope); @@ -207,8 +220,8 @@ angular.module('umbraco.services') } /** Handles the closeDialogs event */ - $rootScope.$on("closeDialogs", function () { - removeAllDialogs(); + $rootScope.$on("closeDialogs", function (evt, args) { + removeAllDialogs(args); }); return { diff --git a/src/Umbraco.Web/Trees/LegacyTreeDataConverter.cs b/src/Umbraco.Web/Trees/LegacyTreeDataConverter.cs index 622136a1ac..8d165b9374 100644 --- a/src/Umbraco.Web/Trees/LegacyTreeDataConverter.cs +++ b/src/Umbraco.Web/Trees/LegacyTreeDataConverter.cs @@ -48,21 +48,11 @@ namespace Umbraco.Web.Trees /// internal class LegacyTreeDataConverter { - /// - /// This is used by any legacy services that require rendering a BaseTree, if a new controller tree is detected it will try to invoke it's legacy predecessor. - /// - /// - /// - /// - internal static BaseTree GetLegacyTreeForLegacyServices(ApplicationTreeService appTreeService, string treeType) + internal static BaseTree GetLegacyTreeForLegacyServices(Core.Models.ApplicationTree appTree) { - BaseTree tree; + if (appTree == null) throw new ArgumentNullException("appTree"); - //first get the app tree definition so we can then figure out if we need to load by legacy or new - //now we'll look up that tree - var appTree = appTreeService.GetByAlias(treeType); - if (appTree == null) - throw new InvalidOperationException("No tree found with alias " + treeType); + BaseTree tree; var controllerAttempt = appTree.TryGetControllerTree(); if (controllerAttempt.Success) @@ -70,14 +60,14 @@ namespace Umbraco.Web.Trees var legacyAtt = controllerAttempt.Result.GetCustomAttribute(false); if (legacyAtt == null) { - LogHelper.Warn("Cannot render tree: " + treeType + ". Cannot render a " + typeof(TreeApiController) + " tree type with the legacy web services unless attributed with " + typeof(LegacyBaseTreeAttribute)); + LogHelper.Warn("Cannot render tree: " + appTree.Alias + ". Cannot render a " + typeof(TreeApiController) + " tree type with the legacy web services unless attributed with " + typeof(LegacyBaseTreeAttribute)); return null; } var treeDef = new TreeDefinition( legacyAtt.BaseTreeType, new ApplicationTree(false, true, appTree.SortOrder, appTree.ApplicationAlias, appTree.Alias, appTree.Title, appTree.IconClosed, appTree.IconOpened, "", legacyAtt.BaseTreeType.GetFullNameWithAssembly(), ""), - new Application(treeType, treeType, "", 0)); + new Application(appTree.Alias, appTree.Alias, "", 0)); tree = treeDef.CreateInstance(); tree.TreeAlias = appTree.Alias; @@ -86,7 +76,7 @@ namespace Umbraco.Web.Trees else { //get the tree that we need to render - var treeDef = TreeDefinitionCollection.Instance.FindTree(treeType); + var treeDef = TreeDefinitionCollection.Instance.FindTree(appTree.Alias); if (treeDef == null) { return null; @@ -97,6 +87,26 @@ namespace Umbraco.Web.Trees return tree; } + /// + /// This is used by any legacy services that require rendering a BaseTree, if a new controller tree is detected it will try to invoke it's legacy predecessor. + /// + /// + /// + /// + internal static BaseTree GetLegacyTreeForLegacyServices(ApplicationTreeService appTreeService, string treeType) + { + if (appTreeService == null) throw new ArgumentNullException("appTreeService"); + if (treeType == null) throw new ArgumentNullException("treeType"); + + //first get the app tree definition so we can then figure out if we need to load by legacy or new + //now we'll look up that tree + var appTree = appTreeService.GetByAlias(treeType); + if (appTree == null) + throw new InvalidOperationException("No tree found with alias " + treeType); + + return GetLegacyTreeForLegacyServices(appTree); + } + /// /// Gets the menu item collection from a legacy tree node based on it's parent node's child collection /// diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/TreeControl.ascx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/TreeControl.ascx.cs index 6ac15e4b1a..f31b395079 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/TreeControl.ascx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/TreeControl.ascx.cs @@ -5,7 +5,9 @@ using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Script.Serialization; using Umbraco.Core.Logging; +using Umbraco.Core.Models; using Umbraco.Web.Trees; +using Umbraco.Web.UI.Controls; using umbraco.interfaces; using System.Text.RegularExpressions; using umbraco.BusinessLogic.Actions; @@ -15,7 +17,6 @@ using umbraco.cms.presentation.Trees; using umbraco.BasePages; using System.Web.Services; using System.Drawing; -using umbraco.BusinessLogic; using System.Linq; using Umbraco.Core; @@ -26,7 +27,7 @@ namespace umbraco.controls.Tree /// The Umbraco tree control. /// If this control doesn't exist on an UmbracoEnsuredPage it will not work. /// - public partial class TreeControl : System.Web.UI.UserControl, ITreeService + public partial class TreeControl : UmbracoUserControl, ITreeService { /// @@ -59,7 +60,7 @@ namespace umbraco.controls.Tree private List m_ActiveTrees = new List(); private List m_AllAppTrees = new List(); - private List m_ActiveTreeDefs = null; + private List m_ActiveTreeDefs = null; private TreeMode m_TreeType = TreeMode.Standard; private bool m_IsInit = false; private TreeService m_TreeService = new TreeService(); @@ -223,27 +224,31 @@ namespace umbraco.controls.Tree //find all tree definitions that have the current application alias that are ACTIVE. //if an explicit tree has been requested, then only load that tree in. - m_ActiveTreeDefs = TreeDefinitionCollection.Instance.FindActiveTrees(GetCurrentApp()); + //m_ActiveTreeDefs = TreeDefinitionCollection.Instance.FindActiveTrees(GetCurrentApp()); + + m_ActiveTreeDefs = Services.ApplicationTreeService.GetApplicationTrees(GetCurrentApp(), true).ToList(); + if (!string.IsNullOrEmpty(this.TreeType)) { m_ActiveTreeDefs = m_ActiveTreeDefs - .Where(x => x.Tree.Alias == this.TreeType) + .Where(x => x.Alias == this.TreeType) .ToList(); //this will only return 1 } //find all tree defs that exists for the current application regardless of if they are active - List appTreeDefs = TreeDefinitionCollection.Instance.FindTrees(GetCurrentApp()); + var appTreeDefs = Services.ApplicationTreeService.GetApplicationTrees(GetCurrentApp()).ToList(); //Create the BaseTree's based on the tree definitions found - foreach (TreeDefinition treeDef in appTreeDefs) + foreach (var treeDef in appTreeDefs) { //create the tree and initialize it - BaseTree bTree = treeDef.CreateInstance(); + var bTree = LegacyTreeDataConverter.GetLegacyTreeForLegacyServices(treeDef); + //BaseTree bTree = treeDef.CreateInstance(); bTree.SetTreeParameters(m_TreeService); //store the created tree m_AllAppTrees.Add(bTree); - if (treeDef.Tree.Initialize) + if (treeDef.Initialize) m_ActiveTrees.Add(bTree); } @@ -359,7 +364,7 @@ namespace umbraco.controls.Tree //stand alone tree, so we'll just add a TreeType to the TreeService and ensure that the right method gets loaded in tree.aspx if (m_ActiveTrees.Count == 1) { - m_TreeService.TreeType = m_ActiveTreeDefs[0].Tree.Alias; + m_TreeService.TreeType = m_ActiveTreeDefs[0].Alias; //convert the menu to a string //string initActions = (TreeSvc.ShowContextMenu ? Action.ToString(m_ActiveTrees[0].RootNodeActions) : "");