SharePoint: How To Maximize a Modal Dialog Window
In SharePoint 2010 by default a list item is opened in a Modal Dialog Window. The dialog adjusts its size depending on the size of the contained content and provides users with buttons to maximize and close itself. So, I was asked to maximize the dialog when opening some list items.
Creating and Initializing of a Modal Dialog Window
The JavaScript responsible for the dialog rendering is in the SP.UI.Dialog.js file (usually located in C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS). Clicking on a link-title, for example, in a list view leads to creating and displaying a new Modal Dialog Window in a manner similar to the following:
var options = SP.UI.$create_DialogOptions(); options.url = 'display-page corresponding to the current list item'; options.title = 'list item title'; options.allowMaximize = true; options.showClose = true; // possible option, but it's not used in the place in question //options.showMaximized = true; var modalDialog = SP.UI.ModalDialog.showModalDialog(options);
The commented line demonstrates one of the possible settings, showMaximized, which apparently does exactly what we need. So, it would be a good solution if we had control under creation of the dialog. Unfortunately, we don’t have. Modifying scripts in SharePoint system js-files runs counter to all known “best practices”, therefore I don’t even consider it. Another possible way is override the client-side OnClick-events of the link-title fields everywhere (in list views, web parts and so on) so that your own script would create and display the dialog in a required manner. Obviously, it’s a very time-consuming solution. Moreover, every time when creating a list view, web part or something else you always have to keep in mind the possible need to rewrite their OnClick-events. In my opinion the only acceptable approach is allow a web page itself to maximize the dialog window it’s placed in.
Script to Maximize a Modal Dialog Window
For that, first of all, we need to have a JavaScript to maximize the current dialog. As SP.UI.Dialog.js doesn’t provide a function/method intended for use outside, we have to consume undocumented internal functions. A suitable script is described in the blog post – “How to maximize a Modal Dialog in JavaScript?“. With slight changes the JavaScript looks like the following
function _maximizeWindow() { var currentDialog = SP.UI.ModalDialog.get_childDialog(); if (currentDialog != null && !currentDialog.$S_0) currentDialog.$z(); } ExecuteOrDelayUntilScriptLoaded(_maximizeWindow, 'sp.ui.dialog.js');
_maximizeWindow gets the current dialog window instance and tries to maximize it if it hasn’t been done before. ExecuteOrDelayUntilScriptLoaded, in turn, is applied to ensure the _maximizeWindow is called after the sp.ui.dialog.js has been completely loaded.
Script Applying
Having the script, we can insert it into the end of a web page to be maximized. It could be done through SharePoint Designer or by modifying a physical aspx-file defined as a display/new/edit form for a list or a content type. However, I decided to add the script dynamically in a page’s code-behind. So, the resultant code is shown below:
using System; using System.Web.UI; using Microsoft.SharePoint; //... public class DisplayListItem : Page { protected override void OnLoad(EventArgs e) { base.OnLoad(e); if(!IsPostBack) AddMaximizeWindowScript(); } //... protected virtual void AddMaximizeWindowScript() { if (SPContext.Current.IsPopUI) { const string scriptKey = "MaxWinwScript"; if (!ClientScript.IsClientScriptBlockRegistered(GetType(), scriptKey)) { const string jsScript = @"function _maximizeWindow() { var currentDialog = SP.UI.ModalDialog.get_childDialog(); if (currentDialog != null && !currentDialog.$S_0) currentDialog.$z(); } ExecuteOrDelayUntilScriptLoaded(_maximizeWindow, 'sp.ui.dialog.js');"; ClientScript.RegisterClientScriptBlock(GetType(), scriptKey, jsScript, true); } } } //... }
You may ask why I use RegisterClientScriptBlock instead of RegisterStartupScript or window.onload, or jQuery‘s $(document).ready (the latest two arise on client side). The reason is that initially the dialog window is created with the autoSize option. So, it’s very reasonable to maximize the window as soon as possible to prevent the content’s size calculating, which apparently happens after the page has been loaded entirely.