Update: Plugin Updating

Updating plugins from the plugin catalogue, and automatic updating of
plugins after a newer version of Disco is installed.
This commit is contained in:
Gary Sharp committed 2013-02-14 19:00:01 +11:00
1 parent 734b02fa1d
commit 8f769809c2
53 files changed
+1172 -352

No files matched your search

+11 -7
View File
@@ -18,13 +18,17 @@ namespace Disco.BI.Interop.Community
{
private static string UpdateUrl()
{
return string.Concat(CommunityHelpers.CommunityUrl(), "DiscoUpdate/V1");
return string.Concat(Disco.Data.Configuration.CommunityHelpers.CommunityUrl(), "DiscoUpdate/V1");
}
public static string CurrentDiscoVersion()
public static Version CurrentDiscoVersion()
{
var AssemblyVersion = typeof(UpdateCheck).Assembly.GetName().Version;
return string.Format("{0}.{1}.{2:0000}.{3:0000}", AssemblyVersion.Major, AssemblyVersion.Minor, AssemblyVersion.Build, AssemblyVersion.Revision);
return typeof(UpdateCheck).Assembly.GetName().Version;
}
public static string CurrentDiscoVersionFormatted()
{
var v = CurrentDiscoVersion();
return string.Format("{0}.{1}.{2:0000}.{3:0000}", v.Major, v.Minor, v.Build, v.Revision);
}
public static UpdateResponse Check(DiscoDataContext db, bool UseProxy, ScheduledTaskStatus status = null)
@@ -38,7 +42,7 @@ namespace Disco.BI.Interop.Community
if (status != null)
status.UpdateStatus(40, "Sending Request");
var DiscoBIVersion = CurrentDiscoVersion();
var DiscoBIVersion = CurrentDiscoVersionFormatted();
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(UpdateUrl());
@@ -96,7 +100,7 @@ namespace Disco.BI.Interop.Community
m.DeploymentId = db.DiscoConfiguration.DeploymentId;
m.CurrentDiscoVersion = CurrentDiscoVersion();
m.CurrentDiscoVersion = CurrentDiscoVersionFormatted();
m.OrganisationName = db.DiscoConfiguration.OrganisationName;
m.BroadbandDoeWanId = GetBroadbandDoeWanId();
@@ -144,7 +148,7 @@ namespace Disco.BI.Interop.Community
{
try
{
var DiscoBIVersion = CurrentDiscoVersion();
var DiscoBIVersion = CurrentDiscoVersionFormatted();
HttpWebRequest wReq = (HttpWebRequest)HttpWebRequest.Create("http://broadband.doe.wan/ipsearch/showresult.php");
// Added: 2013-02-08 G#
@@ -55,7 +55,7 @@ namespace Disco.BI.Interop.Community
public override void InitalizeScheduledTask(Data.Repository.DiscoDataContext dbContext)
{
// ActiveDirectoryUpdateLastNetworkLogonDateJob @ 11:30pm
// Random time between midday and midnight.
var rnd = new Random();
var rndHour = rnd.Next(12, 23);
+1 -3
View File
@@ -149,8 +149,6 @@
<Compile Include="BI\Interop\ActiveDirectory\ActiveDirectoryUpdateLastNetworkLogonDateJob.cs" />
<Compile Include="BI\Interop\ActiveDirectory\ActiveDirectoryUserAccountExtensions.cs" />
<Compile Include="BI\Expressions\ExpressionCache.cs" />
<Compile Include="BI\Interop\Community\CommunityHelpers.cs" />
<Compile Include="BI\Interop\Community\PluginLibraryUpdateTask.cs" />
<Compile Include="BI\Interop\Community\UpdateCheck.cs" />
<Compile Include="BI\Interop\Community\UpdateCheckTask.cs" />
<Compile Include="BI\Interop\MimeTypes.cs" />
@@ -221,7 +219,7 @@
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<ProjectExtensions>
<VisualStudio>
<UserProperties BuildVersion_StartDate="2001/1/1" BuildVersion_BuildAction="ReBuild" BuildVersion_DetectChanges="False" BuildVersion_UseGlobalSettings="True" />
<UserProperties BuildVersion_UseGlobalSettings="True" BuildVersion_DetectChanges="False" BuildVersion_BuildAction="ReBuild" BuildVersion_StartDate="2001/1/1" />
</VisualStudio>
</ProjectExtensions>
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
+2 -2
View File
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2.0212.1702")]
[assembly: AssemblyFileVersion("1.2.0212.1702")]
[assembly: AssemblyVersion("1.2.0214.1848")]
[assembly: AssemblyFileVersion("1.2.0214.1848")]
Binary file not shown.
+2 -2
View File
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2.0212.1702")]
[assembly: AssemblyFileVersion("1.2.0212.1702")]
[assembly: AssemblyVersion("1.2.0214.1848")]
[assembly: AssemblyFileVersion("1.2.0214.1848")]
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2.0212.1702")]
[assembly: AssemblyFileVersion("1.2.0212.1702")]
[assembly: AssemblyVersion("1.2.0214.1848")]
[assembly: AssemblyFileVersion("1.2.0214.1848")]
@@ -5,7 +5,7 @@ using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace Disco.BI.Interop.Community
namespace Disco.Data.Configuration
{
public static class CommunityHelpers
{
@@ -460,15 +460,19 @@ namespace Disco.Data.Configuration
return this.GetConfigurationValue<bool>(this.Scope, "UpdateBetaDeployment", false);
}
}
public string InstalledDatabaseVersion
public Version InstalledDatabaseVersion
{
get
{
return this.GetConfigurationValue<string>(this.Scope, "InstalledDatabaseVersion", null);
var versionString = this.GetConfigurationValue<string>(this.Scope, "InstalledDatabaseVersion", null);
if (string.IsNullOrEmpty(versionString))
return null;
else
return Version.Parse(versionString);
}
set
{
this.SetConfigurationValue<string>(this.Scope, "InstalledDatabaseVersion", value);
this.SetConfigurationValue<string>(this.Scope, "InstalledDatabaseVersion", value.ToString(4));
}
}
#endregion
+2 -1
View File
@@ -57,6 +57,7 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Configuration\CommunityHelpers.cs" />
<Compile Include="Configuration\ConfigurationBase.cs" />
<Compile Include="Configuration\ConfigurationContext.cs" />
<Compile Include="Configuration\Modules\BootstrapperConfiguration.cs" />
@@ -136,7 +137,7 @@
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<ProjectExtensions>
<VisualStudio>
<UserProperties BuildVersion_BuildAction="ReBuild" BuildVersion_UseGlobalSettings="True" BuildVersion_DetectChanges="False" BuildVersion_StartDate="2001/1/1" />
<UserProperties BuildVersion_StartDate="2001/1/1" BuildVersion_DetectChanges="False" BuildVersion_UseGlobalSettings="True" BuildVersion_BuildAction="ReBuild" />
</VisualStudio>
</ProjectExtensions>
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
+2 -2
View File
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2.0212.1702")]
[assembly: AssemblyFileVersion("1.2.0212.1702")]
[assembly: AssemblyVersion("1.2.0214.1848")]
[assembly: AssemblyFileVersion("1.2.0214.1848")]
+2 -2
View File
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2.0212.1702")]
[assembly: AssemblyFileVersion("1.2.0212.1702")]
[assembly: AssemblyVersion("1.2.0214.1848")]
[assembly: AssemblyFileVersion("1.2.0214.1848")]
+3 -1
View File
@@ -101,6 +101,9 @@
<Compile Include="Logging\Targets\LogLiveContext.cs" />
<Compile Include="Logging\Targets\LogPersistContext.cs" />
<Compile Include="Logging\Utilities.cs" />
<Compile Include="Plugins\CommunityInterop\PluginLibraryUpdateTask.cs" />
<Compile Include="Plugins\UpdatePluginsAfterDiscoUpdateTask.cs" />
<Compile Include="Plugins\UpdatePluginTask.cs" />
<Compile Include="Plugins\InstallPluginTask.cs" />
<Compile Include="Plugins\PluginAttribute.cs" />
<Compile Include="Plugins\PluginExtensions.cs" />
@@ -126,7 +129,6 @@
<Compile Include="Plugins\UnknownPluginException.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Tasks\ScheduledTask.cs" />
<Compile Include="Tasks\ScheduledTaskCleanup.cs" />
<Compile Include="Tasks\ScheduledTasks.cs" />
<Compile Include="Tasks\ScheduledTasksLog.cs" />
<Compile Include="Tasks\ScheduledTaskStatus.cs" />
@@ -12,14 +12,27 @@ using System.Xml.Serialization;
using System.IO;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Quartz;
namespace Disco.BI.Interop.Community
namespace Disco.Services.Plugins.CommunityInterop
{
public class PluginLibraryUpdateTask : ScheduledTask
{
public override string TaskName { get { return "Disco Community - Update Plugin Library"; } }
public static string CurrentDiscoVersion()
{
var AssemblyVersion = typeof(PluginLibraryUpdateTask).Assembly.GetName().Version;
return string.Format("{0}.{1}.{2:0000}.{3:0000}", AssemblyVersion.Major, AssemblyVersion.Minor, AssemblyVersion.Build, AssemblyVersion.Revision);
}
protected override void ExecuteTask()
{
ExecuteTaskInternal(this.Status);
Status.SetFinishedMessage("The Plugin Library Catalogue was updated.");
}
internal static void ExecuteTaskInternal(ScheduledTaskStatus Status)
{
PluginLibraryUpdateRequest updateRequestBody;
PluginLibraryUpdateResponse updateResult;
@@ -28,7 +41,7 @@ namespace Disco.BI.Interop.Community
PluginLibraryCompatibilityResponse compatResult;
string compatibilityFile;
var DiscoBIVersion = UpdateCheck.CurrentDiscoVersion();
var DiscoBIVersion = CurrentDiscoVersion();
HttpWebRequest webRequest;
#region Update
@@ -156,20 +169,15 @@ namespace Disco.BI.Interop.Community
}
}
#endregion
Status.SetFinishedMessage("The Plugin Library Catalogue was updated.");
}
private static string PluginLibraryUpdateUrl()
{
return string.Concat(CommunityHelpers.CommunityUrl(), "DiscoPluginLibrary/V1");
return string.Concat(Disco.Data.Configuration.CommunityHelpers.CommunityUrl(), "DiscoPluginLibrary/V1");
}
private static string PluginLibraryCompatibilityUrl()
{
return string.Concat(CommunityHelpers.CommunityUrl(), "DiscoPluginLibrary/CompatibilityV1");
return string.Concat(Disco.Data.Configuration.CommunityHelpers.CommunityUrl(), "DiscoPluginLibrary/CompatibilityV1");
}
public static ScheduledTaskStatus ScheduleNow()
@@ -191,5 +199,19 @@ namespace Disco.BI.Interop.Community
return ScheduledTasks.GetTaskStatuses(typeof(PluginLibraryUpdateTask)).Where(ts => ts.IsRunning).FirstOrDefault();
}
}
public override void InitalizeScheduledTask(DiscoDataContext dbContext)
{
// Random time between midday and midnight.
var rnd = new Random();
var rndHour = rnd.Next(12, 23);
var rndMinute = rnd.Next(0, 59);
TriggerBuilder triggerBuilder = TriggerBuilder.Create().
WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(rndHour, rndMinute));
this.ScheduleTask(triggerBuilder);
}
}
}
@@ -158,6 +158,10 @@ namespace Disco.Services.Plugins
{
if (ScheduledTasks.GetTaskStatuses(typeof(InstallPluginTask)).Where(s => s.IsRunning).Count() > 0)
throw new InvalidOperationException("A plugin is already being Installed");
if (ScheduledTasks.GetTaskStatuses(typeof(UpdatePluginTask)).Where(s => s.IsRunning).Count() > 0)
throw new InvalidOperationException("A plugin is being Updated");
if (ScheduledTasks.GetTaskStatuses(typeof(UninstallPluginTask)).Where(s => s.IsRunning).Count() > 0)
throw new InvalidOperationException("A plugin is being Uninstalled");
JobDataMap taskData = new JobDataMap() { { "PackageUrl", PackageUrl }, { "PackageFilePath", PackageFilePath }, { "DeletePackageAfterInstall", DeletePackageAfterInstall } };
+16
View File
@@ -348,6 +348,14 @@ namespace Disco.Services.Plugins
return handler;
}
[JsonIgnore]
public string ConfigurationUrl
{
get
{
return string.Format("/Config/Plugins/{0}", HttpUtility.UrlEncode(this.Id));
}
}
[JsonIgnore]
public bool HasWebHandler
{
get
@@ -371,6 +379,14 @@ namespace Disco.Services.Plugins
return handler;
}
[JsonIgnore]
public string WebHandlerUrl
{
get
{
return string.Format("/Plugin/{0}", HttpUtility.UrlEncode(this.Id));
}
}
public Tuple<string, string> WebResourcePath(string Resource)
{
+22
View File
@@ -10,6 +10,7 @@ using System.IO.Compression;
using Disco.Models.BI.Interop.Community;
using System.Web;
using Newtonsoft.Json;
using System.Threading;
namespace Disco.Services.Plugins
{
@@ -477,6 +478,27 @@ namespace Disco.Services.Plugins
return categoryDisplayNames;
}
#region Restart App
private static object _restartTimerLock = new object();
private static Timer _restartTimer;
internal static void RestartApp(int DelayMilliseconds)
{
lock (_restartTimerLock)
{
if (_restartTimer != null)
{
_restartTimer.Dispose();
}
_restartTimer = new Timer((state) =>
{
HttpRuntime.UnloadAppDomain();
//AppDomain.Unload(AppDomain.CurrentDomain);
}, null, DelayMilliseconds, Timeout.Infinite);
}
}
#endregion
#region Plugin Referenced Assemblies Resolving
public static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
+5 -22
View File
@@ -45,13 +45,17 @@ namespace Disco.Services.Plugins
}
this.Status.Finished("Restarting Disco, please wait...", "/Config/Plugins");
RestartApp(1500);
Plugins.RestartApp(1500);
}
public static ScheduledTaskStatus UninstallPlugin(PluginManifest Manifest, bool UninstallData)
{
if (ScheduledTasks.GetTaskStatuses(typeof(InstallPluginTask)).Where(s => s.IsRunning).Count() > 0)
throw new InvalidOperationException("A plugin is already being Uninstalled");
if (ScheduledTasks.GetTaskStatuses(typeof(UpdatePluginTask)).Where(s => s.IsRunning).Count() > 0)
throw new InvalidOperationException("A plugin is being Updated");
if (ScheduledTasks.GetTaskStatuses(typeof(InstallPluginTask)).Where(s => s.IsRunning).Count() > 0)
throw new InvalidOperationException("A plugin is being Installed");
JobDataMap taskData = new JobDataMap() { { "PluginManifest", Manifest }, { "UninstallData", UninstallData } };
@@ -59,26 +63,5 @@ namespace Disco.Services.Plugins
return instance.ScheduleTask(taskData);
}
#region Restart App
private static object _restartTimerLock = new object();
private static Timer _restartTimer;
private void RestartApp(int DelayMilliseconds)
{
lock (_restartTimerLock)
{
if (_restartTimer != null)
{
_restartTimer.Dispose();
}
_restartTimer = new Timer((state) =>
{
HttpRuntime.UnloadAppDomain();
//AppDomain.Unload(AppDomain.CurrentDomain);
}, null, DelayMilliseconds, Timeout.Infinite);
}
}
#endregion
}
}
+252
View File
@@ -0,0 +1,252 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using Disco.Data.Repository;
using Disco.Models.BI.Interop.Community;
using Disco.Services.Tasks;
using Quartz;
namespace Disco.Services.Plugins
{
public class UpdatePluginTask : ScheduledTask
{
public override string TaskName { get { return "Updating Plugin/s"; } }
protected override void ExecuteTask()
{
string pluginId = (string)this.ExecutionContext.JobDetail.JobDataMap["PluginId"];
string packageFilePath = (string)this.ExecutionContext.JobDetail.JobDataMap["PackageFilePath"];
PluginLibraryUpdateResponse catalogue;
string pluginPackagesLocation;
if (!Plugins.PluginsLoaded)
throw new InvalidOperationException("Plugins have not been initialized");
List<Tuple<PluginManifest, string, PluginLibraryItem>> updatePlugins;
using (DiscoDataContext dbContext = new DiscoDataContext())
{
catalogue = Plugins.LoadCatalogue(dbContext);
pluginPackagesLocation = dbContext.DiscoConfiguration.PluginPackagesLocation;
}
if (!string.IsNullOrEmpty(pluginId))
{
if (string.IsNullOrEmpty(packageFilePath))
{
// Update Single from Catalogue
PluginManifest existingManifest = Plugins.GetPlugin(pluginId);
var catalogueItem = catalogue.Plugins.FirstOrDefault(p => p.Id == existingManifest.Id);
if (catalogueItem == null)
throw new InvalidOperationException("No updates are available for this Plugin");
if (Version.Parse(catalogueItem.LatestVersion) <= existingManifest.Version)
throw new InvalidOperationException("Only newer versions can be used to update a plugin");
updatePlugins = new List<Tuple<PluginManifest, string, PluginLibraryItem>>() {
new Tuple<PluginManifest,string,PluginLibraryItem>(existingManifest, null, catalogueItem)
};
}
else
{
// Update Single from Local
PluginManifest existingManifest = Plugins.GetPlugin(pluginId);
updatePlugins = new List<Tuple<PluginManifest, string, PluginLibraryItem>>() {
new Tuple<PluginManifest,string,PluginLibraryItem>(existingManifest, packageFilePath, null)
};
}
}
else
{
// Update All
updatePlugins = Plugins.GetPlugins().Join((IEnumerable<PluginLibraryItem>)catalogue.Plugins, manifest => manifest.Id, update => update.Id, (manifest, update) => new Tuple<PluginManifest, string, PluginLibraryItem>(manifest, null, update)).Where(i => Version.Parse(i.Item3.LatestVersion) > i.Item1.Version).ToList();
}
if (updatePlugins == null || updatePlugins.Count == 0)
{
this.Status.Finished("No plugins to update...", "/Config/Plugins");
return;
}
ExecuteTaskInternal(this.Status, pluginPackagesLocation, updatePlugins);
this.Status.Finished("Restarting Disco, please wait...", "/Config/Plugins");
Plugins.RestartApp(1500);
}
internal static void UpdateOffline(ScheduledTaskStatus Status)
{
string pluginsLocation;
string pluginPackagesLocation;
PluginLibraryUpdateResponse pluginCatalogue;
List<Tuple<PluginManifest, string, PluginLibraryItem>> UpdatePlugins = new List<Tuple<PluginManifest, string, PluginLibraryItem>>();
using (DiscoDataContext dbContext = new DiscoDataContext())
{
pluginCatalogue = Plugins.LoadCatalogue(dbContext);
pluginsLocation = dbContext.DiscoConfiguration.PluginsLocation;
pluginPackagesLocation = dbContext.DiscoConfiguration.PluginPackagesLocation;
}
DirectoryInfo pluginDirectoryRoot = new DirectoryInfo(pluginsLocation);
if (pluginDirectoryRoot.Exists)
{
foreach (DirectoryInfo pluginDirectory in pluginDirectoryRoot.EnumerateDirectories())
{
string pluginManifestFilename = Path.Combine(pluginDirectory.FullName, "manifest.json");
if (File.Exists(pluginManifestFilename))
{
PluginManifest pluginManifest = null;
try
{
pluginManifest = PluginManifest.FromPluginManifestFile(pluginManifestFilename);
}
catch (Exception) { }
if (pluginManifest != null)
{
// Check for Update
var catalogueItem = pluginCatalogue.Plugins.FirstOrDefault(i => i.Id == pluginManifest.Id && Version.Parse(i.LatestVersion) > pluginManifest.Version);
if (catalogueItem != null)
{ // Update Available
UpdatePlugins.Add(new Tuple<PluginManifest, string, PluginLibraryItem>(pluginManifest, null, catalogueItem));
}
}
}
}
}
if (UpdatePlugins.Count > 0)
{
ExecuteTaskInternal(Status, pluginPackagesLocation, UpdatePlugins);
}
}
internal static void ExecuteTaskInternal(ScheduledTaskStatus Status, string pluginPackagesLocation, List<Tuple<PluginManifest, string, PluginLibraryItem>> UpdatePlugins)
{
while (UpdatePlugins.Count > 0)
{
var updatePlugin = UpdatePlugins[0];
var existingManifest = updatePlugin.Item1;
var packageTempFilePath = updatePlugin.Item2;
var catalogueItem = updatePlugin.Item3;
UpdatePlugins.Remove(updatePlugin);
var pluginId = existingManifest != null ? existingManifest.Id : catalogueItem.Id;
var pluginName = existingManifest != null ? existingManifest.Name : catalogueItem.Name;
if (string.IsNullOrEmpty(packageTempFilePath))
{
// Download Update
Status.UpdateStatus(0, string.Format("Downloading Plugin Package: {0}", pluginName), "Connecting...");
packageTempFilePath = Path.Combine(pluginPackagesLocation, string.Format("{0}.discoPlugin", pluginId));
if (File.Exists(packageTempFilePath))
File.Delete(packageTempFilePath);
if (!Directory.Exists(Path.GetDirectoryName(packageTempFilePath)))
Directory.CreateDirectory(Path.GetDirectoryName(packageTempFilePath));
// Need to Download the Package
WebClient downloader = new WebClient();
DateTime progressExpires = DateTime.Now;
downloader.DownloadProgressChanged += (sender, e) =>
{
Console.WriteLine(e.ProgressPercentage);
if (progressExpires <= DateTime.Now)
{
Status.UpdateStatus(e.ProgressPercentage, string.Format("{0} of {1} KB downloaded", e.BytesReceived / 1024, e.TotalBytesToReceive / 1024));
// Throttle Updates for SignalR
progressExpires = DateTime.Now.AddMilliseconds(250);
}
};
downloader.DownloadFileTaskAsync(new Uri(catalogueItem.LatestDownloadUrl), packageTempFilePath).Wait();
}
Status.UpdateStatus(10, "Opening Plugin Package", Path.GetFileName(packageTempFilePath));
PluginManifest updateManifest;
using (var packageStream = File.OpenRead(packageTempFilePath))
{
using (ZipArchive packageArchive = new ZipArchive(packageStream, ZipArchiveMode.Read, false))
{
ZipArchiveEntry packageManifestEntry = packageArchive.GetEntry("manifest.json");
if (packageManifestEntry == null)
throw new InvalidDataException("The plugin package does not contain the 'manifest.json' entry");
using (Stream packageManifestStream = packageManifestEntry.Open())
{
updateManifest = PluginManifest.FromPluginManifestFile(packageManifestStream);
}
}
}
// Ensure not already installed
if (existingManifest != null)
if (updateManifest.Version <= existingManifest.Version)
throw new InvalidOperationException("Only newer versions can be used to update a plugin");
Status.UpdateStatus(20, string.Format("{0} [{1} v{2}] by {3}", updateManifest.Name, updateManifest.Id, updateManifest.Version.ToString(4), updateManifest.Author), "Initializing Update Environment");
using (DiscoDataContext dbContext = new DiscoDataContext())
{
// Check for Compatibility
var compatibilityData = Plugins.LoadCompatibilityData(dbContext);
var pluginCompatibility = compatibilityData.Plugins.FirstOrDefault(i => i.Id.Equals(updateManifest.Id, StringComparison.InvariantCultureIgnoreCase) && updateManifest.Version == Version.Parse(i.Version));
if (pluginCompatibility != null && !pluginCompatibility.Compatible)
throw new InvalidOperationException(string.Format("The plugin [{0} v{1}] is not compatible: {2}", updateManifest.Id, updateManifest.VersionFormatted, pluginCompatibility.Reason));
var updatePluginPath = Path.Combine(dbContext.DiscoConfiguration.PluginsLocation, string.Format("{0}.discoPlugin", updateManifest.Id));
File.Move(packageTempFilePath, updatePluginPath);
if (existingManifest != null && Plugins.PluginsLoaded)
{
PluginsLog.LogBeforeUpdate(existingManifest, updateManifest);
existingManifest.BeforePluginUpdate(dbContext, updateManifest, Status);
}
}
}
}
private static ScheduledTaskStatus UpdateHelper(string PluginId = null, string PackageFilePath = null)
{
if (ScheduledTasks.GetTaskStatuses(typeof(UpdatePluginTask)).Where(s => s.IsRunning).Count() > 0)
throw new InvalidOperationException("A plugin is already being Updated");
if (ScheduledTasks.GetTaskStatuses(typeof(UninstallPluginTask)).Where(s => s.IsRunning).Count() > 0)
throw new InvalidOperationException("A plugin is being Uninstalled");
if (ScheduledTasks.GetTaskStatuses(typeof(InstallPluginTask)).Where(s => s.IsRunning).Count() > 0)
throw new InvalidOperationException("A plugin is being Installed");
JobDataMap taskData = new JobDataMap() { { "PluginId", PluginId }, { "PackageFilePath", PackageFilePath } };
var instance = new UpdatePluginTask();
return instance.ScheduleTask(taskData);
}
public static ScheduledTaskStatus UpdateLocalPlugin(string PluginId, string PackageFilePath)
{
return UpdateHelper(PluginId, PackageFilePath);
}
public static ScheduledTaskStatus UpdatePlugin(string PluginId)
{
return UpdateHelper(PluginId);
}
public static ScheduledTaskStatus UpdateAllPlugins()
{
return UpdateHelper();
}
}
}
@@ -0,0 +1,77 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Disco.Services.Tasks;
namespace Disco.Services.Plugins
{
public class UpdatePluginsAfterDiscoUpdateTask : ScheduledTask
{
private static object _startLock = new object();
public override string TaskName { get { return "Updating Disco Plugins"; } }
protected override void ExecuteTask()
{
this.Status.UpdateStatus(0, "Updating plugins after Disco update", "Starting, please wait...");
// Wait for App to Load (6 Seconds)
for (int i = 0; i < 10; i++)
{
this.Status.UpdateStatus(10 * i);
System.Threading.Thread.Sleep(600);
}
// Update Catalogue
CommunityInterop.PluginLibraryUpdateTask.ExecuteTaskInternal(this.Status);
// Update all Plugins
UpdatePluginTask.UpdateOffline(this.Status);
// Restart
this.Status.Finished("Restarting Disco, please wait...", "/");
Plugins.RestartApp(1500);
}
public static ScheduledTaskStatus UpdateDiscoPlugins(bool ReturnExistingStatusIfRunning)
{
if (ScheduledTasks.GetTaskStatuses(typeof(UpdatePluginTask)).Where(s => s.IsRunning).Count() > 0)
throw new InvalidOperationException("A plugin is already being Updated");
if (ScheduledTasks.GetTaskStatuses(typeof(UninstallPluginTask)).Where(s => s.IsRunning).Count() > 0)
throw new InvalidOperationException("A plugin is being Uninstalled");
if (ScheduledTasks.GetTaskStatuses(typeof(InstallPluginTask)).Where(s => s.IsRunning).Count() > 0)
throw new InvalidOperationException("A plugin is being Installed");
var existingTask = ScheduledTasks.GetTaskStatuses(typeof(UpdatePluginsAfterDiscoUpdateTask)).Where(s => s.IsRunning).FirstOrDefault();
if (existingTask != null)
{
if (ReturnExistingStatusIfRunning)
return existingTask;
else
throw new InvalidOperationException("Plugins are already being updated");
}
lock (_startLock)
{
existingTask = ScheduledTasks.GetTaskStatuses(typeof(UpdatePluginsAfterDiscoUpdateTask)).Where(s => s.IsRunning).FirstOrDefault();
if (existingTask != null)
{
if (ReturnExistingStatusIfRunning)
return existingTask;
else
throw new InvalidOperationException("Plugins are already being updated");
}
var instance = new UpdatePluginsAfterDiscoUpdateTask();
var status = instance.ScheduleTask();
// Give the scheduler a chance to start the task
System.Threading.Thread.Sleep(150);
return status;
}
}
}
}
+2 -2
View File
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2.0212.1702")]
[assembly: AssemblyFileVersion("1.2.0212.1702")]
[assembly: AssemblyVersion("1.2.0214.1848")]
[assembly: AssemblyFileVersion("1.2.0214.1848")]
@@ -1,10 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Quartz;
namespace Disco.Services.Tasks
{
}
+4 -1
View File
@@ -16,7 +16,7 @@ namespace Disco.Services.Tasks
private static object _RunningTasksLock = new object();
private static List<ScheduledTaskStatus> _RunningTasks = new List<ScheduledTaskStatus>();
public static void InitalizeScheduledTasks(DiscoDataContext dbContext, ISchedulerFactory SchedulerFactory)
public static void InitalizeScheduledTasks(DiscoDataContext dbContext, ISchedulerFactory SchedulerFactory, bool InitiallySchedule)
{
ScheduledTasksLog.LogInitializingScheduledTasks();
@@ -28,6 +28,8 @@ namespace Disco.Services.Tasks
// Scheduled Cleanup
ScheduledTaskCleanup.Schedule(_TaskScheduler);
if (InitiallySchedule)
{
// Discover DiscoScheduledTask
var appDomain = AppDomain.CurrentDomain;
@@ -49,6 +51,7 @@ namespace Disco.Services.Tasks
}
}
}
}
catch (Exception ex)
{
ScheduledTasksLog.LogInitializeException(ex);
@@ -124,6 +124,7 @@ namespace Disco.Web.Extensions.MvcExtensions.Bundles
cache.SetOmitVaryStar(true);
cache.SetExpires(DateTime.Now.AddYears(1));
cache.SetValidUntilExpires(true);
cache.SetMaxAge(TimeSpan.FromDays(365));
cache.SetLastModified(DateTime.Now);
cache.VaryByHeaders["User-Agent"] = true;
@@ -28,7 +28,7 @@ namespace Disco.Web.Extensions.MvcExtensions.Bundles
context.Response.Clear();
if (!string.IsNullOrEmpty(context.Request.Headers["If-Modified-Since"]))
context.Response.StatusCode = 0x130;
context.Response.StatusCode = 304;
else
this.RequestBundle.ProcessRequest(context);
}
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2.0212.1702")]
[assembly: AssemblyFileVersion("1.2.0212.1702")]
[assembly: AssemblyVersion("1.2.0214.1848")]
[assembly: AssemblyFileVersion("1.2.0214.1848")]
+25 -8
View File
@@ -49,18 +49,13 @@ namespace Disco.Web
Disco.Services.Plugins.Plugins.InitalizePlugins(dbContext);
// Initialize Scheduled Tasks
Disco.Services.Tasks.ScheduledTasks.InitalizeScheduledTasks(dbContext, DiscoApplication.SchedulerFactory);
Disco.Services.Tasks.ScheduledTasks.InitalizeScheduledTasks(dbContext, DiscoApplication.SchedulerFactory, true);
// Schedule Immediate Check for Update (if a new version was installed, never updated, last updated over 2 days ago)
var currentVersion = Disco.BI.Interop.Community.UpdateCheck.CurrentDiscoVersion();
if (dbContext.DiscoConfiguration.InstalledDatabaseVersion == null ||
dbContext.DiscoConfiguration.InstalledDatabaseVersion != currentVersion ||
dbContext.DiscoConfiguration.UpdateLastCheck == null ||
// Schedule Immediate Check for Update (if never updated, or last updated over 2 days ago)
if (dbContext.DiscoConfiguration.UpdateLastCheck == null ||
dbContext.DiscoConfiguration.UpdateLastCheck.ResponseTimestamp < DateTime.Now.AddDays(-2))
{
Disco.BI.Interop.Community.UpdateCheckTask.ScheduleNow();
dbContext.DiscoConfiguration.InstalledDatabaseVersion = currentVersion;
dbContext.SaveChanges();
}
// Setup Attachment Monitor
@@ -70,6 +65,28 @@ namespace Disco.Web
DiscoApplication.DocumentDropBoxMonitor.ScheduleCurrentFiles(10);
}
public static void InitializeUpdateEnvironment()
{
using (var dbContext = new DiscoDataContext())
{
// Initialize Logging
Disco.Services.Logging.LogContext.Initalize(dbContext, DiscoApplication.SchedulerFactory);
// Load Organisation Name
DiscoApplication.OrganisationName = dbContext.DiscoConfiguration.OrganisationName;
DiscoApplication.MultiSiteMode = dbContext.DiscoConfiguration.MultiSiteMode;
// Setup Global Proxy
DiscoApplication.SetGlobalProxy(dbContext.DiscoConfiguration.ProxyAddress,
dbContext.DiscoConfiguration.ProxyPort,
dbContext.DiscoConfiguration.ProxyUsername,
dbContext.DiscoConfiguration.ProxyPassword);
// Initialize Scheduled Tasks
Disco.Services.Tasks.ScheduledTasks.InitalizeScheduledTasks(dbContext, DiscoApplication.SchedulerFactory, true);
}
}
public static void DisposeEnvironment()
{
if (DiscoApplication.DocumentDropBoxMonitor != null)
+11
View File
@@ -68,5 +68,16 @@ namespace Disco.Web
namespaces: new string[] { "Disco.Web.Controllers" } // Controllers Namespace Only
);
}
public static void RegisterUpdateRoutes(RouteCollection routes)
{
// Update Route
routes.MapRoute(
name: "Update", // Route name
url: "{controller}/{action}/{id}", // URL with parameters
defaults: new { controller = "Update", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
namespaces: new string[] { "Disco.Web.Controllers" } // Controllers Namespace Only
);
}
}
}
@@ -4,8 +4,8 @@ using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Disco.BI.Interop.Community;
using Disco.Services.Plugins;
using Disco.Services.Plugins.CommunityInterop;
namespace Disco.Web.Areas.API.Controllers
{
@@ -20,6 +20,46 @@ namespace Disco.Web.Areas.API.Controllers
return RedirectToAction(MVC.Config.Logging.TaskStatus(status.SessionId));
}
public virtual ActionResult UpdateAll()
{
var status = UpdatePluginTask.UpdateAllPlugins();
return RedirectToAction(MVC.Config.Logging.TaskStatus(status.SessionId));
}
public virtual ActionResult Update(string PluginId)
{
if (string.IsNullOrEmpty(PluginId))
throw new ArgumentNullException("PluginId");
var status = UpdatePluginTask.UpdatePlugin(PluginId);
return RedirectToAction(MVC.Config.Logging.TaskStatus(status.SessionId));
}
public virtual ActionResult UpdateLocal(string PluginId, HttpPostedFileBase Plugin)
{
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(dbContext.DiscoConfiguration.PluginPackagesLocation, Path.GetFileName(Plugin.FileName));
if (!Directory.Exists(dbContext.DiscoConfiguration.PluginPackagesLocation))
Directory.CreateDirectory(dbContext.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));
}
public virtual ActionResult Uninstall(string id, bool UninstallData)
{
if (string.IsNullOrEmpty(id))
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Disco.Models.BI.Interop.Community;
using Disco.Services.Plugins;
using Disco.Services.Tasks;
using Disco.Web.Areas.Config.Models.Plugins;
@@ -16,7 +17,8 @@ namespace Disco.Web.Areas.Config.Controllers
{
Models.Plugins.IndexViewModel vm = new Models.Plugins.IndexViewModel()
{
PluginManifests = Plugins.GetPlugins()
PluginManifests = Plugins.GetPlugins(),
Catalogue = Plugins.LoadCatalogue(dbContext)
};
return View(vm);
}
@@ -72,9 +74,9 @@ namespace Disco.Web.Areas.Config.Controllers
var catalogue = Plugins.LoadCatalogue(dbContext);
if (catalogue == null || catalogue.ResponseTimestamp < DateTime.Now.AddMinutes(-15))
if (catalogue == null || catalogue.ResponseTimestamp < DateTime.Now.AddHours(-1))
{
// Need to Update Catalogue
// Need to Update Catalogue (over 1 hour old)
return RedirectToAction(MVC.API.Plugin.UpdateLibraryCatalogue());
}
else
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Disco.Models.BI.Interop.Community;
using Disco.Services.Plugins;
using Disco.Services.Plugins.Features.Other;
@@ -10,6 +11,28 @@ namespace Disco.Web.Areas.Config.Models.Plugins
public class IndexViewModel
{
public List<PluginManifest> PluginManifests { get; set; }
public PluginLibraryUpdateResponse Catalogue { get; set; }
private Dictionary<PluginManifest, PluginLibraryItem> _PluginUpdates;
public Dictionary<PluginManifest, PluginLibraryItem> PluginUpdates
{
get
{
if (_PluginUpdates == null)
{
if (Catalogue == null || Catalogue.Plugins == null || Catalogue.Plugins.Count == 0 ||
PluginManifests == null || PluginManifests.Count == 0)
{
_PluginUpdates = new Dictionary<PluginManifest, PluginLibraryItem>(); // No Updates
}
else
{
_PluginUpdates = PluginManifests.Join((IEnumerable<PluginLibraryItem>)Catalogue.Plugins, manifest => manifest.Id, update => update.Id, (manifest, update) => new Tuple<PluginManifest, PluginLibraryItem>(manifest, update)).Where(i => Version.Parse(i.Item2.LatestVersion) > i.Item1.Version).ToDictionary(i => i.Item1, i => i.Item2);
}
}
return _PluginUpdates;
}
}
public List<Tuple<Type, List<PluginManifest>>> PluginManifestsByType
{
@@ -6,17 +6,14 @@
}
<div style="min-height: 300px;">
<div id="scheduledTaskStatus" class="form" style="width: 520px;" data-bind="visible: Initialized">
<h2 data-bind="text: TaskName">
&nbsp;</h2>
<h2 data-bind="text: TaskName">&nbsp;</h2>
<table>
<tr data-bind="visible: IsRunning">
<th class="process" data-bind="text: CurrentProcess">
&nbsp;
<th class="process" data-bind="text: CurrentProcess">&nbsp;
</th>
</tr>
<tr data-bind="visible: IsRunning">
<td class="description" data-bind="text: CurrentDescription">
&nbsp;
<td class="description" data-bind="text: CurrentDescription">&nbsp;
</td>
</tr>
<tr data-bind="visible: IsRunning">
@@ -27,8 +24,7 @@
</tr>
<tr data-bind="visible: FinishedTimestamp">
<td class="finishedTimestamp">
<h3>
Finished: <span data-bind="text: FinishedTimestampFormatted"></span>
<h3>Finished: <span data-bind="text: FinishedTimestampFormatted"></span>
</h3>
</td>
</tr>
@@ -38,15 +34,13 @@
</td>
</tr>
<tr data-bind="visible: TaskExceptionMessage">
<td class="exception">
Last Error:
<td class="exception">Last Error:
<div class="code" data-bind="text: TaskExceptionMessage">
</div>
</td>
</tr>
<tr data-bind="visible: NextScheduledTimestamp">
<td class="nextScheduledTimestamp">
Next Scheduled: <span data-bind="text: NextScheduledTimestampFormatted"></span>
<td class="nextScheduledTimestamp">Next Scheduled: <span data-bind="text: NextScheduledTimestampFormatted"></span>
</td>
</tr>
</table>
@@ -188,6 +182,7 @@
return; // Have Newer Status Update
self.StatusVersion = taskStatus.StatusVersion;
if (taskStatus.ChangedProperties) {
for (var changedPropertyIndex = 0; changedPropertyIndex < taskStatus.ChangedProperties.length; changedPropertyIndex++) {
switch (taskStatus.ChangedProperties[changedPropertyIndex]) {
case 'Progress':
@@ -224,6 +219,7 @@
}
}
}
}
vm = new statusViewModel(sessionId);
ko.applyBindings(vm, view[0]);
@@ -68,7 +68,7 @@ WriteLiteral(">\r\n <h2");
WriteLiteral(" data-bind=\"text: TaskName\"");
WriteLiteral(">\r\n &nbsp;</h2>\r\n <table>\r\n <tr");
WriteLiteral(">&nbsp;</h2>\r\n <table>\r\n <tr");
WriteLiteral(" data-bind=\"visible: IsRunning\"");
@@ -78,8 +78,7 @@ WriteLiteral(" class=\"process\"");
WriteLiteral(" data-bind=\"text: CurrentProcess\"");
WriteLiteral(">\r\n &nbsp;\r\n </th>\r\n </tr>\r\n " +
" <tr");
WriteLiteral(">&nbsp;\r\n </th>\r\n </tr>\r\n <tr");
WriteLiteral(" data-bind=\"visible: IsRunning\"");
@@ -89,8 +88,7 @@ WriteLiteral(" class=\"description\"");
WriteLiteral(" data-bind=\"text: CurrentDescription\"");
WriteLiteral(">\r\n &nbsp;\r\n </td>\r\n </tr>\r\n " +
" <tr");
WriteLiteral(">&nbsp;\r\n </td>\r\n </tr>\r\n <tr");
WriteLiteral(" data-bind=\"visible: IsRunning\"");
@@ -111,7 +109,7 @@ WriteLiteral(">\r\n <td");
WriteLiteral(" class=\"finishedTimestamp\"");
WriteLiteral(">\r\n <h3>\r\n Finished: <span");
WriteLiteral(">\r\n <h3>Finished: <span");
WriteLiteral(" data-bind=\"text: FinishedTimestampFormatted\"");
@@ -138,7 +136,7 @@ WriteLiteral(">\r\n <td");
WriteLiteral(" class=\"exception\"");
WriteLiteral(">\r\n Last Error:\r\n <div");
WriteLiteral(">Last Error:\r\n <div");
WriteLiteral(" class=\"code\"");
@@ -153,7 +151,7 @@ WriteLiteral(">\r\n <td");
WriteLiteral(" class=\"nextScheduledTimestamp\"");
WriteLiteral(">\r\n Next Scheduled: <span");
WriteLiteral(">Next Scheduled: <span");
WriteLiteral(" data-bind=\"text: NextScheduledTimestampFormatted\"");
@@ -189,7 +187,7 @@ WriteLiteral(" type=\"text/javascript\"");
WriteLiteral(">\r\n $(function () {\r\n var sessionId = \'");
#line 99 "..\..\Areas\Config\Views\Logging\TaskStatus.cshtml"
#line 93 "..\..\Areas\Config\Views\Logging\TaskStatus.cshtml"
Write(Model.SessionId);
@@ -198,7 +196,7 @@ WriteLiteral(">\r\n $(function () {\r\n var sessionId = \'");
WriteLiteral("\';\r\n var sessionStatusUrl = \'");
#line 100 "..\..\Areas\Config\Views\Logging\TaskStatus.cshtml"
#line 94 "..\..\Areas\Config\Views\Logging\TaskStatus.cshtml"
Write(Url.Action(MVC.API.Logging.ScheduledTaskStatus(Model.SessionId)));
@@ -251,42 +249,44 @@ WriteLiteral("\';\r\n\r\n var view = $(\'#scheduledTaskStatus\');\r\n
" return self.Initialize(taskStatus);\r\n\r\n if (taskStatus.Statu" +
"sVersion < self.StatusVersion)\r\n return; // Have Newer Status" +
" Update\r\n self.StatusVersion = taskStatus.StatusVersion;\r\n\r\n " +
" for (var changedPropertyIndex = 0; changedPropertyIndex < taskStatus." +
"ChangedProperties.length; changedPropertyIndex++) {\r\n switch " +
"(taskStatus.ChangedProperties[changedPropertyIndex]) {\r\n " +
"case \'Progress\':\r\n self.Progress(taskStatus.Progress)" +
";\r\n break;\r\n case \'CurrentProc" +
"ess\':\r\n self.CurrentProcess(taskStatus.CurrentProcess" +
");\r\n break;\r\n case \'CurrentDes" +
"cription\':\r\n self.CurrentDescription(taskStatus.Curre" +
"ntDescription);\r\n break;\r\n cas" +
"e \'IsRunning\':\r\n self.IsRunning(taskStatus.IsRunning)" +
";\r\n break;\r\n case \'TaskExcepti" +
"on\':\r\n self.TaskExceptionMessage(taskStatus.TaskExcep" +
"tionMessage);\r\n break;\r\n case " +
"\'NextScheduledTimestamp\':\r\n self.NextScheduledTimesta" +
"mp(taskStatus.NextScheduledTimestamp);\r\n break;\r\n " +
" case \'FinishedUrl\':\r\n self.Finish" +
"edUrl(taskStatus.FinishedUrl);\r\n break;\r\n " +
" case \'FinishedMessage\':\r\n self.FinishedMe" +
"ssage(taskStatus.FinishedMessage);\r\n break;\r\n " +
" case \'FinishedTimestamp\':\r\n self.Fini" +
"shedTimestamp(taskStatus.FinishedTimestamp);\r\n window" +
".setTimeout(self.Finished, 1);\r\n break;\r\n " +
" default:\r\n // Ignore\r\n " +
" }\r\n }\r\n }\r\n }\r\n\r\n vm = new statusViewMo" +
"del(sessionId);\r\n ko.applyBindings(vm, view[0]);\r\n\r\n // Start Live" +
" Connection\r\n updateWithLive();\r\n\r\n function updateWithAjax(onSucc" +
"ess) {\r\n $.ajax({\r\n url: sessionStatusUrl,\r\n " +
" dataType: \'json\',\r\n type: \'POST\',\r\n traditio" +
"nal: true,\r\n success: update_Received,\r\n error: fu" +
"nction (jqXHR, textStatus, errorThrown) {\r\n alert(\'Unable to " +
"load Session: \' + errorThrown);\r\n }\r\n });\r\n }\r\n" +
" function updateWithLive() {\r\n liveConnection = $.connection(\'" +
"");
" if (taskStatus.ChangedProperties) {\r\n for (var cha" +
"ngedPropertyIndex = 0; changedPropertyIndex < taskStatus.ChangedProperties.lengt" +
"h; changedPropertyIndex++) {\r\n switch (taskStatus.Changed" +
"Properties[changedPropertyIndex]) {\r\n case \'Progress\'" +
":\r\n self.Progress(taskStatus.Progress);\r\n " +
" break;\r\n case \'CurrentProcess" +
"\':\r\n self.CurrentProcess(taskStatus.CurrentProces" +
"s);\r\n break;\r\n case \'C" +
"urrentDescription\':\r\n self.CurrentDescription(tas" +
"kStatus.CurrentDescription);\r\n break;\r\n " +
" case \'IsRunning\':\r\n self.IsRunn" +
"ing(taskStatus.IsRunning);\r\n break;\r\n " +
" case \'TaskException\':\r\n self.Task" +
"ExceptionMessage(taskStatus.TaskExceptionMessage);\r\n " +
" break;\r\n case \'NextScheduledTimestamp\':\r\n " +
" self.NextScheduledTimestamp(taskStatus.NextScheduledTime" +
"stamp);\r\n break;\r\n cas" +
"e \'FinishedUrl\':\r\n self.FinishedUrl(taskStatus.Fi" +
"nishedUrl);\r\n break;\r\n " +
" case \'FinishedMessage\':\r\n self.FinishedMessage(t" +
"askStatus.FinishedMessage);\r\n break;\r\n " +
" case \'FinishedTimestamp\':\r\n self" +
".FinishedTimestamp(taskStatus.FinishedTimestamp);\r\n " +
" window.setTimeout(self.Finished, 1);\r\n break;\r" +
"\n default:\r\n // Ignore" +
"\r\n }\r\n }\r\n }\r\n " +
" }\r\n }\r\n\r\n vm = new statusViewModel(sessionId);\r\n ko.appl" +
"yBindings(vm, view[0]);\r\n\r\n // Start Live Connection\r\n updateWithL" +
"ive();\r\n\r\n function updateWithAjax(onSuccess) {\r\n $.ajax({\r\n " +
" url: sessionStatusUrl,\r\n dataType: \'json\',\r\n " +
" type: \'POST\',\r\n traditional: true,\r\n succ" +
"ess: update_Received,\r\n error: function (jqXHR, textStatus, error" +
"Thrown) {\r\n alert(\'Unable to load Session: \' + errorThrown);\r" +
"\n }\r\n });\r\n }\r\n function updateWithLive(" +
") {\r\n liveConnection = $.connection(\'");
#line 247 "..\..\Areas\Config\Views\Logging\TaskStatus.cshtml"
#line 243 "..\..\Areas\Config\Views\Logging\TaskStatus.cshtml"
Write(Url.Content("~/API/Logging/TaskStatusNotifications"));
@@ -151,6 +151,23 @@
});
});
</script>
if (Model.PluginUpdates.Count > 0)
{
<div id="updateAvailableContainer">
<div>@(Model.PluginUpdates.Count) plugin update@(Model.PluginUpdates.Count == 1 ? " is" : "s are") available</div>
@Html.ActionLinkButton("Update Now", MVC.API.Plugin.UpdateAll())
</div>
<script>
(function () {
$(function () {
var layout_PageHeading = $('#layout_PageHeading').height(80);
var updateAvailableContainer = $('#updateAvailableContainer');
updateAvailableContainer.appendTo(layout_PageHeading);
});
})();
</script>
}
}
}
</div>
@@ -365,51 +365,110 @@ WriteLiteral(" <script>\r\n $(function () {\r\n
#line default
#line hidden
WriteLiteral("/\';\r\n var uninstallPlugin, uninstallPluginData, $dialogConfirm, uninst" +
"allPluginConfirm, uninstallPluginDataConfirm;\r\n\r\n var pluginId, plugi" +
"nName, pluginUninstallData;\r\n\r\n var $dialog = $(\'#dialogUninstallPlug" +
"ins\').dialog({\r\n resizable: false,\r\n modal: true,\r" +
"\n width: 350,\r\n autoOpen: false,\r\n " +
"buttons: {\r\n \"Uninstall\": function () {\r\n " +
" pluginId = uninstallPlugin.val();\r\n pluginName = unin" +
"stallPlugin.find(\'option:selected\').text();\r\n pluginUnins" +
"tallData = uninstallPluginData.is(\':checked\');\r\n\r\n if (!p" +
"luginId) {\r\n alert(\'Select a plugin to uninstall\');\r\n" +
" } else {\r\n uninstallPluginCon" +
"firm.text(pluginName + \' [\' + pluginId + \']\');\r\n if (" +
"pluginUninstallData)\r\n uninstallPluginDataConfirm" +
".show();\r\n else\r\n unin" +
"stallPluginDataConfirm.hide();\r\n\r\n $dialogConfirm.dia" +
"log(\'open\');\r\n $(this).dialog(\"close\");\r\n " +
" }\r\n },\r\n Cancel: function () {" +
"\r\n uninstallPluginData.removeAttr(\'checked\');\r\n " +
" $(\'#uninstallPluginDataAlert\').hide();\r\n $(" +
"this).dialog(\"close\");\r\n }\r\n }\r\n })" +
";\r\n\r\n $dialogConfirm = $(\'#dialogUninstallPluginConfirm\').dialog({\r\n " +
" resizable: false,\r\n modal: true,\r\n " +
"width: 350,\r\n autoOpen: false,\r\n buttons: {\r\n " +
" \"Confirm Uninstall\": function () {\r\n var u" +
"rl = uninstallUrl + pluginId;\r\n if (pluginUninstallData)\r" +
WriteLiteral("/\';\r\n var uninstallPlugin, uninstallPluginData, $dialogConfirm, un" +
"installPluginConfirm, uninstallPluginDataConfirm;\r\n\r\n var pluginI" +
"d, pluginName, pluginUninstallData;\r\n\r\n var $dialog = $(\'#dialogU" +
"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 " +
" pluginName = uninstallPlugin.find(\'option:selected\')." +
"text();\r\n pluginUninstallData = uninstallPluginData.i" +
"s(\':checked\');\r\n\r\n if (!pluginId) {\r\n " +
" alert(\'Select a plugin to uninstall\');\r\n " +
" } else {\r\n uninstallPluginConfirm.text(plugin" +
"Name + \' [\' + pluginId + \']\');\r\n if (pluginUninst" +
"allData)\r\n uninstallPluginDataConfirm.show();" +
"\r\n else\r\n unin" +
"stallPluginDataConfirm.hide();\r\n\r\n $dialogConfirm" +
".dialog(\'open\');\r\n $(this).dialog(\"close\");\r\n " +
" }\r\n },\r\n C" +
"ancel: function () {\r\n uninstallPluginData.removeAttr" +
"(\'checked\');\r\n $(\'#uninstallPluginDataAlert\').hide();" +
"\r\n $(this).dialog(\"close\");\r\n " +
"}\r\n }\r\n });\r\n\r\n $dialogConfirm " +
"= $(\'#dialogUninstallPluginConfirm\').dialog({\r\n resizable: fa" +
"lse,\r\n modal: true,\r\n width: 350,\r\n " +
" autoOpen: false,\r\n buttons: {\r\n " +
" \"Confirm Uninstall\": function () {\r\n var url =" +
" uninstallUrl + pluginId;\r\n if (pluginUninstallData)\r" +
"\n url += \'?UninstallData=true\'\r\n " +
" else\r\n url += \'?UninstallData=false\'\r\n\r\n " +
" window.location.href = url;\r\n $(this).dialo" +
"g(\"disable\");\r\n },\r\n Cancel: function () {" +
"\r\n uninstallPluginData.removeAttr(\'checked\');\r\n " +
" $(\'#uninstallPluginDataAlert\').hide();\r\n $(" +
"this).dialog(\"close\");\r\n }\r\n }\r\n })" +
";\r\n\r\n uninstallPlugin = $(\'#uninstallPlugin\');\r\n uninstall" +
"PluginData = $(\'#uninstallPluginData\');\r\n uninstallPluginConfirm = $(" +
"\'#uninstallPluginConfirm\');\r\n uninstallPluginDataConfirm = $(\'#uninst" +
"allPluginDataConfirm\');\r\n\r\n $(\'#buttonUninstall\').click(function () {" +
"\r\n $dialog.dialog(\'open\');\r\n return false;\r\n " +
" });\r\n\r\n $(\'#uninstallPluginData\').change(function () {\r\n " +
" if ($(this).is(\':checked\')) {\r\n $(\'#uninstallPluginD" +
"ataAlert\').slideDown();\r\n } else {\r\n $(\'#unins" +
"tallPluginDataAlert\').slideUp();\r\n }\r\n });\r\n })" +
";\r\n </script>\r\n");
" else\r\n url += \'?UninstallData=false\'\r\n" +
"\r\n window.location.href = url;\r\n " +
" $(this).dialog(\"disable\");\r\n },\r\n " +
" Cancel: function () {\r\n uninstallPluginData.re" +
"moveAttr(\'checked\');\r\n $(\'#uninstallPluginDataAlert\')" +
".hide();\r\n $(this).dialog(\"close\");\r\n " +
" }\r\n }\r\n });\r\n\r\n uninsta" +
"llPlugin = $(\'#uninstallPlugin\');\r\n uninstallPluginData = $(\'#uni" +
"nstallPluginData\');\r\n uninstallPluginConfirm = $(\'#uninstallPlugi" +
"nConfirm\');\r\n uninstallPluginDataConfirm = $(\'#uninstallPluginDat" +
"aConfirm\');\r\n\r\n $(\'#buttonUninstall\').click(function () {\r\n " +
" $dialog.dialog(\'open\');\r\n return false;\r\n " +
" });\r\n\r\n $(\'#uninstallPluginData\').change(function () {\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 154 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
if (Model.PluginUpdates.Count > 0)
{
#line default
#line hidden
WriteLiteral(" <div");
WriteLiteral(" id=\"updateAvailableContainer\"");
WriteLiteral(">\r\n <div>");
#line 158 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
Write(Model.PluginUpdates.Count);
#line default
#line hidden
WriteLiteral(" plugin update");
#line 158 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
Write(Model.PluginUpdates.Count == 1 ? " is" : "s are");
#line default
#line hidden
WriteLiteral(" available</div>\r\n");
WriteLiteral(" ");
#line 159 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
Write(Html.ActionLinkButton("Update Now", MVC.API.Plugin.UpdateAll()));
#line default
#line hidden
WriteLiteral("\r\n </div>\r\n");
WriteLiteral(@" <script>
(function () {
$(function () {
var layout_PageHeading = $('#layout_PageHeading').height(80);
var updateAvailableContainer = $('#updateAvailableContainer');
updateAvailableContainer.appendTo(layout_PageHeading);
});
})();
</script>
");
#line 170 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
}
}
@@ -422,13 +481,13 @@ WriteLiteral(" class=\"actionBar\"");
WriteLiteral(">\r\n");
#line 158 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
#line 175 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
#line default
#line hidden
#line 158 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
#line 175 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
if (Model.PluginManifests.Count > 0)
{
@@ -436,14 +495,14 @@ WriteLiteral(">\r\n");
#line default
#line hidden
#line 160 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
#line 177 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
Write(Html.ActionLinkButton("Uninstall Plugins", MVC.Config.Plugins.Index(), "buttonUninstall"));
#line default
#line hidden
#line 160 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
#line 177 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
}
@@ -453,7 +512,7 @@ WriteLiteral(">\r\n");
WriteLiteral(" ");
#line 162 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
#line 179 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
Write(Html.ActionLinkButton("Install Plugins", MVC.Config.Plugins.Install()));
@@ -28,10 +28,19 @@
{
var plugin = plugins[itemNextId];
itemNextId++;
<div class="pageMenuArea pluginItem@(Plugins.PluginInstalled(plugin.Id) ? " pluginInstalled" : string.Empty)">
<a class="pluginInstallLink" href="@(Url.Action(MVC.API.Plugin.Install(plugin.Id)))">
<h2 class="pluginName">@plugin.Name</h2>
</a>
var installedPlugin = Plugins.PluginInstalled(plugin.Id) ? Plugins.GetPlugin(plugin.Id) : null;
<div class="pageMenuArea pluginItem@(installedPlugin != null ? " pluginInstalled" : string.Empty)">
<h2 class="pluginName">@plugin.Name
@if (installedPlugin == null){
<a class="pluginInstallLink button" href="@(Url.Action(MVC.API.Plugin.Install(plugin.Id)))">Install</a>
}else{
if (Version.Parse(plugin.LatestVersion) > installedPlugin.Version){
<a class="pluginUpdateLink button" href="@(Url.Action(MVC.API.Plugin.Update(plugin.Id)))">Update</a>
}else{
<a class="pluginInstalledLink button disabled" href="#">Installed</a>
}
}
</h2>
<div class="pluginItemBlurb">@(new HtmlString(plugin.Blurb))</div>
<div class="pageMenuBlurb">
<span class="pluginId">@plugin.Id</span> | <span class="pluginVersion">v@(plugin.LatestVersion)</span> | @plugin.Author | <a href="@plugin.Url" target="_blank">More Information</a>
@@ -100,14 +109,26 @@
$selectedPlugin = $this.closest('.pluginItem');
$selectedPluginUrl = $this.attr('href');
if ($selectedPlugin.is('.pluginInstalled')) {
alert('This plugin is already installed.');
} else {
$('#dialogInstallPluginName').text($selectedPlugin.find('.pluginName').text());
$('#dialogInstallPluginDetails').text($selectedPlugin.find('.pluginId').text() + ' | ' + $selectedPlugin.find('.pluginVersion').text());
$dialogInstall.dialog('option', 'title', 'Install this Plugin?');
$dialogInstall.dialog('open');
}
return false;
});
$('#pageMenu').find('a.pluginUpdateLink').click(function () {
$this = $(this);
$selectedPlugin = $this.closest('.pluginItem');
$selectedPluginUrl = $this.attr('href');
$('#dialogInstallPluginName').text($selectedPlugin.find('.pluginName').text());
$('#dialogInstallPluginDetails').text($selectedPlugin.find('.pluginId').text() + ' | ' + $selectedPlugin.find('.pluginVersion').text());
$dialogInstall.dialog('option', 'title', 'Update this Plugin?');
$dialogInstall.dialog('open');
return false;
});
@@ -147,36 +147,23 @@ WriteLiteral(" <td>\r\n");
{
var plugin = plugins[itemNextId];
itemNextId++;
var installedPlugin = Plugins.PluginInstalled(plugin.Id) ? Plugins.GetPlugin(plugin.Id) : null;
#line default
#line hidden
WriteLiteral(" <div");
WriteAttribute("class", Tuple.Create(" class=\"", 1328), Tuple.Create("\"", 1432)
, Tuple.Create(Tuple.Create("", 1336), Tuple.Create("pageMenuArea", 1336), true)
, Tuple.Create(Tuple.Create(" ", 1348), Tuple.Create("pluginItem", 1349), true)
#line 31 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
, Tuple.Create(Tuple.Create("", 1359), Tuple.Create<System.Object, System.Int32>(Plugins.PluginInstalled(plugin.Id) ? " pluginInstalled" : string.Empty
#line default
#line hidden
, 1359), false)
);
WriteLiteral(">\r\n <a");
WriteLiteral(" class=\"pluginInstallLink\"");
WriteAttribute("href", Tuple.Create(" href=\"", 1496), Tuple.Create("\"", 1551)
WriteAttribute("class", Tuple.Create(" class=\"", 1449), Tuple.Create("\"", 1542)
, Tuple.Create(Tuple.Create("", 1457), Tuple.Create("pageMenuArea", 1457), true)
, Tuple.Create(Tuple.Create(" ", 1469), Tuple.Create("pluginItem", 1470), true)
#line 32 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
, Tuple.Create(Tuple.Create("", 1503), Tuple.Create<System.Object, System.Int32>(Url.Action(MVC.API.Plugin.Install(plugin.Id))
, Tuple.Create(Tuple.Create("", 1480), Tuple.Create<System.Object, System.Int32>(installedPlugin != null ? " pluginInstalled" : string.Empty
#line default
#line hidden
, 1503), false)
, 1480), false)
);
WriteLiteral(">\r\n <h2");
@@ -192,15 +179,92 @@ WriteLiteral(">");
#line default
#line hidden
WriteLiteral("</h2>\r\n </a>\r\n <div" +
"");
WriteLiteral("\r\n");
#line 34 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
#line default
#line hidden
#line 34 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
if (installedPlugin == null){
#line default
#line hidden
WriteLiteral(" <a");
WriteLiteral(" class=\"pluginInstallLink button\"");
WriteAttribute("href", Tuple.Create(" href=\"", 1754), Tuple.Create("\"", 1809)
#line 35 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
, Tuple.Create(Tuple.Create("", 1761), Tuple.Create<System.Object, System.Int32>(Url.Action(MVC.API.Plugin.Install(plugin.Id))
#line default
#line hidden
, 1761), false)
);
WriteLiteral(">Install</a>\r\n");
#line 36 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
}else{
if (Version.Parse(plugin.LatestVersion) > installedPlugin.Version){
#line default
#line hidden
WriteLiteral(" <a");
WriteLiteral(" class=\"pluginUpdateLink button\"");
WriteAttribute("href", Tuple.Create(" href=\"", 2047), Tuple.Create("\"", 2101)
#line 38 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
, Tuple.Create(Tuple.Create("", 2054), Tuple.Create<System.Object, System.Int32>(Url.Action(MVC.API.Plugin.Update(plugin.Id))
#line default
#line hidden
, 2054), false)
);
WriteLiteral(">Update</a> \r\n");
#line 39 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
}else{
#line default
#line hidden
WriteLiteral(" <a");
WriteLiteral(" class=\"pluginInstalledLink button disabled\"");
WriteLiteral(" href=\"#\"");
WriteLiteral(">Installed</a> \r\n");
#line 41 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
}
}
#line default
#line hidden
WriteLiteral(" </h2>\r\n <div");
WriteLiteral(" class=\"pluginItemBlurb\"");
WriteLiteral(">");
#line 35 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
#line 44 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
Write(new HtmlString(plugin.Blurb));
@@ -217,7 +281,7 @@ WriteLiteral(" class=\"pluginId\"");
WriteLiteral(">");
#line 37 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
#line 46 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
Write(plugin.Id);
@@ -230,7 +294,7 @@ WriteLiteral(" class=\"pluginVersion\"");
WriteLiteral(">v");
#line 37 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
#line 46 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
Write(plugin.LatestVersion);
@@ -239,7 +303,7 @@ WriteLiteral(">v");
WriteLiteral("</span> | ");
#line 37 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
#line 46 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
Write(plugin.Author);
@@ -247,14 +311,14 @@ WriteLiteral("</span> | ");
#line hidden
WriteLiteral(" | <a");
WriteAttribute("href", Tuple.Create(" href=\"", 1992), Tuple.Create("\"", 2010)
WriteAttribute("href", Tuple.Create(" href=\"", 2716), Tuple.Create("\"", 2734)
#line 37 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
, Tuple.Create(Tuple.Create("", 1999), Tuple.Create<System.Object, System.Int32>(plugin.Url
#line 46 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
, Tuple.Create(Tuple.Create("", 2723), Tuple.Create<System.Object, System.Int32>(plugin.Url
#line default
#line hidden
, 1999), false)
, 2723), false)
);
WriteLiteral(" target=\"_blank\"");
@@ -263,7 +327,7 @@ WriteLiteral(">More Information</a>\r\n </div>\r\
" </div>\r\n");
#line 40 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
#line 49 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
}
@@ -272,7 +336,7 @@ WriteLiteral(">More Information</a>\r\n </div>\r\
WriteLiteral("\r\n </td>\r\n");
#line 43 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
#line 52 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
}
@@ -281,7 +345,7 @@ WriteLiteral("\r\n </td>\r\n");
WriteLiteral(" </tr>\r\n </table>\r\n");
#line 46 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
#line 55 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
}
@@ -328,13 +392,13 @@ WriteLiteral(" style=\"padding-bottom: 10px;\"");
WriteLiteral(">\r\n");
#line 59 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
#line 68 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
#line default
#line hidden
#line 59 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
#line 68 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
using (Html.BeginForm(MVC.API.Plugin.InstallLocal(), FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@@ -358,7 +422,7 @@ WriteLiteral(" type=\"file\"");
WriteLiteral(" />\r\n");
#line 63 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
#line 72 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
}
@@ -391,25 +455,32 @@ WriteLiteral("></span>Warning: All plugins run with the same level of network pr
" $(this).dialog(\"close\");\r\n }\r\n }\r\n }" +
");\r\n $(\'#pageMenu\').find(\'a.pluginInstallLink\').click(function () {\r\n " +
" $this = $(this);\r\n\r\n $selectedPlugin = $this.closest(\'.plugin" +
"Item\');\r\n $selectedPluginUrl = $this.attr(\'href\');\r\n\r\n if " +
"($selectedPlugin.is(\'.pluginInstalled\')) {\r\n alert(\'This plugin i" +
"s already installed.\');\r\n } else {\r\n $(\'#dialogInstall" +
"PluginName\').text($selectedPlugin.find(\'.pluginName\').text());\r\n " +
"Item\');\r\n $selectedPluginUrl = $this.attr(\'href\');\r\n\r\n $(\'" +
"#dialogInstallPluginName\').text($selectedPlugin.find(\'.pluginName\').text());\r\n " +
" $(\'#dialogInstallPluginDetails\').text($selectedPlugin.find(\'.pluginId\'" +
").text() + \' | \' + $selectedPlugin.find(\'.pluginVersion\').text());\r\n\r\n " +
" $dialogInstall.dialog(\'option\', \'title\', \'Install this Plugin?\');\r\n " +
" $dialogInstall.dialog(\'open\');\r\n\r\n return false;\r\n });\r\n " +
" $(\'#pageMenu\').find(\'a.pluginUpdateLink\').click(function () {\r\n $t" +
"his = $(this);\r\n\r\n $selectedPlugin = $this.closest(\'.pluginItem\');\r\n " +
" $selectedPluginUrl = $this.attr(\'href\');\r\n\r\n $(\'#dialogIns" +
"tallPluginName\').text($selectedPlugin.find(\'.pluginName\').text());\r\n " +
"$(\'#dialogInstallPluginDetails\').text($selectedPlugin.find(\'.pluginId\').text() +" +
" \' | \' + $selectedPlugin.find(\'.pluginVersion\').text());\r\n\r\n $dia" +
"logInstall.dialog(\'open\');\r\n }\r\n return false;\r\n })" +
";\r\n\r\n // Upload\r\n var $dialogUpload = $(\'#dialogUploadPlugin\').dia" +
"log({\r\n resizable: false,\r\n modal: true,\r\n widt" +
"h: 350,\r\n autoOpen: false,\r\n buttons: {\r\n \"" +
"Upload & Install\": function () {\r\n var pluginFile = $(\'#plugi" +
"nFile\');\r\n if (pluginFile.val()) {\r\n p" +
"luginFile.closest(\'form\').submit();\r\n $(this).dialog(\'dis" +
"able\');\r\n } else {\r\n alert(\'Choose a P" +
"lugin Package to Upload\');\r\n }\r\n },\r\n " +
" Cancel: function () {\r\n $(this).dialog(\"close\");\r\n " +
" }\r\n }\r\n });\r\n $(\'#buttonUpload\').click(func" +
"tion () {\r\n $dialogUpload.dialog(\'open\');\r\n return false;\r" +
"\n });\r\n });\r\n</script>\r\n<div");
" \' | \' + $selectedPlugin.find(\'.pluginVersion\').text());\r\n\r\n $dialogI" +
"nstall.dialog(\'option\', \'title\', \'Update this Plugin?\');\r\n $dialogIns" +
"tall.dialog(\'open\');\r\n\r\n return false;\r\n });\r\n\r\n // Upl" +
"oad\r\n var $dialogUpload = $(\'#dialogUploadPlugin\').dialog({\r\n " +
"resizable: false,\r\n modal: true,\r\n width: 350,\r\n " +
" autoOpen: false,\r\n buttons: {\r\n \"Upload & Install\": " +
"function () {\r\n var pluginFile = $(\'#pluginFile\');\r\n " +
" if (pluginFile.val()) {\r\n pluginFile.closest(\'" +
"form\').submit();\r\n $(this).dialog(\'disable\');\r\n " +
" } else {\r\n alert(\'Choose a Plugin Package to Up" +
"load\');\r\n }\r\n },\r\n Cancel: func" +
"tion () {\r\n $(this).dialog(\"close\");\r\n }\r\n " +
" }\r\n });\r\n $(\'#buttonUpload\').click(function () {\r\n " +
" $dialogUpload.dialog(\'open\');\r\n return false;\r\n });\r\n }" +
");\r\n</script>\r\n<div");
WriteLiteral(" class=\"actionBar\"");
@@ -418,7 +489,7 @@ WriteLiteral(">\r\n");
WriteLiteral(" ");
#line 142 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
#line 163 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
Write(Html.ActionLinkButton("Update Catalogue", MVC.API.Plugin.UpdateLibraryCatalogue()));
@@ -429,7 +500,7 @@ WriteLiteral("\r\n");
WriteLiteral(" ");
#line 143 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
#line 164 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
Write(Html.ActionLinkButton("Install Plugin Package", MVC.API.Plugin.InstallLocal(), "buttonUpload"));
+5 -4
View File
@@ -906,6 +906,7 @@ a:active {
color: #335a87;
}
a.button {
display: inline-block;
padding: 4px 10px;
margin: 2px;
border: 1px solid #875a33;
@@ -914,11 +915,11 @@ a.button {
font-weight: bold;
text-transform: uppercase;
cursor: pointer;
line-height: 2.2em;
white-space: nowrap;
text-decoration: none;
}
a.button[disabled] {
a.button[disabled],
a.button.disabled {
background: #9e9e9e;
border: 1px solid #696969;
cursor: default;
@@ -1357,7 +1358,8 @@ input[type="submit"] {
padding: 5px;
}
input[type="submit"].button {
padding: 4px 10px;
font-size: 12px;
padding: 6px 10px 4px 10px;
margin: 2px;
border: 1px solid #875a33;
background: #db761d;
@@ -1365,7 +1367,6 @@ input[type="submit"].button {
font-weight: bold;
text-transform: uppercase;
cursor: pointer;
line-height: 1.2em;
}
input[type="submit"].button:hover {
border: 1px solid #696969;
+1 -1
View File
@@ -1 +1 @@
.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{zoom:1}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:absolute;top:0;left:0;width:100%;height:100%}.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAABkCAYAAABHLFpgAAAAIUlEQVQYlWP48ePHfyYGBgaGIUT8//8fO5cSFn6J4UQAAJSgIpAFCJPdAAAAAElFTkSuQmCC) 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url(data:image/png;base64,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) 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-Line truncated
.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{zoom:1}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:absolute;top:0;left:0;width:100%;height:100%}.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAABkCAYAAABHLFpgAAAAIUlEQVQYlWP48ePHfyYGBgaGIUT8//8fO5cSFn6J4UQAAJSgIpAFCJPdAAAAAElFTkSuQmCC) 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url(data:image/png;base64,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) 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-Line truncated
+17 -24
View File
@@ -81,15 +81,18 @@
float: right;
border: 1px dashed #ddd;
background-color: #fff;
line-height: 1.5em;
font-size: 0.6em;
padding: 4px 4px 4px 70px;
line-height: 1em;
padding: 4px 10px 4px 70px;
text-align: right;
height: 64px;
background-image: url(data:image/png;base64,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 truncated
background-position: 10px center;
background-repeat: no-repeat;
}
#updateAvailableContainer a.button {
margin-top: 16px;
}
#expressionEditor #expressionEditorExceptionContainer {
display: none;
border: 1px dashed #FF9696;
@@ -728,15 +731,16 @@ div.logEventsViewport table.logEventsViewport > tbody > tr > td.eventType {
#plugins .pageMenuArea a > h3:hover {
color: #4f81bd;
}
#plugins #pageMenu td .pageMenuArea > a {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB90CDRcZMTlpMjsAAAKbSURBVDjLbZHBS2NHHMc/82ZeXpLaiNJHDylF6KEIGxFa0Jtdi4IFqfQq2P/As4f9D0rwplIwsDlZiofHStaTVQJCj+6a9SpKL3HhkTx5cZLMTA9uHov4Pf2Y33w/fL8z4vj4mHfv3vNUHz60ouXl5VmtNScnJ3eVmZkfn96ZqVRQj6P7HXj56VwAFAqFsenp6W+73S7NZjMRUH/iPwVqnwC8nJ2drU9NTb3I5XIDpVS6u7v7qlQqEQQBxWLxq83NzX+EEIUkSYJ8Pj+xs7Pz0+cAyuXyTqPR+F5KiTEGrTVCCHzfR2v99d7eXg3AGMPGxsZb4CPwWEEIAUC73ebm5gYhBKVSiTiOcc4RBAHn5+dYa9Fas76+nvXIEvi+jzEG5xyrq6vEcczV1RW+77O2tka73WZ/f58wDHHOZQBvNEgp6ff7hGHI4eEhSinOzs64uLjg+vqaWq3GYDBASom19vkEWmuMMYyPjxNFEUtLS1hrOTg4wBiD53k4554HeJ6H1pp+v59VaTQaWGuRUqKUYjAYADwPcM6Rpim9Xg9jDFJKgiBASokQAuccDw8P5PP5ZwHOOUe1WsU5hxACz/Oy3xlplCZJkmw3Apw2m81fx8bGEEJkFay12YuPDMPhkDiOvwP+/gwgXhtjTq21Yb/fTyuVysPt7e3PW1tbf/q+T7Va/U0p9b7VahW11vlOp3Pt53JtAOI4RimFUgohRG5+fv6Po6Ojf7e3twcLCwtucXHR1ev1NIqiN3Nzc6+klEUpJVJK7u/vEXEcE4YhgJBSfjE5OfnDysrKX4VC4ctSqdQCXKfTedHr9T5GUfRLmqb/DYfDBDB3d3ePgJGSJOHy8pJOt4vneQS5HABaa6xzfFMuUy6XmZiYyDz/AxHBRmZKLqH0AAAAAElFTkSuQmCC) /*Images/Actions/pluginDownloadIcon16.png*/;
}
#plugins #pageMenu td .pageMenuArea > a:hover {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC4klEQVQ4jWWRTWhcVRTHf/fd+958JJMw+aDFaYNUtChNTDHYFBdNm4K0IEI3lW7ErZR2IWhKi0tba6gBMRAXhaYiiJskjRgENWlVEC3VJrGFgpaIaetMM515kzfzvu51kZmhxrM6i3N+nN//iLm5OW7eXGRznXfHpg8eGui/zwqLs4X8O9kTA5tn+np7UfX+dWB/vRcAyXSidXDHSz23dIrbqugCk5v254GLDcD+/v7dkzue3L4rpdJhlAi8qanZM52ZTp4xz5FN3u46efLN7xyTSJUqawk72ZL9eHx86HEAT+S2jU98fXenUAoT2sj1LSAiElKh11u3vDuxfNGXNVS0zsixga+AAlBXEGCwuPUwxa/l4ygrINWeYdW9x0rLHYK2R0z8+Qpx1EX64QHePrq76aEa0sqWRJHGijO8+Fobzqrk+z+uUWor0PeGQ3l1Owvvu2x19qGN3ggKsBokqRTVMKAnMcrVS6vca8/z48K3/H7jNx7cCVk4l0YXziNUhNGmeUETYCuFF2jKtQpdfMQvl6s8/fyz9HTs5OfxNXTpLVA+xoDWuvGs5huRlqTqx1RCTRz7BOWzXP9sFGMewPoEMuUTBxag6wD+C8Bo3GrEWk0QaMC2SIjTWEoiOkOMsfGqGidZxfwfIIw2mm/eO4g2gBBYlkCIRsQbzlqDY2mi8v2GQfOC+R+uXX01lWlHCIsojqDuqo0BDJbYiCsKA0rFwlPAF48DLsVxPG/FfnfoB15vX2/tr5WV4ZFTI5/Yymb0woUjtrIXl5cX0zU/TD4quXdtR/0DQLFYRCmFUgohhLN3cO8HV2a//Gnsw7FwaN+QGT4wbC5PfurNTM9cGdwzeEZKmZZSIqWkUqkgisUi3d3dAEJK2dLR0fHCy4cOf55OpTPtba3LgCmV3F1e1SvMTE8d9jzv7yiKXCDO5/MbgEa5rsvS0hKlchnLskg4DgC+76ONYVsuRy6XI5vNNnf+BS/0P9OBtw+RAAAAAElFTkSuQmCC) /*Images/Actions/pluginDownloadIconHover16.png*/;
}
#pluginCatalog #pluginCatalogHeading {
margin-bottom: 20px;
text-align: right;
}
#pluginCatalog .pluginItem.pluginInstalled > a:first-child h2:after {
content: ' [Installed]';
font-size: .8em;
font-weight: bold;
}
#pluginCatalog .pluginItem .pluginItemBlurb {
margin: 4px 0 4px 2px;
padding: 0 4px;
@@ -746,25 +750,14 @@ div.logEventsViewport table.logEventsViewport > tbody > tr > td.eventType {
padding: 0;
margin: 0;
}
#pluginCatalog .pluginItem > a:first-child {
padding-left: 30px;
background-image: url(data:image/png;base64,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 truncated
#pluginCatalog .pluginItem > h2:first-child {
padding-left: 20px;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC4klEQVQ4jWWRTWhcVRTHf/fd+958JJMw+aDFaYNUtChNTDHYFBdNm4K0IEI3lW7ErZR2IWhKi0tba6gBMRAXhaYiiJskjRgENWlVEC3VJrGFgpaIaetMM515kzfzvu51kZmhxrM6i3N+nN//iLm5OW7eXGRznXfHpg8eGui/zwqLs4X8O9kTA5tn+np7UfX+dWB/vRcAyXSidXDHSz23dIrbqugCk5v254GLDcD+/v7dkzue3L4rpdJhlAi8qanZM52ZTp4xz5FN3u46efLN7xyTSJUqawk72ZL9eHx86HEAT+S2jU98fXenUAoT2sj1LSAiElKh11u3vDuxfNGXNVS0zsixga+AAlBXEGCwuPUwxa/l4ygrINWeYdW9x0rLHYK2R0z8+Qpx1EX64QHePrq76aEa0sqWRJHGijO8+Fobzqrk+z+uUWor0PeGQ3l1Owvvu2x19qGN3ggKsBokqRTVMKAnMcrVS6vca8/z48K3/H7jNx7cCVk4l0YXziNUhNGmeUETYCuFF2jKtQpdfMQvl6s8/fyz9HTs5OfxNXTpLVA+xoDWuvGs5huRlqTqx1RCTRz7BOWzXP9sFGMewPoEMuUTBxag6wD+C8Bo3GrEWk0QaMC2SIjTWEoiOkOMsfGqGidZxfwfIIw2mm/eO4g2gBBYlkCIRsQbzlqDY2mi8v2GQfOC+R+uXX01lWlHCIsojqDuqo0BDJbYiCsKA0rFwlPAF48DLsVxPG/FfnfoB15vX2/tr5WV4ZFTI5/Yymb0woUjtrIXl5cX0zU/TD4quXdtR/0DQLFYRCmFUgohhLN3cO8HV2a//Gnsw7FwaN+QGT4wbC5PfurNTM9cGdwzeEZKmZZSIqWkUqkgisUi3d3dAEJK2dLR0fHCy4cOf55OpTPtba3LgCmV3F1e1SvMTE8d9jzv7yiKXCDO5/MbgEa5rsvS0hKlchnLskg4DgC+76ONYVsuRy6XI5vNNnf+BS/0P9OBtw+RAAAAAElFTkSuQmCC) /*Images/Actions/pluginDownloadIconHover16.png*/;
background-position: left center;
background-repeat: no-repeat;
min-height: 22px;
}
#pluginCatalog .pluginItem > a:first-child:hover {
background-image: url(data:image/png;base64,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 truncated
}
#pluginCatalog .pluginItem > a:first-child h2 {
display: inline;
color: #335a87;
}
#pluginCatalog .pluginItem > a:first-child h2:hover {
color: #4f81bd;
}
#pluginCatalog .pluginItem:not(.pluginInstalled) > a:first-child h2:hover:after {
font-size: .8em;
font-weight: bold;
content: ' < Install';
#pluginCatalog .pluginItem > h2:first-child a {
float: right;
font-size: 12px;
}
+22 -35
View File
@@ -16,14 +16,17 @@
float: right;
border: 1px dashed #ddd;
background-color: #fff;
line-height: 1.5em;
font-size: 0.6em;
padding: 4px 4px 4px 70px;
line-height: 1em;
padding: 4px 10px 4px 70px;
text-align: right;
height: 64px;
background-image: url(data:image/png;base64,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 truncated
background-position: 10px center;
background-repeat: no-repeat;
a.button {
margin-top: 16px;
}
}
#expressionEditor
@@ -963,6 +966,17 @@ div.logEventsViewport
color: @HyperLinkHoverColour;
}
}
#pageMenu td .pageMenuArea > a
{
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB90CDRcZMTlpMjsAAAKbSURBVDjLbZHBS2NHHMc/82ZeXpLaiNJHDylF6KEIGxFa0Jtdi4IFqfQq2P/As4f9D0rwplIwsDlZiofHStaTVQJCj+6a9SpKL3HhkTx5cZLMTA9uHov4Pf2Y33w/fL8z4vj4mHfv3vNUHz60ouXl5VmtNScnJ3eVmZkfn96ZqVRQj6P7HXj56VwAFAqFsenp6W+73S7NZjMRUH/iPwVqnwC8nJ2drU9NTb3I5XIDpVS6u7v7qlQqEQQBxWLxq83NzX+EEIUkSYJ8Pj+xs7Pz0+cAyuXyTqPR+F5KiTEGrTVCCHzfR2v99d7eXg3AGMPGxsZb4CPwWEEIAUC73ebm5gYhBKVSiTiOcc4RBAHn5+dYa9Fas76+nvXIEvi+jzEG5xyrq6vEcczV1RW+77O2tka73WZ/f58wDHHOZQBvNEgp6ff7hGHI4eEhSinOzs64uLjg+vqaWq3GYDBASom19vkEWmuMMYyPjxNFEUtLS1hrOTg4wBiD53k4554HeJ6H1pp+v59VaTQaWGuRUqKUYjAYADwPcM6Rpim9Xg9jDFJKgiBASokQAuccDw8P5PP5ZwHOOUe1WsU5hxACz/Oy3xlplCZJkmw3Apw2m81fx8bGEEJkFay12YuPDMPhkDiOvwP+/gwgXhtjTq21Yb/fTyuVysPt7e3PW1tbf/q+T7Va/U0p9b7VahW11vlOp3Pt53JtAOI4RimFUgohRG5+fv6Po6Ojf7e3twcLCwtucXHR1ev1NIqiN3Nzc6+klEUpJVJK7u/vEXEcE4YhgJBSfjE5OfnDysrKX4VC4ctSqdQCXKfTedHr9T5GUfRLmqb/DYfDBDB3d3ePgJGSJOHy8pJOt4vneQS5HABaa6xzfFMuUy6XmZiYyDz/AxHBRmZKLqH0AAAAAElFTkSuQmCC) /*Images/Actions/pluginDownloadIcon16.png*/;
&:hover
{
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC4klEQVQ4jWWRTWhcVRTHf/fd+958JJMw+aDFaYNUtChNTDHYFBdNm4K0IEI3lW7ErZR2IWhKi0tba6gBMRAXhaYiiJskjRgENWlVEC3VJrGFgpaIaetMM515kzfzvu51kZmhxrM6i3N+nN//iLm5OW7eXGRznXfHpg8eGui/zwqLs4X8O9kTA5tn+np7UfX+dWB/vRcAyXSidXDHSz23dIrbqugCk5v254GLDcD+/v7dkzue3L4rpdJhlAi8qanZM52ZTp4xz5FN3u46efLN7xyTSJUqawk72ZL9eHx86HEAT+S2jU98fXenUAoT2sj1LSAiElKh11u3vDuxfNGXNVS0zsixga+AAlBXEGCwuPUwxa/l4ygrINWeYdW9x0rLHYK2R0z8+Qpx1EX64QHePrq76aEa0sqWRJHGijO8+Fobzqrk+z+uUWor0PeGQ3l1Owvvu2x19qGN3ggKsBokqRTVMKAnMcrVS6vca8/z48K3/H7jNx7cCVk4l0YXziNUhNGmeUETYCuFF2jKtQpdfMQvl6s8/fyz9HTs5OfxNXTpLVA+xoDWuvGs5huRlqTqx1RCTRz7BOWzXP9sFGMewPoEMuUTBxag6wD+C8Bo3GrEWk0QaMC2SIjTWEoiOkOMsfGqGidZxfwfIIw2mm/eO4g2gBBYlkCIRsQbzlqDY2mi8v2GQfOC+R+uXX01lWlHCIsojqDuqo0BDJbYiCsKA0rFwlPAF48DLsVxPG/FfnfoB15vX2/tr5WV4ZFTI5/Yymb0woUjtrIXl5cX0zU/TD4quXdtR/0DQLFYRCmFUgohhLN3cO8HV2a//Gnsw7FwaN+QGT4wbC5PfurNTM9cGdwzeEZKmZZSIqWkUqkgisUi3d3dAEJK2dLR0fHCy4cOf55OpTPtba3LgCmV3F1e1SvMTE8d9jzv7yiKXCDO5/MbgEa5rsvS0hKlchnLskg4DgC+76ONYVsuRy6XI5vNNnf+BS/0P9OBtw+RAAAAAElFTkSuQmCC) /*Images/Actions/pluginDownloadIconHover16.png*/;
}
}
}
#pluginCatalog
@@ -975,13 +989,6 @@ div.logEventsViewport
.pluginItem
{
&.pluginInstalled > a:first-child h2:after
{
content: ' [Installed]';
font-size: .8em;
font-weight: bold;
}
.pluginItemBlurb
{
margin: 4px 0 4px 2px;
@@ -995,38 +1002,18 @@ div.logEventsViewport
}
}
&>a:first-child
&>h2:first-child
{
padding-left: 30px;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfdAgwEIyoweV/iAAAEIElEQVQ4y52VT2gUVxzHv++9eTOb7NudUHYJpmWDBFyFVC2bShvBghShB0GCeCjeeuhNSgTPXnIouZnQa+mld0HJoaJgTUkCQmgKS0IDa8SVGJesM8vsvHkz79eD7mKa1Up/MIeB9z58fv9mGBHhv2J+fv6rXC43G8excByHl8vlpatXry68746DD4hnz54tXrx4cTJJEoRhiM3NzS8BfDi4Uqkcc103IyIBAIwxJEnCr1y5oqrVKoIgwMuXL7G1tZWrVCrHPM8DABARhBDQWqPRaGwdAo+MjPw0PT19hDEWAIAQAgBslmWfCCFQLBaRpimCIPBmZmZ+dl0XABgAhGHorq2ttQF8fQh88uTJ47du3fp4fX3dOI4DKSWstXTnzh2nZyWlhFKKXbp0acr3fTiOw+I4prGxMTE7O9scWAql1PDe3h5u374tPc9Dq9VClmUoFosgImRZBiKC1hoLCwtuoVAA5xzb29tYXFxELpcbelfzMmttv161Wg1CCJRKJQDA7u4urLU4c+YM0jRFp9PBgwcPsLOzA2MMjDFpD8TfpgohwDmHMQau6yIMQ1SrVYRhiEePHuHp06doNpsYHR3F2NgYms0mXr16Bc/zwBiDtZYNNBZCgDGGKIrAGEOj0cCLFy9w4sQJLC8vo1QqQSkFYwyWl5dRr9dhjAFjrAfGQGPOX7/GcYxutwutNdrtNh4/foxTp05hY2MDo6OjuHfvHjY3N2GM6csQEd5etkPGAKC1PnBYa43V1VWcP38eS0tL2N/fh9YanHMw1s/+gLHzLmPOOYgIvW0jIjx8+BDdbhdZluHNDB+wfKdxL6IoAuccaZpCa43epKRpCiklXNftZ5NlGdI0fb+xtRbWWgRBgCRJXh94syiO4/RT76VvrQXnHK7rHmrev8HM8zycPXsWuVwOrutCSnkA3CsRESFNUxARoiiC53kgosHjFgSB7Ha7uHbtGoQQCMMQnU4Hnuf1oVmWQWuNOI6Rz+dRKBRgrcXz58+RJIk7EDwzM/PrzZs3vwBAUko9OTkZHT16NKjX6+Orq6uf7e/vI5/Po1arbU9NTW3s7Oz4KysrQ0mSeHEc83Pnzv1xoJODHqXU5xcuXPjh7t27K3Nzc+vlcpkAkO/7dP369Y379+//fvny5e+VUrVB9w8YM8accrl8PMuyI4VC4btSqfTNyMhI8fTp07hx4waiKMLQ0BAmJiYmfd+HUmra9/3flFI/KqX07u7un0TUAQD29uxJKbnjOB8RUV5KWR0fH/+2Uql8Ojw8PFELine truncated
padding-left: 20px;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC4klEQVQ4jWWRTWhcVRTHf/fd+958JJMw+aDFaYNUtChNTDHYFBdNm4K0IEI3lW7ErZR2IWhKi0tba6gBMRAXhaYiiJskjRgENWlVEC3VJrGFgpaIaetMM515kzfzvu51kZmhxrM6i3N+nN//iLm5OW7eXGRznXfHpg8eGui/zwqLs4X8O9kTA5tn+np7UfX+dWB/vRcAyXSidXDHSz23dIrbqugCk5v254GLDcD+/v7dkzue3L4rpdJhlAi8qanZM52ZTp4xz5FN3u46efLN7xyTSJUqawk72ZL9eHx86HEAT+S2jU98fXenUAoT2sj1LSAiElKh11u3vDuxfNGXNVS0zsixga+AAlBXEGCwuPUwxa/l4ygrINWeYdW9x0rLHYK2R0z8+Qpx1EX64QHePrq76aEa0sqWRJHGijO8+Fobzqrk+z+uUWor0PeGQ3l1Owvvu2x19qGN3ggKsBokqRTVMKAnMcrVS6vca8/z48K3/H7jNx7cCVk4l0YXziNUhNGmeUETYCuFF2jKtQpdfMQvl6s8/fyz9HTs5OfxNXTpLVA+xoDWuvGs5huRlqTqx1RCTRz7BOWzXP9sFGMewPoEMuUTBxag6wD+C8Bo3GrEWk0QaMC2SIjTWEoiOkOMsfGqGidZxfwfIIw2mm/eO4g2gBBYlkCIRsQbzlqDY2mi8v2GQfOC+R+uXX01lWlHCIsojqDuqo0BDJbYiCsKA0rFwlPAF48DLsVxPG/FfnfoB15vX2/tr5WV4ZFTI5/Yymb0woUjtrIXl5cX0zU/TD4quXdtR/0DQLFYRCmFUgohhLN3cO8HV2a//Gnsw7FwaN+QGT4wbC5PfurNTM9cGdwzeEZKmZZSIqWkUqkgisUi3d3dAEJK2dLR0fHCy4cOf55OpTPtba3LgCmV3F1e1SvMTE8d9jzv7yiKXCDO5/MbgEa5rsvS0hKlchnLskg4DgC+76ONYVsuRy6XI5vNNnf+BS/0P9OBtw+RAAAAAElFTkSuQmCC) /*Images/Actions/pluginDownloadIconHover16.png*/;
background-position: left center;
background-repeat: no-repeat;
min-height: 22px;
&:hover
a
{
background-image: url(data:image/png;base64,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 truncated
}
h2
{
display: inline;
color: @HyperLinkColour;
&:hover
{
color: @HyperLinkHoverColour;
}
}
}
&:not(.pluginInstalled)
{
&>a:first-child h2:hover:after
{
font-size: .8em;
font-weight: bold;
content: ' < Install';
float: right;
font-size: 12px;
}
}
}
+1 -1
View File
@@ -1 +1 @@
.tableData{border:solid 1px #e8eef4;border-collapse:collapse}.tableData>tbody>tr>td{border:solid 1px #e8eef4;background-color:#fff}.tableData>tbody>tr:nth-child(odd)>td{background-color:#fcfcfd}.tableData>thead>tr>th,.tableData>tbody>tr>th{background-color:#e8eef4;border:solid 1px #e8eef4}.tableData>tbody>tr:hover>td{background-color:#e8eef4}.tableDataDark{border:solid 1px #8db2d8;border-collapse:collapse}.tableDataDark td{border:solid 1px #8db2d8;background-color:#fff}.tableDataDark th{background-color:#8db2d8;border:solid 1px #8db2d8}.tableDataContainer{background-color:#fff}.tableDataVertical{border:solid 1px #e8eef4;border-collapse:collapse}.tableDataVertical>tbody>tr:nth-child(odd){background-color:#e8eef4;margin:0;padding:0}.tableDataVertical>tbody>tr>th.name{width:170px;text-align:right}.tableDataVertical table.sub>tbody>tr:not(:first-child)>th,.tableDataVertical table.sub>tbody>tr:not(:first-child)>td{border-top:1px dashed #aaa}.tableDataVertical table.sub>tbody>tr>th{font-weight:normal;text-align:right}.tableDataVertical table.sub>tbody>tr>th.name{text-align:right}.icon16{display:inline-block;height:16px;width:16px;margin-left:2px;cursor:pointer}.subtleUntilHover{-moz-opacity:.3;opacity:.3}.subtleUntilHover:hover{-moz-opacity:1;opacity:1}#pageMenu td .pageMenuArea>a.config{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACsElEQVQ4y41T3UtTcRie3QaNRhKC/4SgN4KBeSGK4EAvuzChNZQSvJgXYldCV5tMiUzEDVuZ84M0P4OmpjO3lV+bs21nH2fnbGd69mFuMz/39DunFsUadODh/Hj5vc/zPu/7/iQAJP9CQ0NDrU6nO9Lr9YnS0tKqfPdyAoODg7daWlpuqFQqYyyeQDKVQmdnp6G9vf26RqO5nZfAYDC0vZ2ezuj0es5oHEuGuQhCYQ7RWAznFxeYmpo6fmkwcCaTKfO8v1/5F4FMJrv26vUIQ7MhxOJxEYc8DzrIgItEcHB4iONkEql0Gqdn5xgdHfXnVFBXV6cNkATK54M/QMNm+4yPq2vY3NqCl8QSR0ci0icnqK6ufppDoO3t3fSRROe+C/PzCyKJ3e64CjLslZC0tLyMyMHPSjQ9PZbfBEqlslar1fIut/uS8vpgtdoQCoVB/NJSqVReWFh4b2FxkY8SW0JVQl88FHXZ19fHl5eXV0kqK++qInwU+y43duwOrJnXQVE+1NfLn2RVHigUAx7KC/P6BulLEH6aJs2No6LiTpukrKzsEcOy2HN+xfbOLlbXzOCjMajV6vdZgiGd7oswlZnZOdj3nAjQhCQQQElJiUJCPmlTU9MsGR1H/GJre0ds1uTkJEZG3nwzGo3HY+Pj4jSsNhu8/gD0w8OskCPk/rl5z1LpE7DE/wfTkjjGXWLJQRRpovhuZgYO5z4pP4iamhp1zhS6u7u572dniCcScHs8sFisWN+w4NMvWIi6QB4ku9LV1RXKIVB1dJjJX1iiDNm+TJjjRL+CqrAfRDlDFusqHDlAa2vrSg6B4KexsXGiqKjofnFx8WNSxalfbBYNyutNkvhDElfI5fIJ4W7ex5TFi4EBF0umwzAMmpubV/77NWZRUFAgI52eE0DON/Pd+wH6O+vw3ozilAAAAABJRU5ErkJggg==)}#pageMenu td .pageMenuArea>a.config:hover{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACiElEQVQ4y41Ta0iTYRQe/ShCTCpJiiRIKvtTiUE3+2VRiMR+JEk3ktKMslmGJZVEf1aZhpFFS/uRQ7Jcq2jVKvKCu2S66eZl05zu5qd9m+5i28TtO73njYXyNeiDw/dyOOc5z3me9xUAgOBfUXYgNUv3+JxH/0Q0lZ22MjNWHS/R9agwsfZU+hL5hZ0vAi4HhLwsKC5lSBuLtsepbx9MignQ/bRENCC7xekkRYyx4brf6zCB194Pv1gbhGeCMNAk9pEaZlgp4Tru5xXOA0hKWLSg59kVu8dqBJyK4R+3wJSlG3xOM/iZHxD0TEDI54LZ4DQYpFdHeAyK96+rxgb3YAdMDevBoZXDaHM9jH1/R3MBt5PGjH8SzmSmiHkAmru5Omz8aWyGwbf3KAijV0YIqwg2WT7XgW9siDJR38n59hdAcjI9S1NxiGX728M4ya5uAo+tF8i+1sT4hcLk5YuPDikesLgWskJdXCZNWFt1hM3ZtjpTcDxjTen0xAiwfW04EUZbpOA2a6Eka315dMrDE2kS0gTWtgaqC7JDcXN3JIsExOMinIjUGd1HCoCA7WLhpygAuQ9d6Ir5TRWM93yhABj7NiUVCMiXUHl4s4JYx6ALTNcHKlZf400w1Jd5Sd7X+/wGdcOueQWTQ52gry12YA/2zr15NWgTsiFeUxtxpQnDVzrNJK+gLPF8dm9KJc+FlvI9zGzAR++Aa0AFNtXLeYHTERxDeXm3kwfw+uIuFReJIABHBOJwZ9yXTv0jHEf+EczX5W9t5QHgPteEG2VrV8Tlpa6KP09YhKJiEVf8JH+a5AtKszfIsDbmY4pGZ02+mVImwlYf29L6369xDqNlROn3GOS8NFbdbzB85s9H8NGVAAAAAElFTkSuQmCC)}#updateAvailableContainer{float:right;border:1px dashed #ddd;background-color:#fff;line-height:1.5em;font-size:.6em;padding:4px 4px 4px 70px;text-align:right;height:64px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADEAAABACAYAAACz4p94AAAVPUlEQVRo3s2aWaxk13Wev7X3PkONd+6+PQ+cmoNItkha4iCYtBVLpGQ7MkQ78EMICBZt+EFAAENMgAAKkAQInYcEQR6Sl8AKHE1OBBkg2YJFKS0O8iCSgimymyLZTXY3e+471q1bVWfYKw/7nLrVDCkDQQNhNQ7OrdNVe69/Tf9aa5dwLV+P/ycOuE1z8fxZKaa2U4pQYkEBY0m3tZk79pKePXbc8/ZPrtm27pqscvfn4aWnYO+exq5WvqCptUOXMHAJmYkZFYpzMfO7usysnSnOvnnqIpB9tEC89BQArW5zenpK7ugPB+nQRLRtQm4tK3lJZCKmui1ttFt9Ytf76IGoXs00WUib9oHp6dlOZoyU4siNxY9KrHV0Gw1Va5dw9nVg9SMJIo3jxTSJPjnXbc8UYqWwjhzDMCmxxtFsNXQTvUDkvguc/kiCEGsX4ii6ud3tTJXGUIhjKJbesERcRLedMvB+Gmu713LfawoC9Q1nbDrTdHFpHKWxbIil5RTjItrNhEtIijWNjyyIIi8iI0g3TSisozQOVUPTCDZKaDYjBBVEoo8siOFoJKinncTk1lLaiEwtqXNESUI3teABMeYjC2IwGIovSpqxIzeO0jr6RKQupptEbIs8AmBEP7og+hv4vCB2DmsdhYtwGtHEMR8J2xyIEhj8IxvYvR5lNsIaQYxBjMFhaakw42C23k2uLYhr6ptcPJ8x3FQjghXBVEASK7Ss0A67KSvr2TW1xF9897uRM/aPW63mnla7U7Zb7bC5UN0FEETkqmfhOUglrBHDn3z32cM220yCpDJWuAGsASuQRK79L77y2Jef+Mf/40EFUdlaQyb2kbAZBkFRijwnyzLyoiDPMrJwRXme/5UzmEjEfBkxtwqCMeHaEnTr76ufT2wuAqIcmmlxYZDhvWppVEpVCpQcyD1kHk0i17hp1/bfCZKCqdarARgRMBPPjCAalBeAMt5bVVHV0llr1BjJjAhxHBEnCda6qzRvEMSAiA2LimDEhA3HloDIOWBEXnopjacsPUP19MXQK6HnEUWI4pi02awiPAgKEnxbggWlAmOqTxljq2ASvCp5ntcgCmeMwVpLmjb43z/8AUl+kZgMjEHiGfCKiWJwCUWRUSKIsYhmCAXYFCmGiHpeO9OnffAuhmVJQYliGPmCnhiuGEvHwWiwyQ/+15+z9uPv4FUxrS6MelDm+NYUuBhrLNYlaL+HZhkap2AU1ZCieyPLdTffwaFDN6GqODGVyQRmZ2f4/V/7OKkbgFho7YM8g7QFaYdvP3+MYxeWKLMR4kugBBOD5qhXfvOR69HWHFfyAu+FUmHolT5wxSSkubB9cZ5z76zyzsJ1eO+RRgufD1AtLine truncated
.tableData{border:solid 1px #e8eef4;border-collapse:collapse}.tableData>tbody>tr>td{border:solid 1px #e8eef4;background-color:#fff}.tableData>tbody>tr:nth-child(odd)>td{background-color:#fcfcfd}.tableData>thead>tr>th,.tableData>tbody>tr>th{background-color:#e8eef4;border:solid 1px #e8eef4}.tableData>tbody>tr:hover>td{background-color:#e8eef4}.tableDataDark{border:solid 1px #8db2d8;border-collapse:collapse}.tableDataDark td{border:solid 1px #8db2d8;background-color:#fff}.tableDataDark th{background-color:#8db2d8;border:solid 1px #8db2d8}.tableDataContainer{background-color:#fff}.tableDataVertical{border:solid 1px #e8eef4;border-collapse:collapse}.tableDataVertical>tbody>tr:nth-child(odd){background-color:#e8eef4;margin:0;padding:0}.tableDataVertical>tbody>tr>th.name{width:170px;text-align:right}.tableDataVertical table.sub>tbody>tr:not(:first-child)>th,.tableDataVertical table.sub>tbody>tr:not(:first-child)>td{border-top:1px dashed #aaa}.tableDataVertical table.sub>tbody>tr>th{font-weight:normal;text-align:right}.tableDataVertical table.sub>tbody>tr>th.name{text-align:right}.icon16{display:inline-block;height:16px;width:16px;margin-left:2px;cursor:pointer}.subtleUntilHover{-moz-opacity:.3;opacity:.3}.subtleUntilHover:hover{-moz-opacity:1;opacity:1}#pageMenu td .pageMenuArea>a.config{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACsElEQVQ4y41T3UtTcRie3QaNRhKC/4SgN4KBeSGK4EAvuzChNZQSvJgXYldCV5tMiUzEDVuZ84M0P4OmpjO3lV+bs21nH2fnbGd69mFuMz/39DunFsUadODh/Hj5vc/zPu/7/iQAJP9CQ0NDrU6nO9Lr9YnS0tKqfPdyAoODg7daWlpuqFQqYyyeQDKVQmdnp6G9vf26RqO5nZfAYDC0vZ2ezuj0es5oHEuGuQhCYQ7RWAznFxeYmpo6fmkwcCaTKfO8v1/5F4FMJrv26vUIQ7MhxOJxEYc8DzrIgItEcHB4iONkEql0Gqdn5xgdHfXnVFBXV6cNkATK54M/QMNm+4yPq2vY3NqCl8QSR0ci0icnqK6ufppDoO3t3fSRROe+C/PzCyKJ3e64CjLslZC0tLyMyMHPSjQ9PZbfBEqlslar1fIut/uS8vpgtdoQCoVB/NJSqVReWFh4b2FxkY8SW0JVQl88FHXZ19fHl5eXV0kqK++qInwU+y43duwOrJnXQVE+1NfLn2RVHigUAx7KC/P6BulLEH6aJs2No6LiTpukrKzsEcOy2HN+xfbOLlbXzOCjMajV6vdZgiGd7oswlZnZOdj3nAjQhCQQQElJiUJCPmlTU9MsGR1H/GJre0ds1uTkJEZG3nwzGo3HY+Pj4jSsNhu8/gD0w8OskCPk/rl5z1LpE7DE/wfTkjjGXWLJQRRpovhuZgYO5z4pP4iamhp1zhS6u7u572dniCcScHs8sFisWN+w4NMvWIi6QB4ku9LV1RXKIVB1dJjJX1iiDNm+TJjjRL+CqrAfRDlDFusqHDlAa2vrSg6B4KexsXGiqKjofnFx8WNSxalfbBYNyutNkvhDElfI5fIJ4W7ex5TFi4EBF0umwzAMmpubV/77NWZRUFAgI52eE0DON/Pd+wH6O+vw3ozilAAAAABJRU5ErkJggg==)}#pageMenu td .pageMenuArea>a.config:hover{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACiElEQVQ4y41Ta0iTYRQe/ShCTCpJiiRIKvtTiUE3+2VRiMR+JEk3ktKMslmGJZVEf1aZhpFFS/uRQ7Jcq2jVKvKCu2S66eZl05zu5qd9m+5i28TtO73njYXyNeiDw/dyOOc5z3me9xUAgOBfUXYgNUv3+JxH/0Q0lZ22MjNWHS/R9agwsfZU+hL5hZ0vAi4HhLwsKC5lSBuLtsepbx9MignQ/bRENCC7xekkRYyx4brf6zCB194Pv1gbhGeCMNAk9pEaZlgp4Tru5xXOA0hKWLSg59kVu8dqBJyK4R+3wJSlG3xOM/iZHxD0TEDI54LZ4DQYpFdHeAyK96+rxgb3YAdMDevBoZXDaHM9jH1/R3MBt5PGjH8SzmSmiHkAmru5Omz8aWyGwbf3KAijV0YIqwg2WT7XgW9siDJR38n59hdAcjI9S1NxiGX728M4ya5uAo+tF8i+1sT4hcLk5YuPDikesLgWskJdXCZNWFt1hM3ZtjpTcDxjTen0xAiwfW04EUZbpOA2a6Eka315dMrDE2kS0gTWtgaqC7JDcXN3JIsExOMinIjUGd1HCoCA7WLhpygAuQ9d6Ir5TRWM93yhABj7NiUVCMiXUHl4s4JYx6ALTNcHKlZf400w1Jd5Sd7X+/wGdcOueQWTQ52gry12YA/2zr15NWgTsiFeUxtxpQnDVzrNJK+gLPF8dm9KJc+FlvI9zGzAR++Aa0AFNtXLeYHTERxDeXm3kwfw+uIuFReJIABHBOJwZ9yXTv0jHEf+EczX5W9t5QHgPteEG2VrV8Tlpa6KP09YhKJiEVf8JH+a5AtKszfIsDbmY4pGZ02+mVImwlYf29L6369xDqNlROn3GOS8NFbdbzB85s9H8NGVAAAAAElFTkSuQmCC)}#updateAvailableContainer{float:right;border:1px dashed #ddd;background-color:#fff;font-size:.6em;line-height:1em;padding:4px 10px 4px 70px;text-align:right;height:64px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADEAAABACAYAAACz4p94AAAVPUlEQVRo3s2aWaxk13Wev7X3PkONd+6+PQ+cmoNItkha4iCYtBVLpGQ7MkQ78EMICBZt+EFAAENMgAAKkAQInYcEQR6Sl8AKHE1OBBkg2YJFKS0O8iCSgimymyLZTXY3e+471q1bVWfYKw/7nLrVDCkDQQNhNQ7OrdNVe69/Tf9aa5dwLV+P/ycOuE1z8fxZKaa2U4pQYkEBY0m3tZk79pKePXbc8/ZPrtm27pqscvfn4aWnYO+exq5WvqCptUOXMHAJmYkZFYpzMfO7usysnSnOvnnqIpB9tEC89BQArW5zenpK7ugPB+nQRLRtQm4tK3lJZCKmui1ttFt9Ytf76IGoXs00WUib9oHp6dlOZoyU4siNxY9KrHV0Gw1Va5dw9nVg9SMJIo3jxTSJPjnXbc8UYqWwjhzDMCmxxtFsNXQTvUDkvguc/kiCEGsX4ii6ud3tTJXGUIhjKJbesERcRLedMvB+Gmu713LfawoC9Q1nbDrTdHFpHKWxbIil5RTjItrNhEtIijWNjyyIIi8iI0g3TSisozQOVUPTCDZKaDYjBBVEoo8siOFoJKinncTk1lLaiEwtqXNESUI3teABMeYjC2IwGIovSpqxIzeO0jr6RKQupptEbIs8AmBEP7og+hv4vCB2DmsdhYtwGtHEMR8J2xyIEhj8IxvYvR5lNsIaQYxBjMFhaakw42C23k2uLYhr6ptcPJ8x3FQjghXBVEASK7Ss0A67KSvr2TW1xF9897uRM/aPW63mnla7U7Zb7bC5UN0FEETkqmfhOUglrBHDn3z32cM220yCpDJWuAGsASuQRK79L77y2Jef+Mf/40EFUdlaQyb2kbAZBkFRijwnyzLyoiDPMrJwRXme/5UzmEjEfBkxtwqCMeHaEnTr76ufT2wuAqIcmmlxYZDhvWppVEpVCpQcyD1kHk0i17hp1/bfCZKCqdarARgRMBPPjCAalBeAMt5bVVHV0llr1BjJjAhxHBEnCda6qzRvEMSAiA2LimDEhA3HloDIOWBEXnopjacsPUP19MXQK6HnEUWI4pi02awiPAgKEnxbggWlAmOqTxljq2ASvCp5ntcgCmeMwVpLmjb43z/8AUl+kZgMjEHiGfCKiWJwCUWRUSKIsYhmCAXYFCmGiHpeO9OnffAuhmVJQYliGPmCnhiuGEvHwWiwyQ/+15+z9uPv4FUxrS6MelDm+NYUuBhrLNYlaL+HZhkap2AU1ZCieyPLdTffwaFDN6GqODGVyQRmZ2f4/V/7OKkbgFho7YM8g7QFaYdvP3+MYxeWKLMR4kugBBOD5qhXfvOR69HWHFfyAu+FUmHolT5wxSSkubB9cZ5z76zyzsJ1eO+RRgufD1AtyLine truncated
Binary file not shown.

After

Width:  |  Height:  |  Size: 795 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 795 B

+5 -4
View File
@@ -339,6 +339,7 @@ a:active {
color: #335a87;
}
a.button {
display: inline-block;
padding: 4px 10px;
margin: 2px;
border: 1px solid #875a33;
@@ -347,11 +348,11 @@ a.button {
font-weight: bold;
text-transform: uppercase;
cursor: pointer;
line-height: 2.2em;
white-space: nowrap;
text-decoration: none;
}
a.button[disabled] {
a.button[disabled],
a.button.disabled {
background: #9e9e9e;
border: 1px solid #696969;
cursor: default;
@@ -790,7 +791,8 @@ input[type="submit"] {
padding: 5px;
}
input[type="submit"].button {
padding: 4px 10px;
font-size: 12px;
padding: 6px 10px 4px 10px;
margin: 2px;
border: 1px solid #875a33;
background: #db761d;
@@ -798,7 +800,6 @@ input[type="submit"].button {
font-weight: bold;
text-transform: uppercase;
cursor: pointer;
line-height: 1.2em;
}
input[type="submit"].button:hover {
border: 1px solid #696969;
+4 -4
View File
@@ -333,6 +333,7 @@ a
// Anchor Tags (Button)
a.button
{
display: inline-block;
padding: 4px 10px;
margin: 2px;
border: 1px solid @ButtonBorderColour;
@@ -341,11 +342,10 @@ a
font-weight: bold;
text-transform: uppercase;
cursor: pointer;
line-height: 2.2em;
white-space: nowrap;
text-decoration: none;
&[disabled]
&[disabled], &.disabled
{
background: @ButtonHoverColour;
border: 1px solid @ButtonBorderHoverColour;
@@ -876,7 +876,8 @@ input[type="submit"]
&.button
{
padding: 4px 10px;
font-size: 12px;
padding: 6px 10px 4px 10px;
margin: 2px;
border: 1px solid @ButtonBorderColour;
background: @ButtonColour;
@@ -884,7 +885,6 @@ input[type="submit"]
font-weight: bold;
text-transform: uppercase;
cursor: pointer;
line-height: 1.2em;
&:hover
{
+1 -1
View File
@@ -1 +1 @@
.tableData{border:solid 1px #e8eef4;border-collapse:collapse}.tableData>tbody>tr>td{border:solid 1px #e8eef4;background-color:#fff}.tableData>tbody>tr:nth-child(odd)>td{background-color:#fcfcfd}.tableData>thead>tr>th,.tableData>tbody>tr>th{background-color:#e8eef4;border:solid 1px #e8eef4}.tableData>tbody>tr:hover>td{background-color:#e8eef4}.tableDataDark{border:solid 1px #8db2d8;border-collapse:collapse}.tableDataDark td{border:solid 1px #8db2d8;background-color:#fff}.tableDataDark th{background-color:#8db2d8;border:solid 1px #8db2d8}.tableDataContainer{background-color:#fff}.tableDataVertical{border:solid 1px #e8eef4;border-collapse:collapse}.tableDataVertical>tbody>tr:nth-child(odd){background-color:#e8eef4;margin:0;padding:0}.tableDataVertical>tbody>tr>th.name{width:170px;text-align:right}.tableDataVertical table.sub>tbody>tr:not(:first-child)>th,.tableDataVertical table.sub>tbody>tr:not(:first-child)>td{border-top:1px dashed #aaa}.tableDataVertical table.sub>tbody>tr>th{font-weight:normal;text-align:right}.tableDataVertical table.sub>tbody>tr>th.name{text-align:right}.icon16{display:inline-block;height:16px;width:16px;margin-left:2px;cursor:pointer}.subtleUntilHover{-moz-opacity:.3;opacity:.3}.subtleUntilHover:hover{-moz-opacity:1;opacity:1}body{font-size:12px;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;margin:0;padding:0 10px;color:#333}body.layout{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAFvCAMAAABEoqrSAAADAFBMVEVRUVFUVFRYWFhbW1tfX19iYmJmZmZpaWltbW1wcHB0dHR3d3d7e3t/f3/MzMzNzc3Ozs7Pz8/Q0NDR0dHS0tLT09PU1NTV1dXW1tbX19fY2NjZ2dna2trb29vc3Nzd3d3e3t7f39/g4ODh4eHi4uLj4+Pk5OTl5eXm5ubn5+fo6Ojp6enq6urr6+vs7Ozt7e3u7u7v7+/w8PDx8fHy8vLz8/P09PT19fX29vb39/f4+Pj5+fn6+vr7+/v8/Pz9/f3+/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD28iAmAAAAbklEQVRIx2NUZ4ABlv9kMZkYRrXhYUphMwzZXEYCogQV0FfbUHMOrSxGAoyMBEygM/M/zZnMjFiZDPQEjCYEsin2/EYKk6qGDTVzR7TnRwN1NFBHPT8aqKOBOur5Uc+PBip1zWVkYGCBCv2nhrkAr7hI+jpl4KUAAAAASUVORK5CYII=) left top repeat-x #d1d1d1}.page{max-width:1230px;min-width:750px;margin-left:auto;margin-right:auto}header,#header{position:relative;margin:0;padding:0;height:110px}header #headerMenu,#header #headerMenu{height:24px;padding:4px;line-height:22px;text-align:right}header #headerMenu a,#header #headerMenu a{color:#000;text-decoration:none}header #headerMenu a:hover,#header #headerMenu a:hover{text-decoration:underline}header #heading,#header #heading{float:left;height:75px}header #heading img,#header #heading img{height:75px;width:300px}header nav,#header nav{padding:0;margin:0;font-size:1.1em}header nav ul#menu,#header nav ul#menu{height:29px;padding:3px 6px;margin:0;list-style:none;z-index:100000}header nav ul#menu>li,#header nav ul#menu>li{display:inline-block;z-index:100000;margin-bottom:-4px}header nav ul#menu>li a,#header nav ul#menu>li a{padding:4px 10px;text-decoration:none;color:#fff;display:inline-block;height:21px}header nav ul#menu>li a:hover,#header nav ul#menu>li a:hover{color:#ffd5ba;text-decoration:none}header nav ul#menu>li a:active,#header nav ul#menu>li a:active{text-decoration:none}header nav ul#menu>li.sep,#header nav ul#menu>li.sep{margin-top:4px;height:21px;border-left:1px solid #777}header nav ul#menu>li.moveRight,#header nav ul#menu>li.moveRight{margin-left:40px}header nav ul#menu>li>ul,#header nav ul#menu>li>ul{z-index:100000;display:none;list-style:none;position:absolute;margin:2px 0 0 0;-moz-border-radius:0 0 0 0;-webkit-border-radius:0 0 0 0;border-radius:0 0 0 0;border-left:1px solid #ecab72;border-bottom:2px solid #ecab72;border-right:1px solid #ecab72;padding:0;min-width:180px}header nav ul#menu>li>ul li,#header nav ul#menu>li>ul li{position:relative;background-color:rgba(242,242,242,.9);background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAUCAYAAABMDlehAAAAIUlEQVQI12NgYGBQYGJgYPgLJ/6gciEEMwMDAyMzA1kAAB/mByD2JQzYAAAAAElFTkSuQmCC);background-position:top;background-repeat:repeat-x}header nav ul#menu>li>ul li:hover,#header nav ul#menu>li>ul li:hover{background-color:rgba(249,228,210,.75)}header nav ul#menu>li>ul li.hasSubmenu,#header nav ul#menu>li>ul li.hasSubmenu{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAANCAYAAACgu+4kAAAAa0lEQVQoz2NgGBRg8uTJO4BYhxIDVgPxHyCeDcQS5BpiAcSHgfgzENcBMRe5BgUC8Line truncated
.tableData{border:solid 1px #e8eef4;border-collapse:collapse}.tableData>tbody>tr>td{border:solid 1px #e8eef4;background-color:#fff}.tableData>tbody>tr:nth-child(odd)>td{background-color:#fcfcfd}.tableData>thead>tr>th,.tableData>tbody>tr>th{background-color:#e8eef4;border:solid 1px #e8eef4}.tableData>tbody>tr:hover>td{background-color:#e8eef4}.tableDataDark{border:solid 1px #8db2d8;border-collapse:collapse}.tableDataDark td{border:solid 1px #8db2d8;background-color:#fff}.tableDataDark th{background-color:#8db2d8;border:solid 1px #8db2d8}.tableDataContainer{background-color:#fff}.tableDataVertical{border:solid 1px #e8eef4;border-collapse:collapse}.tableDataVertical>tbody>tr:nth-child(odd){background-color:#e8eef4;margin:0;padding:0}.tableDataVertical>tbody>tr>th.name{width:170px;text-align:right}.tableDataVertical table.sub>tbody>tr:not(:first-child)>th,.tableDataVertical table.sub>tbody>tr:not(:first-child)>td{border-top:1px dashed #aaa}.tableDataVertical table.sub>tbody>tr>th{font-weight:normal;text-align:right}.tableDataVertical table.sub>tbody>tr>th.name{text-align:right}.icon16{display:inline-block;height:16px;width:16px;margin-left:2px;cursor:pointer}.subtleUntilHover{-moz-opacity:.3;opacity:.3}.subtleUntilHover:hover{-moz-opacity:1;opacity:1}body{font-size:12px;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;margin:0;padding:0 10px;color:#333}body.layout{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAFvCAMAAABEoqrSAAADAFBMVEVRUVFUVFRYWFhbW1tfX19iYmJmZmZpaWltbW1wcHB0dHR3d3d7e3t/f3/MzMzNzc3Ozs7Pz8/Q0NDR0dHS0tLT09PU1NTV1dXW1tbX19fY2NjZ2dna2trb29vc3Nzd3d3e3t7f39/g4ODh4eHi4uLj4+Pk5OTl5eXm5ubn5+fo6Ojp6enq6urr6+vs7Ozt7e3u7u7v7+/w8PDx8fHy8vLz8/P09PT19fX29vb39/f4+Pj5+fn6+vr7+/v8/Pz9/f3+/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD28iAmAAAAbklEQVRIx2NUZ4ABlv9kMZkYRrXhYUphMwzZXEYCogQV0FfbUHMOrSxGAoyMBEygM/M/zZnMjFiZDPQEjCYEsin2/EYKk6qGDTVzR7TnRwN1NFBHPT8aqKOBOur5Uc+PBip1zWVkYGCBCv2nhrkAr7hI+jpl4KUAAAAASUVORK5CYII=) left top repeat-x #d1d1d1}.page{max-width:1230px;min-width:750px;margin-left:auto;margin-right:auto}header,#header{position:relative;margin:0;padding:0;height:110px}header #headerMenu,#header #headerMenu{height:24px;padding:4px;line-height:22px;text-align:right}header #headerMenu a,#header #headerMenu a{color:#000;text-decoration:none}header #headerMenu a:hover,#header #headerMenu a:hover{text-decoration:underline}header #heading,#header #heading{float:left;height:75px}header #heading img,#header #heading img{height:75px;width:300px}header nav,#header nav{padding:0;margin:0;font-size:1.1em}header nav ul#menu,#header nav ul#menu{height:29px;padding:3px 6px;margin:0;list-style:none;z-index:100000}header nav ul#menu>li,#header nav ul#menu>li{display:inline-block;z-index:100000;margin-bottom:-4px}header nav ul#menu>li a,#header nav ul#menu>li a{padding:4px 10px;text-decoration:none;color:#fff;display:inline-block;height:21px}header nav ul#menu>li a:hover,#header nav ul#menu>li a:hover{color:#ffd5ba;text-decoration:none}header nav ul#menu>li a:active,#header nav ul#menu>li a:active{text-decoration:none}header nav ul#menu>li.sep,#header nav ul#menu>li.sep{margin-top:4px;height:21px;border-left:1px solid #777}header nav ul#menu>li.moveRight,#header nav ul#menu>li.moveRight{margin-left:40px}header nav ul#menu>li>ul,#header nav ul#menu>li>ul{z-index:100000;display:none;list-style:none;position:absolute;margin:2px 0 0 0;-moz-border-radius:0 0 0 0;-webkit-border-radius:0 0 0 0;border-radius:0 0 0 0;border-left:1px solid #ecab72;border-bottom:2px solid #ecab72;border-right:1px solid #ecab72;padding:0;min-width:180px}header nav ul#menu>li>ul li,#header nav ul#menu>li>ul li{position:relative;background-color:rgba(242,242,242,.9);background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAUCAYAAABMDlehAAAAIUlEQVQI12NgYGBQYGJgYPgLJ/6gciEEMwMDAyMzA1kAAB/mByD2JQzYAAAAAElFTkSuQmCC);background-position:top;background-repeat:repeat-x}header nav ul#menu>li>ul li:hover,#header nav ul#menu>li>ul li:hover{background-color:rgba(249,228,210,.75)}header nav ul#menu>li>ul li.hasSubmenu,#header nav ul#menu>li>ul li.hasSubmenu{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAANCAYAAACgu+4kAAAAa0lEQVQoz2NgGBRg8uTJO4BYhxIDVgPxHyCeDcQS5BpiAcSHgfgzENcBMRe5BgUC8Line truncated
@@ -20,7 +20,7 @@ namespace Disco.Web.Controllers
#region Determine Server Is Core SKU
// Added 2012-11-01 G#
// http://www.discoict.com.au/forum/support/2012/10/install-on-server-core.aspx
private static Lazy<bool> ServerIsCoreSKU = new Lazy<bool>(() =>
internal static Lazy<bool> ServerIsCoreSKU = new Lazy<bool>(() =>
{
try
{
+36
View File
@@ -0,0 +1,36 @@
using System;
using System.Data.SqlClient;
using System.Threading;
using System.Web.Mvc;
using Disco.Web.Models.InitialConfig;
using Disco.Data.Repository;
using System.Linq;
using System.IO;
using System.Text.RegularExpressions;
using System.IO.Compression;
using System.Management;
using System.Web;
using Disco.Services.Plugins;
namespace Disco.Web.Controllers
{
[OutputCache(Duration = 0, Location = System.Web.UI.OutputCacheLocation.None)]
public partial class UpdateController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!Request.IsLocal && !InitialConfigController.ServerIsCoreSKU.Value)
{
filterContext.Result = new HttpStatusCodeResult(System.Net.HttpStatusCode.ServiceUnavailable, "Initial Configuration of Disco is only allowed via a local connection");
}
base.OnActionExecuting(filterContext);
}
public virtual ActionResult Index()
{
var status = UpdatePluginsAfterDiscoUpdateTask.UpdateDiscoPlugins(true);
return RedirectToAction(MVC.Config.Logging.TaskStatus(status.SessionId));
}
}
}
+2 -1
View File
@@ -172,6 +172,7 @@
</Compile>
<Compile Include="Controllers\InitialConfigController.cs" />
<Compile Include="Controllers\PluginWebHandlerController.cs" />
<Compile Include="Controllers\UpdateController.cs" />
<Compile Include="Extensions\HtmlExtensions.cs" />
<Compile Include="App_Start\AppConfig.cs" />
<Compile Include="App_Start\BundleConfig.cs" />
@@ -1822,7 +1823,7 @@
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
</WebProjectProperties>
</FlavorProperties>
<UserProperties BuildVersion_StartDate="2001/1/1" BuildVersion_BuildAction="ReBuild" BuildVersion_UseGlobalSettings="True" BuildVersion_DetectChanges="False" />
<UserProperties BuildVersion_DetectChanges="False" BuildVersion_UseGlobalSettings="True" BuildVersion_BuildAction="ReBuild" BuildVersion_StartDate="2001/1/1" />
</VisualStudio>
</ProjectExtensions>
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
+30
View File
@@ -37,9 +37,22 @@ namespace Disco.Web
if (AppConfig.InitializeDatabase())
{
// Database Initialized
Debug.WriteLine("Initialized Database: +{0}ms", timer.ElapsedMilliseconds - timer_last);
timer_last = timer.ElapsedMilliseconds;
// Check for Post-Update
Version previousVersion;
Version currentVersion = Disco.BI.Interop.Community.UpdateCheck.CurrentDiscoVersion();
using (DiscoDataContext dbContext = new DiscoDataContext())
{
previousVersion = dbContext.DiscoConfiguration.InstalledDatabaseVersion;
}
if (currentVersion == previousVersion)
{
// Normal Startup
AreaRegistration.RegisterAllAreas();
Debug.WriteLine("Registered Areas: +{0}ms", timer.ElapsedMilliseconds - timer_last);
@@ -72,6 +85,23 @@ namespace Disco.Web
}
else
{
// Post-Update Startup
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterUpdateRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles();
AppConfig.InitializeUpdateEnvironment();
using (DiscoDataContext dbContext = new DiscoDataContext())
{
dbContext.DiscoConfiguration.InstalledDatabaseVersion = currentVersion;
dbContext.SaveChanges();
}
}
}
else
{
// Database Not Initialized
// Install
InitialConfig = true;
RouteConfig.RegisterInstallRoutes(RouteTable.Routes);
+2 -2
View File
@@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
//
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.2.0212.1702")]
[assembly: AssemblyFileVersion("1.2.0212.1702")]
[assembly: AssemblyVersion("1.2.0214.1848")]
[assembly: AssemblyFileVersion("1.2.0214.1848")]
+158 -23
View File
@@ -37,6 +37,7 @@ public static class MVC
public static Disco.Web.Controllers.JobController Job = new Disco.Web.Controllers.T4MVC_JobController();
public static Disco.Web.Controllers.PluginWebHandlerController PluginWebHandler = new Disco.Web.Controllers.T4MVC_PluginWebHandlerController();
public static Disco.Web.Controllers.SearchController Search = new Disco.Web.Controllers.T4MVC_SearchController();
public static Disco.Web.Controllers.UpdateController Update = new Disco.Web.Controllers.T4MVC_UpdateController();
public static Disco.Web.Controllers.UserController User = new Disco.Web.Controllers.T4MVC_UserController();
public static T4MVC.HomeController Home = new T4MVC.HomeController();
public static T4MVC.SharedController Shared = new T4MVC.SharedController();
@@ -1998,6 +1999,84 @@ namespace Disco.Web.Controllers
}
}
namespace Disco.Web.Controllers
{
public partial class UpdateController
{
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public UpdateController() { }
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
protected UpdateController(Dummy d) { }
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
protected RedirectToRouteResult RedirectToAction(ActionResult result)
{
var callInfo = result.GetT4MVCResult();
return RedirectToRoute(callInfo.RouteValueDictionary);
}
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
protected RedirectToRouteResult RedirectToActionPermanent(ActionResult result)
{
var callInfo = result.GetT4MVCResult();
return RedirectToRoutePermanent(callInfo.RouteValueDictionary);
}
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public UpdateController Actions { get { return MVC.Update; } }
[GeneratedCode("T4MVC", "2.0")]
public readonly string Area = "";
[GeneratedCode("T4MVC", "2.0")]
public readonly string Name = "Update";
[GeneratedCode("T4MVC", "2.0")]
public const string NameConst = "Update";
static readonly ActionNamesClass s_actions = new ActionNamesClass();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public ActionNamesClass ActionNames { get { return s_actions; } }
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class ActionNamesClass
{
public readonly string Index = "Index";
}
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class ActionNameConstants
{
public const string Index = "Index";
}
static readonly ViewsClass s_views = new ViewsClass();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public ViewsClass Views { get { return s_views; } }
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class ViewsClass
{
static readonly _ViewNamesClass s_ViewNames = new _ViewNamesClass();
public _ViewNamesClass ViewNames { get { return s_ViewNames; } }
public class _ViewNamesClass
{
}
}
}
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class T4MVC_UpdateController : Disco.Web.Controllers.UpdateController
{
public T4MVC_UpdateController() : base(Dummy.Instance) { }
public override System.Web.Mvc.ActionResult Index()
{
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Index);
return callInfo;
}
}
}
namespace Disco.Web.Controllers
{
public partial class UserController
@@ -6759,6 +6838,18 @@ namespace Disco.Web.Areas.API.Controllers
return RedirectToRoutePermanent(callInfo.RouteValueDictionary);
}
[NonAction]
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public System.Web.Mvc.ActionResult Update()
{
return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Update);
}
[NonAction]
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public System.Web.Mvc.ActionResult UpdateLocal()
{
return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateLocal);
}
[NonAction]
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public System.Web.Mvc.ActionResult Uninstall()
@@ -6767,16 +6858,16 @@ namespace Disco.Web.Areas.API.Controllers
}
[NonAction]
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public System.Web.Mvc.ActionResult InstallLocal()
{
return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.InstallLocal);
}
[NonAction]
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public System.Web.Mvc.ActionResult Install()
{
return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Install);
}
[NonAction]
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public System.Web.Mvc.ActionResult InstallLocal()
{
return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.InstallLocal);
}
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public PluginController Actions { get { return MVC.API.Plugin; } }
@@ -6794,21 +6885,44 @@ namespace Disco.Web.Areas.API.Controllers
public class ActionNamesClass
{
public readonly string UpdateLibraryCatalogue = "UpdateLibraryCatalogue";
public readonly string UpdateAll = "UpdateAll";
public readonly string Update = "Update";
public readonly string UpdateLocal = "UpdateLocal";
public readonly string Uninstall = "Uninstall";
public readonly string InstallLocal = "InstallLocal";
public readonly string Install = "Install";
public readonly string InstallLocal = "InstallLocal";
}
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class ActionNameConstants
{
public const string UpdateLibraryCatalogue = "UpdateLibraryCatalogue";
public const string UpdateAll = "UpdateAll";
public const string Update = "Update";
public const string UpdateLocal = "UpdateLocal";
public const string Uninstall = "Uninstall";
public const string InstallLocal = "InstallLocal";
public const string Install = "Install";
public const string InstallLocal = "InstallLocal";
}
static readonly ActionParamsClass_Update s_params_Update = new ActionParamsClass_Update();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public ActionParamsClass_Update UpdateParams { get { return s_params_Update; } }
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class ActionParamsClass_Update
{
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();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public ActionParamsClass_Uninstall UninstallParams { get { return s_params_Uninstall; } }
@@ -6818,14 +6932,6 @@ namespace Disco.Web.Areas.API.Controllers
public readonly string id = "id";
public readonly string UninstallData = "UninstallData";
}
static readonly ActionParamsClass_InstallLocal s_params_InstallLocal = new ActionParamsClass_InstallLocal();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public ActionParamsClass_InstallLocal InstallLocalParams { get { return s_params_InstallLocal; } }
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class ActionParamsClass_InstallLocal
{
public readonly string Plugin = "Plugin";
}
static readonly ActionParamsClass_Install s_params_Install = new ActionParamsClass_Install();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public ActionParamsClass_Install InstallParams { get { return s_params_Install; } }
@@ -6834,6 +6940,14 @@ namespace Disco.Web.Areas.API.Controllers
{
public readonly string PluginId = "PluginId";
}
static readonly ActionParamsClass_InstallLocal s_params_InstallLocal = new ActionParamsClass_InstallLocal();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public ActionParamsClass_InstallLocal InstallLocalParams { get { return s_params_InstallLocal; } }
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class ActionParamsClass_InstallLocal
{
public readonly string Plugin = "Plugin";
}
static readonly ViewsClass s_views = new ViewsClass();
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public ViewsClass Views { get { return s_views; } }
@@ -6859,6 +6973,27 @@ namespace Disco.Web.Areas.API.Controllers
return callInfo;
}
public override System.Web.Mvc.ActionResult UpdateAll()
{
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateAll);
return callInfo;
}
public override System.Web.Mvc.ActionResult Update(string PluginId)
{
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Update);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "PluginId", PluginId);
return callInfo;
}
public override System.Web.Mvc.ActionResult UpdateLocal(string PluginId, System.Web.HttpPostedFileBase Plugin)
{
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateLocal);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "PluginId", PluginId);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "Plugin", Plugin);
return callInfo;
}
public override System.Web.Mvc.ActionResult Uninstall(string id, bool UninstallData)
{
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Uninstall);
@@ -6867,13 +7002,6 @@ namespace Disco.Web.Areas.API.Controllers
return callInfo;
}
public override System.Web.Mvc.ActionResult InstallLocal(System.Web.HttpPostedFileBase Plugin)
{
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.InstallLocal);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "Plugin", Plugin);
return callInfo;
}
public override System.Web.Mvc.ActionResult Install(string PluginId)
{
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Install);
@@ -6881,6 +7009,13 @@ namespace Disco.Web.Areas.API.Controllers
return callInfo;
}
public override System.Web.Mvc.ActionResult InstallLocal(System.Web.HttpPostedFileBase Plugin)
{
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.InstallLocal);
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "Plugin", Plugin);
return callInfo;
}
}
}