diff --git a/src/Umbraco.Web.UI.Client/lib/umbraco/LegacyUmbClientMgr.js b/src/Umbraco.Web.UI.Client/lib/umbraco/LegacyUmbClientMgr.js index 702c07431d..0131ff3fda 100644 --- a/src/Umbraco.Web.UI.Client/lib/umbraco/LegacyUmbClientMgr.js +++ b/src/Umbraco.Web.UI.Client/lib/umbraco/LegacyUmbClientMgr.js @@ -3,8 +3,8 @@ //TEST to mock iframe, this intercepts calls directly //to the old iframe, and funnels requests to angular directly -var right = {document: {location: {}}}; -Object.defineProperty(right.document.location, "href", { +//var right = {document: {location: {}}}; +/*Object.defineProperty(right.document.location, "href", { get: function() { return this._href ? this._href : ""; }, @@ -12,7 +12,7 @@ Object.defineProperty(right.document.location, "href", { this._href = value; UmbClientMgr.contentFrame(value); }, -}); +});*/ Umbraco.Sys.registerNamespace("Umbraco.Application"); @@ -191,7 +191,7 @@ Umbraco.Sys.registerNamespace("Umbraco.Application"); }); //add the callback to the jquery data for the modal so we can call it on close to support the legacy way dialogs worked. - dialog.data("modalCb", onCloseCallback); + dialog.element.data("modalCb", onCloseCallback); //add the close triggers for (var i = 0; i < closeTriggers.length; i++) { var e = dialog.find(closeTriggers[i]); @@ -201,10 +201,8 @@ Umbraco.Sys.registerNamespace("Umbraco.Application"); }); } } - this._modal.push(dialog); - return dialog; }, closeModalWindow: function(rVal) { @@ -221,12 +219,14 @@ Umbraco.Sys.registerNamespace("Umbraco.Application"); //if we've stored a callback on this modal call it before we close. var self = this; - var onCloseCallback = lastModal.data("modalCb"); + //get the compat callback from the modal element + var onCloseCallback = lastModal.element.data("modalCb"); if (typeof onCloseCallback == "function") { onCloseCallback.apply(self, [{ outVal: rVal }]); } - dialogService.close(lastModal); + //just call the native dialog close() method to remove the dialog + lastModal.scope.close(); } else { dialogService.closeAll(rVal); 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 067ec19cf9..40407d69db 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 @@ -8,7 +8,7 @@ * @requires $log * @requires $q * @requires $templateCache - * + * * @description * Application-wide service for handling modals, overlays and dialogs * By default it injects the passed template url into a div to body of the document @@ -20,11 +20,11 @@ * sure the umbraco.services module is accesible - which it should be by default. * *
- *		var dialog = dialogService.open({template: 'path/to/page.html', show: true, callback: done});
- *		functon done(data){
- *			//The dialog has been submitted	
+ *    var dialog = dialogService.open({template: 'path/to/page.html', show: true, callback: done});
+ *    functon done(data){
+ *      //The dialog has been submitted 
  *      //data contains whatever the dialog has selected / attached
- *		}			
+ *    }     
  * 
