refactor user details plugin interface

This commit is contained in:
Gary Sharp
2023-04-14 16:37:42 +10:00
parent 215e9863a2
commit 22dad072b9
22 changed files with 144 additions and 241 deletions
-1
View File
@@ -145,7 +145,6 @@
<Compile Include="Services\Jobs\Noticeboards\IHeldDeviceItem.cs" />
<Compile Include="Services\Messaging\Email.cs" />
<Compile Include="Services\Messaging\EmailAttachment.cs" />
<Compile Include="Services\Plugins\Details\DetailsResult.cs" />
<Compile Include="Services\Users\Contact\UserContact.cs" />
<Compile Include="Services\Users\Contact\UserContactType.cs" />
<Compile Include="Services\Searching\DeviceSearchResultItem.cs" />
@@ -1,42 +0,0 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
namespace Disco.Models.Services.Plugins.Details
{
public class DetailsResult
{
public DateTime GatheredOn { get; private set; }
public DateTime ExpiresOn { get; private set; }
public Dictionary<string, string> Details { get; }
public bool SetExpiration(DateTime expireOn)
{
if (ExpiresOn > expireOn)
{
// only set the expiration if it is sooner
ExpiresOn = expireOn;
return true;
}
else
{
return false;
}
}
public DetailsResult()
{
GatheredOn = DateTime.Now;
ExpiresOn = DateTime.Now.AddDays(7);
Details = new Dictionary<string, string>();
}
[JsonConstructor]
public DetailsResult(DateTime gatheredOn, DateTime expiresOn, Dictionary<string, string> details)
{
GatheredOn = gatheredOn;
ExpiresOn = expiresOn;
Details = details ?? new Dictionary<string, string>();
}
}
}
+1 -2
View File
@@ -1,7 +1,6 @@
using Disco.Models.BI.Config;
using Disco.Models.Services.Documents;
using Disco.Models.Services.Jobs.JobLists;
using Disco.Models.Services.Plugins.Details;
using System.Collections.Generic;
namespace Disco.Models.UI.Device
@@ -21,7 +20,7 @@ namespace Disco.Models.UI.Device
List<Repository.DocumentTemplate> DocumentTemplates { get; set; }
List<DocumentTemplatePackage> DocumentTemplatePackages { get; set; }
DetailsResult AssignedUserDetails { get; set; }
Dictionary<string, string> AssignedUserDetails { get; set; }
bool HasAssignedUserPhoto { get; set; }
}
}
+1 -2
View File
@@ -1,7 +1,6 @@
using Disco.Models.Services.Documents;
using Disco.Models.Services.Job;
using Disco.Models.Services.Jobs.JobLists;
using Disco.Models.Services.Plugins.Details;
using System;
using System.Collections.Generic;
@@ -18,7 +17,7 @@ namespace Disco.Models.UI.Job
LocationModes LocationMode { get; set; }
List<JobLocationReference> LocationOptions { get; set; }
DetailsResult UserDetails { get; set; }
Dictionary<string, string> UserDetails { get; set; }
bool HasUserPhoto { get; set; }
}
}
+1 -2
View File
@@ -2,7 +2,6 @@
using Disco.Models.Services.Authorization;
using Disco.Models.Services.Documents;
using Disco.Models.Services.Jobs.JobLists;
using Disco.Models.Services.Plugins.Details;
using System.Collections.Generic;
namespace Disco.Models.UI.User
@@ -18,7 +17,7 @@ namespace Disco.Models.UI.User
IAuthorizationToken AuthorizationToken { get; set; }
IClaimNavigatorItem ClaimNavigator { get; set; }
DetailsResult UserDetails { get; set; }
Dictionary<string, string> UserDetails { get; set; }
bool HasUserPhoto { get; set; }
}
}
@@ -61,7 +61,7 @@ namespace Disco.Services.Devices.Exporting
if (Options.AssignedUserDetailCustom && r.AssignedUser != null)
{
var detailsService = new DetailsProviderService(Database);
r.AssignedUserCustomDetails = detailsService.GetDetails(r.AssignedUser).Details;
r.AssignedUserCustomDetails = detailsService.GetDetails(r.AssignedUser);
}
});
+3 -3
View File
@@ -208,15 +208,15 @@ namespace Disco.Services.Expressions
{
if (target is User targetUser)
{
detailsVariables.Add("UserDetails", new LazyDictionary(() => detailsService.GetDetails(targetUser).Details));
detailsVariables.Add("UserDetails", new LazyDictionary(() => detailsService.GetDetails(targetUser)));
}
else if (target is Job targetJob)
{
detailsVariables.Add("UserDetails", targetJob.User == null ? (IDictionary<string, string>)new Dictionary<string, string>() : new LazyDictionary(() => detailsService.GetDetails(targetJob.User).Details));
detailsVariables.Add("UserDetails", targetJob.User == null ? (IDictionary<string, string>)new Dictionary<string, string>() : new LazyDictionary(() => detailsService.GetDetails(targetJob.User)));
}
else if (target is Device targetDevice)
{
detailsVariables.Add("UserDetails", targetDevice.AssignedUser == null ? (IDictionary<string, string>)new Dictionary<string, string>() : new LazyDictionary(() => detailsService.GetDetails(targetDevice.AssignedUser).Details));
detailsVariables.Add("UserDetails", targetDevice.AssignedUser == null ? (IDictionary<string, string>)new Dictionary<string, string>() : new LazyDictionary(() => detailsService.GetDetails(targetDevice.AssignedUser)));
}
}
@@ -1,6 +1,5 @@
using Disco.Data.Repository;
using Disco.Models.Repository;
using Disco.Models.Services.Plugins.Details;
using System;
namespace Disco.Services.Plugins.Features.DetailsProvider
@@ -8,9 +7,8 @@ namespace Disco.Services.Plugins.Features.DetailsProvider
[PluginFeatureCategory(DisplayName = "Detail Providers")]
public abstract class DetailsProviderFeature : PluginFeature
{
public abstract DetailsResult GetDetails(DiscoDataContext database, User user, DateTime? cacheTimestamp);
[Obsolete("Never used")]
public abstract DetailsResult GetDetails(DiscoDataContext database, Device device, DateTime? cacheTimestamp);
public abstract void UpdateAllDetails(DiscoDataContext database);
public abstract byte[] GetUserPhoto(DiscoDataContext database, User user, DateTime? cacheTimestamp);
}
}
@@ -1,10 +1,9 @@
using Disco.Data.Repository;
using Disco.Models.Repository;
using Disco.Models.Services.Plugins.Details;
using Disco.Services.Authorization;
using Disco.Services.Users;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
@@ -86,77 +85,23 @@ namespace Disco.Services.Plugins.Features.DetailsProvider
return Path.Combine(database.DiscoConfiguration.PluginUserPhotosLocation, userHash.Substring(0, 2), $"{userHash}.jpg");
}
public DetailsResult GetDetails(User user)
public Dictionary<string, string> GetDetails(User user)
{
var result = new DetailsResult();
var saveChangesRequired = false;
if (!UserService.CurrentAuthorization.HasAll(Claims.User.Show, Claims.User.ShowDetails))
return result;
return new Dictionary<string, string>();
var features = Plugins.GetPluginFeatures(typeof(DetailsProviderFeature));
if (features.Count == 0)
return result;
var cache = user.UserDetails?.Where(d => d.Scope == DetailsScope).ToDictionary(d => d.Key, d => new { DbDetails = d, Details = JsonConvert.DeserializeObject<DetailsResult>(d.Value) }, StringComparer.OrdinalIgnoreCase);
foreach (var feature in features)
if (user.UserDetails != null)
{
var featureResult = default(DetailsResult);
if (!cache.TryGetValue(feature.Id, out var cacheResult) || cacheResult.Details.ExpiresOn < DateTime.Now || cacheResult.Details.GatheredOn < database.DiscoConfiguration.PluginDetailsCacheExpiration)
return user.UserDetails
.Where(d => string.Equals(d.Scope, DetailsScope, StringComparison.Ordinal))
.ToDictionary(d => d.Key, d => d.Value, StringComparer.OrdinalIgnoreCase);
} else
{
var timestamp = cacheResult?.Details.GatheredOn;
if (timestamp.HasValue && timestamp.Value < database.DiscoConfiguration.PluginDetailsCacheExpiration)
timestamp = null;
try
{
var featureInstance = feature.CreateInstance<DetailsProviderFeature>();
featureResult = featureInstance.GetDetails(database, user, timestamp);
if (featureResult != null)
{
if (featureResult.ExpiresOn > DateTime.Now)
{
if (cacheResult == null)
database.UserDetails.Add(new UserDetail() { UserId = user.UserId, Scope = DetailsScope, Key = feature.Id, Value = JsonConvert.SerializeObject(featureResult) });
else
cacheResult.DbDetails.Value = JsonConvert.SerializeObject(featureResult);
saveChangesRequired = true;
return database.UserDetails
.Where(d => d.UserId == user.UserId &&
d.Scope == DetailsScope)
.ToDictionary(d => d.Key, d => d.Value, StringComparer.OrdinalIgnoreCase);
}
else if (cacheResult != null)
{
database.UserDetails.Remove(cacheResult.DbDetails);
saveChangesRequired = true;
}
}
}
catch (Exception)
{
// ignore exceptions when plugins behave badly
}
}
else
{
featureResult = cacheResult.Details;
}
// apply feature results
if (featureResult != null)
{
result.SetExpiration(featureResult.ExpiresOn);
foreach (var value in featureResult.Details)
{
result.Details[value.Key] = value.Value;
}
}
}
if (saveChangesRequired)
database.SaveChanges();
return result;
}
}
}
@@ -67,10 +67,10 @@ namespace Disco.Services.Users.Contact
user = database.Users.First(u => u.UserId == user.UserId);
var details = service.GetDetails(user);
if ((details?.Details?.Count ?? 0) == 0)
if ((details?.Count ?? 0) == 0)
yield break;
foreach (var item in details.Details)
foreach (var item in details)
{
if (!contactType.HasValue || contactType.Value.HasFlag(UserContactType.Email))
{
@@ -283,8 +283,11 @@ namespace Disco.Web.Controllers
m.DeviceProfileWirelessProfileProviders = m.Device.DeviceProfile.GetWirelessProfileProviders().ToList();
}
if (Authorization.Has(Claims.User.ShowDetails))
{
// Populate Custom Details
m.PopulateDetails(Database);
}
// UI Extensions
UIExtensions.ExecuteExtensions<DeviceShowModel>(this.ControllerContext, m);
+3
View File
@@ -377,7 +377,10 @@ namespace Disco.Web.Controllers
}
// Populate Custom Details
if (Authorization.Has(Claims.User.ShowDetails))
{
m.PopulateDetails(Database);
}
// UI Extensions
UIExtensions.ExecuteExtensions<JobShowModel>(this.ControllerContext, m);
+3
View File
@@ -114,7 +114,10 @@ namespace Disco.Web.Controllers
}
// Populate Custom Details
if (Authorization.Has(Claims.User.ShowDetails))
{
m.PopulateDetails(Database);
}
// UI Extensions
UIExtensions.ExecuteExtensions<UserShowModel>(this.ControllerContext, m);
+1 -2
View File
@@ -1,6 +1,5 @@
using Disco.Models.Services.Documents;
using Disco.Models.Services.Jobs.JobLists;
using Disco.Models.Services.Plugins.Details;
using Disco.Models.UI.Device;
using Disco.Services.Plugins;
using Disco.Services.Plugins.Features.DocumentHandlerProvider;
@@ -35,7 +34,7 @@ namespace Disco.Web.Models.Device
HandlersPresent = Plugins.GetPluginFeatures(typeof(DocumentHandlerProviderFeature)).Any(),
};
public DetailsResult AssignedUserDetails { get; set; }
public Dictionary<string, string> AssignedUserDetails { get; set; }
public bool HasAssignedUserPhoto { get; set; }
}
}
+1 -2
View File
@@ -1,7 +1,6 @@
using Disco.Models.Services.Documents;
using Disco.Models.Services.Job;
using Disco.Models.Services.Jobs.JobLists;
using Disco.Models.Services.Plugins.Details;
using Disco.Models.UI.Job;
using Disco.Services.Plugins;
using Disco.Services.Plugins.Features.DocumentHandlerProvider;
@@ -34,7 +33,7 @@ namespace Disco.Web.Models.Job
public LocationModes LocationMode { get; set; }
public List<JobLocationReference> LocationOptions { get; set; }
public DetailsResult UserDetails { get; set; }
public Dictionary<string, string> UserDetails { get; set; }
public bool HasUserPhoto { get; set; }
}
}
+1 -2
View File
@@ -2,7 +2,6 @@
using Disco.Models.Services.Authorization;
using Disco.Models.Services.Documents;
using Disco.Models.Services.Jobs.JobLists;
using Disco.Models.Services.Plugins.Details;
using Disco.Models.UI.User;
using Disco.Services.Plugins;
using Disco.Services.Plugins.Features.DocumentHandlerProvider;
@@ -31,7 +30,7 @@ namespace Disco.Web.Models.User
public IAuthorizationToken AuthorizationToken { get; set; }
public IClaimNavigatorItem ClaimNavigator { get; set; }
public DetailsResult UserDetails { get; set; }
public Dictionary<string, string> UserDetails { get; set; }
public bool HasUserPhoto { get; set; }
public FancyTreeNode[] ClaimNavigatorFancyTreeNodes
@@ -272,10 +272,10 @@
</script>
</div>
}
@if (Model.AssignedUserDetails != null && Model.AssignedUserDetails.Details.Count(d => !d.Key.EndsWith("&")) > 0)
@if (Model.AssignedUserDetails != null && Model.AssignedUserDetails.Count(d => !d.Key.EndsWith("&")) > 0)
{
<div id="Device_Show_User_CustomDetails" class="status clearfix">
@foreach (var detail in Model.AssignedUserDetails.Details.Where(d => !d.Key.EndsWith("&")))
@foreach (var detail in Model.AssignedUserDetails.Where(d => !d.Key.EndsWith("&")))
{
<div>
<strong>@detail.Key.TrimEnd('*'):</strong>
@@ -1212,7 +1212,7 @@ WriteLiteral(" ");
#line 275 "..\..\Views\Device\DeviceParts\_Subject.cshtml"
if (Model.AssignedUserDetails != null && Model.AssignedUserDetails.Details.Count(d => !d.Key.EndsWith("&")) > 0)
if (Model.AssignedUserDetails != null && Model.AssignedUserDetails.Count(d => !d.Key.EndsWith("&")) > 0)
{
@@ -1234,7 +1234,7 @@ WriteLiteral(">\r\n");
#line hidden
#line 278 "..\..\Views\Device\DeviceParts\_Subject.cshtml"
foreach (var detail in Model.AssignedUserDetails.Details.Where(d => !d.Key.EndsWith("&")))
foreach (var detail in Model.AssignedUserDetails.Where(d => !d.Key.EndsWith("&")))
{
@@ -1691,39 +1691,39 @@ WriteLiteral("\"");
WriteLiteral(" name=\"DeviceProfile\"");
WriteAttribute("id", Tuple.Create(" id=\"", 25287), Tuple.Create("\"", 25314)
, Tuple.Create(Tuple.Create("", 25292), Tuple.Create("DeviceProfile_", 25292), true)
WriteAttribute("id", Tuple.Create(" id=\"", 25271), Tuple.Create("\"", 25298)
, Tuple.Create(Tuple.Create("", 25276), Tuple.Create("DeviceProfile_", 25276), true)
#line 397 "..\..\Views\Device\DeviceParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 25306), Tuple.Create<System.Object, System.Int32>(dp.Id
, Tuple.Create(Tuple.Create("", 25290), Tuple.Create<System.Object, System.Int32>(dp.Id
#line default
#line hidden
, 25306), false)
, 25290), false)
);
WriteLiteral(" /><label");
WriteAttribute("for", Tuple.Create(" for=\"", 25324), Tuple.Create("\"", 25352)
, Tuple.Create(Tuple.Create("", 25330), Tuple.Create("DeviceProfile_", 25330), true)
WriteAttribute("for", Tuple.Create(" for=\"", 25308), Tuple.Create("\"", 25336)
, Tuple.Create(Tuple.Create("", 25314), Tuple.Create("DeviceProfile_", 25314), true)
#line 397 "..\..\Views\Device\DeviceParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 25344), Tuple.Create<System.Object, System.Int32>(dp.Id
, Tuple.Create(Tuple.Create("", 25328), Tuple.Create<System.Object, System.Int32>(dp.Id
#line default
#line hidden
, 25344), false)
, 25328), false)
);
WriteAttribute("title", Tuple.Create(" title=\"", 25353), Tuple.Create("\"", 25397)
, Tuple.Create(Tuple.Create("", 25361), Tuple.Create("Distribution:", 25361), true)
WriteAttribute("title", Tuple.Create(" title=\"", 25337), Tuple.Create("\"", 25381)
, Tuple.Create(Tuple.Create("", 25345), Tuple.Create("Distribution:", 25345), true)
#line 397 "..\..\Views\Device\DeviceParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create(" ", 25374), Tuple.Create<System.Object, System.Int32>(dp.DistributionType
, Tuple.Create(Tuple.Create(" ", 25358), Tuple.Create<System.Object, System.Int32>(dp.DistributionType
#line default
#line hidden
, 25375), false)
, 25359), false)
);
WriteLiteral(">");
@@ -1933,14 +1933,14 @@ WriteLiteral(" title=\"Warranty Valid Until\"");
WriteLiteral(">Warranty Until:</span>\r\n </td>\r\n " +
" <td");
WriteAttribute("class", Tuple.Create(" class=\"", 31057), Tuple.Create("\"", 31205)
WriteAttribute("class", Tuple.Create(" class=\"", 31041), Tuple.Create("\"", 31189)
#line 491 "..\..\Views\Device\DeviceParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 31065), Tuple.Create<System.Object, System.Int32>(Model.Device.DeviceBatch.WarrantyValidUntil.HasValue && Model.Device.DeviceBatch.WarrantyValidUntil.Value < DateTime.Now ? "alert" : null
, Tuple.Create(Tuple.Create("", 31049), Tuple.Create<System.Object, System.Int32>(Model.Device.DeviceBatch.WarrantyValidUntil.HasValue && Model.Device.DeviceBatch.WarrantyValidUntil.Value < DateTime.Now ? "alert" : null
#line default
#line hidden
, 31065), false)
, 31049), false)
);
WriteLiteral(">\r\n");
@@ -1981,14 +1981,14 @@ WriteLiteral(" title=\"Insured Until\"");
WriteLiteral(">Insured Until:</span>\r\n </td>\r\n " +
" <td");
WriteAttribute("class", Tuple.Create(" class=\"", 32059), Tuple.Create("\"", 32195)
WriteAttribute("class", Tuple.Create(" class=\"", 32043), Tuple.Create("\"", 32179)
#line 507 "..\..\Views\Device\DeviceParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 32067), Tuple.Create<System.Object, System.Int32>(Model.Device.DeviceBatch.InsuredUntil.HasValue && Model.Device.DeviceBatch.InsuredUntil.Value < DateTime.Now ? "alert" : null
, Tuple.Create(Tuple.Create("", 32051), Tuple.Create<System.Object, System.Int32>(Model.Device.DeviceBatch.InsuredUntil.HasValue && Model.Device.DeviceBatch.InsuredUntil.Value < DateTime.Now ? "alert" : null
#line default
#line hidden
, 32067), false)
, 32051), false)
);
WriteLiteral(">\r\n");
@@ -2094,39 +2094,39 @@ WriteLiteral("\"");
WriteLiteral(" name=\"DeviceBatch\"");
WriteAttribute("id", Tuple.Create(" id=\"", 33383), Tuple.Create("\"", 33408)
, Tuple.Create(Tuple.Create("", 33388), Tuple.Create("DeviceBatch_", 33388), true)
WriteAttribute("id", Tuple.Create(" id=\"", 33367), Tuple.Create("\"", 33392)
, Tuple.Create(Tuple.Create("", 33372), Tuple.Create("DeviceBatch_", 33372), true)
#line 527 "..\..\Views\Device\DeviceParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 33400), Tuple.Create<System.Object, System.Int32>(db.Id
, Tuple.Create(Tuple.Create("", 33384), Tuple.Create<System.Object, System.Int32>(db.Id
#line default
#line hidden
, 33400), false)
, 33384), false)
);
WriteLiteral(" /><label");
WriteAttribute("for", Tuple.Create(" for=\"", 33418), Tuple.Create("\"", 33444)
, Tuple.Create(Tuple.Create("", 33424), Tuple.Create("DeviceBatch_", 33424), true)
WriteAttribute("for", Tuple.Create(" for=\"", 33402), Tuple.Create("\"", 33428)
, Tuple.Create(Tuple.Create("", 33408), Tuple.Create("DeviceBatch_", 33408), true)
#line 527 "..\..\Views\Device\DeviceParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 33436), Tuple.Create<System.Object, System.Int32>(db.Id
, Tuple.Create(Tuple.Create("", 33420), Tuple.Create<System.Object, System.Int32>(db.Id
#line default
#line hidden
, 33436), false)
, 33420), false)
);
WriteAttribute("title", Tuple.Create(" title=\"", 33445), Tuple.Create("\"", 33501)
, Tuple.Create(Tuple.Create("", 33453), Tuple.Create("Purchased:", 33453), true)
WriteAttribute("title", Tuple.Create(" title=\"", 33429), Tuple.Create("\"", 33485)
, Tuple.Create(Tuple.Create("", 33437), Tuple.Create("Purchased:", 33437), true)
#line 527 "..\..\Views\Device\DeviceParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create(" ", 33463), Tuple.Create<System.Object, System.Int32>(db.PurchaseDate.ToLongDateString()
, Tuple.Create(Tuple.Create(" ", 33447), Tuple.Create<System.Object, System.Int32>(db.PurchaseDate.ToLongDateString()
#line default
#line hidden
, 33464), false)
, 33448), false)
);
WriteLiteral(">");
@@ -2285,14 +2285,14 @@ WriteLiteral(" id=\"Device_Show_Aspects_Model_Image\"");
WriteLiteral(" alt=\"Model Image\"");
WriteAttribute("src", Tuple.Create(" src=\"", 38248), Tuple.Create("\"", 38358)
WriteAttribute("src", Tuple.Create(" src=\"", 38232), Tuple.Create("\"", 38342)
#line 604 "..\..\Views\Device\DeviceParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 38254), Tuple.Create<System.Object, System.Int32>(Url.Action(MVC.API.DeviceModel.Image(Model.Device.DeviceModelId, Model.Device.DeviceModel.ImageHash()))
, Tuple.Create(Tuple.Create("", 38238), Tuple.Create<System.Object, System.Int32>(Url.Action(MVC.API.DeviceModel.Image(Model.Device.DeviceModelId, Model.Device.DeviceModel.ImageHash()))
#line default
#line hidden
, 38254), false)
, 38238), false)
);
WriteLiteral(" />\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n <t" +
@@ -2783,28 +2783,28 @@ WriteLiteral(" <li>\r\n
WriteLiteral(" type=\"radio\"");
WriteAttribute("id", Tuple.Create(" id=\"", 49923), Tuple.Create("\"", 50001)
, Tuple.Create(Tuple.Create("", 49928), Tuple.Create("Device_Show_Device_Actions_Decommission_Reason_", 49928), true)
WriteAttribute("id", Tuple.Create(" id=\"", 49907), Tuple.Create("\"", 49985)
, Tuple.Create(Tuple.Create("", 49912), Tuple.Create("Device_Show_Device_Actions_Decommission_Reason_", 49912), true)
#line 808 "..\..\Views\Device\DeviceParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 49975), Tuple.Create<System.Object, System.Int32>((int)decommissionReason
, Tuple.Create(Tuple.Create("", 49959), Tuple.Create<System.Object, System.Int32>((int)decommissionReason
#line default
#line hidden
, 49975), false)
, 49959), false)
);
WriteLiteral("\r\n name=\"Device_Show_Device_Actions_Dec" +
"ommission_Reason\"");
WriteAttribute("value", Tuple.Create(" value=\"", 50100), Tuple.Create("\"", 50134)
WriteAttribute("value", Tuple.Create(" value=\"", 50084), Tuple.Create("\"", 50118)
#line 809 "..\..\Views\Device\DeviceParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 50108), Tuple.Create<System.Object, System.Int32>((int)decommissionReason
, Tuple.Create(Tuple.Create("", 50092), Tuple.Create<System.Object, System.Int32>((int)decommissionReason
#line default
#line hidden
, 50108), false)
, 50092), false)
);
WriteLiteral(" ");
@@ -2818,15 +2818,15 @@ WriteLiteral(" ");
#line hidden
WriteLiteral(" />\r\n <label");
WriteAttribute("for", Tuple.Create(" for=\"", 50278), Tuple.Create("\"", 50357)
, Tuple.Create(Tuple.Create("", 50284), Tuple.Create("Device_Show_Device_Actions_Decommission_Reason_", 50284), true)
WriteAttribute("for", Tuple.Create(" for=\"", 50262), Tuple.Create("\"", 50341)
, Tuple.Create(Tuple.Create("", 50268), Tuple.Create("Device_Show_Device_Actions_Decommission_Reason_", 50268), true)
#line 810 "..\..\Views\Device\DeviceParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 50331), Tuple.Create<System.Object, System.Int32>((int)decommissionReason
, Tuple.Create(Tuple.Create("", 50315), Tuple.Create<System.Object, System.Int32>((int)decommissionReason
#line default
#line hidden
, 50331), false)
, 50315), false)
);
WriteLiteral(">");
+2 -2
View File
@@ -499,10 +499,10 @@
Since: <span data-livestamp="@Model.Job.WaitingForUserAction.ToUnixEpoc()">@Model.Job.WaitingForUserAction.ToFullDateTime()</span>
</div>
}
@if (Model.UserDetails != null && Model.UserDetails.Details.Count(d => !d.Key.EndsWith("&")) > 0)
@if (Model.UserDetails != null && Model.UserDetails.Count(d => !d.Key.EndsWith("&")) > 0)
{
<div id="Job_Show_User_CustomDetails" class="status clearfix">
@foreach (var detail in Model.UserDetails.Details.Where(d => !d.Key.EndsWith("&")))
@foreach (var detail in Model.UserDetails.Where(d => !d.Key.EndsWith("&")))
{
<div>
<strong>@detail.Key.TrimEnd('*'):</strong>
@@ -1959,7 +1959,7 @@ WriteLiteral(" ");
#line 502 "..\..\Views\Job\JobParts\_Subject.cshtml"
if (Model.UserDetails != null && Model.UserDetails.Details.Count(d => !d.Key.EndsWith("&")) > 0)
if (Model.UserDetails != null && Model.UserDetails.Count(d => !d.Key.EndsWith("&")) > 0)
{
@@ -1981,7 +1981,7 @@ WriteLiteral(">\r\n");
#line hidden
#line 505 "..\..\Views\Job\JobParts\_Subject.cshtml"
foreach (var detail in Model.UserDetails.Details.Where(d => !d.Key.EndsWith("&")))
foreach (var detail in Model.UserDetails.Where(d => !d.Key.EndsWith("&")))
{
@@ -2557,14 +2557,14 @@ WriteLiteral(" type=\"hidden\"");
WriteLiteral(" name=\"JobId\"");
WriteAttribute("value", Tuple.Create(" value=\"", 47112), Tuple.Create("\"", 47133)
WriteAttribute("value", Tuple.Create(" value=\"", 47096), Tuple.Create("\"", 47117)
#line 733 "..\..\Views\Job\JobParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 47120), Tuple.Create<System.Object, System.Int32>(Model.Job.Id
, Tuple.Create(Tuple.Create("", 47104), Tuple.Create<System.Object, System.Int32>(Model.Job.Id
#line default
#line hidden
, 47120), false)
, 47104), false)
);
WriteLiteral(" />\r\n");
@@ -2628,26 +2628,26 @@ WriteLiteral("\"");
WriteLiteral(">\r\n <i");
WriteAttribute("class", Tuple.Create(" class=\"", 47602), Tuple.Create("\"", 47669)
, Tuple.Create(Tuple.Create("", 47610), Tuple.Create("fa", 47610), true)
, Tuple.Create(Tuple.Create(" ", 47612), Tuple.Create("fa-", 47613), true)
WriteAttribute("class", Tuple.Create(" class=\"", 47586), Tuple.Create("\"", 47653)
, Tuple.Create(Tuple.Create("", 47594), Tuple.Create("fa", 47594), true)
, Tuple.Create(Tuple.Create(" ", 47596), Tuple.Create("fa-", 47597), true)
#line 738 "..\..\Views\Job\JobParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 47616), Tuple.Create<System.Object, System.Int32>(jobQueue.Icon
, Tuple.Create(Tuple.Create("", 47600), Tuple.Create<System.Object, System.Int32>(jobQueue.Icon
#line default
#line hidden
, 47616), false)
, Tuple.Create(Tuple.Create(" ", 47632), Tuple.Create("fa-fw", 47633), true)
, Tuple.Create(Tuple.Create(" ", 47638), Tuple.Create("fa-lg", 47639), true)
, Tuple.Create(Tuple.Create(" ", 47644), Tuple.Create("d-", 47645), true)
, 47600), false)
, Tuple.Create(Tuple.Create(" ", 47616), Tuple.Create("fa-fw", 47617), true)
, Tuple.Create(Tuple.Create(" ", 47622), Tuple.Create("fa-lg", 47623), true)
, Tuple.Create(Tuple.Create(" ", 47628), Tuple.Create("d-", 47629), true)
#line 738 "..\..\Views\Job\JobParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 47647), Tuple.Create<System.Object, System.Int32>(jobQueue.IconColour
, Tuple.Create(Tuple.Create("", 47631), Tuple.Create<System.Object, System.Int32>(jobQueue.IconColour
#line default
#line hidden
, 47647), false)
, 47631), false)
);
WriteLiteral("></i>");
@@ -2688,27 +2688,27 @@ WriteLiteral(" ");
#line hidden
WriteLiteral(" <i");
WriteAttribute("class", Tuple.Create(" class=\"", 48066), Tuple.Create("\"", 48114)
, Tuple.Create(Tuple.Create("", 48074), Tuple.Create("fa", 48074), true)
, Tuple.Create(Tuple.Create(" ", 48076), Tuple.Create("d-priority-", 48077), true)
WriteAttribute("class", Tuple.Create(" class=\"", 48050), Tuple.Create("\"", 48098)
, Tuple.Create(Tuple.Create("", 48058), Tuple.Create("fa", 48058), true)
, Tuple.Create(Tuple.Create(" ", 48060), Tuple.Create("d-priority-", 48061), true)
#line 745 "..\..\Views\Job\JobParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 48088), Tuple.Create<System.Object, System.Int32>(priorityValue.ToLower()
, Tuple.Create(Tuple.Create("", 48072), Tuple.Create<System.Object, System.Int32>(priorityValue.ToLower()
#line default
#line hidden
, 48088), false)
, 48072), false)
);
WriteAttribute("title", Tuple.Create(" title=\"", 48115), Tuple.Create("\"", 48148)
WriteAttribute("title", Tuple.Create(" title=\"", 48099), Tuple.Create("\"", 48132)
#line 745 "..\..\Views\Job\JobParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 48123), Tuple.Create<System.Object, System.Int32>(priorityValue
, Tuple.Create(Tuple.Create("", 48107), Tuple.Create<System.Object, System.Int32>(priorityValue
#line default
#line hidden
, 48123), false)
, Tuple.Create(Tuple.Create(" ", 48139), Tuple.Create("Priority", 48140), true)
, 48107), false)
, Tuple.Create(Tuple.Create(" ", 48123), Tuple.Create("Priority", 48124), true)
);
WriteLiteral("></i>\r\n </div>\r\n <div>\r\n " +
@@ -72,11 +72,11 @@
</table>
</div>
}
@if (Model.UserDetails != null && Model.UserDetails.Details.Count(d => !d.Key.EndsWith("&")) > 0)
@if (Model.UserDetails != null && Model.UserDetails.Count(d => !d.Key.EndsWith("&")) > 0)
{
<div id="User_Show_CustomDetails" class="status clearfix">
<table class="none verticalHeadings">
@foreach (var detail in Model.UserDetails.Details.Where(d => !d.Key.EndsWith("&")))
@foreach (var detail in Model.UserDetails.Where(d => !d.Key.EndsWith("&")))
{
<tr>
<td>@detail.Key.TrimEnd('*'):</td>
@@ -375,7 +375,7 @@ WriteLiteral(" ");
#line 75 "..\..\Views\User\UserParts\_Subject.cshtml"
if (Model.UserDetails != null && Model.UserDetails.Details.Count(d => !d.Key.EndsWith("&")) > 0)
if (Model.UserDetails != null && Model.UserDetails.Count(d => !d.Key.EndsWith("&")) > 0)
{
@@ -401,7 +401,7 @@ WriteLiteral(">\r\n");
#line hidden
#line 79 "..\..\Views\User\UserParts\_Subject.cshtml"
foreach (var detail in Model.UserDetails.Details.Where(d => !d.Key.EndsWith("&")))
foreach (var detail in Model.UserDetails.Where(d => !d.Key.EndsWith("&")))
{
@@ -664,14 +664,14 @@ WriteLiteral(" class=\"CreateJob_Assignment_Image\"");
WriteLiteral(" alt=\"Model Image\"");
WriteAttribute("src", Tuple.Create(" src=\"", 8645), Tuple.Create("\"", 8766)
WriteAttribute("src", Tuple.Create(" src=\"", 8629), Tuple.Create("\"", 8750)
#line 140 "..\..\Views\User\UserParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 8651), Tuple.Create<System.Object, System.Int32>(Url.Action(MVC.API.DeviceModel.Image(assignment.Device.DeviceModel.Id, assignment.Device.DeviceModel.ImageHash()))
, Tuple.Create(Tuple.Create("", 8635), Tuple.Create<System.Object, System.Int32>(Url.Action(MVC.API.DeviceModel.Image(assignment.Device.DeviceModel.Id, assignment.Device.DeviceModel.ImageHash()))
#line default
#line hidden
, 8651), false)
, 8635), false)
);
WriteLiteral(@" />
@@ -929,14 +929,14 @@ WriteLiteral(" type=\"hidden\"");
WriteLiteral(" name=\"UserId\"");
WriteAttribute("value", Tuple.Create(" value=\"", 15831), Tuple.Create("\"", 15857)
WriteAttribute("value", Tuple.Create(" value=\"", 15815), Tuple.Create("\"", 15841)
#line 245 "..\..\Views\User\UserParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 15839), Tuple.Create<System.Object, System.Int32>(Model.User.UserId
, Tuple.Create(Tuple.Create("", 15823), Tuple.Create<System.Object, System.Int32>(Model.User.UserId
#line default
#line hidden
, 15839), false)
, 15823), false)
);
WriteLiteral(" />\r\n");
@@ -978,26 +978,26 @@ WriteLiteral("\"");
WriteLiteral(">\r\n <i");
WriteAttribute("class", Tuple.Create(" class=\"", 16231), Tuple.Create("\"", 16298)
, Tuple.Create(Tuple.Create("", 16239), Tuple.Create("fa", 16239), true)
, Tuple.Create(Tuple.Create(" ", 16241), Tuple.Create("fa-", 16242), true)
WriteAttribute("class", Tuple.Create(" class=\"", 16215), Tuple.Create("\"", 16282)
, Tuple.Create(Tuple.Create("", 16223), Tuple.Create("fa", 16223), true)
, Tuple.Create(Tuple.Create(" ", 16225), Tuple.Create("fa-", 16226), true)
#line 250 "..\..\Views\User\UserParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 16245), Tuple.Create<System.Object, System.Int32>(userFlag.Icon
, Tuple.Create(Tuple.Create("", 16229), Tuple.Create<System.Object, System.Int32>(userFlag.Icon
#line default
#line hidden
, 16245), false)
, Tuple.Create(Tuple.Create(" ", 16261), Tuple.Create("fa-fw", 16262), true)
, Tuple.Create(Tuple.Create(" ", 16267), Tuple.Create("fa-lg", 16268), true)
, Tuple.Create(Tuple.Create(" ", 16273), Tuple.Create("d-", 16274), true)
, 16229), false)
, Tuple.Create(Tuple.Create(" ", 16245), Tuple.Create("fa-fw", 16246), true)
, Tuple.Create(Tuple.Create(" ", 16251), Tuple.Create("fa-lg", 16252), true)
, Tuple.Create(Tuple.Create(" ", 16257), Tuple.Create("d-", 16258), true)
#line 250 "..\..\Views\User\UserParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 16276), Tuple.Create<System.Object, System.Int32>(userFlag.IconColour
, Tuple.Create(Tuple.Create("", 16260), Tuple.Create<System.Object, System.Int32>(userFlag.IconColour
#line default
#line hidden
, 16276), false)
, 16260), false)
);
WriteLiteral("></i>");
@@ -1178,14 +1178,14 @@ WriteLiteral(">\r\n");
#line hidden
WriteLiteral(" <a");
WriteAttribute("href", Tuple.Create(" href=\"", 21696), Tuple.Create("\"", 21763)
WriteAttribute("href", Tuple.Create(" href=\"", 21680), Tuple.Create("\"", 21747)
#line 344 "..\..\Views\User\UserParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 21703), Tuple.Create<System.Object, System.Int32>(Url.Action(MVC.Device.Show(assignment.Device.SerialNumber))
, Tuple.Create(Tuple.Create("", 21687), Tuple.Create<System.Object, System.Int32>(Url.Action(MVC.Device.Show(assignment.Device.SerialNumber))
#line default
#line hidden
, 21703), false)
, 21687), false)
);
WriteLiteral(">\r\n <img");
@@ -1194,14 +1194,14 @@ WriteLiteral(" class=\"User_Show_AssignedDevices_CurrentAssignment_Image\"");
WriteLiteral(" alt=\"Model Image\"");
WriteAttribute("src", Tuple.Create(" src=\"", 21895), Tuple.Create("\"", 22016)
WriteAttribute("src", Tuple.Create(" src=\"", 21879), Tuple.Create("\"", 22000)
#line 345 "..\..\Views\User\UserParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 21901), Tuple.Create<System.Object, System.Int32>(Url.Action(MVC.API.DeviceModel.Image(assignment.Device.DeviceModel.Id, assignment.Device.DeviceModel.ImageHash()))
, Tuple.Create(Tuple.Create("", 21885), Tuple.Create<System.Object, System.Int32>(Url.Action(MVC.API.DeviceModel.Image(assignment.Device.DeviceModel.Id, assignment.Device.DeviceModel.ImageHash()))
#line default
#line hidden
, 21901), false)
, 21885), false)
);
WriteLiteral(" />\r\n </a>\r\n");
@@ -1221,14 +1221,14 @@ WriteLiteral(" class=\"User_Show_AssignedDevices_CurrentAssignment_Image\"");
WriteLiteral(" alt=\"Model Image\"");
WriteAttribute("src", Tuple.Create(" src=\"", 22328), Tuple.Create("\"", 22449)
WriteAttribute("src", Tuple.Create(" src=\"", 22312), Tuple.Create("\"", 22433)
#line 350 "..\..\Views\User\UserParts\_Subject.cshtml"
, Tuple.Create(Tuple.Create("", 22334), Tuple.Create<System.Object, System.Int32>(Url.Action(MVC.API.DeviceModel.Image(assignment.Device.DeviceModel.Id, assignment.Device.DeviceModel.ImageHash()))
, Tuple.Create(Tuple.Create("", 22318), Tuple.Create<System.Object, System.Int32>(Url.Action(MVC.API.DeviceModel.Image(assignment.Device.DeviceModel.Id, assignment.Device.DeviceModel.ImageHash()))
#line default
#line hidden
, 22334), false)
, 22318), false)
);
WriteLiteral(" />\r\n");