mirror of https://github.com/Sonarr/Sonarr
Added jquery.unobtrusive-ajax for Ajax Helpers, much cleaner HTML and no jQuery work-around required.
Fix: Ajax Links are working again.
This commit is contained in:
parent
4a55d08130
commit
8b9cb7b8ff
|
@ -11,6 +11,21 @@ namespace NzbDrone.Web.Helpers
|
|||
{
|
||||
public static class LinkHelper
|
||||
{
|
||||
public static MvcHtmlString ImageActionLink(this AjaxHelper helper, string imageUrl, object imgAttributes, string actionName, object routeValues, AjaxOptions ajaxOptions, object htmlAttributes)
|
||||
{
|
||||
return ImageActionLink(helper, imageUrl, imgAttributes, actionName, null, routeValues, ajaxOptions, htmlAttributes);
|
||||
}
|
||||
|
||||
public static MvcHtmlString ImageActionLink(this AjaxHelper helper, string imageUrl, object imgAttributes, string actionName, string controllerName, object routeValues, AjaxOptions ajaxOptions, object htmlAttributes)
|
||||
{
|
||||
var builder = new TagBuilder("img");
|
||||
builder.MergeAttribute("src", imageUrl);
|
||||
var imgAttributesDictionary = new RouteValueDictionary(imgAttributes);
|
||||
builder.MergeAttributes(imgAttributesDictionary);
|
||||
var link = helper.ActionLink("[replaceme]", actionName, controllerName, routeValues, ajaxOptions, htmlAttributes).ToHtmlString();
|
||||
return new MvcHtmlString(link.Replace("[replaceme]", builder.ToString(TagRenderMode.SelfClosing)));
|
||||
}
|
||||
|
||||
public static MvcHtmlString ImageActionLink(this HtmlHelper helper, string imageUrl, object imgAttributes, string actionName, object routeValues, object htmlAttributes)
|
||||
{
|
||||
return ImageActionLink(helper, imageUrl, imgAttributes, actionName, null, routeValues, htmlAttributes);
|
||||
|
|
|
@ -348,6 +348,8 @@
|
|||
<Content Include="Scripts\jquery.livequery.js" />
|
||||
<Content Include="Scripts\jquery.signalR.js" />
|
||||
<Content Include="Scripts\jquery.signalR.min.js" />
|
||||
<Content Include="Scripts\jquery.unobtrusive-ajax.js" />
|
||||
<Content Include="Scripts\jquery.unobtrusive-ajax.min.js" />
|
||||
<Content Include="Scripts\jquery.validate-vsdoc.js" />
|
||||
<Content Include="Scripts\jquery.validate.js" />
|
||||
<Content Include="Scripts\jquery.validate.min.js" />
|
||||
|
|
|
@ -43,20 +43,3 @@
|
|||
});
|
||||
});
|
||||
});
|
||||
|
||||
//Make .ajaxLink use jQuery Ajax for the request
|
||||
|
||||
$(document).on('click', '.ajaxLink', function (event) {
|
||||
event.preventDefault();
|
||||
var onSuccess = $(this).attr('onsuccess');
|
||||
$.ajax({
|
||||
url: this.href,
|
||||
cache: false,
|
||||
success: function () {
|
||||
if (onSuccess) {
|
||||
window[onSuccess]();
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
|
@ -1,6 +1,6 @@
|
|||
/* Click on row, show details */
|
||||
$(document).on('click', '.seriesTable a, .dataTable a', function (event) {
|
||||
if ($(this).hasClass('ajaxLink') || $(this).attr('onclick'))
|
||||
if ($(this).attr('data-ajax') === "true")
|
||||
return;
|
||||
|
||||
event.preventDefault();
|
||||
|
@ -46,14 +46,6 @@ function fnFormatDetails(nTr) {
|
|||
return aData["Details"];
|
||||
}
|
||||
|
||||
//Create Image
|
||||
function createImageAjaxLink(url, image, alt, title, classes) {
|
||||
var html = '<a href="' + url + '" class="ajaxLink">' +
|
||||
'<img class="' + classes + '" src="' + image + '" title="' + title + '" alt="' + alt + '" /></a>';
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
//Reload/Redraw the grid from the server (bServerSide == true)
|
||||
function redrawGrid() {
|
||||
oTable.fnDraw();
|
||||
|
|
|
@ -0,0 +1,163 @@
|
|||
/*!
|
||||
** Unobtrusive Ajax support library for jQuery
|
||||
** Copyright (C) Microsoft Corporation. All rights reserved.
|
||||
*/
|
||||
|
||||
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
|
||||
/*global window: false, jQuery: false */
|
||||
|
||||
(function ($) {
|
||||
var data_click = "unobtrusiveAjaxClick",
|
||||
data_validation = "unobtrusiveValidation";
|
||||
|
||||
function getFunction(code, argNames) {
|
||||
var fn = window, parts = (code || "").split(".");
|
||||
while (fn && parts.length) {
|
||||
fn = fn[parts.shift()];
|
||||
}
|
||||
if (typeof (fn) === "function") {
|
||||
return fn;
|
||||
}
|
||||
argNames.push(code);
|
||||
return Function.constructor.apply(null, argNames);
|
||||
}
|
||||
|
||||
function isMethodProxySafe(method) {
|
||||
return method === "GET" || method === "POST";
|
||||
}
|
||||
|
||||
function asyncOnBeforeSend(xhr, method) {
|
||||
if (!isMethodProxySafe(method)) {
|
||||
xhr.setRequestHeader("X-HTTP-Method-Override", method);
|
||||
}
|
||||
}
|
||||
|
||||
function asyncOnSuccess(element, data, contentType) {
|
||||
var mode;
|
||||
|
||||
if (contentType.indexOf("application/x-javascript") !== -1) { // jQuery already executes JavaScript for us
|
||||
return;
|
||||
}
|
||||
|
||||
mode = (element.getAttribute("data-ajax-mode") || "").toUpperCase();
|
||||
$(element.getAttribute("data-ajax-update")).each(function (i, update) {
|
||||
var top;
|
||||
|
||||
switch (mode) {
|
||||
case "BEFORE":
|
||||
top = update.firstChild;
|
||||
$("<div />").html(data).contents().each(function () {
|
||||
update.insertBefore(this, top);
|
||||
});
|
||||
break;
|
||||
case "AFTER":
|
||||
$("<div />").html(data).contents().each(function () {
|
||||
update.appendChild(this);
|
||||
});
|
||||
break;
|
||||
default:
|
||||
$(update).html(data);
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function asyncRequest(element, options) {
|
||||
var confirm, loading, method, duration;
|
||||
|
||||
confirm = element.getAttribute("data-ajax-confirm");
|
||||
if (confirm && !window.confirm(confirm)) {
|
||||
return;
|
||||
}
|
||||
|
||||
loading = $(element.getAttribute("data-ajax-loading"));
|
||||
duration = element.getAttribute("data-ajax-loading-duration") || 0;
|
||||
|
||||
$.extend(options, {
|
||||
type: element.getAttribute("data-ajax-method") || undefined,
|
||||
url: element.getAttribute("data-ajax-url") || undefined,
|
||||
beforeSend: function (xhr) {
|
||||
var result;
|
||||
asyncOnBeforeSend(xhr, method);
|
||||
result = getFunction(element.getAttribute("data-ajax-begin"), ["xhr"]).apply(this, arguments);
|
||||
if (result !== false) {
|
||||
loading.show(duration);
|
||||
}
|
||||
return result;
|
||||
},
|
||||
complete: function () {
|
||||
loading.hide(duration);
|
||||
getFunction(element.getAttribute("data-ajax-complete"), ["xhr", "status"]).apply(this, arguments);
|
||||
},
|
||||
success: function (data, status, xhr) {
|
||||
asyncOnSuccess(element, data, xhr.getResponseHeader("Content-Type") || "text/html");
|
||||
getFunction(element.getAttribute("data-ajax-success"), ["data", "status", "xhr"]).apply(this, arguments);
|
||||
},
|
||||
error: getFunction(element.getAttribute("data-ajax-failure"), ["xhr", "status", "error"])
|
||||
});
|
||||
|
||||
options.data.push({ name: "X-Requested-With", value: "XMLHttpRequest" });
|
||||
|
||||
method = options.type.toUpperCase();
|
||||
if (!isMethodProxySafe(method)) {
|
||||
options.type = "POST";
|
||||
options.data.push({ name: "X-HTTP-Method-Override", value: method });
|
||||
}
|
||||
|
||||
$.ajax(options);
|
||||
}
|
||||
|
||||
function validate(form) {
|
||||
var validationInfo = $(form).data(data_validation);
|
||||
return !validationInfo || !validationInfo.validate || validationInfo.validate();
|
||||
}
|
||||
|
||||
$("a[data-ajax=true]").live("click", function (evt) {
|
||||
evt.preventDefault();
|
||||
asyncRequest(this, {
|
||||
url: this.href,
|
||||
type: "GET",
|
||||
data: []
|
||||
});
|
||||
});
|
||||
|
||||
$("form[data-ajax=true] input[type=image]").live("click", function (evt) {
|
||||
var name = evt.target.name,
|
||||
$target = $(evt.target),
|
||||
form = $target.parents("form")[0],
|
||||
offset = $target.offset();
|
||||
|
||||
$(form).data(data_click, [
|
||||
{ name: name + ".x", value: Math.round(evt.pageX - offset.left) },
|
||||
{ name: name + ".y", value: Math.round(evt.pageY - offset.top) }
|
||||
]);
|
||||
|
||||
setTimeout(function () {
|
||||
$(form).removeData(data_click);
|
||||
}, 0);
|
||||
});
|
||||
|
||||
$("form[data-ajax=true] :submit").live("click", function (evt) {
|
||||
var name = evt.target.name,
|
||||
form = $(evt.target).parents("form")[0];
|
||||
|
||||
$(form).data(data_click, name ? [{ name: name, value: evt.target.value }] : []);
|
||||
|
||||
setTimeout(function () {
|
||||
$(form).removeData(data_click);
|
||||
}, 0);
|
||||
});
|
||||
|
||||
$("form[data-ajax=true]").live("submit", function (evt) {
|
||||
var clickInfo = $(this).data(data_click) || [];
|
||||
evt.preventDefault();
|
||||
if (!validate(this)) {
|
||||
return;
|
||||
}
|
||||
asyncRequest(this, {
|
||||
url: this.action,
|
||||
type: this.method || "GET",
|
||||
data: clickInfo.concat($(this).serializeArray())
|
||||
});
|
||||
});
|
||||
}(jQuery));
|
|
@ -0,0 +1,5 @@
|
|||
/*
|
||||
** Unobtrusive Ajax support library for jQuery
|
||||
** Copyright (C) Microsoft Corporation. All rights reserved.
|
||||
*/
|
||||
(function(a){var b="unobtrusiveAjaxClick",g="unobtrusiveValidation";function c(d,b){var a=window,c=(d||"").split(".");while(a&&c.length)a=a[c.shift()];if(typeof a==="function")return a;b.push(d);return Function.constructor.apply(null,b)}function d(a){return a==="GET"||a==="POST"}function f(b,a){!d(a)&&b.setRequestHeader("X-HTTP-Method-Override",a)}function h(c,b,e){var d;if(e.indexOf("application/x-javascript")!==-1)return;d=(c.getAttribute("data-ajax-mode")||"").toUpperCase();a(c.getAttribute("data-ajax-update")).each(function(f,c){var e;switch(d){case"BEFORE":e=c.firstChild;a("<div />").html(b).contents().each(function(){c.insertBefore(this,e)});break;case"AFTER":a("<div />").html(b).contents().each(function(){c.appendChild(this)});break;default:a(c).html(b)}})}function e(b,e){var j,k,g,i;j=b.getAttribute("data-ajax-confirm");if(j&&!window.confirm(j))return;k=a(b.getAttribute("data-ajax-loading"));i=b.getAttribute("data-ajax-loading-duration")||0;a.extend(e,{type:b.getAttribute("data-ajax-method")||undefined,url:b.getAttribute("data-ajax-url")||undefined,beforeSend:function(d){var a;f(d,g);a=c(b.getAttribute("data-ajax-begin"),["xhr"]).apply(this,arguments);a!==false&&k.show(i);return a},complete:function(){k.hide(i);c(b.getAttribute("data-ajax-complete"),["xhr","status"]).apply(this,arguments)},success:function(a,e,d){h(b,a,d.getResponseHeader("Content-Type")||"text/html");c(b.getAttribute("data-ajax-success"),["data","status","xhr"]).apply(this,arguments)},error:c(b.getAttribute("data-ajax-failure"),["xhr","status","error"])});e.data.push({name:"X-Requested-With",value:"XMLHttpRequest"});g=e.type.toUpperCase();if(!d(g)){e.type="POST";e.data.push({name:"X-HTTP-Method-Override",value:g})}a.ajax(e)}function i(c){var b=a(c).data(g);return!b||!b.validate||b.validate()}a("a[data-ajax=true]").live("click",function(a){a.preventDefault();e(this,{url:this.href,type:"GET",data:[]})});a("form[data-ajax=true] input[type=image]").live("click",function(c){var g=c.target.name,d=a(c.target),f=d.parents("form")[0],e=d.offset();a(f).data(b,[{name:g+".x",value:Math.round(c.pageX-e.left)},{name:g+".y",value:Math.round(c.pageY-e.top)}]);setTimeout(function(){a(f).removeData(b)},0)});a("form[data-ajax=true] :submit").live("click",function(c){var e=c.target.name,d=a(c.target).parents("form")[0];a(d).data(b,e?[{name:e,value:c.target.value}]:[]);setTimeout(function(){a(d).removeData(b)},0)});a("form[data-ajax=true]").live("submit",function(d){var c=a(this).data(b)||[];d.preventDefault();if(!i(this))return;e(this,{url:this.action,type:this.method||"GET",data:c.concat(a(this).serializeArray())})})})(jQuery);
|
|
@ -3,8 +3,8 @@
|
|||
@{ViewBag.Title = "History";}
|
||||
@section ActionMenu{
|
||||
<ul class="sub-menu">
|
||||
<li>@Html.ActionLink("Trim History", "Trim", "History", null, new { @class = "ajaxLink", onSuccess = "reloadGrid" })</li>
|
||||
<li>@Html.ActionLink("Purge History", "Purge", "History", null, new { @class = "ajaxLink", onSuccess = "reloadGrid" })</li>
|
||||
<li>@Ajax.ActionLink("Trim History", "Trim", "History", null, new AjaxOptions{ OnSuccess = "reloadGrid" })</li>
|
||||
<li>@Ajax.ActionLink("Purge History", "Purge", "History", null, new AjaxOptions{ OnSuccess = "reloadGrid" })</li>
|
||||
</ul>
|
||||
}
|
||||
@section HeaderContent
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
@{ ViewBag.Title = "Logs";}
|
||||
@section ActionMenu{
|
||||
<ul class="sub-menu">
|
||||
<li>@Html.ActionLink("Clear Logs", "Clear", "Log", null, new { @class = "ajaxLink", onSuccess = "redrawGrid" })</li>
|
||||
<li>@Ajax.ActionLink("Clear Logs", "Clear", "Log", null, new AjaxOptions{ OnSuccess = "redrawGrid" })</li>
|
||||
<li>@Html.ActionLink("File", "File", "Log")</li>
|
||||
</ul>
|
||||
}
|
||||
|
|
|
@ -9,9 +9,9 @@
|
|||
}
|
||||
@section ActionMenu{
|
||||
<ul class="sub-menu">
|
||||
<li>@Html.ActionLink("Start RSS Sync", "RssSync", "Command", null, new { @class = "ajaxLink" })</li>
|
||||
<li>@Html.ActionLink("Start Backlog Search", "BacklogSearch", "Command", null, new { title = "Backlog search for ALL missing episodes", @class = "ajaxLink" })</li>
|
||||
<li>@Html.ActionLink("Start Recent Backlog Search", "RecentBacklogSearch", "Command", null, new { title = "Backlog search for missing episodes that aired in the last 30 days only", @class = "ajaxLink" })</li>
|
||||
<li>@Ajax.ActionLink("Start RSS Sync", "RssSync", "Command", null, null)</li>
|
||||
<li>@Ajax.ActionLink("Start Backlog Search", "BacklogSearch", "Command",null, null, new { title = "Backlog search for ALL missing episodes"})</li>
|
||||
<li>@Ajax.ActionLink("Start Recent Backlog Search", "RecentBacklogSearch", "Command", null, null, new { title = "Backlog search for missing episodes that aired in the last 30 days only" })</li>
|
||||
</ul>
|
||||
}
|
||||
<div class="grid-container">
|
||||
|
@ -81,7 +81,9 @@
|
|||
}
|
||||
}, //Grabbed On
|
||||
{ sWidth: '40px', "mDataProp": "EpisodeId", "bSortable": false, "fnRender": function (row) {
|
||||
return createImageAjaxLink('/Episode/Search?episodeId=' + row.aData["EpisodeId"], '../../Content/Images/Search.png', 'Search', 'Search for Episode', 'gridAction');
|
||||
var link = '@Ajax.ImageActionLink("../../Content/Images/Search.png", new { title = "Search for Episode", alt = "Search", @class = "gridAction" }, "Search", "Episode", new { episodeId = "REPLACE" }, null, null)';
|
||||
link = link.replace("REPLACE", row.aData["EpisodeId"]);
|
||||
return link;
|
||||
}
|
||||
}, //Actions
|
||||
{ sWidth: 'auto', "mDataProp": "Details", "bSortable": false, "bVisible": false, "fnRender": function (row) {
|
||||
|
|
|
@ -68,9 +68,9 @@
|
|||
{
|
||||
<ul class="sub-menu">
|
||||
<li><a class="editButton" value="@Model.SeriesId" rel="@Model.Title">Edit</a></li>
|
||||
<li>@Html.ActionLink("Force Refresh", "ForceRefresh", "Command", new { seriesId = Model.SeriesId }, new { @class = "ajaxLink" })</li>
|
||||
<li>@Html.ActionLink("Search for missing episodes", "BacklogSeries", "Episode", new { seriesId = Model.SeriesId }, new { @class = "ajaxLink" })</li>
|
||||
<li>@Html.ActionLink("Rename Episode Files", "RenameEpisodes", "Episode", new { seriesId = Model.SeriesId }, new { @class = "ajaxLink" })</li>
|
||||
<li>@Ajax.ActionLink("Force Refresh", "ForceRefresh", "Command", new { seriesId = Model.SeriesId }, null)</li>
|
||||
<li>@Ajax.ActionLink("Search for missing episodes", "BacklogSeries", "Episode", new { seriesId = Model.SeriesId }, null)</li>
|
||||
<li>@Ajax.ActionLink("Rename Episode Files", "RenameEpisodes", "Episode", new { seriesId = Model.SeriesId }, null)</li>
|
||||
</ul>
|
||||
}
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
@*Commands Column*@
|
||||
<td class="@cellColourClass">
|
||||
<img src='../../Content/Images/@(Model.Ignored ? "ignored" : "notIgnored").png' class='ignoreEpisode ignoreEpisode_@(Model.SeasonNumber)@(Model.Ignored ? " ignored" : " ") gridAction' id='@Model.EpisodeId' title='Click to toggle episode ignore status' />
|
||||
@Html.ImageActionLink("../../Content/Images/Search.png", new { Alt = "Search", Title = "Search for episode", @class = "gridAction" }, "Search", "Episode", new { episodeId = Model.EpisodeId }, new { @class = "ajaxLink" })
|
||||
@Ajax.ImageActionLink("../../Content/Images/Search.png", new { Alt = "Search", Title = "Search for episode", @class = "gridAction" }, "Search", "Episode", new { episodeId = Model.EpisodeId }, null, null)
|
||||
<img src='../../Content/Images/@(Model.Status).png' alt='@Model.Status' title='@Model.Status' class='gridImage status-@Model.Status statusImage' />
|
||||
</td>
|
||||
</tr>
|
||||
|
|
|
@ -75,7 +75,7 @@
|
|||
@section ActionMenu{
|
||||
<ul class="sub-menu">
|
||||
<li>@Html.ActionLink("Add Series", "Index", "AddSeries")</li>
|
||||
<li>@Html.ActionLink("Start RSS Sync", "RssSync", "Command", null, new { @class = "ajaxLink" })</li>
|
||||
<li>@Ajax.ActionLink("Start RSS Sync", "RssSync", "Command", null)</li>
|
||||
<li>@Html.ActionLink("Series Editor", "SeriesEditor", "Series")</li>
|
||||
</ul>
|
||||
}
|
||||
|
|
|
@ -23,8 +23,8 @@
|
|||
@*Commands Column*@
|
||||
<th>
|
||||
<img src='../../Content/Images/@(Model.Ignored ? "ignored" : "notIgnored").png' class='ignoredEpisodesMaster ignoreEpisode ignoreSeason_@(Model.SeasonNumber)@(Model.Ignored ? " ignored" : " ") gridAction' title='Click to toggle season ignore status' />
|
||||
@Html.ImageActionLink("../../Content/Images/Search.png", new { Alt = "Search", Title = "Search for all episodes in this season", @class = "gridAction" }, "SearchSeason", "Episode", new { SeriesId = Model.SeriesId, SeasonNumber = Model.SeasonNumber }, new { @class = "ajaxLink" })
|
||||
@Html.ImageActionLink("../../Content/Images/Rename.png", new { Alt = "Rename", Title = "Rename all episodes in this season", @class = "gridAction" }, "RenameSeason", "Episode", new { SeriesId = Model.SeriesId, SeasonNumber = Model.SeasonNumber }, new { @class = "ajaxLink" })
|
||||
@Ajax.ImageActionLink("../../Content/Images/Search.png", new { Alt = "Search", Title = "Search for all episodes in this season", @class = "gridAction" }, "SearchSeason", "Episode", new { SeriesId = Model.SeriesId, SeasonNumber = Model.SeasonNumber }, null, null)
|
||||
@Ajax.ImageActionLink("../../Content/Images/Rename.png", new { Alt = "Rename", Title = "Rename all episodes in this season", @class = "gridAction" }, "RenameSeason", "Episode", new { SeriesId = Model.SeriesId, SeasonNumber = Model.SeasonNumber }, null, null)
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
@Html.IncludeScript("jquery.signalR.min.js")
|
||||
@Html.IncludeScript("jquery.validate.js")
|
||||
@Html.IncludeScript("jquery.validate.unobtrusive.js")
|
||||
@Html.IncludeScript("jquery.unobtrusive-ajax.min.js")
|
||||
@Html.IncludeScript("jquery.cookie.js")
|
||||
@Html.IncludeScript("doTimeout.js")
|
||||
@Html.IncludeScript("conditional-validation.js")
|
||||
|
|
|
@ -73,8 +73,9 @@
|
|||
if (!row.aData["Enable"])
|
||||
return "";
|
||||
|
||||
return createImageAjaxLink('/System/RunJob?typeName=' + row.aData["TypeName"], '../../Content/Images/Gear.png', 'Run', 'Run Job', 'gridAction');
|
||||
//return createImageAjaxLink('/History/Delete?historyId=' + row.aData["HistoryId"], '../../Content/Images/X.png', 'Delete', 'Delete from History', 'searchImage');
|
||||
var link = '@Ajax.ImageActionLink("../../Content/Images/Gear.png", new { title = "Run Job", alt = "Job", @class = "gridAction" }, "RunJob", "System", new { typeName = "REPLACE" }, null, null)';
|
||||
link = link.replace("REPLACE", row.aData["TypeName"]);
|
||||
return link;
|
||||
}
|
||||
} //Actions
|
||||
],
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
}
|
||||
@section ActionMenu{
|
||||
<ul class="sub-menu">
|
||||
<li>@Html.ActionLink("Start RSS Sync", "RssSync", "Command", null, new { @class = "ajaxLink" })</li>
|
||||
<li>@Ajax.ActionLink("Start RSS Sync", "RssSync", "Command", null)</li>
|
||||
</ul>
|
||||
}
|
||||
<div class="gridControls">
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
@*Commands Column*@
|
||||
<td class="@cellColourClass">
|
||||
<img src='../../Content/Images/@(Model.Status).png' alt='@Model.Status' title='@Model.Status' class='gridImage statusImage' />
|
||||
@Html.ImageActionLink("../../Content/Images/Search.png", new { Alt = "Search", Title = "Search for episode", @class = "gridAction" }, "Search", "Episode", new { episodeId = Model.EpisodeId }, new { @class = "ajaxLink" })
|
||||
@Ajax.ImageActionLink("../../Content/Images/Search.png", new { Alt = "Search", Title = "Search for episode", @class = "gridAction" }, "Search", "Episode", new { episodeId = Model.EpisodeId }, null, null)
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ else
|
|||
{
|
||||
<h2>
|
||||
Available Update: @Model.UpdatePackage.Version
|
||||
@Html.ActionLink("Update", "StartUpdate", "Update", null, new { @class = "ajaxLink" })
|
||||
@Ajax.ActionLink("Update", "StartUpdate", "Update", null)
|
||||
</h2>
|
||||
}
|
||||
@if (Model.LogFiles.Count != 0)
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<package id="EntityFramework.SqlServerCompact" version="4.1.8482.2" />
|
||||
<package id="jQuery" version="1.6.1" />
|
||||
<package id="jQuery" version="1.7.1" />
|
||||
<package id="jQuery.Ajax.Unobtrusive" version="2.0.20126.16343" />
|
||||
<package id="jquery.cookie" version="1.0" />
|
||||
<package id="jquery.datatables" version="1.9.0" />
|
||||
<package id="jQuery.UI.Combined" version="1.8.17" />
|
||||
|
|
163
packages/jQuery.Ajax.Unobtrusive.2.0.20126.16343/Content/Scripts/jquery.unobtrusive-ajax.js
vendored
Normal file
163
packages/jQuery.Ajax.Unobtrusive.2.0.20126.16343/Content/Scripts/jquery.unobtrusive-ajax.js
vendored
Normal file
|
@ -0,0 +1,163 @@
|
|||
/*!
|
||||
** Unobtrusive Ajax support library for jQuery
|
||||
** Copyright (C) Microsoft Corporation. All rights reserved.
|
||||
*/
|
||||
|
||||
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
|
||||
/*global window: false, jQuery: false */
|
||||
|
||||
(function ($) {
|
||||
var data_click = "unobtrusiveAjaxClick",
|
||||
data_validation = "unobtrusiveValidation";
|
||||
|
||||
function getFunction(code, argNames) {
|
||||
var fn = window, parts = (code || "").split(".");
|
||||
while (fn && parts.length) {
|
||||
fn = fn[parts.shift()];
|
||||
}
|
||||
if (typeof (fn) === "function") {
|
||||
return fn;
|
||||
}
|
||||
argNames.push(code);
|
||||
return Function.constructor.apply(null, argNames);
|
||||
}
|
||||
|
||||
function isMethodProxySafe(method) {
|
||||
return method === "GET" || method === "POST";
|
||||
}
|
||||
|
||||
function asyncOnBeforeSend(xhr, method) {
|
||||
if (!isMethodProxySafe(method)) {
|
||||
xhr.setRequestHeader("X-HTTP-Method-Override", method);
|
||||
}
|
||||
}
|
||||
|
||||
function asyncOnSuccess(element, data, contentType) {
|
||||
var mode;
|
||||
|
||||
if (contentType.indexOf("application/x-javascript") !== -1) { // jQuery already executes JavaScript for us
|
||||
return;
|
||||
}
|
||||
|
||||
mode = (element.getAttribute("data-ajax-mode") || "").toUpperCase();
|
||||
$(element.getAttribute("data-ajax-update")).each(function (i, update) {
|
||||
var top;
|
||||
|
||||
switch (mode) {
|
||||
case "BEFORE":
|
||||
top = update.firstChild;
|
||||
$("<div />").html(data).contents().each(function () {
|
||||
update.insertBefore(this, top);
|
||||
});
|
||||
break;
|
||||
case "AFTER":
|
||||
$("<div />").html(data).contents().each(function () {
|
||||
update.appendChild(this);
|
||||
});
|
||||
break;
|
||||
default:
|
||||
$(update).html(data);
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function asyncRequest(element, options) {
|
||||
var confirm, loading, method, duration;
|
||||
|
||||
confirm = element.getAttribute("data-ajax-confirm");
|
||||
if (confirm && !window.confirm(confirm)) {
|
||||
return;
|
||||
}
|
||||
|
||||
loading = $(element.getAttribute("data-ajax-loading"));
|
||||
duration = element.getAttribute("data-ajax-loading-duration") || 0;
|
||||
|
||||
$.extend(options, {
|
||||
type: element.getAttribute("data-ajax-method") || undefined,
|
||||
url: element.getAttribute("data-ajax-url") || undefined,
|
||||
beforeSend: function (xhr) {
|
||||
var result;
|
||||
asyncOnBeforeSend(xhr, method);
|
||||
result = getFunction(element.getAttribute("data-ajax-begin"), ["xhr"]).apply(this, arguments);
|
||||
if (result !== false) {
|
||||
loading.show(duration);
|
||||
}
|
||||
return result;
|
||||
},
|
||||
complete: function () {
|
||||
loading.hide(duration);
|
||||
getFunction(element.getAttribute("data-ajax-complete"), ["xhr", "status"]).apply(this, arguments);
|
||||
},
|
||||
success: function (data, status, xhr) {
|
||||
asyncOnSuccess(element, data, xhr.getResponseHeader("Content-Type") || "text/html");
|
||||
getFunction(element.getAttribute("data-ajax-success"), ["data", "status", "xhr"]).apply(this, arguments);
|
||||
},
|
||||
error: getFunction(element.getAttribute("data-ajax-failure"), ["xhr", "status", "error"])
|
||||
});
|
||||
|
||||
options.data.push({ name: "X-Requested-With", value: "XMLHttpRequest" });
|
||||
|
||||
method = options.type.toUpperCase();
|
||||
if (!isMethodProxySafe(method)) {
|
||||
options.type = "POST";
|
||||
options.data.push({ name: "X-HTTP-Method-Override", value: method });
|
||||
}
|
||||
|
||||
$.ajax(options);
|
||||
}
|
||||
|
||||
function validate(form) {
|
||||
var validationInfo = $(form).data(data_validation);
|
||||
return !validationInfo || !validationInfo.validate || validationInfo.validate();
|
||||
}
|
||||
|
||||
$("a[data-ajax=true]").live("click", function (evt) {
|
||||
evt.preventDefault();
|
||||
asyncRequest(this, {
|
||||
url: this.href,
|
||||
type: "GET",
|
||||
data: []
|
||||
});
|
||||
});
|
||||
|
||||
$("form[data-ajax=true] input[type=image]").live("click", function (evt) {
|
||||
var name = evt.target.name,
|
||||
$target = $(evt.target),
|
||||
form = $target.parents("form")[0],
|
||||
offset = $target.offset();
|
||||
|
||||
$(form).data(data_click, [
|
||||
{ name: name + ".x", value: Math.round(evt.pageX - offset.left) },
|
||||
{ name: name + ".y", value: Math.round(evt.pageY - offset.top) }
|
||||
]);
|
||||
|
||||
setTimeout(function () {
|
||||
$(form).removeData(data_click);
|
||||
}, 0);
|
||||
});
|
||||
|
||||
$("form[data-ajax=true] :submit").live("click", function (evt) {
|
||||
var name = evt.target.name,
|
||||
form = $(evt.target).parents("form")[0];
|
||||
|
||||
$(form).data(data_click, name ? [{ name: name, value: evt.target.value }] : []);
|
||||
|
||||
setTimeout(function () {
|
||||
$(form).removeData(data_click);
|
||||
}, 0);
|
||||
});
|
||||
|
||||
$("form[data-ajax=true]").live("submit", function (evt) {
|
||||
var clickInfo = $(this).data(data_click) || [];
|
||||
evt.preventDefault();
|
||||
if (!validate(this)) {
|
||||
return;
|
||||
}
|
||||
asyncRequest(this, {
|
||||
url: this.action,
|
||||
type: this.method || "GET",
|
||||
data: clickInfo.concat($(this).serializeArray())
|
||||
});
|
||||
});
|
||||
}(jQuery));
|
|
@ -0,0 +1,5 @@
|
|||
/*
|
||||
** Unobtrusive Ajax support library for jQuery
|
||||
** Copyright (C) Microsoft Corporation. All rights reserved.
|
||||
*/
|
||||
(function(a){var b="unobtrusiveAjaxClick",g="unobtrusiveValidation";function c(d,b){var a=window,c=(d||"").split(".");while(a&&c.length)a=a[c.shift()];if(typeof a==="function")return a;b.push(d);return Function.constructor.apply(null,b)}function d(a){return a==="GET"||a==="POST"}function f(b,a){!d(a)&&b.setRequestHeader("X-HTTP-Method-Override",a)}function h(c,b,e){var d;if(e.indexOf("application/x-javascript")!==-1)return;d=(c.getAttribute("data-ajax-mode")||"").toUpperCase();a(c.getAttribute("data-ajax-update")).each(function(f,c){var e;switch(d){case"BEFORE":e=c.firstChild;a("<div />").html(b).contents().each(function(){c.insertBefore(this,e)});break;case"AFTER":a("<div />").html(b).contents().each(function(){c.appendChild(this)});break;default:a(c).html(b)}})}function e(b,e){var j,k,g,i;j=b.getAttribute("data-ajax-confirm");if(j&&!window.confirm(j))return;k=a(b.getAttribute("data-ajax-loading"));i=b.getAttribute("data-ajax-loading-duration")||0;a.extend(e,{type:b.getAttribute("data-ajax-method")||undefined,url:b.getAttribute("data-ajax-url")||undefined,beforeSend:function(d){var a;f(d,g);a=c(b.getAttribute("data-ajax-begin"),["xhr"]).apply(this,arguments);a!==false&&k.show(i);return a},complete:function(){k.hide(i);c(b.getAttribute("data-ajax-complete"),["xhr","status"]).apply(this,arguments)},success:function(a,e,d){h(b,a,d.getResponseHeader("Content-Type")||"text/html");c(b.getAttribute("data-ajax-success"),["data","status","xhr"]).apply(this,arguments)},error:c(b.getAttribute("data-ajax-failure"),["xhr","status","error"])});e.data.push({name:"X-Requested-With",value:"XMLHttpRequest"});g=e.type.toUpperCase();if(!d(g)){e.type="POST";e.data.push({name:"X-HTTP-Method-Override",value:g})}a.ajax(e)}function i(c){var b=a(c).data(g);return!b||!b.validate||b.validate()}a("a[data-ajax=true]").live("click",function(a){a.preventDefault();e(this,{url:this.href,type:"GET",data:[]})});a("form[data-ajax=true] input[type=image]").live("click",function(c){var g=c.target.name,d=a(c.target),f=d.parents("form")[0],e=d.offset();a(f).data(b,[{name:g+".x",value:Math.round(c.pageX-e.left)},{name:g+".y",value:Math.round(c.pageY-e.top)}]);setTimeout(function(){a(f).removeData(b)},0)});a("form[data-ajax=true] :submit").live("click",function(c){var e=c.target.name,d=a(c.target).parents("form")[0];a(d).data(b,e?[{name:e,value:c.target.value}]:[]);setTimeout(function(){a(d).removeData(b)},0)});a("form[data-ajax=true]").live("submit",function(d){var c=a(this).data(b)||[];d.preventDefault();if(!i(this))return;e(this,{url:this.action,type:this.method||"GET",data:c.concat(a(this).serializeArray())})})})(jQuery);
|
BIN
packages/jQuery.Ajax.Unobtrusive.2.0.20126.16343/jQuery.Ajax.Unobtrusive.2.0.20126.16343.nupkg
vendored
Normal file
BIN
packages/jQuery.Ajax.Unobtrusive.2.0.20126.16343/jQuery.Ajax.Unobtrusive.2.0.20126.16343.nupkg
vendored
Normal file
Binary file not shown.
Loading…
Reference in New Issue