diff --git a/Disco.Data/Disco.Data.csproj b/Disco.Data/Disco.Data.csproj index f41fd7c7..75b5b87a 100644 --- a/Disco.Data/Disco.Data.csproj +++ b/Disco.Data/Disco.Data.csproj @@ -175,6 +175,10 @@ 202304150715559_DBv22.cs + + + 202401130531317_DBv23.cs + @@ -256,6 +260,9 @@ 202304150715559_DBv22.cs + + 202401130531317_DBv23.cs + ResXFileCodeGenerator Resources.Designer.cs diff --git a/Disco.Data/Migrations/202401130531317_DBv23.Designer.cs b/Disco.Data/Migrations/202401130531317_DBv23.Designer.cs new file mode 100644 index 00000000..eb73b451 --- /dev/null +++ b/Disco.Data/Migrations/202401130531317_DBv23.Designer.cs @@ -0,0 +1,27 @@ +// +namespace Disco.Data.Migrations +{ + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + public sealed partial class DBv23 : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(DBv23)); + + string IMigrationMetadata.Id + { + get { return "202401130531317_DBv23"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/Disco.Data/Migrations/202401130531317_DBv23.cs b/Disco.Data/Migrations/202401130531317_DBv23.cs new file mode 100644 index 00000000..aacc11a2 --- /dev/null +++ b/Disco.Data/Migrations/202401130531317_DBv23.cs @@ -0,0 +1,67 @@ +namespace Disco.Data.Migrations +{ + using System; + using System.Data.Entity.Migrations; + + public partial class DBv23 : DbMigration + { + public override void Up() + { + CreateTable( + "dbo.DeviceFlagAssignments", + c => new + { + Id = c.Int(nullable: false, identity: true), + DeviceFlagId = c.Int(nullable: false), + DeviceSerialNumber = c.String(nullable: false, maxLength: 60), + AddedDate = c.DateTime(nullable: false), + AddedUserId = c.String(nullable: false, maxLength: 50), + RemovedDate = c.DateTime(), + RemovedUserId = c.String(maxLength: 50), + Comments = c.String(), + OnAssignmentExpressionResult = c.String(), + OnUnassignmentExpressionResult = c.String(), + }) + .PrimaryKey(t => t.Id) + .ForeignKey("dbo.DeviceFlags", t => t.DeviceFlagId) + .ForeignKey("dbo.Devices", t => t.DeviceSerialNumber) + .ForeignKey("dbo.Users", t => t.AddedUserId) + .ForeignKey("dbo.Users", t => t.RemovedUserId) + .Index(t => t.DeviceFlagId) + .Index(t => t.DeviceSerialNumber) + .Index(t => t.AddedUserId) + .Index(t => t.RemovedUserId); + + CreateTable( + "dbo.DeviceFlags", + c => new + { + Id = c.Int(nullable: false, identity: true), + Name = c.String(nullable: false, maxLength: 100), + Description = c.String(maxLength: 500), + Icon = c.String(nullable: false, maxLength: 25), + IconColour = c.String(nullable: false, maxLength: 10), + DevicesLinkedGroup = c.String(), + DeviceUsersLinkedGroup = c.String(), + OnAssignmentExpression = c.String(), + OnUnassignmentExpression = c.String(), + }) + .PrimaryKey(t => t.Id); + + } + + public override void Down() + { + DropIndex("dbo.DeviceFlagAssignments", new[] { "RemovedUserId" }); + DropIndex("dbo.DeviceFlagAssignments", new[] { "AddedUserId" }); + DropIndex("dbo.DeviceFlagAssignments", new[] { "DeviceSerialNumber" }); + DropIndex("dbo.DeviceFlagAssignments", new[] { "DeviceFlagId" }); + DropForeignKey("dbo.DeviceFlagAssignments", "RemovedUserId", "dbo.Users"); + DropForeignKey("dbo.DeviceFlagAssignments", "AddedUserId", "dbo.Users"); + DropForeignKey("dbo.DeviceFlagAssignments", "DeviceSerialNumber", "dbo.Devices"); + DropForeignKey("dbo.DeviceFlagAssignments", "DeviceFlagId", "dbo.DeviceFlags"); + DropTable("dbo.DeviceFlags"); + DropTable("dbo.DeviceFlagAssignments"); + } + } +} diff --git a/Disco.Data/Migrations/202401130531317_DBv23.resx b/Disco.Data/Migrations/202401130531317_DBv23.resx new file mode 100644 index 00000000..195242e1 --- /dev/null +++ b/Disco.Data/Migrations/202401130531317_DBv23.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + \ No newline at end of file diff --git a/Disco.Data/Repository/DiscoDataContext.cs b/Disco.Data/Repository/DiscoDataContext.cs index 895eab7e..119019d1 100644 --- a/Disco.Data/Repository/DiscoDataContext.cs +++ b/Disco.Data/Repository/DiscoDataContext.cs @@ -1,9 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using Disco.Models.Repository; +using System; using System.Data.Entity; -using Disco.Models.Repository; using System.Data.Entity.ModelConfiguration.Conventions; namespace Disco.Data.Repository @@ -38,6 +35,8 @@ namespace Disco.Data.Repository public virtual DbSet DeviceBatchAttachments { get; set; } public virtual DbSet DeviceComponents { get; set; } public virtual DbSet DeviceAttachments { get; set; } + public virtual DbSet DeviceFlags { get; set; } + public virtual DbSet DeviceFlagAssignments { get; set; } public virtual DbSet DeviceCertificates { get; set; } diff --git a/Disco.Models/Disco.Models.csproj b/Disco.Models/Disco.Models.csproj index 1349a79a..79a19d4d 100644 --- a/Disco.Models/Disco.Models.csproj +++ b/Disco.Models/Disco.Models.csproj @@ -52,6 +52,10 @@ + + + + @@ -198,6 +202,10 @@ + + + + diff --git a/Disco.Models/Repository/Device/Device.cs b/Disco.Models/Repository/Device/Device.cs index 47564046..c0c515df 100644 --- a/Disco.Models/Repository/Device/Device.cs +++ b/Disco.Models/Repository/Device/Device.cs @@ -51,6 +51,7 @@ namespace Disco.Models.Repository [InverseProperty("DeviceSerialNumber")] public virtual IList Jobs { get; set; } + public virtual IList DeviceFlagAssignments { get; set; } public override string ToString() { diff --git a/Disco.Models/Repository/Device/Flag/DeviceFlag.cs b/Disco.Models/Repository/Device/Flag/DeviceFlag.cs new file mode 100644 index 00000000..1f098eb3 --- /dev/null +++ b/Disco.Models/Repository/Device/Flag/DeviceFlag.cs @@ -0,0 +1,37 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; + +namespace Disco.Models.Repository +{ + public class DeviceFlag + { + [Key] + public int Id { get; set; } + + [Required, StringLength(100)] + public string Name { get; set; } + + [StringLength(500), DataType(DataType.MultilineText)] + public string Description { get; set; } + + [Required, StringLength(25)] + public string Icon { get; set; } + [Required, StringLength(10)] + public string IconColour { get; set; } + + public string DevicesLinkedGroup { get; set; } + public string DeviceUsersLinkedGroup { get; set; } + + [DataType(DataType.MultilineText)] + public string OnAssignmentExpression { get; set; } + [DataType(DataType.MultilineText)] + public string OnUnassignmentExpression { get; set; } + + public virtual IList DeviceFlagAssignments { get; set; } + + public override string ToString() + { + return Name; + } + } +} diff --git a/Disco.Models/Repository/Device/Flag/DeviceFlagAssignment.cs b/Disco.Models/Repository/Device/Flag/DeviceFlagAssignment.cs new file mode 100644 index 00000000..f73f8ec6 --- /dev/null +++ b/Disco.Models/Repository/Device/Flag/DeviceFlagAssignment.cs @@ -0,0 +1,44 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Disco.Models.Repository +{ + public class DeviceFlagAssignment + { + [Key] + public int Id { get; set; } + [Required] + public int DeviceFlagId { get; set; } + [Required] + public string DeviceSerialNumber { get; set; } + + [Required] + public DateTime AddedDate { get; set; } + [Required] + public string AddedUserId { get; set; } + public DateTime? RemovedDate { get; set; } + public string RemovedUserId { get; set; } + + public string Comments { get; set; } + + public string OnAssignmentExpressionResult { get; set; } + public string OnUnassignmentExpressionResult { get; set; } + + [ForeignKey(nameof(DeviceFlagId)), InverseProperty("DeviceFlagAssignments")] + public virtual DeviceFlag DeviceFlag { get; set; } + + [ForeignKey(nameof(DeviceSerialNumber)), InverseProperty("DeviceFlagAssignments")] + public virtual Device Device { get; set; } + + [ForeignKey("AddedUserId")] + public virtual User AddedUser { get; set; } + [ForeignKey("RemovedUserId")] + public virtual User RemovedUser { get; set; } + + public override string ToString() + { + return $"Device Flag Id: {DeviceFlagId}; Device Serial Number: {DeviceSerialNumber}; Added: {AddedDate:s}"; + } + } +} diff --git a/Disco.Models/Services/Devices/DeviceFlags/DeviceFlagExportOptions.cs b/Disco.Models/Services/Devices/DeviceFlags/DeviceFlagExportOptions.cs new file mode 100644 index 00000000..a539fc1f --- /dev/null +++ b/Disco.Models/Services/Devices/DeviceFlags/DeviceFlagExportOptions.cs @@ -0,0 +1,192 @@ +using Disco.Models.Exporting; +using Disco.Models.Services.Exporting; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; + +namespace Disco.Models.Services.Devices.DeviceFlag +{ + public class DeviceFlagExportOptions : IExportOptions + { + public ExportFormat Format { get; set; } + public string FilenamePrefix { get; } = "DiscoDeviceFlagExport"; + public string ExcelWorksheetName { get; } = "DeviceFlagExport"; + public string ExcelTableName { get; } = "DeviceFlags"; + + [Required] + public List DeviceFlagIds { get; set; } = new List(); + + [Display(Name = "Current Only")] + public bool CurrentOnly { get; set; } + + // Device Flag + [Display(ShortName = "Device Flag", Name = "Identifier", Description = "The identifier of the device flag")] + public bool Id { get; set; } + [Display(ShortName = "Device Flag", Name = "Name", Description = "The name of the device flag")] + public bool Name { get; set; } + [Display(ShortName = "Device Flag", Name = "Description", Description = "The description of the device flag")] + public bool Description { get; set; } + [Display(ShortName = "Device Flag", Name = "Icon", Description = "The icon assigned to the device flag")] + public bool Icon { get; set; } + [Display(ShortName = "Device Flag", Name = "Icon Colour", Description = "The icon colour assigned to the device flag")] + public bool IconColour { get; set; } + [Display(ShortName = "Device Flag", Name = "Assignment Identifier", Description = "The identifier of the device flag assignment")] + public bool AssignmentId { get; set; } + [Display(ShortName = "Device Flag", Name = "Added Date", Description = "The date the device flag was assigned to the user")] + public bool AddedDate { get; set; } + [Display(ShortName = "Device Flag", Name = "Added User Identifier", Description = "The identifier of the user who assigned the device flag")] + public bool AddedUserId { get; set; } + [Display(ShortName = "Device Flag", Name = "Removed Date", Description = "The date the device flag was unassigned from the user")] + public bool RemovedDate { get; set; } + [Display(ShortName = "Device Flag", Name = "Removed User Identifier", Description = "The identifier of the user who unassigned the device flag")] + public bool RemovedUserId { get; set; } + [Display(ShortName = "Device Flag", Name = "Comments", Description = "The comments associated with the device flag assignment")] + public bool Comments { get; set; } + + // Device + [Display(ShortName = "Device", Name = "Serial Number", Description = "The device serial number")] + public bool DeviceSerialNumber { get; set; } + [Display(ShortName = "Device", Name = "Asset Number", Description = "The device asset number")] + public bool DeviceAssetNumber { get; set; } + [Display(ShortName = "Device", Name = "Location", Description = "The device location")] + public bool DeviceLocation { get; set; } + [Display(ShortName = "Device", Name = "Computer Name", Description = "The device computer name")] + public bool DeviceComputerName { get; set; } + [Display(ShortName = "Device", Name = "Last Network Logon", Description = "The last recorded time the device access the network")] + public bool DeviceLastNetworkLogon { get; set; } + [Display(ShortName = "Device", Name = "Created Date", Description = "The date the device was created in Disco ICT")] + public bool DeviceCreatedDate { get; set; } + [Display(ShortName = "Device", Name = "First Enrolled Date", Description = "The date the device was first enrolled in Disco ICT")] + public bool DeviceFirstEnrolledDate { get; set; } + [Display(ShortName = "Device", Name = "Last Enrolled Date", Description = "The date the device was last enrolled in Disco ICT")] + public bool DeviceLastEnrolledDate { get; set; } + [Display(ShortName = "Device", Name = "Enrolment Trusted", Description = "The device is trusted to complete an unauthenticated enrolment")] + public bool DeviceAllowUnauthenticatedEnrol { get; set; } + [Display(ShortName = "Device", Name = "Decommissioned Date", Description = "The date the device was decommissioned in Disco ICT")] + public bool DeviceDecommissionedDate { get; set; } + [Display(ShortName = "Device", Name = "Decommissioned Reason", Description = "The reason the device was decommissioned")] + public bool DeviceDecommissionedReason { get; set; } + + public bool HasDeviceOptions() + { + return DeviceSerialNumber || + DeviceAssetNumber || + DeviceLocation || + DeviceComputerName || + DeviceLastNetworkLogon || + DeviceCreatedDate || + DeviceFirstEnrolledDate || + DeviceLastEnrolledDate || + DeviceAllowUnauthenticatedEnrol || + DeviceDecommissionedDate || + DeviceDecommissionedReason; + } + + // Model + [Display(ShortName = "Model", Name = "Identifier", Description = "The identifier of the device model associated with the device")] + public bool ModelId { get; set; } + [Display(ShortName = "Model", Name = "Description", Description = "The description of the device model associated with the device")] + public bool ModelDescription { get; set; } + [Display(ShortName = "Model", Name = "Manufacturer", Description = "The manufacturer of the device model associated with the device")] + public bool ModelManufacturer { get; set; } + [Display(ShortName = "Model", Name = "Model", Description = "The model of the device model associated with the device")] + public bool ModelModel { get; set; } + [Display(ShortName = "Model", Name = "Type", Description = "The type of device model associated with the device")] + public bool ModelType { get; set; } + public bool HasDeviceModelOptions() + { + return ModelId || + ModelDescription || + ModelManufacturer || + ModelModel || + ModelType; + } + + // Batch + [Display(ShortName = "Batch", Name = "Identifier", Description = "The identifier of the device batch associated with the device")] + public bool BatchId { get; set; } + [Display(ShortName = "Batch", Name = "Name", Description = "The name of the device batch associated with the device")] + public bool BatchName { get; set; } + [Display(ShortName = "Batch", Name = "Purchase Date", Description = "The purchase date of the device batch associated with the device")] + public bool BatchPurchaseDate { get; set; } + [Display(ShortName = "Batch", Name = "Supplier", Description = "The supplier of the device batch associated with the device")] + public bool BatchSupplier { get; set; } + [Display(ShortName = "Batch", Name = "Unit Cost", Description = "The unit cost of the device batch associated with the device")] + public bool BatchUnitCost { get; set; } + [Display(ShortName = "Batch", Name = "Warranty Valid Until Date", Description = "The warranty valid until date of the device batch associated with the device")] + public bool BatchWarrantyValidUntilDate { get; set; } + [Display(ShortName = "Batch", Name = "Insured Date", Description = "The insured date of the device batch associated with the device")] + public bool BatchInsuredDate { get; set; } + [Display(ShortName = "Batch", Name = "Insurance Supplier", Description = "The insurance supplier of the device batch associated with the device")] + public bool BatchInsuranceSupplier { get; set; } + [Display(ShortName = "Batch", Name = "Insured Until Date", Description = "The insured until date of the device batch associated with the device")] + public bool BatchInsuredUntilDate { get; set; } + public bool HasDeviceBatchOptions() + { + return BatchId || + BatchName || + BatchPurchaseDate || + BatchSupplier || + BatchUnitCost || + BatchWarrantyValidUntilDate || + BatchInsuredDate || + BatchInsuranceSupplier || + BatchInsuredUntilDate; + } + + // Profile + [Display(ShortName = "Profile", Name = "Identifier", Description = "The identifier of the device profile associated with the device")] + public bool ProfileId { get; set; } + [Display(ShortName = "Profile", Name = "Name", Description = "The name of the device profile associated with the device")] + public bool ProfileName { get; set; } + [Display(ShortName = "Profile", Name = "Short Name", Description = "The short name of the device profile associated with the device")] + public bool ProfileShortName { get; set; } + public bool HasDeviceProfileOptions() + { + return ProfileId || + ProfileName || + ProfileShortName; + } + + // Assigned User + [Display(ShortName = "Assigned User", Name = "Identifier", Description = "The identifier of the user assigned to the device flag")] + public bool AssignedUserId { get; set; } + [Display(ShortName = "Assigned User", Name = "Display Name", Description = "The display name of the user assigned to the device flag")] + public bool AssignedUserDisplayName { get; set; } + [Display(ShortName = "Assigned User", Name = "Surname", Description = "The surname of the user assigned to the device flag")] + public bool AssignedUserSurname { get; set; } + [Display(ShortName = "Assigned User", Name = "Given Name", Description = "The given name of the user assigned to the device flag")] + public bool AssignedUserGivenName { get; set; } + [Display(ShortName = "Assigned User", Name = "Phone Number", Description = "The phone number of the user assigned to the device flag")] + public bool AssignedUserPhoneNumber { get; set; } + [Display(ShortName = "Assigned User", Name = "Email Address", Description = "The email address of the user assigned to the device flag")] + public bool AssignedUserEmailAddress { get; set; } + [Display(ShortName = "Assigned User", Name = "Custom Details", Description = "The custom details provided by plugins for the user assigned to the device flag")] + public bool AssignedUserDetailCustom { get; set; } + public bool HasAssignedUserOptions() + { + return AssignedUserId || + AssignedUserDisplayName || + AssignedUserSurname || + AssignedUserGivenName || + AssignedUserPhoneNumber || + AssignedUserEmailAddress; + } + + public static DeviceFlagExportOptions DefaultOptions() + { + return new DeviceFlagExportOptions() + { + Format = ExportFormat.Xlsx, + CurrentOnly = true, + Name = true, + AddedDate = true, + DeviceSerialNumber = true, + ModelDescription = true, + ProfileName = true, + AssignedUserId = true, + AssignedUserDisplayName = true, + Comments = true, + }; + } + } +} diff --git a/Disco.Models/Services/Devices/DeviceFlags/DeviceFlagExportRecord.cs b/Disco.Models/Services/Devices/DeviceFlags/DeviceFlagExportRecord.cs new file mode 100644 index 00000000..e35b9506 --- /dev/null +++ b/Disco.Models/Services/Devices/DeviceFlags/DeviceFlagExportRecord.cs @@ -0,0 +1,12 @@ +using Disco.Models.Exporting; +using Disco.Models.Repository; +using System.Collections.Generic; + +namespace Disco.Models.Services.Devices.DeviceFlag +{ + public class DeviceFlagExportRecord : IExportRecord + { + public DeviceFlagAssignment Assignment { get; set; } + public Dictionary AssignedUserCustomDetails { get; set; } + } +} diff --git a/Disco.Models/Services/Searching/DeviceSearchResultItem.cs b/Disco.Models/Services/Searching/DeviceSearchResultItem.cs index 23fd0db4..6816f635 100644 --- a/Disco.Models/Services/Searching/DeviceSearchResultItem.cs +++ b/Disco.Models/Services/Searching/DeviceSearchResultItem.cs @@ -1,4 +1,5 @@ -using System; +using Disco.Models.Repository; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -44,6 +45,7 @@ namespace Disco.Models.Services.Searching public string DeviceBatchName { get; set; } public int JobCount { get; set; } public DateTime? DecommissionedDate { get; set; } + public IList DeviceFlagAssignments { get; set; } private string[] BuildScoreValues() { diff --git a/Disco.Models/Services/Users/UserFlags/UserFlagExportOptions.cs b/Disco.Models/Services/Users/UserFlags/UserFlagExportOptions.cs index fa02a554..733f0303 100644 --- a/Disco.Models/Services/Users/UserFlags/UserFlagExportOptions.cs +++ b/Disco.Models/Services/Users/UserFlags/UserFlagExportOptions.cs @@ -1,5 +1,4 @@ using Disco.Models.Exporting; -using Disco.Models.Services.Devices.Exporting; using Disco.Models.Services.Exporting; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; @@ -16,7 +15,7 @@ namespace Disco.Models.Services.Users.UserFlags [Required] public List UserFlagIds { get; set; } = new List(); - [DisplayAttribute(Name = "Current Only")] + [Display(Name = "Current Only")] public bool CurrentOnly { get; set; } // User Flag diff --git a/Disco.Models/UI/Config/DeviceFlag/ConfigDeviceFlagCreateModel.cs b/Disco.Models/UI/Config/DeviceFlag/ConfigDeviceFlagCreateModel.cs new file mode 100644 index 00000000..cd141612 --- /dev/null +++ b/Disco.Models/UI/Config/DeviceFlag/ConfigDeviceFlagCreateModel.cs @@ -0,0 +1,7 @@ +namespace Disco.Models.UI.Config.DeviceFlag +{ + public interface ConfigDeviceFlagCreateModel : BaseUIModel + { + Repository.DeviceFlag DeviceFlag { get; set; } + } +} diff --git a/Disco.Models/UI/Config/DeviceFlag/ConfigDeviceFlagExportModel.cs b/Disco.Models/UI/Config/DeviceFlag/ConfigDeviceFlagExportModel.cs new file mode 100644 index 00000000..9b15b0c2 --- /dev/null +++ b/Disco.Models/UI/Config/DeviceFlag/ConfigDeviceFlagExportModel.cs @@ -0,0 +1,17 @@ +using Disco.Models.Services.Devices.DeviceFlag; +using Disco.Models.Services.Exporting; +using Disco.Models.UI; +using System.Collections.Generic; + +namespace Disco.Models.Areas.Config.UI.DeviceFlag +{ + public interface ConfigDeviceFlagExportModel : BaseUIModel + { + DeviceFlagExportOptions Options { get; set; } + + string ExportSessionId { get; set; } + ExportResult ExportSessionResult { get; set; } + + List DeviceFlags { get; set; } + } +} diff --git a/Disco.Models/UI/Config/DeviceFlag/ConfigDeviceFlagIndexModel.cs b/Disco.Models/UI/Config/DeviceFlag/ConfigDeviceFlagIndexModel.cs new file mode 100644 index 00000000..e03fda99 --- /dev/null +++ b/Disco.Models/UI/Config/DeviceFlag/ConfigDeviceFlagIndexModel.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Disco.Models.UI.Config.DeviceFlag +{ + public interface ConfigDeviceFlagIndexModel : BaseUIModel + { + Dictionary DeviceFlags { get; set; } + } +} diff --git a/Disco.Models/UI/Config/DeviceFlag/ConfigDeviceFlagShowModel.cs b/Disco.Models/UI/Config/DeviceFlag/ConfigDeviceFlagShowModel.cs new file mode 100644 index 00000000..03aa27d1 --- /dev/null +++ b/Disco.Models/UI/Config/DeviceFlag/ConfigDeviceFlagShowModel.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; + +namespace Disco.Models.UI.Config.DeviceFlag +{ + public interface ConfigDeviceFlagShowModel : BaseUIModel + { + Repository.DeviceFlag DeviceFlag { get; set; } + + int CurrentAssignmentCount { get; set; } + int TotalAssignmentCount { get; set; } + + IEnumerable> Icons { get; set; } + IEnumerable> ThemeColours { get; set; } + } +} diff --git a/Disco.Models/UI/Device/DeviceShowModel.cs b/Disco.Models/UI/Device/DeviceShowModel.cs index b6456ee4..301cce42 100644 --- a/Disco.Models/UI/Device/DeviceShowModel.cs +++ b/Disco.Models/UI/Device/DeviceShowModel.cs @@ -1,4 +1,5 @@ using Disco.Models.BI.Config; +using Disco.Models.Repository; using Disco.Models.Services.Documents; using Disco.Models.Services.Jobs.JobLists; using System.Collections.Generic; @@ -22,6 +23,9 @@ namespace Disco.Models.UI.Device List DocumentTemplates { get; set; } List DocumentTemplatePackages { get; set; } + + List AvailableDeviceFlags { get; set; } + Dictionary AssignedUserDetails { get; set; } bool HasAssignedUserPhoto { get; set; } } diff --git a/Disco.Services/Authorization/Claims.cs b/Disco.Services/Authorization/Claims.cs index 6452cdf1..ee8016ab 100644 --- a/Disco.Services/Authorization/Claims.cs +++ b/Disco.Services/Authorization/Claims.cs @@ -1,7 +1,4 @@ - - - -// +// // This file was generated by a T4 template. // Don't change it directly as your change would get overwritten. Instead, make changes // to the .tt file (i.e. the T4 template) and save it to regenerate this file. @@ -34,6 +31,11 @@ namespace Disco.Services.Authorization { "Config.DeviceBatch.Delete", new Tuple, Action, string, string, bool>(c => c.Config.DeviceBatch.Delete, (c, v) => c.Config.DeviceBatch.Delete = v, "Delete Device Batches", "Can delete device batches", false) }, { "Config.DeviceBatch.Show", new Tuple, Action, string, string, bool>(c => c.Config.DeviceBatch.Show, (c, v) => c.Config.DeviceBatch.Show = v, "Show Device Batches", "Can show device batches", false) }, { "Config.DeviceBatch.ShowTimeline", new Tuple, Action, string, string, bool>(c => c.Config.DeviceBatch.ShowTimeline, (c, v) => c.Config.DeviceBatch.ShowTimeline = v, "Show Timeline", "Can show device batch timeline", false) }, + { "Config.DeviceFlag.Configure", new Tuple, Action, string, string, bool>(c => c.Config.DeviceFlag.Configure, (c, v) => c.Config.DeviceFlag.Configure = v, "Configure Device Flags", "Can configure device flags", false) }, + { "Config.DeviceFlag.Create", new Tuple, Action, string, string, bool>(c => c.Config.DeviceFlag.Create, (c, v) => c.Config.DeviceFlag.Create = v, "Create Device Flags", "Can create device flags", false) }, + { "Config.DeviceFlag.Delete", new Tuple, Action, string, string, bool>(c => c.Config.DeviceFlag.Delete, (c, v) => c.Config.DeviceFlag.Delete = v, "Delete Device Flags", "Can delete device flags", false) }, + { "Config.DeviceFlag.Export", new Tuple, Action, string, string, bool>(c => c.Config.DeviceFlag.Export, (c, v) => c.Config.DeviceFlag.Export = v, "Export Device Flag Assignments", "Can export user device assignments", false) }, + { "Config.DeviceFlag.Show", new Tuple, Action, string, string, bool>(c => c.Config.DeviceFlag.Show, (c, v) => c.Config.DeviceFlag.Show = v, "Show Device Flags", "Can show device flags", false) }, { "Config.DeviceModel.ConfigureComponents", new Tuple, Action, string, string, bool>(c => c.Config.DeviceModel.ConfigureComponents, (c, v) => c.Config.DeviceModel.ConfigureComponents = v, "Configure Device Model Components", "Can configure device model components", false) }, { "Config.DeviceModel.Configure", new Tuple, Action, string, string, bool>(c => c.Config.DeviceModel.Configure, (c, v) => c.Config.DeviceModel.Configure = v, "Configure Device Models", "Can configure device models", false) }, { "Config.DeviceModel.Delete", new Tuple, Action, string, string, bool>(c => c.Config.DeviceModel.Delete, (c, v) => c.Config.DeviceModel.Delete = v, "Delete Device Models", "Can delete device models", false) }, @@ -186,22 +188,26 @@ namespace Disco.Services.Authorization { "Device.Properties.DeviceProfile", new Tuple, Action, string, string, bool>(c => c.Device.Properties.DeviceProfile, (c, v) => c.Device.Properties.DeviceProfile = v, "Device Profile Property", "Can update property", false) }, { "Device.Properties.Location", new Tuple, Action, string, string, bool>(c => c.Device.Properties.Location, (c, v) => c.Device.Properties.Location = v, "Location Property", "Can update property", false) }, { "Device.Actions.AddAttachments", new Tuple, Action, string, string, bool>(c => c.Device.Actions.AddAttachments, (c, v) => c.Device.Actions.AddAttachments = v, "Add Attachments", "Can add attachments to devices", false) }, + { "Device.Actions.AddFlags", new Tuple, Action, string, string, bool>(c => c.Device.Actions.AddFlags, (c, v) => c.Device.Actions.AddFlags = v, "Add Device Flags", "Can add device flags", false) }, { "Device.Actions.AllowUnauthenticatedEnrol", new Tuple, Action, string, string, bool>(c => c.Device.Actions.AllowUnauthenticatedEnrol, (c, v) => c.Device.Actions.AllowUnauthenticatedEnrol = v, "Allow Unauthenticated Enrol", "Can allow devices to enrol without authentication", false) }, { "Device.Actions.AssignUser", new Tuple, Action, string, string, bool>(c => c.Device.Actions.AssignUser, (c, v) => c.Device.Actions.AssignUser = v, "Assign User", "Can update the user assignment of devices", false) }, { "Device.Actions.Decommission", new Tuple, Action, string, string, bool>(c => c.Device.Actions.Decommission, (c, v) => c.Device.Actions.Decommission = v, "Decommission", "Can decommission devices", false) }, { "Device.Actions.Delete", new Tuple, Action, string, string, bool>(c => c.Device.Actions.Delete, (c, v) => c.Device.Actions.Delete = v, "Delete", "Can delete devices", false) }, + { "Device.Actions.EditFlags", new Tuple, Action, string, string, bool>(c => c.Device.Actions.EditFlags, (c, v) => c.Device.Actions.EditFlags = v, "Edit Device Flags", "Can edit device flags", false) }, { "Device.Actions.EnrolDevices", new Tuple, Action, string, string, bool>(c => c.Device.Actions.EnrolDevices, (c, v) => c.Device.Actions.EnrolDevices = v, "Enrol Devices", "Can add devices offline and enrol devices with the Bootstrapper", false) }, { "Device.Actions.Export", new Tuple, Action, string, string, bool>(c => c.Device.Actions.Export, (c, v) => c.Device.Actions.Export = v, "Export Devices", "Can export devices in a bulk format", false) }, { "Device.Actions.GenerateDocuments", new Tuple, Action, string, string, bool>(c => c.Device.Actions.GenerateDocuments, (c, v) => c.Device.Actions.GenerateDocuments = v, "Generate Documents", "Can generate documents for jobs", false) }, { "Device.Actions.Import", new Tuple, Action, string, string, bool>(c => c.Device.Actions.Import, (c, v) => c.Device.Actions.Import = v, "Import Devices", "Can bulk import devices", false) }, { "Device.Actions.Recommission", new Tuple, Action, string, string, bool>(c => c.Device.Actions.Recommission, (c, v) => c.Device.Actions.Recommission = v, "Recommission", "Can recommission devices", false) }, { "Device.Actions.RemoveAnyAttachments", new Tuple, Action, string, string, bool>(c => c.Device.Actions.RemoveAnyAttachments, (c, v) => c.Device.Actions.RemoveAnyAttachments = v, "Remove Any Attachments", "Can remove any attachments from devices", false) }, + { "Device.Actions.RemoveFlags", new Tuple, Action, string, string, bool>(c => c.Device.Actions.RemoveFlags, (c, v) => c.Device.Actions.RemoveFlags = v, "Remove Device Flags", "Can remove device flags", false) }, { "Device.Actions.RemoveOwnAttachments", new Tuple, Action, string, string, bool>(c => c.Device.Actions.RemoveOwnAttachments, (c, v) => c.Device.Actions.RemoveOwnAttachments = v, "Remove Own Attachments", "Can remove own attachments from devices", false) }, { "Device.Search", new Tuple, Action, string, string, bool>(c => c.Device.Search, (c, v) => c.Device.Search = v, "Search Devices", "Can search devices", false) }, { "Device.ShowAssignmentHistory", new Tuple, Action, string, string, bool>(c => c.Device.ShowAssignmentHistory, (c, v) => c.Device.ShowAssignmentHistory = v, "Show Assignment History", "Can show the assignment history for devices", false) }, { "Device.ShowAttachments", new Tuple, Action, string, string, bool>(c => c.Device.ShowAttachments, (c, v) => c.Device.ShowAttachments = v, "Show Attachments", "Can show device attachments", false) }, { "Device.ShowCertificates", new Tuple, Action, string, string, bool>(c => c.Device.ShowCertificates, (c, v) => c.Device.ShowCertificates = v, "Show Certificates", "Can show certificates associated with devices", false) }, { "Device.ShowDetails", new Tuple, Action, string, string, bool>(c => c.Device.ShowDetails, (c, v) => c.Device.ShowDetails = v, "Show Details", "Can show details associated with devices", false) }, + { "Device.ShowFlagAssignments", new Tuple, Action, string, string, bool>(c => c.Device.ShowFlagAssignments, (c, v) => c.Device.ShowFlagAssignments = v, "Show Device Flag Assignments", "Can show flags associated with devices", false) }, { "Device.Show", new Tuple, Action, string, string, bool>(c => c.Device.Show, (c, v) => c.Device.Show = v, "Show Devices", "Can show devices", false) }, { "Device.ShowJobs", new Tuple, Action, string, string, bool>(c => c.Device.ShowJobs, (c, v) => c.Device.ShowJobs = v, "Show Devices Jobs", "Can show jobs associated with devices", false) }, { "User.Actions.AddAttachments", new Tuple, Action, string, string, bool>(c => c.User.Actions.AddAttachments, (c, v) => c.User.Actions.AddAttachments = v, "Add Attachments", "Can add attachments to users", false) }, @@ -239,6 +245,13 @@ namespace Disco.Services.Authorization new ClaimNavigatorItem("Config.DeviceCertificate", "Device Certificates", "Permissions related to Device Certificates", false, new List() { new ClaimNavigatorItem("Config.DeviceCertificate.DownloadCertificates", false) }), + new ClaimNavigatorItem("Config.DeviceFlag", "Device Flags", "Permissions related to Device Flags", false, new List() { + new ClaimNavigatorItem("Config.DeviceFlag.Configure", false), + new ClaimNavigatorItem("Config.DeviceFlag.Create", false), + new ClaimNavigatorItem("Config.DeviceFlag.Delete", false), + new ClaimNavigatorItem("Config.DeviceFlag.Export", false), + new ClaimNavigatorItem("Config.DeviceFlag.Show", false) + }), new ClaimNavigatorItem("Config.DeviceModel", "Device Models", "Permissions related to Device Models", false, new List() { new ClaimNavigatorItem("Config.DeviceModel.ConfigureComponents", false), new ClaimNavigatorItem("Config.DeviceModel.Configure", false), @@ -431,16 +444,19 @@ namespace Disco.Services.Authorization new ClaimNavigatorItem("Device", "Device", "Permissions related to Devices", false, new List() { new ClaimNavigatorItem("Device.Actions", "Actions", "Permissions related to Device Actions", false, new List() { new ClaimNavigatorItem("Device.Actions.AddAttachments", false), + new ClaimNavigatorItem("Device.Actions.AddFlags", false), new ClaimNavigatorItem("Device.Actions.AllowUnauthenticatedEnrol", false), new ClaimNavigatorItem("Device.Actions.AssignUser", false), new ClaimNavigatorItem("Device.Actions.Decommission", false), new ClaimNavigatorItem("Device.Actions.Delete", false), + new ClaimNavigatorItem("Device.Actions.EditFlags", false), new ClaimNavigatorItem("Device.Actions.EnrolDevices", false), new ClaimNavigatorItem("Device.Actions.Export", false), new ClaimNavigatorItem("Device.Actions.GenerateDocuments", false), new ClaimNavigatorItem("Device.Actions.Import", false), new ClaimNavigatorItem("Device.Actions.Recommission", false), new ClaimNavigatorItem("Device.Actions.RemoveAnyAttachments", false), + new ClaimNavigatorItem("Device.Actions.RemoveFlags", false), new ClaimNavigatorItem("Device.Actions.RemoveOwnAttachments", false) }), new ClaimNavigatorItem("Device.Properties", "Device Properties", "Permissions related to Device Properties", false, new List() { @@ -455,6 +471,7 @@ namespace Disco.Services.Authorization new ClaimNavigatorItem("Device.ShowAttachments", false), new ClaimNavigatorItem("Device.ShowCertificates", false), new ClaimNavigatorItem("Device.ShowDetails", false), + new ClaimNavigatorItem("Device.ShowFlagAssignments", false), new ClaimNavigatorItem("Device.Show", false), new ClaimNavigatorItem("Device.ShowJobs", false) }), @@ -552,6 +569,11 @@ namespace Disco.Services.Authorization c.Config.DeviceBatch.Delete = true; c.Config.DeviceBatch.Show = true; c.Config.DeviceBatch.ShowTimeline = true; + c.Config.DeviceFlag.Configure = true; + c.Config.DeviceFlag.Create = true; + c.Config.DeviceFlag.Delete = true; + c.Config.DeviceFlag.Export = true; + c.Config.DeviceFlag.Show = true; c.Config.DeviceModel.ConfigureComponents = true; c.Config.DeviceModel.Configure = true; c.Config.DeviceModel.Delete = true; @@ -704,22 +726,26 @@ namespace Disco.Services.Authorization c.Device.Properties.DeviceProfile = true; c.Device.Properties.Location = true; c.Device.Actions.AddAttachments = true; + c.Device.Actions.AddFlags = true; c.Device.Actions.AllowUnauthenticatedEnrol = true; c.Device.Actions.AssignUser = true; c.Device.Actions.Decommission = true; c.Device.Actions.Delete = true; + c.Device.Actions.EditFlags = true; c.Device.Actions.EnrolDevices = true; c.Device.Actions.Export = true; c.Device.Actions.GenerateDocuments = true; c.Device.Actions.Import = true; c.Device.Actions.Recommission = true; c.Device.Actions.RemoveAnyAttachments = true; + c.Device.Actions.RemoveFlags = true; c.Device.Actions.RemoveOwnAttachments = true; c.Device.Search = true; c.Device.ShowAssignmentHistory = true; c.Device.ShowAttachments = true; c.Device.ShowCertificates = true; c.Device.ShowDetails = true; + c.Device.ShowFlagAssignments = true; c.Device.Show = true; c.Device.ShowJobs = true; c.User.Actions.AddAttachments = true; @@ -828,6 +854,38 @@ namespace Disco.Services.Authorization public const string ShowTimeline = "Config.DeviceBatch.ShowTimeline"; } + /// Device Flags + /// Permissions related to Device Flags + /// + public static class DeviceFlag + { + + /// Configure Device Flags + /// Can configure device flags + /// + public const string Configure = "Config.DeviceFlag.Configure"; + + /// Create Device Flags + /// Can create device flags + /// + public const string Create = "Config.DeviceFlag.Create"; + + /// Delete Device Flags + /// Can delete device flags + /// + public const string Delete = "Config.DeviceFlag.Delete"; + + /// Export Device Flag Assignments + /// Can export user device assignments + /// + public const string Export = "Config.DeviceFlag.Export"; + + /// Show Device Flags + /// Can show device flags + /// + public const string Show = "Config.DeviceFlag.Show"; + } + /// Device Models /// Permissions related to Device Models /// @@ -1734,6 +1792,11 @@ namespace Disco.Services.Authorization /// public const string AddAttachments = "Device.Actions.AddAttachments"; + /// Add Device Flags + /// Can add device flags + /// + public const string AddFlags = "Device.Actions.AddFlags"; + /// Allow Unauthenticated Enrol /// Can allow devices to enrol without authentication /// @@ -1754,6 +1817,11 @@ namespace Disco.Services.Authorization /// public const string Delete = "Device.Actions.Delete"; + /// Edit Device Flags + /// Can edit device flags + /// + public const string EditFlags = "Device.Actions.EditFlags"; + /// Enrol Devices /// Can add devices offline and enrol devices with the Bootstrapper /// @@ -1784,6 +1852,11 @@ namespace Disco.Services.Authorization /// public const string RemoveAnyAttachments = "Device.Actions.RemoveAnyAttachments"; + /// Remove Device Flags + /// Can remove device flags + /// + public const string RemoveFlags = "Device.Actions.RemoveFlags"; + /// Remove Own Attachments /// Can remove own attachments from devices /// @@ -1815,6 +1888,11 @@ namespace Disco.Services.Authorization /// public const string ShowDetails = "Device.ShowDetails"; + /// Show Device Flag Assignments + /// Can show flags associated with devices + /// + public const string ShowFlagAssignments = "Device.ShowFlagAssignments"; + /// Show Devices /// Can show devices /// diff --git a/Disco.Services/Authorization/Claims.tt b/Disco.Services/Authorization/Claims.tt index ccac7a8d..9278294f 100644 --- a/Disco.Services/Authorization/Claims.tt +++ b/Disco.Services/Authorization/Claims.tt @@ -20,9 +20,6 @@ <#@ import namespace="System.Runtime.InteropServices.CustomMarshalers" #> <#@ import namespace="System.Runtime.InteropServices" #> <#@ import namespace="System.Reflection" #> - - - <# // Get the DTE service from the host EnvDTE.DTE Dte = null; diff --git a/Disco.Services/Authorization/Roles/ClaimGroups/Configuration/ConfigClaims.cs b/Disco.Services/Authorization/Roles/ClaimGroups/Configuration/ConfigClaims.cs index 6b2ac54e..75e44c02 100644 --- a/Disco.Services/Authorization/Roles/ClaimGroups/Configuration/ConfigClaims.cs +++ b/Disco.Services/Authorization/Roles/ClaimGroups/Configuration/ConfigClaims.cs @@ -22,6 +22,7 @@ namespace Disco.Services.Authorization.Roles.ClaimGroups.Configuration DeviceCertificate = new DeviceCertificateClaims(); Enrolment = new EnrolmentClaims(); DeviceBatch = new DeviceBatchClaims(); + DeviceFlag = new DeviceFlagClaims(); DeviceModel = new DeviceModelClaims(); DeviceProfile = new DeviceProfileClaims(); DocumentTemplate = new DocumentTemplateClaims(); @@ -43,6 +44,8 @@ namespace Disco.Services.Authorization.Roles.ClaimGroups.Configuration public DeviceBatchClaims DeviceBatch { get; set; } + public DeviceFlagClaims DeviceFlag { get; set; } + public DeviceModelClaims DeviceModel { get; set; } public DeviceProfileClaims DeviceProfile { get; set; } diff --git a/Disco.Services/Authorization/Roles/ClaimGroups/Configuration/DeviceFlag/DeviceFlagClaims.cs b/Disco.Services/Authorization/Roles/ClaimGroups/Configuration/DeviceFlag/DeviceFlagClaims.cs new file mode 100644 index 00000000..003ecef6 --- /dev/null +++ b/Disco.Services/Authorization/Roles/ClaimGroups/Configuration/DeviceFlag/DeviceFlagClaims.cs @@ -0,0 +1,20 @@ +namespace Disco.Services.Authorization.Roles.ClaimGroups.Configuration.UserFlag +{ + [ClaimDetails("Device Flags", "Permissions related to Device Flags")] + public class DeviceFlagClaims : BaseRoleClaimGroup + { + [ClaimDetails("Configure Device Flags", "Can configure device flags")] + public bool Configure { get; set; } + + [ClaimDetails("Create Device Flags", "Can create device flags")] + public bool Create { get; set; } + + [ClaimDetails("Delete Device Flags", "Can delete device flags")] + public bool Delete { get; set; } + [ClaimDetails("Export Device Flag Assignments", "Can export user device assignments")] + public bool Export { get; set; } + + [ClaimDetails("Show Device Flags", "Can show device flags")] + public bool Show { get; set; } + } +} diff --git a/Disco.Services/Authorization/Roles/ClaimGroups/Device/DeviceActionsClaims.cs b/Disco.Services/Authorization/Roles/ClaimGroups/Device/DeviceActionsClaims.cs index 1df4f3a3..33c9995c 100644 --- a/Disco.Services/Authorization/Roles/ClaimGroups/Device/DeviceActionsClaims.cs +++ b/Disco.Services/Authorization/Roles/ClaimGroups/Device/DeviceActionsClaims.cs @@ -25,6 +25,12 @@ [ClaimDetails("Generate Documents", "Can generate documents for jobs")] public bool GenerateDocuments { get; set; } + [ClaimDetails("Add Device Flags", "Can add device flags")] + public bool AddFlags { get; set; } + [ClaimDetails("Remove Device Flags", "Can remove device flags")] + public bool RemoveFlags { get; set; } + [ClaimDetails("Edit Device Flags", "Can edit device flags")] + public bool EditFlags { get; set; } [ClaimDetails("Enrol Devices", "Can add devices offline and enrol devices with the Bootstrapper")] public bool EnrolDevices { get; set; } diff --git a/Disco.Services/Authorization/Roles/ClaimGroups/Device/DeviceClaims.cs b/Disco.Services/Authorization/Roles/ClaimGroups/Device/DeviceClaims.cs index 895ad90f..192440fa 100644 --- a/Disco.Services/Authorization/Roles/ClaimGroups/Device/DeviceClaims.cs +++ b/Disco.Services/Authorization/Roles/ClaimGroups/Device/DeviceClaims.cs @@ -25,7 +25,8 @@ public bool ShowJobs { get; set; } [ClaimDetails("Show Assignment History", "Can show the assignment history for devices")] public bool ShowAssignmentHistory { get; set; } - + [ClaimDetails("Show Device Flag Assignments", "Can show flags associated with devices")] + public bool ShowFlagAssignments { get; set; } public DevicePropertiesClaims Properties { get; set; } diff --git a/Disco.Services/Devices/DeviceFlags/Cache.cs b/Disco.Services/Devices/DeviceFlags/Cache.cs new file mode 100644 index 00000000..c680148e --- /dev/null +++ b/Disco.Services/Devices/DeviceFlags/Cache.cs @@ -0,0 +1,61 @@ +using Disco.Data.Repository; +using Disco.Models.Repository; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; + +namespace Disco.Services.Devices.DeviceFlags +{ + internal class Cache + { + private ConcurrentDictionary _Cache; + + public Cache(DiscoDataContext Database) + { + Initialize(Database); + } + + public void ReInitialize(DiscoDataContext Database) + { + Initialize(Database); + } + + private void Initialize(DiscoDataContext Database) + { + // Queues from Database + var flags = Database.DeviceFlags.ToList(); + + // Add Queues to In-Memory Cache + _Cache = new ConcurrentDictionary(flags.Select(f => new KeyValuePair(f.Id, f))); + } + + public DeviceFlag GetDeviceFlag(int deviceFlagId) + { + if (_Cache.TryGetValue(deviceFlagId, out var item)) + return item; + else + return null; + } + public List GetDeviceFlags() + { + return _Cache.Values.ToList(); + } + + public void AddOrUpdate(DeviceFlag flag) + { + _Cache.AddOrUpdate(flag.Id, flag, (key, existingItem) => flag); + } + + public DeviceFlag Remove(int deviceFlagId) + { + if (_Cache.TryRemove(deviceFlagId, out var item)) + return item; + else + return null; + } + public DeviceFlag Remove(DeviceFlag deviceFlag) + { + return Remove(deviceFlag.Id); + } + } +} diff --git a/Disco.Services/Devices/DeviceFlags/DeviceFlagDeviceAssignedUsersManagedGroup.cs b/Disco.Services/Devices/DeviceFlags/DeviceFlagDeviceAssignedUsersManagedGroup.cs new file mode 100644 index 00000000..4333e336 --- /dev/null +++ b/Disco.Services/Devices/DeviceFlags/DeviceFlagDeviceAssignedUsersManagedGroup.cs @@ -0,0 +1,184 @@ +using Disco.Data.Repository; +using Disco.Data.Repository.Monitor; +using Disco.Models.Repository; +using Disco.Models.Services.Interop.ActiveDirectory; +using Disco.Services.Interop.ActiveDirectory; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reactive.Linq; + +namespace Disco.Services.Devices.DeviceFlags +{ + public class DeviceFlagDeviceAssignedUsersManagedGroup : ADManagedGroup + { + private const string KeyFormat = "DeviceFlag_{0}_DeviceAssignedUsers"; + private const string DescriptionFormat = "User associated with devices which have the {0} Flag will be added to this Active Directory group."; + private const string CategoryDescriptionFormat = "Device Assigned Users Linked Group"; + private const string GroupDescriptionFormat = "{0} [Device Flag Device Assigned Users]"; + + private IDisposable repositorySubscription; + private int deviceFlagId; + private string deviceFlagName; + + public override string Description { get { return string.Format(DescriptionFormat, deviceFlagName); } } + public override string CategoryDescription { get { return CategoryDescriptionFormat; } } + public override string GroupDescription { get { return string.Format(GroupDescriptionFormat, deviceFlagName); } } + public override bool IncludeFilterBeginDate { get { return true; } } + + private DeviceFlagDeviceAssignedUsersManagedGroup(string Key, ADManagedGroupConfiguration Configuration, DeviceFlag deviceFlag) + : base(Key, Configuration) + { + deviceFlagId = deviceFlag.Id; + deviceFlagName = deviceFlag.Name; + } + + public override void Initialize() + { + // Subscribe to changes + repositorySubscription = DeviceFlagService.DeviceFlagAssignmentRepositoryEvents.Value + .Where(e => + (((DeviceFlagAssignment)e.Entity).DeviceFlagId == deviceFlagId)) + .Subscribe(ProcessRepositoryEvent); + } + + public static string GetKey(DeviceFlag deviceFlag) + { + return string.Format(KeyFormat, deviceFlag.Id); + } + public static string GetDescription(DeviceFlag deviceFlag) + { + return string.Format(DescriptionFormat, deviceFlag.Name); + } + public static string GetCategoryDescription(DeviceFlag deviceFlag) + { + return CategoryDescriptionFormat; + } + + public static bool TryGetManagedGroup(DeviceFlag deviceFlag, out DeviceFlagDeviceAssignedUsersManagedGroup managedGroup) + { + return ActiveDirectory.Context.ManagedGroups.TryGetValue(GetKey(deviceFlag), out managedGroup); + } + + public static DeviceFlagDeviceAssignedUsersManagedGroup Initialize(DeviceFlag deviceFlag) + { + if (deviceFlag.Id > 0) + { + var key = GetKey(deviceFlag); + + if (!string.IsNullOrEmpty(deviceFlag.DeviceUsersLinkedGroup)) + { + var config = ConfigurationFromJson(deviceFlag.DeviceUsersLinkedGroup); + + if (config != null && !string.IsNullOrWhiteSpace(config.GroupId)) + { + var group = new DeviceFlagDeviceAssignedUsersManagedGroup( + key, + config, + deviceFlag); + + // Add to AD Context + ActiveDirectory.Context.ManagedGroups.AddOrUpdate(group); + + return group; + } + } + + // Remove from AD Context + ActiveDirectory.Context.ManagedGroups.Remove(key); + } + + return null; + } + + public override IEnumerable DetermineMembers(DiscoDataContext Database) + { + var query = (IQueryable)Database.Users; + + if (Configuration.FilterBeginDate.HasValue) + { + query = query + .Where(u => u.DeviceUserAssignments.Any(a => + a.UnassignedDate == null && + a.Device.DeviceFlagAssignments.Any(fa => + fa.DeviceFlagId == deviceFlagId && + !fa.RemovedDate.HasValue && + fa.AddedDate >= Configuration.FilterBeginDate))); + } + else + { + query = query + .Where(u => u.DeviceUserAssignments.Any(a => + a.UnassignedDate == null && + a.Device.DeviceFlagAssignments.Any(fa => + fa.DeviceFlagId == deviceFlagId && + !fa.RemovedDate.HasValue))); + } + + return query.Select(u => u.UserId) + .Distinct() + .ToList() + .Where(ActiveDirectory.IsValidDomainAccountId) + .ToList(); + } + + private void ProcessRepositoryEvent(RepositoryMonitorEvent Event) + { + var assignment = (DeviceFlagAssignment)Event.Entity; + + string userId = assignment.Device?.AssignedUserId; + if (!ActiveDirectory.IsValidDomainAccountId(userId)) + return; + + switch (Event.EventType) + { + case RepositoryMonitorEventType.Added: + if (Configuration.FilterBeginDate.HasValue) + { + if (!assignment.RemovedDate.HasValue && assignment.AddedDate >= Configuration.FilterBeginDate) + { + AddMember(userId); + } + } + else + { + if (!assignment.RemovedDate.HasValue) + { + AddMember(userId); + } + } + break; + case RepositoryMonitorEventType.Modified: + if (!Configuration.FilterBeginDate.HasValue || assignment.AddedDate >= Configuration.FilterBeginDate) + { + if (assignment.RemovedDate.HasValue) + RemoveMember(userId, (database) => + { + if (database.Users.Any(u => u.DeviceUserAssignments.Any(a => + a.UnassignedDate == null && + a.Device.DeviceFlagAssignments.Any(fa => + fa.DeviceFlagId == deviceFlagId && + !fa.RemovedDate.HasValue)))) + { + return null; + } + else + { + return new[] { userId }; + } + } + ); + else + AddMember(userId); + } + break; + } + } + + public override void Dispose() + { + if (repositorySubscription != null) + repositorySubscription.Dispose(); + } + } +} diff --git a/Disco.Services/Devices/DeviceFlags/DeviceFlagDevicesManagedGroup.cs b/Disco.Services/Devices/DeviceFlags/DeviceFlagDevicesManagedGroup.cs new file mode 100644 index 00000000..e728d229 --- /dev/null +++ b/Disco.Services/Devices/DeviceFlags/DeviceFlagDevicesManagedGroup.cs @@ -0,0 +1,202 @@ +using Disco.Data.Repository; +using Disco.Data.Repository.Monitor; +using Disco.Models.Repository; +using Disco.Models.Services.Interop.ActiveDirectory; +using Disco.Services.Interop.ActiveDirectory; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reactive.Linq; + +namespace Disco.Services.Devices.DeviceFlags +{ + public class DeviceFlagDevicesManagedGroup : ADManagedGroup + { + private const string KeyFormat = "DeviceFlag_{0}_Devices"; + private const string DescriptionFormat = "Devices associated with the {0} Flag will be added to this Active Directory group."; + private const string CategoryDescriptionFormat = "Assigned Devices Linked Group"; + private const string GroupDescriptionFormat = "{0} [Device Flag Devices]"; + + private IDisposable repositorySubscription; + private int deviceFlagId; + private string deviceFlagName; + + public override string Description { get { return string.Format(DescriptionFormat, deviceFlagName); } } + public override string CategoryDescription { get { return CategoryDescriptionFormat; } } + public override string GroupDescription { get { return string.Format(GroupDescriptionFormat, deviceFlagName); } } + public override bool IncludeFilterBeginDate { get { return true; } } + + private DeviceFlagDevicesManagedGroup(string Key, ADManagedGroupConfiguration Configuration, DeviceFlag DeviceFlag) + : base(Key, Configuration) + { + deviceFlagId = DeviceFlag.Id; + deviceFlagName = DeviceFlag.Name; + } + + public override void Initialize() + { + // Subscribe to changes + repositorySubscription = DeviceFlagService.DeviceFlagAssignmentRepositoryEvents.Value + .Where(e => + ((DeviceFlagAssignment)e.Entity).DeviceFlagId == deviceFlagId) + .Subscribe(ProcessRepositoryEvent); + } + + public static string GetKey(DeviceFlag deviceFlag) + { + return string.Format(KeyFormat, deviceFlag.Id); + } + public static string GetDescription(DeviceFlag deviceFlag) + { + return string.Format(DescriptionFormat, deviceFlag.Name); + } + public static string GetCategoryDescription(DeviceFlag deviceFlag) + { + return CategoryDescriptionFormat; + } + + public static bool TryGetManagedGroup(DeviceFlag deviceFlag, out DeviceFlagDevicesManagedGroup managedGroup) + { + return ActiveDirectory.Context.ManagedGroups.TryGetValue(GetKey(deviceFlag), out managedGroup); + } + + public static DeviceFlagDevicesManagedGroup Initialize(DeviceFlag deviceFlag) + { + if (deviceFlag.Id > 0) + { + var key = GetKey(deviceFlag); + + if (!string.IsNullOrEmpty(deviceFlag.DevicesLinkedGroup)) + { + var config = ConfigurationFromJson(deviceFlag.DevicesLinkedGroup); + + if (config != null && !string.IsNullOrWhiteSpace(config.GroupId)) + { + var group = new DeviceFlagDevicesManagedGroup( + key, + config, + deviceFlag); + + // Add to AD Context + ActiveDirectory.Context.ManagedGroups.AddOrUpdate(group); + + return group; + } + } + + // Remove from AD Context + ActiveDirectory.Context.ManagedGroups.Remove(key); + } + + return null; + } + + public override IEnumerable DetermineMembers(DiscoDataContext Database) + { + var query = Database.DeviceFlagAssignments + .Where(a => a.DeviceFlagId == deviceFlagId && !a.RemovedDate.HasValue && a.Device.DeviceDomainId != null); + + if (Configuration.FilterBeginDate.HasValue) + query = query.Where(a => a.AddedDate >= Configuration.FilterBeginDate); + + return query + .Select(a => a.Device.DeviceDomainId) + .ToList() + .Where(ActiveDirectory.IsValidDomainAccountId) + .Select(id => id + "$"); + } + + private void ProcessRepositoryEvent(RepositoryMonitorEvent Event) + { + var assignment = (DeviceFlagAssignment)Event.Entity; + + var domainId = assignment.Device?.DeviceDomainId; + + if (!ActiveDirectory.IsValidDomainAccountId(domainId)) + return; + domainId += "$"; + + switch (Event.EventType) + { + case RepositoryMonitorEventType.Added: + if (Configuration.FilterBeginDate.HasValue) + { + if (!assignment.RemovedDate.HasValue && assignment.AddedDate >= Configuration.FilterBeginDate) + { + AddMember(domainId); + } + } + else + { + if (!assignment.RemovedDate.HasValue) + { + AddMember(domainId); + } + } + break; + case RepositoryMonitorEventType.Modified: + if (Configuration.FilterBeginDate.HasValue) + { + if (assignment.AddedDate >= Configuration.FilterBeginDate) + { + if (assignment.RemovedDate.HasValue) + { + RemoveMember(domainId); + } + else + { + AddMember(domainId); + } + } + } + else + { + if (assignment.RemovedDate.HasValue) + { + RemoveMember(domainId); + } + else + { + AddMember(domainId); + } + } + break; + case RepositoryMonitorEventType.Deleted: + // Remove the device if no other (non-removed) assignments exist. + var serialNumber = assignment.DeviceSerialNumber; + RemoveMember(domainId, (database) => + { + if (Configuration.FilterBeginDate.HasValue) + { + if (database.DeviceFlagAssignments.Any(a => a.DeviceFlagId == deviceFlagId && a.DeviceSerialNumber == serialNumber && !a.RemovedDate.HasValue && a.AddedDate >= Configuration.FilterBeginDate)) + { + return null; + } + else + { + return new string[] { domainId }; + } + } + else + { + if (database.DeviceFlagAssignments.Any(a => a.DeviceFlagId == deviceFlagId && a.DeviceSerialNumber == serialNumber && !a.RemovedDate.HasValue)) + { + return null; + } + else + { + return new string[] { domainId }; + } + } + }); + break; + } + } + + public override void Dispose() + { + if (repositorySubscription != null) + repositorySubscription.Dispose(); + } + } +} diff --git a/Disco.Services/Devices/DeviceFlags/DeviceFlagExport.cs b/Disco.Services/Devices/DeviceFlags/DeviceFlagExport.cs new file mode 100644 index 00000000..0370b973 --- /dev/null +++ b/Disco.Services/Devices/DeviceFlags/DeviceFlagExport.cs @@ -0,0 +1,229 @@ +using Disco.Data.Repository; +using Disco.Models.Exporting; +using Disco.Models.Services.Devices.DeviceFlag; +using Disco.Models.Services.Exporting; +using Disco.Services.Plugins.Features.DetailsProvider; +using Disco.Services.Tasks; +using Disco.Services.Users; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Data.Entity; +using System.Linq; + +namespace Disco.Services.Devices.DeviceFlags +{ + using Metadata = ExportFieldMetadata; + + public class DeviceFlagExport + { + private readonly DiscoDataContext database; + private readonly DeviceFlagExportOptions options; + + public DeviceFlagExport(DiscoDataContext database, DeviceFlagExportOptions options) + { + this.database = database; + this.options = options; + } + + public ExportResult Generate(IScheduledTaskStatus status) + { + var records = BuildRecords(status); + + var metadata = BuildMetadata(records, status); + + if (metadata.Count == 0) + throw new ArgumentException("At least one export field must be specified", nameof(options)); + + status.UpdateStatus(90, $"Formatting {records.Count} records for export"); + return ExportHelpers.WriteExport(options, status, metadata, records); + } + + private List BuildRecords(IScheduledTaskStatus status) + { + var query = database.DeviceFlagAssignments + .Include(a => a.DeviceFlag); + + if (options.HasDeviceOptions()) + query = query.Include(a => a.Device); + if (options.HasDeviceModelOptions()) + query = query.Include(a => a.Device.DeviceModel); + if (options.HasDeviceBatchOptions()) + query = query.Include(a => a.Device.DeviceBatch); + if (options.HasDeviceProfileOptions()) + query = query.Include(a => a.Device.DeviceProfile); + if (options.HasAssignedUserOptions()) + query = query.Include(a => a.Device.AssignedUser); + if (options.AssignedUserDetailCustom) + query = query.Include(a => a.Device.AssignedUser.UserDetails); + + query = query.Where(a => options.DeviceFlagIds.Contains(a.DeviceFlagId)); + + if (options.CurrentOnly) + { + query = query.Where(a => !a.RemovedDate.HasValue); + } + + // Update Users + if (options.HasAssignedUserOptions()) + { + status.UpdateStatus(5, "Refreshing user details from Active Directory"); + var userIds = query.Where(d => d.Device.AssignedUserId != null).Select(d => d.Device.AssignedUserId).Distinct().ToList(); + foreach (var userId in userIds) + { + try + { + UserService.GetUser(userId, database); + } + catch (Exception) { } // Ignore Errors + } + } + + status.UpdateStatus(15, "Extracting records from the database"); + + var records = query.Select(a => new DeviceFlagExportRecord() + { + Assignment = a + }).ToList(); + + if (options.AssignedUserDetailCustom) + { + status.UpdateStatus(50, "Extracting custom user detail records"); + + var detailsService = new DetailsProviderService(database); + var cache = new Dictionary>(StringComparer.Ordinal); + foreach (var record in records) + { + var userId = record.Assignment.Device.AssignedUserId; + + if (userId == null) + continue; + + if (!cache.TryGetValue(userId, out var details)) + details = detailsService.GetDetails(record.Assignment.Device.AssignedUser); + record.AssignedUserCustomDetails = details; + } + } + + return records; + } + + private List BuildMetadata(List records, IScheduledTaskStatus status) + { + status.UpdateStatus(80, "Building metadata"); + + IEnumerable userDetailCustomKeys = null; + if (options.AssignedUserDetailCustom) + userDetailCustomKeys = records.Where(r => r.AssignedUserCustomDetails != null).SelectMany(r => r.AssignedUserCustomDetails.Keys).Distinct(StringComparer.OrdinalIgnoreCase).ToList(); + + var accessors = BuildAccessors(userDetailCustomKeys); + + return typeof(DeviceFlagExportOptions).GetProperties() + .Where(p => p.PropertyType == typeof(bool)) + .Select(p => new + { + property = p, + details = (DisplayAttribute)p.GetCustomAttributes(typeof(DisplayAttribute), false).FirstOrDefault() + }) + .Where(p => p.details != null && p.property.Name != nameof(options.CurrentOnly) && (bool)p.property.GetValue(options)) + .SelectMany(p => + { + var fieldMetadata = accessors[p.property.Name]; + fieldMetadata.ForEach(f => + { + if (f.ColumnName == null) + f.ColumnName = (p.details.ShortName == "Device Flag") ? p.details.Name : $"{p.details.ShortName} {p.details.Name}"; + }); + return fieldMetadata; + }).ToList(); + } + + private static Dictionary> BuildAccessors(IEnumerable userDetailsCustomKeys) + { + const string DateFormat = "yyyy-MM-dd"; + const string DateTimeFormat = DateFormat + " HH:mm:ss"; + + Func csvStringEncoded = (o) => o == null ? null : $"\"{((string)o).Replace("\"", "\"\"")}\""; + Func csvToStringEncoded = (o) => o == null ? null : o.ToString(); + Func csvCurrencyEncoded = (o) => ((decimal?)o).HasValue ? ((decimal?)o).Value.ToString("C") : null; + Func csvDateEncoded = (o) => ((DateTime)o).ToString(DateFormat); + Func csvDateTimeEncoded = (o) => ((DateTime)o).ToString(DateTimeFormat); + Func csvNullableDateEncoded = (o) => ((DateTime?)o).HasValue ? csvDateEncoded(o) : null; + Func csvNullableDateTimeEncoded = (o) => ((DateTime?)o).HasValue ? csvDateTimeEncoded(o) : null; + + var metadata = new Dictionary>(); + + // Device Flag + metadata.Add(nameof(DeviceFlagExportOptions.Id), new List() { new Metadata(nameof(DeviceFlagExportOptions.Id), typeof(string), r => r.Assignment.DeviceFlagId, csvToStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.Name), new List() { new Metadata(nameof(DeviceFlagExportOptions.Name), typeof(string), r => r.Assignment.DeviceFlag.Name, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.Description), new List() { new Metadata(nameof(DeviceFlagExportOptions.Description), typeof(string), r => r.Assignment.DeviceFlag.Description, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.Icon), new List() { new Metadata(nameof(DeviceFlagExportOptions.Icon), typeof(string), r => r.Assignment.DeviceFlag.Icon, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.IconColour), new List() { new Metadata(nameof(DeviceFlagExportOptions.IconColour), typeof(string), r => r.Assignment.DeviceFlag.IconColour, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.AssignmentId), new List() { new Metadata(nameof(DeviceFlagExportOptions.AssignmentId), typeof(string), r => r.Assignment.Id, csvToStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.AddedDate), new List() { new Metadata(nameof(DeviceFlagExportOptions.AddedDate), typeof(string), r => r.Assignment.AddedDate, csvDateTimeEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.AddedUserId), new List() { new Metadata(nameof(DeviceFlagExportOptions.AddedUserId), typeof(string), r => r.Assignment.AddedUserId, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.RemovedUserId), new List() { new Metadata(nameof(DeviceFlagExportOptions.RemovedUserId), typeof(string), r => r.Assignment.RemovedUserId, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.RemovedDate), new List() { new Metadata(nameof(DeviceFlagExportOptions.RemovedDate), typeof(string), r => r.Assignment.RemovedDate, csvNullableDateTimeEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.Comments), new List() { new Metadata(nameof(DeviceFlagExportOptions.Comments), typeof(string), r => r.Assignment.Comments, csvStringEncoded) }); + + + // Device + metadata.Add(nameof(DeviceFlagExportOptions.DeviceSerialNumber), new List() { new Metadata(nameof(DeviceFlagExportOptions.DeviceSerialNumber), typeof(string), r => r.Assignment.Device.SerialNumber, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.DeviceAssetNumber), new List() { new Metadata(nameof(DeviceFlagExportOptions.DeviceAssetNumber), typeof(string), r => r.Assignment.Device.AssetNumber, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.DeviceLocation), new List() { new Metadata(nameof(DeviceFlagExportOptions.DeviceLocation), typeof(string), r => r.Assignment.Device.Location, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.DeviceComputerName), new List() { new Metadata(nameof(DeviceFlagExportOptions.DeviceComputerName), typeof(string), r => r.Assignment.Device.DeviceDomainId, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.DeviceLastNetworkLogon), new List() { new Metadata(nameof(DeviceFlagExportOptions.DeviceLastNetworkLogon), typeof(DateTime), r => r.Assignment.Device.LastNetworkLogonDate, csvNullableDateTimeEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.DeviceCreatedDate), new List() { new Metadata(nameof(DeviceFlagExportOptions.DeviceCreatedDate), typeof(DateTime), r => r.Assignment.Device.CreatedDate, csvDateTimeEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.DeviceFirstEnrolledDate), new List() { new Metadata(nameof(DeviceFlagExportOptions.DeviceFirstEnrolledDate), typeof(DateTime), r => r.Assignment.Device.EnrolledDate, csvNullableDateTimeEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.DeviceLastEnrolledDate), new List() { new Metadata(nameof(DeviceFlagExportOptions.DeviceLastEnrolledDate), typeof(DateTime), r => r.Assignment.Device.LastEnrolDate, csvNullableDateTimeEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.DeviceAllowUnauthenticatedEnrol), new List() { new Metadata(nameof(DeviceFlagExportOptions.DeviceAllowUnauthenticatedEnrol), typeof(bool), r => r.Assignment.Device.AllowUnauthenticatedEnrol, csvToStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.DeviceDecommissionedDate), new List() { new Metadata(nameof(DeviceFlagExportOptions.DeviceDecommissionedDate), typeof(DateTime), r => r.Assignment.Device.DecommissionedDate, csvNullableDateTimeEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.DeviceDecommissionedReason), new List() { new Metadata(nameof(DeviceFlagExportOptions.DeviceDecommissionedReason), typeof(string), r => r.Assignment.Device.DecommissionReason, csvToStringEncoded) }); + + // Model + metadata.Add(nameof(DeviceFlagExportOptions.ModelId), new List() { new Metadata(nameof(DeviceFlagExportOptions.ModelId), typeof(int), r => r.Assignment.Device.DeviceModel.Id, csvToStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.ModelDescription), new List() { new Metadata(nameof(DeviceFlagExportOptions.ModelDescription), typeof(string), r => r.Assignment.Device.DeviceModel.Description, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.ModelManufacturer), new List() { new Metadata(nameof(DeviceFlagExportOptions.ModelManufacturer), typeof(string), r => r.Assignment.Device.DeviceModel.Manufacturer, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.ModelModel), new List() { new Metadata(nameof(DeviceFlagExportOptions.ModelModel), typeof(string), r => r.Assignment.Device.DeviceModel.Model, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.ModelType), new List() { new Metadata(nameof(DeviceFlagExportOptions.ModelType), typeof(string), r => r.Assignment.Device.DeviceModel.ModelType, csvStringEncoded) }); + + // Batch + metadata.Add(nameof(DeviceFlagExportOptions.BatchId), new List() { new Metadata(nameof(DeviceFlagExportOptions.BatchId), typeof(int), r => r.Assignment.Device.DeviceBatch?.Id, csvToStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.BatchName), new List() { new Metadata(nameof(DeviceFlagExportOptions.BatchName), typeof(string), r => r.Assignment.Device.DeviceBatch?.Name, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.BatchPurchaseDate), new List() { new Metadata(nameof(DeviceFlagExportOptions.BatchPurchaseDate), typeof(DateTime), r => r.Assignment.Device.DeviceBatch?.PurchaseDate, csvNullableDateEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.BatchSupplier), new List() { new Metadata(nameof(DeviceFlagExportOptions.BatchSupplier), typeof(string), r => r.Assignment.Device.DeviceBatch?.Supplier, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.BatchUnitCost), new List() { new Metadata(nameof(DeviceFlagExportOptions.BatchUnitCost), typeof(decimal), r => r.Assignment.Device.DeviceBatch?.UnitCost, csvCurrencyEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.BatchWarrantyValidUntilDate), new List() { new Metadata(nameof(DeviceFlagExportOptions.BatchWarrantyValidUntilDate), typeof(DateTime), r => r.Assignment.Device.DeviceBatch?.WarrantyValidUntil, csvNullableDateEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.BatchInsuredDate), new List() { new Metadata(nameof(DeviceFlagExportOptions.BatchInsuredDate), typeof(DateTime), r => r.Assignment.Device.DeviceBatch?.InsuredDate, csvNullableDateEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.BatchInsuranceSupplier), new List() { new Metadata(nameof(DeviceFlagExportOptions.BatchInsuranceSupplier), typeof(string), r => r.Assignment.Device.DeviceBatch?.InsuranceSupplier, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.BatchInsuredUntilDate), new List() { new Metadata(nameof(DeviceFlagExportOptions.BatchInsuredUntilDate), typeof(DateTime), r => r.Assignment.Device.DeviceBatch?.InsuredUntil, csvNullableDateEncoded) }); + + // Profile + metadata.Add(nameof(DeviceFlagExportOptions.ProfileId), new List() { new Metadata(nameof(DeviceFlagExportOptions.ProfileId), typeof(int), r => r.Assignment.Device.DeviceProfile?.Id, csvToStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.ProfileName), new List() { new Metadata(nameof(DeviceFlagExportOptions.ProfileName), typeof(string), r => r.Assignment.Device.DeviceProfile?.Name, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.ProfileShortName), new List() { new Metadata(nameof(DeviceFlagExportOptions.ProfileShortName), typeof(string), r => r.Assignment.Device.DeviceProfile?.ShortName, csvStringEncoded) }); + + + // User + metadata.Add(nameof(DeviceFlagExportOptions.AssignedUserId), new List() { new Metadata(nameof(DeviceFlagExportOptions.AssignedUserId), typeof(string), r => r.Assignment.Device?.AssignedUser?.UserId, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.AssignedUserDisplayName), new List() { new Metadata(nameof(DeviceFlagExportOptions.AssignedUserDisplayName), typeof(string), r => r.Assignment.Device?.AssignedUser?.DisplayName, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.AssignedUserSurname), new List() { new Metadata(nameof(DeviceFlagExportOptions.AssignedUserSurname), typeof(string), r => r.Assignment.Device?.AssignedUser?.Surname, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.AssignedUserGivenName), new List() { new Metadata(nameof(DeviceFlagExportOptions.AssignedUserGivenName), typeof(string), r => r.Assignment.Device?.AssignedUser?.GivenName, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.AssignedUserPhoneNumber), new List() { new Metadata(nameof(DeviceFlagExportOptions.AssignedUserPhoneNumber), typeof(string), r => r.Assignment.Device?.AssignedUser?.PhoneNumber, csvStringEncoded) }); + metadata.Add(nameof(DeviceFlagExportOptions.AssignedUserEmailAddress), new List() { new Metadata(nameof(DeviceFlagExportOptions.AssignedUserEmailAddress), typeof(string), r => r.Assignment.Device?.AssignedUser?.EmailAddress, csvStringEncoded) }); + if (userDetailsCustomKeys != null) + { + var userDetailCustomFields = new List(); + foreach (var detailKey in userDetailsCustomKeys.OrderBy(k => k, StringComparer.OrdinalIgnoreCase)) + { + var key = detailKey; + userDetailCustomFields.Add(new Metadata(detailKey, detailKey, typeof(string), r => r.AssignedUserCustomDetails != null && r.AssignedUserCustomDetails.TryGetValue(key, out var value) ? value : null, csvStringEncoded)); + } + metadata.Add(nameof(DeviceFlagExportOptions.AssignedUserDetailCustom), userDetailCustomFields); + } + + return metadata; + } + + } +} diff --git a/Disco.Services/Devices/DeviceFlags/DeviceFlagExportTask.cs b/Disco.Services/Devices/DeviceFlags/DeviceFlagExportTask.cs new file mode 100644 index 00000000..f328f688 --- /dev/null +++ b/Disco.Services/Devices/DeviceFlags/DeviceFlagExportTask.cs @@ -0,0 +1,46 @@ +using Disco.Data.Repository; +using Disco.Models.Services.Devices.DeviceFlag; +using Disco.Services.Exporting; +using Disco.Services.Tasks; +using Quartz; + +namespace Disco.Services.Devices.DeviceFlags +{ + public class DeviceFlagExportTask : ScheduledTask + { + private const string JobDataMapContext = "Context"; + + public override string TaskName { get; } = "Export Device Flags"; + public override bool SingleInstanceTask { get { return false; } } + public override bool CancelInitiallySupported { get { return false; } } + + public static ExportTaskContext ScheduleNow(DeviceFlagExportOptions options) + { + // Build Context + var context = new ExportTaskContext(options); + + // Build Data Map + var task = new DeviceFlagExportTask(); + JobDataMap taskData = new JobDataMap() { { JobDataMapContext, context } }; + + // Schedule Task + context.TaskStatus = task.ScheduleTask(taskData); + + return context; + } + + protected override void ExecuteTask() + { + var context = (ExportTaskContext)ExecutionContext.JobDetail.JobDataMap[JobDataMapContext]; + + Status.UpdateStatus(10, "Exporting Device Flag Records", "Starting..."); + + using (DiscoDataContext Database = new DiscoDataContext()) + { + var export = new DeviceFlagExport(Database, context.Options); + + context.Result = export.Generate(Status); + } + } + } +} diff --git a/Disco.Services/Devices/DeviceFlags/DeviceFlagExtensions.cs b/Disco.Services/Devices/DeviceFlags/DeviceFlagExtensions.cs new file mode 100644 index 00000000..3c3dcb97 --- /dev/null +++ b/Disco.Services/Devices/DeviceFlags/DeviceFlagExtensions.cs @@ -0,0 +1,196 @@ +using Disco.Data.Repository; +using Disco.Models.Repository; +using Disco.Services.Authorization; +using Disco.Services.Expressions; +using Disco.Services.Logging; +using Disco.Services.Users; +using System; +using System.Collections; +using System.Data.Entity; +using System.Linq; + +namespace Disco.Services +{ + public static class DeviceFlagExtensions + { + + #region Edit Comments + public static bool CanEditComments(this DeviceFlagAssignment fa) + { + return UserService.CurrentAuthorization.Has(Claims.Device.Actions.EditFlags); + } + public static void OnEditComments(this DeviceFlagAssignment fa, string Comments) + { + if (!fa.CanEditComments()) + throw new InvalidOperationException("Editing comments for device flags is denied"); + + fa.Comments = string.IsNullOrWhiteSpace(Comments) ? null : Comments.Trim(); + } + #endregion + + #region Remove + public static bool CanRemove(this DeviceFlagAssignment fa) + { + if (fa.RemovedDate.HasValue) + return false; + + return UserService.CurrentAuthorization.Has(Claims.Device.Actions.RemoveFlags); + } + public static void OnRemove(this DeviceFlagAssignment fa, DiscoDataContext Database, User RemovingUser) + { + if (!fa.CanRemove()) + throw new InvalidOperationException("Removing device flags is denied"); + + fa.OnRemoveUnsafe(Database, RemovingUser); + } + + public static void OnRemoveUnsafe(this DeviceFlagAssignment fa, DiscoDataContext Database, User RemovingUser) + { + fa = Database.DeviceFlagAssignments + .Include(a => a.DeviceFlag) + .First(a => a.Id == fa.Id); + RemovingUser = Database.Users.First(u => u.UserId == RemovingUser.UserId); + + fa.RemovedDate = DateTime.Now; + fa.RemovedUserId = RemovingUser.UserId; + + if (!string.IsNullOrWhiteSpace(fa.DeviceFlag.OnUnassignmentExpression)) + { + try + { + Database.SaveChanges(); + var expressionResult = fa.EvaluateOnUnassignmentExpression(Database, RemovingUser, fa.AddedDate); + if (!string.IsNullOrWhiteSpace(expressionResult)) + { + fa.OnUnassignmentExpressionResult = expressionResult; + Database.SaveChanges(); + } + } + catch (Exception ex) + { + SystemLog.LogException("Device Flag Expression - OnUnassignmentExpression", ex); + } + } + } + #endregion + + #region Add + public static bool CanAddDeviceFlags(this Device d) + { + return UserService.CurrentAuthorization.Has(Claims.Device.Actions.AddFlags); + } + public static bool CanAddDeviceFlag(this Device d, DeviceFlag flag) + { + // Shortcut + if (!d.CanAddDeviceFlags()) + return false; + + // Already has Device Flag? + if (d.DeviceFlagAssignments.Any(fa => !fa.RemovedDate.HasValue && fa.DeviceFlagId == flag.Id)) + return false; + + return true; + } + public static DeviceFlagAssignment OnAddDeviceFlag(this Device d, DiscoDataContext Database, DeviceFlag flag, User AddingUser, string Comments) + { + if (!d.CanAddDeviceFlag(flag)) + throw new InvalidOperationException("Adding device flag is denied"); + + return d.OnAddDeviceFlagUnsafe(Database, flag, AddingUser, Comments); + } + + public static DeviceFlagAssignment OnAddDeviceFlagUnsafe(this Device d, DiscoDataContext Database, DeviceFlag flag, User AddingUser, string Comments) + { + flag = Database.DeviceFlags.First(f => f.Id == flag.Id); + d = Database.Devices.First(de => de.SerialNumber == d.SerialNumber); + AddingUser = Database.Users.First(user => user.UserId == AddingUser.UserId); + + var fa = new DeviceFlagAssignment() + { + DeviceFlag = flag, + Device = d, + AddedDate = DateTime.Now, + AddedUser = AddingUser, + AddedUserId = AddingUser.UserId, + Comments = string.IsNullOrWhiteSpace(Comments) ? null : Comments.Trim() + }; + + Database.DeviceFlagAssignments.Add(fa); + + if (!string.IsNullOrWhiteSpace(flag.OnAssignmentExpression)) + { + try + { + Database.SaveChanges(); + var expressionResult = fa.EvaluateOnAssignmentExpression(Database, AddingUser, fa.AddedDate); + if (!string.IsNullOrWhiteSpace(expressionResult)) + { + fa.OnAssignmentExpressionResult = expressionResult; + Database.SaveChanges(); + } + } + catch (Exception ex) + { + SystemLog.LogException("Device Flag Expression - OnAssignmentExpression", ex); + } + } + + return fa; + } + #endregion + + #region Expressions + + public static Expression OnAssignmentExpressionFromCache(this DeviceFlag uf) + { + return ExpressionCache.GetOrCreateSingleExpressions($"DeviceFlag_OnAssignmentExpression_{uf.Id}", () => Expression.TokenizeSingleDynamic(null, uf.OnAssignmentExpression, 0)); + } + + public static void OnAssignmentExpressionInvalidateCache(this DeviceFlag uf) + { + ExpressionCache.InvalidateSingleCache($"DeviceFlag_OnAssignmentExpression_{uf.Id}"); + } + + public static string EvaluateOnAssignmentExpression(this DeviceFlagAssignment dfa, DiscoDataContext Database, User AddingUser, DateTime TimeStamp) + { + if (!string.IsNullOrEmpty(dfa.DeviceFlag.OnAssignmentExpression)) + { + Expression compiledExpression = dfa.DeviceFlag.OnAssignmentExpressionFromCache(); + IDictionary evaluatorVariables = Expression.StandardVariables(null, Database, AddingUser, TimeStamp, null, dfa.Device); + object result = compiledExpression.EvaluateFirst(dfa, evaluatorVariables); + if (result == null) + return null; + else + return result.ToString(); + } + return null; + } + + public static Expression OnUnassignmentExpressionFromCache(this DeviceFlag df) + { + return ExpressionCache.GetOrCreateSingleExpressions($"DeviceFlag_OnUnassignmentExpression_{df.Id}", () => Expression.TokenizeSingleDynamic(null, df.OnUnassignmentExpression, 0)); + } + + public static void OnUnassignmentExpressionInvalidateCache(this DeviceFlag df) + { + ExpressionCache.InvalidateSingleCache($"DeviceFlag_OnUnassignmentExpression_{df.Id}"); + } + + public static string EvaluateOnUnassignmentExpression(this DeviceFlagAssignment dfa, DiscoDataContext Database, User RemovingUser, DateTime TimeStamp) + { + if (!string.IsNullOrEmpty(dfa.DeviceFlag.OnUnassignmentExpression)) + { + Expression compiledExpression = dfa.DeviceFlag.OnUnassignmentExpressionFromCache(); + IDictionary evaluatorVariables = Expression.StandardVariables(null, Database, RemovingUser, TimeStamp, null, dfa.Device); + object result = compiledExpression.EvaluateFirst(dfa, evaluatorVariables); + if (result == null) + return null; + else + return result.ToString(); + } + return null; + } + + #endregion + } +} diff --git a/Disco.Services/Devices/DeviceFlags/DeviceFlagService.cs b/Disco.Services/Devices/DeviceFlags/DeviceFlagService.cs new file mode 100644 index 00000000..adb35f1c --- /dev/null +++ b/Disco.Services/Devices/DeviceFlags/DeviceFlagService.cs @@ -0,0 +1,241 @@ +using Disco.Data.Repository; +using Disco.Data.Repository.Monitor; +using Disco.Models.Repository; +using Disco.Services.Extensions; +using Disco.Services.Tasks; +using System; +using System.Collections.Generic; +using System.Data.Entity; +using System.Linq; +using System.Reactive.Linq; + +namespace Disco.Services.Devices.DeviceFlags +{ + public static class DeviceFlagService + { + private static Cache _cache; + internal static Lazy> DeviceFlagAssignmentRepositoryEvents; + + static DeviceFlagService() + { + // Statically defined (lazy) Assignment Repository Definition + DeviceFlagAssignmentRepositoryEvents = + new Lazy>(() => + RepositoryMonitor.StreamAfterCommit.Where(e => + e.EntityType == typeof(DeviceFlagAssignment) && + (e.EventType != RepositoryMonitorEventType.Modified || + e.ModifiedProperties.Contains(nameof(DeviceFlagAssignment.RemovedDate))) + ) + ); + } + + public static void Initialize(DiscoDataContext database) + { + _cache = new Cache(database); + + // Initialize Managed Groups (if configured) + _cache.GetDeviceFlags().ForEach(uf => + { + DeviceFlagDevicesManagedGroup.Initialize(uf); + DeviceFlagDeviceAssignedUsersManagedGroup.Initialize(uf); + }); + } + + public static List GetDeviceFlags() { return _cache.GetDeviceFlags(); } + public static DeviceFlag GetDeviceFlag(int deviceFlagId) { return _cache.GetDeviceFlag(deviceFlagId); } + + #region Device Flag Maintenance + public static DeviceFlag CreateDeviceFlag(DiscoDataContext database, DeviceFlag deviceFlag) + { + // Verify + if (string.IsNullOrWhiteSpace(deviceFlag.Name)) + throw new ArgumentException("The Device Flag Name is required", nameof(deviceFlag)); + + // Name Unique + if (_cache.GetDeviceFlags().Any(f => f.Name == deviceFlag.Name)) + throw new ArgumentException("Another Device Flag already exists with that name", nameof(deviceFlag)); + + // Clone to break reference + var flag = new DeviceFlag() + { + Name = deviceFlag.Name, + Description = deviceFlag.Description, + Icon = deviceFlag.Icon, + IconColour = deviceFlag.IconColour, + DevicesLinkedGroup = deviceFlag.DevicesLinkedGroup, + DeviceUsersLinkedGroup = deviceFlag.DeviceUsersLinkedGroup, + }; + + database.DeviceFlags.Add(flag); + database.SaveChanges(); + + _cache.AddOrUpdate(flag); + + return flag; + } + public static DeviceFlag Update(DiscoDataContext database, DeviceFlag deviceFlag) + { + // Verify + if (string.IsNullOrWhiteSpace(deviceFlag.Name)) + throw new ArgumentException("The Device Flag Name is required", nameof(deviceFlag)); + + // Name Unique + if (_cache.GetDeviceFlags().Any(f => f.Id != deviceFlag.Id && f.Name == deviceFlag.Name)) + throw new ArgumentException("Another Device Flag already exists with that name", nameof(deviceFlag)); + + database.SaveChanges(); + + _cache.AddOrUpdate(deviceFlag); + DeviceFlagDevicesManagedGroup.Initialize(deviceFlag); + DeviceFlagDeviceAssignedUsersManagedGroup.Initialize(deviceFlag); + + return deviceFlag; + } + public static void DeleteDeviceFlag(DiscoDataContext database, int deviceFlagId, IScheduledTaskStatus status) + { + var flag = database.DeviceFlags.Find(deviceFlagId); + + // Dispose of AD Managed Groups + Interop.ActiveDirectory.ActiveDirectory.Context.ManagedGroups.Remove(DeviceFlagDeviceAssignedUsersManagedGroup.GetKey(flag)); + Interop.ActiveDirectory.ActiveDirectory.Context.ManagedGroups.Remove(DeviceFlagDevicesManagedGroup.GetKey(flag)); + + // Delete Assignments + status.UpdateStatus(0, $"Removing '{flag.Name}' [{flag.Id}] Device Flag", "Starting"); + var flagAssignments = database.DeviceFlagAssignments.Where(fa => fa.DeviceFlagId == flag.Id).ToList(); + if (flagAssignments.Count > 0) + { + status.UpdateStatus(20, "Removing flag from devices"); + flagAssignments.ForEach(flagAssignment => database.DeviceFlagAssignments.Remove(flagAssignment)); + database.SaveChanges(); + } + + // Delete Flag + status.UpdateStatus(90, "Deleting Device Flag"); + database.DeviceFlags.Remove(flag); + database.SaveChanges(); + + // Remove from Cache + _cache.Remove(deviceFlagId); + + status.Finished($"Successfully Deleted Device Flag: '{flag.Name}' [{flag.Id}]"); + } + #endregion + + #region Bulk Assignment + public static IEnumerable BulkAssignAddDevices(DiscoDataContext database, DeviceFlag deviceFlag, User technician, string comments, List devices, IScheduledTaskStatus status) + { + if (devices.Count > 0) + { + double progressInterval; + const int databaseChunkSize = 100; + comments = string.IsNullOrWhiteSpace(comments) ? null : comments.Trim(); + + var addDevices = devices.Where(d => !d.DeviceFlagAssignments.Any(a => a.DeviceFlagId == deviceFlag.Id && !a.RemovedDate.HasValue)).ToList(); + + progressInterval = (double)100 / addDevices.Count; + + var addedDeviceAssignments = addDevices.Chunk(databaseChunkSize).SelectMany((chunk, chunkIndex) => + { + var chunkIndexOffset = databaseChunkSize * chunkIndex; + + var chunkResults = chunk.Select((device, index) => + { + status.UpdateStatus((chunkIndexOffset + index) * progressInterval, $"Assigning Flag: {device}"); + + return device.OnAddDeviceFlag(database, deviceFlag, technician, comments); + }).ToList(); + + // Save Chunk Items to Database + database.SaveChanges(); + + return chunkResults; + }).Where(fa => fa != null).ToList(); + + status.SetFinishedMessage($"{addDevices.Count} Devices/s Added; {(devices.Count - addDevices.Count)} Devices/s Skipped"); + + return addedDeviceAssignments; + } + else + { + status.SetFinishedMessage("No changes found"); + return Enumerable.Empty(); + } + } + + public static IEnumerable BulkAssignOverrideDevices(DiscoDataContext database, DeviceFlag deviceFlag, User technician, string comments, List devices, IScheduledTaskStatus status) + { + double progressInterval; + const int databaseChunkSize = 100; + comments = string.IsNullOrWhiteSpace(comments) ? null : comments.Trim(); + + status.UpdateStatus(0, "Calculating assignment changes"); + + var currentAssignments = database.DeviceFlagAssignments.Include(fa => fa.Device).Where(a => a.DeviceFlagId == deviceFlag.Id && !a.RemovedDate.HasValue).ToList(); + var removeAssignments = currentAssignments.Where(ca => !devices.Any(d => d.SerialNumber.Equals(ca.DeviceSerialNumber, StringComparison.OrdinalIgnoreCase))).ToList(); + var addAssignments = devices.Where(d => !currentAssignments.Any(ca => ca.DeviceSerialNumber.Equals(d.SerialNumber, StringComparison.OrdinalIgnoreCase))).ToList(); + + if (removeAssignments.Count > 0 || addAssignments.Count > 0) + { + progressInterval = (double)100 / (removeAssignments.Count + addAssignments.Count); + var removedDateTime = DateTime.Now; + + // Remove Assignments + removeAssignments.Chunk(databaseChunkSize).SelectMany((chunk, chunkIndex) => + { + var chunkIndexOffset = (chunkIndex * databaseChunkSize) + removeAssignments.Count; + + var chunkResults = chunk.Select((flagAssignment, index) => + { + status.UpdateStatus((chunkIndexOffset + index) * progressInterval, $"Removing Flag: {flagAssignment.Device}"); + + flagAssignment.OnRemoveUnsafe(database, technician); + + return flagAssignment; + }).ToList(); + + // Save Chunk Items to Database + database.SaveChanges(); + + return chunkResults; + }).ToList(); + + // Add Assignments + var addedAssignments = addAssignments.Chunk(databaseChunkSize).SelectMany((chunk, chunkIndex) => + { + var chunkIndexOffset = (chunkIndex * databaseChunkSize) + removeAssignments.Count; + + var chunkResults = chunk.Select((device, index) => + { + status.UpdateStatus((chunkIndexOffset + index) * progressInterval, $"Assigning Flag: {device}"); + + return device.OnAddDeviceFlag(database, deviceFlag, technician, comments); + }).ToList(); + + // Save Chunk Items to Database + database.SaveChanges(); + + return chunkResults; + }).ToList(); + + status.SetFinishedMessage($"{addAssignments.Count} Devices/s Added; {removeAssignments.Count} Devices/s Removed; {(devices.Count - addAssignments.Count)} Devices/s Skipped"); + + return addedAssignments; + } + else + { + status.SetFinishedMessage("No changes found"); + return Enumerable.Empty(); + } + } + #endregion + + public static string RandomUnusedIcon() + { + return UIHelpers.RandomIcon(_cache.GetDeviceFlags().Select(f => f.Icon)); + } + public static string RandomUnusedThemeColour() + { + return UIHelpers.RandomThemeColour(_cache.GetDeviceFlags().Select(f => f.IconColour)); + } + } +} diff --git a/Disco.Services/Devices/DeviceFlags/DeviceFlagsBulkAssignTask.cs b/Disco.Services/Devices/DeviceFlags/DeviceFlagsBulkAssignTask.cs new file mode 100644 index 00000000..ab6a54c5 --- /dev/null +++ b/Disco.Services/Devices/DeviceFlags/DeviceFlagsBulkAssignTask.cs @@ -0,0 +1,84 @@ +using Disco.Data.Repository; +using Disco.Models.Repository; +using Disco.Services.Tasks; +using Quartz; +using System; +using System.Collections.Generic; +using System.Data.Entity; +using System.Linq; + +namespace Disco.Services.Devices.DeviceFlags +{ + public class DeviceFlagBulkAssignTask : ScheduledTask + { + public override string TaskName { get { return "Device Flags - Bulk Assign Devices"; } } + + public override bool SingleInstanceTask { get { return false; } } + public override bool CancelInitiallySupported { get { return false; } } + public override bool LogExceptionsOnly { get { return true; } } + + protected override void ExecuteTask() + { + int deviceFlagId = (int)ExecutionContext.JobDetail.JobDataMap["DeviceFlagId"]; + string technicianUserId = (string)ExecutionContext.JobDetail.JobDataMap["TechnicianUserId"]; + string comments = (string)ExecutionContext.JobDetail.JobDataMap["Comments"]; + List deviceSerialNumbers = (List)ExecutionContext.JobDetail.JobDataMap["DeviceSerialNumbers"]; + bool @override = (bool)ExecutionContext.JobDetail.JobDataMap["Override"]; + + using (DiscoDataContext Database = new DiscoDataContext()) + { + // Load Flag + var flag = Database.DeviceFlags.FirstOrDefault(uf => uf.Id == deviceFlagId); + if (flag == null) + throw new Exception("Invalid Device Flag Id"); + + Status.UpdateStatus(0, string.Format("Bulk Assigning Devices to Device Flag: {0}", flag.Name), "Preparing to start"); + + // Load Technician + var technician = Database.Users.FirstOrDefault(user => user.UserId == technicianUserId); + if (technician == null) + throw new Exception("Invalid Technician User Id"); + + // Parse Devices + Status.UpdateStatus(10, "Loading devices from the database"); + var devices = Database.Devices + .Include(d => d.DeviceFlagAssignments) + .Where(d => deviceSerialNumbers.Contains(d.SerialNumber)).ToList(); + + var missingDevices = deviceSerialNumbers.Where(sn => !devices.Any(u => string.Equals(sn, u.SerialNumber, StringComparison.OrdinalIgnoreCase))).ToList(); + if (missingDevices.Count > 0) + { + throw new InvalidOperationException(string.Format("Bulk assignment aborted, invalid Serial Numbers: {0}", string.Join(", ", missingDevices))); + } + devices = devices.OrderBy(d => d.SerialNumber).ToList(); + + Status.ProgressOffset = 50; + Status.ProgressMultiplier = 0.5; + + if (@override) + { + DeviceFlagService.BulkAssignOverrideDevices(Database, flag, technician, comments, devices, Status); + } + else + { + DeviceFlagService.BulkAssignAddDevices(Database, flag, technician, comments, devices, Status); + } + } + } + + public static ScheduledTaskStatus ScheduleBulkAssignDevices(DeviceFlag deviceFlag, User technician, string comments, List deviceSerialNumbers, bool @override) + { + JobDataMap taskData = new JobDataMap() { + {"DeviceFlagId", deviceFlag.Id }, + {"TechnicianUserId", technician.UserId }, + {"Comments", comments }, + {"DeviceSerialNumbers", deviceSerialNumbers }, + {"Override", @override } + }; + + var instance = new DeviceFlagBulkAssignTask(); + + return instance.ScheduleTask(taskData); + } + } +} \ No newline at end of file diff --git a/Disco.Services/Devices/DeviceFlags/DeviceFlagsDeleteTask.cs b/Disco.Services/Devices/DeviceFlags/DeviceFlagsDeleteTask.cs new file mode 100644 index 00000000..72029483 --- /dev/null +++ b/Disco.Services/Devices/DeviceFlags/DeviceFlagsDeleteTask.cs @@ -0,0 +1,34 @@ +using Disco.Data.Repository; +using Disco.Services.Tasks; +using Quartz; + +namespace Disco.Services.Devices.DeviceFlags +{ + public class DeviceFlagDeleteTask : ScheduledTask + { + public override string TaskName { get { return "Device Flags - Delete Flag"; } } + + public override bool SingleInstanceTask { get { return false; }} + public override bool CancelInitiallySupported { get { return false; } } + public override bool LogExceptionsOnly { get { return true; } } + + protected override void ExecuteTask() + { + int deviceFlagId = (int)ExecutionContext.JobDetail.JobDataMap["DeviceFlagId"]; + + using (DiscoDataContext Database = new DiscoDataContext()) + { + DeviceFlagService.DeleteDeviceFlag(Database, deviceFlagId, Status); + } + } + + public static ScheduledTaskStatus ScheduleNow(int deviceFlagId) + { + var taskData = new JobDataMap() { { "DeviceFlagId", deviceFlagId } }; + + var instance = new DeviceFlagDeleteTask(); + + return instance.ScheduleTask(taskData); + } + } +} \ No newline at end of file diff --git a/Disco.Services/Disco.Services.csproj b/Disco.Services/Disco.Services.csproj index baf519b5..cb6e5646 100644 --- a/Disco.Services/Disco.Services.csproj +++ b/Disco.Services/Disco.Services.csproj @@ -194,6 +194,7 @@ + @@ -248,6 +249,15 @@ + + + + + + + + + diff --git a/Disco.Services/Interop/ActiveDirectory/ActiveDirectoryManagedGroups.cs b/Disco.Services/Interop/ActiveDirectory/ActiveDirectoryManagedGroups.cs index 0b0c0a85..37168053 100644 --- a/Disco.Services/Interop/ActiveDirectory/ActiveDirectoryManagedGroups.cs +++ b/Disco.Services/Interop/ActiveDirectory/ActiveDirectoryManagedGroups.cs @@ -61,10 +61,25 @@ namespace Disco.Services.Interop.ActiveDirectory return false; } + public bool TryGetValue(string Key, out ADManagedGroup ManagedGroup) { return managedGroups.TryGetValue(Key, out ManagedGroup); } + public bool TryGetValue(string key, out T managedGroup) where T : ADManagedGroup + { + if (managedGroups.TryGetValue(key, out var item) && item is T typedItem) + { + managedGroup = typedItem; + return true; + } + else + { + managedGroup = null; + return false; + } + } + public List Values { get diff --git a/Disco.Services/Searching/Search.cs b/Disco.Services/Searching/Search.cs index 2d2c2847..3ae2adef 100644 --- a/Disco.Services/Searching/Search.cs +++ b/Disco.Services/Searching/Search.cs @@ -229,6 +229,14 @@ namespace Disco.Services.Searching .ToUserSearchResultItems(null); } + public static List SearchDeviceFlag(DiscoDataContext Database, int deviceFlagId) + { + return Database.DeviceFlagAssignments + .Where(a => a.DeviceFlagId == deviceFlagId && !a.RemovedDate.HasValue) + .Select(a => a.Device) + .ToDeviceSearchResultItems(null); + } + private static List ToUserSearchResultItems(this IQueryable Query, int? LimitCount = ActiveDirectory.DefaultSearchResultLimit) { if (LimitCount.HasValue) @@ -315,7 +323,8 @@ namespace Disco.Services.Searching DecommissionedDate = d.DecommissionedDate, AssignedUserId = d.AssignedUserId, AssignedUserDisplayName = d.AssignedUser.DisplayName, - JobCount = d.Jobs.Count() + JobCount = d.Jobs.Count(), + DeviceFlagAssignments = d.DeviceFlagAssignments, }).ToList(); } #endregion diff --git a/Disco.Web/App_Start/AppConfig.cs b/Disco.Web/App_Start/AppConfig.cs index 54dc5c09..b1dbd6d0 100644 --- a/Disco.Web/App_Start/AppConfig.cs +++ b/Disco.Web/App_Start/AppConfig.cs @@ -59,8 +59,9 @@ namespace Disco.Web // Initialize Job Queues Disco.Services.Jobs.JobQueues.JobQueueService.Initialize(Database); - // Initialize User Flags + // Initialize Flags Disco.Services.Users.UserFlags.UserFlagService.Initialize(Database); + Disco.Services.Devices.DeviceFlags.DeviceFlagService.Initialize(Database); // Initialize Satellite Managed Groups (which don't belong to any other component) Disco.Services.Devices.ManagedGroups.DeviceManagedGroups.Initialize(Database); diff --git a/Disco.Web/Areas/API/Controllers/DeviceFlagAssignmentController.cs b/Disco.Web/Areas/API/Controllers/DeviceFlagAssignmentController.cs new file mode 100644 index 00000000..1aa8f054 --- /dev/null +++ b/Disco.Web/Areas/API/Controllers/DeviceFlagAssignmentController.cs @@ -0,0 +1,123 @@ +using Disco.Models.Repository; +using Disco.Services; +using Disco.Services.Authorization; +using Disco.Services.Web; +using System; +using System.Data.Entity; +using System.Linq; +using System.Web.Mvc; + +namespace Disco.Web.Areas.API.Controllers +{ + public partial class DeviceFlagAssignmentController : AuthorizedDatabaseController + { + const string pComments = "comments"; + + public virtual ActionResult Update(int id, string key, string value = null, bool? redirect = null) + { + try + { + if (id < 0) + throw new ArgumentOutOfRangeException(nameof(id)); + if (string.IsNullOrEmpty(key)) + throw new ArgumentNullException(nameof(key)); + var assignment = Database.DeviceFlagAssignments.FirstOrDefault(a => a.Id == id); + if (assignment != null) + { + switch (key.ToLower()) + { + case pComments: + UpdateComments(assignment, value); + break; + default: + throw new Exception("Invalid Update Key"); + } + } + else + { + throw new Exception("Invalid Device Flag Assignment Id"); + } + if (redirect.HasValue && redirect.Value) + return Redirect($"{Url.Action(MVC.Device.Show(assignment.DeviceSerialNumber))}#DeviceDetailTab-Flags"); + else + return Json("OK", JsonRequestBehavior.AllowGet); + } + catch (Exception ex) + { + if (redirect.HasValue && redirect.Value) + throw; + else + return Json($"Error: {ex.Message}", JsonRequestBehavior.AllowGet); + } + } + + #region Update Shortcut Methods + [DiscoAuthorizeAny(Claims.Device.Actions.EditFlags)] + public virtual ActionResult UpdateComments(int id, string Comments = null, bool? redirect = null) + { + return Update(id, pComments, Comments, redirect); + } + #endregion + + #region Update Properties + private void UpdateComments(DeviceFlagAssignment assignment, string Comments) + { + if (!assignment.CanEditComments()) + throw new InvalidOperationException("Editing comments for device flags is denied"); + + assignment.OnEditComments(Comments); + Database.SaveChanges(); + } + #endregion + + #region Actions + + [DiscoAuthorizeAny(Claims.Device.Actions.AddFlags)] + public virtual ActionResult AddDevice(int id, string DeviceSerialNumber, string Comments) + { + Database.Configuration.LazyLoadingEnabled = true; + + var flag = Database.DeviceFlags.Find(id); + if (flag == null) + throw new ArgumentException("Invalid Device Flag Id", nameof(id)); + + var device = Database.Devices.Include(u => u.DeviceFlagAssignments).FirstOrDefault(d => d.SerialNumber == DeviceSerialNumber); + if (device == null) + throw new ArgumentException("Invalid Device Serial Number", nameof(DeviceSerialNumber)); + + if (!device.CanAddDeviceFlag(flag)) + throw new InvalidOperationException("Adding device flag is denied"); + + var addingUser = Database.Users.Find(CurrentUser.UserId); + + var assignment = device.OnAddDeviceFlag(Database, flag, addingUser, Comments); + + Database.SaveChanges(); + + return Redirect($"{Url.Action(MVC.Device.Show(device.SerialNumber))}#DeviceDetailTab-Flags"); + } + + [DiscoAuthorizeAny(Claims.Device.Actions.RemoveFlags)] + public virtual ActionResult RemoveDevice(int id) + { + Database.Configuration.LazyLoadingEnabled = true; + + var assignment = Database.DeviceFlagAssignments.FirstOrDefault(a => a.Id == id); + if (assignment == null) + throw new ArgumentException("Invalid Device Flag Assignment Id", nameof(id)); + + if (!assignment.CanRemove()) + throw new InvalidOperationException("Removing device flag assignment is denied"); + + var removingUser = Database.Users.Find(CurrentUser.UserId); + + assignment.OnRemove(Database, removingUser); + Database.SaveChanges(); + + return Redirect($"{Url.Action(MVC.Device.Show(assignment.DeviceSerialNumber))}#DeviceDetailTab-Flags"); + } + + #endregion + + } +} \ No newline at end of file diff --git a/Disco.Web/Areas/API/Controllers/DeviceFlagController.cs b/Disco.Web/Areas/API/Controllers/DeviceFlagController.cs new file mode 100644 index 00000000..25b851d2 --- /dev/null +++ b/Disco.Web/Areas/API/Controllers/DeviceFlagController.cs @@ -0,0 +1,454 @@ +using Disco.Models.Repository; +using Disco.Models.Services.Devices.DeviceFlag; +using Disco.Services; +using Disco.Services.Authorization; +using Disco.Services.Devices.DeviceFlags; +using Disco.Services.Exporting; +using Disco.Services.Interop.ActiveDirectory; +using Disco.Services.Tasks; +using Disco.Services.Web; +using Disco.Web.Areas.Config.Models.DeviceFlag; +using Disco.Web.Extensions; +using System; +using System.Linq; +using System.Web; +using System.Web.Caching; +using System.Web.Mvc; + +namespace Disco.Web.Areas.API.Controllers +{ + public partial class DeviceFlagController : AuthorizedDatabaseController + { + const string pName = "name"; + const string pDescription = "description"; + const string pIcon = "icon"; + const string pIconColour = "iconcolour"; + const string pOnAssignmentExpression = "onassignmentexpression"; + const string pOnUnassignmentExpression = "onunassignmentexpression"; + + [DiscoAuthorize(Claims.Config.DeviceFlag.Configure)] + public virtual ActionResult Update(int id, string key, string value = null, bool? redirect = null) + { + Authorization.Require(Claims.Config.DeviceFlag.Configure); + + try + { + if (id < 0) + throw new ArgumentOutOfRangeException("id"); + if (string.IsNullOrEmpty(key)) + throw new ArgumentNullException("key"); + var flag = Database.DeviceFlags.Find(id); + if (flag != null) + { + switch (key.ToLower()) + { + case pName: + UpdateName(flag, value); + break; + case pDescription: + UpdateDescription(flag, value); + break; + case pIcon: + UpdateIcon(flag, value); + break; + case pIconColour: + UpdateIconColour(flag, value); + break; + case pOnAssignmentExpression: + UpdateOnAssignmentExpression(flag, value); + break; + case pOnUnassignmentExpression: + UpdateOnUnassignmentExpression(flag, value); + break; + default: + throw new Exception("Invalid Update Key"); + } + } + else + { + throw new Exception("Invalid Device Flag Id"); + } + if (redirect.HasValue && redirect.Value) + return RedirectToAction(MVC.Config.DeviceFlag.Index(flag.Id)); + else + return Json("OK", JsonRequestBehavior.AllowGet); + } + catch (Exception ex) + { + if (redirect.HasValue && redirect.Value) + throw; + else + return Json($"Error: {ex.Message}", JsonRequestBehavior.AllowGet); + } + } + + #region Update Shortcut Methods + [DiscoAuthorize(Claims.Config.DeviceFlag.Configure)] + public virtual ActionResult UpdateName(int id, string FlagName = null, bool? redirect = null) + { + return Update(id, pName, FlagName, redirect); + } + + [DiscoAuthorize(Claims.Config.DeviceFlag.Configure)] + public virtual ActionResult UpdateDescription(int id, string Description = null, bool? redirect = null) + { + return Update(id, pDescription, Description, redirect); + } + + [DiscoAuthorize(Claims.Config.DeviceFlag.Configure)] + public virtual ActionResult UpdateIcon(int id, string Icon = null, bool? redirect = null) + { + return Update(id, pIcon, Icon, redirect); + } + + [DiscoAuthorize(Claims.Config.DeviceFlag.Configure)] + public virtual ActionResult UpdateIconColour(int id, string IconColour = null, bool? redirect = null) + { + return Update(id, pIconColour, IconColour, redirect); + } + + [DiscoAuthorize(Claims.Config.DeviceFlag.Configure)] + public virtual ActionResult UpdateIconAndColour(int id, string Icon = null, string IconColour = null, bool redirect = false) + { + try + { + if (id < 0) + throw new ArgumentOutOfRangeException("id"); + + var DeviceFlag = Database.DeviceFlags.Find(id); + if (DeviceFlag != null) + { + UpdateIconAndColour(DeviceFlag, Icon, IconColour); + } + else + { + throw new ArgumentException("Invalid Device Flag Id", "id"); + } + if (redirect) + return RedirectToAction(MVC.Config.DeviceFlag.Index(DeviceFlag.Id)); + else + return Json("OK", JsonRequestBehavior.AllowGet); + } + catch (Exception ex) + { + if (redirect) + throw; + else + return Json(string.Format("Error: {0}", ex.Message), JsonRequestBehavior.AllowGet); + } + } + [DiscoAuthorize(Claims.Config.DeviceFlag.Configure)] + public virtual ActionResult UpdateOnAssignmentExpression(int id, string OnAssignmentExpression = null, bool redirect = false) + { + return Update(id, pOnAssignmentExpression, OnAssignmentExpression, redirect); + } + [DiscoAuthorize(Claims.Config.DeviceFlag.Configure)] + public virtual ActionResult UpdateOnUnassignmentExpression(int id, string OnUnassignmentExpression = null, bool redirect = false) + { + return Update(id, pOnUnassignmentExpression, OnUnassignmentExpression, redirect); + } + [DiscoAuthorize(Claims.Config.DeviceFlag.Configure)] + public virtual ActionResult UpdateDevicesLinkedGroup(int id, string GroupId = null, DateTime? FilterBeginDate = null, bool redirect = false) + { + try + { + if (id < 0) + throw new ArgumentOutOfRangeException("id"); + + var deviceFlag = Database.DeviceFlags.Find(id); + if (deviceFlag == null) + throw new ArgumentException("Invalid Device Flag Id", "id"); + + + var syncTaskStatus = UpdateDevicesLinkedGroup(deviceFlag, GroupId, FilterBeginDate); + if (redirect) + if (syncTaskStatus == null) + return RedirectToAction(MVC.Config.DeviceFlag.Index(deviceFlag.Id)); + else + { + syncTaskStatus.SetFinishedUrl(Url.Action(MVC.Config.DeviceFlag.Index(deviceFlag.Id))); + return RedirectToAction(MVC.Config.Logging.TaskStatus(syncTaskStatus.SessionId)); + } + else + return Json("OK", JsonRequestBehavior.AllowGet); + } + catch (Exception ex) + { + if (redirect) + throw; + else + return Json($"Error: {ex.Message}", JsonRequestBehavior.AllowGet); + } + } + [DiscoAuthorize(Claims.Config.DeviceFlag.Configure)] + public virtual ActionResult UpdateAssignedUserLinkedGroup(int id, string GroupId = null, DateTime? FilterBeginDate = null, bool redirect = false) + { + try + { + if (id < 0) + throw new ArgumentOutOfRangeException("id"); + + var DeviceFlag = Database.DeviceFlags.Find(id); + if (DeviceFlag == null) + throw new ArgumentException("Invalid Device Flag Id", "id"); + + + var syncTaskStatus = UpdateAssignedUserLinkedGroup(DeviceFlag, GroupId, FilterBeginDate); + if (redirect) + if (syncTaskStatus == null) + return RedirectToAction(MVC.Config.DeviceFlag.Index(DeviceFlag.Id)); + else + { + syncTaskStatus.SetFinishedUrl(Url.Action(MVC.Config.DeviceFlag.Index(DeviceFlag.Id))); + return RedirectToAction(MVC.Config.Logging.TaskStatus(syncTaskStatus.SessionId)); + } + else + return Json("OK", JsonRequestBehavior.AllowGet); + } + catch (Exception ex) + { + if (redirect) + throw; + else + return Json($"Error: {ex.Message}", JsonRequestBehavior.AllowGet); + } + } + #endregion + + #region Update Properties + private void UpdateIconAndColour(DeviceFlag deviceFlag, string icon, string iconColour) + { + if (string.IsNullOrWhiteSpace(icon)) + throw new ArgumentNullException("Icon"); + if (string.IsNullOrWhiteSpace(iconColour)) + throw new ArgumentNullException("IconColour"); + + if (deviceFlag.Icon != icon || + deviceFlag.IconColour != iconColour) + { + deviceFlag.Icon = icon; + deviceFlag.IconColour = iconColour; + DeviceFlagService.Update(Database, deviceFlag); + } + } + private void UpdateIcon(DeviceFlag deviceFlag, string icon) + { + if (string.IsNullOrWhiteSpace(icon)) + throw new ArgumentNullException("Icon"); + + if (deviceFlag.Icon != icon) + { + deviceFlag.Icon = icon; + DeviceFlagService.Update(Database, deviceFlag); + } + } + private void UpdateIconColour(DeviceFlag deviceFlag, string iconColour) + { + if (string.IsNullOrWhiteSpace(iconColour)) + throw new ArgumentNullException("IconColour"); + + if (deviceFlag.IconColour != iconColour) + { + deviceFlag.IconColour = iconColour; + DeviceFlagService.Update(Database, deviceFlag); + } + } + + private void UpdateName(DeviceFlag deviceFlag, string name) + { + if (deviceFlag.Name != name) + { + deviceFlag.Name = name; + DeviceFlagService.Update(Database, deviceFlag); + } + } + + private void UpdateDescription(DeviceFlag deviceFlag, string description) + { + if (deviceFlag.Description != description) + { + deviceFlag.Description = description; + DeviceFlagService.Update(Database, deviceFlag); + } + } + + private void UpdateOnAssignmentExpression(DeviceFlag deviceFlag, string onAssignmentExpression) + { + if (string.IsNullOrWhiteSpace(onAssignmentExpression)) + { + deviceFlag.OnAssignmentExpression = null; + } + else + { + deviceFlag.OnAssignmentExpression = onAssignmentExpression.Trim(); + } + // Invalidate Cache + deviceFlag.OnAssignmentExpressionInvalidateCache(); + + DeviceFlagService.Update(Database, deviceFlag); + } + + private void UpdateOnUnassignmentExpression(DeviceFlag deviceFlag, string onUnassignmentExpression) + { + if (string.IsNullOrWhiteSpace(onUnassignmentExpression)) + { + deviceFlag.OnUnassignmentExpression = null; + } + else + { + deviceFlag.OnUnassignmentExpression = onUnassignmentExpression.Trim(); + } + // Invalidate Cache + deviceFlag.OnUnassignmentExpressionInvalidateCache(); + + DeviceFlagService.Update(Database, deviceFlag); + } + + private ScheduledTaskStatus UpdateDevicesLinkedGroup(DeviceFlag deviceFlag, string devicesLinkedGroup, DateTime? filterBeginDate) + { + var configJson = ADManagedGroup.ValidConfigurationToJson(DeviceFlagDevicesManagedGroup.GetKey(deviceFlag), devicesLinkedGroup, filterBeginDate); + + if (deviceFlag.DevicesLinkedGroup != configJson) + { + deviceFlag.DevicesLinkedGroup = configJson; + DeviceFlagService.Update(Database, deviceFlag); + + if (deviceFlag.DevicesLinkedGroup != null && DeviceFlagDevicesManagedGroup.TryGetManagedGroup(deviceFlag, out var managedGroup)) + { + // Sync Group + return ADManagedGroupsSyncTask.ScheduleSync(managedGroup); + } + } + + return null; + } + private ScheduledTaskStatus UpdateAssignedUserLinkedGroup(DeviceFlag deviceFlag, string assignedUserLinkedGroup, DateTime? filterBeginDate) + { + var configJson = ADManagedGroup.ValidConfigurationToJson(DeviceFlagDeviceAssignedUsersManagedGroup.GetKey(deviceFlag), assignedUserLinkedGroup, filterBeginDate); + + if (deviceFlag.DeviceUsersLinkedGroup != configJson) + { + deviceFlag.DeviceUsersLinkedGroup = configJson; + DeviceFlagService.Update(Database, deviceFlag); + + if (deviceFlag.DeviceUsersLinkedGroup != null && DeviceFlagDeviceAssignedUsersManagedGroup.TryGetManagedGroup(deviceFlag, out var managedGroup)) + { + // Sync Group + return ADManagedGroupsSyncTask.ScheduleSync(managedGroup); + } + } + + return null; + } + #endregion + + #region Actions + [DiscoAuthorizeAll(Claims.Config.DeviceFlag.Configure, Claims.Config.DeviceFlag.Delete)] + public virtual ActionResult Delete(int id, bool? redirect = false) + { + try + { + var uf = Database.DeviceFlags.FirstOrDefault(f => f.Id == id); + if (uf != null) + { + var status = DeviceFlagDeleteTask.ScheduleNow(uf.Id); + status.SetFinishedUrl(Url.Action(MVC.Config.DeviceFlag.Index(null))); + + if (redirect.HasValue && redirect.Value) + return RedirectToAction(MVC.Config.Logging.TaskStatus(status.SessionId)); + else + return Json("OK", JsonRequestBehavior.AllowGet); + } + throw new ArgumentException("Invalid Device Flag Id", nameof(id)); + } + catch (Exception ex) + { + if (redirect.HasValue && redirect.Value) + throw; + else + return Json($"Error: {ex.Message}", JsonRequestBehavior.AllowGet); + } + } + + [DiscoAuthorizeAll(Claims.Config.DeviceFlag.Configure, Claims.Device.Actions.AddFlags, Claims.Device.Actions.RemoveFlags, Claims.Device.ShowFlagAssignments)] + public virtual ActionResult BulkAssignDevices(int id, bool Override, string DeviceSerialNumbers = null, string Comments = null) + { + if (id < 0) + throw new ArgumentNullException("id"); + var flag = Database.DeviceFlags.FirstOrDefault(f => f.Id == id); + if (flag == null) + throw new ArgumentException("Invalid Device Flag Id", nameof(id)); + + var serialNumbers = DeviceSerialNumbers.Split(new string[] { Environment.NewLine, ",", ";" }, StringSplitOptions.RemoveEmptyEntries).Select(d => d.Trim()).Where(d => !string.IsNullOrEmpty(d)).ToList(); + + var taskStatus = DeviceFlagBulkAssignTask.ScheduleBulkAssignDevices(flag, CurrentUser, Comments, serialNumbers, Override); + taskStatus.SetFinishedUrl(Url.Action(MVC.Config.DeviceFlag.Index(flag.Id))); + return RedirectToAction(MVC.Config.Logging.TaskStatus(taskStatus.SessionId)); + } + [DiscoAuthorizeAll(Claims.Config.DeviceFlag.Configure, Claims.Device.Actions.AddFlags, Claims.Device.Actions.RemoveFlags, Claims.Device.ShowFlagAssignments)] + public virtual ActionResult AssignedDevices(int id) + { + if (id < 0) + throw new ArgumentNullException(nameof(id)); + var flag = Database.DeviceFlags.FirstOrDefault(f => f.Id == id); + if (flag == null) + throw new ArgumentException("Invalid Device Flag Id", nameof(id)); + + var serialNumbers = Database + .DeviceFlagAssignments + .Where(a => a.DeviceFlagId == flag.Id && !a.RemovedDate.HasValue) + .OrderBy(a => a.DeviceSerialNumber).Select(a => a.DeviceSerialNumber).ToList(); + + return Json(serialNumbers, JsonRequestBehavior.AllowGet); + } + #endregion + + #region Exporting + internal const string ExportSessionCacheKey = "DeviceFlagExportContext_{0}"; + + [DiscoAuthorize(Claims.Config.DeviceFlag.Export)] + public virtual ActionResult Export(ExportModel Model) + { + if (Model == null || Model.Options == null) + throw new ArgumentNullException(nameof(Model)); + + // Start Export + var exportContext = DeviceFlagExportTask.ScheduleNow(Model.Options); + + // Store Export Context in Web Cache + string key = string.Format(ExportSessionCacheKey, exportContext.TaskStatus.SessionId); + HttpRuntime.Cache.Insert(key, exportContext, null, DateTime.Now.AddMinutes(60), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null); + + // Set Task Finished Url + var finishedActionResult = MVC.Config.DeviceFlag.Export(exportContext.TaskStatus.SessionId, null, null); + exportContext.TaskStatus.SetFinishedUrl(Url.Action(finishedActionResult)); + + // Try waiting for completion + if (exportContext.TaskStatus.WaitUntilFinished(TimeSpan.FromSeconds(2))) + return RedirectToAction(finishedActionResult); + else + return RedirectToAction(MVC.Config.Logging.TaskStatus(exportContext.TaskStatus.SessionId)); + } + [DiscoAuthorize(Claims.Config.DeviceFlag.Export)] + public virtual ActionResult ExportRetrieve(string Id) + { + if (string.IsNullOrWhiteSpace(Id)) + throw new ArgumentNullException("Id"); + + string key = string.Format(ExportSessionCacheKey, Id); + var context = HttpRuntime.Cache.Get(key) as ExportTaskContext; + + if (context == null) + throw new ArgumentException("The Id specified is invalid, or the export data expired (60 minutes)", nameof(Id)); + + if (context.Result == null || context.Result.Result == null) + throw new ArgumentException("The export session is still running, or failed to complete successfully", nameof(Id)); + + var fileStream = context.Result.Result; + + return this.File(fileStream.GetBuffer(), 0, (int)fileStream.Length, context.Result.MimeType, context.Result.Filename); + } + + #endregion + } +} \ No newline at end of file diff --git a/Disco.Web/Areas/Config/Controllers/DeviceFlagController.cs b/Disco.Web/Areas/Config/Controllers/DeviceFlagController.cs new file mode 100644 index 00000000..a63dd9ba --- /dev/null +++ b/Disco.Web/Areas/Config/Controllers/DeviceFlagController.cs @@ -0,0 +1,159 @@ +using Disco.Models.Areas.Config.UI.DeviceFlag; +using Disco.Models.Repository; +using Disco.Models.Services.Devices.DeviceFlag; +using Disco.Models.UI.Config.DeviceFlag; +using Disco.Services.Authorization; +using Disco.Services.Devices.DeviceFlags; +using Disco.Services.Exporting; +using Disco.Services.Extensions; +using Disco.Services.Plugins.Features.UIExtension; +using Disco.Services.Web; +using Disco.Web.Areas.Config.Models.DeviceFlag; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.Mvc; + +namespace Disco.Web.Areas.Config.Controllers +{ + public partial class DeviceFlagController : AuthorizedDatabaseController + { + [DiscoAuthorize(Claims.Config.DeviceFlag.Show)] + public virtual ActionResult Index(int? id) + { + if (id.HasValue) + { + // Show + var m = Database.DeviceFlags.Where(f => f.Id == id.Value).Select(f => + new ShowModel() + { + DeviceFlag = f, + CurrentAssignmentCount = f.DeviceFlagAssignments.Count(a => !a.RemovedDate.HasValue), + TotalAssignmentCount = f.DeviceFlagAssignments.Count() + }).FirstOrDefault(); + + if (m == null) + throw new ArgumentException("Invalid Device Flag Id"); + + if (DeviceFlagDevicesManagedGroup.TryGetManagedGroup(m.DeviceFlag, out var devicesManagedGroup)) + m.DevicesLinkedGroup = devicesManagedGroup; + if (DeviceFlagDeviceAssignedUsersManagedGroup.TryGetManagedGroup(m.DeviceFlag, out var assignedUsersManagedGroup)) + m.AssignedUserLinkedGroup = assignedUsersManagedGroup; + + if (Authorization.Has(Claims.Config.DeviceFlag.Configure)) + { + m.Icons = UIHelpers.Icons; + m.ThemeColours = UIHelpers.ThemeColours; + } + + // UI Extensions + UIExtensions.ExecuteExtensions(this.ControllerContext, m); + + return View(MVC.Config.DeviceFlag.Views.Show, m); + } + else + { + // List Index + var m = new Models.DeviceFlag.IndexModel() + { + DeviceFlags = Database.DeviceFlags + .Select(uf => new + { + flag = uf, + assignmentCount = uf.DeviceFlagAssignments.Count(fa => !fa.RemovedDate.HasValue) + }) + .ToDictionary( + pair => pair.flag, + pair => pair.assignmentCount) + }; + + // UI Extensions + UIExtensions.ExecuteExtensions(this.ControllerContext, m); + + return View(m); + } + } + + [DiscoAuthorizeAll(Claims.Config.DeviceFlag.Create, Claims.Config.DeviceFlag.Configure)] + public virtual ActionResult Create() + { + // Default Queue + var m = new CreateModel() + { + DeviceFlag = new DeviceFlag() + { + Icon = DeviceFlagService.RandomUnusedIcon(), + IconColour = DeviceFlagService.RandomUnusedThemeColour() + } + }; + + // UI Extensions + UIExtensions.ExecuteExtensions(this.ControllerContext, m); + + return View(m); + } + + [DiscoAuthorizeAll(Claims.Config.DeviceFlag.Create, Claims.Config.DeviceFlag.Configure), HttpPost] + public virtual ActionResult Create(CreateModel model) + { + if (ModelState.IsValid) + { + // Check for Existing + var existing = Database.DeviceFlags.Where(m => m.Name == model.DeviceFlag.Name).FirstOrDefault(); + if (existing == null) + { + var flag = DeviceFlagService.CreateDeviceFlag(Database, model.DeviceFlag); + + return RedirectToAction(MVC.Config.DeviceFlag.Index(flag.Id)); + } + else + { + ModelState.AddModelError("Name", "A Device Flag with this name already exists."); + } + } + + // UI Extensions + UIExtensions.ExecuteExtensions(this.ControllerContext, model); + + return View(model); + } + + #region Export + + [DiscoAuthorizeAny(Claims.Config.DeviceFlag.Export), HttpGet] + public virtual ActionResult Export(string DownloadId, int? DeviceFlagId, bool? CurrentOnly) + { + var m = new ExportModel() + { + Options = DeviceFlagExportOptions.DefaultOptions(), + DeviceFlags = DeviceFlagService.GetDeviceFlags(), + }; + + if (!string.IsNullOrWhiteSpace(DownloadId)) + { + string key = string.Format(API.Controllers.DeviceFlagController.ExportSessionCacheKey, DownloadId); + var context = HttpRuntime.Cache.Get(key) as ExportTaskContext; + + if (context != null) + { + m.ExportSessionResult = context.Result; + m.ExportSessionId = DownloadId; + } + } + + if (DeviceFlagId.HasValue && CurrentOnly.HasValue) + { + m.Options.DeviceFlagIds = new List() { DeviceFlagId.Value }; + m.Options.CurrentOnly = CurrentOnly.Value; + } + + // UI Extensions + UIExtensions.ExecuteExtensions(this.ControllerContext, m); + + return View(m); + } + + #endregion + } +} \ No newline at end of file diff --git a/Disco.Web/Areas/Config/Models/DeviceFlag/CreateModel.cs b/Disco.Web/Areas/Config/Models/DeviceFlag/CreateModel.cs new file mode 100644 index 00000000..c3d447c8 --- /dev/null +++ b/Disco.Web/Areas/Config/Models/DeviceFlag/CreateModel.cs @@ -0,0 +1,9 @@ +using Disco.Models.UI.Config.DeviceFlag; + +namespace Disco.Web.Areas.Config.Models.DeviceFlag +{ + public class CreateModel : ConfigDeviceFlagCreateModel + { + public Disco.Models.Repository.DeviceFlag DeviceFlag { get; set; } + } +} diff --git a/Disco.Web/Areas/Config/Models/DeviceFlag/ExportModel.cs b/Disco.Web/Areas/Config/Models/DeviceFlag/ExportModel.cs new file mode 100644 index 00000000..7efc7e8f --- /dev/null +++ b/Disco.Web/Areas/Config/Models/DeviceFlag/ExportModel.cs @@ -0,0 +1,17 @@ +using Disco.Models.Areas.Config.UI.DeviceFlag; +using Disco.Models.Services.Devices.DeviceFlag; +using Disco.Models.Services.Exporting; +using System.Collections.Generic; + +namespace Disco.Web.Areas.Config.Models.DeviceFlag +{ + public class ExportModel : ConfigDeviceFlagExportModel + { + public DeviceFlagExportOptions Options { get; set; } + + public string ExportSessionId { get; set; } + public ExportResult ExportSessionResult { get; set; } + + public List DeviceFlags { get; set; } + } +} diff --git a/Disco.Web/Areas/Config/Models/DeviceFlag/IndexModel.cs b/Disco.Web/Areas/Config/Models/DeviceFlag/IndexModel.cs new file mode 100644 index 00000000..9a623299 --- /dev/null +++ b/Disco.Web/Areas/Config/Models/DeviceFlag/IndexModel.cs @@ -0,0 +1,10 @@ +using Disco.Models.UI.Config.DeviceFlag; +using System.Collections.Generic; + +namespace Disco.Web.Areas.Config.Models.DeviceFlag +{ + public class IndexModel : ConfigDeviceFlagIndexModel + { + public Dictionary DeviceFlags { get; set; } + } +} diff --git a/Disco.Web/Areas/Config/Models/DeviceFlag/ShowModel.cs b/Disco.Web/Areas/Config/Models/DeviceFlag/ShowModel.cs new file mode 100644 index 00000000..aeadb7b4 --- /dev/null +++ b/Disco.Web/Areas/Config/Models/DeviceFlag/ShowModel.cs @@ -0,0 +1,20 @@ +using Disco.Models.UI.Config.DeviceFlag; +using Disco.Services.Devices.DeviceFlags; +using System.Collections.Generic; + +namespace Disco.Web.Areas.Config.Models.DeviceFlag +{ + public class ShowModel : ConfigDeviceFlagShowModel + { + public Disco.Models.Repository.DeviceFlag DeviceFlag { get; set; } + + public int CurrentAssignmentCount { get; set; } + public int TotalAssignmentCount { get; set; } + + public DeviceFlagDevicesManagedGroup DevicesLinkedGroup { get; set; } + public DeviceFlagDeviceAssignedUsersManagedGroup AssignedUserLinkedGroup { get; set; } + + public IEnumerable> Icons { get; set; } + public IEnumerable> ThemeColours { get; set; } + } +} diff --git a/Disco.Web/Areas/Config/Views/Config/Index.cshtml b/Disco.Web/Areas/Config/Views/Config/Index.cshtml index fa7b2375..67c210bf 100644 --- a/Disco.Web/Areas/Config/Views/Config/Index.cshtml +++ b/Disco.Web/Areas/Config/Views/Config/Index.cshtml @@ -72,7 +72,14 @@ @Html.ActionLinkClass("Profiles", MVC.Config.DeviceProfile.Index(), "config") + } + @if (Authorization.Has(Claims.Config.DeviceFlag.Show)) + { + @Html.ActionLinkClass("Flags", MVC.Config.DeviceFlag.Index(), "config") + } @if (Authorization.Has(Claims.Config.Enrolment.Show)) @@ -114,7 +121,7 @@

Users

@if (Authorization.Has(Claims.Config.UserFlag.Show)) { - @Html.ActionLinkClass("User Flags", MVC.Config.UserFlag.Index(), "config") + @Html.ActionLinkClass("Flags", MVC.Config.UserFlag.Index(), "config") diff --git a/Disco.Web/Areas/Config/Views/Config/Index.generated.cs b/Disco.Web/Areas/Config/Views/Config/Index.generated.cs index fcad79be..0adefcfe 100644 --- a/Disco.Web/Areas/Config/Views/Config/Index.generated.cs +++ b/Disco.Web/Areas/Config/Views/Config/Index.generated.cs @@ -508,8 +508,8 @@ WriteLiteral(" \r\n Configure Device Profiles including computer name " + -"generation, distribution and Active\r\n Directory OU layout.\r\n " + -" \r\n"); +"generation, distribution and Active\r\n Directory OU la" + +"yout.\r\n \r\n"); #line 77 "..\..\Areas\Config\Views\Config\Index.cshtml" @@ -522,7 +522,7 @@ WriteLiteral(" "); #line 78 "..\..\Areas\Config\Views\Config\Index.cshtml" - if (Authorization.Has(Claims.Config.Enrolment.Show)) + if (Authorization.Has(Claims.Config.DeviceFlag.Show)) { @@ -542,13 +542,63 @@ WriteLiteral(">"); #line hidden #line 80 "..\..\Areas\Config\Views\Config\Index.cshtml" - Write(Html.ActionLinkClass("Enrolment", MVC.Config.Enrolment.Index(), "config")); + Write(Html.ActionLinkClass("Flags", MVC.Config.DeviceFlag.Index(), "config")); #line default #line hidden #line 80 "..\..\Areas\Config\Views\Config\Index.cshtml" + + + + #line default + #line hidden +WriteLiteral(" \r\n Create and manage device flags.\r\n " + +" \r\n"); + + + #line 84 "..\..\Areas\Config\Views\Config\Index.cshtml" + } + + + #line default + #line hidden +WriteLiteral(" "); + + + #line 85 "..\..\Areas\Config\Views\Config\Index.cshtml" + if (Authorization.Has(Claims.Config.Enrolment.Show)) + { + + + #line default + #line hidden +WriteLiteral(" "); + + + #line 87 "..\..\Areas\Config\Views\Config\Index.cshtml" + + + #line default + #line hidden + + #line 87 "..\..\Areas\Config\Views\Config\Index.cshtml" + Write(Html.ActionLinkClass("Enrolment", MVC.Config.Enrolment.Index(), "config")); + + + #line default + #line hidden + + #line 87 "..\..\Areas\Config\Views\Config\Index.cshtml" @@ -562,7 +612,7 @@ WriteLiteral(">\r\n Configure Enrolment settings incl "entials.\r\n \r\n"); - #line 84 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 91 "..\..\Areas\Config\Views\Config\Index.cshtml" } @@ -571,7 +621,7 @@ WriteLiteral(">\r\n Configure Enrolment settings incl WriteLiteral(" \r\n \r\n"); - #line 87 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 94 "..\..\Areas\Config\Views\Config\Index.cshtml" } @@ -580,7 +630,7 @@ WriteLiteral(" \r\n \r\n"); WriteLiteral(" "); - #line 88 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 95 "..\..\Areas\Config\Views\Config\Index.cshtml" if (Authorization.HasAny(Claims.Config.JobPreferences.Show, Claims.Config.JobQueue.Show, Claims.Config.UserFlag.Show, Claims.Config.DocumentTemplate.Show)) { @@ -590,13 +640,13 @@ WriteLiteral(" "); WriteLiteral(" \r\n"); - #line 91 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 98 "..\..\Areas\Config\Views\Config\Index.cshtml" #line default #line hidden - #line 91 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 98 "..\..\Areas\Config\Views\Config\Index.cshtml" if (Authorization.HasAny(Claims.Config.JobPreferences.Show, Claims.Config.JobQueue.Show)) { @@ -610,13 +660,13 @@ WriteLiteral(" class=\"pageMenuArea noSeperator\""); WriteLiteral(">\r\n

Jobs

\r\n"); - #line 95 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 102 "..\..\Areas\Config\Views\Config\Index.cshtml" #line default #line hidden - #line 95 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 102 "..\..\Areas\Config\Views\Config\Index.cshtml" if (Authorization.Has(Claims.Config.JobPreferences.Show)) { @@ -630,20 +680,20 @@ WriteLiteral(" class=\"fa fa-cog\""); WriteLiteral(">"); - #line 97 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 104 "..\..\Areas\Config\Views\Config\Index.cshtml" #line default #line hidden - #line 97 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 104 "..\..\Areas\Config\Views\Config\Index.cshtml" Write(Html.ActionLinkClass("General Preferences", MVC.Config.JobPreferences.Index(), "config")); #line default #line hidden - #line 97 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 104 "..\..\Areas\Config\Views\Config\Index.cshtml" @@ -657,7 +707,7 @@ WriteLiteral(">\r\n Configure general preferences "\r\n \r\n"); - #line 101 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 108 "..\..\Areas\Config\Views\Config\Index.cshtml" } @@ -666,7 +716,7 @@ WriteLiteral(">\r\n Configure general preferences WriteLiteral(" "); - #line 102 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 109 "..\..\Areas\Config\Views\Config\Index.cshtml" if (Authorization.Has(Claims.Config.JobQueue.Show)) { @@ -680,20 +730,20 @@ WriteLiteral(" class=\"fa fa-cog\""); WriteLiteral(">"); - #line 104 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 111 "..\..\Areas\Config\Views\Config\Index.cshtml" #line default #line hidden - #line 104 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 111 "..\..\Areas\Config\Views\Config\Index.cshtml" Write(Html.ActionLinkClass("Job Queues", MVC.Config.JobQueue.Index(), "config")); #line default #line hidden - #line 104 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 111 "..\..\Areas\Config\Views\Config\Index.cshtml" @@ -707,7 +757,7 @@ WriteLiteral(">\r\n Create and manage job queues "ies and queue members.\r\n \r\n"); - #line 108 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 115 "..\..\Areas\Config\Views\Config\Index.cshtml" } @@ -716,7 +766,7 @@ WriteLiteral(">\r\n Create and manage job queues WriteLiteral(" \r\n"); - #line 110 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 117 "..\..\Areas\Config\Views\Config\Index.cshtml" } @@ -725,7 +775,7 @@ WriteLiteral(" \r\n"); WriteLiteral(" "); - #line 111 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 118 "..\..\Areas\Config\Views\Config\Index.cshtml" if (Authorization.HasAny(Claims.Config.UserFlag.Show)) { @@ -739,13 +789,13 @@ WriteLiteral(" class=\"pageMenuArea noSeperator\""); WriteLiteral(">\r\n

Users

\r\n"); - #line 115 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 122 "..\..\Areas\Config\Views\Config\Index.cshtml" #line default #line hidden - #line 115 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 122 "..\..\Areas\Config\Views\Config\Index.cshtml" if (Authorization.Has(Claims.Config.UserFlag.Show)) { @@ -759,21 +809,21 @@ WriteLiteral(" class=\"fa fa-cog\""); WriteLiteral(">"); - #line 117 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 124 "..\..\Areas\Config\Views\Config\Index.cshtml" #line default #line hidden - #line 117 "..\..\Areas\Config\Views\Config\Index.cshtml" - Write(Html.ActionLinkClass("User Flags", MVC.Config.UserFlag.Index(), "config")); + #line 124 "..\..\Areas\Config\Views\Config\Index.cshtml" + Write(Html.ActionLinkClass("Flags", MVC.Config.UserFlag.Index(), "config")); #line default #line hidden - #line 117 "..\..\Areas\Config\Views\Config\Index.cshtml" - + #line 124 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line default @@ -786,7 +836,7 @@ WriteLiteral(">\r\n Create and manage user flags. " \r\n"); - #line 121 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 128 "..\..\Areas\Config\Views\Config\Index.cshtml" } @@ -795,7 +845,7 @@ WriteLiteral(">\r\n Create and manage user flags. WriteLiteral(" \r\n"); - #line 123 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 130 "..\..\Areas\Config\Views\Config\Index.cshtml" } @@ -804,7 +854,7 @@ WriteLiteral(" \r\n"); WriteLiteral(" "); - #line 124 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 131 "..\..\Areas\Config\Views\Config\Index.cshtml" if (Authorization.HasAny(Claims.Config.DocumentTemplate.Show)) { @@ -818,13 +868,13 @@ WriteLiteral(" class=\"pageMenuArea noSeperator\""); WriteLiteral(">\r\n

Features

\r\n"); - #line 128 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 135 "..\..\Areas\Config\Views\Config\Index.cshtml" #line default #line hidden - #line 128 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 135 "..\..\Areas\Config\Views\Config\Index.cshtml" if (Authorization.Has(Claims.Config.DocumentTemplate.Show)) { @@ -838,20 +888,20 @@ WriteLiteral(" class=\"fa fa-cog\""); WriteLiteral(">"); - #line 130 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 137 "..\..\Areas\Config\Views\Config\Index.cshtml" #line default #line hidden - #line 130 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 137 "..\..\Areas\Config\Views\Config\Index.cshtml" Write(Html.ActionLinkClass("Document Templates", MVC.Config.DocumentTemplate.Index(), "config")); #line default #line hidden - #line 130 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 137 "..\..\Areas\Config\Views\Config\Index.cshtml" @@ -866,7 +916,7 @@ WriteLiteral(">\r\n Create, Update and Bulk Gener " \r\n"); - #line 135 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 142 "..\..\Areas\Config\Views\Config\Index.cshtml" } @@ -875,7 +925,7 @@ WriteLiteral(">\r\n Create, Update and Bulk Gener WriteLiteral(" \r\n"); - #line 137 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 144 "..\..\Areas\Config\Views\Config\Index.cshtml" } @@ -884,7 +934,7 @@ WriteLiteral(" \r\n"); WriteLiteral(" \r\n"); - #line 139 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 146 "..\..\Areas\Config\Views\Config\Index.cshtml" } @@ -893,7 +943,7 @@ WriteLiteral(" \r\n"); WriteLiteral(" \r\n\r\n"); - #line 142 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 149 "..\..\Areas\Config\Views\Config\Index.cshtml" if (Model.UpdateAvailable) { @@ -911,14 +961,14 @@ WriteLiteral(" class=\"fa fa-cloud-download info\""); WriteLiteral(">\r\n
An updated version of Disco is available
\r\n (Model.UpdateResponse.UrlLink + #line 155 "..\..\Areas\Config\Views\Config\Index.cshtml" +, Tuple.Create(Tuple.Create("", 8218), Tuple.Create(Model.UpdateResponse.UrlLink #line default #line hidden -, 7825), false) +, 8218), false) ); WriteLiteral(" class=\"button small alert\""); @@ -928,7 +978,7 @@ WriteLiteral(" target=\"_blank\""); WriteLiteral(">Download v"); - #line 148 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 155 "..\..\Areas\Config\Views\Config\Index.cshtml" Write(Model.UpdateResponse.LatestVersion); @@ -945,13 +995,13 @@ WriteLiteral(@" \r\n"); - #line 167 "..\..\Areas\Config\Views\Config\Index.cshtml" + #line 174 "..\..\Areas\Config\Views\Config\Index.cshtml" } diff --git a/Disco.Web/Areas/Config/Views/DeviceFlag/Create.cshtml b/Disco.Web/Areas/Config/Views/DeviceFlag/Create.cshtml new file mode 100644 index 00000000..f085dcca --- /dev/null +++ b/Disco.Web/Areas/Config/Views/DeviceFlag/Create.cshtml @@ -0,0 +1,36 @@ +@model Disco.Web.Areas.Config.Models.DeviceFlag.CreateModel +@{ + Authorization.RequireAll(Claims.Config.JobQueue.Create, Claims.Config.JobQueue.Configure); + ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Device Flags", MVC.Config.DeviceFlag.Index(null), "Create"); +} +@using (Html.BeginForm()) +{ + @Html.HiddenFor(m => m.DeviceFlag.Icon) + @Html.HiddenFor(m => m.DeviceFlag.IconColour) +
+ + + + + + + + + +
Name: + + @Html.EditorFor(model => model.DeviceFlag.Name)
@Html.ValidationMessageFor(model => model.DeviceFlag.Name) +
Description: + + @Html.EditorFor(model => model.DeviceFlag.Description)
@Html.ValidationMessageFor(model => model.DeviceFlag.Description) +
+

+ +

+
+ +} diff --git a/Disco.Web/Areas/Config/Views/DeviceFlag/Create.generated.cs b/Disco.Web/Areas/Config/Views/DeviceFlag/Create.generated.cs new file mode 100644 index 00000000..0a7dba22 --- /dev/null +++ b/Disco.Web/Areas/Config/Views/DeviceFlag/Create.generated.cs @@ -0,0 +1,172 @@ +#pragma warning disable 1591 +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Disco.Web.Areas.Config.Views.DeviceFlag +{ + using System; + using System.Collections.Generic; + using System.IO; + using System.Linq; + using System.Net; + using System.Text; + using System.Web; + using System.Web.Helpers; + using System.Web.Mvc; + using System.Web.Mvc.Ajax; + using System.Web.Mvc.Html; + using System.Web.Routing; + using System.Web.Security; + using System.Web.UI; + using System.Web.WebPages; + using Disco; + using Disco.Models.Repository; + using Disco.Services; + using Disco.Services.Authorization; + using Disco.Services.Web; + using Disco.Web; + using Disco.Web.Extensions; + + [System.CodeDom.Compiler.GeneratedCodeAttribute("RazorGenerator", "2.0.0.0")] + [System.Web.WebPages.PageVirtualPathAttribute("~/Areas/Config/Views/DeviceFlag/Create.cshtml")] + public partial class Create : Disco.Services.Web.WebViewPage + { + public Create() + { + } + public override void Execute() + { + + #line 2 "..\..\Areas\Config\Views\DeviceFlag\Create.cshtml" + + Authorization.RequireAll(Claims.Config.JobQueue.Create, Claims.Config.JobQueue.Configure); + ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Device Flags", MVC.Config.DeviceFlag.Index(null), "Create"); + + + #line default + #line hidden +WriteLiteral("\r\n"); + + + #line 6 "..\..\Areas\Config\Views\DeviceFlag\Create.cshtml" + using (Html.BeginForm()) +{ + + + #line default + #line hidden + + #line 8 "..\..\Areas\Config\Views\DeviceFlag\Create.cshtml" +Write(Html.HiddenFor(m => m.DeviceFlag.Icon)); + + + #line default + #line hidden + + #line 8 "..\..\Areas\Config\Views\DeviceFlag\Create.cshtml" + + + + #line default + #line hidden + + #line 9 "..\..\Areas\Config\Views\DeviceFlag\Create.cshtml" +Write(Html.HiddenFor(m => m.DeviceFlag.IconColour)); + + + #line default + #line hidden + + #line 9 "..\..\Areas\Config\Views\DeviceFlag\Create.cshtml" + + + + #line default + #line hidden +WriteLiteral(" \r\n \r\n \r\n \r\n \r\n \r\n \r\n Description:\r\n \r\n \r\n \r\n
Name:\r\n " + +"\r\n"); + +WriteLiteral(" "); + + + #line 16 "..\..\Areas\Config\Views\DeviceFlag\Create.cshtml" + Write(Html.EditorFor(model => model.DeviceFlag.Name)); + + + #line default + #line hidden +WriteLiteral("
"); + + + #line 16 "..\..\Areas\Config\Views\DeviceFlag\Create.cshtml" + Write(Html.ValidationMessageFor(model => model.DeviceFlag.Name)); + + + #line default + #line hidden +WriteLiteral("\r\n
\r\n"); + +WriteLiteral(" "); + + + #line 23 "..\..\Areas\Config\Views\DeviceFlag\Create.cshtml" + Write(Html.EditorFor(model => model.DeviceFlag.Description)); + + + #line default + #line hidden +WriteLiteral("
"); + + + #line 23 "..\..\Areas\Config\Views\DeviceFlag\Create.cshtml" + Write(Html.ValidationMessageFor(model => model.DeviceFlag.Description)); + + + #line default + #line hidden +WriteLiteral("\r\n
\r\n \r\n \r\n

\r\n \r\n"); + +WriteLiteral(" \r\n $(function () {\r\n $(\'#DeviceFlag_Name\').focus().select();\r\n" + +" });\r\n \r\n"); + + + #line 36 "..\..\Areas\Config\Views\DeviceFlag\Create.cshtml" +} + + + #line default + #line hidden + } + } +} +#pragma warning restore 1591 diff --git a/Disco.Web/Areas/Config/Views/DeviceFlag/Export.cshtml b/Disco.Web/Areas/Config/Views/DeviceFlag/Export.cshtml new file mode 100644 index 00000000..21c31831 --- /dev/null +++ b/Disco.Web/Areas/Config/Views/DeviceFlag/Export.cshtml @@ -0,0 +1,185 @@ +@using Disco.Web.Areas.Config.Models.DeviceFlag; +@model ExportModel +@{ + Authorization.RequireAny(Claims.Config.DeviceFlag.Export); + + ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Device Flags", MVC.Config.DeviceFlag.Index(null), "Export"); + + var optionsMetadata = ModelMetadata.FromLambdaExpression(m => m.Options, ViewData); + var optionGroups = optionsMetadata.Properties.Where(p => p.ShortDisplayName != null && p.ModelType == typeof(bool) && p.PropertyName != "CurrentOnly") + .GroupBy(m => m.ShortDisplayName); +} +
+ @using (Html.BeginForm(MVC.API.DeviceFlag.Export())) + { +
+

Export Scope

+ + + + + + + + + + + + + +
+ Device Flags: + + @foreach (var flag in Model.DeviceFlags) + { +
+ +
+ } +
@Html.LabelFor(m => m.Options.CurrentOnly) + @Html.CheckBoxFor(m => m.Options.CurrentOnly) +

Uncheck to include all historical device flag assignments.

+
@Html.LabelFor(m => m.Options.Format) + @Html.DropDownListFor(m => m.Options.Format, Enum.GetNames(typeof(Disco.Models.Exporting.ExportFormat)).Select(v => new SelectListItem() { Value = v, Text = v })) +
+
+
+

Export Fields (Defaults)

+ + @foreach (var optionGroup in optionGroups) + { + var optionFields = optionGroup.ToList(); + var itemsPerColumn = (int)Math.Ceiling((double)optionFields.Count / 2); + + + + + } +
+ @optionGroup.Key + @if (optionFields.Count > 2) + { + ALL | NONE + } + +
+ + + + + +
+
    + @foreach (var optionItem in optionFields.Take(itemsPerColumn)) + { +
  • +
  • + } +
+
+
    + @foreach (var optionItem in optionFields.Skip(itemsPerColumn)) + { +
  • +
  • + } +
+
+
+
+
+ + } +
+@if (Model.ExportSessionId != null) +{ +
+

@Model.ExportSessionResult.RecordCount record@(Model.ExportSessionResult.RecordCount != 1 ? "s" : null) were successfully exported.

+ Download Device Flag Export +
+ +} +
+

Exporting device flags...

+
+ diff --git a/Disco.Web/Areas/Config/Views/DeviceFlag/Export.generated.cs b/Disco.Web/Areas/Config/Views/DeviceFlag/Export.generated.cs new file mode 100644 index 00000000..60f210de --- /dev/null +++ b/Disco.Web/Areas/Config/Views/DeviceFlag/Export.generated.cs @@ -0,0 +1,707 @@ +#pragma warning disable 1591 +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Disco.Web.Areas.Config.Views.DeviceFlag +{ + using System; + using System.Collections.Generic; + using System.IO; + using System.Linq; + using System.Net; + using System.Text; + using System.Web; + using System.Web.Helpers; + using System.Web.Mvc; + using System.Web.Mvc.Ajax; + using System.Web.Mvc.Html; + using System.Web.Routing; + using System.Web.Security; + using System.Web.UI; + using System.Web.WebPages; + using Disco; + using Disco.Models.Repository; + using Disco.Services; + using Disco.Services.Authorization; + using Disco.Services.Web; + using Disco.Web; + + #line 1 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + using Disco.Web.Areas.Config.Models.DeviceFlag; + + #line default + #line hidden + using Disco.Web.Extensions; + + [System.CodeDom.Compiler.GeneratedCodeAttribute("RazorGenerator", "2.0.0.0")] + [System.Web.WebPages.PageVirtualPathAttribute("~/Areas/Config/Views/DeviceFlag/Export.cshtml")] + public partial class Export : Disco.Services.Web.WebViewPage + { + public Export() + { + } + public override void Execute() + { + + #line 3 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + + Authorization.RequireAny(Claims.Config.DeviceFlag.Export); + + ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Device Flags", MVC.Config.DeviceFlag.Index(null), "Export"); + + var optionsMetadata = ModelMetadata.FromLambdaExpression(m => m.Options, ViewData); + var optionGroups = optionsMetadata.Properties.Where(p => p.ShortDisplayName != null && p.ModelType == typeof(bool) && p.PropertyName != "CurrentOnly") + .GroupBy(m => m.ShortDisplayName); + + + #line default + #line hidden +WriteLiteral("\r\n\r\n"); + + + #line 13 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + + + #line default + #line hidden + + #line 13 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + using (Html.BeginForm(MVC.API.DeviceFlag.Export())) + { + + + #line default + #line hidden +WriteLiteral(" \r\n

Export Scope

\r\n \r\n \r\n" + +" \r\n Device Flags:\r\n \r\n " + +" \r\n \r\n \r\n " + +" \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n"); + + + #line 23 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + + + #line default + #line hidden + + #line 23 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + foreach (var flag in Model.DeviceFlags) + { + + + #line default + #line hidden +WriteLiteral("
\r\n \r\n \r\n"); + + + #line 32 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + } + + + #line default + #line hidden +WriteLiteral("
"); + + + #line 36 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + Write(Html.LabelFor(m => m.Options.CurrentOnly)); + + + #line default + #line hidden +WriteLiteral("\r\n"); + +WriteLiteral(" "); + + + #line 38 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + Write(Html.CheckBoxFor(m => m.Options.CurrentOnly)); + + + #line default + #line hidden +WriteLiteral("\r\n

Uncheck to include all historical device flag assign" + +"ments.

\r\n
"); + + + #line 43 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + Write(Html.LabelFor(m => m.Options.Format)); + + + #line default + #line hidden +WriteLiteral("\r\n"); + +WriteLiteral(" "); + + + #line 45 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + Write(Html.DropDownListFor(m => m.Options.Format, Enum.GetNames(typeof(Disco.Models.Exporting.ExportFormat)).Select(v => new SelectListItem() { Value = v, Text = v }))); + + + #line default + #line hidden +WriteLiteral("\r\n
\r\n " + +" \r\n"); + +WriteLiteral(" \r\n

Export Fields (Defaults)

\r\n \r\n"); + + + #line 53 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + + + #line default + #line hidden + + #line 53 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + foreach (var optionGroup in optionGroups) + { + var optionFields = optionGroup.ToList(); + var itemsPerColumn = (int)Math.Ceiling((double)optionFields.Count / 2); + + + #line default + #line hidden +WriteLiteral(" \r\n \r\n"); + +WriteLiteral(" "); + + + #line 59 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + Write(optionGroup.Key); + + + #line default + #line hidden +WriteLiteral("\r\n"); + + + #line 60 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + + + #line default + #line hidden + + #line 60 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + if (optionFields.Count > 2) + { + + + #line default + #line hidden +WriteLiteral(" ALL | NONE\r\n"); + + + #line 63 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + } + + + #line default + #line hidden +WriteLiteral(" \r\n \r\n " + +" \r\n \r\n"); + + + #line 71 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + + + #line default + #line hidden + + #line 71 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + foreach (var optionItem in optionFields.Take(itemsPerColumn)) + { + + + #line default + #line hidden +WriteLiteral(" (optionItem.Description + + #line default + #line hidden +, 3840), false) +); + +WriteLiteral(">\r\n (optionItem.PropertyName + + #line default + #line hidden +, 3958), false) +); + +WriteAttribute("name", Tuple.Create(" name=\"", 3983), Tuple.Create("\"", 4022) +, Tuple.Create(Tuple.Create("", 3990), Tuple.Create("Options.", 3990), true) + + #line 74 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + , Tuple.Create(Tuple.Create("", 3998), Tuple.Create(optionItem.PropertyName + + #line default + #line hidden +, 3998), false) +); + +WriteLiteral(" value=\"true\""); + +WriteLiteral(" "); + + + #line 74 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + Write(((bool)optionItem.Model) ? "checked " : null); + + + #line default + #line hidden +WriteLiteral("/>(optionItem.PropertyName + + #line default + #line hidden +, 4106), false) +); + +WriteLiteral(">"); + + + #line 74 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + Write(optionItem.DisplayName); + + + #line default + #line hidden +WriteLiteral("\r\n"); + + + #line 75 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + } + + + #line default + #line hidden +WriteLiteral(" \r\n " + +" \r\n \r\n \r\n"); + + + #line 80 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + + + #line default + #line hidden + + #line 80 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + foreach (var optionItem in optionFields.Skip(itemsPerColumn)) + { + + + #line default + #line hidden +WriteLiteral(" (optionItem.Description + + #line default + #line hidden +, 4673), false) +); + +WriteLiteral(">\r\n (optionItem.PropertyName + + #line default + #line hidden +, 4791), false) +); + +WriteAttribute("name", Tuple.Create(" name=\"", 4816), Tuple.Create("\"", 4855) +, Tuple.Create(Tuple.Create("", 4823), Tuple.Create("Options.", 4823), true) + + #line 83 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + , Tuple.Create(Tuple.Create("", 4831), Tuple.Create(optionItem.PropertyName + + #line default + #line hidden +, 4831), false) +); + +WriteLiteral(" value=\"true\""); + +WriteLiteral(" "); + + + #line 83 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + Write(((bool)optionItem.Model) ? "checked " : null); + + + #line default + #line hidden +WriteLiteral("/>(optionItem.PropertyName + + #line default + #line hidden +, 4939), false) +); + +WriteLiteral(">"); + + + #line 83 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + Write(optionItem.DisplayName); + + + #line default + #line hidden +WriteLiteral("\r\n"); + + + #line 84 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + } + + + #line default + #line hidden +WriteLiteral(@" + + +
\r\n " + +" \r\n \r\n
+ + + +"); + + + #line 92 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + } + + + #line default + #line hidden +WriteLiteral(" \r\n \r\n"); + +WriteLiteral(" \r\n"); + + + #line 159 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + } + + + #line default + #line hidden +WriteLiteral("\r\n"); + + + #line 161 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + if (Model.ExportSessionId != null) +{ + + + #line default + #line hidden +WriteLiteral(" \r\n

"); + + + #line 164 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + Write(Model.ExportSessionResult.RecordCount); + + + #line default + #line hidden +WriteLiteral(" record"); + + + #line 164 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" + Write(Model.ExportSessionResult.RecordCount != 1 ? "s" : null); + + + #line default + #line hidden +WriteLiteral(" were successfully exported.

\r\n (Url.Action(MVC.API.DeviceFlag.ExportRetrieve(Model.ExportSessionId)) + + #line default + #line hidden +, 8257), false) +); + +WriteLiteral(" class=\"button\""); + +WriteLiteral(">Download Device Flag Export\r\n \r\n"); + +WriteLiteral(@" +"); + + + #line 179 "..\..\Areas\Config\Views\DeviceFlag\Export.cshtml" +} + + + #line default + #line hidden +WriteLiteral("\r\n

Exporting device flags...

\r\n\r\n\r\n Export Device Flags\r\n\r\n"); + + } + } +} +#pragma warning restore 1591 diff --git a/Disco.Web/Areas/Config/Views/DeviceFlag/Index.cshtml b/Disco.Web/Areas/Config/Views/DeviceFlag/Index.cshtml new file mode 100644 index 00000000..c85aaf08 --- /dev/null +++ b/Disco.Web/Areas/Config/Views/DeviceFlag/Index.cshtml @@ -0,0 +1,78 @@ +@model Disco.Web.Areas.Config.Models.DeviceFlag.IndexModel +@{ + Authorization.Require(Claims.Config.DeviceFlag.Show); + ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Device Flags"); + var showTags = Model.DeviceFlags.Keys.Any(i => i.DevicesLinkedGroup != null || i.DeviceUsersLinkedGroup != null || + i.OnAssignmentExpression != null || i.OnUnassignmentExpression != null); +} +
+ @if (Model.DeviceFlags.Count == 0) + { +
+

No device flags are configured

+
+ } + else + { + + + + + + @if (showTags) + { + + } + + @foreach (var pair in Model.DeviceFlags.OrderBy(i => i.Key.Name)) + { + var item = pair.Key; + var assignmentCount = pair.Value; + + + + + @if (showTags) + { + + } + + } +
NameDescriptionCurrent Assignments 
+ + + @item.Name + + + @if (string.IsNullOrWhiteSpace(item.Description)) + { + <none> + } + else + { + @item.Description.ToHtmlComment() + } + + @assignmentCount.ToString("N0") + + @if (item.DevicesLinkedGroup != null || item.DeviceUsersLinkedGroup != null) + { + + } + @if (item.OnAssignmentExpression != null || item.OnUnassignmentExpression != null) + { + + } +
+ } +
+ @if (Authorization.Has(Claims.Config.DeviceFlag.Export) && Model.DeviceFlags.Count > 0) + { + @Html.ActionLinkButton("Export", MVC.Config.DeviceFlag.Export()) + } + @if (Authorization.Has(Claims.Config.DeviceFlag.Create)) + { + @Html.ActionLinkButton("Create Device Flag", MVC.Config.DeviceFlag.Create()) + } +
+
diff --git a/Disco.Web/Areas/Config/Views/DeviceFlag/Index.generated.cs b/Disco.Web/Areas/Config/Views/DeviceFlag/Index.generated.cs new file mode 100644 index 00000000..fb825bde --- /dev/null +++ b/Disco.Web/Areas/Config/Views/DeviceFlag/Index.generated.cs @@ -0,0 +1,410 @@ +#pragma warning disable 1591 +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Disco.Web.Areas.Config.Views.DeviceFlag +{ + using System; + using System.Collections.Generic; + using System.IO; + using System.Linq; + using System.Net; + using System.Text; + using System.Web; + using System.Web.Helpers; + using System.Web.Mvc; + using System.Web.Mvc.Ajax; + using System.Web.Mvc.Html; + using System.Web.Routing; + using System.Web.Security; + using System.Web.UI; + using System.Web.WebPages; + using Disco; + using Disco.Models.Repository; + using Disco.Services; + using Disco.Services.Authorization; + using Disco.Services.Web; + using Disco.Web; + using Disco.Web.Extensions; + + [System.CodeDom.Compiler.GeneratedCodeAttribute("RazorGenerator", "2.0.0.0")] + [System.Web.WebPages.PageVirtualPathAttribute("~/Areas/Config/Views/DeviceFlag/Index.cshtml")] + public partial class Index : Disco.Services.Web.WebViewPage + { + public Index() + { + } + public override void Execute() + { + + #line 2 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + + Authorization.Require(Claims.Config.DeviceFlag.Show); + ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Device Flags"); + var showTags = Model.DeviceFlags.Keys.Any(i => i.DevicesLinkedGroup != null || i.DeviceUsersLinkedGroup != null || + i.OnAssignmentExpression != null || i.OnUnassignmentExpression != null); + + + #line default + #line hidden +WriteLiteral("\r\n\r\n"); + + + #line 9 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + + + #line default + #line hidden + + #line 9 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + if (Model.DeviceFlags.Count == 0) + { + + + #line default + #line hidden +WriteLiteral(" \r\n

No device flags are configured

\r\n \r\n"); + + + #line 14 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + } + else + { + + + #line default + #line hidden +WriteLiteral(" \r\n \r\n Name\r\n Descripti" + +"on\r\n Current Assignments\r\n"); + + + #line 22 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + + + #line default + #line hidden + + #line 22 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + if (showTags) + { + + + #line default + #line hidden +WriteLiteral("  \r\n"); + + + #line 25 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + } + + + #line default + #line hidden +WriteLiteral(" \r\n"); + + + #line 27 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + + + #line default + #line hidden + + #line 27 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + foreach (var pair in Model.DeviceFlags.OrderBy(i => i.Key.Name)) + { + var item = pair.Key; + var assignmentCount = pair.Value; + + + #line default + #line hidden +WriteLiteral(" \r\n \r\n (Url.Action(MVC.Config.DeviceFlag.Index(item.Id)) + + #line default + #line hidden +, 1236), false) +); + +WriteLiteral(">\r\n (item.Icon + + #line default + #line hidden +, 1333), false) +, Tuple.Create(Tuple.Create(" ", 1345), Tuple.Create("fa-lg", 1346), true) +, Tuple.Create(Tuple.Create(" ", 1351), Tuple.Create("d-", 1352), true) + + #line 34 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" +, Tuple.Create(Tuple.Create("", 1354), Tuple.Create(item.IconColour + + #line default + #line hidden +, 1354), false) +); + +WriteLiteral(">\r\n"); + +WriteLiteral(" "); + + + #line 35 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + Write(item.Name); + + + #line default + #line hidden +WriteLiteral("\r\n \r\n \r\n \r\n"); + + + #line 39 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + + + #line default + #line hidden + + #line 39 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + if (string.IsNullOrWhiteSpace(item.Description)) + { + + + #line default + #line hidden +WriteLiteral(" <none>\r\n"); + + + #line 42 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + } + else + { + + + #line default + #line hidden + + #line 45 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + Write(item.Description.ToHtmlComment()); + + + #line default + #line hidden + + #line 45 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + + } + + + #line default + #line hidden +WriteLiteral(" \r\n \r\n"); + +WriteLiteral(" "); + + + #line 49 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + Write(assignmentCount.ToString("N0")); + + + #line default + #line hidden +WriteLiteral("\r\n \r\n"); + + + #line 51 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + + + #line default + #line hidden + + #line 51 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + if (showTags) + { + + + #line default + #line hidden +WriteLiteral(" \r\n"); + + + #line 54 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + + + #line default + #line hidden + + #line 54 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + if (item.DevicesLinkedGroup != null || item.DeviceUsersLinkedGroup != null) + { + + + #line default + #line hidden +WriteLiteral(" \r\n"); + + + #line 57 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + } + + + #line default + #line hidden +WriteLiteral(" "); + + + #line 58 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + if (item.OnAssignmentExpression != null || item.OnUnassignmentExpression != null) + { + + + #line default + #line hidden +WriteLiteral(" \r\n"); + + + #line 61 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + } + + + #line default + #line hidden +WriteLiteral(" \r\n"); + + + #line 63 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + } + + + #line default + #line hidden +WriteLiteral(" \r\n"); + + + #line 65 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + } + + + #line default + #line hidden +WriteLiteral(" \r\n"); + + + #line 67 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + } + + + #line default + #line hidden +WriteLiteral("\r\n"); + + + #line 69 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + + + #line default + #line hidden + + #line 69 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + if (Authorization.Has(Claims.Config.DeviceFlag.Export) && Model.DeviceFlags.Count > 0) + { + + + #line default + #line hidden + + #line 71 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + Write(Html.ActionLinkButton("Export", MVC.Config.DeviceFlag.Export())); + + + #line default + #line hidden + + #line 71 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + + } + + + #line default + #line hidden +WriteLiteral(" "); + + + #line 73 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + if (Authorization.Has(Claims.Config.DeviceFlag.Create)) + { + + + #line default + #line hidden + + #line 75 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + Write(Html.ActionLinkButton("Create Device Flag", MVC.Config.DeviceFlag.Create())); + + + #line default + #line hidden + + #line 75 "..\..\Areas\Config\Views\DeviceFlag\Index.cshtml" + + } + + + #line default + #line hidden +WriteLiteral("\r\n\r\n"); + + } + } +} +#pragma warning restore 1591 diff --git a/Disco.Web/Areas/Config/Views/DeviceFlag/Show.cshtml b/Disco.Web/Areas/Config/Views/DeviceFlag/Show.cshtml new file mode 100644 index 00000000..f9348a83 --- /dev/null +++ b/Disco.Web/Areas/Config/Views/DeviceFlag/Show.cshtml @@ -0,0 +1,590 @@ +@model Disco.Web.Areas.Config.Models.DeviceFlag.ShowModel +@using Disco.Services.Interop.ActiveDirectory; +@using Disco.Services.Devices.DeviceFlags; +@using Disco.Web.Areas.Config.Models.Shared; +@{ + Authorization.Require(Claims.Config.DeviceFlag.Show); + + ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Device Flags", MVC.Config.DeviceFlag.Index(null), Model.DeviceFlag.ToString()); + + var canConfig = Authorization.Has(Claims.Config.DeviceFlag.Configure); + var canDelete = Authorization.Has(Claims.Config.DeviceFlag.Delete); + var canBulkAssignment = Authorization.HasAll(Claims.Device.Actions.AddFlags, Claims.Device.Actions.RemoveFlags, Claims.Device.ShowFlagAssignments); + var canShowDevices = Model.CurrentAssignmentCount > 0 && Authorization.HasAll(Claims.Device.Search, Claims.Device.ShowFlagAssignments); + var canExportCurrent = Model.CurrentAssignmentCount > 0 && Authorization.Has(Claims.Config.DeviceFlag.Export); + var canExportAll = Model.TotalAssignmentCount > 0 && Authorization.Has(Claims.Config.DeviceFlag.Export); + + var hideAdvanced = + Model.DeviceFlag.DevicesLinkedGroup == null && + Model.DeviceFlag.DeviceUsersLinkedGroup == null && + Model.DeviceFlag.OnAssignmentExpression == null && + Model.DeviceFlag.OnUnassignmentExpression == null; + + Html.BundleDeferred("~/ClientScripts/Modules/Disco-PropertyChangeHelpers"); +} +
+ + + + + + + + + + + + + + + + + + + + + + @if (hideAdvanced) + { + + + + } + + + + + + + + + + + + + +
+ Id: + + @Html.DisplayFor(model => model.DeviceFlag.Id) +
+ Name: + + @if (canConfig) + {@Html.EditorFor(model => model.DeviceFlag.Name) + @AjaxHelpers.AjaxSave() + @AjaxHelpers.AjaxLoader() + + } + else + { + @Model.DeviceFlag.Name + } +
+ Description: + + @if (canConfig) + {@Html.EditorFor(model => model.DeviceFlag.Description) + @AjaxHelpers.AjaxSave() + @AjaxHelpers.AjaxLoader() + + } + else + { +
+                    @if (string.IsNullOrEmpty(Model.DeviceFlag.Description))
+                    {
+                    <None>
+                    }
+                    else
+                    {
+                        @Model.DeviceFlag.Description.ToHtmlComment()
+                    }
+                    
+ } +
+ Statistics: + +
@Model.CurrentAssignmentCount device@(Model.CurrentAssignmentCount != 1 ? "s" : null) currently assigned
+
@Model.TotalAssignmentCount total device historical assignment@(Model.TotalAssignmentCount != 1 ? "s" : null)
+
+ Icon: + + + @if (canConfig) + { +
+ Update +
+
+
+ @foreach (var colour in Model.ThemeColours) + { + + } +
+
+ @foreach (var icon in Model.Icons) + { + + } +
+
+
+ +
+ } +
+ + +
+ On Assignment
Expression: +
+ @if (canConfig) + { + @Html.EditorFor(model => model.DeviceFlag.OnAssignmentExpression) + @AjaxHelpers.AjaxRemove() + @AjaxHelpers.AjaxSave() + @AjaxHelpers.AjaxLoader() + + } + else + { + if (string.IsNullOrWhiteSpace(Model.DeviceFlag.OnAssignmentExpression)) + { + <None Specified> + } + else + { +
+ @Model.DeviceFlag.OnAssignmentExpression +
+ } + } +
+

+ This expression will be evaluated whenever the flag is assigned to a device. The output of the expression will be shown with the flag assignment. +

+
+
+ On Unassignment
Expression: +
+ @if (canConfig) + { + @Html.EditorFor(model => model.DeviceFlag.OnUnassignmentExpression) + @AjaxHelpers.AjaxRemove() + @AjaxHelpers.AjaxSave() + @AjaxHelpers.AjaxLoader() + + } + else + { + if (string.IsNullOrWhiteSpace(Model.DeviceFlag.OnUnassignmentExpression)) + { + <None Specified> + } + else + { +
+ @Model.DeviceFlag.OnUnassignmentExpression +
+ } + } +
+

+ This expression will be evaluated whenever the flag is removed from a device. The output of the expression will be shown with the flag assignment. +

+
+
+ Linked Groups: + +
+ @Html.Partial(MVC.Config.Shared.Views.LinkedGroupInstance, new LinkedGroupModel() + { + CanConfigure = canConfig, + CategoryDescription = DeviceFlagDevicesManagedGroup.GetCategoryDescription(Model.DeviceFlag), + Description = DeviceFlagDevicesManagedGroup.GetDescription(Model.DeviceFlag), + ManagedGroup = Model.DevicesLinkedGroup, + IncludeFilterBeginDate = true, + UpdateUrl = Url.Action(MVC.API.DeviceFlag.UpdateDevicesLinkedGroup(Model.DeviceFlag.Id, redirect: true)) + }) + @Html.Partial(MVC.Config.Shared.Views.LinkedGroupInstance, new LinkedGroupModel() + { + CanConfigure = canConfig, + CategoryDescription = DeviceFlagDeviceAssignedUsersManagedGroup.GetCategoryDescription(Model.DeviceFlag), + Description = DeviceFlagDeviceAssignedUsersManagedGroup.GetDescription(Model.DeviceFlag), + ManagedGroup = Model.AssignedUserLinkedGroup, + IncludeFilterBeginDate = true, + UpdateUrl = Url.Action(MVC.API.DeviceFlag.UpdateAssignedUserLinkedGroup(Model.DeviceFlag.Id, redirect: true)) + }) + @if (canConfig) + { + @Html.Partial(MVC.Config.Shared.Views.LinkedGroupShared) + } +
+
+
+@if (canBulkAssignment || canDelete || canShowDevices || canExportCurrent || canExportAll) +{ +
+ @if (canExportCurrent) + { + @Html.ActionLinkButton("Export Current Assignments", MVC.Config.DeviceFlag.Export(null, Model.DeviceFlag.Id, true), "Config_DeviceFlags_Actions_ExportCurrent_Button") + } + @if (canExportAll) + { + @Html.ActionLinkButton("Export All Assignments", MVC.Config.DeviceFlag.Export(null, Model.DeviceFlag.Id, false), "Config_DeviceFlags_Actions_ExportAll_Button") + } + @if (canBulkAssignment) + { + Bulk Assign Devices +
+

+ Select the mode used to assign devices: +

+
+
+
Add
+

+ Specified devices will have this flag added. Devices who already have this flag will be skipped. +

+
+
+
Override
+

+ Specified devices will have this flag added. Specified devices which already have this flag will be skipped. + Devices who already have this flag but are not specified will have the flag removed. +

+
+
+
+
+
+
+ Enter multiple Device Serial Numbers separated by <new line>, commas (,) or semicolons (;). +
+
+
+

Loading current assignments...

+
+
+ +

Comments:

+ +
+
+ + } + @if (canDelete) + { + @Html.ActionLinkButton("Delete", MVC.API.DeviceFlag.Delete(Model.DeviceFlag.Id, true), "Config_DeviceFlags_Actions_Delete_Button") +
+

+ + This item will be permanently deleted and cannot be recovered.
+
+ @if (Model.CurrentAssignmentCount > 0) + { + @Model.CurrentAssignmentCount device@(Model.CurrentAssignmentCount != 1 ? "s are" : " is") currently assigned +
+
+ } + Are you sure? +

+
+ + } + @if (canShowDevices) + { + @Html.ActionLinkButton(string.Format("Show {0} device{1}", Model.CurrentAssignmentCount, (Model.CurrentAssignmentCount == 1 ? null : "s")), MVC.Search.Query(Model.DeviceFlag.Id.ToString(), "DeviceFlag"), "Config_DeviceFlags_Actions_ShowDevices_Button") + } +
+} diff --git a/Disco.Web/Areas/Config/Views/DeviceFlag/Show.generated.cs b/Disco.Web/Areas/Config/Views/DeviceFlag/Show.generated.cs new file mode 100644 index 00000000..b8ea9c7c --- /dev/null +++ b/Disco.Web/Areas/Config/Views/DeviceFlag/Show.generated.cs @@ -0,0 +1,1637 @@ +#pragma warning disable 1591 +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Disco.Web.Areas.Config.Views.DeviceFlag +{ + using System; + using System.Collections.Generic; + using System.IO; + using System.Linq; + using System.Net; + using System.Text; + using System.Web; + using System.Web.Helpers; + using System.Web.Mvc; + using System.Web.Mvc.Ajax; + using System.Web.Mvc.Html; + using System.Web.Routing; + using System.Web.Security; + using System.Web.UI; + using System.Web.WebPages; + using Disco; + using Disco.Models.Repository; + using Disco.Services; + using Disco.Services.Authorization; + + #line 3 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + using Disco.Services.Devices.DeviceFlags; + + #line default + #line hidden + + #line 2 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + using Disco.Services.Interop.ActiveDirectory; + + #line default + #line hidden + using Disco.Services.Web; + using Disco.Web; + + #line 4 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + using Disco.Web.Areas.Config.Models.Shared; + + #line default + #line hidden + using Disco.Web.Extensions; + + [System.CodeDom.Compiler.GeneratedCodeAttribute("RazorGenerator", "2.0.0.0")] + [System.Web.WebPages.PageVirtualPathAttribute("~/Areas/Config/Views/DeviceFlag/Show.cshtml")] + public partial class Show : Disco.Services.Web.WebViewPage + { + public Show() + { + } + public override void Execute() + { + + #line 5 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + Authorization.Require(Claims.Config.DeviceFlag.Show); + + ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Device Flags", MVC.Config.DeviceFlag.Index(null), Model.DeviceFlag.ToString()); + + var canConfig = Authorization.Has(Claims.Config.DeviceFlag.Configure); + var canDelete = Authorization.Has(Claims.Config.DeviceFlag.Delete); + var canBulkAssignment = Authorization.HasAll(Claims.Device.Actions.AddFlags, Claims.Device.Actions.RemoveFlags, Claims.Device.ShowFlagAssignments); + var canShowDevices = Model.CurrentAssignmentCount > 0 && Authorization.HasAll(Claims.Device.Search, Claims.Device.ShowFlagAssignments); + var canExportCurrent = Model.CurrentAssignmentCount > 0 && Authorization.Has(Claims.Config.DeviceFlag.Export); + var canExportAll = Model.TotalAssignmentCount > 0 && Authorization.Has(Claims.Config.DeviceFlag.Export); + + var hideAdvanced = + Model.DeviceFlag.DevicesLinkedGroup == null && + Model.DeviceFlag.DeviceUsersLinkedGroup == null && + Model.DeviceFlag.OnAssignmentExpression == null && + Model.DeviceFlag.OnUnassignmentExpression == null; + + Html.BundleDeferred("~/ClientScripts/Modules/Disco-PropertyChangeHelpers"); + + + #line default + #line hidden +WriteLiteral("\r\n(hideAdvanced ? " Config_HideAdvanced" : null + + #line default + #line hidden +, 1490), false) +); + +WriteLiteral(" style=\"width: 550px\""); + +WriteLiteral(">\r\n \r\n \r\n \r\n Id:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n"); + + + #line 211 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + #line default + #line hidden + + #line 211 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + if (hideAdvanced) + { + + + #line default + #line hidden +WriteLiteral(" \r\n \r\n Show Advanced Options + + + +"); + + + #line 227 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + } + + + #line default + #line hidden +WriteLiteral(" \r\n \r\n \r\n \r\n " + +" \r\n \r\n \r\n \r\n\r\n " + +" \r\n \r\n " + +" \r\n \r\n
\r\n"); + +WriteLiteral(" "); + + + #line 32 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Html.DisplayFor(model => model.DeviceFlag.Id)); + + + #line default + #line hidden +WriteLiteral("\r\n
\r\n " + +" Name:\r\n \r\n"); + + + #line 40 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + #line default + #line hidden + + #line 40 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + if (canConfig) + { + + #line default + #line hidden + + #line 41 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Html.EditorFor(model => model.DeviceFlag.Name)); + + + #line default + #line hidden + + #line 41 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + + #line default + #line hidden + + #line 42 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(AjaxHelpers.AjaxSave()); + + + #line default + #line hidden + + #line 42 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + + #line default + #line hidden + + #line 43 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(AjaxHelpers.AjaxLoader()); + + + #line default + #line hidden + + #line 43 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + + #line default + #line hidden +WriteLiteral(" + $(function () { + document.DiscoFunctions.PropertyChangeHelper( + $('#DeviceFlag_Name'), + 'Invalid Name', + '"); + + + #line 49 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Url.Action(MVC.API.DeviceFlag.UpdateName(Model.DeviceFlag.Id))); + + + #line default + #line hidden +WriteLiteral("\',\r\n \'FlagName\'\r\n );\r\n " + +" });\r\n \r\n"); + + + #line 54 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + } + else + { + + + #line default + #line hidden + + #line 57 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Model.DeviceFlag.Name); + + + #line default + #line hidden + + #line 57 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + } + + + #line default + #line hidden +WriteLiteral("
\r\n " + +" Description:\r\n \r\n"); + + + #line 66 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + #line default + #line hidden + + #line 66 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + if (canConfig) + { + + #line default + #line hidden + + #line 67 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Html.EditorFor(model => model.DeviceFlag.Description)); + + + #line default + #line hidden + + #line 67 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + + #line default + #line hidden + + #line 68 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(AjaxHelpers.AjaxSave()); + + + #line default + #line hidden + + #line 68 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + + #line default + #line hidden + + #line 69 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(AjaxHelpers.AjaxLoader()); + + + #line default + #line hidden + + #line 69 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + + #line default + #line hidden +WriteLiteral(" + $(function () { + document.DiscoFunctions.PropertyChangeHelper( + $('#DeviceFlag_Description'), + 'Invalid Description', + '"); + + + #line 75 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Url.Action(MVC.API.DeviceFlag.UpdateDescription(Model.DeviceFlag.Id))); + + + #line default + #line hidden +WriteLiteral("\',\r\n \'Description\'\r\n );" + +"\r\n });\r\n \r\n"); + + + #line 80 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + } + else + { + + + #line default + #line hidden +WriteLiteral("
\r\n");
+
+            
+            #line 84 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml"
+                    
+            
+            #line default
+            #line hidden
+            
+            #line 84 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml"
+                     if (string.IsNullOrEmpty(Model.DeviceFlag.Description))
+                    {
+
+            
+            #line default
+            #line hidden
+WriteLiteral("                    ");
+
+WriteLiteral("<None>");
+
+WriteLiteral("\r\n");
+
+            
+            #line 87 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml"
+                    }
+                    else
+                    {
+                        
+            
+            #line default
+            #line hidden
+            
+            #line 90 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml"
+                   Write(Model.DeviceFlag.Description.ToHtmlComment());
+
+            
+            #line default
+            #line hidden
+            
+            #line 90 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml"
+                                                                     
+                    }
+
+            
+            #line default
+            #line hidden
+WriteLiteral("                    
\r\n"); + + + #line 93 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + } + + + #line default + #line hidden +WriteLiteral("
\r\n " + +" Statistics:\r\n \r\n
" + +""); + + + #line 101 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Model.CurrentAssignmentCount); + + + #line default + #line hidden +WriteLiteral(" device"); + + + #line 101 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Model.CurrentAssignmentCount != 1 ? "s" : null); + + + #line default + #line hidden +WriteLiteral(" currently assigned
\r\n
"); + + + #line 102 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Model.TotalAssignmentCount); + + + #line default + #line hidden +WriteLiteral(" total device historical assignment"); + + + #line 102 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Model.TotalAssignmentCount != 1 ? "s" : null); + + + #line default + #line hidden +WriteLiteral("
\r\n
\r\n " + +" Icon:\r\n \r\n
\r\n On Assignment
Expression:\r\n " + +"
\r\n"); + + + #line 233 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + #line default + #line hidden + + #line 233 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + if (canConfig) + { + + + #line default + #line hidden + + #line 235 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Html.EditorFor(model => model.DeviceFlag.OnAssignmentExpression)); + + + #line default + #line hidden + + #line 235 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + + #line default + #line hidden + + #line 236 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(AjaxHelpers.AjaxRemove()); + + + #line default + #line hidden + + #line 236 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + + #line default + #line hidden + + #line 237 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(AjaxHelpers.AjaxSave()); + + + #line default + #line hidden + + #line 237 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + + #line default + #line hidden + + #line 238 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(AjaxHelpers.AjaxLoader()); + + + #line default + #line hidden + + #line 238 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + + #line default + #line hidden +WriteLiteral(" + $(function () { + var field = $('#DeviceFlag_OnAssignmentExpression'); + var fieldRemove = field.next('.ajaxRemove'); + var fieldOriginalWidth, fieldOriginalHeight; + + document.DiscoFunctions.PropertyChangeHelper( + field, + 'None', + '"); + + + #line 248 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Url.Action(MVC.API.DeviceFlag.UpdateOnAssignmentExpression(Model.DeviceFlag.Id))); + + + #line default + #line hidden +WriteLiteral("\',\r\n \'OnAssignmentExpression\'\r\n " + +" );\r\n\r\n field.focus(function () {" + +"\r\n fieldOriginalWidth = field.width();\r\n " + +" fieldOriginalHeight = field.height();\r\n " + +" field.css(\'overflow\', \'visible\').animate({ width: fiel" + +"d.parent().width() - 42, height: 75 }, 200);\r\n })" + +".blur(function () {\r\n field.css(\'overflow\', \'" + +"hidden\').animate({ width: fieldOriginalWidth, height: fieldOriginalHeight }, 200" + +");\r\n }).change(function () {\r\n " + +" if (!!field.val()) {\r\n f" + +"ieldRemove.show();\r\n } else {\r\n " + +" fieldRemove.hide();\r\n " + +" }\r\n }).attr(\'placeholder\', \'None\').attr(\'spell" + +"check\', \'false\');\r\n\r\n fieldRemove.click(function " + +"() {\r\n field.val(\'\').change();\r\n " + +" });\r\n\r\n if (!!field.val()) {\r\n" + +" fieldRemove.show();\r\n " + +" } else {\r\n fieldRemove.hide();\r\n " + +" }\r\n });\r\n " + +" \r\n"); + + + #line 277 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + } + else + { + if (string.IsNullOrWhiteSpace(Model.DeviceFlag.OnAssignmentExpression)) + { + + + #line default + #line hidden +WriteLiteral(" <None Specified>\r\n"); + + + #line 283 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + } + else + { + + + #line default + #line hidden +WriteLiteral(" \r\n"); + +WriteLiteral(" "); + + + #line 287 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Model.DeviceFlag.OnAssignmentExpression); + + + #line default + #line hidden +WriteLiteral("\r\n \r\n"); + + + #line 289 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + } + } + + + #line default + #line hidden +WriteLiteral(" \r\n \r\n This expression will be evaluated whenever the flag is assigned to a device." + +" The output of the expression will be shown with the flag assignment.\r\n " + +"

\r\n \r\n
\r\n On Unassignment
Expression:\r\n " + +"
\r\n"); + + + #line 303 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + #line default + #line hidden + + #line 303 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + if (canConfig) + { + + + #line default + #line hidden + + #line 305 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Html.EditorFor(model => model.DeviceFlag.OnUnassignmentExpression)); + + + #line default + #line hidden + + #line 305 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + + #line default + #line hidden + + #line 306 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(AjaxHelpers.AjaxRemove()); + + + #line default + #line hidden + + #line 306 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + + #line default + #line hidden + + #line 307 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(AjaxHelpers.AjaxSave()); + + + #line default + #line hidden + + #line 307 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + + #line default + #line hidden + + #line 308 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(AjaxHelpers.AjaxLoader()); + + + #line default + #line hidden + + #line 308 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + + #line default + #line hidden +WriteLiteral(" + $(function () { + var field = $('#DeviceFlag_OnUnassignmentExpression'); + var fieldRemove = field.next('.ajaxRemove'); + var fieldOriginalWidth, fieldOriginalHeight; + + document.DiscoFunctions.PropertyChangeHelper( + field, + 'None', + '"); + + + #line 318 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Url.Action(MVC.API.DeviceFlag.UpdateOnUnassignmentExpression(Model.DeviceFlag.Id))); + + + #line default + #line hidden +WriteLiteral(@"', + 'OnUnassignmentExpression' + ); + + field.focus(function () { + fieldOriginalWidth = field.width(); + fieldOriginalHeight = field.height(); + field.css('overflow', 'visible').animate({ width: field.parent().width() - 42, height: 75 }, 200); + }).blur(function () { + field.css('overflow', 'hidden').animate({ width: fieldOriginalWidth, height: fieldOriginalHeight }, 200); + }).change(function () { + if (!!field.val()) { + fieldRemove.show(); + } else { + fieldRemove.hide(); + } + }).attr('placeholder', 'None').attr('spellcheck', 'false'); + + fieldRemove.click(function () { + field.val('').change(); + }); + + if (!!field.val()) { + fieldRemove.show(); + } else { + fieldRemove.hide(); + } + }); + +"); + + + #line 347 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + } + else + { + if (string.IsNullOrWhiteSpace(Model.DeviceFlag.OnUnassignmentExpression)) + { + + + #line default + #line hidden +WriteLiteral(" <None Specified>\r\n"); + + + #line 353 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + } + else + { + + + #line default + #line hidden +WriteLiteral(" \r\n"); + +WriteLiteral(" "); + + + #line 357 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Model.DeviceFlag.OnUnassignmentExpression); + + + #line default + #line hidden +WriteLiteral("\r\n \r\n"); + + + #line 359 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + } + } + + + #line default + #line hidden +WriteLiteral(" \r\n \r\n This expression will be evaluated whenever the flag is removed from a device" + +". The output of the expression will be shown with the flag assignment.\r\n " + +"

\r\n \r\n
\r\n Linked Groups:\r\n \r\n
\r\n"); + +WriteLiteral(" "); + + + #line 375 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Html.Partial(MVC.Config.Shared.Views.LinkedGroupInstance, new LinkedGroupModel() + { + CanConfigure = canConfig, + CategoryDescription = DeviceFlagDevicesManagedGroup.GetCategoryDescription(Model.DeviceFlag), + Description = DeviceFlagDevicesManagedGroup.GetDescription(Model.DeviceFlag), + ManagedGroup = Model.DevicesLinkedGroup, + IncludeFilterBeginDate = true, + UpdateUrl = Url.Action(MVC.API.DeviceFlag.UpdateDevicesLinkedGroup(Model.DeviceFlag.Id, redirect: true)) + })); + + + #line default + #line hidden +WriteLiteral("\r\n"); + +WriteLiteral(" "); + + + #line 384 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Html.Partial(MVC.Config.Shared.Views.LinkedGroupInstance, new LinkedGroupModel() + { + CanConfigure = canConfig, + CategoryDescription = DeviceFlagDeviceAssignedUsersManagedGroup.GetCategoryDescription(Model.DeviceFlag), + Description = DeviceFlagDeviceAssignedUsersManagedGroup.GetDescription(Model.DeviceFlag), + ManagedGroup = Model.AssignedUserLinkedGroup, + IncludeFilterBeginDate = true, + UpdateUrl = Url.Action(MVC.API.DeviceFlag.UpdateAssignedUserLinkedGroup(Model.DeviceFlag.Id, redirect: true)) + })); + + + #line default + #line hidden +WriteLiteral("\r\n"); + + + #line 393 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + #line default + #line hidden + + #line 393 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + if (canConfig) + { + + + #line default + #line hidden + + #line 395 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Html.Partial(MVC.Config.Shared.Views.LinkedGroupShared)); + + + #line default + #line hidden + + #line 395 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + } + + + #line default + #line hidden +WriteLiteral("
\r\n
\r\n\r\n"); + + + #line 402 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + if (canBulkAssignment || canDelete || canShowDevices || canExportCurrent || canExportAll) +{ + + + #line default + #line hidden +WriteLiteral(" \r\n"); + + + #line 405 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + #line default + #line hidden + + #line 405 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + if (canExportCurrent) + { + + + #line default + #line hidden + + #line 407 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Html.ActionLinkButton("Export Current Assignments", MVC.Config.DeviceFlag.Export(null, Model.DeviceFlag.Id, true), "Config_DeviceFlags_Actions_ExportCurrent_Button")); + + + #line default + #line hidden + + #line 407 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + } + + + #line default + #line hidden +WriteLiteral(" "); + + + #line 409 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + if (canExportAll) + { + + + #line default + #line hidden + + #line 411 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Html.ActionLinkButton("Export All Assignments", MVC.Config.DeviceFlag.Export(null, Model.DeviceFlag.Id, false), "Config_DeviceFlags_Actions_ExportAll_Button")); + + + #line default + #line hidden + + #line 411 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + } + + + #line default + #line hidden +WriteLiteral(" "); + + + #line 413 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + if (canBulkAssignment) + { + + + #line default + #line hidden +WriteLiteral(" Bulk Assign Devices\r\n"); + +WriteLiteral(" \r\n

\r\n Select the mode used to assign device" + +"s:\r\n

\r\n
\r\n \r\n
Add
+

+ Specified devices will have this flag added. Devices who already have this flag will be skipped. +

+
+ \r\n
Override
+

+ Specified devices will have this flag added. Specified devices which already have this flag will be skipped. + Devices who already have this flag but are not specified will have the flag removed. +

+ + + +"); + +WriteLiteral(" \r\n +
+ Enter multiple Device Serial Numbers separated by <new line>, commas (,) or semicolons (;). +
+ + \r\n

Loading current assignments...

\r\n \r\n " + +" \r\n \r\n

Comments:

\r\n \r\n \r\n \r\n"); + +WriteLiteral(" +"); + + + #line 538 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + } + + + #line default + #line hidden +WriteLiteral(" "); + + + #line 539 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + if (canDelete) + { + + + #line default + #line hidden + + #line 541 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Html.ActionLinkButton("Delete", MVC.API.DeviceFlag.Delete(Model.DeviceFlag.Id, true), "Config_DeviceFlags_Actions_Delete_Button")); + + + #line default + #line hidden + + #line 541 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + + #line default + #line hidden +WriteLiteral(" \r\n

\r\n \r\n This item will be permanently deleted and cannot be re" + +"covered.
\r\n
\r\n"); + + + #line 547 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + + #line default + #line hidden + + #line 547 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + if (Model.CurrentAssignmentCount > 0) + { + + + #line default + #line hidden +WriteLiteral(" "); + + + #line 549 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Model.CurrentAssignmentCount); + + + #line default + #line hidden +WriteLiteral(" device"); + + + #line 549 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Model.CurrentAssignmentCount != 1 ? "s are" : " is"); + + + #line default + #line hidden +WriteLiteral(" currently assigned\r\n"); + +WriteLiteral("
\r\n"); + +WriteLiteral("
\r\n"); + + + #line 552 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + } + + + #line default + #line hidden +WriteLiteral(" Are you sure?\r\n

\r\n \r\n"); + +WriteLiteral(" + $(function () { + var button = $('#Config_DeviceFlags_Actions_Delete_Button'); + var buttonDialog = $('#Config_DeviceFlags_Actions_Delete_Dialog'); + var buttonLink = button.attr('href'); + button.attr('href', '#'); + button.click(function () { + buttonDialog.dialog('open'); + return false; + }); + buttonDialog.dialog({ + resizable: false, + modal: true, + autoOpen: false, + buttons: { + ""Delete"": function () { + var $this = $(this); + $this.dialog(""disable""); + $this.dialog(""option"", ""buttons"", null); + window.location.href = buttonLink; + }, + Cancel: function () { + $(this).dialog(""close""); + } + } + }); + }); + +"); + + + #line 584 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + } + + + #line default + #line hidden +WriteLiteral(" "); + + + #line 585 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + if (canShowDevices) + { + + + #line default + #line hidden + + #line 587 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + Write(Html.ActionLinkButton(string.Format("Show {0} device{1}", Model.CurrentAssignmentCount, (Model.CurrentAssignmentCount == 1 ? null : "s")), MVC.Search.Query(Model.DeviceFlag.Id.ToString(), "DeviceFlag"), "Config_DeviceFlags_Actions_ShowDevices_Button")); + + + #line default + #line hidden + + #line 587 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" + + } + + + #line default + #line hidden +WriteLiteral(" \r\n"); + + + #line 590 "..\..\Areas\Config\Views\DeviceFlag\Show.cshtml" +} + + + #line default + #line hidden + } + } +} +#pragma warning restore 1591 diff --git a/Disco.Web/ClientSource/Style/BundleSite.css b/Disco.Web/ClientSource/Style/BundleSite.css index 0880752c..988d2bb6 100644 --- a/Disco.Web/ClientSource/Style/BundleSite.css +++ b/Disco.Web/ClientSource/Style/BundleSite.css @@ -5209,14 +5209,17 @@ table.genericData td.id a { .dataTables_wrapper table > thead tr > th.sorting_disabled { background-image: none; } -table.userTable div.flags { +table.userTable div.flags, +table.deviceTable div.flags { display: inline-block; float: right; } -table.userTable div.flags > i { +table.userTable div.flags > i, +table.deviceTable div.flags > i { cursor: default; } -table.userTable div.flags > i > .details { +table.userTable div.flags > i > .details, +table.deviceTable div.flags > i > .details { display: none; } .jobStatus { @@ -5689,15 +5692,15 @@ div.Disco-AttachmentUpload-ImageDialog { background-color: #000 !important; padding: 0 !important; } -body > .User_FlagAssignment_Tooltip span.name { +body > .FlagAssignment_Tooltip span.name { display: block; font-weight: 600; } -body > .User_FlagAssignment_Tooltip span.comments { +body > .FlagAssignment_Tooltip span.comments { display: block; padding: 2px 0 2px 4px; } -body > .User_FlagAssignment_Tooltip span.added { +body > .FlagAssignment_Tooltip span.added { font-style: italic; font-size: 0.9em; } diff --git a/Disco.Web/ClientSource/Style/BundleSite.min.css b/Disco.Web/ClientSource/Style/BundleSite.min.css index 4961d900..60106f8f 100644 --- a/Disco.Web/ClientSource/Style/BundleSite.min.css +++ b/Disco.Web/ClientSource/Style/BundleSite.min.css @@ -9,4 +9,4 @@ html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:1 * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ -@font-face{font-family:'FontAwesome';src:url('/ClientSource/Style/FontAwesome/fontawesome-webfont.eot?v=4.7.0');src:url('/ClientSource/Style/FontAwesome/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('/ClientSource/Style/FontAwesome/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('/ClientSource/Style/FontAwesome/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('/ClientSource/Style/FontAwesome/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('/ClientSource/Style/FontAwesome/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal;}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%;}.fa-2x{font-size:2em;}.fa-3x{font-size:3em;}.fa-4x{font-size:4em;}.fa-5x{font-size:5em;}.fa-fw{width:1.28571429em;text-align:center;}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none;}.fa-ul>li{position:relative;}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center;}.fa-li.fa-lg{left:-1.85714286em;}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em;}.fa-pull-left{float:left;}.fa-pull-right{float:right;}.fa.fa-pull-left{margin-right:.3em;}.fa.fa-pull-right{margin-left:.3em;}.pull-right{float:right;}.pull-left{float:left;}.fa.pull-left{margin-right:.3em;}.fa.pull-right{margin-left:.3em;}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear;}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8);}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg);}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg);}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg);}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1);}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1);}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none;}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle;}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center;}.fa-stack-1x{line-height:inherit;}.fa-stack-2x{font-size:2em;}.fa-inverse{color:#fff;}.fa-glass:before{content:"";}.fa-music:before{content:"";}.fa-search:before{content:"";}.fa-envelope-o:before{content:"";}.fa-heart:before{content:"";}.fa-star:before{content:"";}.fa-star-o:before{content:"";}.fa-user:before{content:"";}.fa-film:before{content:"";}.fa-th-large:before{content:"";}.fa-th:before{content:"";}.fa-th-list:before{content:"";}.fa-check:before{content:"";}.fa-remove:before,.fa-close:before,.fa-times:before{content:"";}.fa-search-plus:before{content:"";}.fa-search-minus:before{content:"";}.fa-power-off:before{content:"";}.fa-signal:before{content:"";}.fa-gear:before,.fa-cog:before{content:"";}.fa-trash-o:before{content:"";}.fa-home:before{content:"";}.fa-file-o:before{content:"";}.fa-clock-o:before{content:"";}.fa-road:before{content:"";}.fa-download:before{content:"";}.fa-arrow-circle-o-down:before{content:"";}.fa-arrow-circle-o-up:before{content:"";}.fa-inbox:before{content:"";}.fa-play-circle-o:before{content:"";}.fa-rotate-right:before,.fa-repeat:before{content:"";}.fa-refresh:before{content:"";}.fa-list-alt:before{content:"";}.fa-lock:before{content:"";}.fa-flag:before{content:"";}.fa-headphones:before{content:"";}.fa-volume-off:before{content:"";}.fa-volume-down:before{content:"";}.fa-volume-up:before{content:"";}.fa-qrcode:before{content:"";}.fa-barcode:before{content:"";}.fa-tag:before{content:"";}.fa-tags:before{content:"";}.fa-book:before{content:"";}.fa-bookmark:before{content:"";}.fa-print:before{content:"";}.fa-camera:before{content:"";}.fa-font:before{content:"";}.fa-bold:before{content:"";}.fa-italic:before{content:"";}.fa-text-height:before{content:"";}.fa-text-width:before{content:"";}.fa-align-left:before{content:"";}.fa-align-center:before{content:"";}.fa-align-right:before{content:"";}.fa-align-justify:before{content:"";}.fa-list:before{content:"";}.fa-dedent:before,.fa-outdent:before{content:"";}.fa-indent:before{content:"";}.fa-video-camera:before{content:"";}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"";}.fa-pencil:before{content:"";}.fa-map-marker:before{content:"";}.fa-adjust:before{content:"";}.fa-tint:before{content:"";}.fa-edit:before,.fa-pencil-square-o:before{content:"";}.fa-share-square-o:before{content:"";}.fa-check-square-o:before{content:"";}.fa-arrows:before{content:"";}.fa-step-backward:before{content:"";}.fa-fast-backward:before{content:"";}.fa-backward:before{content:"";}.fa-play:before{content:"";}.fa-pause:before{content:"";}.fa-stop:before{content:"";}.fa-forward:before{content:"";}.fa-fast-forward:before{content:"";}.fa-step-forward:before{content:"";}.fa-eject:before{content:"";}.fa-chevron-left:before{content:"";}.fa-chevron-right:before{content:"";}.fa-plus-circle:before{content:"";}.fa-minus-circle:before{content:"";}.fa-times-circle:before{content:"";}.fa-check-circle:before{content:"";}.fa-question-circle:before{content:"";}.fa-info-circle:before{content:"";}.fa-crosshairs:before{content:"";}.fa-times-circle-o:before{content:"";}.fa-check-circle-o:before{content:"";}.fa-ban:before{content:"";}.fa-arrow-left:before{content:"";}.fa-arrow-right:before{content:"";}.fa-arrow-up:before{content:"";}.fa-arrow-down:before{content:"";}.fa-mail-forward:before,.fa-share:before{content:"";}.fa-expand:before{content:"";}.fa-compress:before{content:"";}.fa-plus:before{content:"";}.fa-minus:before{content:"";}.fa-asterisk:before{content:"";}.fa-exclamation-circle:before{content:"";}.fa-gift:before{content:"";}.fa-leaf:before{content:"";}.fa-fire:before{content:"";}.fa-eye:before{content:"";}.fa-eye-slash:before{content:"";}.fa-warning:before,.fa-exclamation-triangle:before{content:"";}.fa-plane:before{content:"";}.fa-calendar:before{content:"";}.fa-random:before{content:"";}.fa-comment:before{content:"";}.fa-magnet:before{content:"";}.fa-chevron-up:before{content:"";}.fa-chevron-down:before{content:"";}.fa-retweet:before{content:"";}.fa-shopping-cart:before{content:"";}.fa-folder:before{content:"";}.fa-folder-open:before{content:"";}.fa-arrows-v:before{content:"";}.fa-arrows-h:before{content:"";}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"";}.fa-twitter-square:before{content:"";}.fa-facebook-square:before{content:"";}.fa-camera-retro:before{content:"";}.fa-key:before{content:"";}.fa-gears:before,.fa-cogs:before{content:"";}.fa-comments:before{content:"";}.fa-thumbs-o-up:before{content:"";}.fa-thumbs-o-down:before{content:"";}.fa-star-half:before{content:"";}.fa-heart-o:before{content:"";}.fa-sign-out:before{content:"";}.fa-linkedin-square:before{content:"";}.fa-thumb-tack:before{content:"";}.fa-external-link:before{content:"";}.fa-sign-in:before{content:"";}.fa-trophy:before{content:"";}.fa-github-square:before{content:"";}.fa-upload:before{content:"";}.fa-lemon-o:before{content:"";}.fa-phone:before{content:"";}.fa-square-o:before{content:"";}.fa-bookmark-o:before{content:"";}.fa-phone-square:before{content:"";}.fa-twitter:before{content:"";}.fa-facebook-f:before,.fa-facebook:before{content:"";}.fa-github:before{content:"";}.fa-unlock:before{content:"";}.fa-credit-card:before{content:"";}.fa-feed:before,.fa-rss:before{content:"";}.fa-hdd-o:before{content:"";}.fa-bullhorn:before{content:"";}.fa-bell:before{content:"";}.fa-certificate:before{content:"";}.fa-hand-o-right:before{content:"";}.fa-hand-o-left:before{content:"";}.fa-hand-o-up:before{content:"";}.fa-hand-o-down:before{content:"";}.fa-arrow-circle-left:before{content:"";}.fa-arrow-circle-right:before{content:"";}.fa-arrow-circle-up:before{content:"";}.fa-arrow-circle-down:before{content:"";}.fa-globe:before{content:"";}.fa-wrench:before{content:"";}.fa-tasks:before{content:"";}.fa-filter:before{content:"";}.fa-briefcase:before{content:"";}.fa-arrows-alt:before{content:"";}.fa-group:before,.fa-users:before{content:"";}.fa-chain:before,.fa-link:before{content:"";}.fa-cloud:before{content:"";}.fa-flask:before{content:"";}.fa-cut:before,.fa-scissors:before{content:"";}.fa-copy:before,.fa-files-o:before{content:"";}.fa-paperclip:before{content:"";}.fa-save:before,.fa-floppy-o:before{content:"";}.fa-square:before{content:"";}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"";}.fa-list-ul:before{content:"";}.fa-list-ol:before{content:"";}.fa-strikethrough:before{content:"";}.fa-underline:before{content:"";}.fa-table:before{content:"";}.fa-magic:before{content:"";}.fa-truck:before{content:"";}.fa-pinterest:before{content:"";}.fa-pinterest-square:before{content:"";}.fa-google-plus-square:before{content:"";}.fa-google-plus:before{content:"";}.fa-money:before{content:"";}.fa-caret-down:before{content:"";}.fa-caret-up:before{content:"";}.fa-caret-left:before{content:"";}.fa-caret-right:before{content:"";}.fa-columns:before{content:"";}.fa-unsorted:before,.fa-sort:before{content:"";}.fa-sort-down:before,.fa-sort-desc:before{content:"";}.fa-sort-up:before,.fa-sort-asc:before{content:"";}.fa-envelope:before{content:"";}.fa-linkedin:before{content:"";}.fa-rotate-left:before,.fa-undo:before{content:"";}.fa-legal:before,.fa-gavel:before{content:"";}.fa-dashboard:before,.fa-tachometer:before{content:"";}.fa-comment-o:before{content:"";}.fa-comments-o:before{content:"";}.fa-flash:before,.fa-bolt:before{content:"";}.fa-sitemap:before{content:"";}.fa-umbrella:before{content:"";}.fa-paste:before,.fa-clipboard:before{content:"";}.fa-lightbulb-o:before{content:"";}.fa-exchange:before{content:"";}.fa-cloud-download:before{content:"";}.fa-cloud-upload:before{content:"";}.fa-user-md:before{content:"";}.fa-stethoscope:before{content:"";}.fa-suitcase:before{content:"";}.fa-bell-o:before{content:"";}.fa-coffee:before{content:"";}.fa-cutlery:before{content:"";}.fa-file-text-o:before{content:"";}.fa-building-o:before{content:"";}.fa-hospital-o:before{content:"";}.fa-ambulance:before{content:"";}.fa-medkit:before{content:"";}.fa-fighter-jet:before{content:"";}.fa-beer:before{content:"";}.fa-h-square:before{content:"";}.fa-plus-square:before{content:"";}.fa-angle-double-left:before{content:"";}.fa-angle-double-right:before{content:"";}.fa-angle-double-up:before{content:"";}.fa-angle-double-down:before{content:"";}.fa-angle-left:before{content:"";}.fa-angle-right:before{content:"";}.fa-angle-up:before{content:"";}.fa-angle-down:before{content:"";}.fa-desktop:before{content:"";}.fa-laptop:before{content:"";}.fa-tablet:before{content:"";}.fa-mobile-phone:before,.fa-mobile:before{content:"";}.fa-circle-o:before{content:"";}.fa-quote-left:before{content:"";}.fa-quote-right:before{content:"";}.fa-spinner:before{content:"";}.fa-circle:before{content:"";}.fa-mail-reply:before,.fa-reply:before{content:"";}.fa-github-alt:before{content:"";}.fa-folder-o:before{content:"";}.fa-folder-open-o:before{content:"";}.fa-smile-o:before{content:"";}.fa-frown-o:before{content:"";}.fa-meh-o:before{content:"";}.fa-gamepad:before{content:"";}.fa-keyboard-o:before{content:"";}.fa-flag-o:before{content:"";}.fa-flag-checkered:before{content:"";}.fa-terminal:before{content:"";}.fa-code:before{content:"";}.fa-mail-reply-all:before,.fa-reply-all:before{content:"";}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"";}.fa-location-arrow:before{content:"";}.fa-crop:before{content:"";}.fa-code-fork:before{content:"";}.fa-unlink:before,.fa-chain-broken:before{content:"";}.fa-question:before{content:"";}.fa-info:before{content:"";}.fa-exclamation:before{content:"";}.fa-superscript:before{content:"";}.fa-subscript:before{content:"";}.fa-eraser:before{content:"";}.fa-puzzle-piece:before{content:"";}.fa-microphone:before{content:"";}.fa-microphone-slash:before{content:"";}.fa-shield:before{content:"";}.fa-calendar-o:before{content:"";}.fa-fire-extinguisher:before{content:"";}.fa-rocket:before{content:"";}.fa-maxcdn:before{content:"";}.fa-chevron-circle-left:before{content:"";}.fa-chevron-circle-right:before{content:"";}.fa-chevron-circle-up:before{content:"";}.fa-chevron-circle-down:before{content:"";}.fa-html5:before{content:"";}.fa-css3:before{content:"";}.fa-anchor:before{content:"";}.fa-unlock-alt:before{content:"";}.fa-bullseye:before{content:"";}.fa-ellipsis-h:before{content:"";}.fa-ellipsis-v:before{content:"";}.fa-rss-square:before{content:"";}.fa-play-circle:before{content:"";}.fa-ticket:before{content:"";}.fa-minus-square:before{content:"";}.fa-minus-square-o:before{content:"";}.fa-level-up:before{content:"";}.fa-level-down:before{content:"";}.fa-check-square:before{content:"";}.fa-pencil-square:before{content:"";}.fa-external-link-square:before{content:"";}.fa-share-square:before{content:"";}.fa-compass:before{content:"";}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"";}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"";}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"";}.fa-euro:before,.fa-eur:before{content:"";}.fa-gbp:before{content:"";}.fa-dollar:before,.fa-usd:before{content:"";}.fa-rupee:before,.fa-inr:before{content:"";}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"";}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"";}.fa-won:before,.fa-krw:before{content:"";}.fa-bitcoin:before,.fa-btc:before{content:"";}.fa-file:before{content:"";}.fa-file-text:before{content:"";}.fa-sort-alpha-asc:before{content:"";}.fa-sort-alpha-desc:before{content:"";}.fa-sort-amount-asc:before{content:"";}.fa-sort-amount-desc:before{content:"";}.fa-sort-numeric-asc:before{content:"";}.fa-sort-numeric-desc:before{content:"";}.fa-thumbs-up:before{content:"";}.fa-thumbs-down:before{content:"";}.fa-youtube-square:before{content:"";}.fa-youtube:before{content:"";}.fa-xing:before{content:"";}.fa-xing-square:before{content:"";}.fa-youtube-play:before{content:"";}.fa-dropbox:before{content:"";}.fa-stack-overflow:before{content:"";}.fa-instagram:before{content:"";}.fa-flickr:before{content:"";}.fa-adn:before{content:"";}.fa-bitbucket:before{content:"";}.fa-bitbucket-square:before{content:"";}.fa-tumblr:before{content:"";}.fa-tumblr-square:before{content:"";}.fa-long-arrow-down:before{content:"";}.fa-long-arrow-up:before{content:"";}.fa-long-arrow-left:before{content:"";}.fa-long-arrow-right:before{content:"";}.fa-apple:before{content:"";}.fa-windows:before{content:"";}.fa-android:before{content:"";}.fa-linux:before{content:"";}.fa-dribbble:before{content:"";}.fa-skype:before{content:"";}.fa-foursquare:before{content:"";}.fa-trello:before{content:"";}.fa-female:before{content:"";}.fa-male:before{content:"";}.fa-gittip:before,.fa-gratipay:before{content:"";}.fa-sun-o:before{content:"";}.fa-moon-o:before{content:"";}.fa-archive:before{content:"";}.fa-bug:before{content:"";}.fa-vk:before{content:"";}.fa-weibo:before{content:"";}.fa-renren:before{content:"";}.fa-pagelines:before{content:"";}.fa-stack-exchange:before{content:"";}.fa-arrow-circle-o-right:before{content:"";}.fa-arrow-circle-o-left:before{content:"";}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"";}.fa-dot-circle-o:before{content:"";}.fa-wheelchair:before{content:"";}.fa-vimeo-square:before{content:"";}.fa-turkish-lira:before,.fa-try:before{content:"";}.fa-plus-square-o:before{content:"";}.fa-space-shuttle:before{content:"";}.fa-slack:before{content:"";}.fa-envelope-square:before{content:"";}.fa-wordpress:before{content:"";}.fa-openid:before{content:"";}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"";}.fa-mortar-board:before,.fa-graduation-cap:before{content:"";}.fa-yahoo:before{content:"";}.fa-google:before{content:"";}.fa-reddit:before{content:"";}.fa-reddit-square:before{content:"";}.fa-stumbleupon-circle:before{content:"";}.fa-stumbleupon:before{content:"";}.fa-delicious:before{content:"";}.fa-digg:before{content:"";}.fa-pied-piper-pp:before{content:"";}.fa-pied-piper-alt:before{content:"";}.fa-drupal:before{content:"";}.fa-joomla:before{content:"";}.fa-language:before{content:"";}.fa-fax:before{content:"";}.fa-building:before{content:"";}.fa-child:before{content:"";}.fa-paw:before{content:"";}.fa-spoon:before{content:"";}.fa-cube:before{content:"";}.fa-cubes:before{content:"";}.fa-behance:before{content:"";}.fa-behance-square:before{content:"";}.fa-steam:before{content:"";}.fa-steam-square:before{content:"";}.fa-recycle:before{content:"";}.fa-automobile:before,.fa-car:before{content:"";}.fa-cab:before,.fa-taxi:before{content:"";}.fa-tree:before{content:"";}.fa-spotify:before{content:"";}.fa-deviantart:before{content:"";}.fa-soundcloud:before{content:"";}.fa-database:before{content:"";}.fa-file-pdf-o:before{content:"";}.fa-file-word-o:before{content:"";}.fa-file-excel-o:before{content:"";}.fa-file-powerpoint-o:before{content:"";}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"";}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"";}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"";}.fa-file-movie-o:before,.fa-file-video-o:before{content:"";}.fa-file-code-o:before{content:"";}.fa-vine:before{content:"";}.fa-codepen:before{content:"";}.fa-jsfiddle:before{content:"";}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"";}.fa-circle-o-notch:before{content:"";}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"";}.fa-ge:before,.fa-empire:before{content:"";}.fa-git-square:before{content:"";}.fa-git:before{content:"";}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"";}.fa-tencent-weibo:before{content:"";}.fa-qq:before{content:"";}.fa-wechat:before,.fa-weixin:before{content:"";}.fa-send:before,.fa-paper-plane:before{content:"";}.fa-send-o:before,.fa-paper-plane-o:before{content:"";}.fa-history:before{content:"";}.fa-circle-thin:before{content:"";}.fa-header:before{content:"";}.fa-paragraph:before{content:"";}.fa-sliders:before{content:"";}.fa-share-alt:before{content:"";}.fa-share-alt-square:before{content:"";}.fa-bomb:before{content:"";}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"";}.fa-tty:before{content:"";}.fa-binoculars:before{content:"";}.fa-plug:before{content:"";}.fa-slideshare:before{content:"";}.fa-twitch:before{content:"";}.fa-yelp:before{content:"";}.fa-newspaper-o:before{content:"";}.fa-wifi:before{content:"";}.fa-calculator:before{content:"";}.fa-paypal:before{content:"";}.fa-google-wallet:before{content:"";}.fa-cc-visa:before{content:"";}.fa-cc-mastercard:before{content:"";}.fa-cc-discover:before{content:"";}.fa-cc-amex:before{content:"";}.fa-cc-paypal:before{content:"";}.fa-cc-stripe:before{content:"";}.fa-bell-slash:before{content:"";}.fa-bell-slash-o:before{content:"";}.fa-trash:before{content:"";}.fa-copyright:before{content:"";}.fa-at:before{content:"";}.fa-eyedropper:before{content:"";}.fa-paint-brush:before{content:"";}.fa-birthday-cake:before{content:"";}.fa-area-chart:before{content:"";}.fa-pie-chart:before{content:"";}.fa-line-chart:before{content:"";}.fa-lastfm:before{content:"";}.fa-lastfm-square:before{content:"";}.fa-toggle-off:before{content:"";}.fa-toggle-on:before{content:"";}.fa-bicycle:before{content:"";}.fa-bus:before{content:"";}.fa-ioxhost:before{content:"";}.fa-angellist:before{content:"";}.fa-cc:before{content:"";}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"";}.fa-meanpath:before{content:"";}.fa-buysellads:before{content:"";}.fa-connectdevelop:before{content:"";}.fa-dashcube:before{content:"";}.fa-forumbee:before{content:"";}.fa-leanpub:before{content:"";}.fa-sellsy:before{content:"";}.fa-shirtsinbulk:before{content:"";}.fa-simplybuilt:before{content:"";}.fa-skyatlas:before{content:"";}.fa-cart-plus:before{content:"";}.fa-cart-arrow-down:before{content:"";}.fa-diamond:before{content:"";}.fa-ship:before{content:"";}.fa-user-secret:before{content:"";}.fa-motorcycle:before{content:"";}.fa-street-view:before{content:"";}.fa-heartbeat:before{content:"";}.fa-venus:before{content:"";}.fa-mars:before{content:"";}.fa-mercury:before{content:"";}.fa-intersex:before,.fa-transgender:before{content:"";}.fa-transgender-alt:before{content:"";}.fa-venus-double:before{content:"";}.fa-mars-double:before{content:"";}.fa-venus-mars:before{content:"";}.fa-mars-stroke:before{content:"";}.fa-mars-stroke-v:before{content:"";}.fa-mars-stroke-h:before{content:"";}.fa-neuter:before{content:"";}.fa-genderless:before{content:"";}.fa-facebook-official:before{content:"";}.fa-pinterest-p:before{content:"";}.fa-whatsapp:before{content:"";}.fa-server:before{content:"";}.fa-user-plus:before{content:"";}.fa-user-times:before{content:"";}.fa-hotel:before,.fa-bed:before{content:"";}.fa-viacoin:before{content:"";}.fa-train:before{content:"";}.fa-subway:before{content:"";}.fa-medium:before{content:"";}.fa-yc:before,.fa-y-combinator:before{content:"";}.fa-optin-monster:before{content:"";}.fa-opencart:before{content:"";}.fa-expeditedssl:before{content:"";}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"";}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"";}.fa-battery-2:before,.fa-battery-half:before{content:"";}.fa-battery-1:before,.fa-battery-quarter:before{content:"";}.fa-battery-0:before,.fa-battery-empty:before{content:"";}.fa-mouse-pointer:before{content:"";}.fa-i-cursor:before{content:"";}.fa-object-group:before{content:"";}.fa-object-ungroup:before{content:"";}.fa-sticky-note:before{content:"";}.fa-sticky-note-o:before{content:"";}.fa-cc-jcb:before{content:"";}.fa-cc-diners-club:before{content:"";}.fa-clone:before{content:"";}.fa-balance-scale:before{content:"";}.fa-hourglass-o:before{content:"";}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"";}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"";}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"";}.fa-hourglass:before{content:"";}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"";}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"";}.fa-hand-scissors-o:before{content:"";}.fa-hand-lizard-o:before{content:"";}.fa-hand-spock-o:before{content:"";}.fa-hand-pointer-o:before{content:"";}.fa-hand-peace-o:before{content:"";}.fa-trademark:before{content:"";}.fa-registered:before{content:"";}.fa-creative-commons:before{content:"";}.fa-gg:before{content:"";}.fa-gg-circle:before{content:"";}.fa-tripadvisor:before{content:"";}.fa-odnoklassniki:before{content:"";}.fa-odnoklassniki-square:before{content:"";}.fa-get-pocket:before{content:"";}.fa-wikipedia-w:before{content:"";}.fa-safari:before{content:"";}.fa-chrome:before{content:"";}.fa-firefox:before{content:"";}.fa-opera:before{content:"";}.fa-internet-explorer:before{content:"";}.fa-tv:before,.fa-television:before{content:"";}.fa-contao:before{content:"";}.fa-500px:before{content:"";}.fa-amazon:before{content:"";}.fa-calendar-plus-o:before{content:"";}.fa-calendar-minus-o:before{content:"";}.fa-calendar-times-o:before{content:"";}.fa-calendar-check-o:before{content:"";}.fa-industry:before{content:"";}.fa-map-pin:before{content:"";}.fa-map-signs:before{content:"";}.fa-map-o:before{content:"";}.fa-map:before{content:"";}.fa-commenting:before{content:"";}.fa-commenting-o:before{content:"";}.fa-houzz:before{content:"";}.fa-vimeo:before{content:"";}.fa-black-tie:before{content:"";}.fa-fonticons:before{content:"";}.fa-reddit-alien:before{content:"";}.fa-edge:before{content:"";}.fa-credit-card-alt:before{content:"";}.fa-codiepie:before{content:"";}.fa-modx:before{content:"";}.fa-fort-awesome:before{content:"";}.fa-usb:before{content:"";}.fa-product-hunt:before{content:"";}.fa-mixcloud:before{content:"";}.fa-scribd:before{content:"";}.fa-pause-circle:before{content:"";}.fa-pause-circle-o:before{content:"";}.fa-stop-circle:before{content:"";}.fa-stop-circle-o:before{content:"";}.fa-shopping-bag:before{content:"";}.fa-shopping-basket:before{content:"";}.fa-hashtag:before{content:"";}.fa-bluetooth:before{content:"";}.fa-bluetooth-b:before{content:"";}.fa-percent:before{content:"";}.fa-gitlab:before{content:"";}.fa-wpbeginner:before{content:"";}.fa-wpforms:before{content:"";}.fa-envira:before{content:"";}.fa-universal-access:before{content:"";}.fa-wheelchair-alt:before{content:"";}.fa-question-circle-o:before{content:"";}.fa-blind:before{content:"";}.fa-audio-description:before{content:"";}.fa-volume-control-phone:before{content:"";}.fa-braille:before{content:"";}.fa-assistive-listening-systems:before{content:"";}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"";}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"";}.fa-glide:before{content:"";}.fa-glide-g:before{content:"";}.fa-signing:before,.fa-sign-language:before{content:"";}.fa-low-vision:before{content:"";}.fa-viadeo:before{content:"";}.fa-viadeo-square:before{content:"";}.fa-snapchat:before{content:"";}.fa-snapchat-ghost:before{content:"";}.fa-snapchat-square:before{content:"";}.fa-pied-piper:before{content:"";}.fa-first-order:before{content:"";}.fa-yoast:before{content:"";}.fa-themeisle:before{content:"";}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"";}.fa-fa:before,.fa-font-awesome:before{content:"";}.fa-handshake-o:before{content:"";}.fa-envelope-open:before{content:"";}.fa-envelope-open-o:before{content:"";}.fa-linode:before{content:"";}.fa-address-book:before{content:"";}.fa-address-book-o:before{content:"";}.fa-vcard:before,.fa-address-card:before{content:"";}.fa-vcard-o:before,.fa-address-card-o:before{content:"";}.fa-user-circle:before{content:"";}.fa-user-circle-o:before{content:"";}.fa-user-o:before{content:"";}.fa-id-badge:before{content:"";}.fa-drivers-license:before,.fa-id-card:before{content:"";}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"";}.fa-quora:before{content:"";}.fa-free-code-camp:before{content:"";}.fa-telegram:before{content:"";}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"";}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"";}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"";}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"";}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"";}.fa-shower:before{content:"";}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"";}.fa-podcast:before{content:"";}.fa-window-maximize:before{content:"";}.fa-window-minimize:before{content:"";}.fa-window-restore:before{content:"";}.fa-times-rectangle:before,.fa-window-close:before{content:"";}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"";}.fa-bandcamp:before{content:"";}.fa-grav:before{content:"";}.fa-etsy:before{content:"";}.fa-imdb:before{content:"";}.fa-ravelry:before{content:"";}.fa-eercast:before{content:"";}.fa-microchip:before{content:"";}.fa-snowflake-o:before{content:"";}.fa-superpowers:before{content:"";}.fa-wpexplorer:before{content:"";}.fa-meetup:before{content:"";}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0;}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto;}body{font-size:12px;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;margin:0;padding:0;color:#333;}body.layout{background:url(data:image/png;base64,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) left top repeat-x #d1d1d1;background:linear-gradient(to bottom,#f2f2f2 0,#d1d1d1 370px) left top repeat-x #d1d1d1;min-height:370px;}.page{max-width:1232px;min-width:768px;margin-left:auto;margin-right:auto;}header,#header{position:relative;background-color:#333;margin:0;padding:0;height:34px;}header #heading,#header #heading{float:left;height:34px;}header #heading i,#header #heading i{display:block;height:34px;width:34px;background-image:url(data:image/png;base64,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);}header nav,#header nav{float:left;height:34px;padding:0;margin:0;}header nav ul#menu,#header nav ul#menu{height:26px;padding:0;margin:8px 0 0 4px;list-style:none;z-index:100000;font-size:0;line-height:0;}header nav ul#menu>li,#header nav ul#menu>li{display:inline-block;z-index:100000;font-size:13.2px;line-height:19.2px;}header nav ul#menu>li.moveRight,#header nav ul#menu>li.moveRight{margin-left:20px;}header nav ul#menu>li>a,#header nav ul#menu>li>a{display:inline-block;padding:2px 10px 4px 10px;height:20px;color:#fff;font-weight:400;text-transform:uppercase;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.active>a,#header nav ul#menu>li.active>a{background-color:#222;}header nav ul#menu>li:hover>a,#header nav ul#menu>li:hover>a{background-color:#111;text-decoration:none;}header nav ul#menu>li>ul,#header nav ul#menu>li>ul{z-index:100000;display:none;list-style:none;position:absolute;margin:0;border-left:1px solid #d1d1d1;border-right:1px solid #d1d1d1;background-color:hsl(0,0%,95%);padding:0;min-width:180px;box-shadow:2px 2px 5px rgba(209,209,209,.5);}header nav ul#menu>li>ul li,#header nav ul#menu>li>ul li{position:relative;background-position:top;background-repeat:repeat-x;border-top:1px solid hsl(0,0%,90%);}header nav ul#menu>li>ul li:first-child,#header nav ul#menu>li>ul li:first-child{border-top:1px solid #d1d1d1;}header nav ul#menu>li>ul li:last-child,#header nav ul#menu>li>ul li:last-child{border-bottom:1px solid #d1d1d1;}header nav ul#menu>li>ul li:hover,#header nav ul#menu>li>ul li:hover{border-top:1px solid hsl(0,0%,85%);background-color:hsl(0,0%,90%);}header nav ul#menu>li>ul li a,#header nav ul#menu>li>ul li a{display:block;color:#000;padding:4px 8px;text-decoration:none;}header nav ul#menu>li>ul li a:hover,#header nav ul#menu>li>ul li a:hover{color:#335a87;text-decoration:none;}header nav ul#menu>li>ul li a:active,#header nav ul#menu>li>ul li a:active{text-decoration:none;}header nav ul#menu>li>ul li i.fa-caret-right,#header nav ul#menu>li>ul li i.fa-caret-right{cursor:pointer;color:#666;font-size:16px;position:absolute;display:block;right:12px;top:7px;}header nav ul#menu>li>ul li:hover i.fa-caret-right,#header nav ul#menu>li>ul li:hover i.fa-caret-right{color:#333;}header nav ul#menu>li>ul ul,#header nav ul#menu>li>ul ul{display:none;list-style:none;position:absolute;top:-1px;left:180px;background-color:hsl(0,0%,95%);border-left:1px solid #d1d1d1;border-right:1px solid #d1d1d1;padding:0;min-width:180px;box-shadow:2px 2px 5px rgba(209,209,209,.5);}header #headerMenu,#header #headerMenu{float:right;height:24px;padding:5px 8px;font-size:.9em;line-height:24px;text-align:right;color:#fff;}header #headerMenu a,#header #headerMenu a{color:#fff;text-decoration:none;}header #headerMenu a:hover,#header #headerMenu a:hover{color:#cddbec;text-decoration:none;}header #SearchQuery,#header #SearchQuery{font-size:.9em;margin-left:6px;width:130px;background-color:#eee;-moz-transition-property:width;-o-transition-property:width;-webkit-transition-property:width;transition-property:width;-moz-transition-duration:.1s;-o-transition-duration:.1s;-webkit-transition-duration:.1s;transition-duration:.1s;}header #SearchQuery:hover,#header #SearchQuery:hover,header #SearchQuery:focus,#header #SearchQuery:focus{background-color:#fff;width:190px;}header .watermark,#header .watermark{background-color:#888;}#QuickSearchMenu{max-height:400px;font-size:.9em;background:none;background-color:#fafafa;}#QuickSearchMenu li:not(:last-child){border-bottom:1px solid #d8d8d8;}#QuickSearchMenu li>a{padding:2px;}#QuickSearchMenu li>a>i{margin-right:2px;}#QuickSearchMenu li>a>div{padding-left:1.28571429em;margin-left:2px;}#layout_PageHeading{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAA8CAYAAABfESsNAAAAOUlEQVRIx+2SuREAIAzDFELL/uOSFVLx3Mm1C8nnABaNDJq5WJzAVkZGZXyPMg7+jUwCIeNZmdcZC2pxCZOpoRNgAAAAAElFTkSuQmCC) left top repeat-x #fff;background:linear-gradient(to bottom,#f2f2f2 0,#fff 50px) #fff;height:50px;padding:6px 20px 4px 20px;font-size:2em;color:#000;line-height:50px;position:relative;border-left:1px solid #d1d1d1;border-right:1px solid #d1d1d1;}#layout_PageHeading a{text-decoration:none;}#layout_PageHeading>a.button{position:absolute;right:30px;bottom:8px;font-size:.5em;line-height:1em;text-align:right;}#layout_Page{background-color:#fff;overflow:auto;border-left:1px solid #d1d1d1;border-right:1px solid #d1d1d1;border-bottom:1px solid #d1d1d1;padding:0 30px 15px 30px;-moz-border-radius:0 0 4px 4px;-webkit-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}#layout_Error{min-height:200px;}#layout_Error table{background-color:#fff;}#layout_Error h1,#layout_Error h2,#layout_Error h3,#layout_Error h4,#layout_Error h5{color:#fff;white-space:pre-wrap;}#layout_Error h2.error{margin-bottom:10px;}#layout_Error .stacktrace{white-space:pre;overflow:auto;}#layout_Error>div{margin:0 auto;width:650px;}#layout_uiExtensions{display:none;}footer,#footer{color:#777;padding:10px 0;text-align:center;margin:0;font-size:.9em;}footer a:link,#footer a:link,footer a:visited,#footer a:visited,footer a:active,#footer a:active{color:#777;}footer a:link,#footer a:link,footer a:active,#footer a:active{text-decoration:underline;}footer a:hover,#footer a:hover{color:#5e8cc2;text-decoration:none;}p{margin:0 0 2px 0;line-height:1.6em;}ul{margin:0;padding:0 0 0 25px;list-style:square;line-height:1.6em;}header,footer,nav,section{display:block;}form{display:inline;}img{border:0;padding:0;margin:0;vertical-align:bottom;}code{font-family:Consolas,"Courier New",monospace;}hr{border:0;border-bottom:1px dashed #aaa;margin-top:15px;}strong{font-weight:600;}a:link{color:#335a87;text-decoration:none;}a:visited{color:#335a87;}a:hover{color:#5e8cc2;text-decoration:underline;}a:active{color:#335a87;}a[disabled]{color:#6b6b6b;text-decoration:none;cursor:default;}a.button{display:inline-block;padding:4px 10px;margin:2px;border:1px solid #1a5f95;background:#1e6dab;color:#fff;font-weight:600;text-transform:uppercase;cursor:pointer;white-space:nowrap;text-decoration:none;}a.button[disabled],a.button.disabled{background:#9e9e9e;border:1px solid #6b6b6b;cursor:default;}a.button.alert{border-color:#900;background-color:#e51400;}a.button.small{padding:2px 5px;font-size:.9em;}a.button:hover{border:1px solid #6b6b6b;background:#9e9e9e;}a.button i{margin-right:10px;}div.actionBar{margin:0 -30px 0 -30px;padding:10px;border-top:1px solid #d1d1d1;text-align:right;background-color:#f2f2f2;clear:both;}div.actionBar:not(:first-child){margin-top:10px;}div.actionBar:last-child{margin-bottom:-15px;-moz-border-radius:0 0 6px 6px;-webkit-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;}h1,h2,h3,h4,h5,h6{color:#000;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-weight:lighter;font-stretch:condensed;margin:0;}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child,h6:first-child{margin-top:0!important;padding-top:0!important;}h1>a:link,h2>a:link,h3>a:link,h4>a:link,h5>a:link,h6>a:link{text-decoration:none;}h1{font-size:24px;}h2{font-size:20px;padding:8px 0 4px 0;}h3{font-size:18px;}h4{font-size:14px;}h5,h6{font-size:12px;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-stretch:normal;font-weight:600;}table{border:0;border-collapse:collapse;width:100%;}table td{padding:5px;margin:0;border:0;vertical-align:top;}table th{padding:5px;margin:0;text-align:left;font-weight:600;vertical-align:top;}table.none{border:0!important;}table.none tr,table.none td,table.none th{padding:0!important;margin:0!important;background:none!important;border:0!important;}table.genericData{border:solid 1px #f4f4f4;border-collapse:collapse;}table.genericData>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}table.genericData>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}table.genericData>thead>tr>th,table.genericData>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}table.genericData>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}table.genericData>tfoot>tr>th,table.genericData>tfoot>tr>td{background-color:#f4f4f4;}table.genericData td.id{text-align:center;}table.genericData td.id a{padding:0 6px;}.smallTable th,.smallTable td{font-size:.9em;}.dataTables_wrapper{position:relative;}.dataTables_wrapper>.a{position:absolute;margin-top:-24px;right:320px;opacity:.3;}.dataTables_wrapper .dataTables_filter{position:absolute;height:20px;margin-top:-20px;right:0;font-size:.9em;-moz-opacity:.3;opacity:.3;}.dataTables_wrapper .dataTables_filter input{font-size:.95em;padding:0;height:1.4em;width:150px;}.dataTables_wrapper .dataTables_length{position:absolute;height:20px;margin-top:-20px;right:200px;font-size:.9em;-moz-opacity:.3;opacity:.3;}.dataTables_wrapper .dataTables_length select{font-size:.95em;padding:0;height:1.4em;}.dataTables_wrapper .dataTables_processing{position:absolute;margin-top:30px;left:45%;}.dataTables_wrapper .dataTables_decommissioned{position:absolute;height:20px;margin-top:-20px;right:320px;font-size:.9em;-moz-opacity:.3;opacity:.3;}.dataTables_wrapper .dataTables_decommissioned input{font-size:.8em;padding:0;height:1.2em;}.dataTables_wrapper .dataTables_paginate{text-align:right;background-color:#f4f4f4;padding:2px 4px;font-size:.9em;}.dataTables_wrapper .dataTables_paginate a{cursor:pointer;padding:2px;margin:0 3px;color:#335a87;background-repeat:no-repeat;-moz-opacity:.3;opacity:.3;text-transform:uppercase;}.dataTables_wrapper .dataTables_paginate .first{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAKklEQVQI12NgQALGUe0SQPwfnY0iCcVwNjZJFAxT8J+QAvwmEHQDPl8AAAYqTAY6Jng6AAAAAElFTkSuQmCC);background-position:left center;padding-left:12px;}.dataTables_wrapper .dataTables_paginate .first.paginate_button_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAKklEQVQI12NgQAKxsbESQPwfnY0iCcVwNjZJFAxT8J+QAvwmEHQDPl8AAEm8TIFT3+fIAAAAAElFTkSuQmCC);}.dataTables_wrapper .dataTables_paginate .previous{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12NgwAGMo9olgPg/XkmsCpAlcSn4T0gBfhMIugFdEQCMVyg5CPiC8wAAAABJRU5ErkJggg==);background-position:left center;padding-left:12px;}.dataTables_wrapper .dataTables_paginate .previous.paginate_button_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12NgwAH6+vokgPg/XkmsCpAlcSn4T0gBfhMIugFdEQDzojUdMBAGjgAAAABJRU5ErkJggg==);}.dataTables_wrapper .dataTables_paginate .next{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12Mwjmr/D8QSDLgAVAFuRUgKsCtCU/CfIhPwugGnLwCZ1Cg5w6CPqwAAAABJRU5ErkJggg==);background-position:right center;padding-right:12px;}.dataTables_wrapper .dataTables_paginate .next.paginate_button_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12Po6+v7D8QSDLgAVAFuRUgKsCtCU/CfIhPwugGnLwDwPjUdLMfQ6AAAAABJRU5ErkJggg==);}.dataTables_wrapper .dataTables_paginate .last{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAK0lEQVQI12Mwjmr/D8QSDECAzIYDqCBYApmNTQE6liCk4D/JJuB1A05fAABJ/EwGJKVDGAAAAABJRU5ErkJggg==);background-position:right center;padding-right:12px;}.dataTables_wrapper .dataTables_paginate .last.paginate_button_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAK0lEQVQI12OIjY39D8QSDECAzIYDqCBYApmNTQE6liCk4D/JJuB1A05fAACQykyB48rZCQAAAABJRU5ErkJggg==);}.dataTables_wrapper .dataTables_paginate .paginate_active{font-weight:600;color:#1e6dab;}.dataTables_wrapper .dataTables_paginate .paginate_button_disabled{color:#ccc;cursor:default;}.dataTables_wrapper .dataTables_paginate .paginate_enabled_previous{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12NgwAGMo9olgPg/XkmsCpAlcSn4T0gBfhMIugFdEQCMVyg5CPiC8wAAAABJRU5ErkJggg==);background-position:left center;padding-left:12px;}.dataTables_wrapper .dataTables_paginate .paginate_disabled_previous{color:#ccc;cursor:default;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12NgwAH6+vokgPg/XkmsCpAlcSn4T0gBfhMIugFdEQDzojUdMBAGjgAAAABJRU5ErkJggg==);background-position:left center;padding-left:12px;}.dataTables_wrapper .dataTables_paginate .paginate_enabled_next{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12Mwjmr/D8QSDLgAVAFuRUgKsCtCU/CfIhPwugGnLwCZ1Cg5w6CPqwAAAABJRU5ErkJggg==);background-position:right center;padding-right:12px;}.dataTables_wrapper .dataTables_paginate .paginate_disabled_next{color:#ccc;cursor:default;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12Po6+v7D8QSDLgAVAFuRUgKsCtCU/CfIhPwugGnLwDwPjUdLMfQ6AAAAABJRU5ErkJggg==);background-position:right center;padding-right:12px;}.dataTables_wrapper:hover .dataTables_filter,.dataTables_wrapper:hover .dataTables_length,.dataTables_wrapper:hover .dataTables_paginate a,.dataTables_wrapper:hover .dataTables_decommissioned{-moz-opacity:1;opacity:1;}.dataTables_wrapper table>thead tr>th{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAD6CAYAAACoLMeFAAAAdElEQVRo3u3bOwqAMBAFwBwjh/CUluKRhfVTiil0UYjMwJLqLfmUYUuBtw3jUreKfc2E43aTi/C9Jo3wUR4WAAAAAAAAejBPc90q9jUTjkdNTuGjPj9/bgfpO0i/AgAAAAAAAPQnPZ6YHpBsNEnNefrt4+9Wmn6nW/cZ1MQAAAAASUVORK5CYII=);background-repeat:no-repeat;}.dataTables_wrapper table>thead tr>th.sorting{background-position:right center;cursor:pointer;}.dataTables_wrapper table>thead tr>th.sorting_desc{background-position:right bottom;cursor:pointer;}.dataTables_wrapper table>thead tr>th.sorting_asc{background-position:right top;cursor:pointer;}.dataTables_wrapper table>thead tr>th.sorting_disabled{background-image:none;}table.userTable div.flags{display:inline-block;float:right;}table.userTable div.flags>i{cursor:default;}table.userTable div.flags>i>.details{display:none;}.jobStatus{color:#333;}.jobStatus.Closed{color:#9e9e9e;}.jobStatus.Open{color:#60a917;}.jobStatus.AwaitingWarrantyRepair,.jobStatus.AwaitingRepairs{color:#1e6dab;}.jobStatus.AwaitingDeviceReturn,.jobStatus.AwaitingUserAction,.jobStatus.AwaitingAccountingPayment,.jobStatus.AwaitingAccountingCharge{color:#f0a30a;}.jobStatus.AwaitingInsuranceProcessing{color:#6a00ff;}.deviceStatus{color:#333;}.deviceStatus.Decommissioned{color:#9e9e9e;}.deviceStatus.Active{color:#60a917;}.deviceStatus.NotEnrolled{color:#f0a30a;}table.jobTable{border:solid 1px #f4f4f4;border-collapse:collapse;table-layout:fixed;}table.jobTable>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}table.jobTable>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}table.jobTable>thead>tr>th,table.jobTable>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}table.jobTable>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}table.jobTable>tfoot>tr>th,table.jobTable>tfoot>tr>td{background-color:#f4f4f4;}table.jobTable td{white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;}table.jobTable.hideStatusClosed tr[data-status=Closed]{display:none;}table.jobTable td.id,table.jobTable th.id{width:50px;text-align:center;}table.jobTable td.id a,table.jobTable th.id a{padding:0 6px;}table.jobTable tr.statusSlaWarning td{background-color:#fdeed1;}table.jobTable tr.statusSlaWarning td:not(:last-child){border-right:1px solid #f8e9cb;}table.jobTable tr.statusSlaExpired td{background-color:#ffd7d3;}table.jobTable tr.statusSlaExpired td:not(:last-child){border-right:1px solid #fad2ce;}table.jobTable tr:nth-child(odd).statusSlaWarning td{background-color:#fbeccf!important;}table.jobTable tr:nth-child(odd).statusSlaExpired td{background-color:#fdd5d1!important;}table.jobTable tr:hover.statusSlaWarning td{background-color:#fbeaca!important;}table.jobTable tr:hover.statusSlaExpired td{background-color:#fdd1cd!important;}table.jobTable div.queues{display:inline-block;float:right;}table.jobTable td.lastActive,table.jobTable th.lastActive{width:130px;}table.jobTable td.dates,table.jobTable th.dates{width:130px;}table.jobTable td.type,table.jobTable th.type{width:50px;}table.jobTable td.device,table.jobTable th.device{width:110px;}table.jobTable td.user,table.jobTable th.user{width:240px;}table.jobTable td.technician,table.jobTable th.technician{width:80px;}table.jobTable td.location,table.jobTable th.location{width:200px;}div.jobTable>a.dataTables_showStatusClosed{margin:10px 5px;}div.jobTable>h3,div.jobTable>div.allClosed_container{margin:50px 20px!important;}div.jobTable>h3 a.button,div.jobTable>div.allClosed_container a.button{margin-top:10px;}table.deviceTable tr.decommissioned{background-color:#ededed;}table.deviceTable.hideDecommissioned tr.decommissioned{display:none;}textarea{font-size:12px;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;border:1px solid #ccc;min-height:75px;padding:2px;color:#444;width:200px;}input[type="text"],input[type="password"],input[type="file"],input[type="number"]{font-size:12px;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;border:1px solid #ccc;padding:2px;color:#444;width:200px;}input[type="text"].small,input[type="password"].small,input[type="file"].small,input[type="number"].small{padding:0 2px;width:150px;}input[type="text"].discreet,input[type="password"].discreet,input[type="file"].discreet,input[type="number"].discreet{border:1px solid #fff;}input[type="text"].discreet:hover,input[type="password"].discreet:hover,input[type="file"].discreet:hover,input[type="number"].discreet:hover,input[type="text"].discreet:focus,input[type="password"].discreet:focus,input[type="file"].discreet:focus,input[type="number"].discreet:focus{border:1px solid #ccc;}input[type="checkbox"],input[type="radio"]{margin-right:4px;vertical-align:sub;}select{font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-size:12px;border:1px solid #ccc;padding:2px;color:#444;}select.small{padding:0;}input[type="submit"],button{font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;padding:5px;}input[type="submit"].button,button.button{font-size:12px;padding:4px 10px 4px 10px;margin:2px;border:1px solid #1a5f95;background:#1e6dab;color:#fff;font-weight:600;text-transform:uppercase;cursor:pointer;}input[type="submit"].button.alert,button.button.alert{border-color:#900;background-color:#e51400;}input[type="submit"].button.small,button.button.small{padding:2px 5px;font-size:.9em;}input[type="submit"].button[disabled],button.button[disabled]{background:#9e9e9e;border:1px solid #6b6b6b;cursor:default;}input[type="submit"].button:hover,button.button:hover{border:1px solid #6b6b6b;background:#9e9e9e;}ul.none,ol.none{list-style:none;margin:0;padding:0;}ul.none li,ol.none li{margin:0;}div.form{margin:0 auto;}div.form>p.actions{text-align:right;}div.form>table{border-top:6px solid #1e6dab;border-left:1px solid #1e6dab;border-right:1px solid #1e6dab;border-bottom:3px solid #1e6dab;background-color:#fff;}div.form>table>tbody>tr>td,div.form>table>tbody>tr>th{background:none;border:0;margin:0;padding:8px 5px;}div.form>table>tbody>tr>th{font-weight:normal;text-align:right;}div.form>table>tbody>tr:nth-child(odd){background-color:#f2f2f2;margin:0;padding:0;}div.form>table>tbody>tr>td.details{padding:0;}div.form>table>tbody>tr>th.name{width:150px;text-align:right;}div.form>table table.sub>tbody>tr:not(:first-child)>th,div.form>table table.sub>tbody>tr:not(:first-child)>td{border-top:1px dashed #aaa;}div.form>table table.sub>tbody>tr>th{font-weight:normal;text-align:right;}div.form>table table.sub>tbody>tr>th.name{text-align:right;}#pageMenu td{border-right:1px dashed #aaa;width:33%;padding:10px;}#pageMenu td .pageMenuArea>.fa{font-size:1.3em;color:#6b6b6b;margin-right:4px;}#pageMenu td .pageMenuArea>a,#pageMenu td .pageMenuArea>h3{text-decoration:none;font-size:1.2em;}#pageMenu td .pageMenuArea .pageMenuBlurb{font-size:.9em;color:#888;margin-bottom:10px;}#pageMenu td .pageMenuArea .pageMenuBlurb a{text-decoration:none;}#pageMenu td .pageMenuArea:not(:last-child){border-bottom:1px dashed #aaa;}#pageMenu td .pageMenuArea.noSeperator{border-bottom:0;}#pageMenu td:first-child{padding-left:0;}#pageMenu td:last-child{border-right:0;padding-right:0;}div.info-box{margin:.4em 0;padding:.4em;border:1px solid #fff397;background-color:#fffef7;}div.info-box i{color:#1e6dab;}div.info-box.alert{border:1px solid #fa6800;background-color:#fff9f5;color:#333;}div.info-box.alert i{color:#fa6800;}div.info-box.error{border:1px solid #e51400;background-color:#fffaf9;color:#e51400;}div.info-box.error i{color:#e51400;}div.info-box p{line-height:1.2em;}p.fa-p{text-indent:-1.48em;margin-left:1.48em;}p.fa-p>i:first-child{text-indent:0;width:1.28em;margin-right:.2em;}div.Disco-AttachmentUpload-DropTarget{display:none;}div.Disco-AttachmentUpload-DropTarget.dragHighlight{display:block;position:absolute;z-index:1000;top:0;left:0;width:calc(100% - 6px);height:calc(100% - 6px);background-color:rgba(251,218,152,.5);border:3px dashed #f0a30a;}div.Disco-AttachmentUpload-DropTarget.dragHighlight h2{margin-top:3em!important;color:#2c1e02;text-align:center;font-weight:600;}div.Disco-AttachmentUpload-DropTarget.dragHighlight.dragHover{background-color:rgba(173,235,110,.5);border:3px dashed #60a917;}div.Disco-AttachmentUpload-DropTarget.dragHighlight.dragHover h2{color:#000;}div.Disco-AttachmentUpload-Progress{position:absolute;right:0;bottom:48px;}div.Disco-AttachmentUpload-Progress>div{background-color:#fafafa;padding:4px 8px;}div.Disco-AttachmentUpload-Progress>div i{color:#1e6dab;margin-right:4px;}div.Disco-AttachmentUpload-CommentDialog{padding:.25em .5em!important;}div.Disco-AttachmentUpload-CommentDialog table{border:solid 1px #f4f4f4;border-collapse:collapse;table-layout:fixed;}div.Disco-AttachmentUpload-CommentDialog table>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}div.Disco-AttachmentUpload-CommentDialog table>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}div.Disco-AttachmentUpload-CommentDialog table>thead>tr>th,div.Disco-AttachmentUpload-CommentDialog table>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}div.Disco-AttachmentUpload-CommentDialog table>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}div.Disco-AttachmentUpload-CommentDialog table>tfoot>tr>th,div.Disco-AttachmentUpload-CommentDialog table>tfoot>tr>td{background-color:#f4f4f4;}div.Disco-AttachmentUpload-CommentDialog table th{width:80px;}div.Disco-AttachmentUpload-CommentDialog table td.filename{font-family:Consolas,"Courier New",monospace;white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;}div.Disco-AttachmentUpload-CommentDialog table input.comments{width:calc(100% - 5px);}div.Disco-AttachmentUpload-CommentDialog table td.thumbnail{display:none;text-align:center;}div.Disco-AttachmentUpload-CommentDialog table td.thumbnail img{border:1px solid #9e9e9e;max-height:250px;max-width:374px;}div.Disco-AttachmentUpload-ImageDialog{background-color:#000!important;padding:0!important;}body>.User_FlagAssignment_Tooltip span.name{display:block;font-weight:600;}body>.User_FlagAssignment_Tooltip span.comments{display:block;padding:2px 0 2px 4px;}body>.User_FlagAssignment_Tooltip span.added{font-style:italic;font-size:.9em;}#Document_Generation_Container #Document_Generate{padding:0;}.d-priority-high{color:#fa6800;width:1.28571429em;text-align:center;}.d-priority-high:before{content:"";}.d-priority-normal{color:#60a917;width:1.28571429em;text-align:center;}.d-priority-normal:before{content:"";}.d-priority-low{color:#1e6dab;width:1.28571429em;text-align:center;}.d-priority-low:before{content:"";}.fa-stack .d-priority-high,.fa-stack .d-priority-normal,.fa-stack .d-priority-low{width:100%;font-size:.8em;margin-left:.5em;margin-top:.4em;opacity:.6;}.d-lime{color:#a4c400;}.d-green{color:#60a917;}.d-emerald{color:#008a00;}.d-teal{color:#00aba9;}.d-cyan{color:#1ba1e2;}.d-cobalt{color:#0050ef;}.d-indigo{color:#6a00ff;}.d-violet{color:#a0f;}.d-pink{color:#f472d0;}.d-magenta{color:#d80073;}.d-crimson{color:#a20025;}.d-red{color:#e51400;}.d-orange{color:#fa6800;}.d-amber{color:#f0a30a;}.d-yellow{color:#e3c800;}.d-brown{color:#825a2c;}.d-olive{color:#6d8764;}.d-steel{color:#647689;}.d-mauve{color:#76608a;}.d-sienna{color:#a0522d;}table.subtleHighlight{border:1px solid #ccc;background-color:#ededed;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}td.subtleHighlight{border:1px solid #ccc;background-color:#ededed;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.field-validation-error{color:#e51400!important;}.field-validation-valid{display:none;}.input-validation-error{border:1px solid #e51400!important;background-color:#fff7f7!important;}.validation-summary-errors{font-weight:bold!important;color:#e51400!important;}.validation-summary-valid{display:none;}.ajaxLoading{height:11px;width:16px;display:inline-block;background-repeat:no-repeat;background-image:url(data:image/gif;base64,R0lGODlhEAALAPQAAP///zNah+Hm7dng6O7x9DddiTNah1d3nJqtw3+Xs8fS3k5vlm6JqaGzx4KatcrU4FFymDZciHGMq+ru8t/l7Pb3+V9+oeLo7vT2+MTP3LLB0dTc5fHz9gAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCwAAACwAAAAAEAALAAAFLSAgjmRpnqSgCuLKAq5AEIM4zDVw03ve27ifDgfkEYe04kDIDC5zrtYKRa2WQgAh+QQJCwAAACwAAAAAEAALAAAFJGBhGAVgnqhpHIeRvsDawqns0qeN5+y967tYLyicBYE7EYkYAgAh+QQJCwAAACwAAAAAEAALAAAFNiAgjothLOOIJAkiGgxjpGKiKMkbz7SN6zIawJcDwIK9W/HISxGBzdHTuBNOmcJVCyoUlk7CEAAh+QQJCwAAACwAAAAAEAALAAAFNSAgjqQIRRFUAo3jNGIkSdHqPI8Tz3V55zuaDacDyIQ+YrBH+hWPzJFzOQQaeavWi7oqnVIhACH5BAkLAAAALAAAAAAQAAsAAAUyICCOZGme1rJY5kRRk7hI0mJSVUXJtF3iOl7tltsBZsNfUegjAY3I5sgFY55KqdX1GgIAIfkECQsAAAAsAAAAABAACwAABTcgII5kaZ4kcV2EqLJipmnZhWGXaOOitm2aXQ4g7P2Ct2ER4AMul00kj5g0Al8tADY2y6C+4FIIACH5BAkLAAAALAAAAAAQAAsAAAUvICCOZGme5ERRk6iy7qpyHCVStA3gNa/7txxwlwv2isSacYUc+l4tADQGQ1mvpBAAIfkECQsAAAAsAAAAABAACwAABS8gII5kaZ7kRFGTqLLuqnIcJVK0DeA1r/u3HHCXC/aKxJpxhRz6Xi0ANAZDWa+kEAA7AAAAAAAAAAAA);margin-bottom:0;}.ajaxOk{color:#60a917;}.ajaxSave{color:#1e6dab;cursor:pointer;}.ajaxRemove{color:#e51400;cursor:pointer;opacity:.8;}.ajaxRemove:hover{opacity:1;}#layout_Page div.hiddenDialog{display:none;}* html .clearfix{height:1%;overflow:visible;}*+html .clearfix{min-height:1%;}.clearfix:after{clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0;}div.columnHost .column50{float:left;width:50%;}.hidden{display:none;}.success{color:#60a917;}.information{color:#1e6dab;}.warning{color:#f0a30a;}.error{color:#e51400;}.alert{color:#fa6800;}.smallText{font-size:.9em;}.smallMessage{font-style:italic;color:#666;font-size:.9em;}.nowrap{white-space:nowrap;}.code{font-family:Consolas,"Courier New",monospace;}div.code{border:1px dashed #bbb;background-color:#fff;margin:3px 6px;padding:4px;font-size:.9em;}a.smallLink{font-size:.9em;}textarea.block{width:250px;height:100px;}.checkboxBulkSelectContainer{margin-top:6px;font-size:.8em;}.checkboxBulkSelectContainer a{text-decoration:none;}.ui-widget .checkboxBulkSelectContainer{font-size:1em;}#licence{text-align:justify;}#licence p{font-size:.9em;line-height:1.6em;margin-bottom:1em;}#licence li{font-size:.9em;}#Document_Generation_Dialog{height:490px;}#Document_Generation_Dialog .handlerPicker{position:absolute;width:170px;height:390px;overflow-y:auto;background-color:#fcfcfc;border:1px solid #ccc;}#Document_Generation_Dialog .handlerPicker>div{background-color:#fff;border-bottom:1px solid #ddd;padding:6px 0 6px 6px;cursor:pointer;}#Document_Generation_Dialog .handlerPicker>div:hover{background-color:#f4f4f4;}#Document_Generation_Dialog .handlerPicker>div.selected,#Document_Generation_Dialog .handlerPicker>div.selected:hover{background-color:#eee;}#Document_Generation_Dialog .handlerPicker #Document_Generation_Dialog_Handlers_Loading{text-align:center;}#Document_Generation_Dialog .details{position:absolute;left:200px;height:390px;width:540px;overflow-y:auto;}#Document_Generation_Dialog .details #Document_Generation_Dialog_Download_Container{text-align:center;padding-top:3em;}#Document_Generation_Dialog .details #Document_Generation_Dialog_HandlerUI{display:none;}ul.list-group{background-color:#fff;border:1px solid #ddd;margin:0;padding:0;list-style:none;}ul.list-group li{padding:6px 0 6px 6px;cursor:pointer;}ul.list-group li:hover{background-color:#f4f4f4;}ul.list-group li.selected,ul.list-group li.selected:hover{background-color:#eee;}ul.list-group li:not(:first-child){border-top:1px solid #ddd;}.whitespace-pre-wrap{white-space:pre-wrap;} \ No newline at end of file +@font-face{font-family:'FontAwesome';src:url('/ClientSource/Style/FontAwesome/fontawesome-webfont.eot?v=4.7.0');src:url('/ClientSource/Style/FontAwesome/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('/ClientSource/Style/FontAwesome/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('/ClientSource/Style/FontAwesome/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('/ClientSource/Style/FontAwesome/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('/ClientSource/Style/FontAwesome/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal;}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%;}.fa-2x{font-size:2em;}.fa-3x{font-size:3em;}.fa-4x{font-size:4em;}.fa-5x{font-size:5em;}.fa-fw{width:1.28571429em;text-align:center;}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none;}.fa-ul>li{position:relative;}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center;}.fa-li.fa-lg{left:-1.85714286em;}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em;}.fa-pull-left{float:left;}.fa-pull-right{float:right;}.fa.fa-pull-left{margin-right:.3em;}.fa.fa-pull-right{margin-left:.3em;}.pull-right{float:right;}.pull-left{float:left;}.fa.pull-left{margin-right:.3em;}.fa.pull-right{margin-left:.3em;}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear;}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8);}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg);}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg);}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg);}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1);}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1);}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none;}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle;}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center;}.fa-stack-1x{line-height:inherit;}.fa-stack-2x{font-size:2em;}.fa-inverse{color:#fff;}.fa-glass:before{content:"";}.fa-music:before{content:"";}.fa-search:before{content:"";}.fa-envelope-o:before{content:"";}.fa-heart:before{content:"";}.fa-star:before{content:"";}.fa-star-o:before{content:"";}.fa-user:before{content:"";}.fa-film:before{content:"";}.fa-th-large:before{content:"";}.fa-th:before{content:"";}.fa-th-list:before{content:"";}.fa-check:before{content:"";}.fa-remove:before,.fa-close:before,.fa-times:before{content:"";}.fa-search-plus:before{content:"";}.fa-search-minus:before{content:"";}.fa-power-off:before{content:"";}.fa-signal:before{content:"";}.fa-gear:before,.fa-cog:before{content:"";}.fa-trash-o:before{content:"";}.fa-home:before{content:"";}.fa-file-o:before{content:"";}.fa-clock-o:before{content:"";}.fa-road:before{content:"";}.fa-download:before{content:"";}.fa-arrow-circle-o-down:before{content:"";}.fa-arrow-circle-o-up:before{content:"";}.fa-inbox:before{content:"";}.fa-play-circle-o:before{content:"";}.fa-rotate-right:before,.fa-repeat:before{content:"";}.fa-refresh:before{content:"";}.fa-list-alt:before{content:"";}.fa-lock:before{content:"";}.fa-flag:before{content:"";}.fa-headphones:before{content:"";}.fa-volume-off:before{content:"";}.fa-volume-down:before{content:"";}.fa-volume-up:before{content:"";}.fa-qrcode:before{content:"";}.fa-barcode:before{content:"";}.fa-tag:before{content:"";}.fa-tags:before{content:"";}.fa-book:before{content:"";}.fa-bookmark:before{content:"";}.fa-print:before{content:"";}.fa-camera:before{content:"";}.fa-font:before{content:"";}.fa-bold:before{content:"";}.fa-italic:before{content:"";}.fa-text-height:before{content:"";}.fa-text-width:before{content:"";}.fa-align-left:before{content:"";}.fa-align-center:before{content:"";}.fa-align-right:before{content:"";}.fa-align-justify:before{content:"";}.fa-list:before{content:"";}.fa-dedent:before,.fa-outdent:before{content:"";}.fa-indent:before{content:"";}.fa-video-camera:before{content:"";}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"";}.fa-pencil:before{content:"";}.fa-map-marker:before{content:"";}.fa-adjust:before{content:"";}.fa-tint:before{content:"";}.fa-edit:before,.fa-pencil-square-o:before{content:"";}.fa-share-square-o:before{content:"";}.fa-check-square-o:before{content:"";}.fa-arrows:before{content:"";}.fa-step-backward:before{content:"";}.fa-fast-backward:before{content:"";}.fa-backward:before{content:"";}.fa-play:before{content:"";}.fa-pause:before{content:"";}.fa-stop:before{content:"";}.fa-forward:before{content:"";}.fa-fast-forward:before{content:"";}.fa-step-forward:before{content:"";}.fa-eject:before{content:"";}.fa-chevron-left:before{content:"";}.fa-chevron-right:before{content:"";}.fa-plus-circle:before{content:"";}.fa-minus-circle:before{content:"";}.fa-times-circle:before{content:"";}.fa-check-circle:before{content:"";}.fa-question-circle:before{content:"";}.fa-info-circle:before{content:"";}.fa-crosshairs:before{content:"";}.fa-times-circle-o:before{content:"";}.fa-check-circle-o:before{content:"";}.fa-ban:before{content:"";}.fa-arrow-left:before{content:"";}.fa-arrow-right:before{content:"";}.fa-arrow-up:before{content:"";}.fa-arrow-down:before{content:"";}.fa-mail-forward:before,.fa-share:before{content:"";}.fa-expand:before{content:"";}.fa-compress:before{content:"";}.fa-plus:before{content:"";}.fa-minus:before{content:"";}.fa-asterisk:before{content:"";}.fa-exclamation-circle:before{content:"";}.fa-gift:before{content:"";}.fa-leaf:before{content:"";}.fa-fire:before{content:"";}.fa-eye:before{content:"";}.fa-eye-slash:before{content:"";}.fa-warning:before,.fa-exclamation-triangle:before{content:"";}.fa-plane:before{content:"";}.fa-calendar:before{content:"";}.fa-random:before{content:"";}.fa-comment:before{content:"";}.fa-magnet:before{content:"";}.fa-chevron-up:before{content:"";}.fa-chevron-down:before{content:"";}.fa-retweet:before{content:"";}.fa-shopping-cart:before{content:"";}.fa-folder:before{content:"";}.fa-folder-open:before{content:"";}.fa-arrows-v:before{content:"";}.fa-arrows-h:before{content:"";}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"";}.fa-twitter-square:before{content:"";}.fa-facebook-square:before{content:"";}.fa-camera-retro:before{content:"";}.fa-key:before{content:"";}.fa-gears:before,.fa-cogs:before{content:"";}.fa-comments:before{content:"";}.fa-thumbs-o-up:before{content:"";}.fa-thumbs-o-down:before{content:"";}.fa-star-half:before{content:"";}.fa-heart-o:before{content:"";}.fa-sign-out:before{content:"";}.fa-linkedin-square:before{content:"";}.fa-thumb-tack:before{content:"";}.fa-external-link:before{content:"";}.fa-sign-in:before{content:"";}.fa-trophy:before{content:"";}.fa-github-square:before{content:"";}.fa-upload:before{content:"";}.fa-lemon-o:before{content:"";}.fa-phone:before{content:"";}.fa-square-o:before{content:"";}.fa-bookmark-o:before{content:"";}.fa-phone-square:before{content:"";}.fa-twitter:before{content:"";}.fa-facebook-f:before,.fa-facebook:before{content:"";}.fa-github:before{content:"";}.fa-unlock:before{content:"";}.fa-credit-card:before{content:"";}.fa-feed:before,.fa-rss:before{content:"";}.fa-hdd-o:before{content:"";}.fa-bullhorn:before{content:"";}.fa-bell:before{content:"";}.fa-certificate:before{content:"";}.fa-hand-o-right:before{content:"";}.fa-hand-o-left:before{content:"";}.fa-hand-o-up:before{content:"";}.fa-hand-o-down:before{content:"";}.fa-arrow-circle-left:before{content:"";}.fa-arrow-circle-right:before{content:"";}.fa-arrow-circle-up:before{content:"";}.fa-arrow-circle-down:before{content:"";}.fa-globe:before{content:"";}.fa-wrench:before{content:"";}.fa-tasks:before{content:"";}.fa-filter:before{content:"";}.fa-briefcase:before{content:"";}.fa-arrows-alt:before{content:"";}.fa-group:before,.fa-users:before{content:"";}.fa-chain:before,.fa-link:before{content:"";}.fa-cloud:before{content:"";}.fa-flask:before{content:"";}.fa-cut:before,.fa-scissors:before{content:"";}.fa-copy:before,.fa-files-o:before{content:"";}.fa-paperclip:before{content:"";}.fa-save:before,.fa-floppy-o:before{content:"";}.fa-square:before{content:"";}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"";}.fa-list-ul:before{content:"";}.fa-list-ol:before{content:"";}.fa-strikethrough:before{content:"";}.fa-underline:before{content:"";}.fa-table:before{content:"";}.fa-magic:before{content:"";}.fa-truck:before{content:"";}.fa-pinterest:before{content:"";}.fa-pinterest-square:before{content:"";}.fa-google-plus-square:before{content:"";}.fa-google-plus:before{content:"";}.fa-money:before{content:"";}.fa-caret-down:before{content:"";}.fa-caret-up:before{content:"";}.fa-caret-left:before{content:"";}.fa-caret-right:before{content:"";}.fa-columns:before{content:"";}.fa-unsorted:before,.fa-sort:before{content:"";}.fa-sort-down:before,.fa-sort-desc:before{content:"";}.fa-sort-up:before,.fa-sort-asc:before{content:"";}.fa-envelope:before{content:"";}.fa-linkedin:before{content:"";}.fa-rotate-left:before,.fa-undo:before{content:"";}.fa-legal:before,.fa-gavel:before{content:"";}.fa-dashboard:before,.fa-tachometer:before{content:"";}.fa-comment-o:before{content:"";}.fa-comments-o:before{content:"";}.fa-flash:before,.fa-bolt:before{content:"";}.fa-sitemap:before{content:"";}.fa-umbrella:before{content:"";}.fa-paste:before,.fa-clipboard:before{content:"";}.fa-lightbulb-o:before{content:"";}.fa-exchange:before{content:"";}.fa-cloud-download:before{content:"";}.fa-cloud-upload:before{content:"";}.fa-user-md:before{content:"";}.fa-stethoscope:before{content:"";}.fa-suitcase:before{content:"";}.fa-bell-o:before{content:"";}.fa-coffee:before{content:"";}.fa-cutlery:before{content:"";}.fa-file-text-o:before{content:"";}.fa-building-o:before{content:"";}.fa-hospital-o:before{content:"";}.fa-ambulance:before{content:"";}.fa-medkit:before{content:"";}.fa-fighter-jet:before{content:"";}.fa-beer:before{content:"";}.fa-h-square:before{content:"";}.fa-plus-square:before{content:"";}.fa-angle-double-left:before{content:"";}.fa-angle-double-right:before{content:"";}.fa-angle-double-up:before{content:"";}.fa-angle-double-down:before{content:"";}.fa-angle-left:before{content:"";}.fa-angle-right:before{content:"";}.fa-angle-up:before{content:"";}.fa-angle-down:before{content:"";}.fa-desktop:before{content:"";}.fa-laptop:before{content:"";}.fa-tablet:before{content:"";}.fa-mobile-phone:before,.fa-mobile:before{content:"";}.fa-circle-o:before{content:"";}.fa-quote-left:before{content:"";}.fa-quote-right:before{content:"";}.fa-spinner:before{content:"";}.fa-circle:before{content:"";}.fa-mail-reply:before,.fa-reply:before{content:"";}.fa-github-alt:before{content:"";}.fa-folder-o:before{content:"";}.fa-folder-open-o:before{content:"";}.fa-smile-o:before{content:"";}.fa-frown-o:before{content:"";}.fa-meh-o:before{content:"";}.fa-gamepad:before{content:"";}.fa-keyboard-o:before{content:"";}.fa-flag-o:before{content:"";}.fa-flag-checkered:before{content:"";}.fa-terminal:before{content:"";}.fa-code:before{content:"";}.fa-mail-reply-all:before,.fa-reply-all:before{content:"";}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"";}.fa-location-arrow:before{content:"";}.fa-crop:before{content:"";}.fa-code-fork:before{content:"";}.fa-unlink:before,.fa-chain-broken:before{content:"";}.fa-question:before{content:"";}.fa-info:before{content:"";}.fa-exclamation:before{content:"";}.fa-superscript:before{content:"";}.fa-subscript:before{content:"";}.fa-eraser:before{content:"";}.fa-puzzle-piece:before{content:"";}.fa-microphone:before{content:"";}.fa-microphone-slash:before{content:"";}.fa-shield:before{content:"";}.fa-calendar-o:before{content:"";}.fa-fire-extinguisher:before{content:"";}.fa-rocket:before{content:"";}.fa-maxcdn:before{content:"";}.fa-chevron-circle-left:before{content:"";}.fa-chevron-circle-right:before{content:"";}.fa-chevron-circle-up:before{content:"";}.fa-chevron-circle-down:before{content:"";}.fa-html5:before{content:"";}.fa-css3:before{content:"";}.fa-anchor:before{content:"";}.fa-unlock-alt:before{content:"";}.fa-bullseye:before{content:"";}.fa-ellipsis-h:before{content:"";}.fa-ellipsis-v:before{content:"";}.fa-rss-square:before{content:"";}.fa-play-circle:before{content:"";}.fa-ticket:before{content:"";}.fa-minus-square:before{content:"";}.fa-minus-square-o:before{content:"";}.fa-level-up:before{content:"";}.fa-level-down:before{content:"";}.fa-check-square:before{content:"";}.fa-pencil-square:before{content:"";}.fa-external-link-square:before{content:"";}.fa-share-square:before{content:"";}.fa-compass:before{content:"";}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"";}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"";}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"";}.fa-euro:before,.fa-eur:before{content:"";}.fa-gbp:before{content:"";}.fa-dollar:before,.fa-usd:before{content:"";}.fa-rupee:before,.fa-inr:before{content:"";}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"";}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"";}.fa-won:before,.fa-krw:before{content:"";}.fa-bitcoin:before,.fa-btc:before{content:"";}.fa-file:before{content:"";}.fa-file-text:before{content:"";}.fa-sort-alpha-asc:before{content:"";}.fa-sort-alpha-desc:before{content:"";}.fa-sort-amount-asc:before{content:"";}.fa-sort-amount-desc:before{content:"";}.fa-sort-numeric-asc:before{content:"";}.fa-sort-numeric-desc:before{content:"";}.fa-thumbs-up:before{content:"";}.fa-thumbs-down:before{content:"";}.fa-youtube-square:before{content:"";}.fa-youtube:before{content:"";}.fa-xing:before{content:"";}.fa-xing-square:before{content:"";}.fa-youtube-play:before{content:"";}.fa-dropbox:before{content:"";}.fa-stack-overflow:before{content:"";}.fa-instagram:before{content:"";}.fa-flickr:before{content:"";}.fa-adn:before{content:"";}.fa-bitbucket:before{content:"";}.fa-bitbucket-square:before{content:"";}.fa-tumblr:before{content:"";}.fa-tumblr-square:before{content:"";}.fa-long-arrow-down:before{content:"";}.fa-long-arrow-up:before{content:"";}.fa-long-arrow-left:before{content:"";}.fa-long-arrow-right:before{content:"";}.fa-apple:before{content:"";}.fa-windows:before{content:"";}.fa-android:before{content:"";}.fa-linux:before{content:"";}.fa-dribbble:before{content:"";}.fa-skype:before{content:"";}.fa-foursquare:before{content:"";}.fa-trello:before{content:"";}.fa-female:before{content:"";}.fa-male:before{content:"";}.fa-gittip:before,.fa-gratipay:before{content:"";}.fa-sun-o:before{content:"";}.fa-moon-o:before{content:"";}.fa-archive:before{content:"";}.fa-bug:before{content:"";}.fa-vk:before{content:"";}.fa-weibo:before{content:"";}.fa-renren:before{content:"";}.fa-pagelines:before{content:"";}.fa-stack-exchange:before{content:"";}.fa-arrow-circle-o-right:before{content:"";}.fa-arrow-circle-o-left:before{content:"";}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"";}.fa-dot-circle-o:before{content:"";}.fa-wheelchair:before{content:"";}.fa-vimeo-square:before{content:"";}.fa-turkish-lira:before,.fa-try:before{content:"";}.fa-plus-square-o:before{content:"";}.fa-space-shuttle:before{content:"";}.fa-slack:before{content:"";}.fa-envelope-square:before{content:"";}.fa-wordpress:before{content:"";}.fa-openid:before{content:"";}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"";}.fa-mortar-board:before,.fa-graduation-cap:before{content:"";}.fa-yahoo:before{content:"";}.fa-google:before{content:"";}.fa-reddit:before{content:"";}.fa-reddit-square:before{content:"";}.fa-stumbleupon-circle:before{content:"";}.fa-stumbleupon:before{content:"";}.fa-delicious:before{content:"";}.fa-digg:before{content:"";}.fa-pied-piper-pp:before{content:"";}.fa-pied-piper-alt:before{content:"";}.fa-drupal:before{content:"";}.fa-joomla:before{content:"";}.fa-language:before{content:"";}.fa-fax:before{content:"";}.fa-building:before{content:"";}.fa-child:before{content:"";}.fa-paw:before{content:"";}.fa-spoon:before{content:"";}.fa-cube:before{content:"";}.fa-cubes:before{content:"";}.fa-behance:before{content:"";}.fa-behance-square:before{content:"";}.fa-steam:before{content:"";}.fa-steam-square:before{content:"";}.fa-recycle:before{content:"";}.fa-automobile:before,.fa-car:before{content:"";}.fa-cab:before,.fa-taxi:before{content:"";}.fa-tree:before{content:"";}.fa-spotify:before{content:"";}.fa-deviantart:before{content:"";}.fa-soundcloud:before{content:"";}.fa-database:before{content:"";}.fa-file-pdf-o:before{content:"";}.fa-file-word-o:before{content:"";}.fa-file-excel-o:before{content:"";}.fa-file-powerpoint-o:before{content:"";}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"";}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"";}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"";}.fa-file-movie-o:before,.fa-file-video-o:before{content:"";}.fa-file-code-o:before{content:"";}.fa-vine:before{content:"";}.fa-codepen:before{content:"";}.fa-jsfiddle:before{content:"";}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"";}.fa-circle-o-notch:before{content:"";}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"";}.fa-ge:before,.fa-empire:before{content:"";}.fa-git-square:before{content:"";}.fa-git:before{content:"";}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"";}.fa-tencent-weibo:before{content:"";}.fa-qq:before{content:"";}.fa-wechat:before,.fa-weixin:before{content:"";}.fa-send:before,.fa-paper-plane:before{content:"";}.fa-send-o:before,.fa-paper-plane-o:before{content:"";}.fa-history:before{content:"";}.fa-circle-thin:before{content:"";}.fa-header:before{content:"";}.fa-paragraph:before{content:"";}.fa-sliders:before{content:"";}.fa-share-alt:before{content:"";}.fa-share-alt-square:before{content:"";}.fa-bomb:before{content:"";}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"";}.fa-tty:before{content:"";}.fa-binoculars:before{content:"";}.fa-plug:before{content:"";}.fa-slideshare:before{content:"";}.fa-twitch:before{content:"";}.fa-yelp:before{content:"";}.fa-newspaper-o:before{content:"";}.fa-wifi:before{content:"";}.fa-calculator:before{content:"";}.fa-paypal:before{content:"";}.fa-google-wallet:before{content:"";}.fa-cc-visa:before{content:"";}.fa-cc-mastercard:before{content:"";}.fa-cc-discover:before{content:"";}.fa-cc-amex:before{content:"";}.fa-cc-paypal:before{content:"";}.fa-cc-stripe:before{content:"";}.fa-bell-slash:before{content:"";}.fa-bell-slash-o:before{content:"";}.fa-trash:before{content:"";}.fa-copyright:before{content:"";}.fa-at:before{content:"";}.fa-eyedropper:before{content:"";}.fa-paint-brush:before{content:"";}.fa-birthday-cake:before{content:"";}.fa-area-chart:before{content:"";}.fa-pie-chart:before{content:"";}.fa-line-chart:before{content:"";}.fa-lastfm:before{content:"";}.fa-lastfm-square:before{content:"";}.fa-toggle-off:before{content:"";}.fa-toggle-on:before{content:"";}.fa-bicycle:before{content:"";}.fa-bus:before{content:"";}.fa-ioxhost:before{content:"";}.fa-angellist:before{content:"";}.fa-cc:before{content:"";}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"";}.fa-meanpath:before{content:"";}.fa-buysellads:before{content:"";}.fa-connectdevelop:before{content:"";}.fa-dashcube:before{content:"";}.fa-forumbee:before{content:"";}.fa-leanpub:before{content:"";}.fa-sellsy:before{content:"";}.fa-shirtsinbulk:before{content:"";}.fa-simplybuilt:before{content:"";}.fa-skyatlas:before{content:"";}.fa-cart-plus:before{content:"";}.fa-cart-arrow-down:before{content:"";}.fa-diamond:before{content:"";}.fa-ship:before{content:"";}.fa-user-secret:before{content:"";}.fa-motorcycle:before{content:"";}.fa-street-view:before{content:"";}.fa-heartbeat:before{content:"";}.fa-venus:before{content:"";}.fa-mars:before{content:"";}.fa-mercury:before{content:"";}.fa-intersex:before,.fa-transgender:before{content:"";}.fa-transgender-alt:before{content:"";}.fa-venus-double:before{content:"";}.fa-mars-double:before{content:"";}.fa-venus-mars:before{content:"";}.fa-mars-stroke:before{content:"";}.fa-mars-stroke-v:before{content:"";}.fa-mars-stroke-h:before{content:"";}.fa-neuter:before{content:"";}.fa-genderless:before{content:"";}.fa-facebook-official:before{content:"";}.fa-pinterest-p:before{content:"";}.fa-whatsapp:before{content:"";}.fa-server:before{content:"";}.fa-user-plus:before{content:"";}.fa-user-times:before{content:"";}.fa-hotel:before,.fa-bed:before{content:"";}.fa-viacoin:before{content:"";}.fa-train:before{content:"";}.fa-subway:before{content:"";}.fa-medium:before{content:"";}.fa-yc:before,.fa-y-combinator:before{content:"";}.fa-optin-monster:before{content:"";}.fa-opencart:before{content:"";}.fa-expeditedssl:before{content:"";}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"";}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"";}.fa-battery-2:before,.fa-battery-half:before{content:"";}.fa-battery-1:before,.fa-battery-quarter:before{content:"";}.fa-battery-0:before,.fa-battery-empty:before{content:"";}.fa-mouse-pointer:before{content:"";}.fa-i-cursor:before{content:"";}.fa-object-group:before{content:"";}.fa-object-ungroup:before{content:"";}.fa-sticky-note:before{content:"";}.fa-sticky-note-o:before{content:"";}.fa-cc-jcb:before{content:"";}.fa-cc-diners-club:before{content:"";}.fa-clone:before{content:"";}.fa-balance-scale:before{content:"";}.fa-hourglass-o:before{content:"";}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"";}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"";}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"";}.fa-hourglass:before{content:"";}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"";}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"";}.fa-hand-scissors-o:before{content:"";}.fa-hand-lizard-o:before{content:"";}.fa-hand-spock-o:before{content:"";}.fa-hand-pointer-o:before{content:"";}.fa-hand-peace-o:before{content:"";}.fa-trademark:before{content:"";}.fa-registered:before{content:"";}.fa-creative-commons:before{content:"";}.fa-gg:before{content:"";}.fa-gg-circle:before{content:"";}.fa-tripadvisor:before{content:"";}.fa-odnoklassniki:before{content:"";}.fa-odnoklassniki-square:before{content:"";}.fa-get-pocket:before{content:"";}.fa-wikipedia-w:before{content:"";}.fa-safari:before{content:"";}.fa-chrome:before{content:"";}.fa-firefox:before{content:"";}.fa-opera:before{content:"";}.fa-internet-explorer:before{content:"";}.fa-tv:before,.fa-television:before{content:"";}.fa-contao:before{content:"";}.fa-500px:before{content:"";}.fa-amazon:before{content:"";}.fa-calendar-plus-o:before{content:"";}.fa-calendar-minus-o:before{content:"";}.fa-calendar-times-o:before{content:"";}.fa-calendar-check-o:before{content:"";}.fa-industry:before{content:"";}.fa-map-pin:before{content:"";}.fa-map-signs:before{content:"";}.fa-map-o:before{content:"";}.fa-map:before{content:"";}.fa-commenting:before{content:"";}.fa-commenting-o:before{content:"";}.fa-houzz:before{content:"";}.fa-vimeo:before{content:"";}.fa-black-tie:before{content:"";}.fa-fonticons:before{content:"";}.fa-reddit-alien:before{content:"";}.fa-edge:before{content:"";}.fa-credit-card-alt:before{content:"";}.fa-codiepie:before{content:"";}.fa-modx:before{content:"";}.fa-fort-awesome:before{content:"";}.fa-usb:before{content:"";}.fa-product-hunt:before{content:"";}.fa-mixcloud:before{content:"";}.fa-scribd:before{content:"";}.fa-pause-circle:before{content:"";}.fa-pause-circle-o:before{content:"";}.fa-stop-circle:before{content:"";}.fa-stop-circle-o:before{content:"";}.fa-shopping-bag:before{content:"";}.fa-shopping-basket:before{content:"";}.fa-hashtag:before{content:"";}.fa-bluetooth:before{content:"";}.fa-bluetooth-b:before{content:"";}.fa-percent:before{content:"";}.fa-gitlab:before{content:"";}.fa-wpbeginner:before{content:"";}.fa-wpforms:before{content:"";}.fa-envira:before{content:"";}.fa-universal-access:before{content:"";}.fa-wheelchair-alt:before{content:"";}.fa-question-circle-o:before{content:"";}.fa-blind:before{content:"";}.fa-audio-description:before{content:"";}.fa-volume-control-phone:before{content:"";}.fa-braille:before{content:"";}.fa-assistive-listening-systems:before{content:"";}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"";}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"";}.fa-glide:before{content:"";}.fa-glide-g:before{content:"";}.fa-signing:before,.fa-sign-language:before{content:"";}.fa-low-vision:before{content:"";}.fa-viadeo:before{content:"";}.fa-viadeo-square:before{content:"";}.fa-snapchat:before{content:"";}.fa-snapchat-ghost:before{content:"";}.fa-snapchat-square:before{content:"";}.fa-pied-piper:before{content:"";}.fa-first-order:before{content:"";}.fa-yoast:before{content:"";}.fa-themeisle:before{content:"";}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"";}.fa-fa:before,.fa-font-awesome:before{content:"";}.fa-handshake-o:before{content:"";}.fa-envelope-open:before{content:"";}.fa-envelope-open-o:before{content:"";}.fa-linode:before{content:"";}.fa-address-book:before{content:"";}.fa-address-book-o:before{content:"";}.fa-vcard:before,.fa-address-card:before{content:"";}.fa-vcard-o:before,.fa-address-card-o:before{content:"";}.fa-user-circle:before{content:"";}.fa-user-circle-o:before{content:"";}.fa-user-o:before{content:"";}.fa-id-badge:before{content:"";}.fa-drivers-license:before,.fa-id-card:before{content:"";}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"";}.fa-quora:before{content:"";}.fa-free-code-camp:before{content:"";}.fa-telegram:before{content:"";}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"";}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"";}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"";}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"";}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"";}.fa-shower:before{content:"";}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"";}.fa-podcast:before{content:"";}.fa-window-maximize:before{content:"";}.fa-window-minimize:before{content:"";}.fa-window-restore:before{content:"";}.fa-times-rectangle:before,.fa-window-close:before{content:"";}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"";}.fa-bandcamp:before{content:"";}.fa-grav:before{content:"";}.fa-etsy:before{content:"";}.fa-imdb:before{content:"";}.fa-ravelry:before{content:"";}.fa-eercast:before{content:"";}.fa-microchip:before{content:"";}.fa-snowflake-o:before{content:"";}.fa-superpowers:before{content:"";}.fa-wpexplorer:before{content:"";}.fa-meetup:before{content:"";}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0;}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto;}body{font-size:12px;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;margin:0;padding:0;color:#333;}body.layout{background:url(data:image/png;base64,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) left top repeat-x #d1d1d1;background:linear-gradient(to bottom,#f2f2f2 0,#d1d1d1 370px) left top repeat-x #d1d1d1;min-height:370px;}.page{max-width:1232px;min-width:768px;margin-left:auto;margin-right:auto;}header,#header{position:relative;background-color:#333;margin:0;padding:0;height:34px;}header #heading,#header #heading{float:left;height:34px;}header #heading i,#header #heading i{display:block;height:34px;width:34px;background-image:url(data:image/png;base64,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);}header nav,#header nav{float:left;height:34px;padding:0;margin:0;}header nav ul#menu,#header nav ul#menu{height:26px;padding:0;margin:8px 0 0 4px;list-style:none;z-index:100000;font-size:0;line-height:0;}header nav ul#menu>li,#header nav ul#menu>li{display:inline-block;z-index:100000;font-size:13.2px;line-height:19.2px;}header nav ul#menu>li.moveRight,#header nav ul#menu>li.moveRight{margin-left:20px;}header nav ul#menu>li>a,#header nav ul#menu>li>a{display:inline-block;padding:2px 10px 4px 10px;height:20px;color:#fff;font-weight:400;text-transform:uppercase;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.active>a,#header nav ul#menu>li.active>a{background-color:#222;}header nav ul#menu>li:hover>a,#header nav ul#menu>li:hover>a{background-color:#111;text-decoration:none;}header nav ul#menu>li>ul,#header nav ul#menu>li>ul{z-index:100000;display:none;list-style:none;position:absolute;margin:0;border-left:1px solid #d1d1d1;border-right:1px solid #d1d1d1;background-color:hsl(0,0%,95%);padding:0;min-width:180px;box-shadow:2px 2px 5px rgba(209,209,209,.5);}header nav ul#menu>li>ul li,#header nav ul#menu>li>ul li{position:relative;background-position:top;background-repeat:repeat-x;border-top:1px solid hsl(0,0%,90%);}header nav ul#menu>li>ul li:first-child,#header nav ul#menu>li>ul li:first-child{border-top:1px solid #d1d1d1;}header nav ul#menu>li>ul li:last-child,#header nav ul#menu>li>ul li:last-child{border-bottom:1px solid #d1d1d1;}header nav ul#menu>li>ul li:hover,#header nav ul#menu>li>ul li:hover{border-top:1px solid hsl(0,0%,85%);background-color:hsl(0,0%,90%);}header nav ul#menu>li>ul li a,#header nav ul#menu>li>ul li a{display:block;color:#000;padding:4px 8px;text-decoration:none;}header nav ul#menu>li>ul li a:hover,#header nav ul#menu>li>ul li a:hover{color:#335a87;text-decoration:none;}header nav ul#menu>li>ul li a:active,#header nav ul#menu>li>ul li a:active{text-decoration:none;}header nav ul#menu>li>ul li i.fa-caret-right,#header nav ul#menu>li>ul li i.fa-caret-right{cursor:pointer;color:#666;font-size:16px;position:absolute;display:block;right:12px;top:7px;}header nav ul#menu>li>ul li:hover i.fa-caret-right,#header nav ul#menu>li>ul li:hover i.fa-caret-right{color:#333;}header nav ul#menu>li>ul ul,#header nav ul#menu>li>ul ul{display:none;list-style:none;position:absolute;top:-1px;left:180px;background-color:hsl(0,0%,95%);border-left:1px solid #d1d1d1;border-right:1px solid #d1d1d1;padding:0;min-width:180px;box-shadow:2px 2px 5px rgba(209,209,209,.5);}header #headerMenu,#header #headerMenu{float:right;height:24px;padding:5px 8px;font-size:.9em;line-height:24px;text-align:right;color:#fff;}header #headerMenu a,#header #headerMenu a{color:#fff;text-decoration:none;}header #headerMenu a:hover,#header #headerMenu a:hover{color:#cddbec;text-decoration:none;}header #SearchQuery,#header #SearchQuery{font-size:.9em;margin-left:6px;width:130px;background-color:#eee;-moz-transition-property:width;-o-transition-property:width;-webkit-transition-property:width;transition-property:width;-moz-transition-duration:.1s;-o-transition-duration:.1s;-webkit-transition-duration:.1s;transition-duration:.1s;}header #SearchQuery:hover,#header #SearchQuery:hover,header #SearchQuery:focus,#header #SearchQuery:focus{background-color:#fff;width:190px;}header .watermark,#header .watermark{background-color:#888;}#QuickSearchMenu{max-height:400px;font-size:.9em;background:none;background-color:#fafafa;}#QuickSearchMenu li:not(:last-child){border-bottom:1px solid #d8d8d8;}#QuickSearchMenu li>a{padding:2px;}#QuickSearchMenu li>a>i{margin-right:2px;}#QuickSearchMenu li>a>div{padding-left:1.28571429em;margin-left:2px;}#layout_PageHeading{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAA8CAYAAABfESsNAAAAOUlEQVRIx+2SuREAIAzDFELL/uOSFVLx3Mm1C8nnABaNDJq5WJzAVkZGZXyPMg7+jUwCIeNZmdcZC2pxCZOpoRNgAAAAAElFTkSuQmCC) left top repeat-x #fff;background:linear-gradient(to bottom,#f2f2f2 0,#fff 50px) #fff;height:50px;padding:6px 20px 4px 20px;font-size:2em;color:#000;line-height:50px;position:relative;border-left:1px solid #d1d1d1;border-right:1px solid #d1d1d1;}#layout_PageHeading a{text-decoration:none;}#layout_PageHeading>a.button{position:absolute;right:30px;bottom:8px;font-size:.5em;line-height:1em;text-align:right;}#layout_Page{background-color:#fff;overflow:auto;border-left:1px solid #d1d1d1;border-right:1px solid #d1d1d1;border-bottom:1px solid #d1d1d1;padding:0 30px 15px 30px;-moz-border-radius:0 0 4px 4px;-webkit-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}#layout_Error{min-height:200px;}#layout_Error table{background-color:#fff;}#layout_Error h1,#layout_Error h2,#layout_Error h3,#layout_Error h4,#layout_Error h5{color:#fff;white-space:pre-wrap;}#layout_Error h2.error{margin-bottom:10px;}#layout_Error .stacktrace{white-space:pre;overflow:auto;}#layout_Error>div{margin:0 auto;width:650px;}#layout_uiExtensions{display:none;}footer,#footer{color:#777;padding:10px 0;text-align:center;margin:0;font-size:.9em;}footer a:link,#footer a:link,footer a:visited,#footer a:visited,footer a:active,#footer a:active{color:#777;}footer a:link,#footer a:link,footer a:active,#footer a:active{text-decoration:underline;}footer a:hover,#footer a:hover{color:#5e8cc2;text-decoration:none;}p{margin:0 0 2px 0;line-height:1.6em;}ul{margin:0;padding:0 0 0 25px;list-style:square;line-height:1.6em;}header,footer,nav,section{display:block;}form{display:inline;}img{border:0;padding:0;margin:0;vertical-align:bottom;}code{font-family:Consolas,"Courier New",monospace;}hr{border:0;border-bottom:1px dashed #aaa;margin-top:15px;}strong{font-weight:600;}a:link{color:#335a87;text-decoration:none;}a:visited{color:#335a87;}a:hover{color:#5e8cc2;text-decoration:underline;}a:active{color:#335a87;}a[disabled]{color:#6b6b6b;text-decoration:none;cursor:default;}a.button{display:inline-block;padding:4px 10px;margin:2px;border:1px solid #1a5f95;background:#1e6dab;color:#fff;font-weight:600;text-transform:uppercase;cursor:pointer;white-space:nowrap;text-decoration:none;}a.button[disabled],a.button.disabled{background:#9e9e9e;border:1px solid #6b6b6b;cursor:default;}a.button.alert{border-color:#900;background-color:#e51400;}a.button.small{padding:2px 5px;font-size:.9em;}a.button:hover{border:1px solid #6b6b6b;background:#9e9e9e;}a.button i{margin-right:10px;}div.actionBar{margin:0 -30px 0 -30px;padding:10px;border-top:1px solid #d1d1d1;text-align:right;background-color:#f2f2f2;clear:both;}div.actionBar:not(:first-child){margin-top:10px;}div.actionBar:last-child{margin-bottom:-15px;-moz-border-radius:0 0 6px 6px;-webkit-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;}h1,h2,h3,h4,h5,h6{color:#000;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-weight:lighter;font-stretch:condensed;margin:0;}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child,h6:first-child{margin-top:0!important;padding-top:0!important;}h1>a:link,h2>a:link,h3>a:link,h4>a:link,h5>a:link,h6>a:link{text-decoration:none;}h1{font-size:24px;}h2{font-size:20px;padding:8px 0 4px 0;}h3{font-size:18px;}h4{font-size:14px;}h5,h6{font-size:12px;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-stretch:normal;font-weight:600;}table{border:0;border-collapse:collapse;width:100%;}table td{padding:5px;margin:0;border:0;vertical-align:top;}table th{padding:5px;margin:0;text-align:left;font-weight:600;vertical-align:top;}table.none{border:0!important;}table.none tr,table.none td,table.none th{padding:0!important;margin:0!important;background:none!important;border:0!important;}table.genericData{border:solid 1px #f4f4f4;border-collapse:collapse;}table.genericData>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}table.genericData>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}table.genericData>thead>tr>th,table.genericData>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}table.genericData>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}table.genericData>tfoot>tr>th,table.genericData>tfoot>tr>td{background-color:#f4f4f4;}table.genericData td.id{text-align:center;}table.genericData td.id a{padding:0 6px;}.smallTable th,.smallTable td{font-size:.9em;}.dataTables_wrapper{position:relative;}.dataTables_wrapper>.a{position:absolute;margin-top:-24px;right:320px;opacity:.3;}.dataTables_wrapper .dataTables_filter{position:absolute;height:20px;margin-top:-20px;right:0;font-size:.9em;-moz-opacity:.3;opacity:.3;}.dataTables_wrapper .dataTables_filter input{font-size:.95em;padding:0;height:1.4em;width:150px;}.dataTables_wrapper .dataTables_length{position:absolute;height:20px;margin-top:-20px;right:200px;font-size:.9em;-moz-opacity:.3;opacity:.3;}.dataTables_wrapper .dataTables_length select{font-size:.95em;padding:0;height:1.4em;}.dataTables_wrapper .dataTables_processing{position:absolute;margin-top:30px;left:45%;}.dataTables_wrapper .dataTables_decommissioned{position:absolute;height:20px;margin-top:-20px;right:320px;font-size:.9em;-moz-opacity:.3;opacity:.3;}.dataTables_wrapper .dataTables_decommissioned input{font-size:.8em;padding:0;height:1.2em;}.dataTables_wrapper .dataTables_paginate{text-align:right;background-color:#f4f4f4;padding:2px 4px;font-size:.9em;}.dataTables_wrapper .dataTables_paginate a{cursor:pointer;padding:2px;margin:0 3px;color:#335a87;background-repeat:no-repeat;-moz-opacity:.3;opacity:.3;text-transform:uppercase;}.dataTables_wrapper .dataTables_paginate .first{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAKklEQVQI12NgQALGUe0SQPwfnY0iCcVwNjZJFAxT8J+QAvwmEHQDPl8AAAYqTAY6Jng6AAAAAElFTkSuQmCC);background-position:left center;padding-left:12px;}.dataTables_wrapper .dataTables_paginate .first.paginate_button_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAKklEQVQI12NgQAKxsbESQPwfnY0iCcVwNjZJFAxT8J+QAvwmEHQDPl8AAEm8TIFT3+fIAAAAAElFTkSuQmCC);}.dataTables_wrapper .dataTables_paginate .previous{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12NgwAGMo9olgPg/XkmsCpAlcSn4T0gBfhMIugFdEQCMVyg5CPiC8wAAAABJRU5ErkJggg==);background-position:left center;padding-left:12px;}.dataTables_wrapper .dataTables_paginate .previous.paginate_button_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12NgwAH6+vokgPg/XkmsCpAlcSn4T0gBfhMIugFdEQDzojUdMBAGjgAAAABJRU5ErkJggg==);}.dataTables_wrapper .dataTables_paginate .next{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12Mwjmr/D8QSDLgAVAFuRUgKsCtCU/CfIhPwugGnLwCZ1Cg5w6CPqwAAAABJRU5ErkJggg==);background-position:right center;padding-right:12px;}.dataTables_wrapper .dataTables_paginate .next.paginate_button_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12Po6+v7D8QSDLgAVAFuRUgKsCtCU/CfIhPwugGnLwDwPjUdLMfQ6AAAAABJRU5ErkJggg==);}.dataTables_wrapper .dataTables_paginate .last{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAK0lEQVQI12Mwjmr/D8QSDECAzIYDqCBYApmNTQE6liCk4D/JJuB1A05fAABJ/EwGJKVDGAAAAABJRU5ErkJggg==);background-position:right center;padding-right:12px;}.dataTables_wrapper .dataTables_paginate .last.paginate_button_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAK0lEQVQI12OIjY39D8QSDECAzIYDqCBYApmNTQE6liCk4D/JJuB1A05fAACQykyB48rZCQAAAABJRU5ErkJggg==);}.dataTables_wrapper .dataTables_paginate .paginate_active{font-weight:600;color:#1e6dab;}.dataTables_wrapper .dataTables_paginate .paginate_button_disabled{color:#ccc;cursor:default;}.dataTables_wrapper .dataTables_paginate .paginate_enabled_previous{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12NgwAGMo9olgPg/XkmsCpAlcSn4T0gBfhMIugFdEQCMVyg5CPiC8wAAAABJRU5ErkJggg==);background-position:left center;padding-left:12px;}.dataTables_wrapper .dataTables_paginate .paginate_disabled_previous{color:#ccc;cursor:default;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12NgwAH6+vokgPg/XkmsCpAlcSn4T0gBfhMIugFdEQDzojUdMBAGjgAAAABJRU5ErkJggg==);background-position:left center;padding-left:12px;}.dataTables_wrapper .dataTables_paginate .paginate_enabled_next{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12Mwjmr/D8QSDLgAVAFuRUgKsCtCU/CfIhPwugGnLwCZ1Cg5w6CPqwAAAABJRU5ErkJggg==);background-position:right center;padding-right:12px;}.dataTables_wrapper .dataTables_paginate .paginate_disabled_next{color:#ccc;cursor:default;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12Po6+v7D8QSDLgAVAFuRUgKsCtCU/CfIhPwugGnLwDwPjUdLMfQ6AAAAABJRU5ErkJggg==);background-position:right center;padding-right:12px;}.dataTables_wrapper:hover .dataTables_filter,.dataTables_wrapper:hover .dataTables_length,.dataTables_wrapper:hover .dataTables_paginate a,.dataTables_wrapper:hover .dataTables_decommissioned{-moz-opacity:1;opacity:1;}.dataTables_wrapper table>thead tr>th{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAD6CAYAAACoLMeFAAAAdElEQVRo3u3bOwqAMBAFwBwjh/CUluKRhfVTiil0UYjMwJLqLfmUYUuBtw3jUreKfc2E43aTi/C9Jo3wUR4WAAAAAAAAejBPc90q9jUTjkdNTuGjPj9/bgfpO0i/AgAAAAAAAPQnPZ6YHpBsNEnNefrt4+9Wmn6nW/cZ1MQAAAAASUVORK5CYII=);background-repeat:no-repeat;}.dataTables_wrapper table>thead tr>th.sorting{background-position:right center;cursor:pointer;}.dataTables_wrapper table>thead tr>th.sorting_desc{background-position:right bottom;cursor:pointer;}.dataTables_wrapper table>thead tr>th.sorting_asc{background-position:right top;cursor:pointer;}.dataTables_wrapper table>thead tr>th.sorting_disabled{background-image:none;}table.userTable div.flags,table.deviceTable div.flags{display:inline-block;float:right;}table.userTable div.flags>i,table.deviceTable div.flags>i{cursor:default;}table.userTable div.flags>i>.details,table.deviceTable div.flags>i>.details{display:none;}.jobStatus{color:#333;}.jobStatus.Closed{color:#9e9e9e;}.jobStatus.Open{color:#60a917;}.jobStatus.AwaitingWarrantyRepair,.jobStatus.AwaitingRepairs{color:#1e6dab;}.jobStatus.AwaitingDeviceReturn,.jobStatus.AwaitingUserAction,.jobStatus.AwaitingAccountingPayment,.jobStatus.AwaitingAccountingCharge{color:#f0a30a;}.jobStatus.AwaitingInsuranceProcessing{color:#6a00ff;}.deviceStatus{color:#333;}.deviceStatus.Decommissioned{color:#9e9e9e;}.deviceStatus.Active{color:#60a917;}.deviceStatus.NotEnrolled{color:#f0a30a;}table.jobTable{border:solid 1px #f4f4f4;border-collapse:collapse;table-layout:fixed;}table.jobTable>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}table.jobTable>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}table.jobTable>thead>tr>th,table.jobTable>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}table.jobTable>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}table.jobTable>tfoot>tr>th,table.jobTable>tfoot>tr>td{background-color:#f4f4f4;}table.jobTable td{white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;}table.jobTable.hideStatusClosed tr[data-status=Closed]{display:none;}table.jobTable td.id,table.jobTable th.id{width:50px;text-align:center;}table.jobTable td.id a,table.jobTable th.id a{padding:0 6px;}table.jobTable tr.statusSlaWarning td{background-color:#fdeed1;}table.jobTable tr.statusSlaWarning td:not(:last-child){border-right:1px solid #f8e9cb;}table.jobTable tr.statusSlaExpired td{background-color:#ffd7d3;}table.jobTable tr.statusSlaExpired td:not(:last-child){border-right:1px solid #fad2ce;}table.jobTable tr:nth-child(odd).statusSlaWarning td{background-color:#fbeccf!important;}table.jobTable tr:nth-child(odd).statusSlaExpired td{background-color:#fdd5d1!important;}table.jobTable tr:hover.statusSlaWarning td{background-color:#fbeaca!important;}table.jobTable tr:hover.statusSlaExpired td{background-color:#fdd1cd!important;}table.jobTable div.queues{display:inline-block;float:right;}table.jobTable td.lastActive,table.jobTable th.lastActive{width:130px;}table.jobTable td.dates,table.jobTable th.dates{width:130px;}table.jobTable td.type,table.jobTable th.type{width:50px;}table.jobTable td.device,table.jobTable th.device{width:110px;}table.jobTable td.user,table.jobTable th.user{width:240px;}table.jobTable td.technician,table.jobTable th.technician{width:80px;}table.jobTable td.location,table.jobTable th.location{width:200px;}div.jobTable>a.dataTables_showStatusClosed{margin:10px 5px;}div.jobTable>h3,div.jobTable>div.allClosed_container{margin:50px 20px!important;}div.jobTable>h3 a.button,div.jobTable>div.allClosed_container a.button{margin-top:10px;}table.deviceTable tr.decommissioned{background-color:#ededed;}table.deviceTable.hideDecommissioned tr.decommissioned{display:none;}textarea{font-size:12px;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;border:1px solid #ccc;min-height:75px;padding:2px;color:#444;width:200px;}input[type="text"],input[type="password"],input[type="file"],input[type="number"]{font-size:12px;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;border:1px solid #ccc;padding:2px;color:#444;width:200px;}input[type="text"].small,input[type="password"].small,input[type="file"].small,input[type="number"].small{padding:0 2px;width:150px;}input[type="text"].discreet,input[type="password"].discreet,input[type="file"].discreet,input[type="number"].discreet{border:1px solid #fff;}input[type="text"].discreet:hover,input[type="password"].discreet:hover,input[type="file"].discreet:hover,input[type="number"].discreet:hover,input[type="text"].discreet:focus,input[type="password"].discreet:focus,input[type="file"].discreet:focus,input[type="number"].discreet:focus{border:1px solid #ccc;}input[type="checkbox"],input[type="radio"]{margin-right:4px;vertical-align:sub;}select{font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-size:12px;border:1px solid #ccc;padding:2px;color:#444;}select.small{padding:0;}input[type="submit"],button{font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;padding:5px;}input[type="submit"].button,button.button{font-size:12px;padding:4px 10px 4px 10px;margin:2px;border:1px solid #1a5f95;background:#1e6dab;color:#fff;font-weight:600;text-transform:uppercase;cursor:pointer;}input[type="submit"].button.alert,button.button.alert{border-color:#900;background-color:#e51400;}input[type="submit"].button.small,button.button.small{padding:2px 5px;font-size:.9em;}input[type="submit"].button[disabled],button.button[disabled]{background:#9e9e9e;border:1px solid #6b6b6b;cursor:default;}input[type="submit"].button:hover,button.button:hover{border:1px solid #6b6b6b;background:#9e9e9e;}ul.none,ol.none{list-style:none;margin:0;padding:0;}ul.none li,ol.none li{margin:0;}div.form{margin:0 auto;}div.form>p.actions{text-align:right;}div.form>table{border-top:6px solid #1e6dab;border-left:1px solid #1e6dab;border-right:1px solid #1e6dab;border-bottom:3px solid #1e6dab;background-color:#fff;}div.form>table>tbody>tr>td,div.form>table>tbody>tr>th{background:none;border:0;margin:0;padding:8px 5px;}div.form>table>tbody>tr>th{font-weight:normal;text-align:right;}div.form>table>tbody>tr:nth-child(odd){background-color:#f2f2f2;margin:0;padding:0;}div.form>table>tbody>tr>td.details{padding:0;}div.form>table>tbody>tr>th.name{width:150px;text-align:right;}div.form>table table.sub>tbody>tr:not(:first-child)>th,div.form>table table.sub>tbody>tr:not(:first-child)>td{border-top:1px dashed #aaa;}div.form>table table.sub>tbody>tr>th{font-weight:normal;text-align:right;}div.form>table table.sub>tbody>tr>th.name{text-align:right;}#pageMenu td{border-right:1px dashed #aaa;width:33%;padding:10px;}#pageMenu td .pageMenuArea>.fa{font-size:1.3em;color:#6b6b6b;margin-right:4px;}#pageMenu td .pageMenuArea>a,#pageMenu td .pageMenuArea>h3{text-decoration:none;font-size:1.2em;}#pageMenu td .pageMenuArea .pageMenuBlurb{font-size:.9em;color:#888;margin-bottom:10px;}#pageMenu td .pageMenuArea .pageMenuBlurb a{text-decoration:none;}#pageMenu td .pageMenuArea:not(:last-child){border-bottom:1px dashed #aaa;}#pageMenu td .pageMenuArea.noSeperator{border-bottom:0;}#pageMenu td:first-child{padding-left:0;}#pageMenu td:last-child{border-right:0;padding-right:0;}div.info-box{margin:.4em 0;padding:.4em;border:1px solid #fff397;background-color:#fffef7;}div.info-box i{color:#1e6dab;}div.info-box.alert{border:1px solid #fa6800;background-color:#fff9f5;color:#333;}div.info-box.alert i{color:#fa6800;}div.info-box.error{border:1px solid #e51400;background-color:#fffaf9;color:#e51400;}div.info-box.error i{color:#e51400;}div.info-box p{line-height:1.2em;}p.fa-p{text-indent:-1.48em;margin-left:1.48em;}p.fa-p>i:first-child{text-indent:0;width:1.28em;margin-right:.2em;}div.Disco-AttachmentUpload-DropTarget{display:none;}div.Disco-AttachmentUpload-DropTarget.dragHighlight{display:block;position:absolute;z-index:1000;top:0;left:0;width:calc(100% - 6px);height:calc(100% - 6px);background-color:rgba(251,218,152,.5);border:3px dashed #f0a30a;}div.Disco-AttachmentUpload-DropTarget.dragHighlight h2{margin-top:3em!important;color:#2c1e02;text-align:center;font-weight:600;}div.Disco-AttachmentUpload-DropTarget.dragHighlight.dragHover{background-color:rgba(173,235,110,.5);border:3px dashed #60a917;}div.Disco-AttachmentUpload-DropTarget.dragHighlight.dragHover h2{color:#000;}div.Disco-AttachmentUpload-Progress{position:absolute;right:0;bottom:48px;}div.Disco-AttachmentUpload-Progress>div{background-color:#fafafa;padding:4px 8px;}div.Disco-AttachmentUpload-Progress>div i{color:#1e6dab;margin-right:4px;}div.Disco-AttachmentUpload-CommentDialog{padding:.25em .5em!important;}div.Disco-AttachmentUpload-CommentDialog table{border:solid 1px #f4f4f4;border-collapse:collapse;table-layout:fixed;}div.Disco-AttachmentUpload-CommentDialog table>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}div.Disco-AttachmentUpload-CommentDialog table>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}div.Disco-AttachmentUpload-CommentDialog table>thead>tr>th,div.Disco-AttachmentUpload-CommentDialog table>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}div.Disco-AttachmentUpload-CommentDialog table>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}div.Disco-AttachmentUpload-CommentDialog table>tfoot>tr>th,div.Disco-AttachmentUpload-CommentDialog table>tfoot>tr>td{background-color:#f4f4f4;}div.Disco-AttachmentUpload-CommentDialog table th{width:80px;}div.Disco-AttachmentUpload-CommentDialog table td.filename{font-family:Consolas,"Courier New",monospace;white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;}div.Disco-AttachmentUpload-CommentDialog table input.comments{width:calc(100% - 5px);}div.Disco-AttachmentUpload-CommentDialog table td.thumbnail{display:none;text-align:center;}div.Disco-AttachmentUpload-CommentDialog table td.thumbnail img{border:1px solid #9e9e9e;max-height:250px;max-width:374px;}div.Disco-AttachmentUpload-ImageDialog{background-color:#000!important;padding:0!important;}body>.FlagAssignment_Tooltip span.name{display:block;font-weight:600;}body>.FlagAssignment_Tooltip span.comments{display:block;padding:2px 0 2px 4px;}body>.FlagAssignment_Tooltip span.added{font-style:italic;font-size:.9em;}#Document_Generation_Container #Document_Generate{padding:0;}.d-priority-high{color:#fa6800;width:1.28571429em;text-align:center;}.d-priority-high:before{content:"";}.d-priority-normal{color:#60a917;width:1.28571429em;text-align:center;}.d-priority-normal:before{content:"";}.d-priority-low{color:#1e6dab;width:1.28571429em;text-align:center;}.d-priority-low:before{content:"";}.fa-stack .d-priority-high,.fa-stack .d-priority-normal,.fa-stack .d-priority-low{width:100%;font-size:.8em;margin-left:.5em;margin-top:.4em;opacity:.6;}.d-lime{color:#a4c400;}.d-green{color:#60a917;}.d-emerald{color:#008a00;}.d-teal{color:#00aba9;}.d-cyan{color:#1ba1e2;}.d-cobalt{color:#0050ef;}.d-indigo{color:#6a00ff;}.d-violet{color:#a0f;}.d-pink{color:#f472d0;}.d-magenta{color:#d80073;}.d-crimson{color:#a20025;}.d-red{color:#e51400;}.d-orange{color:#fa6800;}.d-amber{color:#f0a30a;}.d-yellow{color:#e3c800;}.d-brown{color:#825a2c;}.d-olive{color:#6d8764;}.d-steel{color:#647689;}.d-mauve{color:#76608a;}.d-sienna{color:#a0522d;}table.subtleHighlight{border:1px solid #ccc;background-color:#ededed;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}td.subtleHighlight{border:1px solid #ccc;background-color:#ededed;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.field-validation-error{color:#e51400!important;}.field-validation-valid{display:none;}.input-validation-error{border:1px solid #e51400!important;background-color:#fff7f7!important;}.validation-summary-errors{font-weight:bold!important;color:#e51400!important;}.validation-summary-valid{display:none;}.ajaxLoading{height:11px;width:16px;display:inline-block;background-repeat:no-repeat;background-image:url(data:image/gif;base64,R0lGODlhEAALAPQAAP///zNah+Hm7dng6O7x9DddiTNah1d3nJqtw3+Xs8fS3k5vlm6JqaGzx4KatcrU4FFymDZciHGMq+ru8t/l7Pb3+V9+oeLo7vT2+MTP3LLB0dTc5fHz9gAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCwAAACwAAAAAEAALAAAFLSAgjmRpnqSgCuLKAq5AEIM4zDVw03ve27ifDgfkEYe04kDIDC5zrtYKRa2WQgAh+QQJCwAAACwAAAAAEAALAAAFJGBhGAVgnqhpHIeRvsDawqns0qeN5+y967tYLyicBYE7EYkYAgAh+QQJCwAAACwAAAAAEAALAAAFNiAgjothLOOIJAkiGgxjpGKiKMkbz7SN6zIawJcDwIK9W/HISxGBzdHTuBNOmcJVCyoUlk7CEAAh+QQJCwAAACwAAAAAEAALAAAFNSAgjqQIRRFUAo3jNGIkSdHqPI8Tz3V55zuaDacDyIQ+YrBH+hWPzJFzOQQaeavWi7oqnVIhACH5BAkLAAAALAAAAAAQAAsAAAUyICCOZGme1rJY5kRRk7hI0mJSVUXJtF3iOl7tltsBZsNfUegjAY3I5sgFY55KqdX1GgIAIfkECQsAAAAsAAAAABAACwAABTcgII5kaZ4kcV2EqLJipmnZhWGXaOOitm2aXQ4g7P2Ct2ER4AMul00kj5g0Al8tADY2y6C+4FIIACH5BAkLAAAALAAAAAAQAAsAAAUvICCOZGme5ERRk6iy7qpyHCVStA3gNa/7txxwlwv2isSacYUc+l4tADQGQ1mvpBAAIfkECQsAAAAsAAAAABAACwAABS8gII5kaZ7kRFGTqLLuqnIcJVK0DeA1r/u3HHCXC/aKxJpxhRz6Xi0ANAZDWa+kEAA7AAAAAAAAAAAA);margin-bottom:0;}.ajaxOk{color:#60a917;}.ajaxSave{color:#1e6dab;cursor:pointer;}.ajaxRemove{color:#e51400;cursor:pointer;opacity:.8;}.ajaxRemove:hover{opacity:1;}#layout_Page div.hiddenDialog{display:none;}* html .clearfix{height:1%;overflow:visible;}*+html .clearfix{min-height:1%;}.clearfix:after{clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0;}div.columnHost .column50{float:left;width:50%;}.hidden{display:none;}.success{color:#60a917;}.information{color:#1e6dab;}.warning{color:#f0a30a;}.error{color:#e51400;}.alert{color:#fa6800;}.smallText{font-size:.9em;}.smallMessage{font-style:italic;color:#666;font-size:.9em;}.nowrap{white-space:nowrap;}.code{font-family:Consolas,"Courier New",monospace;}div.code{border:1px dashed #bbb;background-color:#fff;margin:3px 6px;padding:4px;font-size:.9em;}a.smallLink{font-size:.9em;}textarea.block{width:250px;height:100px;}.checkboxBulkSelectContainer{margin-top:6px;font-size:.8em;}.checkboxBulkSelectContainer a{text-decoration:none;}.ui-widget .checkboxBulkSelectContainer{font-size:1em;}#licence{text-align:justify;}#licence p{font-size:.9em;line-height:1.6em;margin-bottom:1em;}#licence li{font-size:.9em;}#Document_Generation_Dialog{height:490px;}#Document_Generation_Dialog .handlerPicker{position:absolute;width:170px;height:390px;overflow-y:auto;background-color:#fcfcfc;border:1px solid #ccc;}#Document_Generation_Dialog .handlerPicker>div{background-color:#fff;border-bottom:1px solid #ddd;padding:6px 0 6px 6px;cursor:pointer;}#Document_Generation_Dialog .handlerPicker>div:hover{background-color:#f4f4f4;}#Document_Generation_Dialog .handlerPicker>div.selected,#Document_Generation_Dialog .handlerPicker>div.selected:hover{background-color:#eee;}#Document_Generation_Dialog .handlerPicker #Document_Generation_Dialog_Handlers_Loading{text-align:center;}#Document_Generation_Dialog .details{position:absolute;left:200px;height:390px;width:540px;overflow-y:auto;}#Document_Generation_Dialog .details #Document_Generation_Dialog_Download_Container{text-align:center;padding-top:3em;}#Document_Generation_Dialog .details #Document_Generation_Dialog_HandlerUI{display:none;}ul.list-group{background-color:#fff;border:1px solid #ddd;margin:0;padding:0;list-style:none;}ul.list-group li{padding:6px 0 6px 6px;cursor:pointer;}ul.list-group li:hover{background-color:#f4f4f4;}ul.list-group li.selected,ul.list-group li.selected:hover{background-color:#eee;}ul.list-group li:not(:first-child){border-top:1px solid #ddd;}.whitespace-pre-wrap{white-space:pre-wrap;} \ No newline at end of file diff --git a/Disco.Web/ClientSource/Style/Config.css b/Disco.Web/ClientSource/Style/Config.css index a436367e..84605015 100644 --- a/Disco.Web/ClientSource/Style/Config.css +++ b/Disco.Web/ClientSource/Style/Config.css @@ -1824,6 +1824,164 @@ h1.Config_DocumentTemplates { margin-right: 10px; color: #1e6dab; } +#Config_DeviceFlags_Show #DeviceFlag_OnAssignmentExpression, +#Config_DeviceFlags_Show #DeviceFlag_OnUnassignmentExpression { + height: 16px; + min-height: 16px; + overflow: hidden; + font-family: Consolas, "Courier New", monospace; +} +#Config_DeviceFlags_Index i { + width: 1.28571429em; + text-align: center; +} +#Config_DeviceFlags_Icon { + display: block; + margin: 0 0 10px 10px; +} +#Config_DeviceFlags_Icon_Update_Dialog { + display: none; +} +#Config_DeviceFlags_Icon_Update_Dialog div.colours { + text-align: center; + font-size: 30px; +} +#Config_DeviceFlags_Icon_Update_Dialog div.colours i { + cursor: pointer; + padding: 1px; + opacity: 0.9; +} +#Config_DeviceFlags_Icon_Update_Dialog div.colours i:hover { + opacity: 1; +} +#Config_DeviceFlags_Icon_Update_Dialog div.colours i.selected { + opacity: 1; +} +#Config_DeviceFlags_Icon_Update_Dialog div.icons { + text-align: center; + font-size: 30px; + background-color: #fff; + border: 1px solid #D1D1D1; + margin: 6px 0 14px 0; +} +#Config_DeviceFlags_Icon_Update_Dialog div.icons i { + width: 1.28571429em; + text-align: center; + cursor: pointer; + padding: 4px 0px; + color: #333; + opacity: 0.6; +} +#Config_DeviceFlags_Icon_Update_Dialog div.icons i:hover { + opacity: 0.9; + color: inherit; +} +#Config_DeviceFlags_Icon_Update_Dialog div.icons i.selected { + opacity: 1; + color: inherit; +} +#Config_DeviceFlags_BulkAssign_ModeDialog > div { + margin-top: 6px; + background-color: #fff; + line-height: 1.3em; + border: 1px solid #ddd; +} +#Config_DeviceFlags_BulkAssign_ModeDialog > div > div { + display: block; + padding: 4px; + cursor: pointer; +} +#Config_DeviceFlags_BulkAssign_ModeDialog > div > div:not(:last-child) { + border-bottom: 1px dashed #ddd; +} +#Config_DeviceFlags_BulkAssign_ModeDialog > div > div h5 { + font-size: 1.1em; + padding: 4px 0; +} +#Config_DeviceFlags_BulkAssign_ModeDialog > div > div i { + margin-right: 4px; +} +#Config_DeviceFlags_BulkAssign_ModeDialog > div > div.add:hover { + background-color: #eeffde; +} +#Config_DeviceFlags_BulkAssign_ModeDialog > div > div.add i { + color: #60A917; +} +#Config_DeviceFlags_BulkAssign_ModeDialog > div > div.override:hover { + background-color: #ffe1de; +} +#Config_DeviceFlags_BulkAssign_ModeDialog > div > div.override i { + color: #e51400; +} +#Config_DeviceFlags_BulkAssign_AssignDialog .brief { + margin: 0 0 8px 0; +} +#Config_DeviceFlags_BulkAssign_AssignDialog .brief .scopeDescBulkGenerate { + font-weight: 600; +} +#Config_DeviceFlags_BulkAssign_AssignDialog .brief div.examples { + margin: 8px auto; + width: 300px; +} +#Config_DeviceFlags_BulkAssign_AssignDialog .brief div.examples div { + margin: 2px 4px 2px 0; + width: 150px; + float: left; +} +#Config_DeviceFlags_BulkAssign_AssignDialog .brief div.examples div.example1 { + width: 100px; +} +#Config_DeviceFlags_BulkAssign_AssignDialog div.loading { + display: none; + padding: 40px 0; + text-align: center; +} +#Config_DeviceFlags_BulkAssign_AssignDialog div.loading i { + margin-right: 10px; + color: #1e6dab; +} +#Config_DeviceFlags_BulkAssign_AssignDialog #Config_DeviceFlags_BulkAssign_AssignDialog_DeviceSerialNumbers { + height: 200px; + margin-bottom: 8px; +} +#Config_DeviceFlags_BulkAssign_AssignDialog textarea { + width: calc(100% - .5em); + margin: 0; +} +#Config_DeviceFlags_BulkAssign_AssignDialog.loading > div.loading { + display: block; +} +#Config_DeviceFlags_BulkAssign_AssignDialog.loading > form { + display: none; +} +#DeviceFlag_Export #DeviceFlag_Export_Fields #DeviceFlag_Export_Fields_Defaults { + font-size: 0.75em; +} +#DeviceFlag_Export #DeviceFlag_Export_Fields th { + font-size: 1.05em; +} +#DeviceFlag_Export #DeviceFlag_Export_Fields th span { + margin-top: 4px; + font-size: 0.8em; +} +#DeviceFlag_Export_Download_Dialog { + padding-top: 20px; + text-align: center; +} +#DeviceFlag_Export_Download_Dialog h4 { + margin-bottom: 30px; +} +#DeviceFlag_Export_Download_Dialog a { + margin-bottom: 20px; +} +#DeviceFlag_Export_Exporting { + padding-top: 50px; + text-align: center; +} +#DeviceFlag_Export_Exporting i { + margin-right: 10px; + color: #1e6dab; +} #DocumentTemplate_BulkGenerate .actions { padding-bottom: 0.5em; text-align: right; diff --git a/Disco.Web/ClientSource/Style/Config.less b/Disco.Web/ClientSource/Style/Config.less index 8afac09a..c6099643 100644 --- a/Disco.Web/ClientSource/Style/Config.less +++ b/Disco.Web/ClientSource/Style/Config.less @@ -2165,6 +2165,222 @@ h1.Config_DocumentTemplates { } } +#Config_DeviceFlags_Show { + + #DeviceFlag_OnAssignmentExpression, #DeviceFlag_OnUnassignmentExpression { + height: 16px; + min-height: 16px; + overflow: hidden; + font-family: @FontFamilyMono; + } +} + +#Config_DeviceFlags_Index { + i { + width: 1.2857142857142858em; + text-align: center; + } +} + +#Config_DeviceFlags_Icon { + display: block; + margin: 0 0 10px 10px; +} + +#Config_DeviceFlags_Icon_Update_Dialog { + display: none; + + div.colours { + text-align: center; + font-size: 30px; + + i { + cursor: pointer; + padding: 1px; + opacity: .9; + + &:hover { + opacity: 1; + } + + &.selected { + opacity: 1; + } + } + } + + div.icons { + text-align: center; + font-size: 30px; + background-color: @white; + border: 1px solid @BackgroundColour; + margin: 6px 0 14px 0; + + i { + width: 1.2857142857142858em; + text-align: center; + cursor: pointer; + padding: 4px 0px; + color: @HeaderBackgroundColour; + opacity: .6; + + &:hover { + opacity: .9; + color: inherit; + } + + &.selected { + opacity: 1; + color: inherit; + } + } + } +} + +#Config_DeviceFlags_BulkAssign_ModeDialog { + & > div { + margin-top: 6px; + background-color: @white; + line-height: 1.3em; + border: 1px solid #ddd; + + & > div { + display: block; + padding: 4px; + cursor: pointer; + + &:not(:last-child) { + border-bottom: 1px dashed #ddd; + } + + h5 { + font-size: 1.1em; + padding: 4px 0; + } + + i { + margin-right: 4px; + } + + &.add { + &:hover { + background-color: hsv(hsvhue(@StatusSuccess), 13%, 100%); + } + + i { + color: @StatusSuccess; + } + } + + &.override { + &:hover { + background-color: hsv(hsvhue(@StatusError), 13%, 100%); + } + + i { + color: @StatusError; + } + } + } + } +} + +#Config_DeviceFlags_BulkAssign_AssignDialog { + .brief { + margin: 0 0 8px 0; + + .scopeDescBulkGenerate { + font-weight: @FontWeightBodyBold; + } + + div.examples { + margin: 8px auto; + width: 300px; + + div { + margin: 2px 4px 2px 0; + width: 150px; + float: left; + + &.example1 { + width: 100px; + } + } + } + } + + div.loading { + display: none; + padding: 40px 0; + text-align: center; + + i { + margin-right: 10px; + color: @StatusInformation; + } + } + + #Config_DeviceFlags_BulkAssign_AssignDialog_DeviceSerialNumbers { + height: 200px; + margin-bottom: 8px; + } + + textarea { + width: calc(~"100% - .5em"); + margin: 0; + } + + &.loading { + & > div.loading { + display: block; + } + + & > form { + display: none; + } + } +} + +#DeviceFlag_Export { + #DeviceFlag_Export_Fields { + #DeviceFlag_Export_Fields_Defaults { + font-size: .75em; + } + + th { + font-size: 1.05em; + + span { + margin-top: 4px; + font-size: .8em; + } + } + } +} + +#DeviceFlag_Export_Download_Dialog { + padding-top: 20px; + text-align: center; + + h4 { + margin-bottom: 30px; + } + + a { + margin-bottom: 20px; + } +} + +#DeviceFlag_Export_Exporting { + padding-top: 50px; + text-align: center; + + i { + margin-right: 10px; + color: @StatusInformation; + } +} + #DocumentTemplate_BulkGenerate { .actions { padding-bottom: .5em; diff --git a/Disco.Web/ClientSource/Style/Config.min.css b/Disco.Web/ClientSource/Style/Config.min.css index 7d337fdb..a34cd212 100644 --- a/Disco.Web/ClientSource/Style/Config.min.css +++ b/Disco.Web/ClientSource/Style/Config.min.css @@ -1 +1 @@ -.tableData{border:solid 1px #f4f4f4;border-collapse:collapse;}.tableData>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}.tableData>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}.tableData>thead>tr>th,.tableData>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}.tableData>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}.tableData>tfoot>tr>th,.tableData>tfoot>tr>td{background-color:#f4f4f4;}.tableDataDark{border:solid 1px #d8d8d8;border-collapse:collapse;}.tableDataDark td{border:solid 1px #d8d8d8;background-color:#fff;}.tableDataDark th{background-color:#eee;border:solid 1px #d8d8d8;}.tableDataContainer{background-color:#fff;}.tableDataVertical{border:solid 1px #f4f4f4;border-collapse:collapse;}.tableDataVertical>tbody>tr:nth-child(odd){background-color:#f4f4f4;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;}#updateAvailableContainer{float:right;border:1px dashed #ddd;background-color:#fff;font-size:.6em;line-height:1em;padding:10px 10px 4px 70px;text-align:right;height:50px;}#updateAvailableContainer i{position:absolute;display:block;height:64px;width:64px;vertical-align:middle;margin-left:-70px;font-size:50px;color:#e51400;}#updateAvailableContainer a.button{font-size:12px;margin-top:8px;}.Config_HideAdvanced .Config_HideAdvanced_Item{display:none;}.Config_LinkedGroup_Instance{margin:4px 0 8px 4px;padding:4px 0 4px 6px;border-left:4px solid #ccc;background-color:#fff;}.Config_LinkedGroup_Instance div.code{margin-left:2px;}#Config_LinkedGroup_Dialog h3{margin-bottom:6px;}#Config_LinkedGroup_Dialog table.input{margin-top:12px;}#Config_LinkedGroup_Dialog table.input th{text-align:right;}#expressionEditor #expressionEditorExceptionContainer{display:none;border:1px dashed #ff9696;background-color:#ffd8d8;margin:10px 0;padding:10px;}#expressionEditor #expressionEditorContainer{border:1px solid #1e6dab;background-color:#f4f4f4;height:100px;}.expressionTree span.dynatree-node span.dynatree-icon{background-image:url(data:image/png;base64,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);background-position-y:0;}.expressionTree span.dynatree-node.object span.dynatree-icon{background-position-x:0;}.expressionTree span.dynatree-node.parameter span.dynatree-icon{background-position-x:-16px;}.expressionTree span.dynatree-node.function span.dynatree-icon{background-position-x:-32px;}.expressionTree span.dynatree-node.property span.dynatree-icon{background-position-x:-48px;}table.expressionsTable{border:solid 1px #f4f4f4;border-collapse:collapse;}table.expressionsTable>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}table.expressionsTable>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}table.expressionsTable>thead>tr>th,table.expressionsTable>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}table.expressionsTable>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}table.expressionsTable>tfoot>tr>th,table.expressionsTable>tfoot>tr>td{background-color:#f4f4f4;}table.expressionsTable td.parseError{background-color:#ffd8d8;}#AttachmentType_FilterExpression{width:375px;}#deviceComponents{border:solid 1px #f4f4f4;border-collapse:collapse;}#deviceComponents>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}#deviceComponents>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}#deviceComponents>thead>tr>th,#deviceComponents>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}#deviceComponents>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}#deviceComponents>tfoot>tr>th,#deviceComponents>tfoot>tr>td{background-color:#f4f4f4;}#deviceComponents tr th.actions{width:20px;}#deviceComponents tr input.description{width:300px;}#deviceComponents tr input.cost{width:75px;}#deviceComponents tr i.remove{font-size:1.6em;color:#e51400;cursor:pointer;opacity:.8;}#deviceComponents tr i.remove:hover{opacity:1;}#deviceComponents tr i.fa-list-alt{color:#1e6dab;font-size:1.6em;cursor:pointer;}#deviceComponents tr i.fa-asterisk{color:#fa6800;font-size:1em;left:10px;top:3px;cursor:pointer;}#deviceComponents tr input.updating{background-position:right center;background-repeat:no-repeat;background-image:url(data:image/gif;base64,R0lGODlhEAALAPQAAP///zNah+Hm7dng6O7x9DddiTNah1d3nJqtw3+Xs8fS3k5vlm6JqaGzx4KatcrU4FFymDZciHGMq+ru8t/l7Pb3+V9+oeLo7vT2+MTP3LLB0dTc5fHz9gAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCwAAACwAAAAAEAALAAAFLSAgjmRpnqSgCuLKAq5AEIM4zDVw03ve27ifDgfkEYe04kDIDC5zrtYKRa2WQgAh+QQJCwAAACwAAAAAEAALAAAFJGBhGAVgnqhpHIeRvsDawqns0qeN5+y967tYLyicBYE7EYkYAgAh+QQJCwAAACwAAAAAEAALAAAFNiAgjothLOOIJAkiGgxjpGKiKMkbz7SN6zIawJcDwIK9W/HISxGBzdHTuBNOmcJVCyoUlk7CEAAh+QQJCwAAACwAAAAAEAALAAAFNSAgjqQIRRFUAo3jNGIkSdHqPI8Tz3V55zuaDacDyIQ+YrBH+hWPzJFzOQQaeavWi7oqnVIhACH5BAkLAAAALAAAAAAQAAsAAAUyICCOZGme1rJY5kRRk7hI0mJSVUXJtF3iOl7tltsBZsNfUegjAY3I5sgFY55KqdX1GgIAIfkECQsAAAAsAAAAABAACwAABTcgII5kaZ4kcV2EqLJipmnZhWGXaOOitm2aXQ4g7P2Ct2ER4AMul00kj5g0Al8tADY2y6C+4FIIACH5BAkLAAAALAAAAAAQAAsAAAUvICCOZGme5ERRk6iy7qpyHCVStA3gNa/7txxwlwv2isSacYUc+l4tADQGQ1mvpBAAIfkECQsAAAAsAAAAABAACwAABS8gII5kaZ7kRFGTqLLuqnIcJVK0DeA1r/u3HHCXC/aKxJpxhRz6Xi0ANAZDWa+kEAA7AAAAAAAAAAAA);}#organisationAddresses{font-size:.9em;}#organisationAddresses tr:not(:last-child){border-bottom:1px dashed #aaa;}#organisationAddresses th{padding:2px;font-weight:600;width:200px;}#organisationAddresses td{padding:2px;vertical-align:middle;}#organisationAddresses tr:nth-child(even){background-color:#fff;}#organisationAddresses i.fa{font-size:1.7em;cursor:pointer;}#organisationAddresses i.fa.delete{color:#e51400;opacity:.8;}#organisationAddresses i.fa.delete:hover{opacity:1;}#organisationAddresses i.fa.edit{color:#1e6dab;}ul#loggingEntries{overflow:auto;max-height:230px;padding-left:20px;}table.deviceProfileTable th.name{width:300px;}table.deviceProfileTable th.type{width:120px;}table.deviceProfileTable th.deviceCount{width:120px;}#configurationDeviceProfileShow #displayComputerNameTemplate{margin:0 0 6px 0;}#configurationDeviceProfileShow #displayOrganisationalUnit{margin:0 0 6px 0;}#dialogComputerNameTemplate #ComputerNameTemplate{box-sizing:border-box;height:48px;width:100%;font-family:Consolas,"Courier New",monospace;}#dialogOrganisationalUnit .enforceOrganisationalUnit{line-height:2.2em;}#dialogOrganisationalUnit .organisationalUnitTree{height:380px;}#dialogOrganisationalUnit .organisationalUnitTree span.fancytree-node{padding:1px;border:0;}#dialogOrganisationalUnit .organisationalUnitTree span.fancytree-node>span.fancytree-icon{background:none;display:inline-block;font-family:FontAwesome;font-size:1.2em;width:14px;}#dialogOrganisationalUnit .organisationalUnitTree span.fancytree-ico-ef>span.fancytree-icon:before{color:#1e6dab;font-size:1em;content:"";}#dialogOrganisationalUnit .organisationalUnitTree span.fancytree-ico-cf>span.fancytree-icon:before{color:#1e6dab;font-size:1em;content:"";}#dialogOrganisationalUnit .organisationalUnitTree ul.fancytree-container>li>span>span.fancytree-icon:before{color:#fa6800;font-size:1em;content:"";}#dialogOrganisationalUnit .organisationalUnitTree span.fancytree-node.fancytree-selected{font-style:normal;background:none;}#Config_System_AD_SearchScope_Dialog_Loading,#dialogOrganisationalUnit_Loading{text-align:center;padding:40px 0;}#configurationDocumentTemplateExpressionBrowser{padding-right:275px;background-image:url(data:image/png;base64,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);background-position:right top;background-repeat:no-repeat;}#Logging_Task_Status{width:520px;margin:40px auto 60px auto;}#Logging_Task_Status th.process{text-align:left;font-weight:600;background-color:#f4f4f4;min-height:30px;vertical-align:middle;}#Logging_Task_Status td.description{font-size:.9em;min-height:60px;}#Logging_Task_Status td.progress{padding:8px 10px;}#Logging_Task_Status td.finishedMessage i{display:none;}#Logging_Task_Status td.finishedRedirect{position:relative;}#Logging_Task_Status td.finishedRedirect i{color:#1e6dab;position:absolute;right:10px;top:calc(57% - .5em);display:inline-block;}#Logging_Task_Status td.exception{background-color:#ffd8d8;}div.logEventsViewport{border:1px solid #bbb;-moz-border-radius:4px 4px 0 0;-webkit-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}div.logEventsViewport div.logEventsViewportContainer{overflow-y:auto;overflow-x:hidden;}div.logEventsViewport div.logEventsViewportContainer .logEventsViewportNoLogs{padding-top:20px;text-align:center;font-style:italic;}div.logEventsViewport table.logEventsViewport{padding:0;margin:0;background-color:#bbb;table-layout:fixed;}div.logEventsViewport table.logEventsViewport>thead>tr{background-color:#eee;}div.logEventsViewport table.logEventsViewport>thead>tr>th{padding:4px 2px;font-weight:600;border-bottom:1px solid #bbb;}div.logEventsViewport table.logEventsViewport>thead>tr>th.icon{width:20px;}div.logEventsViewport table.logEventsViewport>thead>tr>th.timestamp{width:155px;}div.logEventsViewport table.logEventsViewport>thead>tr>th.eventType{width:180px;}div.logEventsViewport table.logEventsViewport>tbody>tr{background-color:#fff;}div.logEventsViewport table.logEventsViewport>tbody>tr:nth-child(even){background-color:#eee;}div.logEventsViewport table.logEventsViewport>tbody>tr>td{padding:2px;}div.logEventsViewport table.logEventsViewport>tbody>tr>td.icon{width:20px;vertical-align:middle;text-align:center;}div.logEventsViewport table.logEventsViewport>tbody>tr>td.icon>i{display:block;font-size:1.2em;}div.logEventsViewport table.logEventsViewport>tbody>tr>td.icon>i.fa-info-circle{color:#1e6dab;}div.logEventsViewport table.logEventsViewport>tbody>tr>td.icon>i.fa-exclamation-triangle{color:#f0a30a;}div.logEventsViewport table.logEventsViewport>tbody>tr>td.icon>i.fa-exclamation-circle{color:#e51400;}div.logEventsViewport table.logEventsViewport>tbody>tr>td.timestamp{width:155px;}div.logEventsViewport table.logEventsViewport>tbody>tr>td.eventType{width:180px;}div.logEventsViewport table.logEventsViewport>tbody>tr>td.message{white-space:pre-wrap;}#enrolStatus #sessions .session{width:280px;padding:4px 4px 4px 72px;margin:8px;border:5px solid #efefef;-moz-border-radius:0 20px 0 0;-webkit-border-radius:0 20px 0 0;border-radius:0 20px 0 0;background-color:#f5f5f5;background-repeat:no-repeat,no-repeat;background-position:36px 36px,4px 4px;-moz-background-size:32px,64px;-o-background-size:32px,64px;-webkit-background-size:32px,64px;background-size:32px,64px;min-height:72px;cursor:pointer;}#enrolStatus #sessions .session>h3{padding-bottom:3px;border-bottom:1px dashed #ccc;}#enrolStatus #sessions .session>h3 span.details{font-size:.8em;}#enrolStatus #sessions .session>p.sessionStart{color:#888;font-size:.8em;margin-bottom:2px;}#enrolStatus #sessions .session>p.sessionStatus{font-size:.9em;height:1.6em;overflow:hidden;margin-bottom:3px;}#enrolStatus #sessions .session:hover{border:5px solid #6c7a87;background-color:#dfe1f8;}#dialogSession .sessionHeader{width:400px;float:left;padding:0 0 0 134px;background-repeat:no-repeat,no-repeat;background-position:96px 96px,0 0;-moz-background-size:32px,128px;-o-background-size:32px,128px;-webkit-background-size:32px,128px;background-size:32px,128px;min-height:134px;}#dialogSession .sessionHeader>h2{padding-bottom:0;}#dialogSession .sessionHeader>table{margin-top:4px;}#dialogSession .sessionHeader>table th{width:128px;text-align:right;}#dialogSession .sessionHeader>table td,#dialogSession .sessionHeader>table th{padding:1px 2px;}#dialogSession .sessionProgress{width:320px;float:right;text-align:right;}#dialogSession .sessionProgress>p.sessionStart{color:#888;margin-bottom:2px;}#dialogSession .sessionProgress>p.sessionStatus{height:1.6em;overflow:hidden;margin-bottom:3px;}#dialogSession .sessionInfoContainer>div{float:left;width:428px;overflow:auto;}#dialogSession .sessionInfoContainer .sessionInfoMessages{height:374px;border:1px solid #bbb;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;background-color:#fff;}#dialogSession .sessionInfoContainer .sessionInfoMessages div.logEventsViewportContainer{overflow:auto;}#dialogSession .sessionInfoContainer .sessionInfoMessages div.logEventsViewportContainer .logEventsViewportNoLogs{padding-top:20px;text-align:center;font-style:italic;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport{padding:0;margin:0;background-color:#fff;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>thead>tr{background-color:#eee;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>thead>tr>th{padding:4px 2px;font-weight:600;border-bottom:1px solid #bbb;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>thead>tr>th.icon{width:20px;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>thead>tr>th.timestamp{width:155px;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>thead>tr>th.eventType{width:180px;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>tbody>tr{background-color:#fff;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>tbody>tr:nth-child(even){background-color:#eee;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>tbody>tr>td{padding:2px;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>tbody>tr>td.icon{width:20px;vertical-align:middle;text-align:center;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>tbody>tr>td.icon>i{display:block;font-size:1.2em;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>tbody>tr>td.icon>i.fa-info-circle{color:#1e6dab;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>tbody>tr>td.icon>i.fa-exclamation-triangle{color:#f0a30a;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>tbody>tr>td.icon>i.fa-exclamation-circle{color:#e51400;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>tbody>tr>td.timestamp{width:155px;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>tbody>tr>td.eventType{width:180px;}#dialogSession .sessionInfoContainer .sessionInfoConsole{margin-left:6px;background-color:#222;color:#0f0;font-family:Consolas,"Courier New",monospace;border:4px solid #ccc;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;padding:2px;height:364px;}#Config_DocumentTemplates_Show>div.form>table>tbody>tr>th{width:140px;}#Config_DocumentTemplates_Show #DocumentTemplate_FilterExpression,#Config_DocumentTemplates_Show #DocumentTemplate_OnGenerateExpression,#Config_DocumentTemplates_Show #DocumentTemplate_OnImportAttachmentExpression{height:16px;min-height:16px;overflow:hidden;font-family:Consolas,"Courier New",monospace;}#Config_DocumentTemplates_Show #Config_DocumentTemplates_Scope_Button{margin-top:4px;}#Config_DocumentTemplates_Scope_Dialog div.input{margin:14px 10px 20px;}#Config_DocumentTemplates_TemplatePdf_Dialog div{text-align:center;}#Config_DocumentTemplates_TemplatePdf_Dialog div input{margin:16px 0;}#Config_DocumentTemplates_JobSubTypes{border:1px dashed #d8d8d8;background-color:#fff;padding:4px;margin-top:6px;}#Config_DocumentTemplates_JobSubTypes>h4{margin-bottom:4px;}#Config_DocumentTemplates_JobSubTypes #Config_DocumentTemplates_JobSubTypes_Update{margin-top:4px;}#Config_DocumentTemplates_JobSubTypes_Update_Dialog #Config_DocumentTemplates_JobSubTypes_Update_Dialog_Types{margin:0 0 8px 0;}#Config_DocumentTemplates_JobSubTypes_Update_Dialog .jobTypes{padding:6px 0;}#Config_DocumentTemplates_JobSubTypes_Update_Dialog .jobTypes .jobSubTypes{background-color:#f2f2f2;border-left:4px solid #d8d8d8;padding:4px 0 4px 8px;margin:4px 0 0 6px;}#Config_DocumentTemplates_JobSubTypes_Update_Dialog .checkboxBulkSelectContainer{font-size:.8em;}#DocumentTemplate_OnImportUserFlagRules_AddDialog .distribute-evenly{display:flex;justify-content:space-around;margin:1em 0;}#DocumentTemplate_OnImportUserFlagRules_AddDialog textarea{width:99%;}#DocumentTemplate_OnImportUserFlagRules_AddDialog .mt-1{margin-top:1em;}.dialog-bulk-generate .brief{margin:0 0 8px 0;}.dialog-bulk-generate .brief .scopeDescBulkGenerate{font-weight:600;}.dialog-bulk-generate .brief div.examples{margin:8px auto;width:360px;}.dialog-bulk-generate .brief div.examples div{margin:2px 4px 2px 0;width:230px;float:left;}.dialog-bulk-generate .brief div.examples div.example1{width:100px;}.dialog-bulk-generate textarea{width:calc(100% - .5em);height:200px;margin:0 auto;}.dialog-bulk-generate .sub{margin-top:.75em;}#Config_DocumentTemplates_Show_DownloadBulk_Dialog{padding-top:20px;text-align:center;}h1.Config_DocumentTemplates{margin:10px 0 6px;}#Config_DocumentTemplatePackages_Show>div.form>table>tbody>tr>th{width:140px;}#Config_DocumentTemplatePackages_Show #Package_FilterExpression,#Config_DocumentTemplatePackages_Show #Package_OnGenerateExpression{height:16px;min-height:16px;overflow:hidden;font-family:Consolas,"Courier New",monospace;}#Config_DocumentTemplatePackages_Show #Config_DocumentTemplatePackages_Scope_Button{margin-top:4px;}#Config_DocumentTemplatePackages_Show #Config_DocumentTemplatePackage_List{list-style-type:decimal;list-style-position:inside;background-color:#f2f2f2;border:1px solid #d8d8d8;}#Config_DocumentTemplatePackages_Show #Config_DocumentTemplatePackage_List li{padding:6px 8px;}#Config_DocumentTemplatePackages_Show #Config_DocumentTemplatePackage_List li:not(:first-child){border-top:1px dashed #d8d8d8;}#Config_DocumentTemplatePackages_Show #Config_DocumentTemplatePackage_List li .id{font-family:Consolas,"Courier New",monospace;float:right;}#Config_DocumentTemplatePackages_Scope_Dialog div.input{margin:14px 10px 20px;}#Config_DocumentTemplatePackages_JobSubTypes{border:1px dashed #d8d8d8;background-color:#fff;padding:4px;margin-top:6px;}#Config_DocumentTemplatePackages_JobSubTypes>h4{margin-bottom:4px;}#Config_DocumentTemplatePackages_JobSubTypes #Config_DocumentTemplatePackages_JobSubTypes_Update{margin-top:4px;}#Config_DocumentTemplatePackages_JobSubTypes_Update_Dialog #Config_DocumentTemplatePackages_JobSubTypes_Update_Dialog_Types{margin:0 0 8px 0;}#Config_DocumentTemplatePackages_JobSubTypes_Update_Dialog .jobTypes{padding:6px 0;}#Config_DocumentTemplatePackages_JobSubTypes_Update_Dialog .jobTypes .jobSubTypes{background-color:#f2f2f2;border-left:4px solid #d8d8d8;padding:4px 0 4px 8px;margin:4px 0 0 6px;}#Config_DocumentTemplatePackages_JobSubTypes_Update_Dialog .checkboxBulkSelectContainer{font-size:.8em;}#Config_DocumentTemplatePackages_Templates_Dialog h3{margin-bottom:4px;}#Config_DocumentTemplatePackages_Templates_Dialog>div{width:374px;float:left;}#Config_DocumentTemplatePackages_Templates_Dialog>div:first-child{margin-right:20px;}#Config_DocumentTemplatePackages_Templates_Dialog .templates_connected{min-height:200px;}#Config_DocumentTemplatePackages_Templates_Dialog ol{list-style-type:decimal;padding-left:24px;border:1px solid #d8d8d8;background-color:#f2f2f2;}#Config_DocumentTemplatePackages_Templates_Dialog li{background-color:#fff;border:1px solid #d8d8d8;margin:4px;padding:2px 4px;-moz-box-shadow:0 0 5px rgba(209,209,209,.5);-webkit-box-shadow:0 0 5px rgba(209,209,209,.5);box-shadow:0 0 5px rgba(209,209,209,.5);cursor:default;}#Config_DocumentTemplatePackages_Templates_Dialog li:hover{background-color:#cddbec;border-color:#1e6dab;}#Config_DocumentTemplatePackages_Templates_Dialog li .id{font-family:Consolas,"Courier New",monospace;color:#888;float:right;font-size:.9em;}#importStatus #sessions .session{padding:4px;margin-bottom:10px;border:1px solid #efefef;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;background-color:#f5f5f5;min-height:72px;}#importStatus #sessions .session .sessionLeftPane{width:48%;float:left;}#importStatus #sessions .session .sessionLeftPane>h3{padding-bottom:3px;border-bottom:1px dashed #ccc;}#importStatus #sessions .session .sessionLeftPane>h3 span.details{font-size:.8em;}#importStatus #sessions .session .sessionRightPane{width:48%;float:right;text-align:right;}#importStatus #sessions .session .sessionRightPane>p.sessionStart{color:#888;font-size:.8em;margin-bottom:2px;}#importStatus #sessions .session .sessionRightPane>p.sessionStatus{font-size:.9em;height:1.6em;overflow:hidden;margin-bottom:3px;}#importStatus #sessions .session .sessionPages>.sessionPage{min-height:56px;min-width:256px;float:left;margin:3px 0 3px 0;padding:170px 0 0 0;background-color:#fff;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;border:1px solid #eee;background-repeat:no-repeat;background-position:center top;}#importStatus #sessions .session .sessionPages>.sessionPage>.sessionPageDetails{height:84px;padding:2px 4px 0 4px;background-color:rgba(255,255,255,.8);}#importStatus #sessions .session .sessionPages>.sessionPage>.sessionPageDetails p.sessionStatus{font-size:.9em;height:1.6em;margin-bottom:3px;}#importStatus #sessions .session .sessionInfoMessages{margin-top:6px;border:1px solid #bbb;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;background-color:#fff;}#importStatus #sessions .session .sessionInfoMessages div.logEventsViewportContainer{max-height:220px;overflow:auto;}#importStatus #sessions .session .sessionInfoMessages div.logEventsViewportContainer .logEventsViewportNoLogs{padding-top:20px;text-align:center;font-style:italic;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport{padding:0;margin:0;background-color:#fff;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>thead>tr{background-color:#eee;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>thead>tr>th{padding:4px 2px;font-weight:600;border-bottom:1px solid #bbb;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>thead>tr>th.icon{width:20px;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>thead>tr>th.timestamp{width:155px;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>thead>tr>th.eventType{width:180px;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>tbody>tr{background-color:#fff;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>tbody>tr:nth-child(even){background-color:#eee;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>tbody>tr>td{padding:2px;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>tbody>tr>td.icon{width:20px;vertical-align:middle;text-align:center;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>tbody>tr>td.icon>i{display:block;font-size:1.2em;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>tbody>tr>td.icon>i.fa-info-circle{color:#1e6dab;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>tbody>tr>td.icon>i.fa-exclamation-triangle{color:#f0a30a;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>tbody>tr>td.icon>i.fa-exclamation-circle{color:#e51400;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>tbody>tr>td.timestamp{width:155px;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>tbody>tr>td.eventType{width:180px;}#undetectedPagesContainer #undetectedPages{list-style:none;margin:0;padding:0;}#undetectedPagesContainer #undetectedPages>.undetectedPage{float:left;margin:4px;border:1px solid #f4f4f4;background-color:hsl(0,0%,98.5%);height:256px;width:256px;background-position:top center;background-repeat:no-repeat;cursor:pointer;}#undetectedPagesContainer #undetectedPages>.undetectedPage>.pageDetails{margin-top:232px;height:24px;text-align:center;}#undetectedPagesContainer #undetectedPages>.undetectedPage:hover{border:1px solid #d8d8d8;background-color:#f4f4f4;}#undetectedPageDialog>.pagePreview{height:700px;max-height:700px;background-position:top center;background-repeat:no-repeat;background-size:contain;}#undetectedPageDialog .actions{border-top:1px solid #d1d1d1;padding-top:8px;margin-top:8px;text-align:right;}.deviceBatches #DeviceBatch_PurchaseDetails_Container{padding:5px 0 5px 5px;}.deviceBatches #DeviceBatch_PurchaseDetails{width:570px;height:200px;}.deviceBatches #DeviceBatch_WarrantyDetails_Container{padding:5px 0 5px 5px;}.deviceBatches #DeviceBatch_WarrantyDetails{width:570px;height:200px;}.deviceBatches #DeviceBatch_InsuranceDetails_Container{padding:5px 0 5px 5px;}.deviceBatches #DeviceBatch_InsuranceDetails{width:570px;height:200px;}.deviceBatches #DeviceBatch_Comments{width:570px;height:200px;}.deviceBatches #DeviceBatch_Attachments{border:1px solid #ccc;background-color:#fff;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput{position:relative;height:200px;overflow:auto;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a{display:block;float:left;height:48px;width:221px;padding:2px;margin:2px;font-size:.95em;border:1px solid #fff;color:#000;text-decoration:none;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a span.comments,.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a span.author,.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a span.timestamp{display:block;float:left;width:168px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;height:16px;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a span.author{color:#888;width:150px;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a span.timestamp{color:#888;font-style:italic;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a span.icon{display:block;float:left;height:48px;width:48px;margin-right:2px;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a span.icon img{height:48px;width:48px;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a span.icon img.loading{display:none;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a:hover{background-color:#ededed;border:1px solid #ccc;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a:hover span.remove{opacity:.5;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a span.remove{font-size:1.2em;color:#e51400;margin-left:2px;cursor:pointer;opacity:0;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a span.remove:hover{opacity:1;}.deviceBatches #DeviceBatch_Attachments.cannotAddAttachments div.attachmentOutput{height:250px;}.deviceBatches #DeviceBatch_Attachments div.attachmentInput{border-top:1px solid #ccc;height:40px;background-color:#fff;padding:5px;}.deviceBatches #DeviceBatch_Attachments div.attachmentInput span.action{color:#333;display:block;margin:0 4px 0 0;font-size:1.5em;cursor:pointer;float:right;border:1px solid #fff;padding:.5em;}.deviceBatches #DeviceBatch_Attachments div.attachmentInput span.action:hover{color:#335a87;background-color:#ededed;border:1px solid #ccc;}.deviceBatches #DeviceBatch_Attachments div.attachmentInput span.action.disabled{color:rgba(51,51,51,.2);cursor:default;}.deviceBatches #DeviceBatch_Attachments div.attachmentInput span.action.disabled:hover{color:rgba(51,51,51,.2);background-color:inherit;border:1px solid #fff;}#plugins .pageMenuArea a>h3{display:inline;color:#335a87;}#plugins .pageMenuArea a>h3:hover{color:#5e8cc2;}#plugins .pageMenuArea .pageMenuBlurb{padding-left:18px;}#plugins .pageMenuArea .pageMenuBlurb i{font-size:.9em;}#plugins #pageMenu td .pageMenuArea:not(:last-child){padding-bottom:5px;margin-bottom:10px;}#plugins #pageMenu td .pageMenuArea>a,#plugins #pageMenu td .pageMenuArea>h3{color:#333;}#plugins #pageMenu td .pageMenuArea>a:hover,#plugins #pageMenu td .pageMenuArea>h3:hover{color:#335a87;}#dialogUninstallPlugins #uninstallPlugin{margin:.5em 0;}#dialogUninstallPlugins #uninstallPluginData{margin:.5em 0;}#dialogUninstallPluginConfirm #uninstallPluginConfirm{text-align:center;margin:1em 0 .5em 0;}#dialogUninstallPluginConfirm #uninstallPluginDataConfirm{margin-top:1em;}#pluginLibraryHeading{float:right;}#pluginLibrary #pluginLibraryGroups{width:900px;margin:0 auto;column-count:2;}#pluginLibrary #pluginLibraryGroups>div{display:inline-block;}#pluginLibrary #pluginLibraryGroups div.form>table{margin:0 10px 10px 4px;width:calc(100% - 14px);}#pluginLibrary .pluginItem .pluginItemBlurb{margin:8px 0 8px 2px;padding:0 4px;border-left:4px solid #d1d1d1;}#pluginLibrary .pluginItem .pluginItemBlurb *{padding:0;margin:0;}#pluginLibrary .pluginItem .pageMenuBlurb i{font-size:.9em;}#pluginLibrary .pluginItem>h2:first-child{min-height:22px;}#pluginLibrary .pluginItem>h2:first-child i{font-size:.9em;padding-right:4px;color:#333;}#pluginLibrary .pluginItem>h2:first-child a{float:right;font-size:12px;}#dialogInstallPlugin div.info-box{margin-top:1em;}#dialogUploadPlugin #pluginFile{margin:1em 0 1em 6px;}#Config_AuthRoles_Show #Config_AuthRoles_Claims_Tree span.fancytree-node{padding:1px;border:0;}#Config_AuthRoles_Show #Config_AuthRoles_Claims_Tree span.fancytree-node>span.fancytree-icon{background:none;display:inline-block;font-family:FontAwesome;font-size:1.2em;width:14px;}#Config_AuthRoles_Show #Config_AuthRoles_Claims_Tree span.fancytree-ico-ef>span.fancytree-icon:before{color:#9e9e9e;font-size:1em;content:"";}#Config_AuthRoles_Show #Config_AuthRoles_Claims_Tree span.fancytree-ico-cf>span.fancytree-icon:before{color:#9e9e9e;font-size:1em;content:"";}#Config_AuthRoles_Show #Config_AuthRoles_Claims_Tree span.fancytree-ico-c>span.fancytree-icon:before{color:#e51400;content:"";}#Config_AuthRoles_Show #Config_AuthRoles_Claims_Tree span.fancytree-ico-c.fancytree-selected>span.fancytree-icon:before{color:#60a917;content:"";}#Config_AuthRoles_Show #Config_AuthRoles_Claims_Tree span.fancytree-node.fancytree-selected{font-style:normal;background:none;}#Config_AuthRoles_Subjects li,#Config_AuthRoles_Subjects_Update_Dialog_List li{padding:4px 0 4px 4px;}#Config_AuthRoles_Subjects li i.fa-user,#Config_AuthRoles_Subjects_Update_Dialog_List li i.fa-user,#Config_AuthRoles_Subjects li i.fa-users,#Config_AuthRoles_Subjects_Update_Dialog_List li i.fa-users{min-width:22px;}#Config_AuthRoles_Subjects_Update_Dialog{display:none;}#Config_AuthRoles_Subjects_Update_Dialog #Config_AuthRoles_Subjects_Update_Dialog_ListContainer{height:280px;overflow-y:auto;background-color:#fff;border:1px solid #d8d8d8;}#Config_AuthRoles_Subjects_Update_Dialog #Config_AuthRoles_Subjects_Update_Dialog_None{padding-top:15px;display:block;text-align:center;}#Config_AuthRoles_Subjects_Update_Dialog #Config_AuthRoles_Subjects_Update_Dialog_AddContainer{padding-top:10px;padding-left:10px;}#Config_AuthRoles_Subjects_Update_Dialog #Config_AuthRoles_Subjects_Update_Dialog_List li{cursor:pointer;}#Config_AuthRoles_Subjects_Update_Dialog #Config_AuthRoles_Subjects_Update_Dialog_List li:hover{background-color:#f4f4f4;}#Config_AuthRoles_Subjects_Update_Dialog #Config_AuthRoles_Subjects_Update_Dialog_List li:hover .remove{opacity:.8;}#Config_AuthRoles_Subjects_Update_Dialog #Config_AuthRoles_Subjects_Update_Dialog_List li .remove{margin-top:2px;padding-right:6px;float:right;cursor:pointer;opacity:0;color:#e51400;font-size:1.3em;}#Config_AuthRoles_Subjects_Update_Dialog #Config_AuthRoles_Subjects_Update_Dialog_List li .remove:hover{opacity:1;}#Config_ReportPrefs{margin-top:10px;}#Config_ReportPrefs #Config_ReportPrefs_Preview{float:right;width:150px;height:80px;border:1px solid #444;font-size:4px;color:#fff;overflow:hidden;text-transform:uppercase;}#Config_ReportPrefs #Config_ReportPrefs_Preview .heading{height:6px;padding-left:3px;overflow:hidden;background-color:#333;}#Config_ReportPrefs #Config_ReportPrefs_Preview .column-heading{float:left;width:calc(33% - 4px);padding-left:2px;margin:1px 0 0 2px;}#Config_ReportPrefs #Config_ReportPrefs_Preview .column{height:100%;float:left;width:calc(33% - 2px);margin-left:2px;overflow:hidden;background:rgba(255,255,255,.2);}#Config_ReportPrefs #Config_ReportPrefs_Preview .column span{display:block;height:4px;margin:1px;background-color:#fff;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-default{background:linear-gradient(to bottom,#165180,#1e6dab) left top repeat-x #1e6dab;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-default .column span.alert{background-color:#e51400;color:#fff;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-default-soft{background:linear-gradient(to bottom,#165180,#1e6dab) left top repeat-x #1e6dab;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-default-soft .column span.alert{background-color:#f0e277;color:#000;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-green{background:linear-gradient(to bottom,#477c11,#60a917) left top repeat-x #60a917;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-green .column span.alert{background-color:#e51400;color:#fff;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-green-soft{background:linear-gradient(to bottom,#477c11,#60a917) left top repeat-x #60a917;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-green-soft .column span.alert{background-color:#e5cc11;color:#000;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-violet{background:linear-gradient(to bottom,#80c,#a0f) left top repeat-x #a0f;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-violet .column span.alert{background-color:#e51400;color:#fff;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-violet-soft{background:linear-gradient(to bottom,#80c,#a0f) left top repeat-x #a0f;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-violet-soft .column span.alert{background-color:#f0e277;color:#000;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-magenta{background:linear-gradient(to bottom,#a50058,#d80073) left top repeat-x #d80073;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-magenta .column span.alert{background-color:#1681b4;color:#fff;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-magenta-soft{background:linear-gradient(to bottom,#a50058,#d80073) left top repeat-x #d80073;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-magenta-soft .column span.alert{background-color:#85cdf0;color:#000;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-crimson{background:linear-gradient(to bottom,#6f0019,#a20025) left top repeat-x #a20025;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-crimson .column span.alert{background-color:#b0cc22;color:#000;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-crimson-soft{background:linear-gradient(to bottom,#6f0019,#a20025) left top repeat-x #a20025;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-crimson-soft .column span.alert{background-color:#cee077;color:#000;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-amber{background:linear-gradient(to bottom,#bf8208,#f0a30a) left top repeat-x #f0a30a;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-amber .column span.alert{background-color:#0050ef;color:#fff;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-amber-soft{background:linear-gradient(to bottom,#bf8208,#f0a30a) left top repeat-x #f0a30a;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-amber-soft .column span.alert{background-color:#bbd0fb;color:#000;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-brown{background:linear-gradient(to bottom,#5c401f,#825a2c) left top repeat-x #825a2c;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-brown .column span.alert{background-color:#e3c800;color:#000;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-brown-soft{background:linear-gradient(to bottom,#5c401f,#825a2c) left top repeat-x #825a2c;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-brown-soft .column span.alert{background-color:#f0e277;color:#000;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-steel{background:linear-gradient(to bottom,#4e5d6c,#647689) left top repeat-x #647689;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-steel .column span.alert{background-color:#e51400;color:#fff;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-steel-soft{background:linear-gradient(to bottom,#4e5d6c,#647689) left top repeat-x #647689;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-steel-soft .column span.alert{background-color:#f0e277;color:#000;}#Config_ReportPrefs_Builder .report{margin-bottom:10px;}#Config_ReportPrefs_Builder .report ul{margin-left:10px;}#Config_ReportPrefs_Builder .theme{margin-bottom:10px;}#Config_ReportPrefs_Builder .theme>select{margin-left:10px;}#Config_ReportPrefs_Builder .filter>select{margin-left:10px;}#Config_ReportPrefs_Builder .filter div.options{display:none;background-color:#fff;border:1px dashed #ccc;margin-top:4px;margin-left:15px;padding:2px 6px;}#Config_ReportPrefs_Builder .filter div.options .method{margin-top:4px;margin-bottom:8px;}#Config_ReportPrefs_Builder .filter div.options .method label{margin-right:14px;}#Config_ReportPrefs_Builder_Buttonpane{padding-right:.3em;}#Config_ReportPrefs_Builder_Buttonpane textarea{float:left;font-family:Consolas,"Courier New",monospace;color:#333;width:calc(100% - 1.2em - 10px);border:1px solid #ccc;white-space:pre;min-height:0;}#Config_ReportPrefs_Builder_Buttonpane i{float:right;cursor:pointer;margin:.3em .2em 0 0;color:#335a87;}#Config_ReportPrefs_Builder_Buttonpane i:hover{color:#5e8cc2;}#Config_ReportPrefs_Builder_Buttonpane .ui-dialog-buttonset{display:none;}#Config_Location{margin-top:10px;}#Config_Location #Config_Location_Unrestricted,#Config_Location #Config_Location_List,#Config_Location #Config_Location_Optional,#Config_Location #Config_Location_Restricted{display:none;margin-top:6px;}#Config_Location_List_Dialog{display:none;}#Config_Location_List_Dialog #Config_Location_List_Dialog_ListContainer{height:280px;overflow-y:auto;background-color:#fff;border:1px solid #d8d8d8;}#Config_Location_List_Dialog #Config_Location_List_Dialog_None{padding-top:15px;display:block;text-align:center;}#Config_Location_List_Dialog #Config_Location_List_Dialog_AddContainer{padding-top:10px;padding-left:10px;}#Config_Location_List_Dialog #Config_Location_List_Dialog_List li{padding:2px 0 2px 4px;cursor:pointer;}#Config_Location_List_Dialog #Config_Location_List_Dialog_List li:hover{background-color:#f4f4f4;}#Config_Location_List_Dialog #Config_Location_List_Dialog_List li:hover .remove{opacity:.8;}#Config_Location_List_Dialog #Config_Location_List_Dialog_List li .remove{margin-top:2px;padding-right:6px;float:right;cursor:pointer;opacity:0;color:#e51400;font-size:1.3em;}#Config_Location_List_Dialog #Config_Location_List_Dialog_List li .remove:hover{opacity:1;}#Config_Location_ListImport_Dialog{display:none;}#Config_Location_ListImport_Dialog #Config_Location_ListImport_Dialog_Overwrite_Container{margin:6px 0;}#Config_Location_ListImport_Dialog #Config_Location_ListImport_Dialog_LocationList{width:100%;height:200px;margin:0 auto;}#Config_JobPref_Expressions{margin-top:10px;}#Config_JobPref_Expressions #OnCreateExpression,#Config_JobPref_Expressions #OnCloseExpression{height:16px;min-height:16px;overflow:hidden;font-family:Consolas,"Courier New",monospace;}#Config_JobQueues_Index i{width:1.28571429em;text-align:center;}#Config_JobQueues_Icon{display:block;margin:0 0 10px 10px;}#Config_JobQueues_Icon_Update_Dialog{display:none;}#Config_JobQueues_Icon_Update_Dialog div.colours{text-align:center;font-size:30px;}#Config_JobQueues_Icon_Update_Dialog div.colours i{cursor:pointer;padding:1px;opacity:.9;}#Config_JobQueues_Icon_Update_Dialog div.colours i:hover{opacity:1;}#Config_JobQueues_Icon_Update_Dialog div.colours i.selected{opacity:1;}#Config_JobQueues_Icon_Update_Dialog div.icons{text-align:center;font-size:30px;background-color:#fff;border:1px solid #d1d1d1;margin:6px 0 14px 0;}#Config_JobQueues_Icon_Update_Dialog div.icons i{width:1.28571429em;text-align:center;cursor:pointer;padding:4px 0;color:#333;opacity:.6;}#Config_JobQueues_Icon_Update_Dialog div.icons i:hover{opacity:.9;color:inherit;}#Config_JobQueues_Icon_Update_Dialog div.icons i.selected{opacity:1;color:inherit;}#Config_JobQueues_JobSubTypes_Update{margin:8px 0;}#Config_JobQueues_JobSubTypes_Update_Dialog #Config_JobQueues_JobSubTypes_Update_Dialog_Types{margin:0 0 8px 0;}#Config_JobQueues_JobSubTypes_Update_Dialog .jobTypes{padding:6px 0;}#Config_JobQueues_JobSubTypes_Update_Dialog .jobTypes .jobSubTypes{background-color:#f2f2f2;border-left:4px solid #d8d8d8;padding:4px 0 4px 8px;margin:4px 0 0 6px;}#Config_JobQueues_JobSubTypes_Update_Dialog .checkboxBulkSelectContainer{font-size:.8em;}#Config_JobQueues_Subjects li,#Config_JobQueues_Subjects_Update_Dialog_List li{padding:4px 0 4px 4px;}#Config_JobQueues_Subjects li i.fa-user,#Config_JobQueues_Subjects_Update_Dialog_List li i.fa-user,#Config_JobQueues_Subjects li i.fa-users,#Config_JobQueues_Subjects_Update_Dialog_List li i.fa-users{width:1.28571429em;text-align:center;}#Config_JobQueues_Subjects_Update_Dialog{display:none;}#Config_JobQueues_Subjects_Update_Dialog #Config_JobQueues_Subjects_Update_Dialog_ListContainer{height:280px;overflow-y:auto;background-color:#fff;border:1px solid #d8d8d8;}#Config_JobQueues_Subjects_Update_Dialog #Config_JobQueues_Subjects_Update_Dialog_None{padding-top:15px;display:block;text-align:center;}#Config_JobQueues_Subjects_Update_Dialog #Config_JobQueues_Subjects_Update_Dialog_AddContainer{padding-top:10px;padding-left:10px;}#Config_JobQueues_Subjects_Update_Dialog #Config_JobQueues_Subjects_Update_Dialog_List li{cursor:pointer;}#Config_JobQueues_Subjects_Update_Dialog #Config_JobQueues_Subjects_Update_Dialog_List li:hover{background-color:#f4f4f4;}#Config_JobQueues_Subjects_Update_Dialog #Config_JobQueues_Subjects_Update_Dialog_List li:hover .remove{opacity:.8;}#Config_JobQueues_Subjects_Update_Dialog #Config_JobQueues_Subjects_Update_Dialog_List li .remove{margin-top:2px;padding-right:6px;float:right;cursor:pointer;opacity:0;color:#e51400;font-size:1.3em;}#Config_JobQueues_Subjects_Update_Dialog #Config_JobQueues_Subjects_Update_Dialog_List li .remove:hover{opacity:1;}#Config_UserFlags_Show #UserFlag_OnAssignmentExpression,#Config_UserFlags_Show #UserFlag_OnUnassignmentExpression{height:16px;min-height:16px;overflow:hidden;font-family:Consolas,"Courier New",monospace;}#Config_UserFlags_Index i{width:1.28571429em;text-align:center;}#Config_UserFlags_Icon{display:block;margin:0 0 10px 10px;}#Config_UserFlags_Icon_Update_Dialog{display:none;}#Config_UserFlags_Icon_Update_Dialog div.colours{text-align:center;font-size:30px;}#Config_UserFlags_Icon_Update_Dialog div.colours i{cursor:pointer;padding:1px;opacity:.9;}#Config_UserFlags_Icon_Update_Dialog div.colours i:hover{opacity:1;}#Config_UserFlags_Icon_Update_Dialog div.colours i.selected{opacity:1;}#Config_UserFlags_Icon_Update_Dialog div.icons{text-align:center;font-size:30px;background-color:#fff;border:1px solid #d1d1d1;margin:6px 0 14px 0;}#Config_UserFlags_Icon_Update_Dialog div.icons i{width:1.28571429em;text-align:center;cursor:pointer;padding:4px 0;color:#333;opacity:.6;}#Config_UserFlags_Icon_Update_Dialog div.icons i:hover{opacity:.9;color:inherit;}#Config_UserFlags_Icon_Update_Dialog div.icons i.selected{opacity:1;color:inherit;}#Config_UserFlags_BulkAssign_ModeDialog>div{margin-top:6px;background-color:#fff;line-height:1.3em;border:1px solid #ddd;}#Config_UserFlags_BulkAssign_ModeDialog>div>div{display:block;padding:4px;cursor:pointer;}#Config_UserFlags_BulkAssign_ModeDialog>div>div:not(:last-child){border-bottom:1px dashed #ddd;}#Config_UserFlags_BulkAssign_ModeDialog>div>div h5{font-size:1.1em;padding:4px 0;}#Config_UserFlags_BulkAssign_ModeDialog>div>div i{margin-right:4px;}#Config_UserFlags_BulkAssign_ModeDialog>div>div.add:hover{background-color:#eeffde;}#Config_UserFlags_BulkAssign_ModeDialog>div>div.add i{color:#60a917;}#Config_UserFlags_BulkAssign_ModeDialog>div>div.override:hover{background-color:#ffe1de;}#Config_UserFlags_BulkAssign_ModeDialog>div>div.override i{color:#e51400;}#Config_UserFlags_BulkAssign_AssignDialog .brief{margin:0 0 8px 0;}#Config_UserFlags_BulkAssign_AssignDialog .brief .scopeDescBulkGenerate{font-weight:600;}#Config_UserFlags_BulkAssign_AssignDialog .brief div.examples{margin:8px auto;width:300px;}#Config_UserFlags_BulkAssign_AssignDialog .brief div.examples div{margin:2px 4px 2px 0;width:150px;float:left;}#Config_UserFlags_BulkAssign_AssignDialog .brief div.examples div.example1{width:100px;}#Config_UserFlags_BulkAssign_AssignDialog div.loading{display:none;padding:40px 0;text-align:center;}#Config_UserFlags_BulkAssign_AssignDialog div.loading i{margin-right:10px;color:#1e6dab;}#Config_UserFlags_BulkAssign_AssignDialog #Config_UserFlags_BulkAssign_AssignDialog_UserIds{height:200px;margin-bottom:8px;}#Config_UserFlags_BulkAssign_AssignDialog textarea{width:calc(100% - .5em);margin:0;}#Config_UserFlags_BulkAssign_AssignDialog.loading>div.loading{display:block;}#Config_UserFlags_BulkAssign_AssignDialog.loading>form{display:none;}#UserFlag_Export #UserFlag_Export_Fields #UserFlag_Export_Fields_Defaults{font-size:.75em;}#UserFlag_Export #UserFlag_Export_Fields th{font-size:1.05em;}#UserFlag_Export #UserFlag_Export_Fields th span{margin-top:4px;font-size:.8em;}#UserFlag_Export_Download_Dialog{padding-top:20px;text-align:center;}#UserFlag_Export_Download_Dialog h4{margin-bottom:30px;}#UserFlag_Export_Download_Dialog a{margin-bottom:20px;}#UserFlag_Export_Exporting{padding-top:50px;text-align:center;}#UserFlag_Export_Exporting i{margin-right:10px;color:#1e6dab;}#DocumentTemplate_BulkGenerate .actions{padding-bottom:.5em;text-align:right;}#DocumentTemplate_BulkGenerate table{max-width:850px;margin:auto;}#DocumentTemplate_BulkGenerate table tr.when-none{text-align:center;font-style:italic;}.dialog-item-picker{height:300px;overflow-y:auto;background-color:#fcfcfc;border:1px solid #ccc;}.dialog-item-picker>div{background-color:#fff;border-bottom:1px solid #ddd;padding:6px 0 6px 6px;cursor:pointer;}.dialog-item-picker>div:hover{background-color:#f4f4f4;}.dialog-item-picker>div.selected,.dialog-item-picker>div.selected:hover{background-color:#eee;}.dialog-item-picker>div.disabled{cursor:not-allowed;background-color:#f4f4f4;} \ No newline at end of file +.tableData{border:solid 1px #f4f4f4;border-collapse:collapse;}.tableData>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}.tableData>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}.tableData>thead>tr>th,.tableData>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}.tableData>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}.tableData>tfoot>tr>th,.tableData>tfoot>tr>td{background-color:#f4f4f4;}.tableDataDark{border:solid 1px #d8d8d8;border-collapse:collapse;}.tableDataDark td{border:solid 1px #d8d8d8;background-color:#fff;}.tableDataDark th{background-color:#eee;border:solid 1px #d8d8d8;}.tableDataContainer{background-color:#fff;}.tableDataVertical{border:solid 1px #f4f4f4;border-collapse:collapse;}.tableDataVertical>tbody>tr:nth-child(odd){background-color:#f4f4f4;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;}#updateAvailableContainer{float:right;border:1px dashed #ddd;background-color:#fff;font-size:.6em;line-height:1em;padding:10px 10px 4px 70px;text-align:right;height:50px;}#updateAvailableContainer i{position:absolute;display:block;height:64px;width:64px;vertical-align:middle;margin-left:-70px;font-size:50px;color:#e51400;}#updateAvailableContainer a.button{font-size:12px;margin-top:8px;}.Config_HideAdvanced .Config_HideAdvanced_Item{display:none;}.Config_LinkedGroup_Instance{margin:4px 0 8px 4px;padding:4px 0 4px 6px;border-left:4px solid #ccc;background-color:#fff;}.Config_LinkedGroup_Instance div.code{margin-left:2px;}#Config_LinkedGroup_Dialog h3{margin-bottom:6px;}#Config_LinkedGroup_Dialog table.input{margin-top:12px;}#Config_LinkedGroup_Dialog table.input th{text-align:right;}#expressionEditor #expressionEditorExceptionContainer{display:none;border:1px dashed #ff9696;background-color:#ffd8d8;margin:10px 0;padding:10px;}#expressionEditor #expressionEditorContainer{border:1px solid #1e6dab;background-color:#f4f4f4;height:100px;}.expressionTree span.dynatree-node span.dynatree-icon{background-image:url(data:image/png;base64,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);background-position-y:0;}.expressionTree span.dynatree-node.object span.dynatree-icon{background-position-x:0;}.expressionTree span.dynatree-node.parameter span.dynatree-icon{background-position-x:-16px;}.expressionTree span.dynatree-node.function span.dynatree-icon{background-position-x:-32px;}.expressionTree span.dynatree-node.property span.dynatree-icon{background-position-x:-48px;}table.expressionsTable{border:solid 1px #f4f4f4;border-collapse:collapse;}table.expressionsTable>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}table.expressionsTable>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}table.expressionsTable>thead>tr>th,table.expressionsTable>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}table.expressionsTable>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}table.expressionsTable>tfoot>tr>th,table.expressionsTable>tfoot>tr>td{background-color:#f4f4f4;}table.expressionsTable td.parseError{background-color:#ffd8d8;}#AttachmentType_FilterExpression{width:375px;}#deviceComponents{border:solid 1px #f4f4f4;border-collapse:collapse;}#deviceComponents>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}#deviceComponents>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}#deviceComponents>thead>tr>th,#deviceComponents>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}#deviceComponents>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}#deviceComponents>tfoot>tr>th,#deviceComponents>tfoot>tr>td{background-color:#f4f4f4;}#deviceComponents tr th.actions{width:20px;}#deviceComponents tr input.description{width:300px;}#deviceComponents tr input.cost{width:75px;}#deviceComponents tr i.remove{font-size:1.6em;color:#e51400;cursor:pointer;opacity:.8;}#deviceComponents tr i.remove:hover{opacity:1;}#deviceComponents tr i.fa-list-alt{color:#1e6dab;font-size:1.6em;cursor:pointer;}#deviceComponents tr i.fa-asterisk{color:#fa6800;font-size:1em;left:10px;top:3px;cursor:pointer;}#deviceComponents tr input.updating{background-position:right center;background-repeat:no-repeat;background-image:url(data:image/gif;base64,R0lGODlhEAALAPQAAP///zNah+Hm7dng6O7x9DddiTNah1d3nJqtw3+Xs8fS3k5vlm6JqaGzx4KatcrU4FFymDZciHGMq+ru8t/l7Pb3+V9+oeLo7vT2+MTP3LLB0dTc5fHz9gAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCwAAACwAAAAAEAALAAAFLSAgjmRpnqSgCuLKAq5AEIM4zDVw03ve27ifDgfkEYe04kDIDC5zrtYKRa2WQgAh+QQJCwAAACwAAAAAEAALAAAFJGBhGAVgnqhpHIeRvsDawqns0qeN5+y967tYLyicBYE7EYkYAgAh+QQJCwAAACwAAAAAEAALAAAFNiAgjothLOOIJAkiGgxjpGKiKMkbz7SN6zIawJcDwIK9W/HISxGBzdHTuBNOmcJVCyoUlk7CEAAh+QQJCwAAACwAAAAAEAALAAAFNSAgjqQIRRFUAo3jNGIkSdHqPI8Tz3V55zuaDacDyIQ+YrBH+hWPzJFzOQQaeavWi7oqnVIhACH5BAkLAAAALAAAAAAQAAsAAAUyICCOZGme1rJY5kRRk7hI0mJSVUXJtF3iOl7tltsBZsNfUegjAY3I5sgFY55KqdX1GgIAIfkECQsAAAAsAAAAABAACwAABTcgII5kaZ4kcV2EqLJipmnZhWGXaOOitm2aXQ4g7P2Ct2ER4AMul00kj5g0Al8tADY2y6C+4FIIACH5BAkLAAAALAAAAAAQAAsAAAUvICCOZGme5ERRk6iy7qpyHCVStA3gNa/7txxwlwv2isSacYUc+l4tADQGQ1mvpBAAIfkECQsAAAAsAAAAABAACwAABS8gII5kaZ7kRFGTqLLuqnIcJVK0DeA1r/u3HHCXC/aKxJpxhRz6Xi0ANAZDWa+kEAA7AAAAAAAAAAAA);}#organisationAddresses{font-size:.9em;}#organisationAddresses tr:not(:last-child){border-bottom:1px dashed #aaa;}#organisationAddresses th{padding:2px;font-weight:600;width:200px;}#organisationAddresses td{padding:2px;vertical-align:middle;}#organisationAddresses tr:nth-child(even){background-color:#fff;}#organisationAddresses i.fa{font-size:1.7em;cursor:pointer;}#organisationAddresses i.fa.delete{color:#e51400;opacity:.8;}#organisationAddresses i.fa.delete:hover{opacity:1;}#organisationAddresses i.fa.edit{color:#1e6dab;}ul#loggingEntries{overflow:auto;max-height:230px;padding-left:20px;}table.deviceProfileTable th.name{width:300px;}table.deviceProfileTable th.type{width:120px;}table.deviceProfileTable th.deviceCount{width:120px;}#configurationDeviceProfileShow #displayComputerNameTemplate{margin:0 0 6px 0;}#configurationDeviceProfileShow #displayOrganisationalUnit{margin:0 0 6px 0;}#dialogComputerNameTemplate #ComputerNameTemplate{box-sizing:border-box;height:48px;width:100%;font-family:Consolas,"Courier New",monospace;}#dialogOrganisationalUnit .enforceOrganisationalUnit{line-height:2.2em;}#dialogOrganisationalUnit .organisationalUnitTree{height:380px;}#dialogOrganisationalUnit .organisationalUnitTree span.fancytree-node{padding:1px;border:0;}#dialogOrganisationalUnit .organisationalUnitTree span.fancytree-node>span.fancytree-icon{background:none;display:inline-block;font-family:FontAwesome;font-size:1.2em;width:14px;}#dialogOrganisationalUnit .organisationalUnitTree span.fancytree-ico-ef>span.fancytree-icon:before{color:#1e6dab;font-size:1em;content:"";}#dialogOrganisationalUnit .organisationalUnitTree span.fancytree-ico-cf>span.fancytree-icon:before{color:#1e6dab;font-size:1em;content:"";}#dialogOrganisationalUnit .organisationalUnitTree ul.fancytree-container>li>span>span.fancytree-icon:before{color:#fa6800;font-size:1em;content:"";}#dialogOrganisationalUnit .organisationalUnitTree span.fancytree-node.fancytree-selected{font-style:normal;background:none;}#Config_System_AD_SearchScope_Dialog_Loading,#dialogOrganisationalUnit_Loading{text-align:center;padding:40px 0;}#configurationDocumentTemplateExpressionBrowser{padding-right:275px;background-image:url(data:image/png;base64,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);background-position:right top;background-repeat:no-repeat;}#Logging_Task_Status{width:520px;margin:40px auto 60px auto;}#Logging_Task_Status th.process{text-align:left;font-weight:600;background-color:#f4f4f4;min-height:30px;vertical-align:middle;}#Logging_Task_Status td.description{font-size:.9em;min-height:60px;}#Logging_Task_Status td.progress{padding:8px 10px;}#Logging_Task_Status td.finishedMessage i{display:none;}#Logging_Task_Status td.finishedRedirect{position:relative;}#Logging_Task_Status td.finishedRedirect i{color:#1e6dab;position:absolute;right:10px;top:calc(57% - .5em);display:inline-block;}#Logging_Task_Status td.exception{background-color:#ffd8d8;}div.logEventsViewport{border:1px solid #bbb;-moz-border-radius:4px 4px 0 0;-webkit-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}div.logEventsViewport div.logEventsViewportContainer{overflow-y:auto;overflow-x:hidden;}div.logEventsViewport div.logEventsViewportContainer .logEventsViewportNoLogs{padding-top:20px;text-align:center;font-style:italic;}div.logEventsViewport table.logEventsViewport{padding:0;margin:0;background-color:#bbb;table-layout:fixed;}div.logEventsViewport table.logEventsViewport>thead>tr{background-color:#eee;}div.logEventsViewport table.logEventsViewport>thead>tr>th{padding:4px 2px;font-weight:600;border-bottom:1px solid #bbb;}div.logEventsViewport table.logEventsViewport>thead>tr>th.icon{width:20px;}div.logEventsViewport table.logEventsViewport>thead>tr>th.timestamp{width:155px;}div.logEventsViewport table.logEventsViewport>thead>tr>th.eventType{width:180px;}div.logEventsViewport table.logEventsViewport>tbody>tr{background-color:#fff;}div.logEventsViewport table.logEventsViewport>tbody>tr:nth-child(even){background-color:#eee;}div.logEventsViewport table.logEventsViewport>tbody>tr>td{padding:2px;}div.logEventsViewport table.logEventsViewport>tbody>tr>td.icon{width:20px;vertical-align:middle;text-align:center;}div.logEventsViewport table.logEventsViewport>tbody>tr>td.icon>i{display:block;font-size:1.2em;}div.logEventsViewport table.logEventsViewport>tbody>tr>td.icon>i.fa-info-circle{color:#1e6dab;}div.logEventsViewport table.logEventsViewport>tbody>tr>td.icon>i.fa-exclamation-triangle{color:#f0a30a;}div.logEventsViewport table.logEventsViewport>tbody>tr>td.icon>i.fa-exclamation-circle{color:#e51400;}div.logEventsViewport table.logEventsViewport>tbody>tr>td.timestamp{width:155px;}div.logEventsViewport table.logEventsViewport>tbody>tr>td.eventType{width:180px;}div.logEventsViewport table.logEventsViewport>tbody>tr>td.message{white-space:pre-wrap;}#enrolStatus #sessions .session{width:280px;padding:4px 4px 4px 72px;margin:8px;border:5px solid #efefef;-moz-border-radius:0 20px 0 0;-webkit-border-radius:0 20px 0 0;border-radius:0 20px 0 0;background-color:#f5f5f5;background-repeat:no-repeat,no-repeat;background-position:36px 36px,4px 4px;-moz-background-size:32px,64px;-o-background-size:32px,64px;-webkit-background-size:32px,64px;background-size:32px,64px;min-height:72px;cursor:pointer;}#enrolStatus #sessions .session>h3{padding-bottom:3px;border-bottom:1px dashed #ccc;}#enrolStatus #sessions .session>h3 span.details{font-size:.8em;}#enrolStatus #sessions .session>p.sessionStart{color:#888;font-size:.8em;margin-bottom:2px;}#enrolStatus #sessions .session>p.sessionStatus{font-size:.9em;height:1.6em;overflow:hidden;margin-bottom:3px;}#enrolStatus #sessions .session:hover{border:5px solid #6c7a87;background-color:#dfe1f8;}#dialogSession .sessionHeader{width:400px;float:left;padding:0 0 0 134px;background-repeat:no-repeat,no-repeat;background-position:96px 96px,0 0;-moz-background-size:32px,128px;-o-background-size:32px,128px;-webkit-background-size:32px,128px;background-size:32px,128px;min-height:134px;}#dialogSession .sessionHeader>h2{padding-bottom:0;}#dialogSession .sessionHeader>table{margin-top:4px;}#dialogSession .sessionHeader>table th{width:128px;text-align:right;}#dialogSession .sessionHeader>table td,#dialogSession .sessionHeader>table th{padding:1px 2px;}#dialogSession .sessionProgress{width:320px;float:right;text-align:right;}#dialogSession .sessionProgress>p.sessionStart{color:#888;margin-bottom:2px;}#dialogSession .sessionProgress>p.sessionStatus{height:1.6em;overflow:hidden;margin-bottom:3px;}#dialogSession .sessionInfoContainer>div{float:left;width:428px;overflow:auto;}#dialogSession .sessionInfoContainer .sessionInfoMessages{height:374px;border:1px solid #bbb;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;background-color:#fff;}#dialogSession .sessionInfoContainer .sessionInfoMessages div.logEventsViewportContainer{overflow:auto;}#dialogSession .sessionInfoContainer .sessionInfoMessages div.logEventsViewportContainer .logEventsViewportNoLogs{padding-top:20px;text-align:center;font-style:italic;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport{padding:0;margin:0;background-color:#fff;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>thead>tr{background-color:#eee;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>thead>tr>th{padding:4px 2px;font-weight:600;border-bottom:1px solid #bbb;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>thead>tr>th.icon{width:20px;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>thead>tr>th.timestamp{width:155px;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>thead>tr>th.eventType{width:180px;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>tbody>tr{background-color:#fff;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>tbody>tr:nth-child(even){background-color:#eee;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>tbody>tr>td{padding:2px;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>tbody>tr>td.icon{width:20px;vertical-align:middle;text-align:center;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>tbody>tr>td.icon>i{display:block;font-size:1.2em;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>tbody>tr>td.icon>i.fa-info-circle{color:#1e6dab;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>tbody>tr>td.icon>i.fa-exclamation-triangle{color:#f0a30a;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>tbody>tr>td.icon>i.fa-exclamation-circle{color:#e51400;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>tbody>tr>td.timestamp{width:155px;}#dialogSession .sessionInfoContainer .sessionInfoMessages table.logEventsViewport>tbody>tr>td.eventType{width:180px;}#dialogSession .sessionInfoContainer .sessionInfoConsole{margin-left:6px;background-color:#222;color:#0f0;font-family:Consolas,"Courier New",monospace;border:4px solid #ccc;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;padding:2px;height:364px;}#Config_DocumentTemplates_Show>div.form>table>tbody>tr>th{width:140px;}#Config_DocumentTemplates_Show #DocumentTemplate_FilterExpression,#Config_DocumentTemplates_Show #DocumentTemplate_OnGenerateExpression,#Config_DocumentTemplates_Show #DocumentTemplate_OnImportAttachmentExpression{height:16px;min-height:16px;overflow:hidden;font-family:Consolas,"Courier New",monospace;}#Config_DocumentTemplates_Show #Config_DocumentTemplates_Scope_Button{margin-top:4px;}#Config_DocumentTemplates_Scope_Dialog div.input{margin:14px 10px 20px;}#Config_DocumentTemplates_TemplatePdf_Dialog div{text-align:center;}#Config_DocumentTemplates_TemplatePdf_Dialog div input{margin:16px 0;}#Config_DocumentTemplates_JobSubTypes{border:1px dashed #d8d8d8;background-color:#fff;padding:4px;margin-top:6px;}#Config_DocumentTemplates_JobSubTypes>h4{margin-bottom:4px;}#Config_DocumentTemplates_JobSubTypes #Config_DocumentTemplates_JobSubTypes_Update{margin-top:4px;}#Config_DocumentTemplates_JobSubTypes_Update_Dialog #Config_DocumentTemplates_JobSubTypes_Update_Dialog_Types{margin:0 0 8px 0;}#Config_DocumentTemplates_JobSubTypes_Update_Dialog .jobTypes{padding:6px 0;}#Config_DocumentTemplates_JobSubTypes_Update_Dialog .jobTypes .jobSubTypes{background-color:#f2f2f2;border-left:4px solid #d8d8d8;padding:4px 0 4px 8px;margin:4px 0 0 6px;}#Config_DocumentTemplates_JobSubTypes_Update_Dialog .checkboxBulkSelectContainer{font-size:.8em;}#DocumentTemplate_OnImportUserFlagRules_AddDialog .distribute-evenly{display:flex;justify-content:space-around;margin:1em 0;}#DocumentTemplate_OnImportUserFlagRules_AddDialog textarea{width:99%;}#DocumentTemplate_OnImportUserFlagRules_AddDialog .mt-1{margin-top:1em;}.dialog-bulk-generate .brief{margin:0 0 8px 0;}.dialog-bulk-generate .brief .scopeDescBulkGenerate{font-weight:600;}.dialog-bulk-generate .brief div.examples{margin:8px auto;width:360px;}.dialog-bulk-generate .brief div.examples div{margin:2px 4px 2px 0;width:230px;float:left;}.dialog-bulk-generate .brief div.examples div.example1{width:100px;}.dialog-bulk-generate textarea{width:calc(100% - .5em);height:200px;margin:0 auto;}.dialog-bulk-generate .sub{margin-top:.75em;}#Config_DocumentTemplates_Show_DownloadBulk_Dialog{padding-top:20px;text-align:center;}h1.Config_DocumentTemplates{margin:10px 0 6px;}#Config_DocumentTemplatePackages_Show>div.form>table>tbody>tr>th{width:140px;}#Config_DocumentTemplatePackages_Show #Package_FilterExpression,#Config_DocumentTemplatePackages_Show #Package_OnGenerateExpression{height:16px;min-height:16px;overflow:hidden;font-family:Consolas,"Courier New",monospace;}#Config_DocumentTemplatePackages_Show #Config_DocumentTemplatePackages_Scope_Button{margin-top:4px;}#Config_DocumentTemplatePackages_Show #Config_DocumentTemplatePackage_List{list-style-type:decimal;list-style-position:inside;background-color:#f2f2f2;border:1px solid #d8d8d8;}#Config_DocumentTemplatePackages_Show #Config_DocumentTemplatePackage_List li{padding:6px 8px;}#Config_DocumentTemplatePackages_Show #Config_DocumentTemplatePackage_List li:not(:first-child){border-top:1px dashed #d8d8d8;}#Config_DocumentTemplatePackages_Show #Config_DocumentTemplatePackage_List li .id{font-family:Consolas,"Courier New",monospace;float:right;}#Config_DocumentTemplatePackages_Scope_Dialog div.input{margin:14px 10px 20px;}#Config_DocumentTemplatePackages_JobSubTypes{border:1px dashed #d8d8d8;background-color:#fff;padding:4px;margin-top:6px;}#Config_DocumentTemplatePackages_JobSubTypes>h4{margin-bottom:4px;}#Config_DocumentTemplatePackages_JobSubTypes #Config_DocumentTemplatePackages_JobSubTypes_Update{margin-top:4px;}#Config_DocumentTemplatePackages_JobSubTypes_Update_Dialog #Config_DocumentTemplatePackages_JobSubTypes_Update_Dialog_Types{margin:0 0 8px 0;}#Config_DocumentTemplatePackages_JobSubTypes_Update_Dialog .jobTypes{padding:6px 0;}#Config_DocumentTemplatePackages_JobSubTypes_Update_Dialog .jobTypes .jobSubTypes{background-color:#f2f2f2;border-left:4px solid #d8d8d8;padding:4px 0 4px 8px;margin:4px 0 0 6px;}#Config_DocumentTemplatePackages_JobSubTypes_Update_Dialog .checkboxBulkSelectContainer{font-size:.8em;}#Config_DocumentTemplatePackages_Templates_Dialog h3{margin-bottom:4px;}#Config_DocumentTemplatePackages_Templates_Dialog>div{width:374px;float:left;}#Config_DocumentTemplatePackages_Templates_Dialog>div:first-child{margin-right:20px;}#Config_DocumentTemplatePackages_Templates_Dialog .templates_connected{min-height:200px;}#Config_DocumentTemplatePackages_Templates_Dialog ol{list-style-type:decimal;padding-left:24px;border:1px solid #d8d8d8;background-color:#f2f2f2;}#Config_DocumentTemplatePackages_Templates_Dialog li{background-color:#fff;border:1px solid #d8d8d8;margin:4px;padding:2px 4px;-moz-box-shadow:0 0 5px rgba(209,209,209,.5);-webkit-box-shadow:0 0 5px rgba(209,209,209,.5);box-shadow:0 0 5px rgba(209,209,209,.5);cursor:default;}#Config_DocumentTemplatePackages_Templates_Dialog li:hover{background-color:#cddbec;border-color:#1e6dab;}#Config_DocumentTemplatePackages_Templates_Dialog li .id{font-family:Consolas,"Courier New",monospace;color:#888;float:right;font-size:.9em;}#importStatus #sessions .session{padding:4px;margin-bottom:10px;border:1px solid #efefef;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;background-color:#f5f5f5;min-height:72px;}#importStatus #sessions .session .sessionLeftPane{width:48%;float:left;}#importStatus #sessions .session .sessionLeftPane>h3{padding-bottom:3px;border-bottom:1px dashed #ccc;}#importStatus #sessions .session .sessionLeftPane>h3 span.details{font-size:.8em;}#importStatus #sessions .session .sessionRightPane{width:48%;float:right;text-align:right;}#importStatus #sessions .session .sessionRightPane>p.sessionStart{color:#888;font-size:.8em;margin-bottom:2px;}#importStatus #sessions .session .sessionRightPane>p.sessionStatus{font-size:.9em;height:1.6em;overflow:hidden;margin-bottom:3px;}#importStatus #sessions .session .sessionPages>.sessionPage{min-height:56px;min-width:256px;float:left;margin:3px 0 3px 0;padding:170px 0 0 0;background-color:#fff;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;border:1px solid #eee;background-repeat:no-repeat;background-position:center top;}#importStatus #sessions .session .sessionPages>.sessionPage>.sessionPageDetails{height:84px;padding:2px 4px 0 4px;background-color:rgba(255,255,255,.8);}#importStatus #sessions .session .sessionPages>.sessionPage>.sessionPageDetails p.sessionStatus{font-size:.9em;height:1.6em;margin-bottom:3px;}#importStatus #sessions .session .sessionInfoMessages{margin-top:6px;border:1px solid #bbb;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;background-color:#fff;}#importStatus #sessions .session .sessionInfoMessages div.logEventsViewportContainer{max-height:220px;overflow:auto;}#importStatus #sessions .session .sessionInfoMessages div.logEventsViewportContainer .logEventsViewportNoLogs{padding-top:20px;text-align:center;font-style:italic;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport{padding:0;margin:0;background-color:#fff;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>thead>tr{background-color:#eee;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>thead>tr>th{padding:4px 2px;font-weight:600;border-bottom:1px solid #bbb;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>thead>tr>th.icon{width:20px;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>thead>tr>th.timestamp{width:155px;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>thead>tr>th.eventType{width:180px;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>tbody>tr{background-color:#fff;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>tbody>tr:nth-child(even){background-color:#eee;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>tbody>tr>td{padding:2px;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>tbody>tr>td.icon{width:20px;vertical-align:middle;text-align:center;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>tbody>tr>td.icon>i{display:block;font-size:1.2em;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>tbody>tr>td.icon>i.fa-info-circle{color:#1e6dab;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>tbody>tr>td.icon>i.fa-exclamation-triangle{color:#f0a30a;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>tbody>tr>td.icon>i.fa-exclamation-circle{color:#e51400;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>tbody>tr>td.timestamp{width:155px;}#importStatus #sessions .session .sessionInfoMessages table.logEventsViewport>tbody>tr>td.eventType{width:180px;}#undetectedPagesContainer #undetectedPages{list-style:none;margin:0;padding:0;}#undetectedPagesContainer #undetectedPages>.undetectedPage{float:left;margin:4px;border:1px solid #f4f4f4;background-color:hsl(0,0%,98.5%);height:256px;width:256px;background-position:top center;background-repeat:no-repeat;cursor:pointer;}#undetectedPagesContainer #undetectedPages>.undetectedPage>.pageDetails{margin-top:232px;height:24px;text-align:center;}#undetectedPagesContainer #undetectedPages>.undetectedPage:hover{border:1px solid #d8d8d8;background-color:#f4f4f4;}#undetectedPageDialog>.pagePreview{height:700px;max-height:700px;background-position:top center;background-repeat:no-repeat;background-size:contain;}#undetectedPageDialog .actions{border-top:1px solid #d1d1d1;padding-top:8px;margin-top:8px;text-align:right;}.deviceBatches #DeviceBatch_PurchaseDetails_Container{padding:5px 0 5px 5px;}.deviceBatches #DeviceBatch_PurchaseDetails{width:570px;height:200px;}.deviceBatches #DeviceBatch_WarrantyDetails_Container{padding:5px 0 5px 5px;}.deviceBatches #DeviceBatch_WarrantyDetails{width:570px;height:200px;}.deviceBatches #DeviceBatch_InsuranceDetails_Container{padding:5px 0 5px 5px;}.deviceBatches #DeviceBatch_InsuranceDetails{width:570px;height:200px;}.deviceBatches #DeviceBatch_Comments{width:570px;height:200px;}.deviceBatches #DeviceBatch_Attachments{border:1px solid #ccc;background-color:#fff;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput{position:relative;height:200px;overflow:auto;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a{display:block;float:left;height:48px;width:221px;padding:2px;margin:2px;font-size:.95em;border:1px solid #fff;color:#000;text-decoration:none;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a span.comments,.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a span.author,.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a span.timestamp{display:block;float:left;width:168px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;height:16px;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a span.author{color:#888;width:150px;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a span.timestamp{color:#888;font-style:italic;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a span.icon{display:block;float:left;height:48px;width:48px;margin-right:2px;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a span.icon img{height:48px;width:48px;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a span.icon img.loading{display:none;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a:hover{background-color:#ededed;border:1px solid #ccc;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a:hover span.remove{opacity:.5;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a span.remove{font-size:1.2em;color:#e51400;margin-left:2px;cursor:pointer;opacity:0;}.deviceBatches #DeviceBatch_Attachments div.attachmentOutput>a span.remove:hover{opacity:1;}.deviceBatches #DeviceBatch_Attachments.cannotAddAttachments div.attachmentOutput{height:250px;}.deviceBatches #DeviceBatch_Attachments div.attachmentInput{border-top:1px solid #ccc;height:40px;background-color:#fff;padding:5px;}.deviceBatches #DeviceBatch_Attachments div.attachmentInput span.action{color:#333;display:block;margin:0 4px 0 0;font-size:1.5em;cursor:pointer;float:right;border:1px solid #fff;padding:.5em;}.deviceBatches #DeviceBatch_Attachments div.attachmentInput span.action:hover{color:#335a87;background-color:#ededed;border:1px solid #ccc;}.deviceBatches #DeviceBatch_Attachments div.attachmentInput span.action.disabled{color:rgba(51,51,51,.2);cursor:default;}.deviceBatches #DeviceBatch_Attachments div.attachmentInput span.action.disabled:hover{color:rgba(51,51,51,.2);background-color:inherit;border:1px solid #fff;}#plugins .pageMenuArea a>h3{display:inline;color:#335a87;}#plugins .pageMenuArea a>h3:hover{color:#5e8cc2;}#plugins .pageMenuArea .pageMenuBlurb{padding-left:18px;}#plugins .pageMenuArea .pageMenuBlurb i{font-size:.9em;}#plugins #pageMenu td .pageMenuArea:not(:last-child){padding-bottom:5px;margin-bottom:10px;}#plugins #pageMenu td .pageMenuArea>a,#plugins #pageMenu td .pageMenuArea>h3{color:#333;}#plugins #pageMenu td .pageMenuArea>a:hover,#plugins #pageMenu td .pageMenuArea>h3:hover{color:#335a87;}#dialogUninstallPlugins #uninstallPlugin{margin:.5em 0;}#dialogUninstallPlugins #uninstallPluginData{margin:.5em 0;}#dialogUninstallPluginConfirm #uninstallPluginConfirm{text-align:center;margin:1em 0 .5em 0;}#dialogUninstallPluginConfirm #uninstallPluginDataConfirm{margin-top:1em;}#pluginLibraryHeading{float:right;}#pluginLibrary #pluginLibraryGroups{width:900px;margin:0 auto;column-count:2;}#pluginLibrary #pluginLibraryGroups>div{display:inline-block;}#pluginLibrary #pluginLibraryGroups div.form>table{margin:0 10px 10px 4px;width:calc(100% - 14px);}#pluginLibrary .pluginItem .pluginItemBlurb{margin:8px 0 8px 2px;padding:0 4px;border-left:4px solid #d1d1d1;}#pluginLibrary .pluginItem .pluginItemBlurb *{padding:0;margin:0;}#pluginLibrary .pluginItem .pageMenuBlurb i{font-size:.9em;}#pluginLibrary .pluginItem>h2:first-child{min-height:22px;}#pluginLibrary .pluginItem>h2:first-child i{font-size:.9em;padding-right:4px;color:#333;}#pluginLibrary .pluginItem>h2:first-child a{float:right;font-size:12px;}#dialogInstallPlugin div.info-box{margin-top:1em;}#dialogUploadPlugin #pluginFile{margin:1em 0 1em 6px;}#Config_AuthRoles_Show #Config_AuthRoles_Claims_Tree span.fancytree-node{padding:1px;border:0;}#Config_AuthRoles_Show #Config_AuthRoles_Claims_Tree span.fancytree-node>span.fancytree-icon{background:none;display:inline-block;font-family:FontAwesome;font-size:1.2em;width:14px;}#Config_AuthRoles_Show #Config_AuthRoles_Claims_Tree span.fancytree-ico-ef>span.fancytree-icon:before{color:#9e9e9e;font-size:1em;content:"";}#Config_AuthRoles_Show #Config_AuthRoles_Claims_Tree span.fancytree-ico-cf>span.fancytree-icon:before{color:#9e9e9e;font-size:1em;content:"";}#Config_AuthRoles_Show #Config_AuthRoles_Claims_Tree span.fancytree-ico-c>span.fancytree-icon:before{color:#e51400;content:"";}#Config_AuthRoles_Show #Config_AuthRoles_Claims_Tree span.fancytree-ico-c.fancytree-selected>span.fancytree-icon:before{color:#60a917;content:"";}#Config_AuthRoles_Show #Config_AuthRoles_Claims_Tree span.fancytree-node.fancytree-selected{font-style:normal;background:none;}#Config_AuthRoles_Subjects li,#Config_AuthRoles_Subjects_Update_Dialog_List li{padding:4px 0 4px 4px;}#Config_AuthRoles_Subjects li i.fa-user,#Config_AuthRoles_Subjects_Update_Dialog_List li i.fa-user,#Config_AuthRoles_Subjects li i.fa-users,#Config_AuthRoles_Subjects_Update_Dialog_List li i.fa-users{min-width:22px;}#Config_AuthRoles_Subjects_Update_Dialog{display:none;}#Config_AuthRoles_Subjects_Update_Dialog #Config_AuthRoles_Subjects_Update_Dialog_ListContainer{height:280px;overflow-y:auto;background-color:#fff;border:1px solid #d8d8d8;}#Config_AuthRoles_Subjects_Update_Dialog #Config_AuthRoles_Subjects_Update_Dialog_None{padding-top:15px;display:block;text-align:center;}#Config_AuthRoles_Subjects_Update_Dialog #Config_AuthRoles_Subjects_Update_Dialog_AddContainer{padding-top:10px;padding-left:10px;}#Config_AuthRoles_Subjects_Update_Dialog #Config_AuthRoles_Subjects_Update_Dialog_List li{cursor:pointer;}#Config_AuthRoles_Subjects_Update_Dialog #Config_AuthRoles_Subjects_Update_Dialog_List li:hover{background-color:#f4f4f4;}#Config_AuthRoles_Subjects_Update_Dialog #Config_AuthRoles_Subjects_Update_Dialog_List li:hover .remove{opacity:.8;}#Config_AuthRoles_Subjects_Update_Dialog #Config_AuthRoles_Subjects_Update_Dialog_List li .remove{margin-top:2px;padding-right:6px;float:right;cursor:pointer;opacity:0;color:#e51400;font-size:1.3em;}#Config_AuthRoles_Subjects_Update_Dialog #Config_AuthRoles_Subjects_Update_Dialog_List li .remove:hover{opacity:1;}#Config_ReportPrefs{margin-top:10px;}#Config_ReportPrefs #Config_ReportPrefs_Preview{float:right;width:150px;height:80px;border:1px solid #444;font-size:4px;color:#fff;overflow:hidden;text-transform:uppercase;}#Config_ReportPrefs #Config_ReportPrefs_Preview .heading{height:6px;padding-left:3px;overflow:hidden;background-color:#333;}#Config_ReportPrefs #Config_ReportPrefs_Preview .column-heading{float:left;width:calc(33% - 4px);padding-left:2px;margin:1px 0 0 2px;}#Config_ReportPrefs #Config_ReportPrefs_Preview .column{height:100%;float:left;width:calc(33% - 2px);margin-left:2px;overflow:hidden;background:rgba(255,255,255,.2);}#Config_ReportPrefs #Config_ReportPrefs_Preview .column span{display:block;height:4px;margin:1px;background-color:#fff;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-default{background:linear-gradient(to bottom,#165180,#1e6dab) left top repeat-x #1e6dab;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-default .column span.alert{background-color:#e51400;color:#fff;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-default-soft{background:linear-gradient(to bottom,#165180,#1e6dab) left top repeat-x #1e6dab;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-default-soft .column span.alert{background-color:#f0e277;color:#000;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-green{background:linear-gradient(to bottom,#477c11,#60a917) left top repeat-x #60a917;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-green .column span.alert{background-color:#e51400;color:#fff;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-green-soft{background:linear-gradient(to bottom,#477c11,#60a917) left top repeat-x #60a917;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-green-soft .column span.alert{background-color:#e5cc11;color:#000;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-violet{background:linear-gradient(to bottom,#80c,#a0f) left top repeat-x #a0f;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-violet .column span.alert{background-color:#e51400;color:#fff;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-violet-soft{background:linear-gradient(to bottom,#80c,#a0f) left top repeat-x #a0f;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-violet-soft .column span.alert{background-color:#f0e277;color:#000;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-magenta{background:linear-gradient(to bottom,#a50058,#d80073) left top repeat-x #d80073;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-magenta .column span.alert{background-color:#1681b4;color:#fff;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-magenta-soft{background:linear-gradient(to bottom,#a50058,#d80073) left top repeat-x #d80073;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-magenta-soft .column span.alert{background-color:#85cdf0;color:#000;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-crimson{background:linear-gradient(to bottom,#6f0019,#a20025) left top repeat-x #a20025;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-crimson .column span.alert{background-color:#b0cc22;color:#000;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-crimson-soft{background:linear-gradient(to bottom,#6f0019,#a20025) left top repeat-x #a20025;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-crimson-soft .column span.alert{background-color:#cee077;color:#000;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-amber{background:linear-gradient(to bottom,#bf8208,#f0a30a) left top repeat-x #f0a30a;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-amber .column span.alert{background-color:#0050ef;color:#fff;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-amber-soft{background:linear-gradient(to bottom,#bf8208,#f0a30a) left top repeat-x #f0a30a;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-amber-soft .column span.alert{background-color:#bbd0fb;color:#000;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-brown{background:linear-gradient(to bottom,#5c401f,#825a2c) left top repeat-x #825a2c;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-brown .column span.alert{background-color:#e3c800;color:#000;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-brown-soft{background:linear-gradient(to bottom,#5c401f,#825a2c) left top repeat-x #825a2c;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-brown-soft .column span.alert{background-color:#f0e277;color:#000;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-steel{background:linear-gradient(to bottom,#4e5d6c,#647689) left top repeat-x #647689;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-steel .column span.alert{background-color:#e51400;color:#fff;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-steel-soft{background:linear-gradient(to bottom,#4e5d6c,#647689) left top repeat-x #647689;}#Config_ReportPrefs #Config_ReportPrefs_Preview.theme-steel-soft .column span.alert{background-color:#f0e277;color:#000;}#Config_ReportPrefs_Builder .report{margin-bottom:10px;}#Config_ReportPrefs_Builder .report ul{margin-left:10px;}#Config_ReportPrefs_Builder .theme{margin-bottom:10px;}#Config_ReportPrefs_Builder .theme>select{margin-left:10px;}#Config_ReportPrefs_Builder .filter>select{margin-left:10px;}#Config_ReportPrefs_Builder .filter div.options{display:none;background-color:#fff;border:1px dashed #ccc;margin-top:4px;margin-left:15px;padding:2px 6px;}#Config_ReportPrefs_Builder .filter div.options .method{margin-top:4px;margin-bottom:8px;}#Config_ReportPrefs_Builder .filter div.options .method label{margin-right:14px;}#Config_ReportPrefs_Builder_Buttonpane{padding-right:.3em;}#Config_ReportPrefs_Builder_Buttonpane textarea{float:left;font-family:Consolas,"Courier New",monospace;color:#333;width:calc(100% - 1.2em - 10px);border:1px solid #ccc;white-space:pre;min-height:0;}#Config_ReportPrefs_Builder_Buttonpane i{float:right;cursor:pointer;margin:.3em .2em 0 0;color:#335a87;}#Config_ReportPrefs_Builder_Buttonpane i:hover{color:#5e8cc2;}#Config_ReportPrefs_Builder_Buttonpane .ui-dialog-buttonset{display:none;}#Config_Location{margin-top:10px;}#Config_Location #Config_Location_Unrestricted,#Config_Location #Config_Location_List,#Config_Location #Config_Location_Optional,#Config_Location #Config_Location_Restricted{display:none;margin-top:6px;}#Config_Location_List_Dialog{display:none;}#Config_Location_List_Dialog #Config_Location_List_Dialog_ListContainer{height:280px;overflow-y:auto;background-color:#fff;border:1px solid #d8d8d8;}#Config_Location_List_Dialog #Config_Location_List_Dialog_None{padding-top:15px;display:block;text-align:center;}#Config_Location_List_Dialog #Config_Location_List_Dialog_AddContainer{padding-top:10px;padding-left:10px;}#Config_Location_List_Dialog #Config_Location_List_Dialog_List li{padding:2px 0 2px 4px;cursor:pointer;}#Config_Location_List_Dialog #Config_Location_List_Dialog_List li:hover{background-color:#f4f4f4;}#Config_Location_List_Dialog #Config_Location_List_Dialog_List li:hover .remove{opacity:.8;}#Config_Location_List_Dialog #Config_Location_List_Dialog_List li .remove{margin-top:2px;padding-right:6px;float:right;cursor:pointer;opacity:0;color:#e51400;font-size:1.3em;}#Config_Location_List_Dialog #Config_Location_List_Dialog_List li .remove:hover{opacity:1;}#Config_Location_ListImport_Dialog{display:none;}#Config_Location_ListImport_Dialog #Config_Location_ListImport_Dialog_Overwrite_Container{margin:6px 0;}#Config_Location_ListImport_Dialog #Config_Location_ListImport_Dialog_LocationList{width:100%;height:200px;margin:0 auto;}#Config_JobPref_Expressions{margin-top:10px;}#Config_JobPref_Expressions #OnCreateExpression,#Config_JobPref_Expressions #OnCloseExpression{height:16px;min-height:16px;overflow:hidden;font-family:Consolas,"Courier New",monospace;}#Config_JobQueues_Index i{width:1.28571429em;text-align:center;}#Config_JobQueues_Icon{display:block;margin:0 0 10px 10px;}#Config_JobQueues_Icon_Update_Dialog{display:none;}#Config_JobQueues_Icon_Update_Dialog div.colours{text-align:center;font-size:30px;}#Config_JobQueues_Icon_Update_Dialog div.colours i{cursor:pointer;padding:1px;opacity:.9;}#Config_JobQueues_Icon_Update_Dialog div.colours i:hover{opacity:1;}#Config_JobQueues_Icon_Update_Dialog div.colours i.selected{opacity:1;}#Config_JobQueues_Icon_Update_Dialog div.icons{text-align:center;font-size:30px;background-color:#fff;border:1px solid #d1d1d1;margin:6px 0 14px 0;}#Config_JobQueues_Icon_Update_Dialog div.icons i{width:1.28571429em;text-align:center;cursor:pointer;padding:4px 0;color:#333;opacity:.6;}#Config_JobQueues_Icon_Update_Dialog div.icons i:hover{opacity:.9;color:inherit;}#Config_JobQueues_Icon_Update_Dialog div.icons i.selected{opacity:1;color:inherit;}#Config_JobQueues_JobSubTypes_Update{margin:8px 0;}#Config_JobQueues_JobSubTypes_Update_Dialog #Config_JobQueues_JobSubTypes_Update_Dialog_Types{margin:0 0 8px 0;}#Config_JobQueues_JobSubTypes_Update_Dialog .jobTypes{padding:6px 0;}#Config_JobQueues_JobSubTypes_Update_Dialog .jobTypes .jobSubTypes{background-color:#f2f2f2;border-left:4px solid #d8d8d8;padding:4px 0 4px 8px;margin:4px 0 0 6px;}#Config_JobQueues_JobSubTypes_Update_Dialog .checkboxBulkSelectContainer{font-size:.8em;}#Config_JobQueues_Subjects li,#Config_JobQueues_Subjects_Update_Dialog_List li{padding:4px 0 4px 4px;}#Config_JobQueues_Subjects li i.fa-user,#Config_JobQueues_Subjects_Update_Dialog_List li i.fa-user,#Config_JobQueues_Subjects li i.fa-users,#Config_JobQueues_Subjects_Update_Dialog_List li i.fa-users{width:1.28571429em;text-align:center;}#Config_JobQueues_Subjects_Update_Dialog{display:none;}#Config_JobQueues_Subjects_Update_Dialog #Config_JobQueues_Subjects_Update_Dialog_ListContainer{height:280px;overflow-y:auto;background-color:#fff;border:1px solid #d8d8d8;}#Config_JobQueues_Subjects_Update_Dialog #Config_JobQueues_Subjects_Update_Dialog_None{padding-top:15px;display:block;text-align:center;}#Config_JobQueues_Subjects_Update_Dialog #Config_JobQueues_Subjects_Update_Dialog_AddContainer{padding-top:10px;padding-left:10px;}#Config_JobQueues_Subjects_Update_Dialog #Config_JobQueues_Subjects_Update_Dialog_List li{cursor:pointer;}#Config_JobQueues_Subjects_Update_Dialog #Config_JobQueues_Subjects_Update_Dialog_List li:hover{background-color:#f4f4f4;}#Config_JobQueues_Subjects_Update_Dialog #Config_JobQueues_Subjects_Update_Dialog_List li:hover .remove{opacity:.8;}#Config_JobQueues_Subjects_Update_Dialog #Config_JobQueues_Subjects_Update_Dialog_List li .remove{margin-top:2px;padding-right:6px;float:right;cursor:pointer;opacity:0;color:#e51400;font-size:1.3em;}#Config_JobQueues_Subjects_Update_Dialog #Config_JobQueues_Subjects_Update_Dialog_List li .remove:hover{opacity:1;}#Config_UserFlags_Show #UserFlag_OnAssignmentExpression,#Config_UserFlags_Show #UserFlag_OnUnassignmentExpression{height:16px;min-height:16px;overflow:hidden;font-family:Consolas,"Courier New",monospace;}#Config_UserFlags_Index i{width:1.28571429em;text-align:center;}#Config_UserFlags_Icon{display:block;margin:0 0 10px 10px;}#Config_UserFlags_Icon_Update_Dialog{display:none;}#Config_UserFlags_Icon_Update_Dialog div.colours{text-align:center;font-size:30px;}#Config_UserFlags_Icon_Update_Dialog div.colours i{cursor:pointer;padding:1px;opacity:.9;}#Config_UserFlags_Icon_Update_Dialog div.colours i:hover{opacity:1;}#Config_UserFlags_Icon_Update_Dialog div.colours i.selected{opacity:1;}#Config_UserFlags_Icon_Update_Dialog div.icons{text-align:center;font-size:30px;background-color:#fff;border:1px solid #d1d1d1;margin:6px 0 14px 0;}#Config_UserFlags_Icon_Update_Dialog div.icons i{width:1.28571429em;text-align:center;cursor:pointer;padding:4px 0;color:#333;opacity:.6;}#Config_UserFlags_Icon_Update_Dialog div.icons i:hover{opacity:.9;color:inherit;}#Config_UserFlags_Icon_Update_Dialog div.icons i.selected{opacity:1;color:inherit;}#Config_UserFlags_BulkAssign_ModeDialog>div{margin-top:6px;background-color:#fff;line-height:1.3em;border:1px solid #ddd;}#Config_UserFlags_BulkAssign_ModeDialog>div>div{display:block;padding:4px;cursor:pointer;}#Config_UserFlags_BulkAssign_ModeDialog>div>div:not(:last-child){border-bottom:1px dashed #ddd;}#Config_UserFlags_BulkAssign_ModeDialog>div>div h5{font-size:1.1em;padding:4px 0;}#Config_UserFlags_BulkAssign_ModeDialog>div>div i{margin-right:4px;}#Config_UserFlags_BulkAssign_ModeDialog>div>div.add:hover{background-color:#eeffde;}#Config_UserFlags_BulkAssign_ModeDialog>div>div.add i{color:#60a917;}#Config_UserFlags_BulkAssign_ModeDialog>div>div.override:hover{background-color:#ffe1de;}#Config_UserFlags_BulkAssign_ModeDialog>div>div.override i{color:#e51400;}#Config_UserFlags_BulkAssign_AssignDialog .brief{margin:0 0 8px 0;}#Config_UserFlags_BulkAssign_AssignDialog .brief .scopeDescBulkGenerate{font-weight:600;}#Config_UserFlags_BulkAssign_AssignDialog .brief div.examples{margin:8px auto;width:300px;}#Config_UserFlags_BulkAssign_AssignDialog .brief div.examples div{margin:2px 4px 2px 0;width:150px;float:left;}#Config_UserFlags_BulkAssign_AssignDialog .brief div.examples div.example1{width:100px;}#Config_UserFlags_BulkAssign_AssignDialog div.loading{display:none;padding:40px 0;text-align:center;}#Config_UserFlags_BulkAssign_AssignDialog div.loading i{margin-right:10px;color:#1e6dab;}#Config_UserFlags_BulkAssign_AssignDialog #Config_UserFlags_BulkAssign_AssignDialog_UserIds{height:200px;margin-bottom:8px;}#Config_UserFlags_BulkAssign_AssignDialog textarea{width:calc(100% - .5em);margin:0;}#Config_UserFlags_BulkAssign_AssignDialog.loading>div.loading{display:block;}#Config_UserFlags_BulkAssign_AssignDialog.loading>form{display:none;}#UserFlag_Export #UserFlag_Export_Fields #UserFlag_Export_Fields_Defaults{font-size:.75em;}#UserFlag_Export #UserFlag_Export_Fields th{font-size:1.05em;}#UserFlag_Export #UserFlag_Export_Fields th span{margin-top:4px;font-size:.8em;}#UserFlag_Export_Download_Dialog{padding-top:20px;text-align:center;}#UserFlag_Export_Download_Dialog h4{margin-bottom:30px;}#UserFlag_Export_Download_Dialog a{margin-bottom:20px;}#UserFlag_Export_Exporting{padding-top:50px;text-align:center;}#UserFlag_Export_Exporting i{margin-right:10px;color:#1e6dab;}#Config_DeviceFlags_Show #DeviceFlag_OnAssignmentExpression,#Config_DeviceFlags_Show #DeviceFlag_OnUnassignmentExpression{height:16px;min-height:16px;overflow:hidden;font-family:Consolas,"Courier New",monospace;}#Config_DeviceFlags_Index i{width:1.28571429em;text-align:center;}#Config_DeviceFlags_Icon{display:block;margin:0 0 10px 10px;}#Config_DeviceFlags_Icon_Update_Dialog{display:none;}#Config_DeviceFlags_Icon_Update_Dialog div.colours{text-align:center;font-size:30px;}#Config_DeviceFlags_Icon_Update_Dialog div.colours i{cursor:pointer;padding:1px;opacity:.9;}#Config_DeviceFlags_Icon_Update_Dialog div.colours i:hover{opacity:1;}#Config_DeviceFlags_Icon_Update_Dialog div.colours i.selected{opacity:1;}#Config_DeviceFlags_Icon_Update_Dialog div.icons{text-align:center;font-size:30px;background-color:#fff;border:1px solid #d1d1d1;margin:6px 0 14px 0;}#Config_DeviceFlags_Icon_Update_Dialog div.icons i{width:1.28571429em;text-align:center;cursor:pointer;padding:4px 0;color:#333;opacity:.6;}#Config_DeviceFlags_Icon_Update_Dialog div.icons i:hover{opacity:.9;color:inherit;}#Config_DeviceFlags_Icon_Update_Dialog div.icons i.selected{opacity:1;color:inherit;}#Config_DeviceFlags_BulkAssign_ModeDialog>div{margin-top:6px;background-color:#fff;line-height:1.3em;border:1px solid #ddd;}#Config_DeviceFlags_BulkAssign_ModeDialog>div>div{display:block;padding:4px;cursor:pointer;}#Config_DeviceFlags_BulkAssign_ModeDialog>div>div:not(:last-child){border-bottom:1px dashed #ddd;}#Config_DeviceFlags_BulkAssign_ModeDialog>div>div h5{font-size:1.1em;padding:4px 0;}#Config_DeviceFlags_BulkAssign_ModeDialog>div>div i{margin-right:4px;}#Config_DeviceFlags_BulkAssign_ModeDialog>div>div.add:hover{background-color:#eeffde;}#Config_DeviceFlags_BulkAssign_ModeDialog>div>div.add i{color:#60a917;}#Config_DeviceFlags_BulkAssign_ModeDialog>div>div.override:hover{background-color:#ffe1de;}#Config_DeviceFlags_BulkAssign_ModeDialog>div>div.override i{color:#e51400;}#Config_DeviceFlags_BulkAssign_AssignDialog .brief{margin:0 0 8px 0;}#Config_DeviceFlags_BulkAssign_AssignDialog .brief .scopeDescBulkGenerate{font-weight:600;}#Config_DeviceFlags_BulkAssign_AssignDialog .brief div.examples{margin:8px auto;width:300px;}#Config_DeviceFlags_BulkAssign_AssignDialog .brief div.examples div{margin:2px 4px 2px 0;width:150px;float:left;}#Config_DeviceFlags_BulkAssign_AssignDialog .brief div.examples div.example1{width:100px;}#Config_DeviceFlags_BulkAssign_AssignDialog div.loading{display:none;padding:40px 0;text-align:center;}#Config_DeviceFlags_BulkAssign_AssignDialog div.loading i{margin-right:10px;color:#1e6dab;}#Config_DeviceFlags_BulkAssign_AssignDialog #Config_DeviceFlags_BulkAssign_AssignDialog_DeviceSerialNumbers{height:200px;margin-bottom:8px;}#Config_DeviceFlags_BulkAssign_AssignDialog textarea{width:calc(100% - .5em);margin:0;}#Config_DeviceFlags_BulkAssign_AssignDialog.loading>div.loading{display:block;}#Config_DeviceFlags_BulkAssign_AssignDialog.loading>form{display:none;}#DeviceFlag_Export #DeviceFlag_Export_Fields #DeviceFlag_Export_Fields_Defaults{font-size:.75em;}#DeviceFlag_Export #DeviceFlag_Export_Fields th{font-size:1.05em;}#DeviceFlag_Export #DeviceFlag_Export_Fields th span{margin-top:4px;font-size:.8em;}#DeviceFlag_Export_Download_Dialog{padding-top:20px;text-align:center;}#DeviceFlag_Export_Download_Dialog h4{margin-bottom:30px;}#DeviceFlag_Export_Download_Dialog a{margin-bottom:20px;}#DeviceFlag_Export_Exporting{padding-top:50px;text-align:center;}#DeviceFlag_Export_Exporting i{margin-right:10px;color:#1e6dab;}#DocumentTemplate_BulkGenerate .actions{padding-bottom:.5em;text-align:right;}#DocumentTemplate_BulkGenerate table{max-width:850px;margin:auto;}#DocumentTemplate_BulkGenerate table tr.when-none{text-align:center;font-style:italic;}.dialog-item-picker{height:300px;overflow-y:auto;background-color:#fcfcfc;border:1px solid #ccc;}.dialog-item-picker>div{background-color:#fff;border-bottom:1px solid #ddd;padding:6px 0 6px 6px;cursor:pointer;}.dialog-item-picker>div:hover{background-color:#f4f4f4;}.dialog-item-picker>div.selected,.dialog-item-picker>div.selected:hover{background-color:#eee;}.dialog-item-picker>div.disabled{cursor:not-allowed;background-color:#f4f4f4;} \ No newline at end of file diff --git a/Disco.Web/ClientSource/Style/Device.css b/Disco.Web/ClientSource/Style/Device.css index ea4fdf1c..f5ae3112 100644 --- a/Disco.Web/ClientSource/Style/Device.css +++ b/Disco.Web/ClientSource/Style/Device.css @@ -91,6 +91,18 @@ #layout_PageHeading #Device_Show_Status span.icon { margin-right: 6px; } +#layout_PageHeading #Device_Show_Flags { + display: inline-block; + float: right; + height: 50px; + font-size: 0.6em; +} +#layout_PageHeading #Device_Show_Flags > i { + cursor: default; +} +#layout_PageHeading #Device_Show_Flags > i > .details { + display: none; +} #Device_Show #Device_Show_Subjects { table-layout: fixed; } @@ -404,6 +416,118 @@ background-color: inherit; border: 1px solid #fff; } +#Device_Show_Details_Actions_AddFlag_Dialog { + height: 400px; +} +#Device_Show_Details_Actions_AddFlag_Dialog .flagPicker { + position: absolute; + width: 250px; + height: 300px; + overflow-y: auto; + background-color: #fcfcfc; + border: 1px solid #ccc; +} +#Device_Show_Details_Actions_AddFlag_Dialog .flagPicker > div { + background-color: #fff; + border-bottom: 1px solid #ddd; + padding: 6px 0 6px 6px; + cursor: pointer; +} +#Device_Show_Details_Actions_AddFlag_Dialog .flagPicker > div:hover { + background-color: #f4f4f4; +} +#Device_Show_Details_Actions_AddFlag_Dialog .flagPicker > div.selected, +#Device_Show_Details_Actions_AddFlag_Dialog .flagPicker > div.selected:hover { + background-color: #eee; +} +#Device_Show_Details_Actions_AddFlag_Dialog .details { + display: none; + position: absolute; + left: 280px; + top: 1em; +} +#Device_Show_Details_Actions_AddFlag_Dialog .details h4 { + margin-bottom: 4px; +} +#Device_Show_Details_Actions_AddFlag_Dialog .details textarea { + min-width: 280px; + height: 200px; +} +#DeviceDetailTab-Flags #deviceFlags { + border: solid 1px #d8d8d8; + border-collapse: collapse; + table-layout: fixed; +} +#DeviceDetailTab-Flags #deviceFlags td { + border: solid 1px #d8d8d8; + background-color: #fff; +} +#DeviceDetailTab-Flags #deviceFlags th { + background-color: #eee; + border: solid 1px #d8d8d8; +} +#DeviceDetailTab-Flags #deviceFlags i.fa-edit { + position: absolute; + top: 0; + right: 0; + margin-top: 4px; + font-size: 1.1em; + cursor: pointer; + display: none; + color: #335A87; +} +#DeviceDetailTab-Flags #deviceFlags i.fa-edit:hover { + color: #5e8cc2; +} +#DeviceDetailTab-Flags #deviceFlags td:hover i.fa-edit { + display: inline-block; +} +#DeviceDetailTab-Flags #deviceFlags th.name { + width: 200px; +} +#DeviceDetailTab-Flags #deviceFlags tr.removed td { + background-color: #f4f4f4; +} +#DeviceDetailTab-Flags #deviceFlags td.name { + vertical-align: middle; +} +#DeviceDetailTab-Flags #deviceFlags td.name .fa-stack { + line-height: 1.6em; +} +#DeviceDetailTab-Flags #deviceFlags td.added, +#DeviceDetailTab-Flags #deviceFlags td.removed { + vertical-align: middle; +} +#DeviceDetailTab-Flags #deviceFlags td.added .expressionResult, +#DeviceDetailTab-Flags #deviceFlags td.removed .expressionResult { + margin-top: 4px; + font-style: italic; +} +#DeviceDetailTab-Flags #deviceFlags td.comments { + vertical-align: middle; +} +#DeviceDetailTab-Flags #deviceFlags td.comments .editable { + position: relative; +} +#DeviceDetailTab-Flags #deviceFlags td.comments .commentsRaw { + display: none; +} +#DeviceDetailTab-Flags #deviceFlags td.removed.na { + vertical-align: middle; + text-align: center; +} +#DeviceDetailTab-Flags > .none { + text-align: center; + padding: 30px 0; + font-style: italic; + background-color: #fff; +} +#Device_Show_Flags_Actions_EditComments_Dialog h4 { + margin-bottom: 4px; +} +#Device_Show_Flags_Actions_EditComments_Dialog_Comments { + width: 280px; +} #Devices_Export .Devices_Export_Type_Target { margin-top: 10px; display: none; diff --git a/Disco.Web/ClientSource/Style/Device.less b/Disco.Web/ClientSource/Style/Device.less index 5ef4c087..1831380a 100644 --- a/Disco.Web/ClientSource/Style/Device.less +++ b/Disco.Web/ClientSource/Style/Device.less @@ -18,6 +18,21 @@ margin-right: 6px; } } + + #Device_Show_Flags { + display: inline-block; + float: right; + height: 50px; + font-size: 0.6em; + + & > i { + cursor: default; + + & > .details { + display: none; + } + } + } } #Device_Show { @@ -188,6 +203,7 @@ } } } + .enforce-ou { padding-top: .5em; } @@ -393,6 +409,143 @@ } } +#Device_Show_Details_Actions_AddFlag_Dialog { + height: 400px; + + .flagPicker { + position: absolute; + width: 250px; + height: 300px; + overflow-y: auto; + background-color: #fcfcfc; + border: 1px solid #ccc; + + & > div { + background-color: @white; + border-bottom: 1px solid #ddd; + padding: 6px 0 6px 6px; + cursor: pointer; + + &:hover { + background-color: @TableDataBorderColour; + } + + &.selected, &.selected:hover { + background-color: @TableDataDarkBackgroundColour; + } + } + } + + .details { + display: none; + position: absolute; + left: 280px; + top: 1em; + + h4 { + margin-bottom: 4px; + } + + textarea { + min-width: 280px; + height: 200px; + } + } +} + +#DeviceDetailTab-Flags { + #deviceFlags { + .tableDataDark; + table-layout: fixed; + + i.fa-edit { + position: absolute; + top: 0; + right: 0; + margin-top: 4px; + font-size: 1.1em; + cursor: pointer; + display: none; + color: @HyperLinkColour; + + &:hover { + color: @HyperLinkHoverColour; + } + } + + td:hover i.fa-edit { + display: inline-block; + } + + th.name { + width: 200px; + } + + th.added { + } + + th.removed { + } + + tr.removed td { + background-color: @TableDataBorderColour; + } + + td.name { + vertical-align: middle; + + .fa-stack { + line-height: 1.6em; + } + } + + td.added, td.removed { + vertical-align: middle; + + .expressionResult { + margin-top: 4px; + font-style: italic; + } + } + + td.comments { + vertical-align: middle; + + .editable { + position: relative; + } + + .commentsRaw { + display: none; + } + } + + td.removed { + &.na { + vertical-align: middle; + text-align: center; + } + } + } + + & > .none { + text-align: center; + padding: 30px 0; + font-style: italic; + background-color: @white; + } +} + +#Device_Show_Flags_Actions_EditComments_Dialog { + h4 { + margin-bottom: 4px; + } +} + +#Device_Show_Flags_Actions_EditComments_Dialog_Comments { + width: 280px; +} + #Devices_Export { .Devices_Export_Type_Target { margin-top: 10px; diff --git a/Disco.Web/ClientSource/Style/Device.min.css b/Disco.Web/ClientSource/Style/Device.min.css index 490b6274..dc42c26e 100644 --- a/Disco.Web/ClientSource/Style/Device.min.css +++ b/Disco.Web/ClientSource/Style/Device.min.css @@ -1 +1 @@ -.tableData{border:solid 1px #f4f4f4;border-collapse:collapse;}.tableData>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}.tableData>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}.tableData>thead>tr>th,.tableData>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}.tableData>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}.tableData>tfoot>tr>th,.tableData>tfoot>tr>td{background-color:#f4f4f4;}.tableDataDark{border:solid 1px #d8d8d8;border-collapse:collapse;}.tableDataDark td{border:solid 1px #d8d8d8;background-color:#fff;}.tableDataDark th{background-color:#eee;border:solid 1px #d8d8d8;}.tableDataContainer{background-color:#fff;}.tableDataVertical{border:solid 1px #f4f4f4;border-collapse:collapse;}.tableDataVertical>tbody>tr:nth-child(odd){background-color:#f4f4f4;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;}#layout_PageHeading #Device_Show_Status{margin-left:20px;display:inline-block;height:50px;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-weight:lighter;font-stretch:condensed;font-size:.7em;text-transform:uppercase;}#layout_PageHeading #Device_Show_Status span.icon{margin-right:6px;}#Device_Show #Device_Show_Subjects{table-layout:fixed;}#Device_Show #Device_Show_Subjects>tbody>tr>td{padding-top:0;height:100%;}#Device_Show #Device_Show_Subjects>tbody>tr>td>div{position:relative;}#Device_Show #Device_Show_Subjects>tbody>tr>td>div div.status{margin-top:2px;padding-top:2px;border-top:1px dashed #ddd;}#Device_Show #Device_Show_Subjects>tbody>tr>td>div input.discreet{margin-left:-2px;}#Device_Show #Device_Show_Subjects>tbody>tr>td:not(:last-child){border-right:1px dashed #aaa;}#Device_Show #Device_Show_Subjects #Device_Show_Details table.verticalHeadings>tbody>tr>td:first-child{width:104px;font-weight:600;}#Device_Show #Device_Show_Subjects #Device_Show_Details #Device_Show_Details_Asset_Name{font-weight:600;}#Device_Show #Device_Show_Subjects #Device_Show_Details #Device_Show_Details_Asset_Enrolled_Trusted{display:inline-block;height:16px;padding-left:16px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACWUlEQVQ4y6XRXWiSURgHcJsXa4WNNuuyiy6CoAupixERoXXhmljuxaJiFrVA1i72cVFCOSMt8rNt2YfGO5g5Z1NstWW+c4ZBq4QpqMkEbZDSCObAMprjdf90sIjxsgUdODd/zvmd5zwPCwDrf/aGB7q6utgmk8ngdruzVqt10eVyTWu1Wuk/AXK5vMpoNPpjsRgGbU8/9fbdH/J4PAuRSARKpfLKhoBYLG595nTCaDSZVjPp6TPbHQ5H0mAwfBeJRHXrAp0dna9JcqCguX2H/Xd+S625aLFYQBDE8XWBd+8/TI6Njc+vzcfGX4nLX4FOp5OuC0wGAlS53NzaPPAm2Gi32+H3+5tYJEl+pigKoVAIPp+PnpqaosPhMF1uHB2Px2mv14vya6VgMKhhHGN3d/dSMplENptFIpHA3NwcCoUCSqUSKqvScZVKBbPZHGQEFApFMZ1OI5PJIBqNrkD5fB40Ta8AlcrUajVsNpufEbh+42YxHEkh+/UbUqlZpGd/lAH8WTMzMzDd64d7NMAMDOobi/OpHqh6rqK9jcCvBQncQzK0Xm5DPn0BJ4lz6GgVIkedYAaamxqK0dEDePl4FziczehTsZGLs7BnNwdiwRac4lejvp6La83VzABv/8FF/qG9oD/WQS/fhNptHEw8rEJiuAo7ubXACAtH9m0Fu2YHxQzweEuEVIYnaiFmvQ04f1aItksi5KaP4ZFGjDB5GG/7j4LL5YYYgZYW2c/yiJbv6h/A0EvC4RjGiOsFnK4J+KgABmyjsDufL0skki8CgYCoXOLz+TWrwG+kXMkgQ6yv+QAAAABJRU5ErkJggg==);background-repeat:no-repeat;}#Device_Show #Device_Show_Subjects #Device_Show_Details #Device_Show_User #Device_Show_User_Photo_Container{float:left;padding-right:2px;}#Device_Show #Device_Show_Subjects #Device_Show_Details #Device_Show_User #Device_Show_User_Photo{max-width:48px;height:auto;}#Device_Show #Device_Show_Subjects #Device_Show_Details #Device_Show_User #Device_Show_User_Flags{font-size:16px;}#Device_Show #Device_Show_Subjects #Device_Show_Details #Device_Show_User #Device_Show_User_Flags>i{cursor:default;}#Device_Show #Device_Show_Subjects #Device_Show_Details #Device_Show_User #Device_Show_User_Flags>i>.details{display:none;}#Device_Show #Device_Show_Subjects #Device_Show_Details #Device_Show_GenerateDocument_Container{padding-top:4px;}#Device_Show #Device_Show_Subjects #Device_Show_Policies table.verticalHeadings>tbody>tr>td:first-child{width:120px;font-weight:600;}#Device_Show #Device_Show_Subjects #Device_Show_Aspects #Device_Show_Aspects_Model_Image{display:block;width:256px;height:256px;margin:0 auto;}#Device_Show #Device_Show_Subjects #Device_Show_Subjects_Actions>td{padding-top:4px;}#DeviceDetailTabs{margin-top:10px;border-radius:0;background-image:none;background-color:#fff;border:0;padding:0;}#DeviceDetailTabs #DeviceDetailTabItems{border-radius:0;border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;border-bottom:0;padding:2px 0 0 4px;background-image:none;background-color:#eee;display:table;}#DeviceDetailTabs #DeviceDetailTabItems>li{top:0;border-radius:0;margin:0 5px 0 0;padding:0;line-height:normal;margin-right:4px;}#DeviceDetailTabs #DeviceDetailTabItems>li>a{padding:5px 8px;}#DeviceDetailTabs div.ui-tabs-panel{border-radius:0;padding:4px;border-right:1px solid #ddd;border-bottom:1px solid #ddd;border-left:1px solid #ddd;border-top:0;background-color:#eee;}#Device_Show_Policies_Profile_Actions_Update_Dialog .profile-list,#Device_Show_Policies_Batch_Actions_Update_Dialog .profile-list{max-height:300px;overflow-y:auto;}#Device_Show_Policies_Profile_Actions_Update_Dialog .profile-list li,#Device_Show_Policies_Batch_Actions_Update_Dialog .profile-list li{background-color:#fff;padding:2px 0 2px 4px;}#Device_Show_Policies_Profile_Actions_Update_Dialog .profile-list li:nth-child(odd),#Device_Show_Policies_Batch_Actions_Update_Dialog .profile-list li:nth-child(odd){background-color:hsl(0,0%,98.5%);}#Device_Show_Policies_Profile_Actions_Update_Dialog .profile-list li.selected,#Device_Show_Policies_Batch_Actions_Update_Dialog .profile-list li.selected{background-color:#cddbec;font-weight:600;}#Device_Show_Policies_Profile_Actions_Update_Dialog .enforce-ou,#Device_Show_Policies_Batch_Actions_Update_Dialog .enforce-ou{padding-top:.5em;}#DeviceDetailTab-JobsContainer div.jobTable{margin:-1px;border:1px solid #ddd;}#DeviceDetailTab-JobsContainer .dataTables_wrapper .dataTables_filter{margin-top:-24px;-moz-opacity:1;opacity:1;}#DeviceDetailTab-JobsContainer .dataTables_wrapper .dataTables_length{margin-top:-24px;-moz-opacity:1;opacity:1;}#DeviceDetailTab-JobsContainer .dataTables_wrapper .dataTables_showStatusClosed{right:220px;margin-top:-24px;}#DeviceDetailTab-DetailsContainer>table{border:solid 1px #f4f4f4;border-collapse:collapse;}#DeviceDetailTab-DetailsContainer>table>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}#DeviceDetailTab-DetailsContainer>table>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}#DeviceDetailTab-DetailsContainer>table>thead>tr>th,#DeviceDetailTab-DetailsContainer>table>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}#DeviceDetailTab-DetailsContainer>table>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}#DeviceDetailTab-DetailsContainer>table>tfoot>tr>th,#DeviceDetailTab-DetailsContainer>table>tfoot>tr>td{background-color:#f4f4f4;}#DeviceDetailTab-DetailsContainer>table>tbody>tr>th{width:150px;}#DeviceDetailTab-DetailsContainer>table>tbody>tr>th,#DeviceDetailTab-DetailsContainer>table>tbody>tr>td.pad{padding:10px 6px;}#DeviceDetailTab-DetailsContainer .device_detail_disk_drives .partition{position:relative;height:40px;}#DeviceDetailTab-DetailsContainer .device_detail_disk_drives .partition>span{position:absolute;display:block;height:40px;box-sizing:border-box;overflow-x:hidden;overflow-y:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:#f4f4f4;padding:2px;line-height:18px;border:1px solid #cacaca;}#DeviceDetailTab-DetailsContainer .device_detail_disk_drives .partition>span .details{position:relative;}#DeviceDetailTab-DetailsContainer .device_detail_disk_drives .partition>span .freespace{position:absolute;top:0;height:40px;display:block;background-color:#fff;background:repeating-linear-gradient(45deg,#f4f4f4,#f4f4f4 10px,#fff 10px,#fff 20px);}#deviceShowResources #AttachmentsContainer{padding:0;}#deviceShowResources #Attachments{position:relative;border:1px solid #ccc;background-color:#fff;}#deviceShowResources #Attachments div.attachmentOutput{position:relative;height:115px;overflow:auto;}#deviceShowResources #Attachments div.attachmentOutput>a{display:block;float:left;height:48px;width:221px;padding:2px;margin:2px;font-size:.9em;border:1px solid #fff;color:#000;text-decoration:none;}#deviceShowResources #Attachments div.attachmentOutput>a span.comments,#deviceShowResources #Attachments div.attachmentOutput>a span.author,#deviceShowResources #Attachments div.attachmentOutput>a span.timestamp{display:block;float:left;width:168px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;height:16px;}#deviceShowResources #Attachments div.attachmentOutput>a span.author{color:#888;width:150px;}#deviceShowResources #Attachments div.attachmentOutput>a span.timestamp{color:#888;font-style:italic;}#deviceShowResources #Attachments div.attachmentOutput>a span.icon{display:block;float:left;height:48px;width:48px;margin-right:2px;}#deviceShowResources #Attachments div.attachmentOutput>a span.icon img{height:48px;width:48px;}#deviceShowResources #Attachments div.attachmentOutput>a span.icon img.loading{display:none;}#deviceShowResources #Attachments div.attachmentOutput>a:hover{background-color:#ededed;border:1px solid #ccc;}#deviceShowResources #Attachments div.attachmentOutput>a:hover span.remove{opacity:.5;}#deviceShowResources #Attachments div.attachmentOutput>a span.remove{font-size:1.4em;color:#e51400;margin-left:6px;cursor:pointer;opacity:0;}#deviceShowResources #Attachments div.attachmentOutput>a span.remove:hover{opacity:1;}#deviceShowResources #Attachments div.attachmentInput{border-top:1px solid #ccc;height:40px;background-color:#fff;padding:3px;}#deviceShowResources #Attachments div.attachmentInput span.action{color:#333;display:block;margin:0 4px 0 0;font-size:1.5em;cursor:pointer;float:right;border:1px solid #fff;padding:.5em;}#deviceShowResources #Attachments div.attachmentInput span.action:hover{color:#335a87;background-color:#ededed;border:1px solid #ccc;}#deviceShowResources #Attachments div.attachmentInput span.action.disabled{color:rgba(51,51,51,.2);cursor:default;}#deviceShowResources #Attachments div.attachmentInput span.action.disabled:hover{color:rgba(51,51,51,.2);background-color:inherit;border:1px solid #fff;}#Devices_Export .Devices_Export_Type_Target{margin-top:10px;display:none;}#Devices_Export #Devices_Export_Fields #Devices_Export_Fields_Defaults{font-size:.75em;}#Devices_Export #Devices_Export_Fields th{font-size:1.05em;}#Devices_Export #Devices_Export_Fields th span{margin-top:4px;font-size:.8em;}#Devices_Export_Download_Dialog{padding-top:20px;text-align:center;}#Devices_Export_Download_Dialog h4{margin-bottom:30px;}#Devices_Export_Download_Dialog a{margin-bottom:20px;}#Devices_Export_Exporting{padding-top:50px;text-align:center;}#Devices_Export_Exporting i{margin-right:10px;color:#1e6dab;}#Devices_Import #ImportFile{width:96%;margin-bottom:8px;}#Devices_Import #Devices_Import_Documentation{width:700px;margin:20px auto;}#Devices_Import #Devices_Import_Documentation>table>tbody th:first-child{width:220px;}#Devices_Import_Completed_Dialog{padding:50px 0;text-align:center;}#Devices_Import_Completed_Dialog h3{margin-bottom:16px;}#Devices_Import_Completed_Dialog i{margin-right:10px;color:#60a917;}#Devices_Import_Loading_Dialog{padding-top:50px;text-align:center;}#Devices_Import_Loading_Dialog i{margin-right:10px;color:#1e6dab;}#Devices_Import_Headers #Devices_Import_Headers_TableContainer{margin:18px 0;overflow-x:auto;border:1px solid #ccc;}#Devices_Import_Headers #Devices_Import_Headers_TableContainer table>thead{white-space:nowrap;}#Devices_Import_Headers #Devices_Import_Headers_TableContainer table>thead ul.importHeaderType>li>a>span:not(.ui-menu-icon){padding-right:16px;}#Devices_Import_Headers #Devices_Import_Headers_TableContainer table>thead ul.importHeaderType ul{z-index:1000;}#Devices_Import_Headers #Devices_Import_Headers_TableContainer table>thead td.headerIgnoreColumn{background-color:#fa6800;}#Devices_Import_Headers #Devices_Import_Headers_TableContainer table>thead td:not(.headerIgnoreColumn){background-color:#1e6dab;}#Devices_Import_Headers #Devices_Import_Headers_TableContainer table>tbody td.headerDeviceSerialNumber{border-top-color:#d1e6f7;border-bottom-color:#d1e6f7;background-color:#e2f0fa;}#Devices_Import_Headers #Devices_Import_Headers_TableContainer table>tbody td.headerIgnoreColumn{max-width:150px;white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;color:#ccc;}#Devices_Import_Parsing_Dialog{padding-top:50px;text-align:center;}#Devices_Import_Parsing_Dialog i{margin-right:10px;color:#1e6dab;}#Devices_Import_Review #Devices_Import_Review_Navigation{margin-top:15px;text-align:right;}#Devices_Import_Review #Devices_Import_Review_Navigation ul{display:inline-block;padding:0;border:1px solid #bbb;}#Devices_Import_Review #Devices_Import_Review_Navigation ul li{display:inline-block;padding:3px 10px;margin:0;}#Devices_Import_Review #Devices_Import_Review_Navigation ul li.actionDetached{background-color:#ffd0cc;}#Devices_Import_Review #Devices_Import_Review_Navigation ul li.actionModified{background-color:#e2f0fa;}#Devices_Import_Review #Devices_Import_Review_Navigation ul li.actionAdded{background-color:#e7f9d5;}#Devices_Import_Review #Devices_Import_Review_Navigation ul li.actionUnchanged{background-color:hsl(0,0%,98.5%);}#Devices_Import_Review #Devices_Import_Review_TableContainer{margin:18px 0;overflow-x:auto;border:1px solid #ccc;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>thead{white-space:nowrap;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>thead tr:nth-child(2) th{padding-top:0;font-weight:normal;font-size:.9em;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.action{text-align:center;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody tr.actionDetached td.action i:before{color:#e51400;content:"";}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody tr.actionDetached td{background-color:#ffe7e5;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody tr.actionUnchanged td.action i:before{content:"";}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody tr.actionUnchanged td{background-color:hsl(0,0%,98.5%);}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody tr.actionUnchanged td:nth-child(n+3){color:#ccc;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody tr.actionModified td.action i:before{color:#1e6dab;content:"";}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody tr.actionModified td{background-color:#f4f9fd;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody tr.actionAdded td.action i:before{color:#60a917;content:"";}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody tr.actionAdded td{background-color:#e7f9d5;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody tr:not(.actionUnchanged) td.actionUnchanged:nth-child(n+3):not(.headerDeviceSerialNumber){color:#ccc;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.actionError{color:#e51400;background-color:#fff1ef;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.actionError span.errorMessage{display:none;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.actionModified{background-color:#e2f0fa!important;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.headerDeviceSerialNumber,#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.headerDeviceDecommissionedDate,#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.headerDeviceDecommissionedReason,#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.headerModelId,#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.headerBatchId,#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.headerProfileId,#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.headerAssignedUserId{white-space:nowrap;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody span.smallMessage{color:inherit;} \ No newline at end of file +.tableData{border:solid 1px #f4f4f4;border-collapse:collapse;}.tableData>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}.tableData>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}.tableData>thead>tr>th,.tableData>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}.tableData>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}.tableData>tfoot>tr>th,.tableData>tfoot>tr>td{background-color:#f4f4f4;}.tableDataDark{border:solid 1px #d8d8d8;border-collapse:collapse;}.tableDataDark td{border:solid 1px #d8d8d8;background-color:#fff;}.tableDataDark th{background-color:#eee;border:solid 1px #d8d8d8;}.tableDataContainer{background-color:#fff;}.tableDataVertical{border:solid 1px #f4f4f4;border-collapse:collapse;}.tableDataVertical>tbody>tr:nth-child(odd){background-color:#f4f4f4;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;}#layout_PageHeading #Device_Show_Status{margin-left:20px;display:inline-block;height:50px;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-weight:lighter;font-stretch:condensed;font-size:.7em;text-transform:uppercase;}#layout_PageHeading #Device_Show_Status span.icon{margin-right:6px;}#layout_PageHeading #Device_Show_Flags{display:inline-block;float:right;height:50px;font-size:.6em;}#layout_PageHeading #Device_Show_Flags>i{cursor:default;}#layout_PageHeading #Device_Show_Flags>i>.details{display:none;}#Device_Show #Device_Show_Subjects{table-layout:fixed;}#Device_Show #Device_Show_Subjects>tbody>tr>td{padding-top:0;height:100%;}#Device_Show #Device_Show_Subjects>tbody>tr>td>div{position:relative;}#Device_Show #Device_Show_Subjects>tbody>tr>td>div div.status{margin-top:2px;padding-top:2px;border-top:1px dashed #ddd;}#Device_Show #Device_Show_Subjects>tbody>tr>td>div input.discreet{margin-left:-2px;}#Device_Show #Device_Show_Subjects>tbody>tr>td:not(:last-child){border-right:1px dashed #aaa;}#Device_Show #Device_Show_Subjects #Device_Show_Details table.verticalHeadings>tbody>tr>td:first-child{width:104px;font-weight:600;}#Device_Show #Device_Show_Subjects #Device_Show_Details #Device_Show_Details_Asset_Name{font-weight:600;}#Device_Show #Device_Show_Subjects #Device_Show_Details #Device_Show_Details_Asset_Enrolled_Trusted{display:inline-block;height:16px;padding-left:16px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACWUlEQVQ4y6XRXWiSURgHcJsXa4WNNuuyiy6CoAupixERoXXhmljuxaJiFrVA1i72cVFCOSMt8rNt2YfGO5g5Z1NstWW+c4ZBq4QpqMkEbZDSCObAMprjdf90sIjxsgUdODd/zvmd5zwPCwDrf/aGB7q6utgmk8ngdruzVqt10eVyTWu1Wuk/AXK5vMpoNPpjsRgGbU8/9fbdH/J4PAuRSARKpfLKhoBYLG595nTCaDSZVjPp6TPbHQ5H0mAwfBeJRHXrAp0dna9JcqCguX2H/Xd+S625aLFYQBDE8XWBd+8/TI6Njc+vzcfGX4nLX4FOp5OuC0wGAlS53NzaPPAm2Gi32+H3+5tYJEl+pigKoVAIPp+PnpqaosPhMF1uHB2Px2mv14vya6VgMKhhHGN3d/dSMplENptFIpHA3NwcCoUCSqUSKqvScZVKBbPZHGQEFApFMZ1OI5PJIBqNrkD5fB40Ta8AlcrUajVsNpufEbh+42YxHEkh+/UbUqlZpGd/lAH8WTMzMzDd64d7NMAMDOobi/OpHqh6rqK9jcCvBQncQzK0Xm5DPn0BJ4lz6GgVIkedYAaamxqK0dEDePl4FziczehTsZGLs7BnNwdiwRac4lejvp6La83VzABv/8FF/qG9oD/WQS/fhNptHEw8rEJiuAo7ubXACAtH9m0Fu2YHxQzweEuEVIYnaiFmvQ04f1aItksi5KaP4ZFGjDB5GG/7j4LL5YYYgZYW2c/yiJbv6h/A0EvC4RjGiOsFnK4J+KgABmyjsDufL0skki8CgYCoXOLz+TWrwG+kXMkgQ6yv+QAAAABJRU5ErkJggg==);background-repeat:no-repeat;}#Device_Show #Device_Show_Subjects #Device_Show_Details #Device_Show_User #Device_Show_User_Photo_Container{float:left;padding-right:2px;}#Device_Show #Device_Show_Subjects #Device_Show_Details #Device_Show_User #Device_Show_User_Photo{max-width:48px;height:auto;}#Device_Show #Device_Show_Subjects #Device_Show_Details #Device_Show_User #Device_Show_User_Flags{font-size:16px;}#Device_Show #Device_Show_Subjects #Device_Show_Details #Device_Show_User #Device_Show_User_Flags>i{cursor:default;}#Device_Show #Device_Show_Subjects #Device_Show_Details #Device_Show_User #Device_Show_User_Flags>i>.details{display:none;}#Device_Show #Device_Show_Subjects #Device_Show_Details #Device_Show_GenerateDocument_Container{padding-top:4px;}#Device_Show #Device_Show_Subjects #Device_Show_Policies table.verticalHeadings>tbody>tr>td:first-child{width:120px;font-weight:600;}#Device_Show #Device_Show_Subjects #Device_Show_Aspects #Device_Show_Aspects_Model_Image{display:block;width:256px;height:256px;margin:0 auto;}#Device_Show #Device_Show_Subjects #Device_Show_Subjects_Actions>td{padding-top:4px;}#DeviceDetailTabs{margin-top:10px;border-radius:0;background-image:none;background-color:#fff;border:0;padding:0;}#DeviceDetailTabs #DeviceDetailTabItems{border-radius:0;border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;border-bottom:0;padding:2px 0 0 4px;background-image:none;background-color:#eee;display:table;}#DeviceDetailTabs #DeviceDetailTabItems>li{top:0;border-radius:0;margin:0 5px 0 0;padding:0;line-height:normal;margin-right:4px;}#DeviceDetailTabs #DeviceDetailTabItems>li>a{padding:5px 8px;}#DeviceDetailTabs div.ui-tabs-panel{border-radius:0;padding:4px;border-right:1px solid #ddd;border-bottom:1px solid #ddd;border-left:1px solid #ddd;border-top:0;background-color:#eee;}#Device_Show_Policies_Profile_Actions_Update_Dialog .profile-list,#Device_Show_Policies_Batch_Actions_Update_Dialog .profile-list{max-height:300px;overflow-y:auto;}#Device_Show_Policies_Profile_Actions_Update_Dialog .profile-list li,#Device_Show_Policies_Batch_Actions_Update_Dialog .profile-list li{background-color:#fff;padding:2px 0 2px 4px;}#Device_Show_Policies_Profile_Actions_Update_Dialog .profile-list li:nth-child(odd),#Device_Show_Policies_Batch_Actions_Update_Dialog .profile-list li:nth-child(odd){background-color:hsl(0,0%,98.5%);}#Device_Show_Policies_Profile_Actions_Update_Dialog .profile-list li.selected,#Device_Show_Policies_Batch_Actions_Update_Dialog .profile-list li.selected{background-color:#cddbec;font-weight:600;}#Device_Show_Policies_Profile_Actions_Update_Dialog .enforce-ou,#Device_Show_Policies_Batch_Actions_Update_Dialog .enforce-ou{padding-top:.5em;}#DeviceDetailTab-JobsContainer div.jobTable{margin:-1px;border:1px solid #ddd;}#DeviceDetailTab-JobsContainer .dataTables_wrapper .dataTables_filter{margin-top:-24px;-moz-opacity:1;opacity:1;}#DeviceDetailTab-JobsContainer .dataTables_wrapper .dataTables_length{margin-top:-24px;-moz-opacity:1;opacity:1;}#DeviceDetailTab-JobsContainer .dataTables_wrapper .dataTables_showStatusClosed{right:220px;margin-top:-24px;}#DeviceDetailTab-DetailsContainer>table{border:solid 1px #f4f4f4;border-collapse:collapse;}#DeviceDetailTab-DetailsContainer>table>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}#DeviceDetailTab-DetailsContainer>table>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}#DeviceDetailTab-DetailsContainer>table>thead>tr>th,#DeviceDetailTab-DetailsContainer>table>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}#DeviceDetailTab-DetailsContainer>table>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}#DeviceDetailTab-DetailsContainer>table>tfoot>tr>th,#DeviceDetailTab-DetailsContainer>table>tfoot>tr>td{background-color:#f4f4f4;}#DeviceDetailTab-DetailsContainer>table>tbody>tr>th{width:150px;}#DeviceDetailTab-DetailsContainer>table>tbody>tr>th,#DeviceDetailTab-DetailsContainer>table>tbody>tr>td.pad{padding:10px 6px;}#DeviceDetailTab-DetailsContainer .device_detail_disk_drives .partition{position:relative;height:40px;}#DeviceDetailTab-DetailsContainer .device_detail_disk_drives .partition>span{position:absolute;display:block;height:40px;box-sizing:border-box;overflow-x:hidden;overflow-y:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:#f4f4f4;padding:2px;line-height:18px;border:1px solid #cacaca;}#DeviceDetailTab-DetailsContainer .device_detail_disk_drives .partition>span .details{position:relative;}#DeviceDetailTab-DetailsContainer .device_detail_disk_drives .partition>span .freespace{position:absolute;top:0;height:40px;display:block;background-color:#fff;background:repeating-linear-gradient(45deg,#f4f4f4,#f4f4f4 10px,#fff 10px,#fff 20px);}#deviceShowResources #AttachmentsContainer{padding:0;}#deviceShowResources #Attachments{position:relative;border:1px solid #ccc;background-color:#fff;}#deviceShowResources #Attachments div.attachmentOutput{position:relative;height:115px;overflow:auto;}#deviceShowResources #Attachments div.attachmentOutput>a{display:block;float:left;height:48px;width:221px;padding:2px;margin:2px;font-size:.9em;border:1px solid #fff;color:#000;text-decoration:none;}#deviceShowResources #Attachments div.attachmentOutput>a span.comments,#deviceShowResources #Attachments div.attachmentOutput>a span.author,#deviceShowResources #Attachments div.attachmentOutput>a span.timestamp{display:block;float:left;width:168px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;height:16px;}#deviceShowResources #Attachments div.attachmentOutput>a span.author{color:#888;width:150px;}#deviceShowResources #Attachments div.attachmentOutput>a span.timestamp{color:#888;font-style:italic;}#deviceShowResources #Attachments div.attachmentOutput>a span.icon{display:block;float:left;height:48px;width:48px;margin-right:2px;}#deviceShowResources #Attachments div.attachmentOutput>a span.icon img{height:48px;width:48px;}#deviceShowResources #Attachments div.attachmentOutput>a span.icon img.loading{display:none;}#deviceShowResources #Attachments div.attachmentOutput>a:hover{background-color:#ededed;border:1px solid #ccc;}#deviceShowResources #Attachments div.attachmentOutput>a:hover span.remove{opacity:.5;}#deviceShowResources #Attachments div.attachmentOutput>a span.remove{font-size:1.4em;color:#e51400;margin-left:6px;cursor:pointer;opacity:0;}#deviceShowResources #Attachments div.attachmentOutput>a span.remove:hover{opacity:1;}#deviceShowResources #Attachments div.attachmentInput{border-top:1px solid #ccc;height:40px;background-color:#fff;padding:3px;}#deviceShowResources #Attachments div.attachmentInput span.action{color:#333;display:block;margin:0 4px 0 0;font-size:1.5em;cursor:pointer;float:right;border:1px solid #fff;padding:.5em;}#deviceShowResources #Attachments div.attachmentInput span.action:hover{color:#335a87;background-color:#ededed;border:1px solid #ccc;}#deviceShowResources #Attachments div.attachmentInput span.action.disabled{color:rgba(51,51,51,.2);cursor:default;}#deviceShowResources #Attachments div.attachmentInput span.action.disabled:hover{color:rgba(51,51,51,.2);background-color:inherit;border:1px solid #fff;}#Device_Show_Details_Actions_AddFlag_Dialog{height:400px;}#Device_Show_Details_Actions_AddFlag_Dialog .flagPicker{position:absolute;width:250px;height:300px;overflow-y:auto;background-color:#fcfcfc;border:1px solid #ccc;}#Device_Show_Details_Actions_AddFlag_Dialog .flagPicker>div{background-color:#fff;border-bottom:1px solid #ddd;padding:6px 0 6px 6px;cursor:pointer;}#Device_Show_Details_Actions_AddFlag_Dialog .flagPicker>div:hover{background-color:#f4f4f4;}#Device_Show_Details_Actions_AddFlag_Dialog .flagPicker>div.selected,#Device_Show_Details_Actions_AddFlag_Dialog .flagPicker>div.selected:hover{background-color:#eee;}#Device_Show_Details_Actions_AddFlag_Dialog .details{display:none;position:absolute;left:280px;top:1em;}#Device_Show_Details_Actions_AddFlag_Dialog .details h4{margin-bottom:4px;}#Device_Show_Details_Actions_AddFlag_Dialog .details textarea{min-width:280px;height:200px;}#DeviceDetailTab-Flags #deviceFlags{border:solid 1px #d8d8d8;border-collapse:collapse;table-layout:fixed;}#DeviceDetailTab-Flags #deviceFlags td{border:solid 1px #d8d8d8;background-color:#fff;}#DeviceDetailTab-Flags #deviceFlags th{background-color:#eee;border:solid 1px #d8d8d8;}#DeviceDetailTab-Flags #deviceFlags i.fa-edit{position:absolute;top:0;right:0;margin-top:4px;font-size:1.1em;cursor:pointer;display:none;color:#335a87;}#DeviceDetailTab-Flags #deviceFlags i.fa-edit:hover{color:#5e8cc2;}#DeviceDetailTab-Flags #deviceFlags td:hover i.fa-edit{display:inline-block;}#DeviceDetailTab-Flags #deviceFlags th.name{width:200px;}#DeviceDetailTab-Flags #deviceFlags tr.removed td{background-color:#f4f4f4;}#DeviceDetailTab-Flags #deviceFlags td.name{vertical-align:middle;}#DeviceDetailTab-Flags #deviceFlags td.name .fa-stack{line-height:1.6em;}#DeviceDetailTab-Flags #deviceFlags td.added,#DeviceDetailTab-Flags #deviceFlags td.removed{vertical-align:middle;}#DeviceDetailTab-Flags #deviceFlags td.added .expressionResult,#DeviceDetailTab-Flags #deviceFlags td.removed .expressionResult{margin-top:4px;font-style:italic;}#DeviceDetailTab-Flags #deviceFlags td.comments{vertical-align:middle;}#DeviceDetailTab-Flags #deviceFlags td.comments .editable{position:relative;}#DeviceDetailTab-Flags #deviceFlags td.comments .commentsRaw{display:none;}#DeviceDetailTab-Flags #deviceFlags td.removed.na{vertical-align:middle;text-align:center;}#DeviceDetailTab-Flags>.none{text-align:center;padding:30px 0;font-style:italic;background-color:#fff;}#Device_Show_Flags_Actions_EditComments_Dialog h4{margin-bottom:4px;}#Device_Show_Flags_Actions_EditComments_Dialog_Comments{width:280px;}#Devices_Export .Devices_Export_Type_Target{margin-top:10px;display:none;}#Devices_Export #Devices_Export_Fields #Devices_Export_Fields_Defaults{font-size:.75em;}#Devices_Export #Devices_Export_Fields th{font-size:1.05em;}#Devices_Export #Devices_Export_Fields th span{margin-top:4px;font-size:.8em;}#Devices_Export_Download_Dialog{padding-top:20px;text-align:center;}#Devices_Export_Download_Dialog h4{margin-bottom:30px;}#Devices_Export_Download_Dialog a{margin-bottom:20px;}#Devices_Export_Exporting{padding-top:50px;text-align:center;}#Devices_Export_Exporting i{margin-right:10px;color:#1e6dab;}#Devices_Import #ImportFile{width:96%;margin-bottom:8px;}#Devices_Import #Devices_Import_Documentation{width:700px;margin:20px auto;}#Devices_Import #Devices_Import_Documentation>table>tbody th:first-child{width:220px;}#Devices_Import_Completed_Dialog{padding:50px 0;text-align:center;}#Devices_Import_Completed_Dialog h3{margin-bottom:16px;}#Devices_Import_Completed_Dialog i{margin-right:10px;color:#60a917;}#Devices_Import_Loading_Dialog{padding-top:50px;text-align:center;}#Devices_Import_Loading_Dialog i{margin-right:10px;color:#1e6dab;}#Devices_Import_Headers #Devices_Import_Headers_TableContainer{margin:18px 0;overflow-x:auto;border:1px solid #ccc;}#Devices_Import_Headers #Devices_Import_Headers_TableContainer table>thead{white-space:nowrap;}#Devices_Import_Headers #Devices_Import_Headers_TableContainer table>thead ul.importHeaderType>li>a>span:not(.ui-menu-icon){padding-right:16px;}#Devices_Import_Headers #Devices_Import_Headers_TableContainer table>thead ul.importHeaderType ul{z-index:1000;}#Devices_Import_Headers #Devices_Import_Headers_TableContainer table>thead td.headerIgnoreColumn{background-color:#fa6800;}#Devices_Import_Headers #Devices_Import_Headers_TableContainer table>thead td:not(.headerIgnoreColumn){background-color:#1e6dab;}#Devices_Import_Headers #Devices_Import_Headers_TableContainer table>tbody td.headerDeviceSerialNumber{border-top-color:#d1e6f7;border-bottom-color:#d1e6f7;background-color:#e2f0fa;}#Devices_Import_Headers #Devices_Import_Headers_TableContainer table>tbody td.headerIgnoreColumn{max-width:150px;white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;color:#ccc;}#Devices_Import_Parsing_Dialog{padding-top:50px;text-align:center;}#Devices_Import_Parsing_Dialog i{margin-right:10px;color:#1e6dab;}#Devices_Import_Review #Devices_Import_Review_Navigation{margin-top:15px;text-align:right;}#Devices_Import_Review #Devices_Import_Review_Navigation ul{display:inline-block;padding:0;border:1px solid #bbb;}#Devices_Import_Review #Devices_Import_Review_Navigation ul li{display:inline-block;padding:3px 10px;margin:0;}#Devices_Import_Review #Devices_Import_Review_Navigation ul li.actionDetached{background-color:#ffd0cc;}#Devices_Import_Review #Devices_Import_Review_Navigation ul li.actionModified{background-color:#e2f0fa;}#Devices_Import_Review #Devices_Import_Review_Navigation ul li.actionAdded{background-color:#e7f9d5;}#Devices_Import_Review #Devices_Import_Review_Navigation ul li.actionUnchanged{background-color:hsl(0,0%,98.5%);}#Devices_Import_Review #Devices_Import_Review_TableContainer{margin:18px 0;overflow-x:auto;border:1px solid #ccc;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>thead{white-space:nowrap;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>thead tr:nth-child(2) th{padding-top:0;font-weight:normal;font-size:.9em;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.action{text-align:center;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody tr.actionDetached td.action i:before{color:#e51400;content:"";}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody tr.actionDetached td{background-color:#ffe7e5;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody tr.actionUnchanged td.action i:before{content:"";}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody tr.actionUnchanged td{background-color:hsl(0,0%,98.5%);}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody tr.actionUnchanged td:nth-child(n+3){color:#ccc;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody tr.actionModified td.action i:before{color:#1e6dab;content:"";}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody tr.actionModified td{background-color:#f4f9fd;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody tr.actionAdded td.action i:before{color:#60a917;content:"";}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody tr.actionAdded td{background-color:#e7f9d5;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody tr:not(.actionUnchanged) td.actionUnchanged:nth-child(n+3):not(.headerDeviceSerialNumber){color:#ccc;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.actionError{color:#e51400;background-color:#fff1ef;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.actionError span.errorMessage{display:none;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.actionModified{background-color:#e2f0fa!important;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.headerDeviceSerialNumber,#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.headerDeviceDecommissionedDate,#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.headerDeviceDecommissionedReason,#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.headerModelId,#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.headerBatchId,#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.headerProfileId,#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody td.headerAssignedUserId{white-space:nowrap;}#Devices_Import_Review #Devices_Import_Review_TableContainer table>tbody span.smallMessage{color:inherit;} \ No newline at end of file diff --git a/Disco.Web/ClientSource/Style/Job.css b/Disco.Web/ClientSource/Style/Job.css index 08b79d5f..89f566fb 100644 --- a/Disco.Web/ClientSource/Style/Job.css +++ b/Disco.Web/ClientSource/Style/Job.css @@ -185,6 +185,16 @@ #Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Details { float: left; } +#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Flags { + margin: 4px 0; + font-size: 16px; +} +#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Flags > i { + cursor: default; +} +#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Flags > i > .details { + display: none; +} #Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Details_HWar, #Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Details_HNWar { float: right; diff --git a/Disco.Web/ClientSource/Style/Job.less b/Disco.Web/ClientSource/Style/Job.less index da94817c..c7f87ae6 100644 --- a/Disco.Web/ClientSource/Style/Job.less +++ b/Disco.Web/ClientSource/Style/Job.less @@ -143,6 +143,19 @@ float: left; } + #Job_Show_Device_Flags { + margin: 4px 0; + font-size: 16px; + + & > i { + cursor: default; + + & > .details { + display: none; + } + } + } + #Job_Show_Device_Details_HWar, #Job_Show_Device_Details_HNWar { float: right; border-left: 1px dashed #ddd; diff --git a/Disco.Web/ClientSource/Style/Job.min.css b/Disco.Web/ClientSource/Style/Job.min.css index 56967dba..30dae768 100644 --- a/Disco.Web/ClientSource/Style/Job.min.css +++ b/Disco.Web/ClientSource/Style/Job.min.css @@ -1 +1 @@ -.tableData{border:solid 1px #f4f4f4;border-collapse:collapse;}.tableData>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}.tableData>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}.tableData>thead>tr>th,.tableData>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}.tableData>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}.tableData>tfoot>tr>th,.tableData>tfoot>tr>td{background-color:#f4f4f4;}.tableDataDark{border:solid 1px #d8d8d8;border-collapse:collapse;}.tableDataDark td{border:solid 1px #d8d8d8;background-color:#fff;}.tableDataDark th{background-color:#eee;border:solid 1px #d8d8d8;}.tableDataContainer{background-color:#fff;}.tableDataVertical{border:solid 1px #f4f4f4;border-collapse:collapse;}.tableDataVertical>tbody>tr:nth-child(odd){background-color:#f4f4f4;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;}#layout_PageHeading #Job_Show_Status{margin-left:20px;display:inline-block;height:50px;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-weight:lighter;font-stretch:condensed;font-size:.7em;text-transform:uppercase;}#layout_PageHeading #Job_Show_Status span.icon{margin-right:6px;}#layout_PageHeading #Job_Show_QueueStatus{display:inline-block;float:right;height:50px;font-size:.6em;}#Jobs_Index_MyJobs{margin-bottom:10px;}#Jobs_Index_MyJobs .jobTable>h3,#Jobs_Index_StaleJobs .jobTable>h3{color:#555;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-weight:normal;font-size:12px;margin:8px 0 20px 20px!important;text-transform:uppercase;}#Job_List{padding-top:20px;}#Job_List>.jobTable>h3{margin:30px 0 50px 20px!important;}#Job_Show #Job_Show_Subjects{table-layout:fixed;}#Job_Show #Job_Show_Subjects>tbody>tr>td{padding-top:0;height:100%;}#Job_Show #Job_Show_Subjects>tbody>tr>td>div{position:relative;}#Job_Show #Job_Show_Subjects>tbody>tr>td>div div.status{margin-top:2px;padding-top:2px;border-top:1px dashed #ddd;}#Job_Show #Job_Show_Subjects>tbody>tr>td>div input.discreet{margin-left:-2px;}#Job_Show #Job_Show_Subjects>tbody>tr>td:not(:last-child){border-right:1px dashed #aaa;}#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_Job_Type>h2{text-transform:uppercase;font-size:16px;}#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_Job_Type>table{table-layout:fixed;}#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_Job_SubTypes_1,#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_Job_SubTypes_2{padding-left:16px;font-weight:600;}#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_Job_SubTypes_Update{margin-left:16px;font-size:.9em;}#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_Job_SubTypes_Update_Dialog{display:none;}#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_Job_Dates{padding-bottom:6px;}#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_Job_Dates table{table-layout:fixed;}#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_Job_Dates table>tbody>tr>td{vertical-align:middle;}#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_Job_Dates table>tbody>tr>td:first-child{font-weight:600;width:60px;}#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_GenerateDocument_Container{padding-top:4px;}#Job_Show #Job_Show_Subjects #Job_Show_Device>div{padding-left:102px;min-height:100px;}#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Model_Image{position:absolute;left:0;top:0;height:96px;width:96px;}#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Details{float:left;}#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Details_HWar,#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Details_HNWar{float:right;border-left:1px dashed #ddd;padding-left:4px;margin-right:2px;}#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Details_HWar_Details_Button,#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Details_HNWar_Details_Button{font-size:.9em;}#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_DeviceHeld table{table-layout:fixed;}#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_DeviceHeld table>tbody>tr>td:first-child{width:62px;}#Job_Show #Job_Show_Subjects #Job_Show_User #Job_Show_User_Photo_Container{float:left;padding-right:4px;}#Job_Show #Job_Show_Subjects #Job_Show_User #Job_Show_User_Photo{height:auto;max-width:96px;}#Job_Show #Job_Show_Subjects #Job_Show_User #Job_Show_User_Flags{margin:4px 0;font-size:16px;}#Job_Show #Job_Show_Subjects #Job_Show_User #Job_Show_User_Flags>i{cursor:default;}#Job_Show #Job_Show_Subjects #Job_Show_User #Job_Show_User_Flags>i>.details{display:none;}#Job_Show #Job_Show_Subjects #Job_Show_Subjects_Actions>td{padding-top:4px;}#Job_Show #Job_Show_Subjects #Job_Show_Subjects_Actions #Job_Show_Device_Actions{padding-left:111px;}#jobDetailTabs{margin-top:10px;border-radius:0;background-image:none;background-color:#fff;border:0;padding:0;}#jobDetailTabs #jobDetailTabItems{border-radius:0;border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;border-bottom:0;padding:2px 0 0 4px;background-image:none;background-color:#eee;display:table;}#jobDetailTabs #jobDetailTabItems>li{top:0;border-radius:0;margin:0 5px 0 0;padding:0;line-height:normal;margin-right:4px;}#jobDetailTabs #jobDetailTabItems>li>a{padding:5px 8px;}#jobDetailTabs div.ui-tabs-panel{border-radius:0;padding:4px;border-right:1px solid #ddd;border-bottom:1px solid #ddd;border-left:1px solid #ddd;border-top:0;background-color:#eee;}#jobShowResources #CommentsContainer{padding:0;width:375px;}#jobShowResources #Comments{height:300px;padding:0;border:1px solid #ccc;background-color:#fff;}#jobShowResources #Comments div.commentOutput{height:249px;overflow:auto;background-color:#fafafa;color:#000;}#jobShowResources #Comments div.commentOutput>div{padding:3px;margin:4px 6px;border-bottom:1px solid #ccc;}#jobShowResources #Comments div.commentOutput>div span.author{color:#444;display:block;font-weight:600;font-size:.95em;float:left;}#jobShowResources #Comments div.commentOutput>div span.timestamp{display:block;float:right;font-size:.9em;font-style:italic;}#jobShowResources #Comments div.commentOutput>div div.comment{clear:both;display:block;margin-left:4px;}#jobShowResources #Comments div.commentOutput>div div.comment p{line-height:1.2em;padding-bottom:.2em;}#jobShowResources #Comments div.commentOutput>div div.comment h1,#jobShowResources #Comments div.commentOutput>div div.comment h2,#jobShowResources #Comments div.commentOutput>div div.comment h3,#jobShowResources #Comments div.commentOutput>div div.comment h4,#jobShowResources #Comments div.commentOutput>div div.comment h5{font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-weight:600;font-size:14px;margin:2px 0!important;}#jobShowResources #Comments div.commentOutput>div div.comment hr{margin-top:.2em;}#jobShowResources #Comments div.commentOutput>div div.comment code{font-size:.9em;}#jobShowResources #Comments div.commentOutput>div:hover span.remove{opacity:.5;}#jobShowResources #Comments div.commentOutput>div span.remove{font-size:1.2em;color:#e51400;margin-left:6px;cursor:pointer;opacity:0;}#jobShowResources #Comments div.commentOutput>div span.remove:hover{opacity:1;}#jobShowResources #Comments div.commentOutput>div:last-child{border-bottom:0;}#jobShowResources #Comments.cannotAddLogs div.commentOutput{height:300px;}#jobShowResources #Comments div.commentInput{border-top:1px solid #ccc;height:40px;padding:5px;}#jobShowResources #Comments div.commentInput textarea.commentInput{border:0;padding:0;margin:0;width:325px;height:40px;min-height:40px;overflow:auto;float:left;resize:none;}#jobShowResources #Comments div.commentInput span.action{color:#333;font-size:1.5em;display:block;margin:0;cursor:pointer;float:left;border:1px solid #fff;padding:.5em;}#jobShowResources #Comments div.commentInput span.action:hover{color:#335a87;background-color:#ededed;border:1px solid #ccc;}#jobShowResources #Comments div.commentInput span.action.disabled{color:rgba(51,51,51,.2);cursor:default;}#jobShowResources #Comments div.commentInput span.action.disabled:hover{color:rgba(51,51,51,.2);background-color:inherit;border:1px solid #fff;}#jobShowResources #AttachmentsContainer{padding:0;}#jobShowResources #Attachments{position:relative;height:300px;border-top:1px solid #ccc;border-right:1px solid #ccc;border-bottom:1px solid #ccc;background-color:#fff;}#jobShowResources #Attachments div.attachmentOutput{position:relative;height:249px;overflow:auto;}#jobShowResources #Attachments div.attachmentOutput>a{display:block;float:left;height:48px;width:221px;padding:2px;margin:2px;font-size:.95em;border:1px solid #fff;color:#000;text-decoration:none;}#jobShowResources #Attachments div.attachmentOutput>a span.comments,#jobShowResources #Attachments div.attachmentOutput>a span.author,#jobShowResources #Attachments div.attachmentOutput>a span.timestamp{display:block;float:left;width:168px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;height:16px;}#jobShowResources #Attachments div.attachmentOutput>a span.author{color:#888;width:150px;}#jobShowResources #Attachments div.attachmentOutput>a span.timestamp{color:#888;font-style:italic;}#jobShowResources #Attachments div.attachmentOutput>a span.icon{display:block;float:left;height:48px;width:48px;margin-right:2px;}#jobShowResources #Attachments div.attachmentOutput>a span.icon img{height:48px;width:48px;}#jobShowResources #Attachments div.attachmentOutput>a span.icon img.loading{display:none;}#jobShowResources #Attachments div.attachmentOutput>a:hover{background-color:#ededed;border:1px solid #ccc;}#jobShowResources #Attachments div.attachmentOutput>a:hover span.remove{opacity:.5;}#jobShowResources #Attachments div.attachmentOutput>a span.remove{font-size:1.2em;color:#e51400;margin-left:2px;cursor:pointer;opacity:0;}#jobShowResources #Attachments div.attachmentOutput>a span.remove:hover{opacity:1;}#jobShowResources #Attachments.cannotAddAttachments div.attachmentOutput{height:300px;}#jobShowResources #Attachments div.attachmentInput{border-top:1px solid #ccc;height:40px;background-color:#fff;padding:5px;}#jobShowResources #Attachments div.attachmentInput span.action{color:#333;display:block;margin:0 4px 0 0;font-size:1.5em;cursor:pointer;float:right;border:1px solid #fff;padding:.5em;}#jobShowResources #Attachments div.attachmentInput span.action:hover{color:#335a87;background-color:#ededed;border:1px solid #ccc;}#jobShowResources #Attachments div.attachmentInput span.action.disabled{color:rgba(51,51,51,.2);cursor:default;}#jobShowResources #Attachments div.attachmentInput span.action.disabled:hover{color:rgba(51,51,51,.2);background-color:inherit;border:1px solid #fff;}#Job_Show_Job_Actions_AddQueue_Dialog{height:400px;}#Job_Show_Job_Actions_AddQueue_Dialog .queuePicker{position:absolute;width:250px;height:300px;overflow-y:auto;background-color:#fcfcfc;border:1px solid #ccc;}#Job_Show_Job_Actions_AddQueue_Dialog .queuePicker>div{background-color:#fff;border-bottom:1px solid #ddd;padding:6px 0 6px 6px;cursor:pointer;}#Job_Show_Job_Actions_AddQueue_Dialog .queuePicker>div:hover{background-color:#f4f4f4;}#Job_Show_Job_Actions_AddQueue_Dialog .queuePicker>div.selected,#Job_Show_Job_Actions_AddQueue_Dialog .queuePicker>div.selected:hover{background-color:#eee;}#Job_Show_Job_Actions_AddQueue_Dialog .details{display:none;position:absolute;left:280px;top:30px;}#Job_Show_Job_Actions_AddQueue_Dialog .details h4{margin-bottom:4px;}#Job_Show_Job_Actions_AddQueue_Dialog .details>div{margin:5px 0;}#Job_Show_Job_Actions_AddQueue_Dialog .details select{min-width:270px;}#Job_Show_Job_Actions_AddQueue_Dialog .details textarea{min-width:270px;height:100px;}#jobDetailTab-Queues #jobQueues{border:solid 1px #d8d8d8;border-collapse:collapse;table-layout:fixed;}#jobDetailTab-Queues #jobQueues td{border:solid 1px #d8d8d8;background-color:#fff;}#jobDetailTab-Queues #jobQueues th{background-color:#eee;border:solid 1px #d8d8d8;}#jobDetailTab-Queues #jobQueues i.fa-edit{float:right;margin-top:4px;font-size:1.1em;cursor:pointer;display:none;color:#335a87;}#jobDetailTab-Queues #jobQueues i.fa-edit:hover{color:#5e8cc2;}#jobDetailTab-Queues #jobQueues td:hover i.fa-edit{display:inline-block;}#jobDetailTab-Queues #jobQueues th.name{width:200px;}#jobDetailTab-Queues #jobQueues th.sla{width:130px;}#jobDetailTab-Queues #jobQueues tr.removed td{background-color:#f4f4f4;}#jobDetailTab-Queues #jobQueues td.name{vertical-align:middle;}#jobDetailTab-Queues #jobQueues td.name .fa-stack{line-height:1.6em;}#jobDetailTab-Queues #jobQueues td.added .when,#jobDetailTab-Queues #jobQueues td.removed .when{font-style:italic;margin-top:4px;font-size:.9em;}#jobDetailTab-Queues #jobQueues td.added .commentsRaw,#jobDetailTab-Queues #jobQueues td.removed .commentsRaw{display:none;}#jobDetailTab-Queues #jobQueues td.removed.na{vertical-align:middle;text-align:center;}#jobDetailTab-Queues #jobQueues td.sla{vertical-align:middle;}#jobDetailTab-Queues #jobQueues td.sla.overdue{color:#e51400;}#jobDetailTab-Queues>.none{text-align:center;padding:30px 0;font-style:italic;background-color:#fff;}#Job_Show_Queues_Actions_EditAddedComment_Dialog h4,#Job_Show_Queues_Actions_EditRemovedComment_Dialog h4,#Job_Show_Queues_Actions_EditSla_Dialog h4{margin-bottom:4px;}#Job_Show_Queues_Actions_EditAddedComment_Dialog_Comment{width:280px;}#Job_Show_Queues_Actions_EditRemovedComment_Dialog_Comment{width:280px;}#jobComponents{border:solid 1px #d8d8d8;border-collapse:collapse;}#jobComponents td{border:solid 1px #d8d8d8;background-color:#fff;}#jobComponents th{background-color:#eee;border:solid 1px #d8d8d8;}#jobComponents tr th.actions{width:18px;}#jobComponents tr input.description{width:400px;}#jobComponents tr input.cost{width:150px;}#jobComponents tr span.remove{font-size:1.5em;color:#e51400;cursor:pointer;opacity:.5;}#jobComponents tr span.remove:hover{opacity:1;}#jobComponents tr input.updating{background-position:right center;background-repeat:no-repeat;background-image:url(data:image/gif;base64,R0lGODlhEAALAPQAAP///zNah+Hm7dng6O7x9DddiTNah1d3nJqtw3+Xs8fS3k5vlm6JqaGzx4KatcrU4FFymDZciHGMq+ru8t/l7Pb3+V9+oeLo7vT2+MTP3LLB0dTc5fHz9gAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCwAAACwAAAAAEAALAAAFLSAgjmRpnqSgCuLKAq5AEIM4zDVw03ve27ifDgfkEYe04kDIDC5zrtYKRa2WQgAh+QQJCwAAACwAAAAAEAALAAAFJGBhGAVgnqhpHIeRvsDawqns0qeN5+y967tYLyicBYE7EYkYAgAh+QQJCwAAACwAAAAAEAALAAAFNiAgjothLOOIJAkiGgxjpGKiKMkbz7SN6zIawJcDwIK9W/HISxGBzdHTuBNOmcJVCyoUlk7CEAAh+QQJCwAAACwAAAAAEAALAAAFNSAgjqQIRRFUAo3jNGIkSdHqPI8Tz3V55zuaDacDyIQ+YrBH+hWPzJFzOQQaeavWi7oqnVIhACH5BAkLAAAALAAAAAAQAAsAAAUyICCOZGme1rJY5kRRk7hI0mJSVUXJtF3iOl7tltsBZsNfUegjAY3I5sgFY55KqdX1GgIAIfkECQsAAAAsAAAAABAACwAABTcgII5kaZ4kcV2EqLJipmnZhWGXaOOitm2aXQ4g7P2Ct2ER4AMul00kj5g0Al8tADY2y6C+4FIIACH5BAkLAAAALAAAAAAQAAsAAAUvICCOZGme5ERRk6iy7qpyHCVStA3gNa/7txxwlwv2isSacYUc+l4tADQGQ1mvpBAAIfkECQsAAAAsAAAAABAACwAABS8gII5kaZ7kRFGTqLLuqnIcJVK0DeA1r/u3HHCXC/aKxJpxhRz6Xi0ANAZDWa+kEAA7AAAAAAAAAAAA);}#jobComponents tr .totalCost{font-weight:600;}#jobWarrantyDetails{border:solid 1px #d8d8d8;border-collapse:collapse;}#jobWarrantyDetails td{border:solid 1px #d8d8d8;background-color:#fff;}#jobWarrantyDetails th{background-color:#eee;border:solid 1px #d8d8d8;}#jobWarrantyDetails tr th{width:200px;text-align:right;}#jobNonWarrantyFinance{border:solid 1px #d8d8d8;border-collapse:collapse;}#jobNonWarrantyFinance td{border:solid 1px #d8d8d8;background-color:#fff;}#jobNonWarrantyFinance th{background-color:#eee;border:solid 1px #d8d8d8;}#jobNonWarrantyFinance tr th{width:200px;text-align:right;}#jobNonWarrantyRepairs{border:solid 1px #d8d8d8;border-collapse:collapse;}#jobNonWarrantyRepairs td{border:solid 1px #d8d8d8;background-color:#fff;}#jobNonWarrantyRepairs th{background-color:#eee;border:solid 1px #d8d8d8;}#jobNonWarrantyRepairs tr th{width:200px;text-align:right;}#jobNonWarrantyInsurance{border:solid 1px #d8d8d8;border-collapse:collapse;}#jobNonWarrantyInsurance td{border:solid 1px #d8d8d8;background-color:#fff;}#jobNonWarrantyInsurance th{background-color:#eee;border:solid 1px #d8d8d8;}#jobNonWarrantyInsurance tr th{width:200px;text-align:right;}#jobNonWarrantyInsurance tr td textarea{width:400px;}#jobFlags{border:solid 1px #d8d8d8;border-collapse:collapse;}#jobFlags td{border:solid 1px #d8d8d8;background-color:#fff;}#jobFlags th{background-color:#eee;border:solid 1px #d8d8d8;}#jobFlags tr th{width:200px;text-align:right;}#warrantyJobForm #warrantyDisclosedInformation table{font-size:.9em;}#warrantyJobForm #warrantyDisclosedInformation table tr:not(:last-child){border-bottom:1px dashed #aaa;}#warrantyJobForm #warrantyDisclosedInformation table th{padding:2px;font-weight:600;width:200px;}#warrantyJobForm #warrantyDisclosedInformation table td{padding:2px;}#warrantyJobFaultDescription #FaultDescription{width:600px;height:250px;}#publishJobAttachments{border:1px solid #ccc;background-color:#fff;position:relative;max-height:249px;overflow:auto;}#publishJobAttachments>a{display:block;float:left;height:48px;width:261px;padding:2px;margin:2px;font-size:.95em;border:1px solid #fff;color:#000;text-decoration:none;}#publishJobAttachments>a span.comments,#publishJobAttachments>a span.author,#publishJobAttachments>a span.timestamp{display:block;float:left;width:188px;overflow:hidden;height:16px;}#publishJobAttachments>a span.author{color:#888;width:150px;}#publishJobAttachments>a span.timestamp{color:#888;font-style:italic;}#publishJobAttachments>a span.icon{display:block;float:left;height:48px;width:48px;margin-right:2px;}#publishJobAttachments>a span.icon img{height:48px;width:48px;}#publishJobAttachments>a span.icon img.loading{display:none;}#publishJobAttachments>a input.select{display:block;float:left;line-height:48px;margin-right:2px;width:20px;}#publishJobAttachments>a:hover{background-color:#ededed;border:1px solid #ccc;}#publishJobAttachments>a:hover span.remove{opacity:.5;}#publishJobAttachments>a span.remove{font-size:1.2em;color:#e51400;margin-left:2px;cursor:pointer;opacity:0;}#publishJobAttachments>a span.remove:hover{opacity:1;}#submitDialog{padding-top:50px;text-align:center;}#submitDialog i{margin-right:10px;color:#1e6dab;}#repairJobForm #repairDisclosedInformation table{font-size:.9em;}#repairJobForm #repairDisclosedInformation table tr:not(:last-child){border-bottom:1px dashed #aaa;}#repairJobForm #repairDisclosedInformation table th{padding:2px;font-weight:600;width:200px;}#repairJobForm #repairDisclosedInformation table td{padding:2px;}#repairJobRepairDescription #RepairDescription{width:600px;height:250px;}#createJob_Container{margin:0 -20px;}#createJob_Container img.modelImage{width:64px;height:64px;}#createJob_Container .createJob_Component{margin:0 10px;padding:5px 0;border-bottom:1px dashed #ccc;}#createJob_Container .createJob_Component:last-child{border-bottom:0;}#createJob_Container #createJob_Type{border:1px solid #ccc;background-color:#f2f2f2;padding:2px 4px;}#createJob_Container #createJob_SubTypes{margin:-1px 0 0 20px;border:1px solid #ccc;border-top:0;padding:2px 4px;background-color:#f2f2f2;}#createJob_Container #createJob_SubTypes .createJob_SubType{display:none;}#createJob_Container #createJob_Type li,#createJob_Container #createJob_SubTypes li{margin:2px 0;padding:0 0 0 4px;}#createJob_Container #createJob_Type li i,#createJob_Container #createJob_SubTypes li i{display:none;cursor:default;font-weight:normal;}#createJob_Container #createJob_Type li:hover i,#createJob_Container #createJob_SubTypes li:hover i{display:inline-block;}#createJob_Container #createJob_Type li.highlight,#createJob_Container #createJob_SubTypes li.highlight{background-color:#cddbec;font-weight:600;color:#000;}#createJob_Container #createJob_Type li.highlight i,#createJob_Container #createJob_SubTypes li.highlight i{display:inline-block;}#createJob_Container #createJob_SubTypes.isQuickLog li i{display:none;}#createJob_Container #createJob_CommentsContainer #Comments{width:100%;min-width:500px;}#createJob_Container #createJob_QuickLogAutoCloseContainer h3{margin-bottom:4px;}#createJob_Container #createJob_QuickLogAutoCloseContainer input{margin-left:4px;}#createJob_Container #createJob_QuickLogTaskTimeContainer{display:none;margin:4px 0 0 25px;padding:4px 4px;background-color:#f2f2f2;border-left:4px solid #d8d8d8;}#createJob_Container #createJob_QuickLogTaskTimeContainer h4{display:inline-block;padding-right:10px;}#createJob_Container #createJob_QuickLogTaskTimeContainer label{margin-right:15px;}#createJob_Container #createJob_QuickLogTaskTimeContainer #createJob_TaskTimeOtherMinutesContainer{display:none;}#createJob_Container #createJob_QuickLogTaskTimeContainer #createJob_TaskTimeOtherMinutes{width:50px;}#createJobRedirect h1{margin-top:60px!important;margin-bottom:60px;}#createJobRedirect>div{text-align:right;}#createJobRedirect>div i{margin-right:10px;} \ No newline at end of file +.tableData{border:solid 1px #f4f4f4;border-collapse:collapse;}.tableData>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}.tableData>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}.tableData>thead>tr>th,.tableData>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}.tableData>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}.tableData>tfoot>tr>th,.tableData>tfoot>tr>td{background-color:#f4f4f4;}.tableDataDark{border:solid 1px #d8d8d8;border-collapse:collapse;}.tableDataDark td{border:solid 1px #d8d8d8;background-color:#fff;}.tableDataDark th{background-color:#eee;border:solid 1px #d8d8d8;}.tableDataContainer{background-color:#fff;}.tableDataVertical{border:solid 1px #f4f4f4;border-collapse:collapse;}.tableDataVertical>tbody>tr:nth-child(odd){background-color:#f4f4f4;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;}#layout_PageHeading #Job_Show_Status{margin-left:20px;display:inline-block;height:50px;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-weight:lighter;font-stretch:condensed;font-size:.7em;text-transform:uppercase;}#layout_PageHeading #Job_Show_Status span.icon{margin-right:6px;}#layout_PageHeading #Job_Show_QueueStatus{display:inline-block;float:right;height:50px;font-size:.6em;}#Jobs_Index_MyJobs{margin-bottom:10px;}#Jobs_Index_MyJobs .jobTable>h3,#Jobs_Index_StaleJobs .jobTable>h3{color:#555;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-weight:normal;font-size:12px;margin:8px 0 20px 20px!important;text-transform:uppercase;}#Job_List{padding-top:20px;}#Job_List>.jobTable>h3{margin:30px 0 50px 20px!important;}#Job_Show #Job_Show_Subjects{table-layout:fixed;}#Job_Show #Job_Show_Subjects>tbody>tr>td{padding-top:0;height:100%;}#Job_Show #Job_Show_Subjects>tbody>tr>td>div{position:relative;}#Job_Show #Job_Show_Subjects>tbody>tr>td>div div.status{margin-top:2px;padding-top:2px;border-top:1px dashed #ddd;}#Job_Show #Job_Show_Subjects>tbody>tr>td>div input.discreet{margin-left:-2px;}#Job_Show #Job_Show_Subjects>tbody>tr>td:not(:last-child){border-right:1px dashed #aaa;}#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_Job_Type>h2{text-transform:uppercase;font-size:16px;}#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_Job_Type>table{table-layout:fixed;}#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_Job_SubTypes_1,#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_Job_SubTypes_2{padding-left:16px;font-weight:600;}#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_Job_SubTypes_Update{margin-left:16px;font-size:.9em;}#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_Job_SubTypes_Update_Dialog{display:none;}#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_Job_Dates{padding-bottom:6px;}#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_Job_Dates table{table-layout:fixed;}#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_Job_Dates table>tbody>tr>td{vertical-align:middle;}#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_Job_Dates table>tbody>tr>td:first-child{font-weight:600;width:60px;}#Job_Show #Job_Show_Subjects #Job_Show_Job #Job_Show_GenerateDocument_Container{padding-top:4px;}#Job_Show #Job_Show_Subjects #Job_Show_Device>div{padding-left:102px;min-height:100px;}#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Model_Image{position:absolute;left:0;top:0;height:96px;width:96px;}#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Details{float:left;}#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Flags{margin:4px 0;font-size:16px;}#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Flags>i{cursor:default;}#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Flags>i>.details{display:none;}#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Details_HWar,#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Details_HNWar{float:right;border-left:1px dashed #ddd;padding-left:4px;margin-right:2px;}#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Details_HWar_Details_Button,#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_Details_HNWar_Details_Button{font-size:.9em;}#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_DeviceHeld table{table-layout:fixed;}#Job_Show #Job_Show_Subjects #Job_Show_Device #Job_Show_Device_DeviceHeld table>tbody>tr>td:first-child{width:62px;}#Job_Show #Job_Show_Subjects #Job_Show_User #Job_Show_User_Photo_Container{float:left;padding-right:4px;}#Job_Show #Job_Show_Subjects #Job_Show_User #Job_Show_User_Photo{height:auto;max-width:96px;}#Job_Show #Job_Show_Subjects #Job_Show_User #Job_Show_User_Flags{margin:4px 0;font-size:16px;}#Job_Show #Job_Show_Subjects #Job_Show_User #Job_Show_User_Flags>i{cursor:default;}#Job_Show #Job_Show_Subjects #Job_Show_User #Job_Show_User_Flags>i>.details{display:none;}#Job_Show #Job_Show_Subjects #Job_Show_Subjects_Actions>td{padding-top:4px;}#Job_Show #Job_Show_Subjects #Job_Show_Subjects_Actions #Job_Show_Device_Actions{padding-left:111px;}#jobDetailTabs{margin-top:10px;border-radius:0;background-image:none;background-color:#fff;border:0;padding:0;}#jobDetailTabs #jobDetailTabItems{border-radius:0;border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;border-bottom:0;padding:2px 0 0 4px;background-image:none;background-color:#eee;display:table;}#jobDetailTabs #jobDetailTabItems>li{top:0;border-radius:0;margin:0 5px 0 0;padding:0;line-height:normal;margin-right:4px;}#jobDetailTabs #jobDetailTabItems>li>a{padding:5px 8px;}#jobDetailTabs div.ui-tabs-panel{border-radius:0;padding:4px;border-right:1px solid #ddd;border-bottom:1px solid #ddd;border-left:1px solid #ddd;border-top:0;background-color:#eee;}#jobShowResources #CommentsContainer{padding:0;width:375px;}#jobShowResources #Comments{height:300px;padding:0;border:1px solid #ccc;background-color:#fff;}#jobShowResources #Comments div.commentOutput{height:249px;overflow:auto;background-color:#fafafa;color:#000;}#jobShowResources #Comments div.commentOutput>div{padding:3px;margin:4px 6px;border-bottom:1px solid #ccc;}#jobShowResources #Comments div.commentOutput>div span.author{color:#444;display:block;font-weight:600;font-size:.95em;float:left;}#jobShowResources #Comments div.commentOutput>div span.timestamp{display:block;float:right;font-size:.9em;font-style:italic;}#jobShowResources #Comments div.commentOutput>div div.comment{clear:both;display:block;margin-left:4px;}#jobShowResources #Comments div.commentOutput>div div.comment p{line-height:1.2em;padding-bottom:.2em;}#jobShowResources #Comments div.commentOutput>div div.comment h1,#jobShowResources #Comments div.commentOutput>div div.comment h2,#jobShowResources #Comments div.commentOutput>div div.comment h3,#jobShowResources #Comments div.commentOutput>div div.comment h4,#jobShowResources #Comments div.commentOutput>div div.comment h5{font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-weight:600;font-size:14px;margin:2px 0!important;}#jobShowResources #Comments div.commentOutput>div div.comment hr{margin-top:.2em;}#jobShowResources #Comments div.commentOutput>div div.comment code{font-size:.9em;}#jobShowResources #Comments div.commentOutput>div:hover span.remove{opacity:.5;}#jobShowResources #Comments div.commentOutput>div span.remove{font-size:1.2em;color:#e51400;margin-left:6px;cursor:pointer;opacity:0;}#jobShowResources #Comments div.commentOutput>div span.remove:hover{opacity:1;}#jobShowResources #Comments div.commentOutput>div:last-child{border-bottom:0;}#jobShowResources #Comments.cannotAddLogs div.commentOutput{height:300px;}#jobShowResources #Comments div.commentInput{border-top:1px solid #ccc;height:40px;padding:5px;}#jobShowResources #Comments div.commentInput textarea.commentInput{border:0;padding:0;margin:0;width:325px;height:40px;min-height:40px;overflow:auto;float:left;resize:none;}#jobShowResources #Comments div.commentInput span.action{color:#333;font-size:1.5em;display:block;margin:0;cursor:pointer;float:left;border:1px solid #fff;padding:.5em;}#jobShowResources #Comments div.commentInput span.action:hover{color:#335a87;background-color:#ededed;border:1px solid #ccc;}#jobShowResources #Comments div.commentInput span.action.disabled{color:rgba(51,51,51,.2);cursor:default;}#jobShowResources #Comments div.commentInput span.action.disabled:hover{color:rgba(51,51,51,.2);background-color:inherit;border:1px solid #fff;}#jobShowResources #AttachmentsContainer{padding:0;}#jobShowResources #Attachments{position:relative;height:300px;border-top:1px solid #ccc;border-right:1px solid #ccc;border-bottom:1px solid #ccc;background-color:#fff;}#jobShowResources #Attachments div.attachmentOutput{position:relative;height:249px;overflow:auto;}#jobShowResources #Attachments div.attachmentOutput>a{display:block;float:left;height:48px;width:221px;padding:2px;margin:2px;font-size:.95em;border:1px solid #fff;color:#000;text-decoration:none;}#jobShowResources #Attachments div.attachmentOutput>a span.comments,#jobShowResources #Attachments div.attachmentOutput>a span.author,#jobShowResources #Attachments div.attachmentOutput>a span.timestamp{display:block;float:left;width:168px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;height:16px;}#jobShowResources #Attachments div.attachmentOutput>a span.author{color:#888;width:150px;}#jobShowResources #Attachments div.attachmentOutput>a span.timestamp{color:#888;font-style:italic;}#jobShowResources #Attachments div.attachmentOutput>a span.icon{display:block;float:left;height:48px;width:48px;margin-right:2px;}#jobShowResources #Attachments div.attachmentOutput>a span.icon img{height:48px;width:48px;}#jobShowResources #Attachments div.attachmentOutput>a span.icon img.loading{display:none;}#jobShowResources #Attachments div.attachmentOutput>a:hover{background-color:#ededed;border:1px solid #ccc;}#jobShowResources #Attachments div.attachmentOutput>a:hover span.remove{opacity:.5;}#jobShowResources #Attachments div.attachmentOutput>a span.remove{font-size:1.2em;color:#e51400;margin-left:2px;cursor:pointer;opacity:0;}#jobShowResources #Attachments div.attachmentOutput>a span.remove:hover{opacity:1;}#jobShowResources #Attachments.cannotAddAttachments div.attachmentOutput{height:300px;}#jobShowResources #Attachments div.attachmentInput{border-top:1px solid #ccc;height:40px;background-color:#fff;padding:5px;}#jobShowResources #Attachments div.attachmentInput span.action{color:#333;display:block;margin:0 4px 0 0;font-size:1.5em;cursor:pointer;float:right;border:1px solid #fff;padding:.5em;}#jobShowResources #Attachments div.attachmentInput span.action:hover{color:#335a87;background-color:#ededed;border:1px solid #ccc;}#jobShowResources #Attachments div.attachmentInput span.action.disabled{color:rgba(51,51,51,.2);cursor:default;}#jobShowResources #Attachments div.attachmentInput span.action.disabled:hover{color:rgba(51,51,51,.2);background-color:inherit;border:1px solid #fff;}#Job_Show_Job_Actions_AddQueue_Dialog{height:400px;}#Job_Show_Job_Actions_AddQueue_Dialog .queuePicker{position:absolute;width:250px;height:300px;overflow-y:auto;background-color:#fcfcfc;border:1px solid #ccc;}#Job_Show_Job_Actions_AddQueue_Dialog .queuePicker>div{background-color:#fff;border-bottom:1px solid #ddd;padding:6px 0 6px 6px;cursor:pointer;}#Job_Show_Job_Actions_AddQueue_Dialog .queuePicker>div:hover{background-color:#f4f4f4;}#Job_Show_Job_Actions_AddQueue_Dialog .queuePicker>div.selected,#Job_Show_Job_Actions_AddQueue_Dialog .queuePicker>div.selected:hover{background-color:#eee;}#Job_Show_Job_Actions_AddQueue_Dialog .details{display:none;position:absolute;left:280px;top:30px;}#Job_Show_Job_Actions_AddQueue_Dialog .details h4{margin-bottom:4px;}#Job_Show_Job_Actions_AddQueue_Dialog .details>div{margin:5px 0;}#Job_Show_Job_Actions_AddQueue_Dialog .details select{min-width:270px;}#Job_Show_Job_Actions_AddQueue_Dialog .details textarea{min-width:270px;height:100px;}#jobDetailTab-Queues #jobQueues{border:solid 1px #d8d8d8;border-collapse:collapse;table-layout:fixed;}#jobDetailTab-Queues #jobQueues td{border:solid 1px #d8d8d8;background-color:#fff;}#jobDetailTab-Queues #jobQueues th{background-color:#eee;border:solid 1px #d8d8d8;}#jobDetailTab-Queues #jobQueues i.fa-edit{float:right;margin-top:4px;font-size:1.1em;cursor:pointer;display:none;color:#335a87;}#jobDetailTab-Queues #jobQueues i.fa-edit:hover{color:#5e8cc2;}#jobDetailTab-Queues #jobQueues td:hover i.fa-edit{display:inline-block;}#jobDetailTab-Queues #jobQueues th.name{width:200px;}#jobDetailTab-Queues #jobQueues th.sla{width:130px;}#jobDetailTab-Queues #jobQueues tr.removed td{background-color:#f4f4f4;}#jobDetailTab-Queues #jobQueues td.name{vertical-align:middle;}#jobDetailTab-Queues #jobQueues td.name .fa-stack{line-height:1.6em;}#jobDetailTab-Queues #jobQueues td.added .when,#jobDetailTab-Queues #jobQueues td.removed .when{font-style:italic;margin-top:4px;font-size:.9em;}#jobDetailTab-Queues #jobQueues td.added .commentsRaw,#jobDetailTab-Queues #jobQueues td.removed .commentsRaw{display:none;}#jobDetailTab-Queues #jobQueues td.removed.na{vertical-align:middle;text-align:center;}#jobDetailTab-Queues #jobQueues td.sla{vertical-align:middle;}#jobDetailTab-Queues #jobQueues td.sla.overdue{color:#e51400;}#jobDetailTab-Queues>.none{text-align:center;padding:30px 0;font-style:italic;background-color:#fff;}#Job_Show_Queues_Actions_EditAddedComment_Dialog h4,#Job_Show_Queues_Actions_EditRemovedComment_Dialog h4,#Job_Show_Queues_Actions_EditSla_Dialog h4{margin-bottom:4px;}#Job_Show_Queues_Actions_EditAddedComment_Dialog_Comment{width:280px;}#Job_Show_Queues_Actions_EditRemovedComment_Dialog_Comment{width:280px;}#jobComponents{border:solid 1px #d8d8d8;border-collapse:collapse;}#jobComponents td{border:solid 1px #d8d8d8;background-color:#fff;}#jobComponents th{background-color:#eee;border:solid 1px #d8d8d8;}#jobComponents tr th.actions{width:18px;}#jobComponents tr input.description{width:400px;}#jobComponents tr input.cost{width:150px;}#jobComponents tr span.remove{font-size:1.5em;color:#e51400;cursor:pointer;opacity:.5;}#jobComponents tr span.remove:hover{opacity:1;}#jobComponents tr input.updating{background-position:right center;background-repeat:no-repeat;background-image:url(data:image/gif;base64,R0lGODlhEAALAPQAAP///zNah+Hm7dng6O7x9DddiTNah1d3nJqtw3+Xs8fS3k5vlm6JqaGzx4KatcrU4FFymDZciHGMq+ru8t/l7Pb3+V9+oeLo7vT2+MTP3LLB0dTc5fHz9gAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCwAAACwAAAAAEAALAAAFLSAgjmRpnqSgCuLKAq5AEIM4zDVw03ve27ifDgfkEYe04kDIDC5zrtYKRa2WQgAh+QQJCwAAACwAAAAAEAALAAAFJGBhGAVgnqhpHIeRvsDawqns0qeN5+y967tYLyicBYE7EYkYAgAh+QQJCwAAACwAAAAAEAALAAAFNiAgjothLOOIJAkiGgxjpGKiKMkbz7SN6zIawJcDwIK9W/HISxGBzdHTuBNOmcJVCyoUlk7CEAAh+QQJCwAAACwAAAAAEAALAAAFNSAgjqQIRRFUAo3jNGIkSdHqPI8Tz3V55zuaDacDyIQ+YrBH+hWPzJFzOQQaeavWi7oqnVIhACH5BAkLAAAALAAAAAAQAAsAAAUyICCOZGme1rJY5kRRk7hI0mJSVUXJtF3iOl7tltsBZsNfUegjAY3I5sgFY55KqdX1GgIAIfkECQsAAAAsAAAAABAACwAABTcgII5kaZ4kcV2EqLJipmnZhWGXaOOitm2aXQ4g7P2Ct2ER4AMul00kj5g0Al8tADY2y6C+4FIIACH5BAkLAAAALAAAAAAQAAsAAAUvICCOZGme5ERRk6iy7qpyHCVStA3gNa/7txxwlwv2isSacYUc+l4tADQGQ1mvpBAAIfkECQsAAAAsAAAAABAACwAABS8gII5kaZ7kRFGTqLLuqnIcJVK0DeA1r/u3HHCXC/aKxJpxhRz6Xi0ANAZDWa+kEAA7AAAAAAAAAAAA);}#jobComponents tr .totalCost{font-weight:600;}#jobWarrantyDetails{border:solid 1px #d8d8d8;border-collapse:collapse;}#jobWarrantyDetails td{border:solid 1px #d8d8d8;background-color:#fff;}#jobWarrantyDetails th{background-color:#eee;border:solid 1px #d8d8d8;}#jobWarrantyDetails tr th{width:200px;text-align:right;}#jobNonWarrantyFinance{border:solid 1px #d8d8d8;border-collapse:collapse;}#jobNonWarrantyFinance td{border:solid 1px #d8d8d8;background-color:#fff;}#jobNonWarrantyFinance th{background-color:#eee;border:solid 1px #d8d8d8;}#jobNonWarrantyFinance tr th{width:200px;text-align:right;}#jobNonWarrantyRepairs{border:solid 1px #d8d8d8;border-collapse:collapse;}#jobNonWarrantyRepairs td{border:solid 1px #d8d8d8;background-color:#fff;}#jobNonWarrantyRepairs th{background-color:#eee;border:solid 1px #d8d8d8;}#jobNonWarrantyRepairs tr th{width:200px;text-align:right;}#jobNonWarrantyInsurance{border:solid 1px #d8d8d8;border-collapse:collapse;}#jobNonWarrantyInsurance td{border:solid 1px #d8d8d8;background-color:#fff;}#jobNonWarrantyInsurance th{background-color:#eee;border:solid 1px #d8d8d8;}#jobNonWarrantyInsurance tr th{width:200px;text-align:right;}#jobNonWarrantyInsurance tr td textarea{width:400px;}#jobFlags{border:solid 1px #d8d8d8;border-collapse:collapse;}#jobFlags td{border:solid 1px #d8d8d8;background-color:#fff;}#jobFlags th{background-color:#eee;border:solid 1px #d8d8d8;}#jobFlags tr th{width:200px;text-align:right;}#warrantyJobForm #warrantyDisclosedInformation table{font-size:.9em;}#warrantyJobForm #warrantyDisclosedInformation table tr:not(:last-child){border-bottom:1px dashed #aaa;}#warrantyJobForm #warrantyDisclosedInformation table th{padding:2px;font-weight:600;width:200px;}#warrantyJobForm #warrantyDisclosedInformation table td{padding:2px;}#warrantyJobFaultDescription #FaultDescription{width:600px;height:250px;}#publishJobAttachments{border:1px solid #ccc;background-color:#fff;position:relative;max-height:249px;overflow:auto;}#publishJobAttachments>a{display:block;float:left;height:48px;width:261px;padding:2px;margin:2px;font-size:.95em;border:1px solid #fff;color:#000;text-decoration:none;}#publishJobAttachments>a span.comments,#publishJobAttachments>a span.author,#publishJobAttachments>a span.timestamp{display:block;float:left;width:188px;overflow:hidden;height:16px;}#publishJobAttachments>a span.author{color:#888;width:150px;}#publishJobAttachments>a span.timestamp{color:#888;font-style:italic;}#publishJobAttachments>a span.icon{display:block;float:left;height:48px;width:48px;margin-right:2px;}#publishJobAttachments>a span.icon img{height:48px;width:48px;}#publishJobAttachments>a span.icon img.loading{display:none;}#publishJobAttachments>a input.select{display:block;float:left;line-height:48px;margin-right:2px;width:20px;}#publishJobAttachments>a:hover{background-color:#ededed;border:1px solid #ccc;}#publishJobAttachments>a:hover span.remove{opacity:.5;}#publishJobAttachments>a span.remove{font-size:1.2em;color:#e51400;margin-left:2px;cursor:pointer;opacity:0;}#publishJobAttachments>a span.remove:hover{opacity:1;}#submitDialog{padding-top:50px;text-align:center;}#submitDialog i{margin-right:10px;color:#1e6dab;}#repairJobForm #repairDisclosedInformation table{font-size:.9em;}#repairJobForm #repairDisclosedInformation table tr:not(:last-child){border-bottom:1px dashed #aaa;}#repairJobForm #repairDisclosedInformation table th{padding:2px;font-weight:600;width:200px;}#repairJobForm #repairDisclosedInformation table td{padding:2px;}#repairJobRepairDescription #RepairDescription{width:600px;height:250px;}#createJob_Container{margin:0 -20px;}#createJob_Container img.modelImage{width:64px;height:64px;}#createJob_Container .createJob_Component{margin:0 10px;padding:5px 0;border-bottom:1px dashed #ccc;}#createJob_Container .createJob_Component:last-child{border-bottom:0;}#createJob_Container #createJob_Type{border:1px solid #ccc;background-color:#f2f2f2;padding:2px 4px;}#createJob_Container #createJob_SubTypes{margin:-1px 0 0 20px;border:1px solid #ccc;border-top:0;padding:2px 4px;background-color:#f2f2f2;}#createJob_Container #createJob_SubTypes .createJob_SubType{display:none;}#createJob_Container #createJob_Type li,#createJob_Container #createJob_SubTypes li{margin:2px 0;padding:0 0 0 4px;}#createJob_Container #createJob_Type li i,#createJob_Container #createJob_SubTypes li i{display:none;cursor:default;font-weight:normal;}#createJob_Container #createJob_Type li:hover i,#createJob_Container #createJob_SubTypes li:hover i{display:inline-block;}#createJob_Container #createJob_Type li.highlight,#createJob_Container #createJob_SubTypes li.highlight{background-color:#cddbec;font-weight:600;color:#000;}#createJob_Container #createJob_Type li.highlight i,#createJob_Container #createJob_SubTypes li.highlight i{display:inline-block;}#createJob_Container #createJob_SubTypes.isQuickLog li i{display:none;}#createJob_Container #createJob_CommentsContainer #Comments{width:100%;min-width:500px;}#createJob_Container #createJob_QuickLogAutoCloseContainer h3{margin-bottom:4px;}#createJob_Container #createJob_QuickLogAutoCloseContainer input{margin-left:4px;}#createJob_Container #createJob_QuickLogTaskTimeContainer{display:none;margin:4px 0 0 25px;padding:4px 4px;background-color:#f2f2f2;border-left:4px solid #d8d8d8;}#createJob_Container #createJob_QuickLogTaskTimeContainer h4{display:inline-block;padding-right:10px;}#createJob_Container #createJob_QuickLogTaskTimeContainer label{margin-right:15px;}#createJob_Container #createJob_QuickLogTaskTimeContainer #createJob_TaskTimeOtherMinutesContainer{display:none;}#createJob_Container #createJob_QuickLogTaskTimeContainer #createJob_TaskTimeOtherMinutes{width:50px;}#createJobRedirect h1{margin-top:60px!important;margin-bottom:60px;}#createJobRedirect>div{text-align:right;}#createJobRedirect>div i{margin-right:10px;} \ No newline at end of file diff --git a/Disco.Web/ClientSource/Style/Site.css b/Disco.Web/ClientSource/Style/Site.css index 53cda572..7548f28a 100644 --- a/Disco.Web/ClientSource/Style/Site.css +++ b/Disco.Web/ClientSource/Style/Site.css @@ -777,14 +777,17 @@ table.genericData td.id a { .dataTables_wrapper table > thead tr > th.sorting_disabled { background-image: none; } -table.userTable div.flags { +table.userTable div.flags, +table.deviceTable div.flags { display: inline-block; float: right; } -table.userTable div.flags > i { +table.userTable div.flags > i, +table.deviceTable div.flags > i { cursor: default; } -table.userTable div.flags > i > .details { +table.userTable div.flags > i > .details, +table.deviceTable div.flags > i > .details { display: none; } .jobStatus { @@ -1257,15 +1260,15 @@ div.Disco-AttachmentUpload-ImageDialog { background-color: #000 !important; padding: 0 !important; } -body > .User_FlagAssignment_Tooltip span.name { +body > .FlagAssignment_Tooltip span.name { display: block; font-weight: 600; } -body > .User_FlagAssignment_Tooltip span.comments { +body > .FlagAssignment_Tooltip span.comments { display: block; padding: 2px 0 2px 4px; } -body > .User_FlagAssignment_Tooltip span.added { +body > .FlagAssignment_Tooltip span.added { font-style: italic; font-size: 0.9em; } diff --git a/Disco.Web/ClientSource/Style/Site.less b/Disco.Web/ClientSource/Style/Site.less index 74822646..d5a41cd5 100644 --- a/Disco.Web/ClientSource/Style/Site.less +++ b/Disco.Web/ClientSource/Style/Site.less @@ -746,7 +746,7 @@ table.genericData { } } -table.userTable { +table.userTable, table.deviceTable { div.flags { display: inline-block; float: right; @@ -1275,7 +1275,7 @@ div.Disco-AttachmentUpload-ImageDialog { padding: 0 !important; } -body > .User_FlagAssignment_Tooltip { +body > .FlagAssignment_Tooltip { span.name { display: block; font-weight: @FontWeightBodyBold; diff --git a/Disco.Web/ClientSource/Style/Site.min.css b/Disco.Web/ClientSource/Style/Site.min.css index 21493f12..60247743 100644 --- a/Disco.Web/ClientSource/Style/Site.min.css +++ b/Disco.Web/ClientSource/Style/Site.min.css @@ -1 +1 @@ -.tableData{border:solid 1px #f4f4f4;border-collapse:collapse;}.tableData>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}.tableData>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}.tableData>thead>tr>th,.tableData>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}.tableData>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}.tableData>tfoot>tr>th,.tableData>tfoot>tr>td{background-color:#f4f4f4;}.tableDataDark{border:solid 1px #d8d8d8;border-collapse:collapse;}.tableDataDark td{border:solid 1px #d8d8d8;background-color:#fff;}.tableDataDark th{background-color:#eee;border:solid 1px #d8d8d8;}.tableDataContainer{background-color:#fff;}.tableDataVertical{border:solid 1px #f4f4f4;border-collapse:collapse;}.tableDataVertical>tbody>tr:nth-child(odd){background-color:#f4f4f4;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;color:#333;}body.layout{background:url(data:image/png;base64,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) left top repeat-x #d1d1d1;background:linear-gradient(to bottom,#f2f2f2 0,#d1d1d1 370px) left top repeat-x #d1d1d1;min-height:370px;}.page{max-width:1232px;min-width:768px;margin-left:auto;margin-right:auto;}header,#header{position:relative;background-color:#333;margin:0;padding:0;height:34px;}header #heading,#header #heading{float:left;height:34px;}header #heading i,#header #heading i{display:block;height:34px;width:34px;background-image:url(data:image/png;base64,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);}header nav,#header nav{float:left;height:34px;padding:0;margin:0;}header nav ul#menu,#header nav ul#menu{height:26px;padding:0;margin:8px 0 0 4px;list-style:none;z-index:100000;font-size:0;line-height:0;}header nav ul#menu>li,#header nav ul#menu>li{display:inline-block;z-index:100000;font-size:13.2px;line-height:19.2px;}header nav ul#menu>li.moveRight,#header nav ul#menu>li.moveRight{margin-left:20px;}header nav ul#menu>li>a,#header nav ul#menu>li>a{display:inline-block;padding:2px 10px 4px 10px;height:20px;color:#fff;font-weight:400;text-transform:uppercase;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.active>a,#header nav ul#menu>li.active>a{background-color:#222;}header nav ul#menu>li:hover>a,#header nav ul#menu>li:hover>a{background-color:#111;text-decoration:none;}header nav ul#menu>li>ul,#header nav ul#menu>li>ul{z-index:100000;display:none;list-style:none;position:absolute;margin:0;border-left:1px solid #d1d1d1;border-right:1px solid #d1d1d1;background-color:hsl(0,0%,95%);padding:0;min-width:180px;box-shadow:2px 2px 5px rgba(209,209,209,.5);}header nav ul#menu>li>ul li,#header nav ul#menu>li>ul li{position:relative;background-position:top;background-repeat:repeat-x;border-top:1px solid hsl(0,0%,90%);}header nav ul#menu>li>ul li:first-child,#header nav ul#menu>li>ul li:first-child{border-top:1px solid #d1d1d1;}header nav ul#menu>li>ul li:last-child,#header nav ul#menu>li>ul li:last-child{border-bottom:1px solid #d1d1d1;}header nav ul#menu>li>ul li:hover,#header nav ul#menu>li>ul li:hover{border-top:1px solid hsl(0,0%,85%);background-color:hsl(0,0%,90%);}header nav ul#menu>li>ul li a,#header nav ul#menu>li>ul li a{display:block;color:#000;padding:4px 8px;text-decoration:none;}header nav ul#menu>li>ul li a:hover,#header nav ul#menu>li>ul li a:hover{color:#335a87;text-decoration:none;}header nav ul#menu>li>ul li a:active,#header nav ul#menu>li>ul li a:active{text-decoration:none;}header nav ul#menu>li>ul li i.fa-caret-right,#header nav ul#menu>li>ul li i.fa-caret-right{cursor:pointer;color:#666;font-size:16px;position:absolute;display:block;right:12px;top:7px;}header nav ul#menu>li>ul li:hover i.fa-caret-right,#header nav ul#menu>li>ul li:hover i.fa-caret-right{color:#333;}header nav ul#menu>li>ul ul,#header nav ul#menu>li>ul ul{display:none;list-style:none;position:absolute;top:-1px;left:180px;background-color:hsl(0,0%,95%);border-left:1px solid #d1d1d1;border-right:1px solid #d1d1d1;padding:0;min-width:180px;box-shadow:2px 2px 5px rgba(209,209,209,.5);}header #headerMenu,#header #headerMenu{float:right;height:24px;padding:5px 8px;font-size:.9em;line-height:24px;text-align:right;color:#fff;}header #headerMenu a,#header #headerMenu a{color:#fff;text-decoration:none;}header #headerMenu a:hover,#header #headerMenu a:hover{color:#cddbec;text-decoration:none;}header #SearchQuery,#header #SearchQuery{font-size:.9em;margin-left:6px;width:130px;background-color:#eee;-moz-transition-property:width;-o-transition-property:width;-webkit-transition-property:width;transition-property:width;-moz-transition-duration:.1s;-o-transition-duration:.1s;-webkit-transition-duration:.1s;transition-duration:.1s;}header #SearchQuery:hover,#header #SearchQuery:hover,header #SearchQuery:focus,#header #SearchQuery:focus{background-color:#fff;width:190px;}header .watermark,#header .watermark{background-color:#888;}#QuickSearchMenu{max-height:400px;font-size:.9em;background:none;background-color:#fafafa;}#QuickSearchMenu li:not(:last-child){border-bottom:1px solid #d8d8d8;}#QuickSearchMenu li>a{padding:2px;}#QuickSearchMenu li>a>i{margin-right:2px;}#QuickSearchMenu li>a>div{padding-left:1.28571429em;margin-left:2px;}#layout_PageHeading{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAA8CAYAAABfESsNAAAAOUlEQVRIx+2SuREAIAzDFELL/uOSFVLx3Mm1C8nnABaNDJq5WJzAVkZGZXyPMg7+jUwCIeNZmdcZC2pxCZOpoRNgAAAAAElFTkSuQmCC) left top repeat-x #fff;background:linear-gradient(to bottom,#f2f2f2 0,#fff 50px) #fff;height:50px;padding:6px 20px 4px 20px;font-size:2em;color:#000;line-height:50px;position:relative;border-left:1px solid #d1d1d1;border-right:1px solid #d1d1d1;}#layout_PageHeading a{text-decoration:none;}#layout_PageHeading>a.button{position:absolute;right:30px;bottom:8px;font-size:.5em;line-height:1em;text-align:right;}#layout_Page{background-color:#fff;overflow:auto;border-left:1px solid #d1d1d1;border-right:1px solid #d1d1d1;border-bottom:1px solid #d1d1d1;padding:0 30px 15px 30px;-moz-border-radius:0 0 4px 4px;-webkit-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}#layout_Error{min-height:200px;}#layout_Error table{background-color:#fff;}#layout_Error h1,#layout_Error h2,#layout_Error h3,#layout_Error h4,#layout_Error h5{color:#fff;white-space:pre-wrap;}#layout_Error h2.error{margin-bottom:10px;}#layout_Error .stacktrace{white-space:pre;overflow:auto;}#layout_Error>div{margin:0 auto;width:650px;}#layout_uiExtensions{display:none;}footer,#footer{color:#777;padding:10px 0;text-align:center;margin:0;font-size:.9em;}footer a:link,#footer a:link,footer a:visited,#footer a:visited,footer a:active,#footer a:active{color:#777;}footer a:link,#footer a:link,footer a:active,#footer a:active{text-decoration:underline;}footer a:hover,#footer a:hover{color:#5e8cc2;text-decoration:none;}p{margin:0 0 2px 0;line-height:1.6em;}ul{margin:0;padding:0 0 0 25px;list-style:square;line-height:1.6em;}header,footer,nav,section{display:block;}form{display:inline;}img{border:0;padding:0;margin:0;vertical-align:bottom;}code{font-family:Consolas,"Courier New",monospace;}hr{border:0;border-bottom:1px dashed #aaa;margin-top:15px;}strong{font-weight:600;}a:link{color:#335a87;text-decoration:none;}a:visited{color:#335a87;}a:hover{color:#5e8cc2;text-decoration:underline;}a:active{color:#335a87;}a[disabled]{color:#6b6b6b;text-decoration:none;cursor:default;}a.button{display:inline-block;padding:4px 10px;margin:2px;border:1px solid #1a5f95;background:#1e6dab;color:#fff;font-weight:600;text-transform:uppercase;cursor:pointer;white-space:nowrap;text-decoration:none;}a.button[disabled],a.button.disabled{background:#9e9e9e;border:1px solid #6b6b6b;cursor:default;}a.button.alert{border-color:#900;background-color:#e51400;}a.button.small{padding:2px 5px;font-size:.9em;}a.button:hover{border:1px solid #6b6b6b;background:#9e9e9e;}a.button i{margin-right:10px;}div.actionBar{margin:0 -30px 0 -30px;padding:10px;border-top:1px solid #d1d1d1;text-align:right;background-color:#f2f2f2;clear:both;}div.actionBar:not(:first-child){margin-top:10px;}div.actionBar:last-child{margin-bottom:-15px;-moz-border-radius:0 0 6px 6px;-webkit-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;}h1,h2,h3,h4,h5,h6{color:#000;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-weight:lighter;font-stretch:condensed;margin:0;}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child,h6:first-child{margin-top:0!important;padding-top:0!important;}h1>a:link,h2>a:link,h3>a:link,h4>a:link,h5>a:link,h6>a:link{text-decoration:none;}h1{font-size:24px;}h2{font-size:20px;padding:8px 0 4px 0;}h3{font-size:18px;}h4{font-size:14px;}h5,h6{font-size:12px;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-stretch:normal;font-weight:600;}table{border:0;border-collapse:collapse;width:100%;}table td{padding:5px;margin:0;border:0;vertical-align:top;}table th{padding:5px;margin:0;text-align:left;font-weight:600;vertical-align:top;}table.none{border:0!important;}table.none tr,table.none td,table.none th{padding:0!important;margin:0!important;background:none!important;border:0!important;}table.genericData{border:solid 1px #f4f4f4;border-collapse:collapse;}table.genericData>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}table.genericData>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}table.genericData>thead>tr>th,table.genericData>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}table.genericData>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}table.genericData>tfoot>tr>th,table.genericData>tfoot>tr>td{background-color:#f4f4f4;}table.genericData td.id{text-align:center;}table.genericData td.id a{padding:0 6px;}.smallTable th,.smallTable td{font-size:.9em;}.dataTables_wrapper{position:relative;}.dataTables_wrapper>.a{position:absolute;margin-top:-24px;right:320px;opacity:.3;}.dataTables_wrapper .dataTables_filter{position:absolute;height:20px;margin-top:-20px;right:0;font-size:.9em;-moz-opacity:.3;opacity:.3;}.dataTables_wrapper .dataTables_filter input{font-size:.95em;padding:0;height:1.4em;width:150px;}.dataTables_wrapper .dataTables_length{position:absolute;height:20px;margin-top:-20px;right:200px;font-size:.9em;-moz-opacity:.3;opacity:.3;}.dataTables_wrapper .dataTables_length select{font-size:.95em;padding:0;height:1.4em;}.dataTables_wrapper .dataTables_processing{position:absolute;margin-top:30px;left:45%;}.dataTables_wrapper .dataTables_decommissioned{position:absolute;height:20px;margin-top:-20px;right:320px;font-size:.9em;-moz-opacity:.3;opacity:.3;}.dataTables_wrapper .dataTables_decommissioned input{font-size:.8em;padding:0;height:1.2em;}.dataTables_wrapper .dataTables_paginate{text-align:right;background-color:#f4f4f4;padding:2px 4px;font-size:.9em;}.dataTables_wrapper .dataTables_paginate a{cursor:pointer;padding:2px;margin:0 3px;color:#335a87;background-repeat:no-repeat;-moz-opacity:.3;opacity:.3;text-transform:uppercase;}.dataTables_wrapper .dataTables_paginate .first{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAKklEQVQI12NgQALGUe0SQPwfnY0iCcVwNjZJFAxT8J+QAvwmEHQDPl8AAAYqTAY6Jng6AAAAAElFTkSuQmCC);background-position:left center;padding-left:12px;}.dataTables_wrapper .dataTables_paginate .first.paginate_button_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAKklEQVQI12NgQAKxsbESQPwfnY0iCcVwNjZJFAxT8J+QAvwmEHQDPl8AAEm8TIFT3+fIAAAAAElFTkSuQmCC);}.dataTables_wrapper .dataTables_paginate .previous{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12NgwAGMo9olgPg/XkmsCpAlcSn4T0gBfhMIugFdEQCMVyg5CPiC8wAAAABJRU5ErkJggg==);background-position:left center;padding-left:12px;}.dataTables_wrapper .dataTables_paginate .previous.paginate_button_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12NgwAH6+vokgPg/XkmsCpAlcSn4T0gBfhMIugFdEQDzojUdMBAGjgAAAABJRU5ErkJggg==);}.dataTables_wrapper .dataTables_paginate .next{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12Mwjmr/D8QSDLgAVAFuRUgKsCtCU/CfIhPwugGnLwCZ1Cg5w6CPqwAAAABJRU5ErkJggg==);background-position:right center;padding-right:12px;}.dataTables_wrapper .dataTables_paginate .next.paginate_button_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12Po6+v7D8QSDLgAVAFuRUgKsCtCU/CfIhPwugGnLwDwPjUdLMfQ6AAAAABJRU5ErkJggg==);}.dataTables_wrapper .dataTables_paginate .last{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAK0lEQVQI12Mwjmr/D8QSDECAzIYDqCBYApmNTQE6liCk4D/JJuB1A05fAABJ/EwGJKVDGAAAAABJRU5ErkJggg==);background-position:right center;padding-right:12px;}.dataTables_wrapper .dataTables_paginate .last.paginate_button_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAK0lEQVQI12OIjY39D8QSDECAzIYDqCBYApmNTQE6liCk4D/JJuB1A05fAACQykyB48rZCQAAAABJRU5ErkJggg==);}.dataTables_wrapper .dataTables_paginate .paginate_active{font-weight:600;color:#1e6dab;}.dataTables_wrapper .dataTables_paginate .paginate_button_disabled{color:#ccc;cursor:default;}.dataTables_wrapper .dataTables_paginate .paginate_enabled_previous{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12NgwAGMo9olgPg/XkmsCpAlcSn4T0gBfhMIugFdEQCMVyg5CPiC8wAAAABJRU5ErkJggg==);background-position:left center;padding-left:12px;}.dataTables_wrapper .dataTables_paginate .paginate_disabled_previous{color:#ccc;cursor:default;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12NgwAH6+vokgPg/XkmsCpAlcSn4T0gBfhMIugFdEQDzojUdMBAGjgAAAABJRU5ErkJggg==);background-position:left center;padding-left:12px;}.dataTables_wrapper .dataTables_paginate .paginate_enabled_next{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12Mwjmr/D8QSDLgAVAFuRUgKsCtCU/CfIhPwugGnLwCZ1Cg5w6CPqwAAAABJRU5ErkJggg==);background-position:right center;padding-right:12px;}.dataTables_wrapper .dataTables_paginate .paginate_disabled_next{color:#ccc;cursor:default;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12Po6+v7D8QSDLgAVAFuRUgKsCtCU/CfIhPwugGnLwDwPjUdLMfQ6AAAAABJRU5ErkJggg==);background-position:right center;padding-right:12px;}.dataTables_wrapper:hover .dataTables_filter,.dataTables_wrapper:hover .dataTables_length,.dataTables_wrapper:hover .dataTables_paginate a,.dataTables_wrapper:hover .dataTables_decommissioned{-moz-opacity:1;opacity:1;}.dataTables_wrapper table>thead tr>th{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAD6CAYAAACoLMeFAAAAdElEQVRo3u3bOwqAMBAFwBwjh/CUluKRhfVTiil0UYjMwJLqLfmUYUuBtw3jUreKfc2E43aTi/C9Jo3wUR4WAAAAAAAAejBPc90q9jUTjkdNTuGjPj9/bgfpO0i/AgAAAAAAAPQnPZ6YHpBsNEnNefrt4+9Wmn6nW/cZ1MQAAAAASUVORK5CYII=);background-repeat:no-repeat;}.dataTables_wrapper table>thead tr>th.sorting{background-position:right center;cursor:pointer;}.dataTables_wrapper table>thead tr>th.sorting_desc{background-position:right bottom;cursor:pointer;}.dataTables_wrapper table>thead tr>th.sorting_asc{background-position:right top;cursor:pointer;}.dataTables_wrapper table>thead tr>th.sorting_disabled{background-image:none;}table.userTable div.flags{display:inline-block;float:right;}table.userTable div.flags>i{cursor:default;}table.userTable div.flags>i>.details{display:none;}.jobStatus{color:#333;}.jobStatus.Closed{color:#9e9e9e;}.jobStatus.Open{color:#60a917;}.jobStatus.AwaitingWarrantyRepair,.jobStatus.AwaitingRepairs{color:#1e6dab;}.jobStatus.AwaitingDeviceReturn,.jobStatus.AwaitingUserAction,.jobStatus.AwaitingAccountingPayment,.jobStatus.AwaitingAccountingCharge{color:#f0a30a;}.jobStatus.AwaitingInsuranceProcessing{color:#6a00ff;}.deviceStatus{color:#333;}.deviceStatus.Decommissioned{color:#9e9e9e;}.deviceStatus.Active{color:#60a917;}.deviceStatus.NotEnrolled{color:#f0a30a;}table.jobTable{border:solid 1px #f4f4f4;border-collapse:collapse;table-layout:fixed;}table.jobTable>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}table.jobTable>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}table.jobTable>thead>tr>th,table.jobTable>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}table.jobTable>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}table.jobTable>tfoot>tr>th,table.jobTable>tfoot>tr>td{background-color:#f4f4f4;}table.jobTable td{white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;}table.jobTable.hideStatusClosed tr[data-status=Closed]{display:none;}table.jobTable td.id,table.jobTable th.id{width:50px;text-align:center;}table.jobTable td.id a,table.jobTable th.id a{padding:0 6px;}table.jobTable tr.statusSlaWarning td{background-color:#fdeed1;}table.jobTable tr.statusSlaWarning td:not(:last-child){border-right:1px solid #f8e9cb;}table.jobTable tr.statusSlaExpired td{background-color:#ffd7d3;}table.jobTable tr.statusSlaExpired td:not(:last-child){border-right:1px solid #fad2ce;}table.jobTable tr:nth-child(odd).statusSlaWarning td{background-color:#fbeccf!important;}table.jobTable tr:nth-child(odd).statusSlaExpired td{background-color:#fdd5d1!important;}table.jobTable tr:hover.statusSlaWarning td{background-color:#fbeaca!important;}table.jobTable tr:hover.statusSlaExpired td{background-color:#fdd1cd!important;}table.jobTable div.queues{display:inline-block;float:right;}table.jobTable td.lastActive,table.jobTable th.lastActive{width:130px;}table.jobTable td.dates,table.jobTable th.dates{width:130px;}table.jobTable td.type,table.jobTable th.type{width:50px;}table.jobTable td.device,table.jobTable th.device{width:110px;}table.jobTable td.user,table.jobTable th.user{width:240px;}table.jobTable td.technician,table.jobTable th.technician{width:80px;}table.jobTable td.location,table.jobTable th.location{width:200px;}div.jobTable>a.dataTables_showStatusClosed{margin:10px 5px;}div.jobTable>h3,div.jobTable>div.allClosed_container{margin:50px 20px!important;}div.jobTable>h3 a.button,div.jobTable>div.allClosed_container a.button{margin-top:10px;}table.deviceTable tr.decommissioned{background-color:#ededed;}table.deviceTable.hideDecommissioned tr.decommissioned{display:none;}textarea{font-size:12px;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;border:1px solid #ccc;min-height:75px;padding:2px;color:#444;width:200px;}input[type="text"],input[type="password"],input[type="file"],input[type="number"]{font-size:12px;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;border:1px solid #ccc;padding:2px;color:#444;width:200px;}input[type="text"].small,input[type="password"].small,input[type="file"].small,input[type="number"].small{padding:0 2px;width:150px;}input[type="text"].discreet,input[type="password"].discreet,input[type="file"].discreet,input[type="number"].discreet{border:1px solid #fff;}input[type="text"].discreet:hover,input[type="password"].discreet:hover,input[type="file"].discreet:hover,input[type="number"].discreet:hover,input[type="text"].discreet:focus,input[type="password"].discreet:focus,input[type="file"].discreet:focus,input[type="number"].discreet:focus{border:1px solid #ccc;}input[type="checkbox"],input[type="radio"]{margin-right:4px;vertical-align:sub;}select{font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-size:12px;border:1px solid #ccc;padding:2px;color:#444;}select.small{padding:0;}input[type="submit"],button{font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;padding:5px;}input[type="submit"].button,button.button{font-size:12px;padding:4px 10px 4px 10px;margin:2px;border:1px solid #1a5f95;background:#1e6dab;color:#fff;font-weight:600;text-transform:uppercase;cursor:pointer;}input[type="submit"].button.alert,button.button.alert{border-color:#900;background-color:#e51400;}input[type="submit"].button.small,button.button.small{padding:2px 5px;font-size:.9em;}input[type="submit"].button[disabled],button.button[disabled]{background:#9e9e9e;border:1px solid #6b6b6b;cursor:default;}input[type="submit"].button:hover,button.button:hover{border:1px solid #6b6b6b;background:#9e9e9e;}ul.none,ol.none{list-style:none;margin:0;padding:0;}ul.none li,ol.none li{margin:0;}div.form{margin:0 auto;}div.form>p.actions{text-align:right;}div.form>table{border-top:6px solid #1e6dab;border-left:1px solid #1e6dab;border-right:1px solid #1e6dab;border-bottom:3px solid #1e6dab;background-color:#fff;}div.form>table>tbody>tr>td,div.form>table>tbody>tr>th{background:none;border:0;margin:0;padding:8px 5px;}div.form>table>tbody>tr>th{font-weight:normal;text-align:right;}div.form>table>tbody>tr:nth-child(odd){background-color:#f2f2f2;margin:0;padding:0;}div.form>table>tbody>tr>td.details{padding:0;}div.form>table>tbody>tr>th.name{width:150px;text-align:right;}div.form>table table.sub>tbody>tr:not(:first-child)>th,div.form>table table.sub>tbody>tr:not(:first-child)>td{border-top:1px dashed #aaa;}div.form>table table.sub>tbody>tr>th{font-weight:normal;text-align:right;}div.form>table table.sub>tbody>tr>th.name{text-align:right;}#pageMenu td{border-right:1px dashed #aaa;width:33%;padding:10px;}#pageMenu td .pageMenuArea>.fa{font-size:1.3em;color:#6b6b6b;margin-right:4px;}#pageMenu td .pageMenuArea>a,#pageMenu td .pageMenuArea>h3{text-decoration:none;font-size:1.2em;}#pageMenu td .pageMenuArea .pageMenuBlurb{font-size:.9em;color:#888;margin-bottom:10px;}#pageMenu td .pageMenuArea .pageMenuBlurb a{text-decoration:none;}#pageMenu td .pageMenuArea:not(:last-child){border-bottom:1px dashed #aaa;}#pageMenu td .pageMenuArea.noSeperator{border-bottom:0;}#pageMenu td:first-child{padding-left:0;}#pageMenu td:last-child{border-right:0;padding-right:0;}div.info-box{margin:.4em 0;padding:.4em;border:1px solid #fff397;background-color:#fffef7;}div.info-box i{color:#1e6dab;}div.info-box.alert{border:1px solid #fa6800;background-color:#fff9f5;color:#333;}div.info-box.alert i{color:#fa6800;}div.info-box.error{border:1px solid #e51400;background-color:#fffaf9;color:#e51400;}div.info-box.error i{color:#e51400;}div.info-box p{line-height:1.2em;}p.fa-p{text-indent:-1.48em;margin-left:1.48em;}p.fa-p>i:first-child{text-indent:0;width:1.28em;margin-right:.2em;}div.Disco-AttachmentUpload-DropTarget{display:none;}div.Disco-AttachmentUpload-DropTarget.dragHighlight{display:block;position:absolute;z-index:1000;top:0;left:0;width:calc(100% - 6px);height:calc(100% - 6px);background-color:rgba(251,218,152,.5);border:3px dashed #f0a30a;}div.Disco-AttachmentUpload-DropTarget.dragHighlight h2{margin-top:3em!important;color:#2c1e02;text-align:center;font-weight:600;}div.Disco-AttachmentUpload-DropTarget.dragHighlight.dragHover{background-color:rgba(173,235,110,.5);border:3px dashed #60a917;}div.Disco-AttachmentUpload-DropTarget.dragHighlight.dragHover h2{color:#000;}div.Disco-AttachmentUpload-Progress{position:absolute;right:0;bottom:48px;}div.Disco-AttachmentUpload-Progress>div{background-color:#fafafa;padding:4px 8px;}div.Disco-AttachmentUpload-Progress>div i{color:#1e6dab;margin-right:4px;}div.Disco-AttachmentUpload-CommentDialog{padding:.25em .5em!important;}div.Disco-AttachmentUpload-CommentDialog table{border:solid 1px #f4f4f4;border-collapse:collapse;table-layout:fixed;}div.Disco-AttachmentUpload-CommentDialog table>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}div.Disco-AttachmentUpload-CommentDialog table>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}div.Disco-AttachmentUpload-CommentDialog table>thead>tr>th,div.Disco-AttachmentUpload-CommentDialog table>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}div.Disco-AttachmentUpload-CommentDialog table>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}div.Disco-AttachmentUpload-CommentDialog table>tfoot>tr>th,div.Disco-AttachmentUpload-CommentDialog table>tfoot>tr>td{background-color:#f4f4f4;}div.Disco-AttachmentUpload-CommentDialog table th{width:80px;}div.Disco-AttachmentUpload-CommentDialog table td.filename{font-family:Consolas,"Courier New",monospace;white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;}div.Disco-AttachmentUpload-CommentDialog table input.comments{width:calc(100% - 5px);}div.Disco-AttachmentUpload-CommentDialog table td.thumbnail{display:none;text-align:center;}div.Disco-AttachmentUpload-CommentDialog table td.thumbnail img{border:1px solid #9e9e9e;max-height:250px;max-width:374px;}div.Disco-AttachmentUpload-ImageDialog{background-color:#000!important;padding:0!important;}body>.User_FlagAssignment_Tooltip span.name{display:block;font-weight:600;}body>.User_FlagAssignment_Tooltip span.comments{display:block;padding:2px 0 2px 4px;}body>.User_FlagAssignment_Tooltip span.added{font-style:italic;font-size:.9em;}#Document_Generation_Container #Document_Generate{padding:0;}.d-priority-high{color:#fa6800;width:1.28571429em;text-align:center;}.d-priority-high:before{content:"";}.d-priority-normal{color:#60a917;width:1.28571429em;text-align:center;}.d-priority-normal:before{content:"";}.d-priority-low{color:#1e6dab;width:1.28571429em;text-align:center;}.d-priority-low:before{content:"";}.fa-stack .d-priority-high,.fa-stack .d-priority-normal,.fa-stack .d-priority-low{width:100%;font-size:.8em;margin-left:.5em;margin-top:.4em;opacity:.6;}.d-lime{color:#a4c400;}.d-green{color:#60a917;}.d-emerald{color:#008a00;}.d-teal{color:#00aba9;}.d-cyan{color:#1ba1e2;}.d-cobalt{color:#0050ef;}.d-indigo{color:#6a00ff;}.d-violet{color:#a0f;}.d-pink{color:#f472d0;}.d-magenta{color:#d80073;}.d-crimson{color:#a20025;}.d-red{color:#e51400;}.d-orange{color:#fa6800;}.d-amber{color:#f0a30a;}.d-yellow{color:#e3c800;}.d-brown{color:#825a2c;}.d-olive{color:#6d8764;}.d-steel{color:#647689;}.d-mauve{color:#76608a;}.d-sienna{color:#a0522d;}table.subtleHighlight{border:1px solid #ccc;background-color:#ededed;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}td.subtleHighlight{border:1px solid #ccc;background-color:#ededed;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.field-validation-error{color:#e51400!important;}.field-validation-valid{display:none;}.input-validation-error{border:1px solid #e51400!important;background-color:#fff7f7!important;}.validation-summary-errors{font-weight:bold!important;color:#e51400!important;}.validation-summary-valid{display:none;}.ajaxLoading{height:11px;width:16px;display:inline-block;background-repeat:no-repeat;background-image:url(data:image/gif;base64,R0lGODlhEAALAPQAAP///zNah+Hm7dng6O7x9DddiTNah1d3nJqtw3+Xs8fS3k5vlm6JqaGzx4KatcrU4FFymDZciHGMq+ru8t/l7Pb3+V9+oeLo7vT2+MTP3LLB0dTc5fHz9gAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCwAAACwAAAAAEAALAAAFLSAgjmRpnqSgCuLKAq5AEIM4zDVw03ve27ifDgfkEYe04kDIDC5zrtYKRa2WQgAh+QQJCwAAACwAAAAAEAALAAAFJGBhGAVgnqhpHIeRvsDawqns0qeN5+y967tYLyicBYE7EYkYAgAh+QQJCwAAACwAAAAAEAALAAAFNiAgjothLOOIJAkiGgxjpGKiKMkbz7SN6zIawJcDwIK9W/HISxGBzdHTuBNOmcJVCyoUlk7CEAAh+QQJCwAAACwAAAAAEAALAAAFNSAgjqQIRRFUAo3jNGIkSdHqPI8Tz3V55zuaDacDyIQ+YrBH+hWPzJFzOQQaeavWi7oqnVIhACH5BAkLAAAALAAAAAAQAAsAAAUyICCOZGme1rJY5kRRk7hI0mJSVUXJtF3iOl7tltsBZsNfUegjAY3I5sgFY55KqdX1GgIAIfkECQsAAAAsAAAAABAACwAABTcgII5kaZ4kcV2EqLJipmnZhWGXaOOitm2aXQ4g7P2Ct2ER4AMul00kj5g0Al8tADY2y6C+4FIIACH5BAkLAAAALAAAAAAQAAsAAAUvICCOZGme5ERRk6iy7qpyHCVStA3gNa/7txxwlwv2isSacYUc+l4tADQGQ1mvpBAAIfkECQsAAAAsAAAAABAACwAABS8gII5kaZ7kRFGTqLLuqnIcJVK0DeA1r/u3HHCXC/aKxJpxhRz6Xi0ANAZDWa+kEAA7AAAAAAAAAAAA);margin-bottom:0;}.ajaxOk{color:#60a917;}.ajaxSave{color:#1e6dab;cursor:pointer;}.ajaxRemove{color:#e51400;cursor:pointer;opacity:.8;}.ajaxRemove:hover{opacity:1;}#layout_Page div.hiddenDialog{display:none;}* html .clearfix{height:1%;overflow:visible;}*+html .clearfix{min-height:1%;}.clearfix:after{clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0;}div.columnHost .column50{float:left;width:50%;}.hidden{display:none;}.success{color:#60a917;}.information{color:#1e6dab;}.warning{color:#f0a30a;}.error{color:#e51400;}.alert{color:#fa6800;}.smallText{font-size:.9em;}.smallMessage{font-style:italic;color:#666;font-size:.9em;}.nowrap{white-space:nowrap;}.code{font-family:Consolas,"Courier New",monospace;}div.code{border:1px dashed #bbb;background-color:#fff;margin:3px 6px;padding:4px;font-size:.9em;}a.smallLink{font-size:.9em;}textarea.block{width:250px;height:100px;}.checkboxBulkSelectContainer{margin-top:6px;font-size:.8em;}.checkboxBulkSelectContainer a{text-decoration:none;}.ui-widget .checkboxBulkSelectContainer{font-size:1em;}#licence{text-align:justify;}#licence p{font-size:.9em;line-height:1.6em;margin-bottom:1em;}#licence li{font-size:.9em;}#Document_Generation_Dialog{height:490px;}#Document_Generation_Dialog .handlerPicker{position:absolute;width:170px;height:390px;overflow-y:auto;background-color:#fcfcfc;border:1px solid #ccc;}#Document_Generation_Dialog .handlerPicker>div{background-color:#fff;border-bottom:1px solid #ddd;padding:6px 0 6px 6px;cursor:pointer;}#Document_Generation_Dialog .handlerPicker>div:hover{background-color:#f4f4f4;}#Document_Generation_Dialog .handlerPicker>div.selected,#Document_Generation_Dialog .handlerPicker>div.selected:hover{background-color:#eee;}#Document_Generation_Dialog .handlerPicker #Document_Generation_Dialog_Handlers_Loading{text-align:center;}#Document_Generation_Dialog .details{position:absolute;left:200px;height:390px;width:540px;overflow-y:auto;}#Document_Generation_Dialog .details #Document_Generation_Dialog_Download_Container{text-align:center;padding-top:3em;}#Document_Generation_Dialog .details #Document_Generation_Dialog_HandlerUI{display:none;}ul.list-group{background-color:#fff;border:1px solid #ddd;margin:0;padding:0;list-style:none;}ul.list-group li{padding:6px 0 6px 6px;cursor:pointer;}ul.list-group li:hover{background-color:#f4f4f4;}ul.list-group li.selected,ul.list-group li.selected:hover{background-color:#eee;}ul.list-group li:not(:first-child){border-top:1px solid #ddd;}.whitespace-pre-wrap{white-space:pre-wrap;} \ No newline at end of file +.tableData{border:solid 1px #f4f4f4;border-collapse:collapse;}.tableData>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}.tableData>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}.tableData>thead>tr>th,.tableData>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}.tableData>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}.tableData>tfoot>tr>th,.tableData>tfoot>tr>td{background-color:#f4f4f4;}.tableDataDark{border:solid 1px #d8d8d8;border-collapse:collapse;}.tableDataDark td{border:solid 1px #d8d8d8;background-color:#fff;}.tableDataDark th{background-color:#eee;border:solid 1px #d8d8d8;}.tableDataContainer{background-color:#fff;}.tableDataVertical{border:solid 1px #f4f4f4;border-collapse:collapse;}.tableDataVertical>tbody>tr:nth-child(odd){background-color:#f4f4f4;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;color:#333;}body.layout{background:url(data:image/png;base64,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) left top repeat-x #d1d1d1;background:linear-gradient(to bottom,#f2f2f2 0,#d1d1d1 370px) left top repeat-x #d1d1d1;min-height:370px;}.page{max-width:1232px;min-width:768px;margin-left:auto;margin-right:auto;}header,#header{position:relative;background-color:#333;margin:0;padding:0;height:34px;}header #heading,#header #heading{float:left;height:34px;}header #heading i,#header #heading i{display:block;height:34px;width:34px;background-image:url(data:image/png;base64,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);}header nav,#header nav{float:left;height:34px;padding:0;margin:0;}header nav ul#menu,#header nav ul#menu{height:26px;padding:0;margin:8px 0 0 4px;list-style:none;z-index:100000;font-size:0;line-height:0;}header nav ul#menu>li,#header nav ul#menu>li{display:inline-block;z-index:100000;font-size:13.2px;line-height:19.2px;}header nav ul#menu>li.moveRight,#header nav ul#menu>li.moveRight{margin-left:20px;}header nav ul#menu>li>a,#header nav ul#menu>li>a{display:inline-block;padding:2px 10px 4px 10px;height:20px;color:#fff;font-weight:400;text-transform:uppercase;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.active>a,#header nav ul#menu>li.active>a{background-color:#222;}header nav ul#menu>li:hover>a,#header nav ul#menu>li:hover>a{background-color:#111;text-decoration:none;}header nav ul#menu>li>ul,#header nav ul#menu>li>ul{z-index:100000;display:none;list-style:none;position:absolute;margin:0;border-left:1px solid #d1d1d1;border-right:1px solid #d1d1d1;background-color:hsl(0,0%,95%);padding:0;min-width:180px;box-shadow:2px 2px 5px rgba(209,209,209,.5);}header nav ul#menu>li>ul li,#header nav ul#menu>li>ul li{position:relative;background-position:top;background-repeat:repeat-x;border-top:1px solid hsl(0,0%,90%);}header nav ul#menu>li>ul li:first-child,#header nav ul#menu>li>ul li:first-child{border-top:1px solid #d1d1d1;}header nav ul#menu>li>ul li:last-child,#header nav ul#menu>li>ul li:last-child{border-bottom:1px solid #d1d1d1;}header nav ul#menu>li>ul li:hover,#header nav ul#menu>li>ul li:hover{border-top:1px solid hsl(0,0%,85%);background-color:hsl(0,0%,90%);}header nav ul#menu>li>ul li a,#header nav ul#menu>li>ul li a{display:block;color:#000;padding:4px 8px;text-decoration:none;}header nav ul#menu>li>ul li a:hover,#header nav ul#menu>li>ul li a:hover{color:#335a87;text-decoration:none;}header nav ul#menu>li>ul li a:active,#header nav ul#menu>li>ul li a:active{text-decoration:none;}header nav ul#menu>li>ul li i.fa-caret-right,#header nav ul#menu>li>ul li i.fa-caret-right{cursor:pointer;color:#666;font-size:16px;position:absolute;display:block;right:12px;top:7px;}header nav ul#menu>li>ul li:hover i.fa-caret-right,#header nav ul#menu>li>ul li:hover i.fa-caret-right{color:#333;}header nav ul#menu>li>ul ul,#header nav ul#menu>li>ul ul{display:none;list-style:none;position:absolute;top:-1px;left:180px;background-color:hsl(0,0%,95%);border-left:1px solid #d1d1d1;border-right:1px solid #d1d1d1;padding:0;min-width:180px;box-shadow:2px 2px 5px rgba(209,209,209,.5);}header #headerMenu,#header #headerMenu{float:right;height:24px;padding:5px 8px;font-size:.9em;line-height:24px;text-align:right;color:#fff;}header #headerMenu a,#header #headerMenu a{color:#fff;text-decoration:none;}header #headerMenu a:hover,#header #headerMenu a:hover{color:#cddbec;text-decoration:none;}header #SearchQuery,#header #SearchQuery{font-size:.9em;margin-left:6px;width:130px;background-color:#eee;-moz-transition-property:width;-o-transition-property:width;-webkit-transition-property:width;transition-property:width;-moz-transition-duration:.1s;-o-transition-duration:.1s;-webkit-transition-duration:.1s;transition-duration:.1s;}header #SearchQuery:hover,#header #SearchQuery:hover,header #SearchQuery:focus,#header #SearchQuery:focus{background-color:#fff;width:190px;}header .watermark,#header .watermark{background-color:#888;}#QuickSearchMenu{max-height:400px;font-size:.9em;background:none;background-color:#fafafa;}#QuickSearchMenu li:not(:last-child){border-bottom:1px solid #d8d8d8;}#QuickSearchMenu li>a{padding:2px;}#QuickSearchMenu li>a>i{margin-right:2px;}#QuickSearchMenu li>a>div{padding-left:1.28571429em;margin-left:2px;}#layout_PageHeading{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAA8CAYAAABfESsNAAAAOUlEQVRIx+2SuREAIAzDFELL/uOSFVLx3Mm1C8nnABaNDJq5WJzAVkZGZXyPMg7+jUwCIeNZmdcZC2pxCZOpoRNgAAAAAElFTkSuQmCC) left top repeat-x #fff;background:linear-gradient(to bottom,#f2f2f2 0,#fff 50px) #fff;height:50px;padding:6px 20px 4px 20px;font-size:2em;color:#000;line-height:50px;position:relative;border-left:1px solid #d1d1d1;border-right:1px solid #d1d1d1;}#layout_PageHeading a{text-decoration:none;}#layout_PageHeading>a.button{position:absolute;right:30px;bottom:8px;font-size:.5em;line-height:1em;text-align:right;}#layout_Page{background-color:#fff;overflow:auto;border-left:1px solid #d1d1d1;border-right:1px solid #d1d1d1;border-bottom:1px solid #d1d1d1;padding:0 30px 15px 30px;-moz-border-radius:0 0 4px 4px;-webkit-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}#layout_Error{min-height:200px;}#layout_Error table{background-color:#fff;}#layout_Error h1,#layout_Error h2,#layout_Error h3,#layout_Error h4,#layout_Error h5{color:#fff;white-space:pre-wrap;}#layout_Error h2.error{margin-bottom:10px;}#layout_Error .stacktrace{white-space:pre;overflow:auto;}#layout_Error>div{margin:0 auto;width:650px;}#layout_uiExtensions{display:none;}footer,#footer{color:#777;padding:10px 0;text-align:center;margin:0;font-size:.9em;}footer a:link,#footer a:link,footer a:visited,#footer a:visited,footer a:active,#footer a:active{color:#777;}footer a:link,#footer a:link,footer a:active,#footer a:active{text-decoration:underline;}footer a:hover,#footer a:hover{color:#5e8cc2;text-decoration:none;}p{margin:0 0 2px 0;line-height:1.6em;}ul{margin:0;padding:0 0 0 25px;list-style:square;line-height:1.6em;}header,footer,nav,section{display:block;}form{display:inline;}img{border:0;padding:0;margin:0;vertical-align:bottom;}code{font-family:Consolas,"Courier New",monospace;}hr{border:0;border-bottom:1px dashed #aaa;margin-top:15px;}strong{font-weight:600;}a:link{color:#335a87;text-decoration:none;}a:visited{color:#335a87;}a:hover{color:#5e8cc2;text-decoration:underline;}a:active{color:#335a87;}a[disabled]{color:#6b6b6b;text-decoration:none;cursor:default;}a.button{display:inline-block;padding:4px 10px;margin:2px;border:1px solid #1a5f95;background:#1e6dab;color:#fff;font-weight:600;text-transform:uppercase;cursor:pointer;white-space:nowrap;text-decoration:none;}a.button[disabled],a.button.disabled{background:#9e9e9e;border:1px solid #6b6b6b;cursor:default;}a.button.alert{border-color:#900;background-color:#e51400;}a.button.small{padding:2px 5px;font-size:.9em;}a.button:hover{border:1px solid #6b6b6b;background:#9e9e9e;}a.button i{margin-right:10px;}div.actionBar{margin:0 -30px 0 -30px;padding:10px;border-top:1px solid #d1d1d1;text-align:right;background-color:#f2f2f2;clear:both;}div.actionBar:not(:first-child){margin-top:10px;}div.actionBar:last-child{margin-bottom:-15px;-moz-border-radius:0 0 6px 6px;-webkit-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;}h1,h2,h3,h4,h5,h6{color:#000;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-weight:lighter;font-stretch:condensed;margin:0;}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child,h6:first-child{margin-top:0!important;padding-top:0!important;}h1>a:link,h2>a:link,h3>a:link,h4>a:link,h5>a:link,h6>a:link{text-decoration:none;}h1{font-size:24px;}h2{font-size:20px;padding:8px 0 4px 0;}h3{font-size:18px;}h4{font-size:14px;}h5,h6{font-size:12px;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-stretch:normal;font-weight:600;}table{border:0;border-collapse:collapse;width:100%;}table td{padding:5px;margin:0;border:0;vertical-align:top;}table th{padding:5px;margin:0;text-align:left;font-weight:600;vertical-align:top;}table.none{border:0!important;}table.none tr,table.none td,table.none th{padding:0!important;margin:0!important;background:none!important;border:0!important;}table.genericData{border:solid 1px #f4f4f4;border-collapse:collapse;}table.genericData>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}table.genericData>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}table.genericData>thead>tr>th,table.genericData>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}table.genericData>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}table.genericData>tfoot>tr>th,table.genericData>tfoot>tr>td{background-color:#f4f4f4;}table.genericData td.id{text-align:center;}table.genericData td.id a{padding:0 6px;}.smallTable th,.smallTable td{font-size:.9em;}.dataTables_wrapper{position:relative;}.dataTables_wrapper>.a{position:absolute;margin-top:-24px;right:320px;opacity:.3;}.dataTables_wrapper .dataTables_filter{position:absolute;height:20px;margin-top:-20px;right:0;font-size:.9em;-moz-opacity:.3;opacity:.3;}.dataTables_wrapper .dataTables_filter input{font-size:.95em;padding:0;height:1.4em;width:150px;}.dataTables_wrapper .dataTables_length{position:absolute;height:20px;margin-top:-20px;right:200px;font-size:.9em;-moz-opacity:.3;opacity:.3;}.dataTables_wrapper .dataTables_length select{font-size:.95em;padding:0;height:1.4em;}.dataTables_wrapper .dataTables_processing{position:absolute;margin-top:30px;left:45%;}.dataTables_wrapper .dataTables_decommissioned{position:absolute;height:20px;margin-top:-20px;right:320px;font-size:.9em;-moz-opacity:.3;opacity:.3;}.dataTables_wrapper .dataTables_decommissioned input{font-size:.8em;padding:0;height:1.2em;}.dataTables_wrapper .dataTables_paginate{text-align:right;background-color:#f4f4f4;padding:2px 4px;font-size:.9em;}.dataTables_wrapper .dataTables_paginate a{cursor:pointer;padding:2px;margin:0 3px;color:#335a87;background-repeat:no-repeat;-moz-opacity:.3;opacity:.3;text-transform:uppercase;}.dataTables_wrapper .dataTables_paginate .first{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAKklEQVQI12NgQALGUe0SQPwfnY0iCcVwNjZJFAxT8J+QAvwmEHQDPl8AAAYqTAY6Jng6AAAAAElFTkSuQmCC);background-position:left center;padding-left:12px;}.dataTables_wrapper .dataTables_paginate .first.paginate_button_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAKklEQVQI12NgQAKxsbESQPwfnY0iCcVwNjZJFAxT8J+QAvwmEHQDPl8AAEm8TIFT3+fIAAAAAElFTkSuQmCC);}.dataTables_wrapper .dataTables_paginate .previous{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12NgwAGMo9olgPg/XkmsCpAlcSn4T0gBfhMIugFdEQCMVyg5CPiC8wAAAABJRU5ErkJggg==);background-position:left center;padding-left:12px;}.dataTables_wrapper .dataTables_paginate .previous.paginate_button_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12NgwAH6+vokgPg/XkmsCpAlcSn4T0gBfhMIugFdEQDzojUdMBAGjgAAAABJRU5ErkJggg==);}.dataTables_wrapper .dataTables_paginate .next{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12Mwjmr/D8QSDLgAVAFuRUgKsCtCU/CfIhPwugGnLwCZ1Cg5w6CPqwAAAABJRU5ErkJggg==);background-position:right center;padding-right:12px;}.dataTables_wrapper .dataTables_paginate .next.paginate_button_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12Po6+v7D8QSDLgAVAFuRUgKsCtCU/CfIhPwugGnLwDwPjUdLMfQ6AAAAABJRU5ErkJggg==);}.dataTables_wrapper .dataTables_paginate .last{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAK0lEQVQI12Mwjmr/D8QSDECAzIYDqCBYApmNTQE6liCk4D/JJuB1A05fAABJ/EwGJKVDGAAAAABJRU5ErkJggg==);background-position:right center;padding-right:12px;}.dataTables_wrapper .dataTables_paginate .last.paginate_button_disabled{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAK0lEQVQI12OIjY39D8QSDECAzIYDqCBYApmNTQE6liCk4D/JJuB1A05fAACQykyB48rZCQAAAABJRU5ErkJggg==);}.dataTables_wrapper .dataTables_paginate .paginate_active{font-weight:600;color:#1e6dab;}.dataTables_wrapper .dataTables_paginate .paginate_button_disabled{color:#ccc;cursor:default;}.dataTables_wrapper .dataTables_paginate .paginate_enabled_previous{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12NgwAGMo9olgPg/XkmsCpAlcSn4T0gBfhMIugFdEQCMVyg5CPiC8wAAAABJRU5ErkJggg==);background-position:left center;padding-left:12px;}.dataTables_wrapper .dataTables_paginate .paginate_disabled_previous{color:#ccc;cursor:default;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12NgwAH6+vokgPg/XkmsCpAlcSn4T0gBfhMIugFdEQDzojUdMBAGjgAAAABJRU5ErkJggg==);background-position:left center;padding-left:12px;}.dataTables_wrapper .dataTables_paginate .paginate_enabled_next{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12Mwjmr/D8QSDLgAVAFuRUgKsCtCU/CfIhPwugGnLwCZ1Cg5w6CPqwAAAABJRU5ErkJggg==);background-position:right center;padding-right:12px;}.dataTables_wrapper .dataTables_paginate .paginate_disabled_next{color:#ccc;cursor:default;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAAJUlEQVQI12Po6+v7D8QSDLgAVAFuRUgKsCtCU/CfIhPwugGnLwDwPjUdLMfQ6AAAAABJRU5ErkJggg==);background-position:right center;padding-right:12px;}.dataTables_wrapper:hover .dataTables_filter,.dataTables_wrapper:hover .dataTables_length,.dataTables_wrapper:hover .dataTables_paginate a,.dataTables_wrapper:hover .dataTables_decommissioned{-moz-opacity:1;opacity:1;}.dataTables_wrapper table>thead tr>th{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAD6CAYAAACoLMeFAAAAdElEQVRo3u3bOwqAMBAFwBwjh/CUluKRhfVTiil0UYjMwJLqLfmUYUuBtw3jUreKfc2E43aTi/C9Jo3wUR4WAAAAAAAAejBPc90q9jUTjkdNTuGjPj9/bgfpO0i/AgAAAAAAAPQnPZ6YHpBsNEnNefrt4+9Wmn6nW/cZ1MQAAAAASUVORK5CYII=);background-repeat:no-repeat;}.dataTables_wrapper table>thead tr>th.sorting{background-position:right center;cursor:pointer;}.dataTables_wrapper table>thead tr>th.sorting_desc{background-position:right bottom;cursor:pointer;}.dataTables_wrapper table>thead tr>th.sorting_asc{background-position:right top;cursor:pointer;}.dataTables_wrapper table>thead tr>th.sorting_disabled{background-image:none;}table.userTable div.flags,table.deviceTable div.flags{display:inline-block;float:right;}table.userTable div.flags>i,table.deviceTable div.flags>i{cursor:default;}table.userTable div.flags>i>.details,table.deviceTable div.flags>i>.details{display:none;}.jobStatus{color:#333;}.jobStatus.Closed{color:#9e9e9e;}.jobStatus.Open{color:#60a917;}.jobStatus.AwaitingWarrantyRepair,.jobStatus.AwaitingRepairs{color:#1e6dab;}.jobStatus.AwaitingDeviceReturn,.jobStatus.AwaitingUserAction,.jobStatus.AwaitingAccountingPayment,.jobStatus.AwaitingAccountingCharge{color:#f0a30a;}.jobStatus.AwaitingInsuranceProcessing{color:#6a00ff;}.deviceStatus{color:#333;}.deviceStatus.Decommissioned{color:#9e9e9e;}.deviceStatus.Active{color:#60a917;}.deviceStatus.NotEnrolled{color:#f0a30a;}table.jobTable{border:solid 1px #f4f4f4;border-collapse:collapse;table-layout:fixed;}table.jobTable>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}table.jobTable>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}table.jobTable>thead>tr>th,table.jobTable>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}table.jobTable>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}table.jobTable>tfoot>tr>th,table.jobTable>tfoot>tr>td{background-color:#f4f4f4;}table.jobTable td{white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;}table.jobTable.hideStatusClosed tr[data-status=Closed]{display:none;}table.jobTable td.id,table.jobTable th.id{width:50px;text-align:center;}table.jobTable td.id a,table.jobTable th.id a{padding:0 6px;}table.jobTable tr.statusSlaWarning td{background-color:#fdeed1;}table.jobTable tr.statusSlaWarning td:not(:last-child){border-right:1px solid #f8e9cb;}table.jobTable tr.statusSlaExpired td{background-color:#ffd7d3;}table.jobTable tr.statusSlaExpired td:not(:last-child){border-right:1px solid #fad2ce;}table.jobTable tr:nth-child(odd).statusSlaWarning td{background-color:#fbeccf!important;}table.jobTable tr:nth-child(odd).statusSlaExpired td{background-color:#fdd5d1!important;}table.jobTable tr:hover.statusSlaWarning td{background-color:#fbeaca!important;}table.jobTable tr:hover.statusSlaExpired td{background-color:#fdd1cd!important;}table.jobTable div.queues{display:inline-block;float:right;}table.jobTable td.lastActive,table.jobTable th.lastActive{width:130px;}table.jobTable td.dates,table.jobTable th.dates{width:130px;}table.jobTable td.type,table.jobTable th.type{width:50px;}table.jobTable td.device,table.jobTable th.device{width:110px;}table.jobTable td.user,table.jobTable th.user{width:240px;}table.jobTable td.technician,table.jobTable th.technician{width:80px;}table.jobTable td.location,table.jobTable th.location{width:200px;}div.jobTable>a.dataTables_showStatusClosed{margin:10px 5px;}div.jobTable>h3,div.jobTable>div.allClosed_container{margin:50px 20px!important;}div.jobTable>h3 a.button,div.jobTable>div.allClosed_container a.button{margin-top:10px;}table.deviceTable tr.decommissioned{background-color:#ededed;}table.deviceTable.hideDecommissioned tr.decommissioned{display:none;}textarea{font-size:12px;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;border:1px solid #ccc;min-height:75px;padding:2px;color:#444;width:200px;}input[type="text"],input[type="password"],input[type="file"],input[type="number"]{font-size:12px;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;border:1px solid #ccc;padding:2px;color:#444;width:200px;}input[type="text"].small,input[type="password"].small,input[type="file"].small,input[type="number"].small{padding:0 2px;width:150px;}input[type="text"].discreet,input[type="password"].discreet,input[type="file"].discreet,input[type="number"].discreet{border:1px solid #fff;}input[type="text"].discreet:hover,input[type="password"].discreet:hover,input[type="file"].discreet:hover,input[type="number"].discreet:hover,input[type="text"].discreet:focus,input[type="password"].discreet:focus,input[type="file"].discreet:focus,input[type="number"].discreet:focus{border:1px solid #ccc;}input[type="checkbox"],input[type="radio"]{margin-right:4px;vertical-align:sub;}select{font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-size:12px;border:1px solid #ccc;padding:2px;color:#444;}select.small{padding:0;}input[type="submit"],button{font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;padding:5px;}input[type="submit"].button,button.button{font-size:12px;padding:4px 10px 4px 10px;margin:2px;border:1px solid #1a5f95;background:#1e6dab;color:#fff;font-weight:600;text-transform:uppercase;cursor:pointer;}input[type="submit"].button.alert,button.button.alert{border-color:#900;background-color:#e51400;}input[type="submit"].button.small,button.button.small{padding:2px 5px;font-size:.9em;}input[type="submit"].button[disabled],button.button[disabled]{background:#9e9e9e;border:1px solid #6b6b6b;cursor:default;}input[type="submit"].button:hover,button.button:hover{border:1px solid #6b6b6b;background:#9e9e9e;}ul.none,ol.none{list-style:none;margin:0;padding:0;}ul.none li,ol.none li{margin:0;}div.form{margin:0 auto;}div.form>p.actions{text-align:right;}div.form>table{border-top:6px solid #1e6dab;border-left:1px solid #1e6dab;border-right:1px solid #1e6dab;border-bottom:3px solid #1e6dab;background-color:#fff;}div.form>table>tbody>tr>td,div.form>table>tbody>tr>th{background:none;border:0;margin:0;padding:8px 5px;}div.form>table>tbody>tr>th{font-weight:normal;text-align:right;}div.form>table>tbody>tr:nth-child(odd){background-color:#f2f2f2;margin:0;padding:0;}div.form>table>tbody>tr>td.details{padding:0;}div.form>table>tbody>tr>th.name{width:150px;text-align:right;}div.form>table table.sub>tbody>tr:not(:first-child)>th,div.form>table table.sub>tbody>tr:not(:first-child)>td{border-top:1px dashed #aaa;}div.form>table table.sub>tbody>tr>th{font-weight:normal;text-align:right;}div.form>table table.sub>tbody>tr>th.name{text-align:right;}#pageMenu td{border-right:1px dashed #aaa;width:33%;padding:10px;}#pageMenu td .pageMenuArea>.fa{font-size:1.3em;color:#6b6b6b;margin-right:4px;}#pageMenu td .pageMenuArea>a,#pageMenu td .pageMenuArea>h3{text-decoration:none;font-size:1.2em;}#pageMenu td .pageMenuArea .pageMenuBlurb{font-size:.9em;color:#888;margin-bottom:10px;}#pageMenu td .pageMenuArea .pageMenuBlurb a{text-decoration:none;}#pageMenu td .pageMenuArea:not(:last-child){border-bottom:1px dashed #aaa;}#pageMenu td .pageMenuArea.noSeperator{border-bottom:0;}#pageMenu td:first-child{padding-left:0;}#pageMenu td:last-child{border-right:0;padding-right:0;}div.info-box{margin:.4em 0;padding:.4em;border:1px solid #fff397;background-color:#fffef7;}div.info-box i{color:#1e6dab;}div.info-box.alert{border:1px solid #fa6800;background-color:#fff9f5;color:#333;}div.info-box.alert i{color:#fa6800;}div.info-box.error{border:1px solid #e51400;background-color:#fffaf9;color:#e51400;}div.info-box.error i{color:#e51400;}div.info-box p{line-height:1.2em;}p.fa-p{text-indent:-1.48em;margin-left:1.48em;}p.fa-p>i:first-child{text-indent:0;width:1.28em;margin-right:.2em;}div.Disco-AttachmentUpload-DropTarget{display:none;}div.Disco-AttachmentUpload-DropTarget.dragHighlight{display:block;position:absolute;z-index:1000;top:0;left:0;width:calc(100% - 6px);height:calc(100% - 6px);background-color:rgba(251,218,152,.5);border:3px dashed #f0a30a;}div.Disco-AttachmentUpload-DropTarget.dragHighlight h2{margin-top:3em!important;color:#2c1e02;text-align:center;font-weight:600;}div.Disco-AttachmentUpload-DropTarget.dragHighlight.dragHover{background-color:rgba(173,235,110,.5);border:3px dashed #60a917;}div.Disco-AttachmentUpload-DropTarget.dragHighlight.dragHover h2{color:#000;}div.Disco-AttachmentUpload-Progress{position:absolute;right:0;bottom:48px;}div.Disco-AttachmentUpload-Progress>div{background-color:#fafafa;padding:4px 8px;}div.Disco-AttachmentUpload-Progress>div i{color:#1e6dab;margin-right:4px;}div.Disco-AttachmentUpload-CommentDialog{padding:.25em .5em!important;}div.Disco-AttachmentUpload-CommentDialog table{border:solid 1px #f4f4f4;border-collapse:collapse;table-layout:fixed;}div.Disco-AttachmentUpload-CommentDialog table>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}div.Disco-AttachmentUpload-CommentDialog table>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}div.Disco-AttachmentUpload-CommentDialog table>thead>tr>th,div.Disco-AttachmentUpload-CommentDialog table>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}div.Disco-AttachmentUpload-CommentDialog table>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}div.Disco-AttachmentUpload-CommentDialog table>tfoot>tr>th,div.Disco-AttachmentUpload-CommentDialog table>tfoot>tr>td{background-color:#f4f4f4;}div.Disco-AttachmentUpload-CommentDialog table th{width:80px;}div.Disco-AttachmentUpload-CommentDialog table td.filename{font-family:Consolas,"Courier New",monospace;white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;}div.Disco-AttachmentUpload-CommentDialog table input.comments{width:calc(100% - 5px);}div.Disco-AttachmentUpload-CommentDialog table td.thumbnail{display:none;text-align:center;}div.Disco-AttachmentUpload-CommentDialog table td.thumbnail img{border:1px solid #9e9e9e;max-height:250px;max-width:374px;}div.Disco-AttachmentUpload-ImageDialog{background-color:#000!important;padding:0!important;}body>.FlagAssignment_Tooltip span.name{display:block;font-weight:600;}body>.FlagAssignment_Tooltip span.comments{display:block;padding:2px 0 2px 4px;}body>.FlagAssignment_Tooltip span.added{font-style:italic;font-size:.9em;}#Document_Generation_Container #Document_Generate{padding:0;}.d-priority-high{color:#fa6800;width:1.28571429em;text-align:center;}.d-priority-high:before{content:"";}.d-priority-normal{color:#60a917;width:1.28571429em;text-align:center;}.d-priority-normal:before{content:"";}.d-priority-low{color:#1e6dab;width:1.28571429em;text-align:center;}.d-priority-low:before{content:"";}.fa-stack .d-priority-high,.fa-stack .d-priority-normal,.fa-stack .d-priority-low{width:100%;font-size:.8em;margin-left:.5em;margin-top:.4em;opacity:.6;}.d-lime{color:#a4c400;}.d-green{color:#60a917;}.d-emerald{color:#008a00;}.d-teal{color:#00aba9;}.d-cyan{color:#1ba1e2;}.d-cobalt{color:#0050ef;}.d-indigo{color:#6a00ff;}.d-violet{color:#a0f;}.d-pink{color:#f472d0;}.d-magenta{color:#d80073;}.d-crimson{color:#a20025;}.d-red{color:#e51400;}.d-orange{color:#fa6800;}.d-amber{color:#f0a30a;}.d-yellow{color:#e3c800;}.d-brown{color:#825a2c;}.d-olive{color:#6d8764;}.d-steel{color:#647689;}.d-mauve{color:#76608a;}.d-sienna{color:#a0522d;}table.subtleHighlight{border:1px solid #ccc;background-color:#ededed;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}td.subtleHighlight{border:1px solid #ccc;background-color:#ededed;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.field-validation-error{color:#e51400!important;}.field-validation-valid{display:none;}.input-validation-error{border:1px solid #e51400!important;background-color:#fff7f7!important;}.validation-summary-errors{font-weight:bold!important;color:#e51400!important;}.validation-summary-valid{display:none;}.ajaxLoading{height:11px;width:16px;display:inline-block;background-repeat:no-repeat;background-image:url(data:image/gif;base64,R0lGODlhEAALAPQAAP///zNah+Hm7dng6O7x9DddiTNah1d3nJqtw3+Xs8fS3k5vlm6JqaGzx4KatcrU4FFymDZciHGMq+ru8t/l7Pb3+V9+oeLo7vT2+MTP3LLB0dTc5fHz9gAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCwAAACwAAAAAEAALAAAFLSAgjmRpnqSgCuLKAq5AEIM4zDVw03ve27ifDgfkEYe04kDIDC5zrtYKRa2WQgAh+QQJCwAAACwAAAAAEAALAAAFJGBhGAVgnqhpHIeRvsDawqns0qeN5+y967tYLyicBYE7EYkYAgAh+QQJCwAAACwAAAAAEAALAAAFNiAgjothLOOIJAkiGgxjpGKiKMkbz7SN6zIawJcDwIK9W/HISxGBzdHTuBNOmcJVCyoUlk7CEAAh+QQJCwAAACwAAAAAEAALAAAFNSAgjqQIRRFUAo3jNGIkSdHqPI8Tz3V55zuaDacDyIQ+YrBH+hWPzJFzOQQaeavWi7oqnVIhACH5BAkLAAAALAAAAAAQAAsAAAUyICCOZGme1rJY5kRRk7hI0mJSVUXJtF3iOl7tltsBZsNfUegjAY3I5sgFY55KqdX1GgIAIfkECQsAAAAsAAAAABAACwAABTcgII5kaZ4kcV2EqLJipmnZhWGXaOOitm2aXQ4g7P2Ct2ER4AMul00kj5g0Al8tADY2y6C+4FIIACH5BAkLAAAALAAAAAAQAAsAAAUvICCOZGme5ERRk6iy7qpyHCVStA3gNa/7txxwlwv2isSacYUc+l4tADQGQ1mvpBAAIfkECQsAAAAsAAAAABAACwAABS8gII5kaZ7kRFGTqLLuqnIcJVK0DeA1r/u3HHCXC/aKxJpxhRz6Xi0ANAZDWa+kEAA7AAAAAAAAAAAA);margin-bottom:0;}.ajaxOk{color:#60a917;}.ajaxSave{color:#1e6dab;cursor:pointer;}.ajaxRemove{color:#e51400;cursor:pointer;opacity:.8;}.ajaxRemove:hover{opacity:1;}#layout_Page div.hiddenDialog{display:none;}* html .clearfix{height:1%;overflow:visible;}*+html .clearfix{min-height:1%;}.clearfix:after{clear:both;content:".";display:block;height:0;visibility:hidden;font-size:0;}div.columnHost .column50{float:left;width:50%;}.hidden{display:none;}.success{color:#60a917;}.information{color:#1e6dab;}.warning{color:#f0a30a;}.error{color:#e51400;}.alert{color:#fa6800;}.smallText{font-size:.9em;}.smallMessage{font-style:italic;color:#666;font-size:.9em;}.nowrap{white-space:nowrap;}.code{font-family:Consolas,"Courier New",monospace;}div.code{border:1px dashed #bbb;background-color:#fff;margin:3px 6px;padding:4px;font-size:.9em;}a.smallLink{font-size:.9em;}textarea.block{width:250px;height:100px;}.checkboxBulkSelectContainer{margin-top:6px;font-size:.8em;}.checkboxBulkSelectContainer a{text-decoration:none;}.ui-widget .checkboxBulkSelectContainer{font-size:1em;}#licence{text-align:justify;}#licence p{font-size:.9em;line-height:1.6em;margin-bottom:1em;}#licence li{font-size:.9em;}#Document_Generation_Dialog{height:490px;}#Document_Generation_Dialog .handlerPicker{position:absolute;width:170px;height:390px;overflow-y:auto;background-color:#fcfcfc;border:1px solid #ccc;}#Document_Generation_Dialog .handlerPicker>div{background-color:#fff;border-bottom:1px solid #ddd;padding:6px 0 6px 6px;cursor:pointer;}#Document_Generation_Dialog .handlerPicker>div:hover{background-color:#f4f4f4;}#Document_Generation_Dialog .handlerPicker>div.selected,#Document_Generation_Dialog .handlerPicker>div.selected:hover{background-color:#eee;}#Document_Generation_Dialog .handlerPicker #Document_Generation_Dialog_Handlers_Loading{text-align:center;}#Document_Generation_Dialog .details{position:absolute;left:200px;height:390px;width:540px;overflow-y:auto;}#Document_Generation_Dialog .details #Document_Generation_Dialog_Download_Container{text-align:center;padding-top:3em;}#Document_Generation_Dialog .details #Document_Generation_Dialog_HandlerUI{display:none;}ul.list-group{background-color:#fff;border:1px solid #ddd;margin:0;padding:0;list-style:none;}ul.list-group li{padding:6px 0 6px 6px;cursor:pointer;}ul.list-group li:hover{background-color:#f4f4f4;}ul.list-group li.selected,ul.list-group li.selected:hover{background-color:#eee;}ul.list-group li:not(:first-child){border-top:1px solid #ddd;}.whitespace-pre-wrap{white-space:pre-wrap;} \ No newline at end of file diff --git a/Disco.Web/ClientSource/Style/User.css b/Disco.Web/ClientSource/Style/User.css index 40df60c3..5d033a97 100644 --- a/Disco.Web/ClientSource/Style/User.css +++ b/Disco.Web/ClientSource/Style/User.css @@ -152,6 +152,15 @@ #User_Show #User_Show_Subjects #User_Show_AssignedDevices .User_Show_AssignedDevices_CurrentAssignment div.User_Show_AssignedDevices_CurrentAssignment_Details { float: left; } +#User_Show #User_Show_Subjects #User_Show_AssignedDevices .User_Show_AssignedDevices_CurrentAssignment .User_Show_Assigned_Devices_CurrentAssignment_Flags { + font-size: 16px; +} +#User_Show #User_Show_Subjects #User_Show_AssignedDevices .User_Show_AssignedDevices_CurrentAssignment .User_Show_Assigned_Devices_CurrentAssignment_Flags > i { + cursor: default; +} +#User_Show #User_Show_Subjects #User_Show_AssignedDevices .User_Show_AssignedDevices_CurrentAssignment .User_Show_Assigned_Devices_CurrentAssignment_Flags > i > .details { + display: none; +} #User_Show #User_Show_Subjects #User_Show_Subjects_Actions > td { padding-top: 4px; } diff --git a/Disco.Web/ClientSource/Style/User.less b/Disco.Web/ClientSource/Style/User.less index 3581450c..5c12153e 100644 --- a/Disco.Web/ClientSource/Style/User.less +++ b/Disco.Web/ClientSource/Style/User.less @@ -103,6 +103,18 @@ div.User_Show_AssignedDevices_CurrentAssignment_Details { float: left; } + + .User_Show_Assigned_Devices_CurrentAssignment_Flags { + font-size: 16px; + + & > i { + cursor: default; + + & > .details { + display: none; + } + } + } } } diff --git a/Disco.Web/ClientSource/Style/User.min.css b/Disco.Web/ClientSource/Style/User.min.css index e78f1681..7b41057b 100644 --- a/Disco.Web/ClientSource/Style/User.min.css +++ b/Disco.Web/ClientSource/Style/User.min.css @@ -1 +1 @@ -.tableData{border:solid 1px #f4f4f4;border-collapse:collapse;}.tableData>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}.tableData>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}.tableData>thead>tr>th,.tableData>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}.tableData>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}.tableData>tfoot>tr>th,.tableData>tfoot>tr>td{background-color:#f4f4f4;}.tableDataDark{border:solid 1px #d8d8d8;border-collapse:collapse;}.tableDataDark td{border:solid 1px #d8d8d8;background-color:#fff;}.tableDataDark th{background-color:#eee;border:solid 1px #d8d8d8;}.tableDataContainer{background-color:#fff;}.tableDataVertical{border:solid 1px #f4f4f4;border-collapse:collapse;}.tableDataVertical>tbody>tr:nth-child(odd){background-color:#f4f4f4;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;}#layout_PageHeading #User_Show_Flags{display:inline-block;float:right;height:50px;font-size:.6em;}#layout_PageHeading #User_Show_Flags>i{cursor:default;}#layout_PageHeading #User_Show_Flags>i>.details{display:none;}#User_Show #User_Show_Subjects{table-layout:fixed;}#User_Show #User_Show_Subjects>tbody>tr>td{padding-top:0;height:100%;}#User_Show #User_Show_Subjects>tbody>tr>td>div div.status{margin-top:2px;padding-top:2px;border-top:1px dashed #ddd;}#User_Show #User_Show_Subjects>tbody>tr>td>div input.discreet{margin-left:-2px;}#User_Show #User_Show_Subjects>tbody>tr>td:not(:last-child){border-right:1px dashed #aaa;}#User_Show #User_Show_Subjects #User_Show_Details{width:330px;}#User_Show #User_Show_Subjects #User_Show_Details.hasPhoto{width:450px;}#User_Show #User_Show_Subjects #User_Show_Details #User_Show_Details_Photo_Container{float:left;padding-right:4px;}#User_Show #User_Show_Subjects #User_Show_Details #User_Show_Details_Photo{max-height:192px;width:auto;}#User_Show #User_Show_Subjects #User_Show_Details table.verticalHeadings{width:auto;}#User_Show #User_Show_Subjects #User_Show_Details table.verticalHeadings>tbody>tr>td:first-child{width:104px;font-weight:600;}#User_Show #User_Show_Subjects #User_Show_Details #User_Show_Details_Identity_Id{font-weight:600;}#User_Show #User_Show_Subjects #User_Show_Details #User_Show_GenerateDocument_Container{padding-top:4px;}#User_Show #User_Show_Subjects #User_Show_Details #User_Show_Details_Actions{margin-top:4px;}#User_Show #User_Show_Subjects #User_Show_AssignedDevices .User_Show_AssignedDevices_CurrentAssignment{border-bottom:1px dashed #ddd;padding:4px;}#User_Show #User_Show_Subjects #User_Show_AssignedDevices .User_Show_AssignedDevices_CurrentAssignment td:first-child{width:90px;font-weight:600;}#User_Show #User_Show_Subjects #User_Show_AssignedDevices .User_Show_AssignedDevices_CurrentAssignment img.User_Show_AssignedDevices_CurrentAssignment_Image{float:left;width:64px;height:64px;margin-right:6px;}#User_Show #User_Show_Subjects #User_Show_AssignedDevices .User_Show_AssignedDevices_CurrentAssignment div.User_Show_AssignedDevices_CurrentAssignment_Details{float:left;}#User_Show #User_Show_Subjects #User_Show_Subjects_Actions>td{padding-top:4px;}#UserDetailTabs{margin-top:10px;border-radius:0;background-image:none;background-color:#fff;border:0;padding:0;}#UserDetailTabs #UserDetailTabItems{border-radius:0;border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;border-bottom:0;padding:2px 0 0 4px;background-image:none;background-color:#eee;display:table;}#UserDetailTabs #UserDetailTabItems>li{top:0;border-radius:0;margin:0 5px 0 0;padding:0;line-height:normal;margin-right:4px;}#UserDetailTabs #UserDetailTabItems>li>a{padding:5px 8px;}#UserDetailTabs div.ui-tabs-panel{border-radius:0;padding:4px;border-right:1px solid #ddd;border-bottom:1px solid #ddd;border-left:1px solid #ddd;border-top:0;background-color:#eee;}#UserDetailTab-JobsContainer div.jobTable{margin:-1px;border:1px solid #ddd;}#UserDetailTab-JobsContainer .dataTables_wrapper .dataTables_filter{margin-top:-24px;-moz-opacity:1;opacity:1;}#UserDetailTab-JobsContainer .dataTables_wrapper .dataTables_length{margin-top:-24px;-moz-opacity:1;opacity:1;}#UserDetailTab-JobsContainer .dataTables_wrapper .dataTables_showStatusClosed{right:220px;margin-top:-24px;}#User_Show_Details_Actions_AddFlag_Dialog{height:400px;}#User_Show_Details_Actions_AddFlag_Dialog .flagPicker{position:absolute;width:250px;height:300px;overflow-y:auto;background-color:#fcfcfc;border:1px solid #ccc;}#User_Show_Details_Actions_AddFlag_Dialog .flagPicker>div{background-color:#fff;border-bottom:1px solid #ddd;padding:6px 0 6px 6px;cursor:pointer;}#User_Show_Details_Actions_AddFlag_Dialog .flagPicker>div:hover{background-color:#f4f4f4;}#User_Show_Details_Actions_AddFlag_Dialog .flagPicker>div.selected,#User_Show_Details_Actions_AddFlag_Dialog .flagPicker>div.selected:hover{background-color:#eee;}#User_Show_Details_Actions_AddFlag_Dialog .details{display:none;position:absolute;left:280px;top:1em;}#User_Show_Details_Actions_AddFlag_Dialog .details h4{margin-bottom:4px;}#User_Show_Details_Actions_AddFlag_Dialog .details textarea{min-width:280px;height:200px;}#UserDetailTab-Flags #userFlags{border:solid 1px #d8d8d8;border-collapse:collapse;table-layout:fixed;}#UserDetailTab-Flags #userFlags td{border:solid 1px #d8d8d8;background-color:#fff;}#UserDetailTab-Flags #userFlags th{background-color:#eee;border:solid 1px #d8d8d8;}#UserDetailTab-Flags #userFlags i.fa-edit{position:absolute;top:0;right:0;margin-top:4px;font-size:1.1em;cursor:pointer;display:none;color:#335a87;}#UserDetailTab-Flags #userFlags i.fa-edit:hover{color:#5e8cc2;}#UserDetailTab-Flags #userFlags td:hover i.fa-edit{display:inline-block;}#UserDetailTab-Flags #userFlags th.name{width:200px;}#UserDetailTab-Flags #userFlags tr.removed td{background-color:#f4f4f4;}#UserDetailTab-Flags #userFlags td.name{vertical-align:middle;}#UserDetailTab-Flags #userFlags td.name .fa-stack{line-height:1.6em;}#UserDetailTab-Flags #userFlags td.added,#UserDetailTab-Flags #userFlags td.removed{vertical-align:middle;}#UserDetailTab-Flags #userFlags td.added .expressionResult,#UserDetailTab-Flags #userFlags td.removed .expressionResult{margin-top:4px;font-style:italic;}#UserDetailTab-Flags #userFlags td.comments{vertical-align:middle;}#UserDetailTab-Flags #userFlags td.comments .editable{position:relative;}#UserDetailTab-Flags #userFlags td.comments .commentsRaw{display:none;}#UserDetailTab-Flags #userFlags td.removed.na{vertical-align:middle;text-align:center;}#UserDetailTab-Flags>.none{text-align:center;padding:30px 0;font-style:italic;background-color:#fff;}#User_Show_Flags_Actions_EditComments_Dialog h4{margin-bottom:4px;}#User_Show_Flags_Actions_EditComments_Dialog_Comments{width:280px;}#UserDetailTab-Authorization #UserDetailTab-AuthorizationContainer{background-color:#fff;border:1px solid #ccc;}#UserDetailTab-Authorization #UserDetailTab-Authorization_ClaimsTree_Container{width:50%;float:left;padding:6px 10px 6px 4px;}#UserDetailTab-Authorization #UserDetailTab-Authorization_ClaimsTree_Container>span.smallMessage:last-child{display:block;text-align:right;}#UserDetailTab-Authorization #UserDetailTab-Authorization_Membership{width:40%;float:right;padding:6px 10px;border-left:1px dashed #ccc;border-bottom:1px dashed #ccc;}#UserDetailTab-Authorization #UserDetailTab-Authorization_Membership #UserDetailTab-Authorization_Membership_Roles{margin-bottom:10px;}#UserDetailTab-Authorization #UserDetailTab-Authorization_Membership #UserDetailTab-Authorization_Membership_Groups_Container>span.smallMessage:last-child{display:block;text-align:right;}#UserDetailTab-Authorization #UserDetailTab-Authorization_NoAccess{width:50%;float:left;padding:6px 10px;}#UserDetailTab-Authorization #UserDetailTab-Authorization_NoAccess h3{margin-bottom:10px;}#userShowResources #AttachmentsContainer{padding:0;}#userShowResources #Attachments{position:relative;border:1px solid #ccc;background-color:#fff;}#userShowResources #Attachments div.attachmentOutput{position:relative;height:115px;overflow:auto;}#userShowResources #Attachments div.attachmentOutput>a{display:block;float:left;height:48px;width:221px;padding:2px;margin:2px;font-size:.9em;border:1px solid #fff;color:#000;text-decoration:none;}#userShowResources #Attachments div.attachmentOutput>a span.comments,#userShowResources #Attachments div.attachmentOutput>a span.author,#userShowResources #Attachments div.attachmentOutput>a span.timestamp{display:block;float:left;width:168px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;height:16px;}#userShowResources #Attachments div.attachmentOutput>a span.author{color:#888;width:150px;}#userShowResources #Attachments div.attachmentOutput>a span.timestamp{color:#888;font-style:italic;}#userShowResources #Attachments div.attachmentOutput>a span.icon{display:block;float:left;height:48px;width:48px;margin-right:2px;}#userShowResources #Attachments div.attachmentOutput>a span.icon img{height:48px;width:48px;}#userShowResources #Attachments div.attachmentOutput>a span.icon img.loading{display:none;}#userShowResources #Attachments div.attachmentOutput>a:hover{background-color:#ededed;border:1px solid #ccc;}#userShowResources #Attachments div.attachmentOutput>a:hover span.remove{opacity:.5;}#userShowResources #Attachments div.attachmentOutput>a span.remove{font-size:1.4em;color:#e51400;margin-left:6px;cursor:pointer;opacity:0;}#userShowResources #Attachments div.attachmentOutput>a span.remove:hover{opacity:1;}#userShowResources #Attachments.cannotAddAttachments div.attachmentOutput{height:162px;}#userShowResources #Attachments div.attachmentInput{border-top:1px solid #ccc;height:40px;background-color:#fff;padding:3px;}#userShowResources #Attachments div.attachmentInput span.action{color:#333;display:block;margin:0 4px 0 0;font-size:1.5em;cursor:pointer;float:right;border:1px solid #fff;padding:.5em;}#userShowResources #Attachments div.attachmentInput span.action:hover{color:#335a87;background-color:#ededed;border:1px solid #ccc;}#userShowResources #Attachments div.attachmentInput span.action.disabled{color:rgba(51,51,51,.2);cursor:default;}#userShowResources #Attachments div.attachmentInput span.action.disabled:hover{color:rgba(51,51,51,.2);background-color:inherit;border:1px solid #fff;}#User_Show_Details_Actions_CreateJob_Dialog #CreateJob_Assignments{margin-top:6px;background-color:#fff;line-height:1.3;border:1px solid #ddd;max-height:300px;overflow-y:auto;}#User_Show_Details_Actions_CreateJob_Dialog #CreateJob_Assignments li.CreateJob_Assignment{display:block;padding:4px;cursor:pointer;}#User_Show_Details_Actions_CreateJob_Dialog #CreateJob_Assignments li.CreateJob_Assignment:not(:last-child){border-bottom:1px dashed #ddd;}#User_Show_Details_Actions_CreateJob_Dialog #CreateJob_Assignments li.CreateJob_Assignment:hover{background-color:#f4f4f4;}#User_Show_Details_Actions_CreateJob_Dialog #CreateJob_Assignments li.CreateJob_Assignment tr:first-child td{width:68px;}#User_Show_Details_Actions_CreateJob_Dialog #CreateJob_Assignments li.CreateJob_Assignment td:first-child{width:90px;font-weight:600;}#User_Show_Details_Actions_CreateJob_Dialog #CreateJob_Assignments li.CreateJob_Assignment img.CreateJob_Assignment_Image{width:64px;height:64px;} \ No newline at end of file +.tableData{border:solid 1px #f4f4f4;border-collapse:collapse;}.tableData>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff;}.tableData>tbody>tr:nth-child(odd)>td{background-color:hsl(0,0%,98.5%);}.tableData>thead>tr>th,.tableData>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4;}.tableData>tbody>tr:hover>td{background-color:hsl(0,0%,97.5%);}.tableData>tfoot>tr>th,.tableData>tfoot>tr>td{background-color:#f4f4f4;}.tableDataDark{border:solid 1px #d8d8d8;border-collapse:collapse;}.tableDataDark td{border:solid 1px #d8d8d8;background-color:#fff;}.tableDataDark th{background-color:#eee;border:solid 1px #d8d8d8;}.tableDataContainer{background-color:#fff;}.tableDataVertical{border:solid 1px #f4f4f4;border-collapse:collapse;}.tableDataVertical>tbody>tr:nth-child(odd){background-color:#f4f4f4;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;}#layout_PageHeading #User_Show_Flags{display:inline-block;float:right;height:50px;font-size:.6em;}#layout_PageHeading #User_Show_Flags>i{cursor:default;}#layout_PageHeading #User_Show_Flags>i>.details{display:none;}#User_Show #User_Show_Subjects{table-layout:fixed;}#User_Show #User_Show_Subjects>tbody>tr>td{padding-top:0;height:100%;}#User_Show #User_Show_Subjects>tbody>tr>td>div div.status{margin-top:2px;padding-top:2px;border-top:1px dashed #ddd;}#User_Show #User_Show_Subjects>tbody>tr>td>div input.discreet{margin-left:-2px;}#User_Show #User_Show_Subjects>tbody>tr>td:not(:last-child){border-right:1px dashed #aaa;}#User_Show #User_Show_Subjects #User_Show_Details{width:330px;}#User_Show #User_Show_Subjects #User_Show_Details.hasPhoto{width:450px;}#User_Show #User_Show_Subjects #User_Show_Details #User_Show_Details_Photo_Container{float:left;padding-right:4px;}#User_Show #User_Show_Subjects #User_Show_Details #User_Show_Details_Photo{max-height:192px;width:auto;}#User_Show #User_Show_Subjects #User_Show_Details table.verticalHeadings{width:auto;}#User_Show #User_Show_Subjects #User_Show_Details table.verticalHeadings>tbody>tr>td:first-child{width:104px;font-weight:600;}#User_Show #User_Show_Subjects #User_Show_Details #User_Show_Details_Identity_Id{font-weight:600;}#User_Show #User_Show_Subjects #User_Show_Details #User_Show_GenerateDocument_Container{padding-top:4px;}#User_Show #User_Show_Subjects #User_Show_Details #User_Show_Details_Actions{margin-top:4px;}#User_Show #User_Show_Subjects #User_Show_AssignedDevices .User_Show_AssignedDevices_CurrentAssignment{border-bottom:1px dashed #ddd;padding:4px;}#User_Show #User_Show_Subjects #User_Show_AssignedDevices .User_Show_AssignedDevices_CurrentAssignment td:first-child{width:90px;font-weight:600;}#User_Show #User_Show_Subjects #User_Show_AssignedDevices .User_Show_AssignedDevices_CurrentAssignment img.User_Show_AssignedDevices_CurrentAssignment_Image{float:left;width:64px;height:64px;margin-right:6px;}#User_Show #User_Show_Subjects #User_Show_AssignedDevices .User_Show_AssignedDevices_CurrentAssignment div.User_Show_AssignedDevices_CurrentAssignment_Details{float:left;}#User_Show #User_Show_Subjects #User_Show_AssignedDevices .User_Show_AssignedDevices_CurrentAssignment .User_Show_Assigned_Devices_CurrentAssignment_Flags{font-size:16px;}#User_Show #User_Show_Subjects #User_Show_AssignedDevices .User_Show_AssignedDevices_CurrentAssignment .User_Show_Assigned_Devices_CurrentAssignment_Flags>i{cursor:default;}#User_Show #User_Show_Subjects #User_Show_AssignedDevices .User_Show_AssignedDevices_CurrentAssignment .User_Show_Assigned_Devices_CurrentAssignment_Flags>i>.details{display:none;}#User_Show #User_Show_Subjects #User_Show_Subjects_Actions>td{padding-top:4px;}#UserDetailTabs{margin-top:10px;border-radius:0;background-image:none;background-color:#fff;border:0;padding:0;}#UserDetailTabs #UserDetailTabItems{border-radius:0;border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;border-bottom:0;padding:2px 0 0 4px;background-image:none;background-color:#eee;display:table;}#UserDetailTabs #UserDetailTabItems>li{top:0;border-radius:0;margin:0 5px 0 0;padding:0;line-height:normal;margin-right:4px;}#UserDetailTabs #UserDetailTabItems>li>a{padding:5px 8px;}#UserDetailTabs div.ui-tabs-panel{border-radius:0;padding:4px;border-right:1px solid #ddd;border-bottom:1px solid #ddd;border-left:1px solid #ddd;border-top:0;background-color:#eee;}#UserDetailTab-JobsContainer div.jobTable{margin:-1px;border:1px solid #ddd;}#UserDetailTab-JobsContainer .dataTables_wrapper .dataTables_filter{margin-top:-24px;-moz-opacity:1;opacity:1;}#UserDetailTab-JobsContainer .dataTables_wrapper .dataTables_length{margin-top:-24px;-moz-opacity:1;opacity:1;}#UserDetailTab-JobsContainer .dataTables_wrapper .dataTables_showStatusClosed{right:220px;margin-top:-24px;}#User_Show_Details_Actions_AddFlag_Dialog{height:400px;}#User_Show_Details_Actions_AddFlag_Dialog .flagPicker{position:absolute;width:250px;height:300px;overflow-y:auto;background-color:#fcfcfc;border:1px solid #ccc;}#User_Show_Details_Actions_AddFlag_Dialog .flagPicker>div{background-color:#fff;border-bottom:1px solid #ddd;padding:6px 0 6px 6px;cursor:pointer;}#User_Show_Details_Actions_AddFlag_Dialog .flagPicker>div:hover{background-color:#f4f4f4;}#User_Show_Details_Actions_AddFlag_Dialog .flagPicker>div.selected,#User_Show_Details_Actions_AddFlag_Dialog .flagPicker>div.selected:hover{background-color:#eee;}#User_Show_Details_Actions_AddFlag_Dialog .details{display:none;position:absolute;left:280px;top:1em;}#User_Show_Details_Actions_AddFlag_Dialog .details h4{margin-bottom:4px;}#User_Show_Details_Actions_AddFlag_Dialog .details textarea{min-width:280px;height:200px;}#UserDetailTab-Flags #userFlags{border:solid 1px #d8d8d8;border-collapse:collapse;table-layout:fixed;}#UserDetailTab-Flags #userFlags td{border:solid 1px #d8d8d8;background-color:#fff;}#UserDetailTab-Flags #userFlags th{background-color:#eee;border:solid 1px #d8d8d8;}#UserDetailTab-Flags #userFlags i.fa-edit{position:absolute;top:0;right:0;margin-top:4px;font-size:1.1em;cursor:pointer;display:none;color:#335a87;}#UserDetailTab-Flags #userFlags i.fa-edit:hover{color:#5e8cc2;}#UserDetailTab-Flags #userFlags td:hover i.fa-edit{display:inline-block;}#UserDetailTab-Flags #userFlags th.name{width:200px;}#UserDetailTab-Flags #userFlags tr.removed td{background-color:#f4f4f4;}#UserDetailTab-Flags #userFlags td.name{vertical-align:middle;}#UserDetailTab-Flags #userFlags td.name .fa-stack{line-height:1.6em;}#UserDetailTab-Flags #userFlags td.added,#UserDetailTab-Flags #userFlags td.removed{vertical-align:middle;}#UserDetailTab-Flags #userFlags td.added .expressionResult,#UserDetailTab-Flags #userFlags td.removed .expressionResult{margin-top:4px;font-style:italic;}#UserDetailTab-Flags #userFlags td.comments{vertical-align:middle;}#UserDetailTab-Flags #userFlags td.comments .editable{position:relative;}#UserDetailTab-Flags #userFlags td.comments .commentsRaw{display:none;}#UserDetailTab-Flags #userFlags td.removed.na{vertical-align:middle;text-align:center;}#UserDetailTab-Flags>.none{text-align:center;padding:30px 0;font-style:italic;background-color:#fff;}#User_Show_Flags_Actions_EditComments_Dialog h4{margin-bottom:4px;}#User_Show_Flags_Actions_EditComments_Dialog_Comments{width:280px;}#UserDetailTab-Authorization #UserDetailTab-AuthorizationContainer{background-color:#fff;border:1px solid #ccc;}#UserDetailTab-Authorization #UserDetailTab-Authorization_ClaimsTree_Container{width:50%;float:left;padding:6px 10px 6px 4px;}#UserDetailTab-Authorization #UserDetailTab-Authorization_ClaimsTree_Container>span.smallMessage:last-child{display:block;text-align:right;}#UserDetailTab-Authorization #UserDetailTab-Authorization_Membership{width:40%;float:right;padding:6px 10px;border-left:1px dashed #ccc;border-bottom:1px dashed #ccc;}#UserDetailTab-Authorization #UserDetailTab-Authorization_Membership #UserDetailTab-Authorization_Membership_Roles{margin-bottom:10px;}#UserDetailTab-Authorization #UserDetailTab-Authorization_Membership #UserDetailTab-Authorization_Membership_Groups_Container>span.smallMessage:last-child{display:block;text-align:right;}#UserDetailTab-Authorization #UserDetailTab-Authorization_NoAccess{width:50%;float:left;padding:6px 10px;}#UserDetailTab-Authorization #UserDetailTab-Authorization_NoAccess h3{margin-bottom:10px;}#userShowResources #AttachmentsContainer{padding:0;}#userShowResources #Attachments{position:relative;border:1px solid #ccc;background-color:#fff;}#userShowResources #Attachments div.attachmentOutput{position:relative;height:115px;overflow:auto;}#userShowResources #Attachments div.attachmentOutput>a{display:block;float:left;height:48px;width:221px;padding:2px;margin:2px;font-size:.9em;border:1px solid #fff;color:#000;text-decoration:none;}#userShowResources #Attachments div.attachmentOutput>a span.comments,#userShowResources #Attachments div.attachmentOutput>a span.author,#userShowResources #Attachments div.attachmentOutput>a span.timestamp{display:block;float:left;width:168px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;height:16px;}#userShowResources #Attachments div.attachmentOutput>a span.author{color:#888;width:150px;}#userShowResources #Attachments div.attachmentOutput>a span.timestamp{color:#888;font-style:italic;}#userShowResources #Attachments div.attachmentOutput>a span.icon{display:block;float:left;height:48px;width:48px;margin-right:2px;}#userShowResources #Attachments div.attachmentOutput>a span.icon img{height:48px;width:48px;}#userShowResources #Attachments div.attachmentOutput>a span.icon img.loading{display:none;}#userShowResources #Attachments div.attachmentOutput>a:hover{background-color:#ededed;border:1px solid #ccc;}#userShowResources #Attachments div.attachmentOutput>a:hover span.remove{opacity:.5;}#userShowResources #Attachments div.attachmentOutput>a span.remove{font-size:1.4em;color:#e51400;margin-left:6px;cursor:pointer;opacity:0;}#userShowResources #Attachments div.attachmentOutput>a span.remove:hover{opacity:1;}#userShowResources #Attachments.cannotAddAttachments div.attachmentOutput{height:162px;}#userShowResources #Attachments div.attachmentInput{border-top:1px solid #ccc;height:40px;background-color:#fff;padding:3px;}#userShowResources #Attachments div.attachmentInput span.action{color:#333;display:block;margin:0 4px 0 0;font-size:1.5em;cursor:pointer;float:right;border:1px solid #fff;padding:.5em;}#userShowResources #Attachments div.attachmentInput span.action:hover{color:#335a87;background-color:#ededed;border:1px solid #ccc;}#userShowResources #Attachments div.attachmentInput span.action.disabled{color:rgba(51,51,51,.2);cursor:default;}#userShowResources #Attachments div.attachmentInput span.action.disabled:hover{color:rgba(51,51,51,.2);background-color:inherit;border:1px solid #fff;}#User_Show_Details_Actions_CreateJob_Dialog #CreateJob_Assignments{margin-top:6px;background-color:#fff;line-height:1.3;border:1px solid #ddd;max-height:300px;overflow-y:auto;}#User_Show_Details_Actions_CreateJob_Dialog #CreateJob_Assignments li.CreateJob_Assignment{display:block;padding:4px;cursor:pointer;}#User_Show_Details_Actions_CreateJob_Dialog #CreateJob_Assignments li.CreateJob_Assignment:not(:last-child){border-bottom:1px dashed #ddd;}#User_Show_Details_Actions_CreateJob_Dialog #CreateJob_Assignments li.CreateJob_Assignment:hover{background-color:#f4f4f4;}#User_Show_Details_Actions_CreateJob_Dialog #CreateJob_Assignments li.CreateJob_Assignment tr:first-child td{width:68px;}#User_Show_Details_Actions_CreateJob_Dialog #CreateJob_Assignments li.CreateJob_Assignment td:first-child{width:90px;font-weight:600;}#User_Show_Details_Actions_CreateJob_Dialog #CreateJob_Assignments li.CreateJob_Assignment img.CreateJob_Assignment_Image{width:64px;height:64px;} \ No newline at end of file diff --git a/Disco.Web/Controllers/DeviceController.cs b/Disco.Web/Controllers/DeviceController.cs index 4e402820..886b6ac9 100644 --- a/Disco.Web/Controllers/DeviceController.cs +++ b/Disco.Web/Controllers/DeviceController.cs @@ -4,6 +4,7 @@ using Disco.Models.Services.Jobs.JobLists; using Disco.Models.UI.Device; using Disco.Services; using Disco.Services.Authorization; +using Disco.Services.Devices.DeviceFlags; using Disco.Services.Exporting; using Disco.Services.Interop.ActiveDirectory; using Disco.Services.Plugins.Features.DetailsProvider; @@ -12,6 +13,7 @@ using Disco.Services.Users; using Disco.Services.Web; using System; using System.Collections.Generic; +using System.Data.Entity; using System.Linq; using System.Web; using System.Web.Mvc; @@ -226,16 +228,18 @@ namespace Disco.Web.Controllers Database.Configuration.LazyLoadingEnabled = true; m.Device = Database.Devices - .Include("DeviceModel") - .Include("DeviceProfile") - .Include("DeviceBatch") - .Include("DeviceDetails") - .Include("DeviceUserAssignments.AssignedUser.UserFlagAssignments") - .Include("AssignedUser.UserFlagAssignments") - .Include("AssignedUser.UserDetails") - .Include("DeviceCertificates") - .Include("DeviceAttachments.TechUser") - .Include("DeviceAttachments.DocumentTemplate") + .Include(d => d.DeviceModel) + .Include(d => d.DeviceProfile) + .Include(d => d.DeviceBatch) + .Include(d => d.DeviceDetails) + .Include(d => d.DeviceUserAssignments.Select(a => a.AssignedUser.UserFlagAssignments)) + .Include(d => d.AssignedUser.UserFlagAssignments) + .Include(d => d.AssignedUser.UserDetails) + .Include(d => d.DeviceCertificates) + .Include(d => d.DeviceAttachments.Select(a => a.TechUser)) + .Include(d => d.DeviceAttachments.Select(a => a.DocumentTemplate)) + .Include(d => d.DeviceFlagAssignments.Select(a => a.AddedUser)) + .Include(d => d.DeviceFlagAssignments.Select(a => a.RemovedUser)) .FirstOrDefault(d => d.SerialNumber == id); if (m.Device == null) @@ -310,6 +314,16 @@ namespace Disco.Web.Controllers m.DeviceProfileWirelessProfileProviders = m.Device.DeviceProfile.GetWirelessProfileProviders().ToList(); } + if (Authorization.Has(Claims.Device.ShowFlagAssignments)) + { + var usedFlags = m.Device.DeviceFlagAssignments + .Where(a => !a.RemovedDate.HasValue) + .Select(a => a.DeviceFlagId) + .Distinct().ToList(); + + m.AvailableDeviceFlags = DeviceFlagService.GetDeviceFlags().Where(f => !usedFlags.Contains(f.Id)).ToList(); + } + if (Authorization.Has(Claims.User.ShowDetails)) { // Populate Custom Details diff --git a/Disco.Web/Controllers/JobController.cs b/Disco.Web/Controllers/JobController.cs index f2bd827e..3f070db1 100644 --- a/Disco.Web/Controllers/JobController.cs +++ b/Disco.Web/Controllers/JobController.cs @@ -18,6 +18,7 @@ using Disco.Services.Web; using Newtonsoft.Json; using System; using System.Collections.Generic; +using System.Data.Entity; using System.Linq; using System.Web.Mvc; @@ -298,21 +299,23 @@ namespace Disco.Web.Controllers var m = new Models.Job.ShowModel(); m.Job = Database.Jobs - .Include("Device.DeviceModel") - .Include("Device.DeviceBatch") - .Include("Device.DeviceDetails") - .Include("DeviceHeldTechUser") - .Include("DeviceReadyForReturnTechUser") - .Include("DeviceReturnedTechUser") - .Include("OpenedTechUser") - .Include("ClosedTechUser") - .Include("JobType") - .Include("JobSubTypes") - .Include("User.UserFlagAssignments") - .Include("User.UserDetails") - .Include("JobLogs.TechUser") - .Include("JobAttachments.TechUser") - .Include("JobAttachments.DocumentTemplate") + .Include(j => j.Device.DeviceModel) + .Include(j => j.Device.DeviceBatch) + .Include(j => j.Device.DeviceProfile) + .Include(j => j.Device.DeviceDetails) + .Include(j => j.Device.DeviceFlagAssignments) + .Include(j => j.DeviceHeldTechUser) + .Include(j => j.DeviceReadyForReturnTechUser) + .Include(j => j.DeviceReturnedTechUser) + .Include(j => j.OpenedTechUser) + .Include(j => j.ClosedTechUser) + .Include(j => j.JobType) + .Include(j => j.JobSubTypes) + .Include(j => j.User.UserFlagAssignments) + .Include(j => j.User.UserDetails) + .Include(j => j.JobLogs.Select(l => l.TechUser)) + .Include(j => j.JobAttachments.Select(a => a.TechUser)) + .Include(j => j.JobAttachments.Select(a => a.DocumentTemplate)) .FirstOrDefault(j => j.Id == id.Value); if (m.Job == null) diff --git a/Disco.Web/Controllers/SearchController.cs b/Disco.Web/Controllers/SearchController.cs index a33f8da3..d5127870 100644 --- a/Disco.Web/Controllers/SearchController.cs +++ b/Disco.Web/Controllers/SearchController.cs @@ -83,7 +83,7 @@ namespace Disco.Web.Controllers var vm = Database.DeviceModels.Find(deviceModelId); if (vm != null) { - m.FriendlyTerm = string.Format("Device Model: {0}", vm.ToString()); + m.FriendlyTerm = $"Device Model: {vm.ToString()}"; m.Devices = Services.Searching.Search.SearchDeviceModel(Database, vm.Id); break; } @@ -100,7 +100,7 @@ namespace Disco.Web.Controllers var dp = Database.DeviceProfiles.Find(deviceProfileId); if (dp != null) { - m.FriendlyTerm = string.Format("Device Profile: {0}", dp.ToString()); + m.FriendlyTerm = $"Device Profile: {dp.ToString()}"; m.Devices = Services.Searching.Search.SearchDeviceProfile(Database, dp.Id); break; } @@ -117,7 +117,7 @@ namespace Disco.Web.Controllers var db = Database.DeviceBatches.Find(deviceBatchId); if (db != null) { - m.FriendlyTerm = string.Format("Device Batch: {0}", db.ToString()); + m.FriendlyTerm = $"Device Batch: {db.ToString()}"; m.Devices = Services.Searching.Search.SearchDeviceBatch(Database, db.Id); break; } @@ -233,10 +233,10 @@ namespace Disco.Web.Controllers } case "userflag": Authorization.RequireAll(Claims.User.Search, Claims.User.ShowFlagAssignments); - int flagId; - if (int.TryParse(term, out flagId)) + int userFlagId; + if (int.TryParse(term, out userFlagId)) { - var flag = Database.UserFlags.Find(flagId); + var flag = Database.UserFlags.Find(userFlagId); if (flag != null) { m.FriendlyTerm = string.Format("User Flag: {0}", flag.ToString()); @@ -244,10 +244,27 @@ namespace Disco.Web.Controllers break; } } - m.FriendlyTerm = string.Format("User Flag: {0}", term); + m.FriendlyTerm = $"User Flag: {term}"; m.Success = false; m.ErrorMessage = "Invalid User Flag Id"; break; + case "deviceflag": + Authorization.RequireAll(Claims.Device.Search, Claims.Device.ShowFlagAssignments); + int deviceFlagId; + if (int.TryParse(term, out deviceFlagId)) + { + var flag = Database.DeviceFlags.Find(deviceFlagId); + if (flag != null) + { + m.FriendlyTerm = string.Format("Device Flag: {0}", flag.ToString()); + m.Devices = Services.Searching.Search.SearchDeviceFlag(Database, flag.Id); + break; + } + } + m.FriendlyTerm = $"Device Flag: {term}"; + m.Success = false; + m.ErrorMessage = "Invalid Device Flag Id"; + break; } } diff --git a/Disco.Web/Controllers/UserController.cs b/Disco.Web/Controllers/UserController.cs index 44d6b7ac..c1f56475 100644 --- a/Disco.Web/Controllers/UserController.cs +++ b/Disco.Web/Controllers/UserController.cs @@ -10,6 +10,7 @@ using Disco.Services.Users; using Disco.Services.Users.UserFlags; using Disco.Services.Web; using System; +using System.Data.Entity; using System.Linq; using System.Web.Mvc; @@ -54,15 +55,15 @@ namespace Disco.Web.Controllers } m.User = Database.Users - .Include("DeviceUserAssignments.Device.DeviceModel") - .Include("DeviceUserAssignments.Device.DeviceProfile") - .Include("DeviceUserAssignments.Device.DeviceBatch") - .Include("DeviceUserAssignments.Device.DeviceDetails") - .Include("UserAttachments.TechUser") - .Include("UserAttachments.DocumentTemplate") - .Include("UserFlagAssignments.AddedUser") - .Include("UserFlagAssignments.RemovedUser") - .Include("UserDetails") + .Include(u => u.DeviceUserAssignments.Select(dua => dua.Device.DeviceModel)) + .Include(u => u.DeviceUserAssignments.Select(dua => dua.Device.DeviceProfile)) + .Include(u => u.DeviceUserAssignments.Select(dua => dua.Device.DeviceBatch)) + .Include(u => u.DeviceUserAssignments.Select(dua => dua.Device.DeviceDetails)) + .Include(u => u.UserAttachments.Select(ua => ua.TechUser)) + .Include(u => u.UserAttachments.Select(ua => ua.DocumentTemplate)) + .Include(u => u.UserFlagAssignments.Select(ufa => ufa.AddedUser)) + .Include(u => u.UserFlagAssignments.Select(ufa => ufa.RemovedUser)) + .Include(u => u.UserDetails) .FirstOrDefault(um => um.UserId == id); if (m.User == null) @@ -79,7 +80,7 @@ namespace Disco.Web.Controllers HideClosedJobs = true, EnablePaging = false }; - m.Jobs.Fill(Database, Disco.Services.Searching.Search.BuildJobTableModel(Database).Where(j => j.UserId == id).OrderByDescending(j => j.Id), true); + m.Jobs.Fill(Database, Services.Searching.Search.BuildJobTableModel(Database).Where(j => j.UserId == id).OrderByDescending(j => j.Id), true); } if (Authorization.Has(Claims.User.ShowFlagAssignments)) diff --git a/Disco.Web/Disco.Web.csproj b/Disco.Web/Disco.Web.csproj index 1ae08c92..11e08244 100644 --- a/Disco.Web/Disco.Web.csproj +++ b/Disco.Web/Disco.Web.csproj @@ -207,7 +207,9 @@ + + @@ -222,6 +224,7 @@ + @@ -234,6 +237,10 @@ + + + + @@ -344,6 +351,26 @@ True _DeviceGroupDocumentBulkGenerate.cshtml + + Create.cshtml + True + True + + + Export.cshtml + True + True + + + Index.cshtml + True + True + + + Show.cshtml + True + True + Create.cshtml True @@ -642,9 +669,18 @@ True True + + T4MVC.tt + + + T4MVC.tt + T4MVC.tt + + T4MVC.tt + T4MVC.tt @@ -800,6 +836,11 @@ T4MVC.tt + + _Flags.cshtml + True + True + ImportHeaders.cshtml True @@ -1298,6 +1339,22 @@ RazorGenerator _DeviceGroupDocumentBulkGenerate.generated.cs + + RazorGenerator + Create.generated.cs + + + RazorGenerator + Export.generated.cs + + + RazorGenerator + Index.generated.cs + + + RazorGenerator + Show.generated.cs + RazorGenerator Create.generated.cs @@ -1884,6 +1941,10 @@ RazorGenerator AddOffline.generated.cs + + RazorGenerator + _Flags.generated.cs + RazorGenerator ImportHeaders.generated.cs diff --git a/Disco.Web/Extensions/T4MVC/API.DeviceFlagAssignmentController.generated.cs b/Disco.Web/Extensions/T4MVC/API.DeviceFlagAssignmentController.generated.cs new file mode 100644 index 00000000..aacaf59f --- /dev/null +++ b/Disco.Web/Extensions/T4MVC/API.DeviceFlagAssignmentController.generated.cs @@ -0,0 +1,235 @@ +// +// This file was generated by a T4 template. +// Don't change it directly as your change would get overwritten. Instead, make changes +// to the .tt file (i.e. the T4 template) and save it to regenerate this file. + +// Make sure the compiler doesn't complain about missing Xml comments and CLS compliance +// 0108: suppress "Foo hides inherited member Foo. Use the new keyword if hiding was intended." when a controller and its abstract parent are both processed +// 0114: suppress "Foo.BarController.Baz()' hides inherited member 'Qux.BarController.Baz()'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword." when an action (with an argument) overrides an action in a parent controller +#pragma warning disable 1591, 3008, 3009, 0108, 0114 +#region T4MVC + +using System; +using System.Diagnostics; +using System.CodeDom.Compiler; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using System.Web; +using System.Web.Hosting; +using System.Web.Mvc; +using System.Web.Mvc.Ajax; +using System.Web.Mvc.Html; +using System.Web.Routing; +using T4MVC; +namespace Disco.Web.Areas.API.Controllers +{ + public partial class DeviceFlagAssignmentController + { + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public DeviceFlagAssignmentController() { } + + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + protected DeviceFlagAssignmentController(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 RedirectToAction(Task taskResult) + { + return RedirectToAction(taskResult.Result); + } + + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + protected RedirectToRouteResult RedirectToActionPermanent(ActionResult result) + { + var callInfo = result.GetT4MVCResult(); + return RedirectToRoutePermanent(callInfo.RouteValueDictionary); + } + + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + protected RedirectToRouteResult RedirectToActionPermanent(Task taskResult) + { + return RedirectToActionPermanent(taskResult.Result); + } + + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult Update() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Update); + } + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult UpdateComments() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateComments); + } + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult AddDevice() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.AddDevice); + } + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult RemoveDevice() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.RemoveDevice); + } + + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public DeviceFlagAssignmentController Actions { get { return MVC.API.DeviceFlagAssignment; } } + [GeneratedCode("T4MVC", "2.0")] + public readonly string Area = "API"; + [GeneratedCode("T4MVC", "2.0")] + public readonly string Name = "DeviceFlagAssignment"; + [GeneratedCode("T4MVC", "2.0")] + public const string NameConst = "DeviceFlagAssignment"; + [GeneratedCode("T4MVC", "2.0")] + 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 Update = "Update"; + public readonly string UpdateComments = "UpdateComments"; + public readonly string AddDevice = "AddDevice"; + public readonly string RemoveDevice = "RemoveDevice"; + } + + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionNameConstants + { + public const string Update = "Update"; + public const string UpdateComments = "UpdateComments"; + public const string AddDevice = "AddDevice"; + public const string RemoveDevice = "RemoveDevice"; + } + + + 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 id = "id"; + public readonly string key = "key"; + public readonly string value = "value"; + public readonly string redirect = "redirect"; + } + static readonly ActionParamsClass_UpdateComments s_params_UpdateComments = new ActionParamsClass_UpdateComments(); + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public ActionParamsClass_UpdateComments UpdateCommentsParams { get { return s_params_UpdateComments; } } + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionParamsClass_UpdateComments + { + public readonly string id = "id"; + public readonly string Comments = "Comments"; + public readonly string redirect = "redirect"; + } + static readonly ActionParamsClass_AddDevice s_params_AddDevice = new ActionParamsClass_AddDevice(); + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public ActionParamsClass_AddDevice AddDeviceParams { get { return s_params_AddDevice; } } + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionParamsClass_AddDevice + { + public readonly string id = "id"; + public readonly string DeviceSerialNumber = "DeviceSerialNumber"; + public readonly string Comments = "Comments"; + } + static readonly ActionParamsClass_RemoveDevice s_params_RemoveDevice = new ActionParamsClass_RemoveDevice(); + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public ActionParamsClass_RemoveDevice RemoveDeviceParams { get { return s_params_RemoveDevice; } } + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionParamsClass_RemoveDevice + { + public readonly string id = "id"; + } + 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 partial class T4MVC_DeviceFlagAssignmentController : Disco.Web.Areas.API.Controllers.DeviceFlagAssignmentController + { + public T4MVC_DeviceFlagAssignmentController() : base(Dummy.Instance) { } + + [NonAction] + partial void UpdateOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, string key, string value, bool? redirect); + + [NonAction] + public override System.Web.Mvc.ActionResult Update(int id, string key, string value, bool? redirect) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Update); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "key", key); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "value", value); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "redirect", redirect); + UpdateOverride(callInfo, id, key, value, redirect); + return callInfo; + } + + [NonAction] + partial void UpdateCommentsOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, string Comments, bool? redirect); + + [NonAction] + public override System.Web.Mvc.ActionResult UpdateComments(int id, string Comments, bool? redirect) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateComments); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "Comments", Comments); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "redirect", redirect); + UpdateCommentsOverride(callInfo, id, Comments, redirect); + return callInfo; + } + + [NonAction] + partial void AddDeviceOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, string DeviceSerialNumber, string Comments); + + [NonAction] + public override System.Web.Mvc.ActionResult AddDevice(int id, string DeviceSerialNumber, string Comments) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.AddDevice); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "DeviceSerialNumber", DeviceSerialNumber); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "Comments", Comments); + AddDeviceOverride(callInfo, id, DeviceSerialNumber, Comments); + return callInfo; + } + + [NonAction] + partial void RemoveDeviceOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id); + + [NonAction] + public override System.Web.Mvc.ActionResult RemoveDevice(int id) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.RemoveDevice); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id); + RemoveDeviceOverride(callInfo, id); + return callInfo; + } + + } +} + +#endregion T4MVC +#pragma warning restore 1591, 3008, 3009, 0108, 0114 diff --git a/Disco.Web/Extensions/T4MVC/API.DeviceFlagController.generated.cs b/Disco.Web/Extensions/T4MVC/API.DeviceFlagController.generated.cs new file mode 100644 index 00000000..1388b64a --- /dev/null +++ b/Disco.Web/Extensions/T4MVC/API.DeviceFlagController.generated.cs @@ -0,0 +1,585 @@ +// +// This file was generated by a T4 template. +// Don't change it directly as your change would get overwritten. Instead, make changes +// to the .tt file (i.e. the T4 template) and save it to regenerate this file. + +// Make sure the compiler doesn't complain about missing Xml comments and CLS compliance +// 0108: suppress "Foo hides inherited member Foo. Use the new keyword if hiding was intended." when a controller and its abstract parent are both processed +// 0114: suppress "Foo.BarController.Baz()' hides inherited member 'Qux.BarController.Baz()'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword." when an action (with an argument) overrides an action in a parent controller +#pragma warning disable 1591, 3008, 3009, 0108, 0114 +#region T4MVC + +using System; +using System.Diagnostics; +using System.CodeDom.Compiler; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using System.Web; +using System.Web.Hosting; +using System.Web.Mvc; +using System.Web.Mvc.Ajax; +using System.Web.Mvc.Html; +using System.Web.Routing; +using T4MVC; +namespace Disco.Web.Areas.API.Controllers +{ + public partial class DeviceFlagController + { + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public DeviceFlagController() { } + + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + protected DeviceFlagController(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 RedirectToAction(Task taskResult) + { + return RedirectToAction(taskResult.Result); + } + + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + protected RedirectToRouteResult RedirectToActionPermanent(ActionResult result) + { + var callInfo = result.GetT4MVCResult(); + return RedirectToRoutePermanent(callInfo.RouteValueDictionary); + } + + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + protected RedirectToRouteResult RedirectToActionPermanent(Task taskResult) + { + return RedirectToActionPermanent(taskResult.Result); + } + + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult Update() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Update); + } + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult UpdateName() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateName); + } + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult UpdateDescription() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateDescription); + } + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult UpdateIcon() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateIcon); + } + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult UpdateIconColour() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateIconColour); + } + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult UpdateIconAndColour() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateIconAndColour); + } + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult UpdateOnAssignmentExpression() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateOnAssignmentExpression); + } + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult UpdateOnUnassignmentExpression() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateOnUnassignmentExpression); + } + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult UpdateDevicesLinkedGroup() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateDevicesLinkedGroup); + } + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult UpdateAssignedUserLinkedGroup() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateAssignedUserLinkedGroup); + } + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult Delete() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Delete); + } + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult BulkAssignDevices() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.BulkAssignDevices); + } + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult AssignedDevices() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.AssignedDevices); + } + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult Export() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Export); + } + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult ExportRetrieve() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.ExportRetrieve); + } + + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public DeviceFlagController Actions { get { return MVC.API.DeviceFlag; } } + [GeneratedCode("T4MVC", "2.0")] + public readonly string Area = "API"; + [GeneratedCode("T4MVC", "2.0")] + public readonly string Name = "DeviceFlag"; + [GeneratedCode("T4MVC", "2.0")] + public const string NameConst = "DeviceFlag"; + [GeneratedCode("T4MVC", "2.0")] + 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 Update = "Update"; + public readonly string UpdateName = "UpdateName"; + public readonly string UpdateDescription = "UpdateDescription"; + public readonly string UpdateIcon = "UpdateIcon"; + public readonly string UpdateIconColour = "UpdateIconColour"; + public readonly string UpdateIconAndColour = "UpdateIconAndColour"; + public readonly string UpdateOnAssignmentExpression = "UpdateOnAssignmentExpression"; + public readonly string UpdateOnUnassignmentExpression = "UpdateOnUnassignmentExpression"; + public readonly string UpdateDevicesLinkedGroup = "UpdateDevicesLinkedGroup"; + public readonly string UpdateAssignedUserLinkedGroup = "UpdateAssignedUserLinkedGroup"; + public readonly string Delete = "Delete"; + public readonly string BulkAssignDevices = "BulkAssignDevices"; + public readonly string AssignedDevices = "AssignedDevices"; + public readonly string Export = "Export"; + public readonly string ExportRetrieve = "ExportRetrieve"; + } + + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionNameConstants + { + public const string Update = "Update"; + public const string UpdateName = "UpdateName"; + public const string UpdateDescription = "UpdateDescription"; + public const string UpdateIcon = "UpdateIcon"; + public const string UpdateIconColour = "UpdateIconColour"; + public const string UpdateIconAndColour = "UpdateIconAndColour"; + public const string UpdateOnAssignmentExpression = "UpdateOnAssignmentExpression"; + public const string UpdateOnUnassignmentExpression = "UpdateOnUnassignmentExpression"; + public const string UpdateDevicesLinkedGroup = "UpdateDevicesLinkedGroup"; + public const string UpdateAssignedUserLinkedGroup = "UpdateAssignedUserLinkedGroup"; + public const string Delete = "Delete"; + public const string BulkAssignDevices = "BulkAssignDevices"; + public const string AssignedDevices = "AssignedDevices"; + public const string Export = "Export"; + public const string ExportRetrieve = "ExportRetrieve"; + } + + + 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 id = "id"; + public readonly string key = "key"; + public readonly string value = "value"; + public readonly string redirect = "redirect"; + } + static readonly ActionParamsClass_UpdateName s_params_UpdateName = new ActionParamsClass_UpdateName(); + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public ActionParamsClass_UpdateName UpdateNameParams { get { return s_params_UpdateName; } } + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionParamsClass_UpdateName + { + public readonly string id = "id"; + public readonly string FlagName = "FlagName"; + public readonly string redirect = "redirect"; + } + static readonly ActionParamsClass_UpdateDescription s_params_UpdateDescription = new ActionParamsClass_UpdateDescription(); + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public ActionParamsClass_UpdateDescription UpdateDescriptionParams { get { return s_params_UpdateDescription; } } + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionParamsClass_UpdateDescription + { + public readonly string id = "id"; + public readonly string Description = "Description"; + public readonly string redirect = "redirect"; + } + static readonly ActionParamsClass_UpdateIcon s_params_UpdateIcon = new ActionParamsClass_UpdateIcon(); + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public ActionParamsClass_UpdateIcon UpdateIconParams { get { return s_params_UpdateIcon; } } + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionParamsClass_UpdateIcon + { + public readonly string id = "id"; + public readonly string Icon = "Icon"; + public readonly string redirect = "redirect"; + } + static readonly ActionParamsClass_UpdateIconColour s_params_UpdateIconColour = new ActionParamsClass_UpdateIconColour(); + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public ActionParamsClass_UpdateIconColour UpdateIconColourParams { get { return s_params_UpdateIconColour; } } + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionParamsClass_UpdateIconColour + { + public readonly string id = "id"; + public readonly string IconColour = "IconColour"; + public readonly string redirect = "redirect"; + } + static readonly ActionParamsClass_UpdateIconAndColour s_params_UpdateIconAndColour = new ActionParamsClass_UpdateIconAndColour(); + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public ActionParamsClass_UpdateIconAndColour UpdateIconAndColourParams { get { return s_params_UpdateIconAndColour; } } + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionParamsClass_UpdateIconAndColour + { + public readonly string id = "id"; + public readonly string Icon = "Icon"; + public readonly string IconColour = "IconColour"; + public readonly string redirect = "redirect"; + } + static readonly ActionParamsClass_UpdateOnAssignmentExpression s_params_UpdateOnAssignmentExpression = new ActionParamsClass_UpdateOnAssignmentExpression(); + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public ActionParamsClass_UpdateOnAssignmentExpression UpdateOnAssignmentExpressionParams { get { return s_params_UpdateOnAssignmentExpression; } } + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionParamsClass_UpdateOnAssignmentExpression + { + public readonly string id = "id"; + public readonly string OnAssignmentExpression = "OnAssignmentExpression"; + public readonly string redirect = "redirect"; + } + static readonly ActionParamsClass_UpdateOnUnassignmentExpression s_params_UpdateOnUnassignmentExpression = new ActionParamsClass_UpdateOnUnassignmentExpression(); + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public ActionParamsClass_UpdateOnUnassignmentExpression UpdateOnUnassignmentExpressionParams { get { return s_params_UpdateOnUnassignmentExpression; } } + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionParamsClass_UpdateOnUnassignmentExpression + { + public readonly string id = "id"; + public readonly string OnUnassignmentExpression = "OnUnassignmentExpression"; + public readonly string redirect = "redirect"; + } + static readonly ActionParamsClass_UpdateDevicesLinkedGroup s_params_UpdateDevicesLinkedGroup = new ActionParamsClass_UpdateDevicesLinkedGroup(); + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public ActionParamsClass_UpdateDevicesLinkedGroup UpdateDevicesLinkedGroupParams { get { return s_params_UpdateDevicesLinkedGroup; } } + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionParamsClass_UpdateDevicesLinkedGroup + { + public readonly string id = "id"; + public readonly string GroupId = "GroupId"; + public readonly string FilterBeginDate = "FilterBeginDate"; + public readonly string redirect = "redirect"; + } + static readonly ActionParamsClass_UpdateAssignedUserLinkedGroup s_params_UpdateAssignedUserLinkedGroup = new ActionParamsClass_UpdateAssignedUserLinkedGroup(); + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public ActionParamsClass_UpdateAssignedUserLinkedGroup UpdateAssignedUserLinkedGroupParams { get { return s_params_UpdateAssignedUserLinkedGroup; } } + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionParamsClass_UpdateAssignedUserLinkedGroup + { + public readonly string id = "id"; + public readonly string GroupId = "GroupId"; + public readonly string FilterBeginDate = "FilterBeginDate"; + public readonly string redirect = "redirect"; + } + static readonly ActionParamsClass_Delete s_params_Delete = new ActionParamsClass_Delete(); + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public ActionParamsClass_Delete DeleteParams { get { return s_params_Delete; } } + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionParamsClass_Delete + { + public readonly string id = "id"; + public readonly string redirect = "redirect"; + } + static readonly ActionParamsClass_BulkAssignDevices s_params_BulkAssignDevices = new ActionParamsClass_BulkAssignDevices(); + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public ActionParamsClass_BulkAssignDevices BulkAssignDevicesParams { get { return s_params_BulkAssignDevices; } } + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionParamsClass_BulkAssignDevices + { + public readonly string id = "id"; + public readonly string Override = "Override"; + public readonly string DeviceSerialNumbers = "DeviceSerialNumbers"; + public readonly string Comments = "Comments"; + } + static readonly ActionParamsClass_AssignedDevices s_params_AssignedDevices = new ActionParamsClass_AssignedDevices(); + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public ActionParamsClass_AssignedDevices AssignedDevicesParams { get { return s_params_AssignedDevices; } } + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionParamsClass_AssignedDevices + { + public readonly string id = "id"; + } + static readonly ActionParamsClass_Export s_params_Export = new ActionParamsClass_Export(); + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public ActionParamsClass_Export ExportParams { get { return s_params_Export; } } + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionParamsClass_Export + { + public readonly string Model = "Model"; + } + static readonly ActionParamsClass_ExportRetrieve s_params_ExportRetrieve = new ActionParamsClass_ExportRetrieve(); + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public ActionParamsClass_ExportRetrieve ExportRetrieveParams { get { return s_params_ExportRetrieve; } } + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionParamsClass_ExportRetrieve + { + public readonly string Id = "Id"; + } + 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 partial class T4MVC_DeviceFlagController : Disco.Web.Areas.API.Controllers.DeviceFlagController + { + public T4MVC_DeviceFlagController() : base(Dummy.Instance) { } + + [NonAction] + partial void UpdateOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, string key, string value, bool? redirect); + + [NonAction] + public override System.Web.Mvc.ActionResult Update(int id, string key, string value, bool? redirect) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Update); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "key", key); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "value", value); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "redirect", redirect); + UpdateOverride(callInfo, id, key, value, redirect); + return callInfo; + } + + [NonAction] + partial void UpdateNameOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, string FlagName, bool? redirect); + + [NonAction] + public override System.Web.Mvc.ActionResult UpdateName(int id, string FlagName, bool? redirect) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateName); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "FlagName", FlagName); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "redirect", redirect); + UpdateNameOverride(callInfo, id, FlagName, redirect); + return callInfo; + } + + [NonAction] + partial void UpdateDescriptionOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, string Description, bool? redirect); + + [NonAction] + public override System.Web.Mvc.ActionResult UpdateDescription(int id, string Description, bool? redirect) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateDescription); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "Description", Description); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "redirect", redirect); + UpdateDescriptionOverride(callInfo, id, Description, redirect); + return callInfo; + } + + [NonAction] + partial void UpdateIconOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, string Icon, bool? redirect); + + [NonAction] + public override System.Web.Mvc.ActionResult UpdateIcon(int id, string Icon, bool? redirect) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateIcon); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "Icon", Icon); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "redirect", redirect); + UpdateIconOverride(callInfo, id, Icon, redirect); + return callInfo; + } + + [NonAction] + partial void UpdateIconColourOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, string IconColour, bool? redirect); + + [NonAction] + public override System.Web.Mvc.ActionResult UpdateIconColour(int id, string IconColour, bool? redirect) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateIconColour); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "IconColour", IconColour); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "redirect", redirect); + UpdateIconColourOverride(callInfo, id, IconColour, redirect); + return callInfo; + } + + [NonAction] + partial void UpdateIconAndColourOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, string Icon, string IconColour, bool redirect); + + [NonAction] + public override System.Web.Mvc.ActionResult UpdateIconAndColour(int id, string Icon, string IconColour, bool redirect) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateIconAndColour); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "Icon", Icon); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "IconColour", IconColour); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "redirect", redirect); + UpdateIconAndColourOverride(callInfo, id, Icon, IconColour, redirect); + return callInfo; + } + + [NonAction] + partial void UpdateOnAssignmentExpressionOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, string OnAssignmentExpression, bool redirect); + + [NonAction] + public override System.Web.Mvc.ActionResult UpdateOnAssignmentExpression(int id, string OnAssignmentExpression, bool redirect) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateOnAssignmentExpression); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "OnAssignmentExpression", OnAssignmentExpression); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "redirect", redirect); + UpdateOnAssignmentExpressionOverride(callInfo, id, OnAssignmentExpression, redirect); + return callInfo; + } + + [NonAction] + partial void UpdateOnUnassignmentExpressionOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, string OnUnassignmentExpression, bool redirect); + + [NonAction] + public override System.Web.Mvc.ActionResult UpdateOnUnassignmentExpression(int id, string OnUnassignmentExpression, bool redirect) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateOnUnassignmentExpression); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "OnUnassignmentExpression", OnUnassignmentExpression); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "redirect", redirect); + UpdateOnUnassignmentExpressionOverride(callInfo, id, OnUnassignmentExpression, redirect); + return callInfo; + } + + [NonAction] + partial void UpdateDevicesLinkedGroupOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, string GroupId, System.DateTime? FilterBeginDate, bool redirect); + + [NonAction] + public override System.Web.Mvc.ActionResult UpdateDevicesLinkedGroup(int id, string GroupId, System.DateTime? FilterBeginDate, bool redirect) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateDevicesLinkedGroup); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "GroupId", GroupId); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "FilterBeginDate", FilterBeginDate); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "redirect", redirect); + UpdateDevicesLinkedGroupOverride(callInfo, id, GroupId, FilterBeginDate, redirect); + return callInfo; + } + + [NonAction] + partial void UpdateAssignedUserLinkedGroupOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, string GroupId, System.DateTime? FilterBeginDate, bool redirect); + + [NonAction] + public override System.Web.Mvc.ActionResult UpdateAssignedUserLinkedGroup(int id, string GroupId, System.DateTime? FilterBeginDate, bool redirect) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateAssignedUserLinkedGroup); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "GroupId", GroupId); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "FilterBeginDate", FilterBeginDate); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "redirect", redirect); + UpdateAssignedUserLinkedGroupOverride(callInfo, id, GroupId, FilterBeginDate, redirect); + return callInfo; + } + + [NonAction] + partial void DeleteOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, bool? redirect); + + [NonAction] + public override System.Web.Mvc.ActionResult Delete(int id, bool? redirect) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Delete); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "redirect", redirect); + DeleteOverride(callInfo, id, redirect); + return callInfo; + } + + [NonAction] + partial void BulkAssignDevicesOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id, bool Override, string DeviceSerialNumbers, string Comments); + + [NonAction] + public override System.Web.Mvc.ActionResult BulkAssignDevices(int id, bool Override, string DeviceSerialNumbers, string Comments) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.BulkAssignDevices); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "Override", Override); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "DeviceSerialNumbers", DeviceSerialNumbers); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "Comments", Comments); + BulkAssignDevicesOverride(callInfo, id, Override, DeviceSerialNumbers, Comments); + return callInfo; + } + + [NonAction] + partial void AssignedDevicesOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int id); + + [NonAction] + public override System.Web.Mvc.ActionResult AssignedDevices(int id) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.AssignedDevices); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id); + AssignedDevicesOverride(callInfo, id); + return callInfo; + } + + [NonAction] + partial void ExportOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, Disco.Web.Areas.Config.Models.DeviceFlag.ExportModel Model); + + [NonAction] + public override System.Web.Mvc.ActionResult Export(Disco.Web.Areas.Config.Models.DeviceFlag.ExportModel Model) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Export); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "Model", Model); + ExportOverride(callInfo, Model); + return callInfo; + } + + [NonAction] + partial void ExportRetrieveOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, string Id); + + [NonAction] + public override System.Web.Mvc.ActionResult ExportRetrieve(string Id) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.ExportRetrieve); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "Id", Id); + ExportRetrieveOverride(callInfo, Id); + return callInfo; + } + + } +} + +#endregion T4MVC +#pragma warning restore 1591, 3008, 3009, 0108, 0114 diff --git a/Disco.Web/Extensions/T4MVC/Config.DeviceFlagController.generated.cs b/Disco.Web/Extensions/T4MVC/Config.DeviceFlagController.generated.cs new file mode 100644 index 00000000..0775834b --- /dev/null +++ b/Disco.Web/Extensions/T4MVC/Config.DeviceFlagController.generated.cs @@ -0,0 +1,210 @@ +// +// This file was generated by a T4 template. +// Don't change it directly as your change would get overwritten. Instead, make changes +// to the .tt file (i.e. the T4 template) and save it to regenerate this file. + +// Make sure the compiler doesn't complain about missing Xml comments and CLS compliance +// 0108: suppress "Foo hides inherited member Foo. Use the new keyword if hiding was intended." when a controller and its abstract parent are both processed +// 0114: suppress "Foo.BarController.Baz()' hides inherited member 'Qux.BarController.Baz()'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword." when an action (with an argument) overrides an action in a parent controller +#pragma warning disable 1591, 3008, 3009, 0108, 0114 +#region T4MVC + +using System; +using System.Diagnostics; +using System.CodeDom.Compiler; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using System.Web; +using System.Web.Hosting; +using System.Web.Mvc; +using System.Web.Mvc.Ajax; +using System.Web.Mvc.Html; +using System.Web.Routing; +using T4MVC; +namespace Disco.Web.Areas.Config.Controllers +{ + public partial class DeviceFlagController + { + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public DeviceFlagController() { } + + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + protected DeviceFlagController(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 RedirectToAction(Task taskResult) + { + return RedirectToAction(taskResult.Result); + } + + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + protected RedirectToRouteResult RedirectToActionPermanent(ActionResult result) + { + var callInfo = result.GetT4MVCResult(); + return RedirectToRoutePermanent(callInfo.RouteValueDictionary); + } + + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + protected RedirectToRouteResult RedirectToActionPermanent(Task taskResult) + { + return RedirectToActionPermanent(taskResult.Result); + } + + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult Index() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Index); + } + [NonAction] + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public virtual System.Web.Mvc.ActionResult Export() + { + return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Export); + } + + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public DeviceFlagController Actions { get { return MVC.Config.DeviceFlag; } } + [GeneratedCode("T4MVC", "2.0")] + public readonly string Area = "Config"; + [GeneratedCode("T4MVC", "2.0")] + public readonly string Name = "DeviceFlag"; + [GeneratedCode("T4MVC", "2.0")] + public const string NameConst = "DeviceFlag"; + [GeneratedCode("T4MVC", "2.0")] + 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"; + public readonly string Create = "Create"; + public readonly string Export = "Export"; + } + + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionNameConstants + { + public const string Index = "Index"; + public const string Create = "Create"; + public const string Export = "Export"; + } + + + static readonly ActionParamsClass_Index s_params_Index = new ActionParamsClass_Index(); + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public ActionParamsClass_Index IndexParams { get { return s_params_Index; } } + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionParamsClass_Index + { + public readonly string id = "id"; + } + static readonly ActionParamsClass_Create s_params_Create = new ActionParamsClass_Create(); + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public ActionParamsClass_Create CreateParams { get { return s_params_Create; } } + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionParamsClass_Create + { + public readonly string model = "model"; + } + static readonly ActionParamsClass_Export s_params_Export = new ActionParamsClass_Export(); + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public ActionParamsClass_Export ExportParams { get { return s_params_Export; } } + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public class ActionParamsClass_Export + { + public readonly string DownloadId = "DownloadId"; + public readonly string DeviceFlagId = "DeviceFlagId"; + public readonly string CurrentOnly = "CurrentOnly"; + } + 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 + { + public readonly string Create = "Create"; + public readonly string Export = "Export"; + public readonly string Index = "Index"; + public readonly string Show = "Show"; + } + public readonly string Create = "~/Areas/Config/Views/DeviceFlag/Create.cshtml"; + public readonly string Export = "~/Areas/Config/Views/DeviceFlag/Export.cshtml"; + public readonly string Index = "~/Areas/Config/Views/DeviceFlag/Index.cshtml"; + public readonly string Show = "~/Areas/Config/Views/DeviceFlag/Show.cshtml"; + } + } + + [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode] + public partial class T4MVC_DeviceFlagController : Disco.Web.Areas.Config.Controllers.DeviceFlagController + { + public T4MVC_DeviceFlagController() : base(Dummy.Instance) { } + + [NonAction] + partial void IndexOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, int? id); + + [NonAction] + public override System.Web.Mvc.ActionResult Index(int? id) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Index); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "id", id); + IndexOverride(callInfo, id); + return callInfo; + } + + [NonAction] + partial void CreateOverride(T4MVC_System_Web_Mvc_ActionResult callInfo); + + [NonAction] + public override System.Web.Mvc.ActionResult Create() + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Create); + CreateOverride(callInfo); + return callInfo; + } + + [NonAction] + partial void CreateOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, Disco.Web.Areas.Config.Models.DeviceFlag.CreateModel model); + + [NonAction] + public override System.Web.Mvc.ActionResult Create(Disco.Web.Areas.Config.Models.DeviceFlag.CreateModel model) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Create); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "model", model); + CreateOverride(callInfo, model); + return callInfo; + } + + [NonAction] + partial void ExportOverride(T4MVC_System_Web_Mvc_ActionResult callInfo, string DownloadId, int? DeviceFlagId, bool? CurrentOnly); + + [NonAction] + public override System.Web.Mvc.ActionResult Export(string DownloadId, int? DeviceFlagId, bool? CurrentOnly) + { + var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Export); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "DownloadId", DownloadId); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "DeviceFlagId", DeviceFlagId); + ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "CurrentOnly", CurrentOnly); + ExportOverride(callInfo, DownloadId, DeviceFlagId, CurrentOnly); + return callInfo; + } + + } +} + +#endregion T4MVC +#pragma warning restore 1591, 3008, 3009, 0108, 0114 diff --git a/Disco.Web/Extensions/T4MVC/DeviceController.generated.cs b/Disco.Web/Extensions/T4MVC/DeviceController.generated.cs index 29b426ed..35e7a2ed 100644 --- a/Disco.Web/Extensions/T4MVC/DeviceController.generated.cs +++ b/Disco.Web/Extensions/T4MVC/DeviceController.generated.cs @@ -218,6 +218,7 @@ namespace Disco.Web.Controllers public readonly string _AssignmentHistory = "_AssignmentHistory"; public readonly string _Certificates = "_Certificates"; public readonly string _Details = "_Details"; + public readonly string _Flags = "_Flags"; public readonly string _Jobs = "_Jobs"; public readonly string _Resources = "_Resources"; public readonly string _Subject = "_Subject"; @@ -225,6 +226,7 @@ namespace Disco.Web.Controllers public readonly string _AssignmentHistory = "~/Views/Device/DeviceParts/_AssignmentHistory.cshtml"; public readonly string _Certificates = "~/Views/Device/DeviceParts/_Certificates.cshtml"; public readonly string _Details = "~/Views/Device/DeviceParts/_Details.cshtml"; + public readonly string _Flags = "~/Views/Device/DeviceParts/_Flags.cshtml"; public readonly string _Jobs = "~/Views/Device/DeviceParts/_Jobs.cshtml"; public readonly string _Resources = "~/Views/Device/DeviceParts/_Resources.cshtml"; public readonly string _Subject = "~/Views/Device/DeviceParts/_Subject.cshtml"; diff --git a/Disco.Web/Extensions/T4MVC/T4MVC.cs b/Disco.Web/Extensions/T4MVC/T4MVC.cs index 63a30aa7..43f83097 100644 --- a/Disco.Web/Extensions/T4MVC/T4MVC.cs +++ b/Disco.Web/Extensions/T4MVC/T4MVC.cs @@ -56,6 +56,8 @@ namespace T4MVC public Disco.Web.Areas.API.Controllers.DeviceBatchController DeviceBatch = new Disco.Web.Areas.API.Controllers.T4MVC_DeviceBatchController(); public Disco.Web.Areas.API.Controllers.DeviceCertificateController DeviceCertificate = new Disco.Web.Areas.API.Controllers.T4MVC_DeviceCertificateController(); public Disco.Web.Areas.API.Controllers.DeviceController Device = new Disco.Web.Areas.API.Controllers.T4MVC_DeviceController(); + public Disco.Web.Areas.API.Controllers.DeviceFlagAssignmentController DeviceFlagAssignment = new Disco.Web.Areas.API.Controllers.T4MVC_DeviceFlagAssignmentController(); + public Disco.Web.Areas.API.Controllers.DeviceFlagController DeviceFlag = new Disco.Web.Areas.API.Controllers.T4MVC_DeviceFlagController(); public Disco.Web.Areas.API.Controllers.DeviceModelController DeviceModel = new Disco.Web.Areas.API.Controllers.T4MVC_DeviceModelController(); public Disco.Web.Areas.API.Controllers.DeviceProfileController DeviceProfile = new Disco.Web.Areas.API.Controllers.T4MVC_DeviceProfileController(); public Disco.Web.Areas.API.Controllers.DocumentTemplateController DocumentTemplate = new Disco.Web.Areas.API.Controllers.T4MVC_DocumentTemplateController(); @@ -80,6 +82,7 @@ namespace T4MVC public Disco.Web.Areas.Config.Controllers.AuthorizationRoleController AuthorizationRole = new Disco.Web.Areas.Config.Controllers.T4MVC_AuthorizationRoleController(); public Disco.Web.Areas.Config.Controllers.ConfigController Config = new Disco.Web.Areas.Config.Controllers.T4MVC_ConfigController(); public Disco.Web.Areas.Config.Controllers.DeviceBatchController DeviceBatch = new Disco.Web.Areas.Config.Controllers.T4MVC_DeviceBatchController(); + public Disco.Web.Areas.Config.Controllers.DeviceFlagController DeviceFlag = new Disco.Web.Areas.Config.Controllers.T4MVC_DeviceFlagController(); public Disco.Web.Areas.Config.Controllers.DeviceModelController DeviceModel = new Disco.Web.Areas.Config.Controllers.T4MVC_DeviceModelController(); public Disco.Web.Areas.Config.Controllers.DeviceProfileController DeviceProfile = new Disco.Web.Areas.Config.Controllers.T4MVC_DeviceProfileController(); public Disco.Web.Areas.Config.Controllers.DocumentTemplateController DocumentTemplate = new Disco.Web.Areas.Config.Controllers.T4MVC_DocumentTemplateController(); diff --git a/Disco.Web/Models/Device/ShowModel.cs b/Disco.Web/Models/Device/ShowModel.cs index 92f25923..b18957bf 100644 --- a/Disco.Web/Models/Device/ShowModel.cs +++ b/Disco.Web/Models/Device/ShowModel.cs @@ -1,4 +1,5 @@ -using Disco.Models.Services.Documents; +using Disco.Models.Repository; +using Disco.Models.Services.Documents; using Disco.Models.Services.Jobs.JobLists; using Disco.Models.UI.Device; using Disco.Services.Plugins; @@ -13,20 +14,20 @@ namespace Disco.Web.Models.Device { public Disco.Models.Repository.Device Device { get; set; } - public List DeviceProfiles { get; set; } + public List DeviceProfiles { get; set; } public HashSet DecommissionedDeviceProfileIds { get; set; } public Disco.Models.BI.Config.OrganisationAddress DeviceProfileDefaultOrganisationAddress { get; set; } public List DeviceProfileCertificateProviders { get; set; } public List DeviceProfileWirelessProfileProviders { get; set; } - public List DeviceBatches { get; set; } + public List DeviceBatches { get; set; } public HashSet DecommissionedDeviceBatchIds { get; set; } public JobTableModel Jobs { get; set; } - public List Certificates { get; set; } + public List Certificates { get; set; } public string OrganisationUnit { get; set; } - public List DocumentTemplates { get; set; } + public List DocumentTemplates { get; set; } public List DocumentTemplatePackages { get; set; } public GenerateDocumentControlModel GenerateDocumentControlModel => new GenerateDocumentControlModel() { @@ -36,6 +37,8 @@ namespace Disco.Web.Models.Device HandlersPresent = Plugins.GetPluginFeatures(typeof(DocumentHandlerProviderFeature)).Any(), }; + public List AvailableDeviceFlags { get; set; } + public Dictionary AssignedUserDetails { get; set; } public bool HasAssignedUserPhoto { get; set; } } diff --git a/Disco.Web/Views/Device/DeviceParts/_Flags.cshtml b/Disco.Web/Views/Device/DeviceParts/_Flags.cshtml new file mode 100644 index 00000000..47b4ed8a --- /dev/null +++ b/Disco.Web/Views/Device/DeviceParts/_Flags.cshtml @@ -0,0 +1,182 @@ +@model Disco.Web.Models.Device.ShowModel +@using Disco.Services.Devices.DeviceFlags; +@{ + Authorization.Require(Claims.Device.ShowFlagAssignments); + + var hasRemove = Authorization.Has(Claims.Device.Actions.RemoveFlags); + var hasEdit = Authorization.Has(Claims.Device.Actions.EditFlags); + + var hasDeviceFlagShow = Authorization.Has(Claims.Config.DeviceFlag.Show); + var activeAssignmentCount = Model.Device.DeviceFlagAssignments == null ? 0 : Model.Device.DeviceFlagAssignments.Count(a => !a.RemovedDate.HasValue); + + var flagAssignments = Model.Device.DeviceFlagAssignments.Select(a => Tuple.Create(a, DeviceFlagService.GetDeviceFlag(a.DeviceFlagId))).ToList(); +} +
+ @if (flagAssignments.Count > 0) + { + + + + + + + + @foreach (var fa in flagAssignments.OrderByDescending(a => a.Item1.AddedDate)) + { + + + + + + + } +
NameAddedCommentsRemoved
+ + @if (hasDeviceFlagShow) + { + @Html.ActionLink(fa.Item2.Name, MVC.Config.DeviceFlag.Index(fa.Item2.Id)) + } + else + { + @fa.Item2.Name + } + + @CommonHelpers.FriendlyDateAndUser(fa.Item1.AddedDate, fa.Item1.AddedUser) + @if (fa.Item1.OnAssignmentExpressionResult != null) + { +
@fa.Item1.OnAssignmentExpressionResult
+ } +
+ @if (hasEdit) + { +
+ } + @if (fa.Item1.Comments == null) + { +
[no comments]
+ } + else + { +
@fa.Item1.Comments.ToHtmlComment()
+
@fa.Item1.Comments
+ } +
+ @if (fa.Item1.RemovedDate.HasValue) + { + @CommonHelpers.FriendlyDateAndUser(fa.Item1.RemovedDate.Value, fa.Item1.RemovedUser) + if (fa.Item1.OnUnassignmentExpressionResult != null) + { +
@fa.Item1.OnUnassignmentExpressionResult
+ } + } + else if (fa.Item1.CanRemove()) + { + Remove + } +
+
+ @using (Html.BeginForm(MVC.API.DeviceFlagAssignment.RemoveDevice())) + { + +

+  Are you sure? +

+ } +
+
+ @using (Html.BeginForm(MVC.API.DeviceFlagAssignment.UpdateComments())) + { + + +

Comments:

+

+ +

+ } +
+ + } + else + { +
This device has no associated flags
+ } + +
diff --git a/Disco.Web/Views/Device/DeviceParts/_Flags.generated.cs b/Disco.Web/Views/Device/DeviceParts/_Flags.generated.cs new file mode 100644 index 00000000..f3c35631 --- /dev/null +++ b/Disco.Web/Views/Device/DeviceParts/_Flags.generated.cs @@ -0,0 +1,690 @@ +#pragma warning disable 1591 +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Disco.Web.Views.Device.DeviceParts +{ + using System; + using System.Collections.Generic; + using System.IO; + using System.Linq; + using System.Net; + using System.Text; + using System.Web; + using System.Web.Helpers; + using System.Web.Mvc; + using System.Web.Mvc.Ajax; + using System.Web.Mvc.Html; + using System.Web.Routing; + using System.Web.Security; + using System.Web.UI; + using System.Web.WebPages; + using Disco; + using Disco.Models.Repository; + using Disco.Services; + using Disco.Services.Authorization; + + #line 2 "..\..\Views\Device\DeviceParts\_Flags.cshtml" + using Disco.Services.Devices.DeviceFlags; + + #line default + #line hidden + using Disco.Services.Web; + using Disco.Web; + using Disco.Web.Extensions; + + [System.CodeDom.Compiler.GeneratedCodeAttribute("RazorGenerator", "2.0.0.0")] + [System.Web.WebPages.PageVirtualPathAttribute("~/Views/Device/DeviceParts/_Flags.cshtml")] + public partial class _Flags : Disco.Services.Web.WebViewPage + { + public _Flags() + { + } + public override void Execute() + { + + #line 3 "..\..\Views\Device\DeviceParts\_Flags.cshtml" + + Authorization.Require(Claims.Device.ShowFlagAssignments); + + var hasRemove = Authorization.Has(Claims.Device.Actions.RemoveFlags); + var hasEdit = Authorization.Has(Claims.Device.Actions.EditFlags); + + var hasDeviceFlagShow = Authorization.Has(Claims.Config.DeviceFlag.Show); + var activeAssignmentCount = Model.Device.DeviceFlagAssignments == null ? 0 : Model.Device.DeviceFlagAssignments.Count(a => !a.RemovedDate.HasValue); + + var flagAssignments = Model.Device.DeviceFlagAssignments.Select(a => Tuple.Create(a, DeviceFlagService.GetDeviceFlag(a.DeviceFlagId))).ToList(); + + + #line default + #line hidden +WriteLiteral("\r\n\r\n"); + + + #line 15 "..\..\Views\Device\DeviceParts\_Flags.cshtml" + + + #line default + #line hidden + + #line 15 "..\..\Views\Device\DeviceParts\_Flags.cshtml" + if (flagAssignments.Count > 0) + { + + + #line default + #line hidden +WriteLiteral(" \r\n \r\n Name\r\n Added\r\n Comments\r\n Removed\r\n \r\n"); + + + #line 24 "..\..\Views\Device\DeviceParts\_Flags.cshtml" + + + #line default + #line hidden + + #line 24 "..\..\Views\Device\DeviceParts\_Flags.cshtml" + foreach (var fa in flagAssignments.OrderByDescending(a => a.Item1.AddedDate)) + { + + + #line default + #line hidden +WriteLiteral("