diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index 6507a24a8..20f03346f 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -138,9 +138,9 @@ False ..\Libraries\Migrator.NET\Migrator.Providers.dll - + False - ..\packages\MiniProfiler.1.6\lib\MvcMiniProfiler.dll + ..\packages\MiniProfiler.1.7\lib\MvcMiniProfiler.dll ..\packages\Ninject.2.2.1.4\lib\net40-Full\Ninject.dll diff --git a/NzbDrone.Core/packages.config b/NzbDrone.Core/packages.config index 462426294..e8ff40357 100644 --- a/NzbDrone.Core/packages.config +++ b/NzbDrone.Core/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/NzbDrone.Web/Content/Images/close.png b/NzbDrone.Web/Content/Images/close.png new file mode 100644 index 000000000..4e05dcd87 Binary files /dev/null and b/NzbDrone.Web/Content/Images/close.png differ diff --git a/NzbDrone.Web/Content/Images/error.png b/NzbDrone.Web/Content/Images/error.png new file mode 100644 index 000000000..8b4de1fc8 Binary files /dev/null and b/NzbDrone.Web/Content/Images/error.png differ diff --git a/NzbDrone.Web/Content/Images/gritter.png b/NzbDrone.Web/Content/Images/gritter.png new file mode 100644 index 000000000..0ca3bc0a0 Binary files /dev/null and b/NzbDrone.Web/Content/Images/gritter.png differ diff --git a/NzbDrone.Web/Content/Images/success.png b/NzbDrone.Web/Content/Images/success.png new file mode 100644 index 000000000..4dcf07651 Binary files /dev/null and b/NzbDrone.Web/Content/Images/success.png differ diff --git a/NzbDrone.Web/Content/jquery.gritter.css b/NzbDrone.Web/Content/jquery.gritter.css new file mode 100644 index 000000000..3fc996939 --- /dev/null +++ b/NzbDrone.Web/Content/jquery.gritter.css @@ -0,0 +1,100 @@ +/* the norm */ +#gritter-notice-wrapper { + position:fixed; + top:20px; + right:20px; + width:301px; + z-index:9999; +} +#gritter-notice-wrapper.top-left { + left: 20px; + right: auto; +} +#gritter-notice-wrapper.bottom-right { + top: auto; + left: auto; + bottom: 20px; + right: 20px; +} +#gritter-notice-wrapper.bottom-left { + top: auto; + right: auto; + bottom: 20px; + left: 20px; +} +.gritter-item-wrapper { + position:relative; + margin:0 0 10px 0; +} +.gritter-top { + height:10px; +} +.hover .gritter-top { + background-position:right -30px; +} +.gritter-bottom { + height:8px; + margin:0; +} +.hover .gritter-bottom { + background-position: bottom right; +} +.gritter-item { + display:block; + + background-color: #272525; + opacity: .9; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)"; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=85); + color:#eee; + padding:8px 11px; + font-size: 11px; + + border-bottom-style: solid; + border-bottom-width: 3px; +} + +.gritter-success .gritter-item{ + border-color: rgb(100, 135, 46); +} + +.gritter-fail .gritter-item{ + border-color: rgb(212, 44, 44); +} + +.hover .gritter-item { + background-position:right -40px; +} +.gritter-item p { + padding:0; + margin:0; +} +.gritter-close { + display:none; + position:absolute; + top:0px; + right: -10px; + background:url(../content/images/gritter.png) no-repeat left top; + cursor:pointer; + width:30px; + height:30px; +} +.gritter-title { + font-size:20px; + padding:0; + display:block; + text-shadow:1px 1px #000; /* Not supported by IE :( */ +} +.gritter-image { + width:48px; + height:48px; + float:left; +} +.gritter-with-image, +.gritter-without-image { + padding:0 0 5px 0; +} +.gritter-with-image { + width:220px; + float:right; +} diff --git a/NzbDrone.Web/Content/jquery.jgrowl.css b/NzbDrone.Web/Content/jquery.jgrowl.css deleted file mode 100644 index ed804a993..000000000 --- a/NzbDrone.Web/Content/jquery.jgrowl.css +++ /dev/null @@ -1,148 +0,0 @@ - -div.jGrowl -{ - padding-top: 10px; - z-index: 9999; - color: #fff; - font-size: 12px; -} - -/** Special IE6 Style Positioning **/ -div.ie6 -{ - position: absolute; -} - -div.ie6.top-right -{ - right: auto; - bottom: auto; - left: expression( ( 0 - jGrowl.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); - top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); -} - -div.ie6.top-left -{ - left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); - top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); -} - -div.ie6.bottom-right -{ - left: expression( ( 0 - jGrowl.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); - top: expression( ( 0 - jGrowl.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); -} - -div.ie6.bottom-left -{ - left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); - top: expression( ( 0 - jGrowl.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); -} - -div.ie6.center -{ - left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); - top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); - width: 100%; -} - -/** Normal Style Positions **/ -body > div.jGrowl -{ - position: fixed; -} - -body > div.jGrowl.top-left -{ - left: 0px; - top: 0px; -} - -body > div.jGrowl.top-right -{ - right: 0px; - top: 0px; -} - -body > div.jGrowl.bottom-left -{ - left: 0px; - bottom: 0px; -} - -body > div.jGrowl.bottom-right -{ - right: 0px; - bottom: 0px; -} - -body > div.jGrowl.center -{ - top: 0px; - width: 50%; - left: 25%; -} - -/** Cross Browser Styling **/ -div.center div.jGrowl-notification, div.center div.jGrowl-closer -{ - margin-left: auto; - margin-right: auto; -} - -div.jGrowl div.jGrowl-notification, div.jGrowl div.jGrowl-closer -{ - background-color: #000; - opacity: .85; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)"; - filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=85); - zoom: 1; - width: 235px; - padding: 10px; - margin-top: 5px; - margin-bottom: 5px; - font-size: 1em; - text-align: left; - display: none; - -moz-border-radius: 0px; - -webkit-border-radius: 0px; -} - -div.jGrowl div.jGrowl-notification -{ - min-height: 40px; -} - -div.jGrowl div.jGrowl-notification div.header -{ - font-weight: bold; - font-size: .85em; -} - -div.jGrowl div.jGrowl-notification div.close -{ - z-index: 99; - float: right; - font-weight: bold; - font-size: 1em; - cursor: pointer; -} - -div.jGrowl div.jGrowl-closer -{ - padding-top: 4px; - padding-bottom: 4px; - cursor: pointer; - font-size: .9em; - font-weight: bold; - text-align: center; -} - -/** Hide jGrowl when printing **/ -@media print -{ - div.jGrowl - { - display: none; - } -} diff --git a/NzbDrone.Web/Controllers/SettingsController.cs b/NzbDrone.Web/Controllers/SettingsController.cs index 4e05898ef..4ba6e5c0d 100644 --- a/NzbDrone.Web/Controllers/SettingsController.cs +++ b/NzbDrone.Web/Controllers/SettingsController.cs @@ -20,33 +20,23 @@ namespace NzbDrone.Web.Controllers [HandleError] public class SettingsController : Controller { - private const string SETTINGS_SAVED = "Settings Saved."; - private const string SETTINGS_FAILED = "Error Saving Settings, please fix any errors"; private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private readonly ConfigProvider _configProvider; private readonly IndexerProvider _indexerProvider; private readonly QualityProvider _qualityProvider; - private readonly RootDirProvider _rootDirProvider; private readonly AutoConfigureProvider _autoConfigureProvider; - private readonly NotificationProvider _notificationProvider; - private readonly DiskProvider _diskProvider; private readonly SeriesProvider _seriesProvider; private readonly ExternalNotificationProvider _externalNotificationProvider; public SettingsController(ConfigProvider configProvider, IndexerProvider indexerProvider, - QualityProvider qualityProvider, RootDirProvider rootDirProvider, - AutoConfigureProvider autoConfigureProvider, NotificationProvider notificationProvider, - DiskProvider diskProvider, SeriesProvider seriesProvider, - ExternalNotificationProvider externalNotificationProvider) + QualityProvider qualityProvider, AutoConfigureProvider autoConfigureProvider, + SeriesProvider seriesProvider, ExternalNotificationProvider externalNotificationProvider) { _externalNotificationProvider = externalNotificationProvider; _configProvider = configProvider; _indexerProvider = indexerProvider; _qualityProvider = qualityProvider; - _rootDirProvider = rootDirProvider; _autoConfigureProvider = autoConfigureProvider; - _notificationProvider = notificationProvider; - _diskProvider = diskProvider; _seriesProvider = seriesProvider; } @@ -68,35 +58,35 @@ namespace NzbDrone.Web.Controllers public ActionResult Indexers() { return View(new IndexerSettingsModel - { - NzbMatrixUsername = _configProvider.NzbMatrixUsername, - NzbMatrixApiKey = _configProvider.NzbMatrixApiKey, + { + NzbMatrixUsername = _configProvider.NzbMatrixUsername, + NzbMatrixApiKey = _configProvider.NzbMatrixApiKey, - NzbsrusUId = _configProvider.NzbsrusUId, - NzbsrusHash = _configProvider.NzbsrusHash, + NzbsrusUId = _configProvider.NzbsrusUId, + NzbsrusHash = _configProvider.NzbsrusHash, - NzbsOrgHash = _configProvider.NzbsOrgHash, - NzbsOrgUId = _configProvider.NzbsOrgUId, + NzbsOrgHash = _configProvider.NzbsOrgHash, + NzbsOrgUId = _configProvider.NzbsOrgUId, - NewzbinUsername = _configProvider.NewzbinUsername, - NewzbinPassword = _configProvider.NewzbinPassword, + NewzbinUsername = _configProvider.NewzbinUsername, + NewzbinPassword = _configProvider.NewzbinPassword, - NzbsOrgEnabled = _indexerProvider.GetSettings(typeof(NzbsOrg)).Enable, - NzbMatrixEnabled = _indexerProvider.GetSettings(typeof(NzbMatrix)).Enable, - NzbsRUsEnabled = _indexerProvider.GetSettings(typeof(NzbsRUs)).Enable, - NewzbinEnabled = _indexerProvider.GetSettings(typeof(Newzbin)).Enable - }); + NzbsOrgEnabled = _indexerProvider.GetSettings(typeof(NzbsOrg)).Enable, + NzbMatrixEnabled = _indexerProvider.GetSettings(typeof(NzbMatrix)).Enable, + NzbsRUsEnabled = _indexerProvider.GetSettings(typeof(NzbsRUs)).Enable, + NewzbinEnabled = _indexerProvider.GetSettings(typeof(Newzbin)).Enable + }); } public ActionResult Sabnzbd() { var sabDropDir = _configProvider.SabDropDirectory; - var selectList = new SelectList(new List {sabDropDir}, sabDropDir); + var selectList = new SelectList(new List { sabDropDir }, sabDropDir); var model = new SabnzbdSettingsModel { SabHost = _configProvider.SabHost, - SabPort =_configProvider.SabPort, + SabPort = _configProvider.SabPort, SabApiKey = _configProvider.SabApiKey, SabUsername = _configProvider.SabUsername, SabPassword = _configProvider.SabPassword, @@ -266,13 +256,11 @@ namespace NzbDrone.Web.Controllers return new JsonResult { Data = "failed" }; } } - + [HttpPost] - public ActionResult SaveIndexers(IndexerSettingsModel data) + public JsonResult SaveIndexers(IndexerSettingsModel data) { - var progressNotification = new ProgressNotification("Settings"); _notificationProvider.Register(progressNotification); - if (ModelState.IsValid) { var nzbsOrgSettings = _indexerProvider.GetSettings(typeof(NzbsOrg)); @@ -303,22 +291,16 @@ namespace NzbDrone.Web.Controllers _configProvider.NewzbinUsername = data.NewzbinUsername; _configProvider.NewzbinPassword = data.NewzbinPassword; - progressNotification.CurrentMessage = SETTINGS_SAVED; - progressNotification.Status = ProgressNotificationStatus.Completed; - return Content(SETTINGS_SAVED); + return GetSuccessResult(); } - progressNotification.CurrentMessage = SETTINGS_FAILED; - progressNotification.Status = ProgressNotificationStatus.Completed; - return Content(SETTINGS_FAILED); + return GetInvalidModelResult(); } [HttpPost] - public ActionResult SaveSabnzbd(SabnzbdSettingsModel data) + public JsonResult SaveSabnzbd(SabnzbdSettingsModel data) { - var progressNotification = new ProgressNotification("Settings"); _notificationProvider.Register(progressNotification); - if (ModelState.IsValid) { _configProvider.SabHost = data.SabHost; @@ -330,29 +312,27 @@ namespace NzbDrone.Web.Controllers _configProvider.SabTvPriority = data.SabTvPriority; _configProvider.SabDropDirectory = data.SabDropDirectory; - progressNotification.CurrentMessage = SETTINGS_SAVED; - progressNotification.Status = ProgressNotificationStatus.Completed; - return Content(SETTINGS_SAVED); + + return GetSuccessResult(); } - progressNotification.CurrentMessage = SETTINGS_FAILED; - progressNotification.Status = ProgressNotificationStatus.Completed; - return Content(SETTINGS_FAILED); + return + Json(new NotificationResult() { Title = "Failed", Text = "Invalid request data.", NotificationType = NotificationType.Error }); } + + [HttpPost] public ActionResult SaveQuality(QualityModel data) { - var progressNotification = new ProgressNotification("Settings"); _notificationProvider.Register(progressNotification); - if (ModelState.IsValid) { _configProvider.DefaultQualityProfile = data.DefaultQualityProfileId; //Saves only the Default Quality, skips User Profiles since none exist if (data.Profiles == null) - return Content(SETTINGS_SAVED); + return GetSuccessResult(); foreach (var profile in data.Profiles) { @@ -377,22 +357,16 @@ namespace NzbDrone.Web.Controllers _qualityProvider.Update(profile); } - progressNotification.CurrentMessage = SETTINGS_SAVED; - progressNotification.Status = ProgressNotificationStatus.Completed; - return Content(SETTINGS_SAVED); + return GetSuccessResult(); } - progressNotification.CurrentMessage = SETTINGS_FAILED; - progressNotification.Status = ProgressNotificationStatus.Completed; - return Content(SETTINGS_FAILED); + return GetInvalidModelResult(); } [HttpPost] public ActionResult SaveNotifications(NotificationSettingsModel data) { - var progressNotification = new ProgressNotification("Settings"); _notificationProvider.Register(progressNotification); - if (ModelState.IsValid) { //XBMC Enabled @@ -408,22 +382,16 @@ namespace NzbDrone.Web.Controllers _configProvider.XbmcUsername = data.XbmcUsername; _configProvider.XbmcPassword = data.XbmcPassword; - progressNotification.CurrentMessage = SETTINGS_SAVED; - progressNotification.Status = ProgressNotificationStatus.Completed; - return Content(SETTINGS_SAVED); + return GetSuccessResult(); } - progressNotification.CurrentMessage = SETTINGS_FAILED; - progressNotification.Status = ProgressNotificationStatus.Completed; - return Content(SETTINGS_FAILED); + return GetInvalidModelResult(); } [HttpPost] public ActionResult SaveEpisodeSorting(EpisodeSortingModel data) { - var progressNotification = new ProgressNotification("Settings"); _notificationProvider.Register(progressNotification); - if (ModelState.IsValid) { _configProvider.SortingIncludeSeriesName = data.SeriesName; @@ -436,14 +404,20 @@ namespace NzbDrone.Web.Controllers _configProvider.SortingNumberStyle = data.NumberStyle; _configProvider.SortingMultiEpisodeStyle = data.MultiEpisodeStyle; - progressNotification.CurrentMessage = SETTINGS_SAVED; - progressNotification.Status = ProgressNotificationStatus.Completed; - return Content(SETTINGS_SAVED); + return GetSuccessResult(); } - progressNotification.CurrentMessage = SETTINGS_FAILED; - progressNotification.Status = ProgressNotificationStatus.Completed; - return Content(SETTINGS_FAILED); + return GetInvalidModelResult(); + } + + private JsonResult GetSuccessResult() + { + return Json(new NotificationResult() { Title = "Settings Saved" }); + } + + private JsonResult GetInvalidModelResult() + { + return Json(new NotificationResult() { Title = "Unable to save setting", Text = "Invalid post data", NotificationType = NotificationType.Error }); } } } \ No newline at end of file diff --git a/NzbDrone.Web/Models/NotificationResult.cs b/NzbDrone.Web/Models/NotificationResult.cs new file mode 100644 index 000000000..e2c49e93a --- /dev/null +++ b/NzbDrone.Web/Models/NotificationResult.cs @@ -0,0 +1,25 @@ +namespace NzbDrone.Web.Models +{ + public class NotificationResult + { + public NotificationResult() + { + Text = string.Empty; + } + + public bool IsMessage { get { return true; } } + + public string Title { get; set; } + public string Text { get; set; } + public NotificationType NotificationType { get; set; } + + + } + + public enum NotificationType + { + Info, + Error + } + +} \ No newline at end of file diff --git a/NzbDrone.Web/NzbDrone.Web.csproj b/NzbDrone.Web/NzbDrone.Web.csproj index 01cedf526..fe130accf 100644 --- a/NzbDrone.Web/NzbDrone.Web.csproj +++ b/NzbDrone.Web/NzbDrone.Web.csproj @@ -51,9 +51,9 @@ ..\Libraries\MVC3\Microsoft.Web.Infrastructure.dll True - + False - ..\packages\MiniProfiler.1.6\lib\MvcMiniProfiler.dll + ..\packages\MiniProfiler.1.7\lib\MvcMiniProfiler.dll ..\packages\Ninject.2.2.1.4\lib\net40-Full\Ninject.dll @@ -135,6 +135,11 @@ + + + + + @@ -160,6 +165,7 @@ + @@ -247,7 +253,6 @@ - @@ -255,13 +260,13 @@ + - diff --git a/NzbDrone.Web/Scripts/Notification.js b/NzbDrone.Web/Scripts/Notification.js index df626c099..11d6cda63 100644 --- a/NzbDrone.Web/Scripts/Notification.js +++ b/NzbDrone.Web/Scripts/Notification.js @@ -1,4 +1,57 @@ -$(window).load(function () { + +(function ($) { + + $.extend($.gritter.options, { + fade_in_speed: 'medium', // how fast notifications fade in (string or int) + fade_out_speed: 'medium', // how fast the notices fade out + time: 3000, // hang on the screen for... + sticky: false + }); + + + $.ajaxPrefilter(function (options, originalOptions, jqXHR) { + + jqXHR.success(function (data) { + //Check if the response is a message type, + if (data.IsMessage) { + if (data.NotificationType === 0) { + $.gritter.add({ + title: data.Title, + text: data.Text, + image: '/content/images/success.png', + class_name: 'gritter-success' + }); + } + else { + $.gritter.add({ + title: data.Title, + text: data.Text, + image: '/content/images/error.png', + class_name: 'gritter-fail' + }); + } + } + }); + + jqXHR.error(function (xhr, ajaxOptions, thrownError) { + //ignore notification errors. + if (this.url.indexOf("/notification/Comet") !== 0) { + $.gritter.add({ + title: 'Request failed', + text: this.url, + image: '/content/images/error.png', + class_name: 'gritter-fail' + }); + } + }); + + }); + + +} (jQuery)); + + +$(window).load(function () { var speed = 700; var isShown = false; var currentMessage = ""; @@ -10,7 +63,7 @@ else { refreshNotifications(); } - + function refreshNotifications() { $.get('/notification/Comet', { message: currentMessage }, notificationCallback); diff --git a/NzbDrone.Web/Scripts/Plugins/jquery.gritter.js b/NzbDrone.Web/Scripts/Plugins/jquery.gritter.js new file mode 100644 index 000000000..2a6f6e460 --- /dev/null +++ b/NzbDrone.Web/Scripts/Plugins/jquery.gritter.js @@ -0,0 +1,406 @@ +/* +* https://raw.github.com/jboesch/Gritter/master/js/jquery.gritter.js +* Gritter for jQuery +* http://www.boedesign.com/ +* +* Copyright (c) 2011 Jordan Boesch +* Dual licensed under the MIT and GPL licenses. +* +* Date: March 29, 2011 +* Version: 1.7.1 +*/ + +(function ($) { + + /** + * Set it up as an object under the jQuery namespace + */ + $.gritter = {}; + + /** + * Set up global options that the user can over-ride + */ + $.gritter.options = { + position: '', + fade_in_speed: 'medium', // how fast notifications fade in + fade_out_speed: 1000, // how fast the notices fade out + time: 6000 // hang on the screen for... + } + + /** + * Add a gritter notification to the screen + * @see Gritter#add(); + */ + $.gritter.add = function (params) { + + try { + return Gritter.add(params || {}); + } catch (e) { + + var err = 'Gritter Error: ' + e; + (typeof (console) != 'undefined' && console.error) ? + console.error(err, params) : + alert(err); + + } + + } + + /** + * Remove a gritter notification from the screen + * @see Gritter#removeSpecific(); + */ + $.gritter.remove = function (id, params) { + Gritter.removeSpecific(id, params || {}); + } + + /** + * Remove all notifications + * @see Gritter#stop(); + */ + $.gritter.removeAll = function (params) { + Gritter.stop(params || {}); + } + + /** + * Big fat Gritter object + * @constructor (not really since it's object literal) + */ + var Gritter = { + + // Public - options to over-ride with $.gritter.options in "add" + position: '', + fade_in_speed: '', + fade_out_speed: '', + time: '', + + // Private - no touchy the private parts + _custom_timer: 0, + _item_count: 0, + _is_setup: 0, + _tpl_close: '
', + _tpl_item: '', + _tpl_wrap: '
', + + /** + * Add a gritter notification to the screen + * @param {Object} params The object that contains all the options for drawing the notification + * @return {Integer} The specific numeric id to that gritter notification + */ + add: function (params) { + + // We might have some issues if we don't have a title or text! + if (!params.title) { + throw 'You need to fill out the first 2 params: "title" and "text"'; + } + + // Check the options and set them once + if (!this._is_setup) { + this._runSetup(); + } + + // Basics + var user = params.title, + text = params.text, + image = params.image || '', + sticky = params.sticky || false, + item_class = params.class_name || '', + position = $.gritter.options.position, + time_alive = params.time || ''; + + this._verifyWrapper(); + + this._item_count++; + var number = this._item_count, + tmp = this._tpl_item; + + // Assign callbacks + $(['before_open', 'after_open', 'before_close', 'after_close']).each(function (i, val) { + Gritter['_' + val + '_' + number] = ($.isFunction(params[val])) ? params[val] : function () { } + }); + + // Reset + this._custom_timer = 0; + + // A custom fade time set + if (time_alive) { + this._custom_timer = time_alive; + } + + var image_str = (image != '') ? '' : '', + class_name = (image != '') ? 'gritter-with-image' : 'gritter-without-image'; + + // String replacements on the template + tmp = this._str_replace( + ['[[username]]', '[[text]]', '[[close]]', '[[image]]', '[[number]]', '[[class_name]]', '[[item_class]]'], + [user, text, this._tpl_close, image_str, this._item_count, class_name, item_class], tmp + ); + + this['_before_open_' + number](); + $('#gritter-notice-wrapper').addClass(position).append(tmp); + + var item = $('#gritter-item-' + this._item_count); + + item.fadeIn(this.fade_in_speed, function () { + Gritter['_after_open_' + number]($(this)); + }); + + if (!sticky) { + this._setFadeTimer(item, number); + } + + // Bind the hover/unhover states + $(item).bind('mouseenter mouseleave', function (event) { + if (event.type == 'mouseenter') { + if (!sticky) { + Gritter._restoreItemIfFading($(this), number); + } + } + else { + if (!sticky) { + Gritter._setFadeTimer($(this), number); + } + } + Gritter._hoverState($(this), event.type); + }); + + return number; + + }, + + /** + * If we don't have any more gritter notifications, get rid of the wrapper using this check + * @private + * @param {Integer} unique_id The ID of the element that was just deleted, use it for a callback + * @param {Object} e The jQuery element that we're going to perform the remove() action on + * @param {Boolean} manual_close Did we close the gritter dialog with the (X) button + */ + _countRemoveWrapper: function (unique_id, e, manual_close) { + + // Remove it then run the callback function + e.remove(); + this['_after_close_' + unique_id](e, manual_close); + + // Check if the wrapper is empty, if it is.. remove the wrapper + if ($('.gritter-item-wrapper').length == 0) { + $('#gritter-notice-wrapper').remove(); + } + + }, + + /** + * Fade out an element after it's been on the screen for x amount of time + * @private + * @param {Object} e The jQuery element to get rid of + * @param {Integer} unique_id The id of the element to remove + * @param {Object} params An optional list of params to set fade speeds etc. + * @param {Boolean} unbind_events Unbind the mouseenter/mouseleave events if they click (X) + */ + _fade: function (e, unique_id, params, unbind_events) { + + var params = params || {}, + fade = (typeof (params.fade) != 'undefined') ? params.fade : true; + fade_out_speed = params.speed || this.fade_out_speed, + manual_close = unbind_events; + + this['_before_close_' + unique_id](e, manual_close); + + // If this is true, then we are coming from clicking the (X) + if (unbind_events) { + e.unbind('mouseenter mouseleave'); + } + + // Fade it out or remove it + if (fade) { + + e.animate({ + opacity: 0 + }, fade_out_speed, function () { + e.animate({ height: 0 }, 300, function () { + Gritter._countRemoveWrapper(unique_id, e, manual_close); + }) + }) + + } + else { + + this._countRemoveWrapper(unique_id, e); + + } + + }, + + /** + * Perform actions based on the type of bind (mouseenter, mouseleave) + * @private + * @param {Object} e The jQuery element + * @param {String} type The type of action we're performing: mouseenter or mouseleave + */ + _hoverState: function (e, type) { + + // Change the border styles and add the (X) close button when you hover + if (type == 'mouseenter') { + + e.addClass('hover'); + + // Show close button + e.find('.gritter-close').show(); + + // Clicking (X) makes the perdy thing close + e.find('.gritter-close').click(function () { + + var unique_id = e.attr('id').split('-')[2]; + Gritter.removeSpecific(unique_id, {}, e, true); + + }); + + } + // Remove the border styles and hide (X) close button when you mouse out + else { + + e.removeClass('hover'); + + // Hide close button + e.find('.gritter-close').hide(); + + } + + }, + + /** + * Remove a specific notification based on an ID + * @param {Integer} unique_id The ID used to delete a specific notification + * @param {Object} params A set of options passed in to determine how to get rid of it + * @param {Object} e The jQuery element that we're "fading" then removing + * @param {Boolean} unbind_events If we clicked on the (X) we set this to true to unbind mouseenter/mouseleave + */ + removeSpecific: function (unique_id, params, e, unbind_events) { + + if (!e) { + var e = $('#gritter-item-' + unique_id); + } + + // We set the fourth param to let the _fade function know to + // unbind the "mouseleave" event. Once you click (X) there's no going back! + this._fade(e, unique_id, params || {}, unbind_events); + + }, + + /** + * If the item is fading out and we hover over it, restore it! + * @private + * @param {Object} e The HTML element to remove + * @param {Integer} unique_id The ID of the element + */ + _restoreItemIfFading: function (e, unique_id) { + + clearTimeout(this['_int_id_' + unique_id]); + e.stop().css({ opacity: '' }); + + }, + + /** + * Setup the global options - only once + * @private + */ + _runSetup: function () { + + for (opt in $.gritter.options) { + this[opt] = $.gritter.options[opt]; + } + this._is_setup = 1; + + }, + + /** + * Set the notification to fade out after a certain amount of time + * @private + * @param {Object} item The HTML element we're dealing with + * @param {Integer} unique_id The ID of the element + */ + _setFadeTimer: function (e, unique_id) { + + var timer_str = (this._custom_timer) ? this._custom_timer : this.time; + this['_int_id_' + unique_id] = setTimeout(function () { + Gritter._fade(e, unique_id); + }, timer_str); + + }, + + /** + * Bring everything to a halt + * @param {Object} params A list of callback functions to pass when all notifications are removed + */ + stop: function (params) { + + // callbacks (if passed) + var before_close = ($.isFunction(params.before_close)) ? params.before_close : function () { }; + var after_close = ($.isFunction(params.after_close)) ? params.after_close : function () { }; + + var wrap = $('#gritter-notice-wrapper'); + before_close(wrap); + wrap.fadeOut(function () { + $(this).remove(); + after_close(); + }); + + }, + + /** + * An extremely handy PHP function ported to JS, works well for templating + * @private + * @param {String/Array} search A list of things to search for + * @param {String/Array} replace A list of things to replace the searches with + * @return {String} sa The output + */ + _str_replace: function (search, replace, subject, count) { + + var i = 0, j = 0, temp = '', repl = '', sl = 0, fl = 0, + f = [].concat(search), + r = [].concat(replace), + s = subject, + ra = r instanceof Array, sa = s instanceof Array; + s = [].concat(s); + + if (count) { + this.window[count] = 0; + } + + for (i = 0, sl = s.length; i < sl; i++) { + + if (s[i] === '') { + continue; + } + + for (j = 0, fl = f.length; j < fl; j++) { + + temp = s[i] + ''; + repl = ra ? (r[j] !== undefined ? r[j] : '') : r[0]; + s[i] = (temp).split(f[j]).join(repl); + + if (count && s[i] !== temp) { + this.window[count] += (temp.length - s[i].length) / f[j].length; + } + + } + } + + return sa ? s : s[0]; + + }, + + /** + * A check to make sure we have something to wrap our notices with + * @private + */ + _verifyWrapper: function () { + + if ($('#gritter-notice-wrapper').length == 0) { + $('body').append(this._tpl_wrap); + } + + } + + } + +})(jQuery); diff --git a/NzbDrone.Web/Scripts/Plugins/jquery.jgrowl.js b/NzbDrone.Web/Scripts/Plugins/jquery.jgrowl.js deleted file mode 100644 index 3013f21d6..000000000 --- a/NzbDrone.Web/Scripts/Plugins/jquery.jgrowl.js +++ /dev/null @@ -1,309 +0,0 @@ -/** -* jGrowl 1.2.4 -* -* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) -* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. -* -* Written by Stan Lemon -* Last updated: 2009.12.13 -* -* jGrowl is a jQuery plugin implementing unobtrusive userland notifications. These -* notifications function similarly to the Growl Framework available for -* Mac OS X (http://growl.info). -* -* To Do: -* - Move library settings to containers and allow them to be changed per container -* -* Changes in 1.2.4 -* - Fixed IE bug with the close-all button -* - Fixed IE bug with the filter CSS attribute (special thanks to gotwic) -* - Update IE opacity CSS -* - Changed font sizes to use "em", and only set the base style -* -* Changes in 1.2.3 -* - The callbacks no longer use the container as context, instead they use the actual notification -* - The callbacks now receive the container as a parameter after the options parameter -* - beforeOpen and beforeClose now check the return value, if it's false - the notification does -* not continue. The open callback will also halt execution if it returns false. -* - Fixed bug where containers would get confused -* - Expanded the pause functionality to pause an entire container. -* -* Changes in 1.2.2 -* - Notification can now be theme rolled for jQuery UI, special thanks to Jeff Chan! -* -* Changes in 1.2.1 -* - Fixed instance where the interval would fire the close method multiple times. -* - Added CSS to hide from print media -* - Fixed issue with closer button when div { position: relative } is set -* - Fixed leaking issue with multiple containers. Special thanks to Matthew Hanlon! -* -* Changes in 1.2.0 -* - Added message pooling to limit the number of messages appearing at a given time. -* - Closing a notification is now bound to the notification object and triggered by the close button. -* -* Changes in 1.1.2 -* - Added iPhone styled example -* - Fixed possible IE7 bug when determining if the ie6 class shoudl be applied. -* - Added template for the close button, so that it's content could be customized. -* -* Changes in 1.1.1 -* - Fixed CSS styling bug for ie6 caused by a mispelling -* - Changes height restriction on default notifications to min-height -* - Added skinned examples using a variety of images -* - Added the ability to customize the content of the [close all] box -* - Added jTweet, an example of using jGrowl + Twitter -* -* Changes in 1.1.0 -* - Multiple container and instances. -* - Standard $.jGrowl() now wraps $.fn.jGrowl() by first establishing a generic jGrowl container. -* - Instance methods of a jGrowl container can be called by $.fn.jGrowl(methodName) -* - Added glue preferenced, which allows notifications to be inserted before or after nodes in the container -* - Added new log callback which is called before anything is done for the notification -* - Corner's attribute are now applied on an individual notification basis. -* -* Changes in 1.0.4 -* - Various CSS fixes so that jGrowl renders correctly in IE6. -* -* Changes in 1.0.3 -* - Fixed bug with options persisting across notifications -* - Fixed theme application bug -* - Simplified some selectors and manipulations. -* - Added beforeOpen and beforeClose callbacks -* - Reorganized some lines of code to be more readable -* - Removed unnecessary this.defaults context -* - If corners plugin is present, it's now customizable. -* - Customizable open animation. -* - Customizable close animation. -* - Customizable animation easing. -* - Added customizable positioning (top-left, top-right, bottom-left, bottom-right, center) -* -* Changes in 1.0.2 -* - All CSS styling is now external. -* - Added a theme parameter which specifies a secondary class for styling, such -* that notifications can be customized in appearance on a per message basis. -* - Notification life span is now customizable on a per message basis. -* - Added the ability to disable the global closer, enabled by default. -* - Added callbacks for when a notification is opened or closed. -* - Added callback for the global closer. -* - Customizable animation speed. -* - jGrowl now set itself up and tears itself down. -* -* Changes in 1.0.1: -* - Removed dependency on metadata plugin in favor of .data() -* - Namespaced all events -*/ -(function ($) { - - /** jGrowl Wrapper - Establish a base jGrowl Container for compatibility with older releases. **/ - $.jGrowl = function (m, o) { - // To maintain compatibility with older version that only supported one instance we'll create the base container. - if ($('#jGrowl').size() == 0) - $('
').addClass($.jGrowl.defaults.position).appendTo('body'); - - // Create a notification on the container. - $('#jGrowl').jGrowl(m, o); - }; - - - /** Raise jGrowl Notification on a jGrowl Container **/ - $.fn.jGrowl = function (m, o) { - if ($.isFunction(this.each)) { - var args = arguments; - - return this.each(function () { - var self = this; - - /** Create a jGrowl Instance on the Container if it does not exist **/ - if ($(this).data('jGrowl.instance') == undefined) { - $(this).data('jGrowl.instance', $.extend(new $.fn.jGrowl(), { notifications: [], element: null, interval: null })); - $(this).data('jGrowl.instance').startup(this); - } - - /** Optionally call jGrowl instance methods, or just raise a normal notification **/ - if ($.isFunction($(this).data('jGrowl.instance')[m])) { - $(this).data('jGrowl.instance')[m].apply($(this).data('jGrowl.instance'), $.makeArray(args).slice(1)); - } else { - $(this).data('jGrowl.instance').create(m, o); - } - }); - }; - }; - - $.extend($.fn.jGrowl.prototype, { - - /** Default JGrowl Settings **/ - defaults: { - pool: 0, - header: '', - group: '', - sticky: false, - position: 'top-right', // Is this still needed? - glue: 'after', - theme: 'default', - corners: '0px', - check: 250, - life: 3000, - speed: '0', - easing: 'swing', - closer: true, - closeTemplate: '×', - closerTemplate: '
[ close all ]
', - log: function (e, m, o) { }, - beforeOpen: function (e, m, o) { }, - open: function (e, m, o) { }, - beforeClose: function (e, m, o) { }, - close: function (e, m, o) { }, - animateOpen: { - opacity: 'show' - }, - animateClose: { - opacity: 'hide' - } - }, - - notifications: [], - - /** jGrowl Container Node **/ - element: null, - - /** Interval Function **/ - interval: null, - - /** Create a Notification **/ - create: function (message, o) { - var o = $.extend({}, this.defaults, o); - - this.notifications.push({ message: message, options: o }); - - o.log.apply(this.element, [this.element, message, o]); - }, - - render: function (notification) { - var self = this; - var message = notification.message; - var o = notification.options; - - - var notification = $( - '
' + - '
' + o.closeTemplate + '
' + - '
' + o.header + '
' + - '
' + message + '
' - ).data("jGrowl", o).addClass(o.theme).children('div.close').bind("click.jGrowl", function () { - $(this).parent().trigger('jGrowl.close'); - }).parent(); - - - /** Notification Actions **/ - $(notification).bind("mouseover.jGrowl", function () { - $('div.jGrowl-notification', self.element).data("jGrowl.pause", true); - }).bind("mouseout.jGrowl", function () { - $('div.jGrowl-notification', self.element).data("jGrowl.pause", false); - }).bind('jGrowl.beforeOpen', function () { - if (o.beforeOpen.apply(notification, [notification, message, o, self.element]) != false) { - $(this).trigger('jGrowl.open'); - } - }).bind('jGrowl.open', function () { - if (o.open.apply(notification, [notification, message, o, self.element]) != false) { - if (o.glue == 'after') { - $('div.jGrowl-notification:last', self.element).after(notification); - } else { - $('div.jGrowl-notification:first', self.element).before(notification); - } - - $(this).animate(o.animateOpen, 0, o.easing, function () { - // Fixes some anti-aliasing issues with IE filters. - if ($.browser.msie && (parseInt($(this).css('opacity'), 10) === 1 || parseInt($(this).css('opacity'), 10) === 0)) - this.style.removeAttribute('filter'); - - $(this).data("jGrowl").created = new Date(); - }); - } - }).bind('jGrowl.beforeClose', function () { - if (o.beforeClose.apply(notification, [notification, message, o, self.element]) != false) - $(this).trigger('jGrowl.close'); - }).bind('jGrowl.close', function () { - // Pause the notification, lest during the course of animation another close event gets called. - $(this).data('jGrowl.pause', true); - $(this).animate(o.animateClose, o.speed, o.easing, function () { - $(this).remove(); - var close = o.close.apply(notification, [notification, message, o, self.element]); - - if ($.isFunction(close)) - close.apply(notification, [notification, message, o, self.element]); - }); - }).trigger('jGrowl.beforeOpen'); - - /** Optional Corners Plugin **/ - if ($.fn.corner != undefined) $(notification).corner(o.corners); - - /** Add a Global Closer if more than one notification exists **/ - if ($('div.jGrowl-notification:parent', self.element).size() > 1 && - $('div.jGrowl-closer', self.element).size() == 0 && this.defaults.closer != false) { - $(this.defaults.closerTemplate).addClass('jGrowl-closer ui-state-highlight ui-corner-all').addClass(this.defaults.theme) - .appendTo(self.element).animate(this.defaults.animateOpen, this.defaults.speed, this.defaults.easing) - .bind("click.jGrowl", function () { - $(this).siblings().children('div.close').trigger("click.jGrowl"); - - if ($.isFunction(self.defaults.closer)) { - self.defaults.closer.apply($(this).parent()[0], [$(this).parent()[0]]); - } - }); - }; - }, - - /** Update the jGrowl Container, removing old jGrowl notifications **/ - update: function () { - $(this.element).find('div.jGrowl-notification:parent').each(function () { - if ($(this).data("jGrowl") != undefined && $(this).data("jGrowl").created != undefined && - ($(this).data("jGrowl").created.getTime() + $(this).data("jGrowl").life) < (new Date()).getTime() && - $(this).data("jGrowl").sticky != true && - ($(this).data("jGrowl.pause") == undefined || $(this).data("jGrowl.pause") != true)) { - - // Pause the notification, lest during the course of animation another close event gets called. - $(this).trigger('jGrowl.beforeClose'); - } - }); - - if (this.notifications.length > 0 && - (this.defaults.pool == 0 || $(this.element).find('div.jGrowl-notification:parent').size() < this.defaults.pool)) - this.render(this.notifications.shift()); - - if ($(this.element).find('div.jGrowl-notification:parent').size() < 2) { - $(this.element).find('div.jGrowl-closer').animate(this.defaults.animateClose, this.defaults.speed, this.defaults.easing, function () { - $(this).remove(); - }); - } - }, - - /** Setup the jGrowl Notification Container **/ - startup: function (e) { - this.element = $(e).addClass('jGrowl').append('
'); - this.interval = setInterval(function () { - $(e).data('jGrowl.instance').update(); - }, this.defaults.check); - - if ($.browser.msie && parseInt($.browser.version) < 7 && !window["XMLHttpRequest"]) { - $(this.element).addClass('ie6'); - } - }, - - /** Shutdown jGrowl, removing it and clearing the interval **/ - shutdown: function () { - $(this.element).removeClass('jGrowl').find('div.jGrowl-notification').remove(); - clearInterval(this.interval); - }, - - close: function () { - $(this.element).find('div.jGrowl-notification').each(function () { - $(this).trigger('jGrowl.beforeClose'); - }); - } - }); - - /** Reference the Defaults Object for compatibility with older versions of jGrowl **/ - $.jGrowl.defaults = $.fn.jGrowl.prototype.defaults; - -})(jQuery); \ No newline at end of file diff --git a/NzbDrone.Web/Scripts/settingsForm.js b/NzbDrone.Web/Scripts/settingsForm.js index dfb7b8609..9c0a0a14e 100644 --- a/NzbDrone.Web/Scripts/settingsForm.js +++ b/NzbDrone.Web/Scripts/settingsForm.js @@ -1,8 +1,8 @@ $(document).ready(function () { var options = { target: '#result', - beforeSubmit: showRequest, - success: showResponse, + //beforeSubmit: showRequest, + //success: showResponse, type: 'post', resetForm: false }; diff --git a/NzbDrone.Web/Views/Series/EditorTemplates/SeriesModel.cshtml b/NzbDrone.Web/Views/Series/EditorTemplates/SeriesModel.cshtml index 8beff06af..ce12e42bf 100644 --- a/NzbDrone.Web/Views/Series/EditorTemplates/SeriesModel.cshtml +++ b/NzbDrone.Web/Views/Series/EditorTemplates/SeriesModel.cshtml @@ -27,7 +27,4 @@ @Html.TextBoxFor(m => m.Path, new { @class = "inputClass" }) - - \ No newline at end of file + \ No newline at end of file diff --git a/NzbDrone.Web/Views/Settings/EpisodeSorting.cshtml b/NzbDrone.Web/Views/Settings/EpisodeSorting.cshtml index 1bc05aa36..7780ca833 100644 --- a/NzbDrone.Web/Views/Settings/EpisodeSorting.cshtml +++ b/NzbDrone.Web/Views/Settings/EpisodeSorting.cshtml @@ -81,7 +81,7 @@ - Loader + }
diff --git a/NzbDrone.Web/Views/Settings/Indexers.cshtml b/NzbDrone.Web/Views/Settings/Indexers.cshtml index 0d8927859..b867f7f65 100644 --- a/NzbDrone.Web/Views/Settings/Indexers.cshtml +++ b/NzbDrone.Web/Views/Settings/Indexers.cshtml @@ -125,7 +125,7 @@ }
- Loader + } diff --git a/NzbDrone.Web/Views/Settings/Notifications.cshtml b/NzbDrone.Web/Views/Settings/Notifications.cshtml index e5e859d63..82f64adbf 100644 --- a/NzbDrone.Web/Views/Settings/Notifications.cshtml +++ b/NzbDrone.Web/Views/Settings/Notifications.cshtml @@ -92,7 +92,7 @@ @Html.TextBoxFor(m => m.XbmcPassword, new { @class = "inputClass" }) - Loader + } diff --git a/NzbDrone.Web/Views/Settings/Quality.cshtml b/NzbDrone.Web/Views/Settings/Quality.cshtml index 7be8f82ed..82fd8754a 100644 --- a/NzbDrone.Web/Views/Settings/Quality.cshtml +++ b/NzbDrone.Web/Views/Settings/Quality.cshtml @@ -40,7 +40,7 @@ Settings
- Loader + } diff --git a/NzbDrone.Web/Views/Settings/Sabnzbd.cshtml b/NzbDrone.Web/Views/Settings/Sabnzbd.cshtml index 03696c16c..0b4644517 100644 --- a/NzbDrone.Web/Views/Settings/Sabnzbd.cshtml +++ b/NzbDrone.Web/Views/Settings/Sabnzbd.cshtml @@ -66,7 +66,7 @@ @Html.TextBoxFor(m => m.SabDropDirectory, new { @class = "inputClass folderLookup" }) - Loader + } diff --git a/NzbDrone.Web/Views/Shared/_Layout.cshtml b/NzbDrone.Web/Views/Shared/_Layout.cshtml index e0f040b4b..c8a905c25 100644 --- a/NzbDrone.Web/Views/Shared/_Layout.cshtml +++ b/NzbDrone.Web/Views/Shared/_Layout.cshtml @@ -9,6 +9,7 @@ + @@ -19,9 +20,9 @@ + - diff --git a/NzbDrone.Web/packages.config b/NzbDrone.Web/packages.config index 9dd660df6..9d179e259 100644 --- a/NzbDrone.Web/packages.config +++ b/NzbDrone.Web/packages.config @@ -8,5 +8,5 @@ - + \ No newline at end of file diff --git a/packages/MiniProfiler.1.6/MiniProfiler.1.6.nupkg b/packages/MiniProfiler.1.6/MiniProfiler.1.6.nupkg deleted file mode 100644 index 145e209e4..000000000 Binary files a/packages/MiniProfiler.1.6/MiniProfiler.1.6.nupkg and /dev/null differ diff --git a/packages/MiniProfiler.1.6/lib/MvcMiniProfiler.pdb b/packages/MiniProfiler.1.6/lib/MvcMiniProfiler.pdb deleted file mode 100644 index 80f61f512..000000000 Binary files a/packages/MiniProfiler.1.6/lib/MvcMiniProfiler.pdb and /dev/null differ diff --git a/packages/MiniProfiler.1.7/MiniProfiler.1.7.nupkg b/packages/MiniProfiler.1.7/MiniProfiler.1.7.nupkg new file mode 100644 index 000000000..09419a75a Binary files /dev/null and b/packages/MiniProfiler.1.7/MiniProfiler.1.7.nupkg differ diff --git a/packages/MiniProfiler.1.6/lib/MvcMiniProfiler.dll b/packages/MiniProfiler.1.7/lib/MvcMiniProfiler.dll similarity index 61% rename from packages/MiniProfiler.1.6/lib/MvcMiniProfiler.dll rename to packages/MiniProfiler.1.7/lib/MvcMiniProfiler.dll index db133f6a3..7b1535957 100644 Binary files a/packages/MiniProfiler.1.6/lib/MvcMiniProfiler.dll and b/packages/MiniProfiler.1.7/lib/MvcMiniProfiler.dll differ diff --git a/packages/MiniProfiler.1.7/lib/MvcMiniProfiler.pdb b/packages/MiniProfiler.1.7/lib/MvcMiniProfiler.pdb new file mode 100644 index 000000000..84be4a775 Binary files /dev/null and b/packages/MiniProfiler.1.7/lib/MvcMiniProfiler.pdb differ diff --git a/packages/MiniProfiler.1.6/lib/MvcMiniProfiler.xml b/packages/MiniProfiler.1.7/lib/MvcMiniProfiler.xml similarity index 97% rename from packages/MiniProfiler.1.6/lib/MvcMiniProfiler.xml rename to packages/MiniProfiler.1.7/lib/MvcMiniProfiler.xml index 30cd1ae7d..6c0ff7e9a 100644 --- a/packages/MiniProfiler.1.6/lib/MvcMiniProfiler.xml +++ b/packages/MiniProfiler.1.7/lib/MvcMiniProfiler.xml @@ -668,6 +668,21 @@ proxy + + + This filter can be applied globally to hook up automatic action profiling + + + + + Happens before the action starts running + + + + + Happens after the action executes + + Categorizes individual steps to allow filtering. @@ -1293,6 +1308,32 @@ How large the type is, e.g. for string, size could be 4000 + + + You can wrap your view engines with this view to enable profiling on views and partial + + + + + Create a wrapped view engine, which will profile partials an non-partial views + + + + + + Find a partial view + + + + + Fined a view + + + + + Release view + + Understands how to route and respond to MiniProfiler UI urls.