From 03f02a44bcb87f3ef3fbcf801153091469d9a518 Mon Sep 17 00:00:00 2001 From: Shandem Date: Mon, 8 Mar 2010 14:52:29 +0000 Subject: [PATCH] WORK IN PROGRESS, GET THE STABLE SOURCE FROM THE DOWNLOADS TAB Examine & ClientDependency update. Modal windows now render full screen and stack. [TFS Changeset #64559] --- .../TreePicker/BaseTreePicker.js | 2 +- foreign dlls/ClientDependency.Core.dll | Bin 57856 -> 57856 bytes foreign dlls/UmbracoExamine.Providers.dll | Bin 43520 -> 43520 bytes .../config/ClientDependency.config | 2 +- .../Application/UmbracoClientManager.js | 46 +++++--- .../umbraco_client/modal/modal.js | 109 +++++++++++++----- 6 files changed, 115 insertions(+), 44 deletions(-) diff --git a/components/umbraco.controls/TreePicker/BaseTreePicker.js b/components/umbraco.controls/TreePicker/BaseTreePicker.js index 2992bfe471..ff474a3b03 100644 --- a/components/umbraco.controls/TreePicker/BaseTreePicker.js +++ b/components/umbraco.controls/TreePicker/BaseTreePicker.js @@ -21,7 +21,7 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); LaunchPicker: function() { var _this = this; - UmbClientMgr.openModalWindow(this._itemPickerUrl, this._label, this._showHeader, this._width, this._height, 30, 0, ['#cancelbutton'], function(e) { _this.SaveSelection(e); }); + UmbClientMgr.openModalWindow(this._itemPickerUrl, this._label, this._showHeader, this._width, this._height, 60, 0, ['#cancelbutton'], function(e) { _this.SaveSelection(e); }); }, SaveSelection: function(e) { diff --git a/foreign dlls/ClientDependency.Core.dll b/foreign dlls/ClientDependency.Core.dll index c3d9245952269d8a7e36ab9864c8bdd1a2a18a8c..3820c459ced4efa1452fe82267ebbe03042dbc77 100644 GIT binary patch delta 8588 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%0AA;bW99!RIKuK^)45 zx&HuYjp+jJ`2?4fp)Va!v64j7Z!6lEMY-0oPxQ;jY0JtMVu3l4cEcxXX;Ebs3DIXO zi^y7fzVdqW&MvQItyE*n*X0K=%~fpq0BUM3&+!Y*iXC$u%N_4J?m9X<`#RS-KXd-u z>8kNZem2U>oEMye%i^Nh&;Buo;7T2Ll`U8NWao79k064ETv}i(*D+we!|AnWpUNLc zx|vHzYwI{tAy0;g^=T5Z&ca^_dDl7__F11H`!M~YZ8CgeFCpL9OW-2@m~N$WGF)-a zB3GP*eIl%RWno-;&HlGTMx}4@#3>W+#@UvpyDdX_dV!w%{+yVs?ONWn} zGGk&*r-9|V4Z!AkESEs}ZLvGV=P9LtZpZQ4?rgf=teSM8oXPf>H DQ$Lex diff --git a/foreign dlls/UmbracoExamine.Providers.dll b/foreign dlls/UmbracoExamine.Providers.dll index 889eaaceeacdb85454e131906d826f1584d7d00e..1b357ae795acc049297610b8aaccbc2bee3fc6c5 100644 GIT binary patch delta 53 zcmZp;!qjkuX+j5c{=q35yJh}}vM{HTN^yVG?K0+Yb$?S_X896r_ IE;`Q+0C(FKZU6uP delta 53 zcmZp;!qjkuX+j5cP*c;!ZrOf;?257tvh8eM3rcsUSI(_?zj;T$j}S<9GW#M;Mvl#f Ii_WtH0BWcfKmY&$ diff --git a/umbraco/presentation/config/ClientDependency.config b/umbraco/presentation/config/ClientDependency.config index e4a2a54a90..0f42f1dd2c 100644 --- a/umbraco/presentation/config/ClientDependency.config +++ b/umbraco/presentation/config/ClientDependency.config @@ -1,4 +1,4 @@ - + diff --git a/umbraco/presentation/umbraco_client/Application/UmbracoClientManager.js b/umbraco/presentation/umbraco_client/Application/UmbracoClientManager.js index e46e188c4d..ddc95d1834 100644 --- a/umbraco/presentation/umbraco_client/Application/UmbracoClientManager.js +++ b/umbraco/presentation/umbraco_client/Application/UmbracoClientManager.js @@ -18,7 +18,7 @@ Umbraco.Sys.registerNamespace("Umbraco.Application"); _mainTree: null, _appActions: null, _rootPath: "/umbraco", //this is the default - _modal: null, + _modal: new Array(), //track all modal window objects (they get stacked) setUmbracoPath: function(strPath) { /// @@ -107,31 +107,49 @@ Umbraco.Sys.registerNamespace("Umbraco.Application"); } }, openModalWindow: function(url, name, showHeader, width, height, top, leftOffset, closeTriggers, onCloseCallback) { - if (this._modal == null) { - this._modal = new Umbraco.Controls.ModalWindow(); + //need to create the modal on the top window if the top window has a client manager, if not, create it on the current window + + //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. + } } - this._modal.open(url, name, showHeader, width, height, top, leftOffset, closeTriggers, onCloseCallback); }, closeModalWindow: function(rVal) { /// - /// will close the latest open modal window, otherwise - /// if the modal object is null and the mainWindow is not null, this generally means this is - /// being called inside a modal window, so we'll check to see if we can get the parent modal - /// object and close it instead. + /// will close the latest open modal window. /// if an rVal is passed in, then this will be sent to the onCloseCallback method if it was specified. /// - if (this._modal != null) { - this._modal.close(rVal); + if (this._modal != null && this._modal.length > 0) { + this._modal.pop().close(rVal); } else { - //this will recursively try to close a modal window until window.parent or - //window.parent.UmbClientMgr doesn't exist. + //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) { - return; //don't recurse, exit + //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") { - window.parent.UmbClientMgr.closeModalWindow(rVal); + mgr = window.parent.UmbClientMgr; } + mgr.closeModalWindow.call(mgr, rVal); } }, _debug: function(strMsg) { diff --git a/umbraco/presentation/umbraco_client/modal/modal.js b/umbraco/presentation/umbraco_client/modal/modal.js index 06e4f30831..9c823cb217 100644 --- a/umbraco/presentation/umbraco_client/modal/modal.js +++ b/umbraco/presentation/umbraco_client/modal/modal.js @@ -14,44 +14,58 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); }; $.fn.ModalWindowShow = function(name, showHeader, width, height, top, leftOffset, closeTriggers, onCloseCallback) { + /// Shows a modal window based on existing content in the DOM return $(this).each(function() { //check if the modal exists already - if ($(this).closest(".umbModalBox").length) { + if ($(this).closest(".umbModalBox").length > 0) { var api = $(this).closest(".umbModalBox").ModalWindowAPI(); api._obj.jqmShow(); //since it exist, just re-show it } else { var modal = Umbraco.Controls.ModalWindow(); modal.show(this, name, showHeader, width, height, top, leftOffset, closeTriggers, onCloseCallback); - } + } }); }; Umbraco.Controls.ModalWindow = function() { - /// Modal window class, when open is called, it will create a temporary html element to attach the window to - return { + /// + /// Modal window class, when open is called, it will create a temporary html element to attach the window to. + /// The modal will attempt to be created in the top most frame if all of the libraries are found there, if not, + /// it uses the current frame's document/jquery objects. + /// + + var m = { _wId: Umbraco.Utils.generateRandom().toString().replace(".", ""), //the modal window ID that will be assigned _obj: null, //the jquery element for the modal window _rVal: null, //a return value specified when closing that gets passed to the onCloseCallback method + _cntr: ++Umbraco.Controls.ModalWindow.cntr, //counts instances + //get a reference to the topmost jquery object if there is a modal framework there, otherwise use current + _$: (window.top.jQuery && window.top.jQuery.jqm) ? window.top.jQuery : $, + //get a reference to the topmost document if we're selecting the topmost jquery, otherwise use the current + _document: (window.top.jQuery && window.top.jQuery.jqm) ? window.top.document : document, show: function(selector, name, showHeader, width, height, top, leftOffset, closeTriggers, onCloseCallback) { + /// Shows a modal window based on existing content in the DOM //check if the modal elems exist if (!this._modalElemsExist()) { this._createModalElems(false, selector); } + var _this = this; this._open(name, showHeader, width, height, top, leftOffset, closeTriggers, onCloseCallback, function(h) { //insert the content - var umbModal = $(h.w); - var umbModalContent = $(".umbModalBoxContent", umbModal); - umbModalContent.append($(selector)); - $(selector).show(); + var umbModal = _this._$(h.w); + var umbModalContent = _this._$(".umbModalBoxContent", umbModal); + umbModalContent.append(_this._$(selector)); + _this._$(selector).show(); }); }, open: function(url, name, showHeader, width, height, top, leftOffset, closeTriggers, onCloseCallback) { + /// Shows a modal window with content specified in the url in an iframe //check if the modal elems exist if (!this._modalElemsExist()) { this._createModalElems(true); @@ -62,8 +76,8 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); closeTriggers, onCloseCallback, function(h) { //get the iframe, and set the url - var umbModal = $(h.w); - var umbModalContent = $("iframe", umbModal); + var umbModal = _this._$(h.w); + var umbModalContent = _this._$("iframe", umbModal); umbModalContent.html('').attr('src', _this._getUniqueUrl(url)); umbModalContent.width(width); umbModalContent.height(showHeader ? height - 30 : height); @@ -91,7 +105,7 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); this._obj.jqm({ onShow: function(h) { - var umbModal = $(h.w); + var umbModal = _this._$(h.w); //remove the header if it shouldn't be shown if (!showHeader) { @@ -107,15 +121,18 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); if (height > 0) { umbModal.height(height); } + //if the width is set, then set it in the center if (width > 0) { umbModal.width(width); - umbModal.css("left", (($(document).width() - width) / 2) + "px"); + umbModal.css("left", ((_this._$(_this._document).width() - width) / 2) + "px"); } + //if the top is set if (top > 0) { umbModal.css("top", top + "px"); } + //if the leftOffset is set if (leftOffset > 0) { var newLeft = parseInt(umbModal.css("left").replace("px", "")) + leftOffset; @@ -128,21 +145,39 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); onCreate.call(_this, h) } - $(document).keyup(function(event) { + _this._$(_this._document).keyup(function(event) { if (event.keyCode == 27 && umbModal.css("display") == "block") { _this.close(); } }); + if (closeTriggers) { for (var x in closeTriggers) { - _this._obj.jqmAddClose(closeTriggers[x]); + //Ok, this is a bit weird, but it makes sense. Since the selector passed in might be a selector + //that exists in the root jquery obj, the current jquery object, or an item in the iframe if there is one + //we'll try to find them all. + var trigger = closeTriggers[x]; + //first check if the object passed in is already a jquery object + if (!trigger.jquery) { + trigger = _this._$(closeTriggers[x]); //find object in the doc that owns the modal container + if (trigger.length == 0) { + trigger = $(closeTriggers[x]); //find object in the doc that owns the curr jquery object + } + if (trigger.length == 0) { + try { + trigger = h.w.find("iframe").contents().find(closeTriggers[x]); + } + catch (err) {} //IE throws an exception when navigating iframes, but it stil works... + } + } + _this._obj.jqmAddClose(trigger); } } }, onHide: function(h) { - var umbModal = $(h.w); - var umbModalContent = $(".umbModalBoxContent", umbModal); + var umbModal = _this._$(h.w); + var umbModalContent = _this._$(".umbModalBoxContent", umbModal); var iframe = umbModalContent.find("iframe"); if (typeof onCloseCallback == "function") { //call the callback if specified, pass the jquery content object as a param and the output value array @@ -156,8 +191,9 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); if (iframe.length > 0) { umbModalContent.hide(); umbModalContent.html('').attr('src', ''); - _this.close(); + _this._obj.remove(); } + _this._close(); } }); @@ -167,35 +203,42 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); return this._obj; }, close: function(rVal) { - /// Closes the modal window, Removes the object from the DOM + /// Closes the modal window /// if specified, will add this parameter to the onCloseCallback method's outVal parameter so it may be used in the closing callback method this._rVal = rVal; top.focus(); - this._obj.jqmHide(); - this._obj.remove(); - return false; + this._obj.jqmHide(); //do the hiding, this will call the onHide handler + }, + _close: function() { + /// Finalizes the objects counter and instance manager + + //remove the instance from the instance manager + Umbraco.Controls.ModalWindow.inst[this._cntr] = null; + Umbraco.Controls.ModalWindow.inst[this._wId] = null; + Umbraco.Controls.ModalWindow.cntr--; //reduce the counter }, _createModalElems: function(withIFrame, selector) { /// This will create the html elements required for the modal overlay if they do not already exist in the DOM var overlayHtml = this._getOverlayHtml(withIFrame); - //create the modal dialog in the root if no selector, otherwise create at parent - //of selector + if (!selector) { - this._obj = $(overlayHtml).appendTo("body"); + this._obj = this._$(overlayHtml).appendTo(this._$("body")); } else { - this._obj = $(overlayHtml).appendTo($(selector).parent()); + this._obj = this._$(overlayHtml).appendTo(this._$(selector).parent()); } + //update the z-index so it stacks + this._obj.css("z-index", 10000 + (this._cntr * 10)); var _this = this; - if ($.fn.draggable) { + if (this._$.fn.draggable) { this._obj.draggable({ cursor: 'move', distance: 5, iframeFix: withIFrame, helper: function(event) { - var o = $(this).clone(); + var o = _this._$(this).clone(); o.children().remove(); o.css("border-width", "1px"); return o; @@ -224,7 +267,7 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); return overlayHtml; }, _modalElemsExist: function() { - return ($("#" + this._wId + "_modal").length > 0); + return (this._$("#" + this._wId + "_modal").length > 0); }, _getUniqueUrl: function(url) { var r = Umbraco.Utils.generateRandom(); @@ -234,8 +277,18 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls"); return url += "?rndo=" + r; } }; + + //store a reference to this api by the id and the counter + Umbraco.Controls.ModalWindow.inst[m._cntr] = m; + Umbraco.Controls.ModalWindow.inst[m._wId] = Umbraco.Controls.ModalWindow.inst[m._cntr]; + + return m; }; + // instance manager + Umbraco.Controls.ModalWindow.cntr = 0; + Umbraco.Controls.ModalWindow.inst = {}; + })(jQuery);