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\Jobs\Noticeboards\IHeldDeviceItem.cs" />
<Compile Include="Services\Messaging\Email.cs" /> <Compile Include="Services\Messaging\Email.cs" />
<Compile Include="Services\Messaging\EmailAttachment.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\UserContact.cs" />
<Compile Include="Services\Users\Contact\UserContactType.cs" /> <Compile Include="Services\Users\Contact\UserContactType.cs" />
<Compile Include="Services\Searching\DeviceSearchResultItem.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.BI.Config;
using Disco.Models.Services.Documents; using Disco.Models.Services.Documents;
using Disco.Models.Services.Jobs.JobLists; using Disco.Models.Services.Jobs.JobLists;
using Disco.Models.Services.Plugins.Details;
using System.Collections.Generic; using System.Collections.Generic;
namespace Disco.Models.UI.Device namespace Disco.Models.UI.Device
@@ -21,7 +20,7 @@ namespace Disco.Models.UI.Device
List<Repository.DocumentTemplate> DocumentTemplates { get; set; } List<Repository.DocumentTemplate> DocumentTemplates { get; set; }
List<DocumentTemplatePackage> DocumentTemplatePackages { get; set; } List<DocumentTemplatePackage> DocumentTemplatePackages { get; set; }
DetailsResult AssignedUserDetails { get; set; } Dictionary<string, string> AssignedUserDetails { get; set; }
bool HasAssignedUserPhoto { get; set; } bool HasAssignedUserPhoto { get; set; }
} }
} }
+1 -2
View File
@@ -1,7 +1,6 @@
using Disco.Models.Services.Documents; using Disco.Models.Services.Documents;
using Disco.Models.Services.Job; using Disco.Models.Services.Job;
using Disco.Models.Services.Jobs.JobLists; using Disco.Models.Services.Jobs.JobLists;
using Disco.Models.Services.Plugins.Details;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@@ -18,7 +17,7 @@ namespace Disco.Models.UI.Job
LocationModes LocationMode { get; set; } LocationModes LocationMode { get; set; }
List<JobLocationReference> LocationOptions { get; set; } List<JobLocationReference> LocationOptions { get; set; }
DetailsResult UserDetails { get; set; } Dictionary<string, string> UserDetails { get; set; }
bool HasUserPhoto { get; set; } bool HasUserPhoto { get; set; }
} }
} }
+1 -2
View File
@@ -2,7 +2,6 @@
using Disco.Models.Services.Authorization; using Disco.Models.Services.Authorization;
using Disco.Models.Services.Documents; using Disco.Models.Services.Documents;
using Disco.Models.Services.Jobs.JobLists; using Disco.Models.Services.Jobs.JobLists;
using Disco.Models.Services.Plugins.Details;
using System.Collections.Generic; using System.Collections.Generic;
namespace Disco.Models.UI.User namespace Disco.Models.UI.User
@@ -18,7 +17,7 @@ namespace Disco.Models.UI.User
IAuthorizationToken AuthorizationToken { get; set; } IAuthorizationToken AuthorizationToken { get; set; }
IClaimNavigatorItem ClaimNavigator { get; set; } IClaimNavigatorItem ClaimNavigator { get; set; }
DetailsResult UserDetails { get; set; } Dictionary<string, string> UserDetails { get; set; }
bool HasUserPhoto { get; set; } bool HasUserPhoto { get; set; }
} }
} }
@@ -61,7 +61,7 @@ namespace Disco.Services.Devices.Exporting
if (Options.AssignedUserDetailCustom && r.AssignedUser != null) if (Options.AssignedUserDetailCustom && r.AssignedUser != null)
{ {
var detailsService = new DetailsProviderService(Database); 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) 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) 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) 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.Data.Repository;
using Disco.Models.Repository; using Disco.Models.Repository;
using Disco.Models.Services.Plugins.Details;
using System; using System;
namespace Disco.Services.Plugins.Features.DetailsProvider namespace Disco.Services.Plugins.Features.DetailsProvider
@@ -8,9 +7,8 @@ namespace Disco.Services.Plugins.Features.DetailsProvider
[PluginFeatureCategory(DisplayName = "Detail Providers")] [PluginFeatureCategory(DisplayName = "Detail Providers")]
public abstract class DetailsProviderFeature : PluginFeature public abstract class DetailsProviderFeature : PluginFeature
{ {
public abstract DetailsResult GetDetails(DiscoDataContext database, User user, DateTime? cacheTimestamp); public abstract void UpdateAllDetails(DiscoDataContext database);
[Obsolete("Never used")]
public abstract DetailsResult GetDetails(DiscoDataContext database, Device device, DateTime? cacheTimestamp);
public abstract byte[] GetUserPhoto(DiscoDataContext database, User user, DateTime? cacheTimestamp); public abstract byte[] GetUserPhoto(DiscoDataContext database, User user, DateTime? cacheTimestamp);
} }
} }
@@ -1,10 +1,9 @@
using Disco.Data.Repository; using Disco.Data.Repository;
using Disco.Models.Repository; using Disco.Models.Repository;
using Disco.Models.Services.Plugins.Details;
using Disco.Services.Authorization; using Disco.Services.Authorization;
using Disco.Services.Users; using Disco.Services.Users;
using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.IO; using System.IO;
using System.Linq; 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"); 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)) if (!UserService.CurrentAuthorization.HasAll(Claims.User.Show, Claims.User.ShowDetails))
return result; return new Dictionary<string, string>();
var features = Plugins.GetPluginFeatures(typeof(DetailsProviderFeature)); if (user.UserDetails != null)
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)
{ {
var featureResult = default(DetailsResult); return user.UserDetails
if (!cache.TryGetValue(feature.Id, out var cacheResult) || cacheResult.Details.ExpiresOn < DateTime.Now || cacheResult.Details.GatheredOn < database.DiscoConfiguration.PluginDetailsCacheExpiration) .Where(d => string.Equals(d.Scope, DetailsScope, StringComparison.Ordinal))
.ToDictionary(d => d.Key, d => d.Value, StringComparer.OrdinalIgnoreCase);
} else
{ {
var timestamp = cacheResult?.Details.GatheredOn; return database.UserDetails
if (timestamp.HasValue && timestamp.Value < database.DiscoConfiguration.PluginDetailsCacheExpiration) .Where(d => d.UserId == user.UserId &&
timestamp = null; d.Scope == DetailsScope)
.ToDictionary(d => d.Key, d => d.Value, StringComparer.OrdinalIgnoreCase);
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;
}
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); user = database.Users.First(u => u.UserId == user.UserId);
var details = service.GetDetails(user); var details = service.GetDetails(user);
if ((details?.Details?.Count ?? 0) == 0) if ((details?.Count ?? 0) == 0)
yield break; yield break;
foreach (var item in details.Details) foreach (var item in details)
{ {
if (!contactType.HasValue || contactType.Value.HasFlag(UserContactType.Email)) if (!contactType.HasValue || contactType.Value.HasFlag(UserContactType.Email))
{ {
@@ -283,8 +283,11 @@ namespace Disco.Web.Controllers
m.DeviceProfileWirelessProfileProviders = m.Device.DeviceProfile.GetWirelessProfileProviders().ToList(); m.DeviceProfileWirelessProfileProviders = m.Device.DeviceProfile.GetWirelessProfileProviders().ToList();
} }
if (Authorization.Has(Claims.User.ShowDetails))
{
// Populate Custom Details // Populate Custom Details
m.PopulateDetails(Database); m.PopulateDetails(Database);
}
// UI Extensions // UI Extensions
UIExtensions.ExecuteExtensions<DeviceShowModel>(this.ControllerContext, m); UIExtensions.ExecuteExtensions<DeviceShowModel>(this.ControllerContext, m);
+3
View File
@@ -377,7 +377,10 @@ namespace Disco.Web.Controllers
} }
// Populate Custom Details // Populate Custom Details
if (Authorization.Has(Claims.User.ShowDetails))
{
m.PopulateDetails(Database); m.PopulateDetails(Database);
}
// UI Extensions // UI Extensions
UIExtensions.ExecuteExtensions<JobShowModel>(this.ControllerContext, m); UIExtensions.ExecuteExtensions<JobShowModel>(this.ControllerContext, m);
+3
View File
@@ -114,7 +114,10 @@ namespace Disco.Web.Controllers
} }
// Populate Custom Details // Populate Custom Details
if (Authorization.Has(Claims.User.ShowDetails))
{
m.PopulateDetails(Database); m.PopulateDetails(Database);
}
// UI Extensions // UI Extensions
UIExtensions.ExecuteExtensions<UserShowModel>(this.ControllerContext, m); UIExtensions.ExecuteExtensions<UserShowModel>(this.ControllerContext, m);
+1 -2
View File
@@ -1,6 +1,5 @@
using Disco.Models.Services.Documents; using Disco.Models.Services.Documents;
using Disco.Models.Services.Jobs.JobLists; using Disco.Models.Services.Jobs.JobLists;
using Disco.Models.Services.Plugins.Details;
using Disco.Models.UI.Device; using Disco.Models.UI.Device;
using Disco.Services.Plugins; using Disco.Services.Plugins;
using Disco.Services.Plugins.Features.DocumentHandlerProvider; using Disco.Services.Plugins.Features.DocumentHandlerProvider;
@@ -35,7 +34,7 @@ namespace Disco.Web.Models.Device
HandlersPresent = Plugins.GetPluginFeatures(typeof(DocumentHandlerProviderFeature)).Any(), HandlersPresent = Plugins.GetPluginFeatures(typeof(DocumentHandlerProviderFeature)).Any(),
}; };
public DetailsResult AssignedUserDetails { get; set; } public Dictionary<string, string> AssignedUserDetails { get; set; }
public bool HasAssignedUserPhoto { get; set; } public bool HasAssignedUserPhoto { get; set; }
} }
} }
+1 -2
View File
@@ -1,7 +1,6 @@
using Disco.Models.Services.Documents; using Disco.Models.Services.Documents;
using Disco.Models.Services.Job; using Disco.Models.Services.Job;
using Disco.Models.Services.Jobs.JobLists; using Disco.Models.Services.Jobs.JobLists;
using Disco.Models.Services.Plugins.Details;
using Disco.Models.UI.Job; using Disco.Models.UI.Job;
using Disco.Services.Plugins; using Disco.Services.Plugins;
using Disco.Services.Plugins.Features.DocumentHandlerProvider; using Disco.Services.Plugins.Features.DocumentHandlerProvider;
@@ -34,7 +33,7 @@ namespace Disco.Web.Models.Job
public LocationModes LocationMode { get; set; } public LocationModes LocationMode { get; set; }
public List<JobLocationReference> LocationOptions { 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; } public bool HasUserPhoto { get; set; }
} }
} }
+1 -2
View File
@@ -2,7 +2,6 @@
using Disco.Models.Services.Authorization; using Disco.Models.Services.Authorization;
using Disco.Models.Services.Documents; using Disco.Models.Services.Documents;
using Disco.Models.Services.Jobs.JobLists; using Disco.Models.Services.Jobs.JobLists;
using Disco.Models.Services.Plugins.Details;
using Disco.Models.UI.User; using Disco.Models.UI.User;
using Disco.Services.Plugins; using Disco.Services.Plugins;
using Disco.Services.Plugins.Features.DocumentHandlerProvider; using Disco.Services.Plugins.Features.DocumentHandlerProvider;
@@ -31,7 +30,7 @@ namespace Disco.Web.Models.User
public IAuthorizationToken AuthorizationToken { get; set; } public IAuthorizationToken AuthorizationToken { get; set; }
public IClaimNavigatorItem ClaimNavigator { 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 bool HasUserPhoto { get; set; }
public FancyTreeNode[] ClaimNavigatorFancyTreeNodes public FancyTreeNode[] ClaimNavigatorFancyTreeNodes
@@ -272,10 +272,10 @@
</script> </script>
</div> </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"> <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> <div>
<strong>@detail.Key.TrimEnd('*'):</strong> <strong>@detail.Key.TrimEnd('*'):</strong>
@@ -1212,7 +1212,7 @@ WriteLiteral(" ");
#line 275 "..\..\Views\Device\DeviceParts\_Subject.cshtml" #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 hidden
#line 278 "..\..\Views\Device\DeviceParts\_Subject.cshtml" #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\""); WriteLiteral(" name=\"DeviceProfile\"");
WriteAttribute("id", Tuple.Create(" id=\"", 25287), Tuple.Create("\"", 25314) WriteAttribute("id", Tuple.Create(" id=\"", 25271), Tuple.Create("\"", 25298)
, Tuple.Create(Tuple.Create("", 25292), Tuple.Create("DeviceProfile_", 25292), true) , Tuple.Create(Tuple.Create("", 25276), Tuple.Create("DeviceProfile_", 25276), true)
#line 397 "..\..\Views\Device\DeviceParts\_Subject.cshtml" #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 default
#line hidden #line hidden
, 25306), false) , 25290), false)
); );
WriteLiteral(" /><label"); WriteLiteral(" /><label");
WriteAttribute("for", Tuple.Create(" for=\"", 25324), Tuple.Create("\"", 25352) WriteAttribute("for", Tuple.Create(" for=\"", 25308), Tuple.Create("\"", 25336)
, Tuple.Create(Tuple.Create("", 25330), Tuple.Create("DeviceProfile_", 25330), true) , Tuple.Create(Tuple.Create("", 25314), Tuple.Create("DeviceProfile_", 25314), true)
#line 397 "..\..\Views\Device\DeviceParts\_Subject.cshtml" #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 default
#line hidden #line hidden
, 25344), false) , 25328), false)
); );
WriteAttribute("title", Tuple.Create(" title=\"", 25353), Tuple.Create("\"", 25397) WriteAttribute("title", Tuple.Create(" title=\"", 25337), Tuple.Create("\"", 25381)
, Tuple.Create(Tuple.Create("", 25361), Tuple.Create("Distribution:", 25361), true) , Tuple.Create(Tuple.Create("", 25345), Tuple.Create("Distribution:", 25345), true)
#line 397 "..\..\Views\Device\DeviceParts\_Subject.cshtml" #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 default
#line hidden #line hidden
, 25375), false) , 25359), false)
); );
WriteLiteral(">"); WriteLiteral(">");
@@ -1933,14 +1933,14 @@ WriteLiteral(" title=\"Warranty Valid Until\"");
WriteLiteral(">Warranty Until:</span>\r\n </td>\r\n " + WriteLiteral(">Warranty Until:</span>\r\n </td>\r\n " +
" <td"); " <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" #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 default
#line hidden #line hidden
, 31065), false) , 31049), false)
); );
WriteLiteral(">\r\n"); WriteLiteral(">\r\n");
@@ -1981,14 +1981,14 @@ WriteLiteral(" title=\"Insured Until\"");
WriteLiteral(">Insured Until:</span>\r\n </td>\r\n " + WriteLiteral(">Insured Until:</span>\r\n </td>\r\n " +
" <td"); " <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" #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 default
#line hidden #line hidden
, 32067), false) , 32051), false)
); );
WriteLiteral(">\r\n"); WriteLiteral(">\r\n");
@@ -2094,39 +2094,39 @@ WriteLiteral("\"");
WriteLiteral(" name=\"DeviceBatch\""); WriteLiteral(" name=\"DeviceBatch\"");
WriteAttribute("id", Tuple.Create(" id=\"", 33383), Tuple.Create("\"", 33408) WriteAttribute("id", Tuple.Create(" id=\"", 33367), Tuple.Create("\"", 33392)
, Tuple.Create(Tuple.Create("", 33388), Tuple.Create("DeviceBatch_", 33388), true) , Tuple.Create(Tuple.Create("", 33372), Tuple.Create("DeviceBatch_", 33372), true)
#line 527 "..\..\Views\Device\DeviceParts\_Subject.cshtml" #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 default
#line hidden #line hidden
, 33400), false) , 33384), false)
); );
WriteLiteral(" /><label"); WriteLiteral(" /><label");
WriteAttribute("for", Tuple.Create(" for=\"", 33418), Tuple.Create("\"", 33444) WriteAttribute("for", Tuple.Create(" for=\"", 33402), Tuple.Create("\"", 33428)
, Tuple.Create(Tuple.Create("", 33424), Tuple.Create("DeviceBatch_", 33424), true) , Tuple.Create(Tuple.Create("", 33408), Tuple.Create("DeviceBatch_", 33408), true)
#line 527 "..\..\Views\Device\DeviceParts\_Subject.cshtml" #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 default
#line hidden #line hidden
, 33436), false) , 33420), false)
); );
WriteAttribute("title", Tuple.Create(" title=\"", 33445), Tuple.Create("\"", 33501) WriteAttribute("title", Tuple.Create(" title=\"", 33429), Tuple.Create("\"", 33485)
, Tuple.Create(Tuple.Create("", 33453), Tuple.Create("Purchased:", 33453), true) , Tuple.Create(Tuple.Create("", 33437), Tuple.Create("Purchased:", 33437), true)
#line 527 "..\..\Views\Device\DeviceParts\_Subject.cshtml" #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 default
#line hidden #line hidden
, 33464), false) , 33448), false)
); );
WriteLiteral(">"); WriteLiteral(">");
@@ -2285,14 +2285,14 @@ WriteLiteral(" id=\"Device_Show_Aspects_Model_Image\"");
WriteLiteral(" alt=\"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" #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 default
#line hidden #line hidden
, 38254), false) , 38238), false)
); );
WriteLiteral(" />\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n <t" + 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\""); WriteLiteral(" type=\"radio\"");
WriteAttribute("id", Tuple.Create(" id=\"", 49923), Tuple.Create("\"", 50001) WriteAttribute("id", Tuple.Create(" id=\"", 49907), Tuple.Create("\"", 49985)
, Tuple.Create(Tuple.Create("", 49928), Tuple.Create("Device_Show_Device_Actions_Decommission_Reason_", 49928), true) , Tuple.Create(Tuple.Create("", 49912), Tuple.Create("Device_Show_Device_Actions_Decommission_Reason_", 49912), true)
#line 808 "..\..\Views\Device\DeviceParts\_Subject.cshtml" #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 default
#line hidden #line hidden
, 49975), false) , 49959), false)
); );
WriteLiteral("\r\n name=\"Device_Show_Device_Actions_Dec" + WriteLiteral("\r\n name=\"Device_Show_Device_Actions_Dec" +
"ommission_Reason\""); "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" #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 default
#line hidden #line hidden
, 50108), false) , 50092), false)
); );
WriteLiteral(" "); WriteLiteral(" ");
@@ -2818,15 +2818,15 @@ WriteLiteral(" ");
#line hidden #line hidden
WriteLiteral(" />\r\n <label"); WriteLiteral(" />\r\n <label");
WriteAttribute("for", Tuple.Create(" for=\"", 50278), Tuple.Create("\"", 50357) WriteAttribute("for", Tuple.Create(" for=\"", 50262), Tuple.Create("\"", 50341)
, Tuple.Create(Tuple.Create("", 50284), Tuple.Create("Device_Show_Device_Actions_Decommission_Reason_", 50284), true) , Tuple.Create(Tuple.Create("", 50268), Tuple.Create("Device_Show_Device_Actions_Decommission_Reason_", 50268), true)
#line 810 "..\..\Views\Device\DeviceParts\_Subject.cshtml" #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 default
#line hidden #line hidden
, 50331), false) , 50315), false)
); );
WriteLiteral(">"); WriteLiteral(">");
+2 -2
View File
@@ -499,10 +499,10 @@
Since: <span data-livestamp="@Model.Job.WaitingForUserAction.ToUnixEpoc()">@Model.Job.WaitingForUserAction.ToFullDateTime()</span> Since: <span data-livestamp="@Model.Job.WaitingForUserAction.ToUnixEpoc()">@Model.Job.WaitingForUserAction.ToFullDateTime()</span>
</div> </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"> <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> <div>
<strong>@detail.Key.TrimEnd('*'):</strong> <strong>@detail.Key.TrimEnd('*'):</strong>
@@ -1959,7 +1959,7 @@ WriteLiteral(" ");
#line 502 "..\..\Views\Job\JobParts\_Subject.cshtml" #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 hidden
#line 505 "..\..\Views\Job\JobParts\_Subject.cshtml" #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\""); 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" #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 default
#line hidden #line hidden
, 47120), false) , 47104), false)
); );
WriteLiteral(" />\r\n"); WriteLiteral(" />\r\n");
@@ -2628,26 +2628,26 @@ WriteLiteral("\"");
WriteLiteral(">\r\n <i"); WriteLiteral(">\r\n <i");
WriteAttribute("class", Tuple.Create(" class=\"", 47602), Tuple.Create("\"", 47669) WriteAttribute("class", Tuple.Create(" class=\"", 47586), Tuple.Create("\"", 47653)
, Tuple.Create(Tuple.Create("", 47610), Tuple.Create("fa", 47610), true) , Tuple.Create(Tuple.Create("", 47594), Tuple.Create("fa", 47594), true)
, Tuple.Create(Tuple.Create(" ", 47612), Tuple.Create("fa-", 47613), true) , Tuple.Create(Tuple.Create(" ", 47596), Tuple.Create("fa-", 47597), true)
#line 738 "..\..\Views\Job\JobParts\_Subject.cshtml" #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 default
#line hidden #line hidden
, 47616), false) , 47600), false)
, Tuple.Create(Tuple.Create(" ", 47632), Tuple.Create("fa-fw", 47633), true) , Tuple.Create(Tuple.Create(" ", 47616), Tuple.Create("fa-fw", 47617), true)
, Tuple.Create(Tuple.Create(" ", 47638), Tuple.Create("fa-lg", 47639), true) , Tuple.Create(Tuple.Create(" ", 47622), Tuple.Create("fa-lg", 47623), true)
, Tuple.Create(Tuple.Create(" ", 47644), Tuple.Create("d-", 47645), true) , Tuple.Create(Tuple.Create(" ", 47628), Tuple.Create("d-", 47629), true)
#line 738 "..\..\Views\Job\JobParts\_Subject.cshtml" #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 default
#line hidden #line hidden
, 47647), false) , 47631), false)
); );
WriteLiteral("></i>"); WriteLiteral("></i>");
@@ -2688,27 +2688,27 @@ WriteLiteral(" ");
#line hidden #line hidden
WriteLiteral(" <i"); WriteLiteral(" <i");
WriteAttribute("class", Tuple.Create(" class=\"", 48066), Tuple.Create("\"", 48114) WriteAttribute("class", Tuple.Create(" class=\"", 48050), Tuple.Create("\"", 48098)
, Tuple.Create(Tuple.Create("", 48074), Tuple.Create("fa", 48074), true) , Tuple.Create(Tuple.Create("", 48058), Tuple.Create("fa", 48058), true)
, Tuple.Create(Tuple.Create(" ", 48076), Tuple.Create("d-priority-", 48077), true) , Tuple.Create(Tuple.Create(" ", 48060), Tuple.Create("d-priority-", 48061), true)
#line 745 "..\..\Views\Job\JobParts\_Subject.cshtml" #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 default
#line hidden #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" #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 default
#line hidden #line hidden
, 48123), false) , 48107), false)
, Tuple.Create(Tuple.Create(" ", 48139), Tuple.Create("Priority", 48140), true) , Tuple.Create(Tuple.Create(" ", 48123), Tuple.Create("Priority", 48124), true)
); );
WriteLiteral("></i>\r\n </div>\r\n <div>\r\n " + WriteLiteral("></i>\r\n </div>\r\n <div>\r\n " +
@@ -72,11 +72,11 @@
</table> </table>
</div> </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"> <div id="User_Show_CustomDetails" class="status clearfix">
<table class="none verticalHeadings"> <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> <tr>
<td>@detail.Key.TrimEnd('*'):</td> <td>@detail.Key.TrimEnd('*'):</td>
@@ -375,7 +375,7 @@ WriteLiteral(" ");
#line 75 "..\..\Views\User\UserParts\_Subject.cshtml" #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 hidden
#line 79 "..\..\Views\User\UserParts\_Subject.cshtml" #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\""); 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" #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 default
#line hidden #line hidden
, 8651), false) , 8635), false)
); );
WriteLiteral(@" /> WriteLiteral(@" />
@@ -929,14 +929,14 @@ WriteLiteral(" type=\"hidden\"");
WriteLiteral(" name=\"UserId\""); 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" #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 default
#line hidden #line hidden
, 15839), false) , 15823), false)
); );
WriteLiteral(" />\r\n"); WriteLiteral(" />\r\n");
@@ -978,26 +978,26 @@ WriteLiteral("\"");
WriteLiteral(">\r\n <i"); WriteLiteral(">\r\n <i");
WriteAttribute("class", Tuple.Create(" class=\"", 16231), Tuple.Create("\"", 16298) WriteAttribute("class", Tuple.Create(" class=\"", 16215), Tuple.Create("\"", 16282)
, Tuple.Create(Tuple.Create("", 16239), Tuple.Create("fa", 16239), true) , Tuple.Create(Tuple.Create("", 16223), Tuple.Create("fa", 16223), true)
, Tuple.Create(Tuple.Create(" ", 16241), Tuple.Create("fa-", 16242), true) , Tuple.Create(Tuple.Create(" ", 16225), Tuple.Create("fa-", 16226), true)
#line 250 "..\..\Views\User\UserParts\_Subject.cshtml" #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 default
#line hidden #line hidden
, 16245), false) , 16229), false)
, Tuple.Create(Tuple.Create(" ", 16261), Tuple.Create("fa-fw", 16262), true) , Tuple.Create(Tuple.Create(" ", 16245), Tuple.Create("fa-fw", 16246), true)
, Tuple.Create(Tuple.Create(" ", 16267), Tuple.Create("fa-lg", 16268), true) , Tuple.Create(Tuple.Create(" ", 16251), Tuple.Create("fa-lg", 16252), true)
, Tuple.Create(Tuple.Create(" ", 16273), Tuple.Create("d-", 16274), true) , Tuple.Create(Tuple.Create(" ", 16257), Tuple.Create("d-", 16258), true)
#line 250 "..\..\Views\User\UserParts\_Subject.cshtml" #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 default
#line hidden #line hidden
, 16276), false) , 16260), false)
); );
WriteLiteral("></i>"); WriteLiteral("></i>");
@@ -1178,14 +1178,14 @@ WriteLiteral(">\r\n");
#line hidden #line hidden
WriteLiteral(" <a"); 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" #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 default
#line hidden #line hidden
, 21703), false) , 21687), false)
); );
WriteLiteral(">\r\n <img"); WriteLiteral(">\r\n <img");
@@ -1194,14 +1194,14 @@ WriteLiteral(" class=\"User_Show_AssignedDevices_CurrentAssignment_Image\"");
WriteLiteral(" alt=\"Model 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" #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 default
#line hidden #line hidden
, 21901), false) , 21885), false)
); );
WriteLiteral(" />\r\n </a>\r\n"); WriteLiteral(" />\r\n </a>\r\n");
@@ -1221,14 +1221,14 @@ WriteLiteral(" class=\"User_Show_AssignedDevices_CurrentAssignment_Image\"");
WriteLiteral(" alt=\"Model 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" #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 default
#line hidden #line hidden
, 22334), false) , 22318), false)
); );
WriteLiteral(" />\r\n"); WriteLiteral(" />\r\n");