Feature: MS Excel (xlsx) Import/Export

Microsoft Excel files can be used to import/export devices. Several
import bugs were also fixed in the process.
This commit is contained in:
Gary Sharp
2017-03-25 15:37:28 +11:00
parent ed66f4f285
commit 5ce9e51ae7
51 changed files with 1959 additions and 1083 deletions
@@ -2,7 +2,7 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.34014
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
@@ -27,7 +27,6 @@ namespace Disco.Web.Views.Device
using System.Web.UI;
using System.Web.WebPages;
using Disco;
using Disco.BI.Extensions;
using Disco.Models.Repository;
using Disco.Services;
using Disco.Services.Authorization;
@@ -49,7 +48,7 @@ namespace Disco.Web.Views.Device
Authorization.Require(Claims.Device.Actions.Import);
ViewBag.Title = Html.ToBreadcrumb("Devices", MVC.Device.Index(), "Import Devices", MVC.Device.Import(), string.Format("File: {0}", Model.Context.Filename));
ViewBag.Title = Html.ToBreadcrumb("Devices", MVC.Device.Index(), "Import Devices", MVC.Device.Import(), string.Format("File: {0}", Model.Context.DatasetName));
#line default
@@ -68,7 +67,7 @@ WriteLiteral(">\r\n\r\n <h2>Define Import Columns</h2>\r\n\r\n");
#line hidden
#line 11 "..\..\Views\Device\ImportHeaders.cshtml"
if (Model.Context.RawData.Count > 10)
if (Model.Context.RecordCount > 10)
{
@@ -82,7 +81,7 @@ WriteLiteral(">");
#line 13 "..\..\Views\Device\ImportHeaders.cshtml"
Write(Model.Context.RawData.Count);
Write(Model.Context.RecordCount);
#line default
@@ -120,7 +119,7 @@ WriteLiteral(">\r\n <thead>\r\n <tr>\r\n");
#line hidden
#line 22 "..\..\Views\Device\ImportHeaders.cshtml"
foreach (var header in Model.Context.Header.Select((h, i) => Tuple.Create(h, i)))
foreach (var header in Model.Context.Columns)
{
@@ -132,29 +131,29 @@ WriteLiteral(" data-headerindex=\"");
#line 24 "..\..\Views\Device\ImportHeaders.cshtml"
Write(header.Item2);
Write(header.Index);
#line default
#line hidden
WriteLiteral("\"");
WriteAttribute("class", Tuple.Create(" class=\"", 984), Tuple.Create("\"", 1030)
, Tuple.Create(Tuple.Create("", 992), Tuple.Create("header", 992), true)
WriteAttribute("class", Tuple.Create(" class=\"", 947), Tuple.Create("\"", 986)
, Tuple.Create(Tuple.Create("", 955), Tuple.Create("header", 955), true)
#line 24 "..\..\Views\Device\ImportHeaders.cshtml"
, Tuple.Create(Tuple.Create("", 998), Tuple.Create<System.Object, System.Int32>(header.Item1.Item2.ToString()
, Tuple.Create(Tuple.Create("", 961), Tuple.Create<System.Object, System.Int32>(header.Type.ToString()
#line default
#line hidden
, 998), false)
, 961), false)
);
WriteLiteral(">");
#line 24 "..\..\Views\Device\ImportHeaders.cshtml"
Write(header.Item1.Item1);
Write(header.Name);
#line default
@@ -178,7 +177,7 @@ WriteLiteral(" </tr>\r\n <tr>\r\n");
#line hidden
#line 28 "..\..\Views\Device\ImportHeaders.cshtml"
foreach (var header in Model.Context.Header.Select((h, i) => Tuple.Create(h, i)))
foreach (var header in Model.Context.Columns)
{
@@ -190,22 +189,22 @@ WriteLiteral(" data-headerindex=\"");
#line 30 "..\..\Views\Device\ImportHeaders.cshtml"
Write(header.Item2);
Write(header.Index);
#line default
#line hidden
WriteLiteral("\"");
WriteAttribute("class", Tuple.Create(" class=\"", 1313), Tuple.Create("\"", 1359)
, Tuple.Create(Tuple.Create("", 1321), Tuple.Create("header", 1321), true)
WriteAttribute("class", Tuple.Create(" class=\"", 1226), Tuple.Create("\"", 1265)
, Tuple.Create(Tuple.Create("", 1234), Tuple.Create("header", 1234), true)
#line 30 "..\..\Views\Device\ImportHeaders.cshtml"
, Tuple.Create(Tuple.Create("", 1327), Tuple.Create<System.Object, System.Int32>(header.Item1.Item2.ToString()
, Tuple.Create(Tuple.Create("", 1240), Tuple.Create<System.Object, System.Int32>(header.Type.ToString()
#line default
#line hidden
, 1327), false)
, 1240), false)
);
WriteLiteral(">\r\n <ul");
@@ -216,7 +215,7 @@ WriteLiteral(" data-headerindex=\"");
#line 31 "..\..\Views\Device\ImportHeaders.cshtml"
Write(header.Item2);
Write(header.Index);
#line default
@@ -227,7 +226,7 @@ WriteLiteral(" data-headertype=\"");
#line 31 "..\..\Views\Device\ImportHeaders.cshtml"
Write(header.Item1.Item2.ToString());
Write(header.Type.ToString());
#line default
@@ -246,7 +245,7 @@ WriteLiteral(">");
#line 32 "..\..\Views\Device\ImportHeaders.cshtml"
Write(Model.HeaderTypes.FirstOrDefault(h => h.Item1 == header.Item1.Item2).Item2);
Write(Model.HeaderTypes.FirstOrDefault(h => h.Item1 == header.Type).Item2);
#line default
@@ -322,35 +321,38 @@ WriteLiteral(" </tr>\r\n </thead>\r\n <tbod
#line hidden
#line 46 "..\..\Views\Device\ImportHeaders.cshtml"
foreach (var record in Model.Context.RawData.Take(10))
using (var dataReader = Model.Context.GetDataReader())
{
for (int r = 0; r < Math.Min(10, Model.Context.RecordCount); r++)
{
dataReader.Read();
#line default
#line hidden
WriteLiteral(" <tr>\r\n");
WriteLiteral(" <tr>\r\n");
#line 49 "..\..\Views\Device\ImportHeaders.cshtml"
#line 52 "..\..\Views\Device\ImportHeaders.cshtml"
#line default
#line hidden
#line 49 "..\..\Views\Device\ImportHeaders.cshtml"
foreach (var field in record.Select((h, i) => Tuple.Create(h, i)))
{
#line 52 "..\..\Views\Device\ImportHeaders.cshtml"
for (int c = 0; c < Model.Context.ColumnCount; c++)
{
#line default
#line hidden
WriteLiteral(" <td");
WriteLiteral(" <td");
WriteLiteral(" data-headerindex=\"");
#line 51 "..\..\Views\Device\ImportHeaders.cshtml"
Write(field.Item2);
#line 54 "..\..\Views\Device\ImportHeaders.cshtml"
Write(c);
#line default
@@ -360,8 +362,8 @@ WriteLiteral("\"");
WriteLiteral(">");
#line 51 "..\..\Views\Device\ImportHeaders.cshtml"
Write(field.Item1);
#line 54 "..\..\Views\Device\ImportHeaders.cshtml"
Write(dataReader.GetString(c));
#line default
@@ -369,16 +371,17 @@ WriteLiteral(">");
WriteLiteral("</td>\r\n");
#line 52 "..\..\Views\Device\ImportHeaders.cshtml"
}
#line 55 "..\..\Views\Device\ImportHeaders.cshtml"
}
#line default
#line hidden
WriteLiteral(" </tr>\r\n");
WriteLiteral(" </tr>\r\n");
#line 54 "..\..\Views\Device\ImportHeaders.cshtml"
#line 57 "..\..\Views\Device\ImportHeaders.cshtml"
}
}
@@ -391,13 +394,13 @@ WriteLiteral(" class=\"actionBar\"");
WriteLiteral(">\r\n");
#line 59 "..\..\Views\Device\ImportHeaders.cshtml"
#line 63 "..\..\Views\Device\ImportHeaders.cshtml"
#line default
#line hidden
#line 59 "..\..\Views\Device\ImportHeaders.cshtml"
#line 63 "..\..\Views\Device\ImportHeaders.cshtml"
using (Html.BeginForm(MVC.API.Device.ImportParse(Model.Context.SessionId, null)))
{
@@ -415,7 +418,7 @@ WriteLiteral(" class=\"button\"");
WriteLiteral(">Parse Device Import</a> \r\n");
#line 62 "..\..\Views\Device\ImportHeaders.cshtml"
#line 66 "..\..\Views\Device\ImportHeaders.cshtml"
}
@@ -439,13 +442,13 @@ WriteLiteral("></i>Parsing device import...</h4>\r\n</div>\r\n<script>\r\n $(
" var headerTypes = {\r\n");
#line 71 "..\..\Views\Device\ImportHeaders.cshtml"
#line 75 "..\..\Views\Device\ImportHeaders.cshtml"
#line default
#line hidden
#line 71 "..\..\Views\Device\ImportHeaders.cshtml"
#line 75 "..\..\Views\Device\ImportHeaders.cshtml"
foreach (var h in Model.HeaderTypes)
{
@@ -457,7 +460,7 @@ WriteLiteral(" ");
WriteLiteral("\'");
#line 73 "..\..\Views\Device\ImportHeaders.cshtml"
#line 77 "..\..\Views\Device\ImportHeaders.cshtml"
Write(h.Item1);
@@ -466,7 +469,7 @@ WriteLiteral("\'");
WriteLiteral("\': \'");
#line 73 "..\..\Views\Device\ImportHeaders.cshtml"
#line 77 "..\..\Views\Device\ImportHeaders.cshtml"
Write(h.Item2);
@@ -477,7 +480,7 @@ WriteLiteral("\',");
WriteLiteral("\r\n");
#line 74 "..\..\Views\Device\ImportHeaders.cshtml"
#line 78 "..\..\Views\Device\ImportHeaders.cshtml"
}