*/ @@ -34,180 +34,193 @@ 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); + dialog.scope.close(args); + + //removeDialog(dialog, args); dialogs.splice(i, 1); } } - /** Internal method that handles closing a specific dialog */ - function removeDialog(dialog) { - - dialog.modal("hide"); - - $timeout(function () { - dialog.remove(); - }, 250); - } - /** Internal method that handles opening all dialogs */ function openDialog(options) { - - if (!options) { - options = {}; - } - //configation and defaults - var scope = options.scope || $rootScope.$new(), - container = options.container || $("body"), - animationClass = options.animation || "fade", - modalClass = options.modalClass || "umb-modal", - width = options.width || "100%", - templateUrl = options.template || "views/common/notfound.html"; - - //if a callback is available - var callback = options.callback; + var defaults = { + container: $("body"), + animation: "fade", + modalClass: "umb-modal", + width: "100%", + inline: false, + iframe: false, + show: true, + template: "views/common/notfound.html", + callback: undefined, + closeCallback: undefined, + element: undefined + }; + + var dialog = angular.extend(defaults, options); + var scope = options.scope || $rootScope.$new(); + delete dialog.scope; //Modal dom obj and unique id - var $modal = $('
'); - var id = templateUrl.replace('.html', '').replace('.aspx', '').replace(/[\/|\.|:\&\?\=]/g, "-") + '-' + scope.$id; + dialog.element = $('
'); + var id = dialog.template.replace('.html', '').replace('.aspx', '').replace(/[\/|\.|:\&\?\=]/g, "-") + '-' + scope.$id; if(options.inline){ - animationClass = ""; - modalClass = ""; + dialog.animation = ""; + dialog.modalClass = ""; }else{ - $modal.addClass("modal"); - $modal.addClass("hide"); + dialog.element.addClass("modal"); + dialog.element.addClass("hide"); } - //set the id and add classes - $modal + dialog.element .attr('id', id) - .addClass(animationClass) - .addClass(modalClass); + .addClass(dialog.animation) + .addClass(dialog.modalClass); //push the modal into the global modal collection //we halt the .push because a link click will trigger a closeAll right away $timeout(function () { - dialogs.push($modal); - }, 250); + dialogs.push(dialog); + }, 500); - //if iframe is enabled, inject that instead of a template - if (options.iframe) { - var html = $(""); - $modal.html(html); + //basic events for submitting and closing + scope.submit = function(data) { + if (dialog.callback) { + dialog.callback(data); + } + + dialog.element.modal('hide'); + dialog.element.remove(); + $("#" + dialog.element.attr("id")).remove(); + }; + + scope.close = function(data) { + if (dialog.closeCallback) { + dialog.closeCallback(data); + } + + dialog.element.modal('hide'); + dialog.element.remove(); + $("#" + dialog.element.attr("id")).remove(); + }; + + //if iframe is enabled, inject that instead of a template + if (dialog.iframe) { + var html = $(""); + dialog.element.html(html); + //append to body or whatever element is passed in as options.containerElement - container.append($modal); + dialog.container.append(dialog.element); // Compile modal content $timeout(function () { - $compile($modal)(scope); + $compile(dialog.element)(dialog.scope); }); - $modal.css("width", width); + dialog.element.css("width", dialog.width); - //Autoshow - if (options.show) { - $modal.modal('show'); + //Autoshow + if (dialog.show) { + dialog.element.modal('show'); } - - return $modal; + + //store the callback in the modal jquery data + //dialog.element.data("modalCb", dialog.callback); + dialog.scope = scope; + return dialog; } else { - //We need to load the template with an httpget and once it's loaded we'll compile and assign the result to the container - // object. However since the result could be a promise or just data we need to use a $q.when. We still need to return the - // $modal object so we'll actually return the modal object synchronously without waiting for the promise. Otherwise this openDialog - // method will always need to return a promise which gets nasty because of promises in promises plus the result just needs a reference - // to the $modal object which will not change (only it's contents will change). - $q.when($templateCache.get(templateUrl) || $http.get(templateUrl, { cache: true }).then(function(res) { return res.data; })) - .then(function onSuccess(template) { + //We need to load the template with an httpget and once it's loaded we'll compile and assign the result to the container + // object. However since the result could be a promise or just data we need to use a $q.when. We still need to return the + // $modal object so we'll actually return the modal object synchronously without waiting for the promise. Otherwise this openDialog + // method will always need to return a promise which gets nasty because of promises in promises plus the result just needs a reference + // to the $modal object which will not change (only it's contents will change). + $q.when($templateCache.get(dialog.template) || $http.get(dialog.template, { cache: true }).then(function(res) { return res.data; })) + .then(function onSuccess(template) { - // Build modal object - $modal.html(template); + // Build modal object + dialog.element.html(template); - //append to body or other container element - container.append($modal); - - // Compile modal content - $timeout(function() { - $compile($modal)(scope); - }); + //append to body or other container element + dialog.container.append(dialog.element); - scope.dialogOptions = options; + //store the callback in the modal jquery data + dialog.element.data("modalCb", dialog.callback); - //Scope to handle data from the modal form - scope.dialogData = {}; - scope.dialogData.selection = []; + // Compile modal content + $timeout(function() { + $compile(dialog.element)(scope); + }); - // Provide scope display functions - //this passes the modal to the current scope - scope.$modal = function(name) { - $modal.modal(name); - }; + scope.dialogOptions = dialog; + + //Scope to handle data from the modal form + scope.dialogData = {}; + scope.dialogData.selection = []; - scope.hide = function() { - $modal.modal('hide'); + // Provide scope display functions + //this passes the modal to the current scope + scope.$modal = function(name) { + dialog.element.modal(name); + }; - $modal.remove(); - $("#" + $modal.attr("id")).remove(); - }; + scope.hide = function() { + dialog.element.modal('hide'); - scope.show = function() { - $modal.modal('show'); - }; + dialog.element.remove(); + $("#" + dialog.element.attr("id")).remove(); + }; - scope.submit = function(data) { - if (callback) { - callback(data); - } + scope.show = function() { + dialog.element.modal('show'); + }; - $modal.modal('hide'); + scope.select = function(item) { + var i = scope.dialogData.selection.indexOf(item); + if (i < 0) { + scope.dialogData.selection.push(item); + }else{ + scope.dialogData.selection.splice(i, 1); + } + }; - $modal.remove(); - $("#" + $modal.attr("id")).remove(); - }; + scope.dismiss = scope.hide; - scope.select = function(item) { - var i = scope.dialogData.selection.indexOf(item); - if (i < 0) { - scope.dialogData.selection.push(item); - }else{ - scope.dialogData.selection.splice(i, 1); - } - }; + // Emit modal events + angular.forEach(['show', 'shown', 'hide', 'hidden'], function(name) { + dialog.element.on(name, function(ev) { + scope.$emit('modal-' + name, ev); + }); + }); - scope.dismiss = scope.hide; + // Support autofocus attribute + dialog.element.on('shown', function(event) { + $('input[autofocus]', dialog.element).first().trigger('focus'); + }); - // Emit modal events - angular.forEach(['show', 'shown', 'hide', 'hidden'], function(name) { - $modal.on(name, function(ev) { - scope.$emit('modal-' + name, ev); - }); - }); + //Autoshow + if (dialog.show) { + dialog.element.modal('show'); + } - // Support autofocus attribute - $modal.on('shown', function(event) { - $('input[autofocus]', $modal).first().trigger('focus'); - }); - - //Autoshow - if (options.show) { - $modal.modal('show'); - } - }); + dialog.scope = scope; + }); //Return the modal object outside of the promise! - return $modal; + return dialog; } } /** Handles the closeDialogs event */ $rootScope.$on("closeDialogs", function (evt, args) { - removeAllDialogs(); + removeAllDialogs(args); }); return { @@ -244,9 +257,12 @@ angular.module('umbraco.services') * @description * Closes a specific dialog * @param {Object} dialog the dialog object to close + * @param {Object} args if specified this object will be sent to any callbacks registered on the dialogs. */ - close: function (dialog) { - removeDialog(dialog); + close: function (dialog, args) { + dialog.scope.close(); + + //removeDialog(dialog, args); }, /** @@ -256,9 +272,10 @@ angular.module('umbraco.services') * * @description * Closes all dialogs + * @param {Object} args if specified this object will be sent to any callbacks registered on the dialogs. */ - closeAll: function() { - removeAllDialogs(); + closeAll: function(args) { + removeAllDialogs(args); }, /**