| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301 | 
							- using System;
 
- using System.Collections.Generic;
 
- using System.Diagnostics;
 
- using System.Diagnostics.CodeAnalysis;
 
- using System.IO;
 
- using System.Linq;
 
- using System.Threading;
 
- using System.Windows;
 
- using System.Windows.Forms.Design;
 
- using System.Windows.Media.Imaging;
 
- using InABox.Core;
 
- using InABox.Scripting;
 
- using InABox.WPF;
 
- using Microsoft.CodeAnalysis.CSharp.Syntax;
 
- using Microsoft.Win32;
 
- namespace InABox.DynamicGrid
 
- {
 
-     public delegate bool OnImportItem(object o);
 
-     public class CustomiseImportArgs
 
-     {
 
-         public string FileName { get; set; }
 
-     }
 
-     public delegate void OnCustomiseImport(object sender, CustomiseImportArgs e);
 
-     public class DynamicImportGrid : DynamicDataGrid<Importer>
 
-     {
 
-         private static readonly BitmapImage run = Wpf.Resources.rightarrow.AsBitmapImage();
 
-         private DynamicImageColumn ImportColumn;
 
-         private bool _canImport = true;
 
-         public bool CanImport
 
-         {
 
-             get => _canImport;
 
-             set
 
-             {
 
-                 if(_canImport != value)
 
-                 {
 
-                     _canImport = value;
 
-                     ImportColumn.Position = _canImport ? DynamicActionColumnPosition.End : DynamicActionColumnPosition.Hidden;
 
-                     Refresh(true, false);
 
-                 }
 
-             }
 
-         }
 
-         protected override void Init()
 
-         {
 
-             base.Init();
 
-             ImportColumn = new DynamicImageColumn(ImportImage, ImportAction);
 
-             ActionColumns.Add(ImportColumn);
 
-             HiddenColumns.Add(x => x.EntityName);
 
-             HiddenColumns.Add(x => x.ImporterDescription);
 
-             HiddenColumns.Add(x => x.FileName);
 
-             HiddenColumns.Add(x => x.Definition);
 
-             HiddenColumns.Add(x => x.HasHeader);
 
-             HiddenColumns.Add(x => x.HeaderRows);
 
-             HiddenColumns.Add(x => x.ColumnWidths);
 
-             HiddenColumns.Add(x => x.Script);
 
-             HiddenColumns.Add(x => x.Settings);
 
-         }
 
-         protected override void DoReconfigure(DynamicGridOptions options)
 
-         {
 
-             base.DoReconfigure(options);
 
-             options.RecordCount = true;
 
-             options.ShowHelp = true;
 
-         }
 
-         public Type EntityType { get; set; }
 
-         public Guid EntityID { get; set; }
 
-         public event OnImportItem OnImportItem;
 
-         public event OnCustomiseImport OnCustomiseImport;
 
-         public event ImportSaveEvent OnSave;
 
-         public event ImportLoadEvent OnLoad;
 
-         protected override void ShowHelp(string slug)
 
-         {
 
-             base.ShowHelp("Import_Data");
 
-         }
 
-         private BitmapImage? ImportImage(CoreRow? arg)
 
-         {
 
-             return arg != null ? run : null;
 
-         }
 
-         public static bool CreateImporter(Importer importer,
 
-             [NotNullWhen(true)]
 
-             ref string? filename,
 
-             [NotNullWhen(true)]
 
-             out IImporter? iimporter,
 
-             Action<CustomiseImportArgs>? customiseImport = null,
 
-             Func<object, bool>? onImport = null)
 
-         {
 
-             iimporter = null;
 
-             var definition =
 
-                 ImportFactory.Definitions.FirstOrDefault(x => x.Description.Equals(importer.ImporterDescription));
 
-             var entityType = CoreUtils.GetEntity(importer.EntityName);
 
-             if (definition != null)
 
-             {
 
-                 ScriptDocument? helper = null;
 
-                 try
 
-                 {
 
-                     if (!importer.Script.IsNullOrWhiteSpace())
 
-                     {
 
-                         helper = new ScriptDocument(importer.Script);
 
-                         if (!helper.Compile())
 
-                         {
 
-                             MessageBox.Show("Unable to Compile Import Helper Script!");
 
-                             return false;
 
-                         }
 
-                     }
 
-                 }
 
-                 catch (Exception e)
 
-                 {
 
-                     Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
 
-                 }
 
-                 if(filename is null)
 
-                 {
 
-                     var fullFileName = importer.FileName;
 
-                     var path = Path.GetDirectoryName(fullFileName);
 
-                     var extension = Path.GetExtension(fullFileName);
 
-                     var args = new CustomiseImportArgs { FileName = Path.GetFileNameWithoutExtension(fullFileName) };
 
-                     customiseImport?.Invoke(args);
 
-                     var filename2 = CoreUtils.SanitiseFileName(args.FileName);
 
-                     var dlg = new OpenFileDialog
 
-                     {
 
-                         Filter = definition.Filter,
 
-                         FileName = Path.Combine(path, filename2) + (extension.StartsWith(".") ? "" : ".") + extension
 
-                     };
 
-                     if (!string.IsNullOrWhiteSpace(dlg.FileName) && Directory.Exists(Path.GetDirectoryName(dlg.FileName)))
 
-                         dlg.InitialDirectory = Path.GetDirectoryName(dlg.FileName);
 
-                     if(dlg.ShowDialog() == true)
 
-                     {
 
-                         filename = dlg.FileName;
 
-                     }
 
-                     else
 
-                     {
 
-                         return false;
 
-                     }
 
-                 }
 
-                 else
 
-                 {
 
-                     var path = Path.GetDirectoryName(filename);
 
-                     var extension = Path.GetExtension(filename);
 
-                     var args = new CustomiseImportArgs { FileName = Path.GetFileNameWithoutExtension(filename) };
 
-                     customiseImport?.Invoke(args);
 
-                     var filename2 = CoreUtils.SanitiseFileName(args.FileName);
 
-                     filename = Path.ChangeExtension(Path.Combine(path, filename2), extension);
 
-                 }
 
-                 iimporter = ImportFactory.Create(definition, entityType, importer);
 
-                 iimporter.BeforeProcess += (sender, values) =>
 
-                 {
 
-                     if (helper != null)
 
-                         return helper.Execute("Module", "BeforeProcess", new object[] { values });
 
-                     return true;
 
-                 };
 
-                 iimporter.AfterProcess += (sender, item, values) =>
 
-                 {
 
-                     var bOK = true;
 
-                     if (helper != null)
 
-                         bOK = helper.Execute("Module", "AfterProcess", new[] { item, values });
 
-                     bOK = !bOK || onImport is null || onImport.Invoke(item);
 
-                     return bOK;
 
-                 };
 
-                 var mappingDefinitions = importer.Definition;
 
-                 var mappings = Serialization.Deserialize<List<ImportMapping>>(mappingDefinitions);
 
-                 iimporter.Mappings.AddRange(mappings);
 
-                 return true;
 
-             }
 
-             else
 
-             {
 
-                 return false;
 
-             }
 
-         }
 
-         private bool ImportAction(CoreRow? arg)
 
-         {
 
-             if (arg != null)
 
-             {
 
-                 var importer = arg.ToObject<Importer>();
 
-                 string? filename = null;
 
-                 if (CreateImporter(importer,
 
-                     ref filename,
 
-                     out var iimporter,
 
-                     (args) => OnCustomiseImport?.Invoke(this, args),
 
-                     (o) => OnImportItem?.Invoke(o) != false))
 
-                 {
 
-                     iimporter.OnLoad += OnLoad;
 
-                     iimporter.OnSave += OnSave;
 
-                     string result = null;
 
-                     bool bSuccess = false;
 
-                     var LogFile = Path.ChangeExtension(filename, ".log");
 
-                     
 
-                     Progress.ShowModal("Importing Data", (progress) =>
 
-                     {
 
-                         iimporter.OnNotify += (o, msg) => progress.Report(msg);
 
-                         using var stream = new FileStream(filename, FileMode.Open, FileAccess.Read);
 
-                         Progress.SetMessage("Opening File");
 
-                         if (iimporter.Open(stream))
 
-                         {
 
-                             if (iimporter.ReadHeader())
 
-                             {
 
-                                 var mismatches = iimporter.Mappings.Where(x =>
 
-                                     !string.IsNullOrWhiteSpace(x.Field) &&
 
-                                     !iimporter.Fields.Contains(x.Field)
 
-                                 ).Select(x => x.Field).ToArray();
 
-                                 if (!mismatches.Any())
 
-                                 {
 
-                                     var imported = iimporter.Import();
 
-                                     File.AppendAllLines(LogFile, iimporter.Log.ToArray());
 
-                                     result = $"Imported {imported} records!";
 
-                                     bSuccess = true;
 
-                                 }
 
-                                 else
 
-                                 {
 
-                                     result = "Import Mappings do not match file headers!\n\n- " + string.Join("\n- ", mismatches);
 
-                                 }
 
-                             }
 
-                             else
 
-                             {
 
-                                 result = $"Unable to Read Headers from {Path.GetFileName(filename)}";
 
-                             }
 
-                         }
 
-                         else
 
-                             result = $"Unable to Open {Path.GetFileName(filename)}";
 
-                         iimporter.Close();
 
-                     });
 
-                     MessageBox.Show(result, (bSuccess ? "Success" : "Error"));
 
-                     if (File.Exists(LogFile))
 
-                         Process.Start(new ProcessStartInfo(LogFile) { UseShellExecute = true });
 
-                 }
 
-             }
 
-             return false;
 
-         }
 
-         private bool Importer_BeforeProcess(object sender, Dictionary<string, string> values)
 
-         {
 
-             return true;
 
-             //throw new NotImplementedException();
 
-         }
 
-         protected override void Reload(
 
-             Filters<Importer> criteria, Columns<Importer> columns, ref SortOrder<Importer>? sort, 
 
-             CancellationToken token, Action<CoreTable?, Exception?> action)
 
-         {
 
-             criteria.Add(new Filter<Importer>(x => x.EntityName).IsEqualTo(EntityType.EntityName()));
 
-             if (EntityID != Guid.Empty)
 
-                 criteria.Add(new Filter<Importer>(x => x.EntityID).IsEqualTo(EntityID));
 
-             base.Reload(criteria, columns, ref sort, token, action);
 
-         }
 
-         public override Importer CreateItem()
 
-         {
 
-             var result = base.CreateItem();
 
-             result.EntityName = EntityType.EntityName();
 
-             result.EntityID = EntityID;
 
-             return result;
 
-         }
 
-         public override bool EditItems(Importer[] items, Func<Type, CoreTable?>? PageDataHandler = null, bool PreloadPages = false)
 
-         {
 
-             if (items.Length != 1)
 
-             {
 
-                 MessageBox.Show("Please select a single item to edit!");
 
-                 return false;
 
-             }
 
-             var form = new DynamicImportForm(items[0]);
 
-             if (form.ShowDialog() == true)
 
-             {
 
-                 SaveItem(items[0]);
 
-                 return true;
 
-             }
 
-             return false;
 
-         }
 
-     }
 
- }
 
 
  |