qol: impove plugin installation/update api

This commit is contained in:
Gary Sharp
2024-12-11 15:13:26 +11:00
parent f36871abe2
commit 343f20980d
13 changed files with 606 additions and 504 deletions
+7 -3
View File
@@ -505,7 +505,7 @@ namespace Disco.Services.Plugins
#region Restart App #region Restart App
private static object _restartTimerLock = new object(); private static object _restartTimerLock = new object();
private static Timer _restartTimer; private static Timer _restartTimer;
internal static void RestartApp(int DelayMilliseconds) internal static void RestartApp(TimeSpan delay)
{ {
lock (_restartTimerLock) lock (_restartTimerLock)
{ {
@@ -514,11 +514,15 @@ namespace Disco.Services.Plugins
_restartTimer.Dispose(); _restartTimer.Dispose();
} }
if (delay == TimeSpan.Zero)
HttpRuntime.UnloadAppDomain();
else
{
_restartTimer = new Timer((state) => _restartTimer = new Timer((state) =>
{ {
HttpRuntime.UnloadAppDomain(); HttpRuntime.UnloadAppDomain();
//AppDomain.Unload(AppDomain.CurrentDomain); }, null, (int)delay.TotalMilliseconds, Timeout.Infinite);
}, null, DelayMilliseconds, Timeout.Infinite); }
} }
} }
#endregion #endregion
@@ -46,7 +46,7 @@ namespace Disco.Services.Plugins
} }
Status.Finished("Restarting Disco ICT, please wait...", "/Config/Plugins"); Status.Finished("Restarting Disco ICT, please wait...", "/Config/Plugins");
Plugins.RestartApp(2500); Plugins.RestartApp(TimeSpan.FromSeconds(1));
} }
public static ScheduledTaskStatus UninstallPlugin(PluginManifest Manifest, bool UninstallData) public static ScheduledTaskStatus UninstallPlugin(PluginManifest Manifest, bool UninstallData)
+15 -10
View File
@@ -18,8 +18,9 @@ namespace Disco.Services.Plugins
protected override void ExecuteTask() protected override void ExecuteTask()
{ {
string pluginId = (string)ExecutionContext.JobDetail.JobDataMap["PluginId"]; var pluginId = (string)ExecutionContext.JobDetail.JobDataMap["PluginId"];
string packageFilePath = (string)ExecutionContext.JobDetail.JobDataMap["PackageFilePath"]; var packageFilePath = (string)ExecutionContext.JobDetail.JobDataMap["PackageFilePath"];
var immediateRestart = (bool)ExecutionContext.JobDetail.JobDataMap["ImmediateRestart"];
PluginLibraryManifestV2 libraryManifest; PluginLibraryManifestV2 libraryManifest;
PluginLibraryIncompatibility libraryIncompatibility; PluginLibraryIncompatibility libraryIncompatibility;
@@ -89,7 +90,7 @@ namespace Disco.Services.Plugins
ExecuteTaskInternal(Status, pluginPackagesLocation, updatePlugins); ExecuteTaskInternal(Status, pluginPackagesLocation, updatePlugins);
Status.Finished("Restarting Disco ICT, please wait...", "/Config/Plugins"); Status.Finished("Restarting Disco ICT, please wait...", "/Config/Plugins");
Plugins.RestartApp(2500); Plugins.RestartApp(immediateRestart ? TimeSpan.Zero : TimeSpan.FromSeconds(1));
} }
public static List<PluginManifest> OfflineInstalledPlugins(DiscoDataContext Database) public static List<PluginManifest> OfflineInstalledPlugins(DiscoDataContext Database)
@@ -258,7 +259,7 @@ namespace Disco.Services.Plugins
} }
} }
private static ScheduledTaskStatus UpdateHelper(string PluginId = null, string PackageFilePath = null) private static ScheduledTaskStatus UpdateHelper(string pluginId, string packageFilePath, bool immediateRestart)
{ {
if (ScheduledTasks.GetTaskStatuses(typeof(UpdatePluginTask)).Where(s => s.IsRunning).Count() > 0) if (ScheduledTasks.GetTaskStatuses(typeof(UpdatePluginTask)).Where(s => s.IsRunning).Count() > 0)
throw new InvalidOperationException("A plugin is already being Updated"); throw new InvalidOperationException("A plugin is already being Updated");
@@ -267,24 +268,28 @@ namespace Disco.Services.Plugins
if (ScheduledTasks.GetTaskStatuses(typeof(InstallPluginTask)).Where(s => s.IsRunning).Count() > 0) if (ScheduledTasks.GetTaskStatuses(typeof(InstallPluginTask)).Where(s => s.IsRunning).Count() > 0)
throw new InvalidOperationException("A plugin is being Installed"); throw new InvalidOperationException("A plugin is being Installed");
JobDataMap taskData = new JobDataMap() { { "PluginId", PluginId }, { "PackageFilePath", PackageFilePath } }; JobDataMap taskData = new JobDataMap() {
{ "PluginId", pluginId },
{ "PackageFilePath", packageFilePath },
{ "ImmediateRestart", immediateRestart },
};
var instance = new UpdatePluginTask(); var instance = new UpdatePluginTask();
return instance.ScheduleTask(taskData); return instance.ScheduleTask(taskData);
} }
public static ScheduledTaskStatus UpdateLocalPlugin(string PluginId, string PackageFilePath) public static ScheduledTaskStatus UpdateLocalPlugin(string pluginId, string packageFilePath, bool immediateRestart = false)
{ {
return UpdateHelper(PluginId, PackageFilePath); return UpdateHelper(pluginId, packageFilePath, immediateRestart);
} }
public static ScheduledTaskStatus UpdatePlugin(string PluginId) public static ScheduledTaskStatus UpdatePlugin(string pluginId, bool immediateRestart = false)
{ {
return UpdateHelper(PluginId); return UpdateHelper(pluginId, packageFilePath: null, immediateRestart);
} }
public static ScheduledTaskStatus UpdateAllPlugins() public static ScheduledTaskStatus UpdateAllPlugins()
{ {
return UpdateHelper(); return UpdateHelper(pluginId: null, packageFilePath: null, immediateRestart: false);
} }
} }
} }
@@ -34,7 +34,7 @@ namespace Disco.Services.Plugins
// Restart // Restart
Status.Finished("Restarting Disco ICT, please wait...", "/"); Status.Finished("Restarting Disco ICT, please wait...", "/");
Plugins.RestartApp(2500); Plugins.RestartApp(TimeSpan.FromSeconds(1));
} }
public static ScheduledTaskStatus UpdateDiscoPlugins(bool ReturnExistingStatusIfRunning) public static ScheduledTaskStatus UpdateDiscoPlugins(bool ReturnExistingStatusIfRunning)
@@ -15,12 +15,12 @@ namespace Disco.Web.Areas.API.Controllers
public partial class PluginController : AuthorizedDatabaseController public partial class PluginController : AuthorizedDatabaseController
{ {
[DiscoAuthorize(Claims.Config.Plugin.Install)] [DiscoAuthorize(Claims.Config.Plugin.Install)]
public virtual ActionResult UpdateLibraryManifest(bool TryWaitingForCompletion = false) public virtual ActionResult UpdateLibraryManifest(bool tryWaitingForCompletion = false)
{ {
var status = PluginLibraryUpdateTask.ScheduleNow(); var status = PluginLibraryUpdateTask.ScheduleNow();
// If upload takes <= 2 seconds, return back to Plugin Install (rather than Task Status) // If upload takes <= 2 seconds, return back to Plugin Install (rather than Task Status)
if (TryWaitingForCompletion && status.WaitUntilFinished(TimeSpan.FromSeconds(3)) && status.TaskException == null) if (tryWaitingForCompletion && status.WaitUntilFinished(TimeSpan.FromSeconds(3)) && status.TaskException == null)
{ {
return RedirectToAction(MVC.Config.Plugins.Install()); return RedirectToAction(MVC.Config.Plugins.Install());
} }
@@ -31,7 +31,7 @@ namespace Disco.Web.Areas.API.Controllers
} }
} }
[DiscoAuthorize(Claims.Config.Plugin.Install)] [HttpPost, DiscoAuthorize(Claims.Config.Plugin.Install), ValidateAntiForgeryToken]
public virtual ActionResult UpdateAll() public virtual ActionResult UpdateAll()
{ {
var status = UpdatePluginTask.UpdateAllPlugins(); var status = UpdatePluginTask.UpdateAllPlugins();
@@ -39,63 +39,39 @@ namespace Disco.Web.Areas.API.Controllers
return RedirectToAction(MVC.Config.Logging.TaskStatus(status.SessionId)); return RedirectToAction(MVC.Config.Logging.TaskStatus(status.SessionId));
} }
[DiscoAuthorize(Claims.Config.Plugin.Install)] [HttpPost, DiscoAuthorize(Claims.Config.Plugin.Install), ValidateAntiForgeryToken]
public virtual ActionResult Update(string PluginId) public virtual ActionResult Update(string pluginId)
{ {
if (string.IsNullOrEmpty(PluginId)) if (string.IsNullOrEmpty(pluginId))
throw new ArgumentNullException("PluginId"); throw new ArgumentNullException("PluginId");
var status = UpdatePluginTask.UpdatePlugin(PluginId); var status = UpdatePluginTask.UpdatePlugin(pluginId);
return RedirectToAction(MVC.Config.Logging.TaskStatus(status.SessionId)); return RedirectToAction(MVC.Config.Logging.TaskStatus(status.SessionId));
} }
[DiscoAuthorizeAll(Claims.Config.Plugin.Install, Claims.Config.Plugin.InstallLocal)] [HttpPost, DiscoAuthorize(Claims.Config.Plugin.Uninstall), ValidateAntiForgeryToken]
public virtual ActionResult UpdateLocal(string PluginId, HttpPostedFileBase Plugin) public virtual ActionResult Uninstall(string id, bool uninstallData)
{
if (string.IsNullOrEmpty(PluginId))
throw new ArgumentNullException("PluginId");
if (Plugin == null || Plugin.ContentLength <= 0 || string.IsNullOrWhiteSpace(Plugin.FileName))
throw new ArgumentException("A discoPlugin file must be uploaded", "Plugin");
var tempPluginLocation = Path.Combine(Database.DiscoConfiguration.PluginPackagesLocation, Path.GetFileName(Plugin.FileName));
if (!Directory.Exists(Database.DiscoConfiguration.PluginPackagesLocation))
Directory.CreateDirectory(Database.DiscoConfiguration.PluginPackagesLocation);
if (System.IO.File.Exists(tempPluginLocation))
System.IO.File.Delete(tempPluginLocation);
Plugin.SaveAs(tempPluginLocation);
var status = UpdatePluginTask.UpdateLocalPlugin(PluginId, tempPluginLocation);
return RedirectToAction(MVC.Config.Logging.TaskStatus(status.SessionId));
}
[DiscoAuthorize(Claims.Config.Plugin.Uninstall)]
public virtual ActionResult Uninstall(string id, bool UninstallData)
{ {
if (string.IsNullOrEmpty(id)) if (string.IsNullOrEmpty(id))
throw new ArgumentNullException("id"); throw new ArgumentNullException("id");
PluginManifest manifest = Plugins.GetPlugin(id); PluginManifest manifest = Plugins.GetPlugin(id);
var status = UninstallPluginTask.UninstallPlugin(manifest, UninstallData); var status = UninstallPluginTask.UninstallPlugin(manifest, uninstallData);
return RedirectToAction(MVC.Config.Logging.TaskStatus(status.SessionId)); return RedirectToAction(MVC.Config.Logging.TaskStatus(status.SessionId));
} }
[DiscoAuthorize(Claims.Config.Plugin.Install)] [HttpPost, DiscoAuthorize(Claims.Config.Plugin.Install), ValidateAntiForgeryToken]
public virtual ActionResult Install(string PluginId) public virtual ActionResult Install(string pluginId)
{ {
if (string.IsNullOrEmpty(PluginId)) if (string.IsNullOrEmpty(pluginId))
throw new ArgumentNullException("PluginId", "A PluginId must be supplied"); throw new ArgumentNullException("PluginId", "A PluginId must be supplied");
var library = PluginLibrary.LoadManifest(Database); var library = PluginLibrary.LoadManifest(Database);
var libraryIncompatibility = library.LoadIncompatibilityData(); var libraryIncompatibility = library.LoadIncompatibilityData();
var libraryItem = library.Plugins.FirstOrDefault(p => p.Id.Equals(PluginId)); var libraryItem = library.Plugins.FirstOrDefault(p => p.Id.Equals(pluginId));
if (libraryItem == null) if (libraryItem == null)
throw new ArgumentNullException("PluginId", "Plugin not found in library"); throw new ArgumentNullException("PluginId", "Plugin not found in library");
@@ -116,13 +92,13 @@ namespace Disco.Web.Areas.API.Controllers
return RedirectToAction(MVC.Config.Logging.TaskStatus(status.SessionId)); return RedirectToAction(MVC.Config.Logging.TaskStatus(status.SessionId));
} }
[DiscoAuthorizeAll(Claims.Config.Plugin.Install, Claims.Config.Plugin.InstallLocal)] [HttpPost, DiscoAuthorizeAll(Claims.Config.Plugin.Install, Claims.Config.Plugin.InstallLocal), ValidateAntiForgeryToken]
public virtual ActionResult InstallLocal(HttpPostedFileBase Plugin) public virtual ActionResult InstallLocal(HttpPostedFileBase plugin, bool immediateRestart = false)
{ {
if (Plugin == null || Plugin.ContentLength <= 0 || string.IsNullOrWhiteSpace(Plugin.FileName)) if (plugin == null || plugin.ContentLength <= 0 || string.IsNullOrWhiteSpace(plugin.FileName))
throw new ArgumentException("A discoPlugin file must be uploaded", "Plugin"); throw new ArgumentException("A discoPlugin file must be uploaded", "Plugin");
var tempPluginLocation = Path.Combine(Database.DiscoConfiguration.PluginPackagesLocation, Path.GetFileName(Plugin.FileName)); var tempPluginLocation = Path.Combine(Database.DiscoConfiguration.PluginPackagesLocation, Path.GetFileName(plugin.FileName));
if (!Directory.Exists(Database.DiscoConfiguration.PluginPackagesLocation)) if (!Directory.Exists(Database.DiscoConfiguration.PluginPackagesLocation))
Directory.CreateDirectory(Database.DiscoConfiguration.PluginPackagesLocation); Directory.CreateDirectory(Database.DiscoConfiguration.PluginPackagesLocation);
@@ -130,7 +106,7 @@ namespace Disco.Web.Areas.API.Controllers
if (System.IO.File.Exists(tempPluginLocation)) if (System.IO.File.Exists(tempPluginLocation))
System.IO.File.Delete(tempPluginLocation); System.IO.File.Delete(tempPluginLocation);
Plugin.SaveAs(tempPluginLocation); plugin.SaveAs(tempPluginLocation);
// Check for Install/Update // Check for Install/Update
PluginManifest packageManifest; PluginManifest packageManifest;
@@ -151,7 +127,7 @@ namespace Disco.Web.Areas.API.Controllers
ScheduledTaskStatus status; ScheduledTaskStatus status;
if (Plugins.PluginInstalled(packageManifest.Id)) if (Plugins.PluginInstalled(packageManifest.Id))
status = UpdatePluginTask.UpdateLocalPlugin(packageManifest.Id, tempPluginLocation); status = UpdatePluginTask.UpdateLocalPlugin(packageManifest.Id, tempPluginLocation, immediateRestart);
else else
status = InstallPluginTask.InstallLocalPlugin(tempPluginLocation, true); status = InstallPluginTask.InstallLocalPlugin(tempPluginLocation, true);
@@ -63,9 +63,9 @@
</table> </table>
if (canUninstall) if (canUninstall)
{ {
<div id="dialogUninstallPlugins" title="Uninstall Plugin"> <div id="dialogUninstallPlugins" title="Uninstall Plugin" class="dialog">
<div> <div>
@Html.DropDownList("uninstallPlugin", Model.PluginManifests.ToSelectListItems(null, true, "Select a Plugin to Uninstall")) @Html.DropDownList("uninstallPlugin", Model.PluginManifests.OrderBy(p => p.Name).ToSelectListItems(null, true, "Select a Plugin to Uninstall"))
</div> </div>
<div> <div>
<input id="uninstallPluginData" type="checkbox" /><label for="uninstallPluginData"> Uninstall Plugin Data</label> <input id="uninstallPluginData" type="checkbox" /><label for="uninstallPluginData"> Uninstall Plugin Data</label>
@@ -76,7 +76,7 @@
</div> </div>
</div> </div>
</div> </div>
<div id="dialogUninstallPluginConfirm" title="Confirm Plugin Uninstall"> <div id="dialogUninstallPluginConfirm" title="Confirm Plugin Uninstall" class="dialog">
<div class="info-box"> <div class="info-box">
<p class="fa-p"> <p class="fa-p">
<i class="fa fa-info-circle"></i>Are you sure you want to uninstall this plugin? <i class="fa fa-info-circle"></i>Are you sure you want to uninstall this plugin?
@@ -88,79 +88,74 @@
<i class="fa fa-exclamation-triangle"></i><strong>Warning:</strong> Data will be permanently deleted <i class="fa fa-exclamation-triangle"></i><strong>Warning:</strong> Data will be permanently deleted
</p> </p>
</div> </div>
@using (Html.BeginForm(MVC.API.Plugin.Uninstall(), FormMethod.Post))
{
@Html.AntiForgeryToken()
<input type="hidden" name="id" id="dialogUninstallPluginId" />
<input type="hidden" name="uninstallData" id="dialogUninstallPluginData" value="false" />
}
</div> </div>
<script> <script>
$(function () { $(function () {
// Uninstall
var uninstallUrl = '@(Url.Action(MVC.API.Plugin.Uninstall()))/';
var uninstallPlugin, uninstallPluginData, $dialogConfirm, uninstallPluginConfirm, uninstallPluginDataConfirm;
var pluginId, pluginName, pluginUninstallData; let $dialog = null;
var $dialog = $('#dialogUninstallPlugins').dialog({ $('#buttonUninstall').on('click', function () {
resizable: false,
modal: true,
width: 350,
autoOpen: false,
buttons: {
"Uninstall": function () {
pluginId = uninstallPlugin.val();
pluginName = uninstallPlugin.find('option:selected').text();
pluginUninstallData = uninstallPluginData.is(':checked');
if (!pluginId) { if (!$dialog) {
alert('Select a plugin to uninstall'); const $dialogConfirm = $('#dialogUninstallPluginConfirm').dialog({
} else {
uninstallPluginConfirm.text(pluginName + ' [' + pluginId + ']');
if (pluginUninstallData)
uninstallPluginDataConfirm.show();
else
uninstallPluginDataConfirm.hide();
$dialogConfirm.dialog('open');
$(this).dialog("close");
}
},
Cancel: function () {
uninstallPluginData.prop('checked', false);
$('#uninstallPluginDataAlert').hide();
$(this).dialog("close");
}
}
});
$dialogConfirm = $('#dialogUninstallPluginConfirm').dialog({
resizable: false, resizable: false,
modal: true, modal: true,
width: 350, width: 350,
autoOpen: false, autoOpen: false,
buttons: { buttons: {
"Confirm Uninstall": function () { "Confirm Uninstall": function () {
var url = uninstallUrl + pluginId; $dialogConfirm.find('form').submit();
if (pluginUninstallData)
url += '?UninstallData=true'
else
url += '?UninstallData=false'
window.location.href = url;
$(this).dialog("disable"); $(this).dialog("disable");
}, },
Cancel: function () { Cancel: function () {
uninstallPluginData.prop('checked', false); $('#uninstallPluginData').prop('checked', false);
$('#uninstallPluginDataAlert').hide(); $('#uninstallPluginDataAlert').hide();
$(this).dialog("close"); $(this).dialog("close");
} }
} }
}); });
uninstallPlugin = $('#uninstallPlugin'); $dialog = $('#dialogUninstallPlugins').dialog({
uninstallPluginData = $('#uninstallPluginData'); resizable: false,
uninstallPluginConfirm = $('#uninstallPluginConfirm'); modal: true,
uninstallPluginDataConfirm = $('#uninstallPluginDataConfirm'); width: 350,
autoOpen: false,
buttons: {
"Uninstall": function () {
const $uninstallPlugin = $('#uninstallPlugin');
pluginId = $uninstallPlugin.val();
pluginName = $uninstallPlugin.find('option:selected').text();
pluginUninstallData = $('#uninstallPluginData').is(':checked');
$('#buttonUninstall').click(function () { if (!pluginId) {
$dialog.dialog('open'); alert('Select a plugin to uninstall');
return false; } else {
$('#uninstallPluginConfirm').text(pluginName + ' [' + pluginId + ']');
const $uninstallPluginDataConfirm = $('#uninstallPluginDataConfirm');
if (pluginUninstallData)
$uninstallPluginDataConfirm.show();
else
$uninstallPluginDataConfirm.hide();
$('#dialogUninstallPluginId').val(pluginId);
$('#dialogUninstallPluginData').val(pluginUninstallData ? 'true' : 'false');
$dialogConfirm.dialog('open');
$(this).dialog("close");
}
},
Cancel: function () {
$('#uninstallPluginData').prop('checked', false);
$('#uninstallPluginDataAlert').hide();
$(this).dialog("close");
}
}
}); });
$('#uninstallPluginData').change(function () { $('#uninstallPluginData').change(function () {
@@ -170,6 +165,11 @@
$('#uninstallPluginDataAlert').slideUp(); $('#uninstallPluginDataAlert').slideUp();
} }
}); });
}
$dialog.dialog('open');
return false;
});
}); });
</script> </script>
} }
@@ -180,7 +180,11 @@
<div>@(Model.PluginUpdates.Count) plugin update@(Model.PluginUpdates.Count == 1 ? " is" : "s are") available</div> <div>@(Model.PluginUpdates.Count) plugin update@(Model.PluginUpdates.Count == 1 ? " is" : "s are") available</div>
@if (canInstall) @if (canInstall)
{ {
@Html.ActionLinkSmallButton("Update Now", MVC.API.Plugin.UpdateAll(), null, "alert") using (Html.BeginForm(MVC.API.Plugin.UpdateAll()))
{
@Html.AntiForgeryToken()
<button class="button small alert" type="submit">Update All</button>
}
} }
else else
{ {
@@ -196,6 +200,7 @@
}); });
})(); })();
</script> </script>
} }
} }
} }
@@ -174,14 +174,14 @@ WriteLiteral("</h2>\r\n");
#line hidden #line hidden
WriteLiteral(" <a"); WriteLiteral(" <a");
WriteAttribute("href", Tuple.Create(" href=\"", 1781), Tuple.Create("\"", 1850) WriteAttribute("href", Tuple.Create(" href=\"", 1930), Tuple.Create("\"", 1999)
#line 44 "..\..\Areas\Config\Views\Plugins\Index.cshtml" #line 44 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
, Tuple.Create(Tuple.Create("", 1788), Tuple.Create<System.Object, System.Int32>(Url.Action(MVC.Config.Plugins.Configure(pluginDefinition.Id)) , Tuple.Create(Tuple.Create("", 1937), Tuple.Create<System.Object, System.Int32>(Url.Action(MVC.Config.Plugins.Configure(pluginDefinition.Id))
#line default #line default
#line hidden #line hidden
, 1788), false) , 1937), false)
); );
WriteLiteral(">\r\n <i"); WriteLiteral(">\r\n <i");
@@ -254,14 +254,14 @@ WriteLiteral("</span> | ");
#line hidden #line hidden
WriteLiteral(" | <a"); WriteLiteral(" | <a");
WriteAttribute("href", Tuple.Create(" href=\"", 2474), Tuple.Create("\"", 2502) WriteAttribute("href", Tuple.Create(" href=\"", 2719), Tuple.Create("\"", 2747)
#line 54 "..\..\Areas\Config\Views\Plugins\Index.cshtml" #line 54 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
, Tuple.Create(Tuple.Create("", 2481), Tuple.Create<System.Object, System.Int32>(pluginDefinition.Url , Tuple.Create(Tuple.Create("", 2726), Tuple.Create<System.Object, System.Int32>(pluginDefinition.Url
#line default #line default
#line hidden #line hidden
, 2481), false) , 2726), false)
); );
WriteLiteral(" title=\"More Information\""); WriteLiteral(" title=\"More Information\"");
@@ -315,18 +315,21 @@ WriteLiteral(" id=\"dialogUninstallPlugins\"");
WriteLiteral(" title=\"Uninstall Plugin\""); WriteLiteral(" title=\"Uninstall Plugin\"");
WriteLiteral(" class=\"dialog\"");
WriteLiteral(">\r\n <div>\r\n"); WriteLiteral(">\r\n <div>\r\n");
WriteLiteral(" "); WriteLiteral(" ");
#line 68 "..\..\Areas\Config\Views\Plugins\Index.cshtml" #line 68 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
Write(Html.DropDownList("uninstallPlugin", Model.PluginManifests.ToSelectListItems(null, true, "Select a Plugin to Uninstall"))); Write(Html.DropDownList("uninstallPlugin", Model.PluginManifests.OrderBy(p => p.Name).ToSelectListItems(null, true, "Select a Plugin to Uninstall")));
#line default #line default
#line hidden #line hidden
WriteLiteral("\r\n </div>\r\n <div>\r\n <input"); WriteLiteral("\r\n </div>\r\n <div>\r\n " +
"<input");
WriteLiteral(" id=\"uninstallPluginData\""); WriteLiteral(" id=\"uninstallPluginData\"");
@@ -353,7 +356,8 @@ WriteLiteral(">\r\n <i");
WriteLiteral(" class=\"fa fa-exclamation-triangle\""); WriteLiteral(" class=\"fa fa-exclamation-triangle\"");
WriteLiteral("></i><strong>Warning:</strong> Data will be permanently deleted\r\n " + WriteLiteral("></i><strong>Warning:</strong> Data will be permanently deleted\r\n " +
" </p>\r\n </div>\r\n </div>\r\n </div>\r\n"); " </p>\r\n </div>\r\n </div>\r\n " +
" </div>\r\n");
WriteLiteral(" <div"); WriteLiteral(" <div");
@@ -361,6 +365,8 @@ WriteLiteral(" id=\"dialogUninstallPluginConfirm\"");
WriteLiteral(" title=\"Confirm Plugin Uninstall\""); WriteLiteral(" title=\"Confirm Plugin Uninstall\"");
WriteLiteral(" class=\"dialog\"");
WriteLiteral(">\r\n <div"); WriteLiteral(">\r\n <div");
WriteLiteral(" class=\"info-box\""); WriteLiteral(" class=\"info-box\"");
@@ -373,8 +379,8 @@ WriteLiteral(">\r\n <i");
WriteLiteral(" class=\"fa fa-info-circle\""); WriteLiteral(" class=\"fa fa-info-circle\"");
WriteLiteral("></i>Are you sure you want to uninstall this plugin?\r\n </p>\r\n " + WriteLiteral("></i>Are you sure you want to uninstall this plugin?\r\n </p" +
" <h4"); ">\r\n <h4");
WriteLiteral(" id=\"uninstallPluginConfirm\""); WriteLiteral(" id=\"uninstallPluginConfirm\"");
@@ -395,63 +401,122 @@ WriteLiteral(">\r\n <i");
WriteLiteral(" class=\"fa fa-exclamation-triangle\""); WriteLiteral(" class=\"fa fa-exclamation-triangle\"");
WriteLiteral("></i><strong>Warning:</strong> Data will be permanently deleted\r\n " + WriteLiteral("></i><strong>Warning:</strong> Data will be permanently deleted\r\n " +
"</p>\r\n </div>\r\n </div>\r\n"); " </p>\r\n </div>\r\n");
WriteLiteral(" <script>\r\n $(function () {\r\n // Uninstall\r\n " +
" var uninstallUrl = \'");
#line 95 "..\..\Areas\Config\Views\Plugins\Index.cshtml" #line 91 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
Write(Url.Action(MVC.API.Plugin.Uninstall()));
#line default #line default
#line hidden #line hidden
WriteLiteral("/\';\r\n var uninstallPlugin, uninstallPluginData, $dialogConfirm, un" +
"installPluginConfirm, uninstallPluginDataConfirm;\r\n\r\n var pluginI" + #line 91 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
"d, pluginName, pluginUninstallData;\r\n\r\n var $dialog = $(\'#dialogU" + using (Html.BeginForm(MVC.API.Plugin.Uninstall(), FormMethod.Post))
"ninstallPlugins\').dialog({\r\n resizable: false,\r\n " + {
" modal: true,\r\n width: 350,\r\n autoOp" +
"en: false,\r\n buttons: {\r\n \"Uninstall\":" +
" function () {\r\n pluginId = uninstallPlugin.val();\r\n " + #line default
" pluginName = uninstallPlugin.find(\'option:selected\')." + #line hidden
"text();\r\n pluginUninstallData = uninstallPluginData.i" +
"s(\':checked\');\r\n\r\n if (!pluginId) {\r\n " + #line 93 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
" alert(\'Select a plugin to uninstall\');\r\n " + Write(Html.AntiForgeryToken());
" } else {\r\n uninstallPluginConfirm.text(plugin" +
"Name + \' [\' + pluginId + \']\');\r\n if (pluginUninst" +
"allData)\r\n uninstallPluginDataConfirm.show();" + #line default
"\r\n else\r\n unin" + #line hidden
"stallPluginDataConfirm.hide();\r\n\r\n $dialogConfirm" +
".dialog(\'open\');\r\n $(this).dialog(\"close\");\r\n " + #line 93 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
" }\r\n },\r\n C" +
"ancel: function () {\r\n uninstallPluginData.prop(\'chec" +
"ked\', false);\r\n $(\'#uninstallPluginDataAlert\').hide()" +
";\r\n $(this).dialog(\"close\");\r\n " + #line default
" }\r\n }\r\n });\r\n\r\n $dialogConfirm" + #line hidden
" = $(\'#dialogUninstallPluginConfirm\').dialog({\r\n resizable: f" + WriteLiteral(" <input");
"alse,\r\n modal: true,\r\n width: 350,\r\n " +
" autoOpen: false,\r\n buttons: {\r\n " + WriteLiteral(" type=\"hidden\"");
" \"Confirm Uninstall\": function () {\r\n var url " +
"= uninstallUrl + pluginId;\r\n if (pluginUninstallData)" + WriteLiteral(" name=\"id\"");
"\r\n url += \'?UninstallData=true\'\r\n " +
" else\r\n url += \'?UninstallData=false\'\r" + WriteLiteral(" id=\"dialogUninstallPluginId\"");
"\n\r\n window.location.href = url;\r\n " +
" $(this).dialog(\"disable\");\r\n },\r\n " + WriteLiteral(" />\r\n");
" Cancel: function () {\r\n uninstallPluginData.p" +
"rop(\'checked\', false);\r\n $(\'#uninstallPluginDataAlert" + WriteLiteral(" <input");
"\').hide();\r\n $(this).dialog(\"close\");\r\n " +
" }\r\n }\r\n });\r\n\r\n unins" + WriteLiteral(" type=\"hidden\"");
"tallPlugin = $(\'#uninstallPlugin\');\r\n uninstallPluginData = $(\'#u" +
"ninstallPluginData\');\r\n uninstallPluginConfirm = $(\'#uninstallPlu" + WriteLiteral(" name=\"uninstallData\"");
"ginConfirm\');\r\n uninstallPluginDataConfirm = $(\'#uninstallPluginD" +
"ataConfirm\');\r\n\r\n $(\'#buttonUninstall\').click(function () {\r\n " + WriteLiteral(" id=\"dialogUninstallPluginData\"");
WriteLiteral(" value=\"false\"");
WriteLiteral(" />\r\n");
#line 96 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
}
#line default
#line hidden
WriteLiteral(" </div>\r\n");
WriteLiteral(" <script>\r\n $(function () {\r\n\r\n " +
" let $dialog = null;\r\n\r\n $(\'#buttonUninstall\').on(" +
"\'click\', function () {\r\n\r\n if (!$dialog) {\r\n " +
" const $dialogConfirm = $(\'#dialogUninstallPluginConfirm\')" +
".dialog({\r\n resizable: false,\r\n " +
" modal: true,\r\n width: 3" +
"50,\r\n autoOpen: false,\r\n " +
" buttons: {\r\n \"Confirm Unin" +
"stall\": function () {\r\n $dialogConfir" +
"m.find(\'form\').submit();\r\n $(this).di" +
"alog(\"disable\");\r\n },\r\n " +
" Cancel: function () {\r\n " +
" $(\'#uninstallPluginData\').prop(\'checked\', false);\r\n " +
" $(\'#uninstallPluginDataAlert\').hide();\r\n " +
" $(this).dialog(\"close\");\r\n " +
" }\r\n }\r\n " +
" });\r\n\r\n $dialog = $(\'#dialogUninstallPlug" +
"ins\').dialog({\r\n resizable: false,\r\n " +
" modal: true,\r\n wid" +
"th: 350,\r\n autoOpen: false,\r\n " +
" buttons: {\r\n \"Uninsta" +
"ll\": function () {\r\n const $uninstall" +
"Plugin = $(\'#uninstallPlugin\');\r\n plu" +
"ginId = $uninstallPlugin.val();\r\n plu" +
"ginName = $uninstallPlugin.find(\'option:selected\').text();\r\n " +
" pluginUninstallData = $(\'#uninstallPluginData\').is(\':che" +
"cked\');\r\n\r\n if (!pluginId) {\r\n " +
" alert(\'Select a plugin to uninstall\');\r" +
"\n } else {\r\n " +
" $(\'#uninstallPluginConfirm\').text(pluginName + \' [\' + plu" +
"ginId + \']\');\r\n const $uninstallP" +
"luginDataConfirm = $(\'#uninstallPluginDataConfirm\');\r\n " +
" if (pluginUninstallData)\r\n " +
" $uninstallPluginDataConfirm.show();\r\n " +
" else\r\n " +
" $uninstallPluginDataConfirm.hide();\r\n\r\n " +
" $(\'#dialogUninstallPluginId\').val(pluginId);\r\n " +
" $(\'#dialogUninstallPluginData\').val(pluginUninstallData " +
"? \'true\' : \'false\');\r\n\r\n $dialogC" +
"onfirm.dialog(\'open\');\r\n $(this)." +
"dialog(\"close\");\r\n }\r\n " +
" },\r\n Cancel: fun" +
"ction () {\r\n $(\'#uninstallPluginData\'" +
").prop(\'checked\', false);\r\n $(\'#unins" +
"tallPluginDataAlert\').hide();\r\n $(thi" +
"s).dialog(\"close\");\r\n }\r\n " +
" }\r\n });\r\n\r\n " +
" $(\'#uninstallPluginData\').change(function () {\r\n " +
" if ($(this).is(\':checked\')) {\r\n " +
" $(\'#uninstallPluginDataAlert\').slideDown();\r\n " +
" } else {\r\n $(\'#uninstallPluginD" +
"ataAlert\').slideUp();\r\n }\r\n " +
" });\r\n }\r\n\r\n " +
"$dialog.dialog(\'open\');\r\n return false;\r\n " + "$dialog.dialog(\'open\');\r\n return false;\r\n " +
" });\r\n\r\n $(\'#uninstallPluginData\').change(function () " + " });\r\n });\r\n </script>\r\n");
"{\r\n if ($(this).is(\':checked\')) {\r\n $(" +
"\'#uninstallPluginDataAlert\').slideDown();\r\n } else {\r\n " +
" $(\'#uninstallPluginDataAlert\').slideUp();\r\n " +
"}\r\n });\r\n });\r\n </script>\r\n");
#line 175 "..\..\Areas\Config\Views\Plugins\Index.cshtml" #line 175 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
@@ -500,20 +565,37 @@ WriteLiteral(" available</div>\r\n");
#line 181 "..\..\Areas\Config\Views\Plugins\Index.cshtml" #line 181 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
if (canInstall) if (canInstall)
{ {
using (Html.BeginForm(MVC.API.Plugin.UpdateAll()))
{
#line default #line default
#line hidden #line hidden
#line 183 "..\..\Areas\Config\Views\Plugins\Index.cshtml" #line 185 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
Write(Html.ActionLinkSmallButton("Update Now", MVC.API.Plugin.UpdateAll(), null, "alert")); Write(Html.AntiForgeryToken());
#line default #line default
#line hidden #line hidden
#line 183 "..\..\Areas\Config\Views\Plugins\Index.cshtml" #line 185 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
#line default
#line hidden
WriteLiteral(" <button");
WriteLiteral(" class=\"button small alert\"");
WriteLiteral(" type=\"submit\"");
WriteLiteral(">Update All</button>\r\n");
#line 187 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
}
} }
else else
{ {
@@ -528,7 +610,7 @@ WriteLiteral(" class=\"smallMessage\"");
WriteLiteral(">You do not have sufficient permission to install these updates.</div>\r\n"); WriteLiteral(">You do not have sufficient permission to install these updates.</div>\r\n");
#line 188 "..\..\Areas\Config\Views\Plugins\Index.cshtml" #line 192 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
} }
@@ -548,7 +630,8 @@ WriteLiteral(@" <script>
"); ");
#line 199 "..\..\Areas\Config\Views\Plugins\Index.cshtml" #line 203 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
} }
} }
@@ -562,13 +645,13 @@ WriteLiteral(" class=\"actionBar\"");
WriteLiteral(">\r\n"); WriteLiteral(">\r\n");
#line 204 "..\..\Areas\Config\Views\Plugins\Index.cshtml" #line 209 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
#line default #line default
#line hidden #line hidden
#line 204 "..\..\Areas\Config\Views\Plugins\Index.cshtml" #line 209 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
if (canUninstall && Model.PluginManifests.Count > 0) if (canUninstall && Model.PluginManifests.Count > 0)
{ {
@@ -576,14 +659,14 @@ WriteLiteral(">\r\n");
#line default #line default
#line hidden #line hidden
#line 206 "..\..\Areas\Config\Views\Plugins\Index.cshtml" #line 211 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
Write(Html.ActionLinkButton("Uninstall Plugins", MVC.Config.Plugins.Index(), "buttonUninstall")); Write(Html.ActionLinkButton("Uninstall Plugins", MVC.Config.Plugins.Index(), "buttonUninstall"));
#line default #line default
#line hidden #line hidden
#line 206 "..\..\Areas\Config\Views\Plugins\Index.cshtml" #line 211 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
} }
@@ -593,7 +676,7 @@ WriteLiteral(">\r\n");
WriteLiteral(" "); WriteLiteral(" ");
#line 208 "..\..\Areas\Config\Views\Plugins\Index.cshtml" #line 213 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
if (canInstall) if (canInstall)
{ {
@@ -601,14 +684,14 @@ WriteLiteral(" ");
#line default #line default
#line hidden #line hidden
#line 210 "..\..\Areas\Config\Views\Plugins\Index.cshtml" #line 215 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
Write(Html.ActionLinkButton("Install Plugins", MVC.Config.Plugins.Install())); Write(Html.ActionLinkButton("Install Plugins", MVC.Config.Plugins.Install()));
#line default #line default
#line hidden #line hidden
#line 210 "..\..\Areas\Config\Views\Plugins\Index.cshtml" #line 215 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
} }
@@ -65,7 +65,7 @@
} }
</div> </div>
<div id="dialogInstallPlugin" title="Install this Plugin?"> <div id="dialogInstallPlugin" title="Install this Plugin?" class="dialog">
<h2 id="dialogInstallPluginName"></h2> <h2 id="dialogInstallPluginName"></h2>
<h4 id="dialogInstallPluginDetails"></h4> <h4 id="dialogInstallPluginDetails"></h4>
@@ -75,13 +75,18 @@
<strong>Only Install plugins from a trusted source.</strong> <strong>Only Install plugins from a trusted source.</strong>
</p> </p>
</div> </div>
@using (Html.BeginForm(MVC.API.Plugin.Install(), FormMethod.Post))
{
@Html.AntiForgeryToken()
}
</div> </div>
@if (canInstallLocal) @if (canInstallLocal)
{ {
<div id="dialogUploadPlugin" title="Install Plugin Package"> <div id="dialogUploadPlugin" title="Install Plugin Package" class="dialog">
<div style="padding-bottom: 10px;"> <div style="padding-bottom: 10px;">
@using (Html.BeginForm(MVC.API.Plugin.InstallLocal(), FormMethod.Post, new { enctype = "multipart/form-data" })) @using (Html.BeginForm(MVC.API.Plugin.InstallLocal(), FormMethod.Post, new { enctype = "multipart/form-data" }))
{ {
@Html.AntiForgeryToken()
<label for="pluginFile">Plugin Package: </label> <label for="pluginFile">Plugin Package: </label>
<input id="pluginFile" name="Plugin" type="file" accept=".discoPlugin" /> <input id="pluginFile" name="Plugin" type="file" accept=".discoPlugin" />
} }
@@ -114,8 +119,10 @@
return; return;
} }
$(this).dialog("disable"); $(this).dialog("disable");
$(this)
window.location.href = $selectedPluginUrl; .find('form')
.attr('action', $selectedPluginUrl)
.submit();
}, },
Cancel: function () { Cancel: function () {
$selectedPlugin = null; $selectedPlugin = null;
@@ -400,6 +400,8 @@ WriteLiteral(" id=\"dialogInstallPlugin\"");
WriteLiteral(" title=\"Install this Plugin?\""); WriteLiteral(" title=\"Install this Plugin?\"");
WriteLiteral(" class=\"dialog\"");
WriteLiteral(">\r\n <h2"); WriteLiteral(">\r\n <h2");
WriteLiteral(" id=\"dialogInstallPluginName\""); WriteLiteral(" id=\"dialogInstallPluginName\"");
@@ -422,10 +424,41 @@ WriteLiteral(" class=\"fa fa-exclamation-triangle\"");
WriteLiteral("></i><strong>Warning:</strong> All plugins run with the same level of network pri" + WriteLiteral("></i><strong>Warning:</strong> All plugins run with the same level of network pri" +
"vileges as the Disco ICT Web App.<br />\r\n <strong>Only Install plugin" + "vileges as the Disco ICT Web App.<br />\r\n <strong>Only Install plugin" +
"s from a trusted source.</strong>\r\n </p>\r\n </div>\r\n</div>\r\n"); "s from a trusted source.</strong>\r\n </p>\r\n </div>\r\n");
#line 79 "..\..\Areas\Config\Views\Plugins\Install.cshtml" #line 78 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
#line default
#line hidden
#line 78 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
using (Html.BeginForm(MVC.API.Plugin.Install(), FormMethod.Post))
{
#line default
#line hidden
#line 80 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
Write(Html.AntiForgeryToken());
#line default
#line hidden
#line 80 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
}
#line default
#line hidden
WriteLiteral("</div>\r\n");
#line 83 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
if (canInstallLocal) if (canInstallLocal)
{ {
@@ -438,6 +471,8 @@ WriteLiteral(" id=\"dialogUploadPlugin\"");
WriteLiteral(" title=\"Install Plugin Package\""); WriteLiteral(" title=\"Install Plugin Package\"");
WriteLiteral(" class=\"dialog\"");
WriteLiteral(">\r\n <div"); WriteLiteral(">\r\n <div");
WriteLiteral(" style=\"padding-bottom: 10px;\""); WriteLiteral(" style=\"padding-bottom: 10px;\"");
@@ -445,17 +480,31 @@ WriteLiteral(" style=\"padding-bottom: 10px;\"");
WriteLiteral(">\r\n"); WriteLiteral(">\r\n");
#line 83 "..\..\Areas\Config\Views\Plugins\Install.cshtml" #line 87 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
#line default #line default
#line hidden #line hidden
#line 83 "..\..\Areas\Config\Views\Plugins\Install.cshtml" #line 87 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
using (Html.BeginForm(MVC.API.Plugin.InstallLocal(), FormMethod.Post, new { enctype = "multipart/form-data" })) using (Html.BeginForm(MVC.API.Plugin.InstallLocal(), FormMethod.Post, new { enctype = "multipart/form-data" }))
{ {
#line default
#line hidden
#line 89 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
Write(Html.AntiForgeryToken());
#line default
#line hidden
#line 89 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
#line default #line default
#line hidden #line hidden
WriteLiteral(" <label"); WriteLiteral(" <label");
@@ -477,7 +526,7 @@ WriteLiteral(" accept=\".discoPlugin\"");
WriteLiteral(" />\r\n"); WriteLiteral(" />\r\n");
#line 87 "..\..\Areas\Config\Views\Plugins\Install.cshtml" #line 92 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
} }
@@ -501,7 +550,7 @@ WriteLiteral("></i><strong>Warning:</strong> All plugins run with the same level
"iv>\r\n"); "iv>\r\n");
#line 96 "..\..\Areas\Config\Views\Plugins\Install.cshtml" #line 101 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
} }
@@ -515,35 +564,36 @@ WriteLiteral("<script>\r\n $(function () {\r\n var $selectedPlugin;\r\
" \"Install\": function () {\r\n if ($selectedPlugin == null || " + " \"Install\": function () {\r\n if ($selectedPlugin == null || " +
"!$selectedPluginUrl) {\r\n $(this).dialog(\"close\");\r\n " + "!$selectedPluginUrl) {\r\n $(this).dialog(\"close\");\r\n " +
" return;\r\n }\r\n $(this).di" + " return;\r\n }\r\n $(this).di" +
"alog(\"disable\");\r\n\r\n window.location.href = $selectedPluginUr" + "alog(\"disable\");\r\n $(this)\r\n .find(\'fo" +
"l;\r\n },\r\n Cancel: function () {\r\n " + "rm\')\r\n .attr(\'action\', $selectedPluginUrl)\r\n " +
" $selectedPlugin = null;\r\n $(this).dialog(\"close\");\r\n " + " .submit();\r\n },\r\n Cancel: function () {" +
" }\r\n }\r\n });\r\n $(\'#pluginLibraryGroups\').find(" + "\r\n $selectedPlugin = null;\r\n $(this).dialo" +
"\'a.pluginInstallLink\').click(function () {\r\n $this = $(this);\r\n\r\n " + "g(\"close\");\r\n }\r\n }\r\n });\r\n $(\'#pluginLi" +
" $selectedPlugin = $this.closest(\'.pluginItem\');\r\n $selectedPl" + "braryGroups\').find(\'a.pluginInstallLink\').click(function () {\r\n $this" +
"uginUrl = $this.attr(\'href\');\r\n\r\n $(\'#dialogInstallPluginName\').text(" + " = $(this);\r\n\r\n $selectedPlugin = $this.closest(\'.pluginItem\');\r\n " +
"$selectedPlugin.find(\'.pluginName\').text());\r\n $(\'#dialogInstallPlugi" + " $selectedPluginUrl = $this.attr(\'href\');\r\n\r\n $(\'#dialogInstal" +
"nDetails\').text($selectedPlugin.find(\'.pluginId\').text() + \' | \' + $selectedPlug" + "lPluginName\').text($selectedPlugin.find(\'.pluginName\').text());\r\n $(\'" +
"in.find(\'.pluginVersion\').text());\r\n\r\n $dialogInstall.dialog(\'option\'" + "#dialogInstallPluginDetails\').text($selectedPlugin.find(\'.pluginId\').text() + \' " +
", \'title\', \'Install this Plugin?\');\r\n $dialogInstall.dialog(\'open\');\r" + "| \' + $selectedPlugin.find(\'.pluginVersion\').text());\r\n\r\n $dialogInst" +
"\n\r\n return false;\r\n });\r\n $(\'#pluginLibraryGroups\').fin" + "all.dialog(\'option\', \'title\', \'Install this Plugin?\');\r\n $dialogInsta" +
"d(\'a.pluginUpdateLink\').click(function () {\r\n $this = $(this);\r\n\r\n " + "ll.dialog(\'open\');\r\n\r\n return false;\r\n });\r\n $(\'#plugin" +
" $selectedPlugin = $this.closest(\'.pluginItem\');\r\n $selectedP" + "LibraryGroups\').find(\'a.pluginUpdateLink\').click(function () {\r\n $thi" +
"luginUrl = $this.attr(\'href\');\r\n\r\n $(\'#dialogInstallPluginName\').text" + "s = $(this);\r\n\r\n $selectedPlugin = $this.closest(\'.pluginItem\');\r\n " +
"($selectedPlugin.find(\'.pluginName\').text());\r\n $(\'#dialogInstallPlug" + " $selectedPluginUrl = $this.attr(\'href\');\r\n\r\n $(\'#dialogInsta" +
"inDetails\').text($selectedPlugin.find(\'.pluginId\').text() + \' | \' + $selectedPlu" + "llPluginName\').text($selectedPlugin.find(\'.pluginName\').text());\r\n $(" +
"gin.find(\'.pluginVersion\').text());\r\n\r\n $dialogInstall.dialog(\'option" + "\'#dialogInstallPluginDetails\').text($selectedPlugin.find(\'.pluginId\').text() + \'" +
"\', \'title\', \'Update this Plugin?\');\r\n $dialogInstall.dialog(\'open\');\r" + " | \' + $selectedPlugin.find(\'.pluginVersion\').text());\r\n\r\n $dialogIns" +
"\n\r\n return false;\r\n });\r\n\r\n"); "tall.dialog(\'option\', \'title\', \'Update this Plugin?\');\r\n $dialogInsta" +
"ll.dialog(\'open\');\r\n\r\n return false;\r\n });\r\n\r\n");
#line 155 "..\..\Areas\Config\Views\Plugins\Install.cshtml" #line 162 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
#line default #line default
#line hidden #line hidden
#line 155 "..\..\Areas\Config\Views\Plugins\Install.cshtml" #line 162 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
if (canInstallLocal) if (canInstallLocal)
{ {
@@ -578,7 +628,7 @@ WriteLiteral(@"
"); ");
#line 182 "..\..\Areas\Config\Views\Plugins\Install.cshtml" #line 189 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
} }
@@ -593,7 +643,7 @@ WriteLiteral(">\r\n");
WriteLiteral(" "); WriteLiteral(" ");
#line 186 "..\..\Areas\Config\Views\Plugins\Install.cshtml" #line 193 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
Write(Html.ActionLinkButton("Update Plugin Library", MVC.API.Plugin.UpdateLibraryManifest())); Write(Html.ActionLinkButton("Update Plugin Library", MVC.API.Plugin.UpdateLibraryManifest()));
@@ -602,13 +652,13 @@ Write(Html.ActionLinkButton("Update Plugin Library", MVC.API.Plugin.UpdateLibrar
WriteLiteral("\r\n"); WriteLiteral("\r\n");
#line 187 "..\..\Areas\Config\Views\Plugins\Install.cshtml" #line 194 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
#line default #line default
#line hidden #line hidden
#line 187 "..\..\Areas\Config\Views\Plugins\Install.cshtml" #line 194 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
if (canInstallLocal) if (canInstallLocal)
{ {
@@ -616,14 +666,14 @@ WriteLiteral("\r\n");
#line default #line default
#line hidden #line hidden
#line 189 "..\..\Areas\Config\Views\Plugins\Install.cshtml" #line 196 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
Write(Html.ActionLinkButton("Install Plugin Package", MVC.API.Plugin.InstallLocal(), "buttonUpload")); Write(Html.ActionLinkButton("Install Plugin Package", MVC.API.Plugin.InstallLocal(), "buttonUpload"));
#line default #line default
#line hidden #line hidden
#line 189 "..\..\Areas\Config\Views\Plugins\Install.cshtml" #line 196 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
} }
+1 -1
View File
@@ -95,7 +95,7 @@
font-size: 50px; font-size: 50px;
color: #e51400; color: #e51400;
} }
#updateAvailableContainer a.button { #updateAvailableContainer button {
font-size: 12px; font-size: 12px;
margin-top: 8px; margin-top: 8px;
} }
+1 -1
View File
@@ -21,7 +21,7 @@
color: @ButtonAlertColour; color: @ButtonAlertColour;
} }
a.button { button {
font-size: @FontSizeDefault; font-size: @FontSizeDefault;
margin-top: 8px; margin-top: 8px;
} }
File diff suppressed because one or more lines are too long
@@ -67,12 +67,6 @@ namespace Disco.Web.Areas.API.Controllers
} }
[NonAction] [NonAction]
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public virtual System.Web.Mvc.ActionResult UpdateLocal()
{
return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateLocal);
}
[NonAction]
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public virtual System.Web.Mvc.ActionResult Uninstall() public virtual System.Web.Mvc.ActionResult Uninstall()
{ {
return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Uninstall); return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Uninstall);
@@ -108,7 +102,6 @@ namespace Disco.Web.Areas.API.Controllers
public readonly string UpdateLibraryManifest = "UpdateLibraryManifest"; public readonly string UpdateLibraryManifest = "UpdateLibraryManifest";
public readonly string UpdateAll = "UpdateAll"; public readonly string UpdateAll = "UpdateAll";
public readonly string Update = "Update"; public readonly string Update = "Update";
public readonly string UpdateLocal = "UpdateLocal";
public readonly string Uninstall = "Uninstall"; public readonly string Uninstall = "Uninstall";
public readonly string Install = "Install"; public readonly string Install = "Install";
public readonly string InstallLocal = "InstallLocal"; public readonly string InstallLocal = "InstallLocal";
@@ -120,7 +113,6 @@ namespace Disco.Web.Areas.API.Controllers
public const string UpdateLibraryManifest = "UpdateLibraryManifest"; public const string UpdateLibraryManifest = "UpdateLibraryManifest";
public const string UpdateAll = "UpdateAll"; public const string UpdateAll = "UpdateAll";
public const string Update = "Update"; public const string Update = "Update";
public const string UpdateLocal = "UpdateLocal";
public const string Uninstall = "Uninstall"; public const string Uninstall = "Uninstall";
public const string Install = "Install"; public const string Install = "Install";
public const string InstallLocal = "InstallLocal"; public const string InstallLocal = "InstallLocal";
@@ -133,7 +125,7 @@ namespace Disco.Web.Areas.API.Controllers
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class ActionParamsClass_UpdateLibraryManifest public class ActionParamsClass_UpdateLibraryManifest
{ {
public readonly string TryWaitingForCompletion = "TryWaitingForCompletion"; public readonly string tryWaitingForCompletion = "tryWaitingForCompletion";
} }
static readonly ActionParamsClass_Update s_params_Update = new ActionParamsClass_Update(); static readonly ActionParamsClass_Update s_params_Update = new ActionParamsClass_Update();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
@@ -141,16 +133,7 @@ namespace Disco.Web.Areas.API.Controllers
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class ActionParamsClass_Update public class ActionParamsClass_Update
{ {
public readonly string PluginId = "PluginId"; public readonly string pluginId = "pluginId";
}
static readonly ActionParamsClass_UpdateLocal s_params_UpdateLocal = new ActionParamsClass_UpdateLocal();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public ActionParamsClass_UpdateLocal UpdateLocalParams { get { return s_params_UpdateLocal; } }
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class ActionParamsClass_UpdateLocal
{
public readonly string PluginId = "PluginId";
public readonly string Plugin = "Plugin";
} }
static readonly ActionParamsClass_Uninstall s_params_Uninstall = new ActionParamsClass_Uninstall(); static readonly ActionParamsClass_Uninstall s_params_Uninstall = new ActionParamsClass_Uninstall();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
@@ -159,7 +142,7 @@ namespace Disco.Web.Areas.API.Controllers
public class ActionParamsClass_Uninstall public class ActionParamsClass_Uninstall
{ {
public readonly string id = "id"; public readonly string id = "id";
public readonly string UninstallData = "UninstallData"; public readonly string uninstallData = "uninstallData";
} }
static readonly ActionParamsClass_Install s_params_Install = new ActionParamsClass_Install(); static readonly ActionParamsClass_Install s_params_Install = new ActionParamsClass_Install();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
@@ -167,7 +150,7 @@ namespace Disco.Web.Areas.API.Controllers
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class ActionParamsClass_Install public class ActionParamsClass_Install
{ {
public readonly string PluginId = "PluginId"; public readonly string pluginId = "pluginId";
} }
static readonly ActionParamsClass_InstallLocal s_params_InstallLocal = new ActionParamsClass_InstallLocal(); static readonly ActionParamsClass_InstallLocal s_params_InstallLocal = new ActionParamsClass_InstallLocal();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
@@ -175,7 +158,8 @@ namespace Disco.Web.Areas.API.Controllers
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class ActionParamsClass_InstallLocal public class ActionParamsClass_InstallLocal
{ {
public readonly string Plugin = "Plugin"; public readonly string plugin = "plugin";
public readonly string immediateRestart = "immediateRestart";
} }
static readonly ViewsClass s_views = new ViewsClass(); static readonly ViewsClass s_views = new ViewsClass();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
@@ -197,14 +181,14 @@ namespace Disco.Web.Areas.API.Controllers
public T4MVC_PluginController() : base(Dummy.Instance) { } public T4MVC_PluginController() : base(Dummy.Instance) { }
[NonAction] [NonAction]
partial void UpdateLibraryManifestOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, bool TryWaitingForCompletion); partial void UpdateLibraryManifestOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, bool tryWaitingForCompletion);
[NonAction] [NonAction]
public override System.Web.Mvc.ActionResult UpdateLibraryManifest(bool TryWaitingForCompletion) public override System.Web.Mvc.ActionResult UpdateLibraryManifest(bool tryWaitingForCompletion)
{ {
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateLibraryManifest); var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateLibraryManifest);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "TryWaitingForCompletion", TryWaitingForCompletion); ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "tryWaitingForCompletion", tryWaitingForCompletion);
UpdateLibraryManifestOverride(callInfo, TryWaitingForCompletion); UpdateLibraryManifestOverride(callInfo, tryWaitingForCompletion);
return callInfo; return callInfo;
} }
@@ -220,64 +204,52 @@ namespace Disco.Web.Areas.API.Controllers
} }
[NonAction] [NonAction]
partial void UpdateOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, string PluginId); partial void UpdateOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, string pluginId);
[NonAction] [NonAction]
public override System.Web.Mvc.ActionResult Update(string PluginId) public override System.Web.Mvc.ActionResult Update(string pluginId)
{ {
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Update); var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Update);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "PluginId", PluginId); ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "pluginId", pluginId);
UpdateOverride(callInfo, PluginId); UpdateOverride(callInfo, pluginId);
return callInfo; return callInfo;
} }
[NonAction] [NonAction]
partial void UpdateLocalOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, string PluginId, System.Web.HttpPostedFileBase Plugin); partial void UninstallOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, string id, bool uninstallData);
[NonAction] [NonAction]
public override System.Web.Mvc.ActionResult UpdateLocal(string PluginId, System.Web.HttpPostedFileBase Plugin) public override System.Web.Mvc.ActionResult Uninstall(string id, bool uninstallData)
{
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateLocal);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "PluginId", PluginId);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "Plugin", Plugin);
UpdateLocalOverride(callInfo, PluginId, Plugin);
return callInfo;
}
[NonAction]
partial void UninstallOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, string id, bool UninstallData);
[NonAction]
public override System.Web.Mvc.ActionResult Uninstall(string id, bool UninstallData)
{ {
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Uninstall); var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Uninstall);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id); ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "UninstallData", UninstallData); ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "uninstallData", uninstallData);
UninstallOverride(callInfo, id, UninstallData); UninstallOverride(callInfo, id, uninstallData);
return callInfo; return callInfo;
} }
[NonAction] [NonAction]
partial void InstallOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, string PluginId); partial void InstallOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, string pluginId);
[NonAction] [NonAction]
public override System.Web.Mvc.ActionResult Install(string PluginId) public override System.Web.Mvc.ActionResult Install(string pluginId)
{ {
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Install); var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Install);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "PluginId", PluginId); ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "pluginId", pluginId);
InstallOverride(callInfo, PluginId); InstallOverride(callInfo, pluginId);
return callInfo; return callInfo;
} }
[NonAction] [NonAction]
partial void InstallLocalOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, System.Web.HttpPostedFileBase Plugin); partial void InstallLocalOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, System.Web.HttpPostedFileBase plugin, bool immediateRestart);
[NonAction] [NonAction]
public override System.Web.Mvc.ActionResult InstallLocal(System.Web.HttpPostedFileBase Plugin) public override System.Web.Mvc.ActionResult InstallLocal(System.Web.HttpPostedFileBase plugin, bool immediateRestart)
{ {
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.InstallLocal); var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.InstallLocal);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "Plugin", Plugin); ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "plugin", plugin);
InstallLocalOverride(callInfo, Plugin); ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "immediateRestart", immediateRestart);
InstallLocalOverride(callInfo, plugin, immediateRestart);
return callInfo; return callInfo;
} }