diff --git a/Disco.Models/Disco.Models.csproj b/Disco.Models/Disco.Models.csproj index 52210e01..5cde0471 100644 --- a/Disco.Models/Disco.Models.csproj +++ b/Disco.Models/Disco.Models.csproj @@ -102,6 +102,7 @@ + @@ -165,11 +166,13 @@ - + + + - + diff --git a/Disco.Models/Services/Devices/Exporting/DeviceExportResult.cs b/Disco.Models/Services/Devices/Exporting/DeviceExportResult.cs new file mode 100644 index 00000000..9af201f2 --- /dev/null +++ b/Disco.Models/Services/Devices/Exporting/DeviceExportResult.cs @@ -0,0 +1,10 @@ +using System.IO; + +namespace Disco.Models.Services.Devices.Exporting +{ + public class DeviceExportResult + { + public MemoryStream CsvResult { get; set; } + public int RecordCount { get; set; } + } +} \ No newline at end of file diff --git a/Disco.Models/UI/Device/DeviceExportModel.cs b/Disco.Models/UI/Device/DeviceExportModel.cs index 7cd1e891..6973ad9c 100644 --- a/Disco.Models/UI/Device/DeviceExportModel.cs +++ b/Disco.Models/UI/Device/DeviceExportModel.cs @@ -7,7 +7,8 @@ namespace Disco.Models.UI.Device { DeviceExportOptions Options { get; set; } - string DownloadExportSessionId { get; set; } + string ExportSessionId { get; set; } + DeviceExportResult ExportSessionResult { get; set; } IEnumerable> DeviceBatches { get; set; } IEnumerable> DeviceModels { get; set; } diff --git a/Disco.Services/Devices/Export/DeviceExport.cs b/Disco.Services/Devices/Exporting/DeviceExport.cs similarity index 95% rename from Disco.Services/Devices/Export/DeviceExport.cs rename to Disco.Services/Devices/Exporting/DeviceExport.cs index d51c4cb1..e33b6183 100644 --- a/Disco.Services/Devices/Export/DeviceExport.cs +++ b/Disco.Services/Devices/Exporting/DeviceExport.cs @@ -11,12 +11,12 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace Disco.Services.Devices.Export +namespace Disco.Services.Devices.Exporting { public static class DeviceExport { - public static MemoryStream GenerateExport(DiscoDataContext Database, IQueryable Devices, DeviceExportOptions Options, IScheduledTaskBasicStatus TaskStatus) + public static DeviceExportResult GenerateExport(DiscoDataContext Database, IQueryable Devices, DeviceExportOptions Options, IScheduledTaskBasicStatus TaskStatus) { TaskStatus.UpdateStatus(15, "Building metadata and database query"); var metadata = Options.BuildMetadata(); @@ -70,14 +70,18 @@ namespace Disco.Services.Devices.Export } stream.Position = 0; - return stream; + return new DeviceExportResult() + { + CsvResult = stream, + RecordCount = records.Count + }; } - public static MemoryStream GenerateExport(DiscoDataContext Database, IQueryable Devices, DeviceExportOptions Options) + public static DeviceExportResult GenerateExport(DiscoDataContext Database, IQueryable Devices, DeviceExportOptions Options) { return GenerateExport(Database, Devices, Options, ScheduledTaskMockStatus.Create()); } - public static MemoryStream GenerateExport(DiscoDataContext Database, DeviceExportOptions Options, IScheduledTaskBasicStatus TaskStatus) + public static DeviceExportResult GenerateExport(DiscoDataContext Database, DeviceExportOptions Options, IScheduledTaskBasicStatus TaskStatus) { switch (Options.ExportType) { @@ -93,7 +97,7 @@ namespace Disco.Services.Devices.Export throw new ArgumentException(string.Format("Unknown Device Export Type", Options.ExportType.ToString()), "Options"); } } - public static MemoryStream GenerateExport(DiscoDataContext Database, DeviceExportOptions Options) + public static DeviceExportResult GenerateExport(DiscoDataContext Database, DeviceExportOptions Options) { return GenerateExport(Database, Options, ScheduledTaskMockStatus.Create()); } diff --git a/Disco.Services/Devices/Export/DeviceExportTask.cs b/Disco.Services/Devices/Exporting/DeviceExportTask.cs similarity index 90% rename from Disco.Services/Devices/Export/DeviceExportTask.cs rename to Disco.Services/Devices/Exporting/DeviceExportTask.cs index 0afcfbf3..d5f11f49 100644 --- a/Disco.Services/Devices/Export/DeviceExportTask.cs +++ b/Disco.Services/Devices/Exporting/DeviceExportTask.cs @@ -7,7 +7,7 @@ using System.IO; using System.Linq; using Disco.Data.Repository; -namespace Disco.Services.Devices.Export +namespace Disco.Services.Devices.Exporting { public class DeviceExportTask : ScheduledTask { @@ -40,7 +40,7 @@ namespace Disco.Services.Devices.Export using (DiscoDataContext Database = new DiscoDataContext()) { - context.CsvResult = DeviceExport.GenerateExport(Database, context.Options, this.Status); + context.Result = DeviceExport.GenerateExport(Database, context.Options, this.Status); } } } diff --git a/Disco.Services/Devices/Export/DeviceExportTaskContext.cs b/Disco.Services/Devices/Exporting/DeviceExportTaskContext.cs similarity index 80% rename from Disco.Services/Devices/Export/DeviceExportTaskContext.cs rename to Disco.Services/Devices/Exporting/DeviceExportTaskContext.cs index 9430b02b..1e940e80 100644 --- a/Disco.Services/Devices/Export/DeviceExportTaskContext.cs +++ b/Disco.Services/Devices/Exporting/DeviceExportTaskContext.cs @@ -2,7 +2,7 @@ using Disco.Services.Tasks; using System.IO; -namespace Disco.Services.Devices.Export +namespace Disco.Services.Devices.Exporting { public class DeviceExportTaskContext { @@ -10,7 +10,7 @@ namespace Disco.Services.Devices.Export public ScheduledTaskStatus TaskStatus { get; set; } - public MemoryStream CsvResult { get; set; } + public DeviceExportResult Result { get; set; } public DeviceExportTaskContext(DeviceExportOptions Options) { diff --git a/Disco.Services/Disco.Services.csproj b/Disco.Services/Disco.Services.csproj index a116a51c..fbda5df3 100644 --- a/Disco.Services/Disco.Services.csproj +++ b/Disco.Services/Disco.Services.csproj @@ -172,9 +172,9 @@ - - - + + + @@ -298,11 +298,13 @@ - + + + - + diff --git a/Disco.Web/Areas/API/Controllers/DeviceController.cs b/Disco.Web/Areas/API/Controllers/DeviceController.cs index 058b3b78..16b75ab6 100644 --- a/Disco.Web/Areas/API/Controllers/DeviceController.cs +++ b/Disco.Web/Areas/API/Controllers/DeviceController.cs @@ -1,6 +1,6 @@ using Disco.BI.Extensions; using Disco.Services.Authorization; -using Disco.Services.Devices.Export; +using Disco.Services.Devices.Exporting; using Disco.Services.Interop.ActiveDirectory; using Disco.Services.Users; using Disco.Services.Web; @@ -564,7 +564,7 @@ namespace Disco.Web.Areas.API.Controllers #endregion #region Exporting - private const string ExportSessionCacheKey = "DeviceExportContext_{0}"; + internal const string ExportSessionCacheKey = "DeviceExportContext_{0}"; [DiscoAuthorize(Claims.Device.Actions.Export)] public virtual ActionResult Export(ExportModel Model) @@ -588,7 +588,7 @@ namespace Disco.Web.Areas.API.Controllers exportContext.TaskStatus.SetFinishedUrl(Url.Action(finishedActionResult)); // Try waiting for completion - if (exportContext.TaskStatus.WaitUntilFinished(TimeSpan.FromSeconds(1.5))) + if (exportContext.TaskStatus.WaitUntilFinished(TimeSpan.FromSeconds(2))) return RedirectToAction(finishedActionResult); else return RedirectToAction(MVC.Config.Logging.TaskStatus(exportContext.TaskStatus.SessionId)); @@ -605,12 +605,12 @@ namespace Disco.Web.Areas.API.Controllers if (context == null) throw new ArgumentException("The Id specified is invalid, or the export data expired (60 minutes)", "Id"); - if (context.CsvResult == null) + if (context.Result == null || context.Result.CsvResult == null) throw new ArgumentException("The export session is still running, or failed to complete successfully", "Id"); var filename = string.Format("DiscoDeviceExport-{0:yyyyMMdd-HHmmss}.csv", context.TaskStatus.StartedTimestamp.Value); - return File(context.CsvResult.ToArray(), "text/csv", filename); + return File(context.Result.CsvResult.ToArray(), "text/csv", filename); } #endregion diff --git a/Disco.Web/ClientSource/Style/Device.css b/Disco.Web/ClientSource/Style/Device.css index 5221b219..7a17693e 100644 --- a/Disco.Web/ClientSource/Style/Device.css +++ b/Disco.Web/ClientSource/Style/Device.css @@ -365,6 +365,14 @@ #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; +} #deviceImport #ImportFile { width: 100%; } diff --git a/Disco.Web/ClientSource/Style/Device.less b/Disco.Web/ClientSource/Style/Device.less index cbf4fa9f..3cbdcc12 100644 --- a/Disco.Web/ClientSource/Style/Device.less +++ b/Disco.Web/ClientSource/Style/Device.less @@ -347,6 +347,16 @@ } } +#Devices_Export_Exporting { + padding-top: 50px; + text-align: center; + + i { + margin-right: 10px; + color: @StatusInformation; + } +} + #deviceImport { #ImportFile { width: 100%; diff --git a/Disco.Web/ClientSource/Style/Device.min.css b/Disco.Web/ClientSource/Style/Device.min.css index 2aa58f7f..379ad90f 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:#fcfcfc}.tableData>thead>tr>th,.tableData>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4}.tableData>tbody>tr:hover>td{background-color:#fefefe}.tableData>tbody>tr:hover:nth-child(odd)>td{background-color:#fafafa}.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:bold}#Device_Show #Device_Show_Subjects #Device_Show_Details #Device_Show_Details_Asset_Name{font-weight:bold}#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_GenerateDocument_Container{padding-top:4px}#Device_Show #Device_Show_Subjects #Device_Show_Details #Device_Show_GenerateDocument_Container #Device_Show_GenerateDocument{padding:0}#Device_Show #Device_Show_Subjects #Device_Show_Policies table.verticalHeadings>tbody>tr>td:first-child{width:120px;font-weight:bold}#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:none;padding:0}#DeviceDetailTabs #DeviceDetailTabItems{border-radius:0;border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;border-bottom:none;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:none;background-color:#eee}#Device_Show_Policies_Profile_Actions_Update_Dialog ul li,#Device_Show_Policies_Batch_Actions_Update_Dialog ul li{background-color:#fff;padding:2px 0}#Device_Show_Policies_Profile_Actions_Update_Dialog ul li:nth-child(odd),#Device_Show_Policies_Batch_Actions_Update_Dialog ul li:nth-child(odd){background-color:#fcfcfc}#Device_Show_Policies_Profile_Actions_Update_Dialog ul li.selected,#Device_Show_Policies_Batch_Actions_Update_Dialog ul li.selected{background-color:#d8d8d8;font-weight:bold}#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:#fcfcfc}#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:#fefefe}#DeviceDetailTab-DetailsContainer>table>tbody>tr:hover:nth-child(odd)>td{background-color:#fafafa}#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{padding:10px 6px}#deviceShowResources #Attachments{padding:0;border:1px solid #ccc;background-color:#fff}#deviceShowResources #Attachments div.attachmentOutput{height:115px;overflow:auto;font-size:.95em}#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;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: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}#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}#deviceImport #ImportFile{width:100%}#deviceImport #documentation{width:700px;margin:20px auto}#deviceImport #documentation>table>thead>tr>th:first-child{width:100px}#deviceImportReview #errorMessage{font-weight:bold;color:red}#deviceImportReview #devicesNavigation{margin-top:15px;text-align:right}#deviceImportReview #devicesNavigation ul{display:inline-block;padding:1px;border:1px solid #bbb}#deviceImportReview #devicesNavigation ul li{display:inline-block;padding:1px 6px;margin:0}#deviceImportReview #devicesNavigation ul li.statusError{background-color:#ffd3d3}#deviceImportReview #devicesNavigation ul li.statusUpdate{background-color:#d3f3ff}#deviceImportReview #devicesNavigation ul li.statusNew{background-color:#d9ffb4}#deviceImportReview #devices{border:solid 1px #f4f4f4;border-collapse:collapse;margin-top:6px}#deviceImportReview #devices>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff}#deviceImportReview #devices>tbody>tr:nth-child(odd)>td{background-color:#fcfcfc}#deviceImportReview #devices>thead>tr>th,#deviceImportReview #devices>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4}#deviceImportReview #devices>tbody>tr:hover>td{background-color:#fefefe}#deviceImportReview #devices>tbody>tr:hover:nth-child(odd)>td{background-color:#fafafa}#deviceImportReview #devices>tfoot>tr>th,#deviceImportReview #devices>tfoot>tr>td{background-color:#f4f4f4}#deviceImportReview #devices>tbody td{vertical-align:middle;min-height:32px}#deviceImportReview #devices>tbody tr.statusError td{background-color:#ffd3d3}#deviceImportReview #devices>tbody tr.statusUpdate td{background-color:#d3f3ff}#deviceImportReview #devices>tbody tr.statusNew td{background-color:#d9ffb4}#deviceImportReview #devices>tbody tr td.action{font-weight:bold}#deviceImportReview #devices>tbody tr td.serialNumber{font-family:Consolas,"Courier New",monospace;font-weight:bold}#deviceImportReview #devices>tbody tr td.model img.modelImage{width:32px;height:32px;margin-right:2px}#deviceImportReview #devices>tbody .error{font-weight:bold} \ 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:#fcfcfc}.tableData>thead>tr>th,.tableData>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4}.tableData>tbody>tr:hover>td{background-color:#fefefe}.tableData>tbody>tr:hover:nth-child(odd)>td{background-color:#fafafa}.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:bold}#Device_Show #Device_Show_Subjects #Device_Show_Details #Device_Show_Details_Asset_Name{font-weight:bold}#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_GenerateDocument_Container{padding-top:4px}#Device_Show #Device_Show_Subjects #Device_Show_Details #Device_Show_GenerateDocument_Container #Device_Show_GenerateDocument{padding:0}#Device_Show #Device_Show_Subjects #Device_Show_Policies table.verticalHeadings>tbody>tr>td:first-child{width:120px;font-weight:bold}#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:none;padding:0}#DeviceDetailTabs #DeviceDetailTabItems{border-radius:0;border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;border-bottom:none;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:none;background-color:#eee}#Device_Show_Policies_Profile_Actions_Update_Dialog ul li,#Device_Show_Policies_Batch_Actions_Update_Dialog ul li{background-color:#fff;padding:2px 0}#Device_Show_Policies_Profile_Actions_Update_Dialog ul li:nth-child(odd),#Device_Show_Policies_Batch_Actions_Update_Dialog ul li:nth-child(odd){background-color:#fcfcfc}#Device_Show_Policies_Profile_Actions_Update_Dialog ul li.selected,#Device_Show_Policies_Batch_Actions_Update_Dialog ul li.selected{background-color:#d8d8d8;font-weight:bold}#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:#fcfcfc}#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:#fefefe}#DeviceDetailTab-DetailsContainer>table>tbody>tr:hover:nth-child(odd)>td{background-color:#fafafa}#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{padding:10px 6px}#deviceShowResources #Attachments{padding:0;border:1px solid #ccc;background-color:#fff}#deviceShowResources #Attachments div.attachmentOutput{height:115px;overflow:auto;font-size:.95em}#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;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: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}#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}#deviceImport #ImportFile{width:100%}#deviceImport #documentation{width:700px;margin:20px auto}#deviceImport #documentation>table>thead>tr>th:first-child{width:100px}#deviceImportReview #errorMessage{font-weight:bold;color:red}#deviceImportReview #devicesNavigation{margin-top:15px;text-align:right}#deviceImportReview #devicesNavigation ul{display:inline-block;padding:1px;border:1px solid #bbb}#deviceImportReview #devicesNavigation ul li{display:inline-block;padding:1px 6px;margin:0}#deviceImportReview #devicesNavigation ul li.statusError{background-color:#ffd3d3}#deviceImportReview #devicesNavigation ul li.statusUpdate{background-color:#d3f3ff}#deviceImportReview #devicesNavigation ul li.statusNew{background-color:#d9ffb4}#deviceImportReview #devices{border:solid 1px #f4f4f4;border-collapse:collapse;margin-top:6px}#deviceImportReview #devices>tbody>tr>td{border:solid 1px #f4f4f4;background-color:#fff}#deviceImportReview #devices>tbody>tr:nth-child(odd)>td{background-color:#fcfcfc}#deviceImportReview #devices>thead>tr>th,#deviceImportReview #devices>tbody>tr>th{background-color:#f4f4f4;border:solid 1px #f4f4f4}#deviceImportReview #devices>tbody>tr:hover>td{background-color:#fefefe}#deviceImportReview #devices>tbody>tr:hover:nth-child(odd)>td{background-color:#fafafa}#deviceImportReview #devices>tfoot>tr>th,#deviceImportReview #devices>tfoot>tr>td{background-color:#f4f4f4}#deviceImportReview #devices>tbody td{vertical-align:middle;min-height:32px}#deviceImportReview #devices>tbody tr.statusError td{background-color:#ffd3d3}#deviceImportReview #devices>tbody tr.statusUpdate td{background-color:#d3f3ff}#deviceImportReview #devices>tbody tr.statusNew td{background-color:#d9ffb4}#deviceImportReview #devices>tbody tr td.action{font-weight:bold}#deviceImportReview #devices>tbody tr td.serialNumber{font-family:Consolas,"Courier New",monospace;font-weight:bold}#deviceImportReview #devices>tbody tr td.model img.modelImage{width:32px;height:32px;margin-right:2px}#deviceImportReview #devices>tbody .error{font-weight:bold} \ No newline at end of file diff --git a/Disco.Web/Controllers/DeviceController.cs b/Disco.Web/Controllers/DeviceController.cs index 66a6b89e..3b51191d 100644 --- a/Disco.Web/Controllers/DeviceController.cs +++ b/Disco.Web/Controllers/DeviceController.cs @@ -5,14 +5,15 @@ using Disco.Models.Services.Jobs.JobLists; using Disco.Models.UI.Device; using Disco.Services; using Disco.Services.Authorization; +using Disco.Services.Devices.Exporting; using Disco.Services.Plugins; using Disco.Services.Plugins.Features.UIExtension; using Disco.Services.Users; using Disco.Services.Web; using System; using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; using System.Linq; +using System.Web; using System.Web.Mvc; @@ -98,7 +99,16 @@ namespace Disco.Web.Controllers }; if (!string.IsNullOrWhiteSpace(DownloadId)) - m.DownloadExportSessionId = DownloadId; + { + string key = string.Format(Areas.API.Controllers.DeviceController.ExportSessionCacheKey, DownloadId); + var context = HttpRuntime.Cache.Get(key) as DeviceExportTaskContext; + + if (context != null) + { + m.ExportSessionResult = context.Result; + m.ExportSessionId = DownloadId; + } + } if (ExportType.HasValue && ExportTypeTargetId.HasValue) { diff --git a/Disco.Web/Models/Device/ExportModel.cs b/Disco.Web/Models/Device/ExportModel.cs index 81540e97..d375c046 100644 --- a/Disco.Web/Models/Device/ExportModel.cs +++ b/Disco.Web/Models/Device/ExportModel.cs @@ -8,7 +8,8 @@ namespace Disco.Web.Models.Device { public DeviceExportOptions Options { get; set; } - public string DownloadExportSessionId { get; set; } + public string ExportSessionId { get; set; } + public DeviceExportResult ExportSessionResult { get; set; } public IEnumerable> DeviceBatches { get; set; } public IEnumerable> DeviceModels { get; set; } diff --git a/Disco.Web/Views/Device/Export.cshtml b/Disco.Web/Views/Device/Export.cshtml index 4567d96c..5723121f 100644 --- a/Disco.Web/Views/Device/Export.cshtml +++ b/Disco.Web/Views/Device/Export.cshtml @@ -11,24 +11,6 @@ .GroupBy(m => m.ShortDisplayName); }
- @if (!string.IsNullOrEmpty(Model.DownloadExportSessionId)) - { -
-

The Device Export was completed successfully.

- Download Device Export -
- - } @using (Html.BeginForm(MVC.API.Device.Export())) {
@@ -99,10 +81,12 @@
-
- -
}
+@if (Model.ExportSessionId != null) +{ +
+

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

+ Download Device Export +
+ +} +
+

Device Exporting devices...

+
+ diff --git a/Disco.Web/Views/Device/Export.generated.cs b/Disco.Web/Views/Device/Export.generated.cs index 7accccf3..115151bf 100644 --- a/Disco.Web/Views/Device/Export.generated.cs +++ b/Disco.Web/Views/Device/Export.generated.cs @@ -84,65 +84,6 @@ WriteLiteral(">\r\n"); #line hidden #line 14 "..\..\Views\Device\Export.cshtml" - if (!string.IsNullOrEmpty(Model.DownloadExportSessionId)) - { - - - #line default - #line hidden -WriteLiteral(" \r\n

The Device Export was completed successfully.

\r\n " + -" (Url.Action(MVC.API.Device.ExportRetrieve(Model.DownloadExportSessionId)) - - #line default - #line hidden -, 783), false) -); - -WriteLiteral(" class=\"button\""); - -WriteLiteral(">Download Device Export\r\n \r\n"); - -WriteLiteral(@" -"); - - - #line 31 "..\..\Views\Device\Export.cshtml" - } - - - #line default - #line hidden -WriteLiteral(" "); - - - #line 32 "..\..\Views\Device\Export.cshtml" using (Html.BeginForm(MVC.API.Device.Export())) { @@ -167,7 +108,7 @@ WriteLiteral(">Type:\r\n \r\n \r\ WriteLiteral(" "); - #line 41 "..\..\Views\Device\Export.cshtml" + #line 23 "..\..\Views\Device\Export.cshtml" Write(Html.DropDownListFor(m => m.Options.ExportType, Enum.GetNames(typeof(Disco.Models.Services.Devices.Exporting.DeviceExportTypes)).Select(t => new SelectListItem() { Text = t, Value = t }))); @@ -184,7 +125,7 @@ WriteLiteral(">\r\n"); WriteLiteral(" "); - #line 43 "..\..\Views\Device\Export.cshtml" + #line 25 "..\..\Views\Device\Export.cshtml" Write(Html.DropDownListFor(m => m.Options.ExportTypeTargetId, Model.DeviceBatches.Select(i => new SelectListItem() { Value = i.Key.ToString(), Text = i.Value }))); @@ -201,7 +142,7 @@ WriteLiteral(">\r\n"); WriteLiteral(" "); - #line 46 "..\..\Views\Device\Export.cshtml" + #line 28 "..\..\Views\Device\Export.cshtml" Write(Html.DropDownListFor(m => m.Options.ExportTypeTargetId, Model.DeviceModels.Select(i => new SelectListItem() { Value = i.Key.ToString(), Text = i.Value }))); @@ -218,7 +159,7 @@ WriteLiteral(">\r\n"); WriteLiteral(" "); - #line 49 "..\..\Views\Device\Export.cshtml" + #line 31 "..\..\Views\Device\Export.cshtml" Write(Html.DropDownListFor(m => m.Options.ExportTypeTargetId, Model.DeviceProfiles.Select(i => new SelectListItem() { Value = i.Key.ToString(), Text = i.Value }))); @@ -244,13 +185,13 @@ WriteLiteral(" href=\"#\""); WriteLiteral(">(Defaults)\r\n \r\n"); - #line 58 "..\..\Views\Device\Export.cshtml" + #line 40 "..\..\Views\Device\Export.cshtml" #line default #line hidden - #line 58 "..\..\Views\Device\Export.cshtml" + #line 40 "..\..\Views\Device\Export.cshtml" foreach (var optionGroup in optionGroups) { var optionFields = optionGroup.ToList(); @@ -268,7 +209,7 @@ WriteLiteral(">\r\n"); WriteLiteral(" "); - #line 64 "..\..\Views\Device\Export.cshtml" + #line 46 "..\..\Views\Device\Export.cshtml" Write(optionGroup.Key); @@ -277,13 +218,13 @@ WriteLiteral(" "); WriteLiteral("\r\n"); - #line 65 "..\..\Views\Device\Export.cshtml" + #line 47 "..\..\Views\Device\Export.cshtml" #line default #line hidden - #line 65 "..\..\Views\Device\Export.cshtml" + #line 47 "..\..\Views\Device\Export.cshtml" if (optionFields.Count > 2) { @@ -311,7 +252,7 @@ WriteLiteral(" href=\"#\""); WriteLiteral(">NONE\r\n"); - #line 68 "..\..\Views\Device\Export.cshtml" + #line 50 "..\..\Views\Device\Export.cshtml" } @@ -338,13 +279,13 @@ WriteLiteral(" class=\"none\""); WriteLiteral(">\r\n"); - #line 76 "..\..\Views\Device\Export.cshtml" + #line 58 "..\..\Views\Device\Export.cshtml" #line default #line hidden - #line 76 "..\..\Views\Device\Export.cshtml" + #line 58 "..\..\Views\Device\Export.cshtml" foreach (var optionItem in optionFields.Take(itemsPerColumn)) { @@ -353,40 +294,40 @@ WriteLiteral(">\r\n"); #line hidden WriteLiteral(" (optionItem.Description + #line 60 "..\..\Views\Device\Export.cshtml" +, Tuple.Create(Tuple.Create("", 3561), Tuple.Create(optionItem.Description #line default #line hidden -, 4338), false) +, 3561), false) ); WriteLiteral(">\r\n (optionItem.PropertyName + #line 61 "..\..\Views\Device\Export.cshtml" + , Tuple.Create(Tuple.Create("", 3679), Tuple.Create(optionItem.PropertyName #line default #line hidden -, 4456), false) +, 3679), false) ); -WriteAttribute("name", Tuple.Create(" name=\"", 4481), Tuple.Create("\"", 4520) -, Tuple.Create(Tuple.Create("", 4488), Tuple.Create("Options.", 4488), true) +WriteAttribute("name", Tuple.Create(" name=\"", 3704), Tuple.Create("\"", 3743) +, Tuple.Create(Tuple.Create("", 3711), Tuple.Create("Options.", 3711), true) - #line 79 "..\..\Views\Device\Export.cshtml" - , Tuple.Create(Tuple.Create("", 4496), Tuple.Create(optionItem.PropertyName + #line 61 "..\..\Views\Device\Export.cshtml" + , Tuple.Create(Tuple.Create("", 3719), Tuple.Create(optionItem.PropertyName #line default #line hidden -, 4496), false) +, 3719), false) ); WriteLiteral(" value=\"true\""); @@ -394,7 +335,7 @@ WriteLiteral(" value=\"true\""); WriteLiteral(" "); - #line 79 "..\..\Views\Device\Export.cshtml" + #line 61 "..\..\Views\Device\Export.cshtml" Write(((bool)optionItem.Model) ? "checked " : null); @@ -402,21 +343,21 @@ WriteLiteral(" "); #line hidden WriteLiteral("/>(optionItem.PropertyName + #line 61 "..\..\Views\Device\Export.cshtml" + , Tuple.Create(Tuple.Create("", 3827), Tuple.Create(optionItem.PropertyName #line default #line hidden -, 4604), false) +, 3827), false) ); WriteLiteral(">"); - #line 79 "..\..\Views\Device\Export.cshtml" + #line 61 "..\..\Views\Device\Export.cshtml" Write(optionItem.DisplayName); @@ -425,7 +366,7 @@ WriteLiteral(">"); WriteLiteral("\r\n"); - #line 80 "..\..\Views\Device\Export.cshtml" + #line 62 "..\..\Views\Device\Export.cshtml" } @@ -443,13 +384,13 @@ WriteLiteral(" class=\"none\""); WriteLiteral(">\r\n"); - #line 85 "..\..\Views\Device\Export.cshtml" + #line 67 "..\..\Views\Device\Export.cshtml" #line default #line hidden - #line 85 "..\..\Views\Device\Export.cshtml" + #line 67 "..\..\Views\Device\Export.cshtml" foreach (var optionItem in optionFields.Skip(itemsPerColumn)) { @@ -458,40 +399,40 @@ WriteLiteral(">\r\n"); #line hidden WriteLiteral(" (optionItem.Description + #line 69 "..\..\Views\Device\Export.cshtml" +, Tuple.Create(Tuple.Create("", 4394), Tuple.Create(optionItem.Description #line default #line hidden -, 5171), false) +, 4394), false) ); WriteLiteral(">\r\n (optionItem.PropertyName + #line 70 "..\..\Views\Device\Export.cshtml" + , Tuple.Create(Tuple.Create("", 4512), Tuple.Create(optionItem.PropertyName #line default #line hidden -, 5289), false) +, 4512), false) ); -WriteAttribute("name", Tuple.Create(" name=\"", 5314), Tuple.Create("\"", 5353) -, Tuple.Create(Tuple.Create("", 5321), Tuple.Create("Options.", 5321), true) +WriteAttribute("name", Tuple.Create(" name=\"", 4537), Tuple.Create("\"", 4576) +, Tuple.Create(Tuple.Create("", 4544), Tuple.Create("Options.", 4544), true) - #line 88 "..\..\Views\Device\Export.cshtml" - , Tuple.Create(Tuple.Create("", 5329), Tuple.Create(optionItem.PropertyName + #line 70 "..\..\Views\Device\Export.cshtml" + , Tuple.Create(Tuple.Create("", 4552), Tuple.Create(optionItem.PropertyName #line default #line hidden -, 5329), false) +, 4552), false) ); WriteLiteral(" value=\"true\""); @@ -499,7 +440,7 @@ WriteLiteral(" value=\"true\""); WriteLiteral(" "); - #line 88 "..\..\Views\Device\Export.cshtml" + #line 70 "..\..\Views\Device\Export.cshtml" Write(((bool)optionItem.Model) ? "checked " : null); @@ -507,21 +448,21 @@ WriteLiteral(" "); #line hidden WriteLiteral("/>(optionItem.PropertyName + #line 70 "..\..\Views\Device\Export.cshtml" + , Tuple.Create(Tuple.Create("", 4660), Tuple.Create(optionItem.PropertyName #line default #line hidden -, 5437), false) +, 4660), false) ); WriteLiteral(">"); - #line 88 "..\..\Views\Device\Export.cshtml" + #line 70 "..\..\Views\Device\Export.cshtml" Write(optionItem.DisplayName); @@ -530,7 +471,7 @@ WriteLiteral(">"); WriteLiteral("\r\n"); - #line 89 "..\..\Views\Device\Export.cshtml" + #line 71 "..\..\Views\Device\Export.cshtml" } @@ -546,7 +487,7 @@ WriteLiteral(@" "); - #line 97 "..\..\Views\Device\Export.cshtml" + #line 79 "..\..\Views\Device\Export.cshtml" } @@ -554,50 +495,55 @@ WriteLiteral(@" #line hidden WriteLiteral("
\r\n \r\n"); -WriteLiteral(" +"); + + + #line 185 "..\..\Views\Device\Export.cshtml" +} + + + #line default + #line hidden +WriteLiteral("\r\n

Device Exporting devices...

\r\n\r\n\r\n Export Devices\r\n\r\n"); + } } }