Compare commits
	
		
			14 Commits
		
	
	
		
			5c9f0d1aff
			...
			06-05-a
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 51878972c6 | |||
| 6f52566fc2 | |||
| 2afb312065 | |||
| 4c2bef71ec | |||
| b824c4ba36 | |||
| 1ad6246b8d | |||
| 478aecf2c8 | |||
| fe3292133e | |||
| e7b721fdb3 | |||
| da3e839a48 | |||
| 6737ddfb59 | |||
| 3aed250488 | |||
| f53ae8c1c8 | |||
| 6317c385f6 | 
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						@ -343,4 +343,6 @@ ASALocalRun/
 | 
			
		||||
/wwwroot/lib/*
 | 
			
		||||
 | 
			
		||||
.kanbn
 | 
			
		||||
Tests/.kanbn
 | 
			
		||||
Tests/.kanbn
 | 
			
		||||
 | 
			
		||||
/Wafer-Counter/.vscode/.UserSecrets/secrets.json
 | 
			
		||||
							
								
								
									
										6
									
								
								.vscode/tasks.json
									
									
									
									
										vendored
									
									
								
							
							
						
						@ -217,12 +217,6 @@
 | 
			
		||||
                    "endsPattern": "^.*Application started.*"
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "label": "File-Folder-Helper AOT s M Self .Kanbn Tasks",
 | 
			
		||||
            "type": "shell",
 | 
			
		||||
            "command": "L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net8.0/win-x64/publish/File-Folder-Helper.exe s M L:/DevOps/Mesa_FI/OI-Metrology -s L:/DevOps/Mesa_FI/OI-Metrology/.kanbn/tasks",
 | 
			
		||||
            "problemMatcher": []
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										35
									
								
								Server/.vscode/tasks.json
									
									
									
									
										vendored
									
									
								
							
							
						
						@ -66,6 +66,16 @@
 | 
			
		||||
            ],
 | 
			
		||||
            "problemMatcher": "$msCompile"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "label": "Format-Whitespace",
 | 
			
		||||
            "command": "dotnet",
 | 
			
		||||
            "type": "process",
 | 
			
		||||
            "args": [
 | 
			
		||||
                "format",
 | 
			
		||||
                "whitespace"
 | 
			
		||||
            ],
 | 
			
		||||
            "problemMatcher": "$msCompile"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "label": "publish",
 | 
			
		||||
            "command": "dotnet",
 | 
			
		||||
@ -85,6 +95,24 @@
 | 
			
		||||
            ],
 | 
			
		||||
            "problemMatcher": "$msCompile"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "label": "Publish AOT",
 | 
			
		||||
            "command": "dotnet",
 | 
			
		||||
            "type": "process",
 | 
			
		||||
            "args": [
 | 
			
		||||
                "publish",
 | 
			
		||||
                "${workspaceFolder}/OI.Metrology.Server.csproj",
 | 
			
		||||
                "/property:GenerateFullPaths=true",
 | 
			
		||||
                "/consoleloggerparameters:NoSummary",
 | 
			
		||||
                "--configuration",
 | 
			
		||||
                "Release",
 | 
			
		||||
                "--runtime",
 | 
			
		||||
                "win-x64",
 | 
			
		||||
                "-p:PublishAot=true",
 | 
			
		||||
                "/property:GenerateFullPaths=true"
 | 
			
		||||
            ],
 | 
			
		||||
            "problemMatcher": "$msCompile"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "label": "old-watch",
 | 
			
		||||
            "command": "dotnet",
 | 
			
		||||
@ -134,7 +162,12 @@
 | 
			
		||||
        {
 | 
			
		||||
            "label": "File-Folder-Helper AOT s X Server",
 | 
			
		||||
            "type": "shell",
 | 
			
		||||
            "command": "L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net8.0/win-x64/publish/File-Folder-Helper.exe s X L:/DevOps/Mesa_FI/OI-Metrology Day-Helper-2024-01-08 L:/DevOps/Mesa_FI/OI-Metrology/Server",
 | 
			
		||||
            "command": "L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net8.0/win-x64/publish/File-Folder-Helper.exe",
 | 
			
		||||
            "args": [
 | 
			
		||||
                "s",
 | 
			
		||||
                "X",
 | 
			
		||||
                "L:/DevOps/Mesa_FI/OI-Metrology Day-Helper-2024-01-08 L:/DevOps/Mesa_FI/OI-Metrology/Server"
 | 
			
		||||
            ],
 | 
			
		||||
            "problemMatcher": []
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
@ -38,4 +38,10 @@ public class AwaitingDispoController : Controller, IAwaitingDispoController<IAct
 | 
			
		||||
        else
 | 
			
		||||
            return StatusCode(444);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // this endpoint is used to clear the ReviewDate column, causing the header to show up again
 | 
			
		||||
    [HttpGet("/api/awaitingdispo/{toolTypeId}/header-attachment-id")]
 | 
			
		||||
    public IActionResult GetHeaderAttachmentID(int toolTypeId, [FromQuery] long headerid) =>
 | 
			
		||||
        Content(_MetrologyRepository.GetHeaderAttachmentID(toolTypeId, headerid).ToString());
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -4,6 +4,7 @@ namespace OI.Metrology.Server.ApiControllers;
 | 
			
		||||
 | 
			
		||||
using OI.Metrology.Shared.DataModels;
 | 
			
		||||
using OI.Metrology.Shared.Models.Stateless;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Text.Json;
 | 
			
		||||
 | 
			
		||||
[Route("api/[controller]")]
 | 
			
		||||
@ -11,9 +12,13 @@ public class ExportController : Controller, IExportController<IActionResult>
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    private readonly IExportRepository _ExportRepository;
 | 
			
		||||
    private readonly IMetrologyRepository _MetrologyRepository;
 | 
			
		||||
 | 
			
		||||
    public ExportController(IExportRepository exportRepository) =>
 | 
			
		||||
    public ExportController(IExportRepository exportRepository, IMetrologyRepository metrologyRepository)
 | 
			
		||||
    {
 | 
			
		||||
        _ExportRepository = exportRepository;
 | 
			
		||||
        _MetrologyRepository = metrologyRepository;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static string? GetJson(Stream stream)
 | 
			
		||||
    {
 | 
			
		||||
@ -79,4 +84,21 @@ public class ExportController : Controller, IExportController<IActionResult>
 | 
			
		||||
    public IActionResult PostProcessDataStandardFormat() =>
 | 
			
		||||
        Content(_ExportRepository.GetProcessDataStandardFormat(GetHeaderCommon(Request.Body)));
 | 
			
		||||
 | 
			
		||||
    [HttpGet]
 | 
			
		||||
    [Route("{toolTypeId}/export")]
 | 
			
		||||
    public IActionResult GetExportData(int toolTypeId, [FromQuery] string? datebegin, [FromQuery] string? dateend)
 | 
			
		||||
    {
 | 
			
		||||
        Result<DataTable> r = _ExportRepository.GetExportData(_MetrologyRepository, toolTypeId, datebegin, dateend);
 | 
			
		||||
        string json = Newtonsoft.Json.JsonConvert.SerializeObject(r);
 | 
			
		||||
        return Content(json);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [HttpGet]
 | 
			
		||||
    [Route("{toolTypeId}/csv")]
 | 
			
		||||
    public IActionResult GetCSVExport(int toolTypeId, [FromQuery] string? datebegin, [FromQuery] string? dateend, [FromQuery] string? filename)
 | 
			
		||||
    {
 | 
			
		||||
        string r = _ExportRepository.GetCSVExport(_MetrologyRepository, toolTypeId, datebegin, dateend);
 | 
			
		||||
        return Content(r);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -22,7 +22,7 @@ public class FileShareController : Controller, IFileShareController<IResult>
 | 
			
		||||
    [HttpGet("move-file")]
 | 
			
		||||
    public IResult MoveFile(string from, string to)
 | 
			
		||||
    {
 | 
			
		||||
        _FileShareRepository.CopyFile(from, to);
 | 
			
		||||
        _FileShareRepository.MoveFile(from, to);
 | 
			
		||||
        return Results.Ok();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,7 @@ using OI.Metrology.Shared.Models;
 | 
			
		||||
using OI.Metrology.Shared.Models.Stateless;
 | 
			
		||||
using OI.Metrology.Shared.Services;
 | 
			
		||||
using System.Net;
 | 
			
		||||
using System.Text.Json;
 | 
			
		||||
 | 
			
		||||
namespace OI.Metrology.Server.ApiControllers;
 | 
			
		||||
 | 
			
		||||
@ -29,22 +30,9 @@ public partial class InboundController : ControllerBase, IInboundController<IAct
 | 
			
		||||
        _MetrologyRepository = metrologyRepository;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static string? GetJson(Stream stream)
 | 
			
		||||
    {
 | 
			
		||||
        string? result;
 | 
			
		||||
        if (!stream.CanRead)
 | 
			
		||||
            result = null;
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            Task<string> task = new StreamReader(stream).ReadToEndAsync();
 | 
			
		||||
            result = task.Result;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [HttpPost]
 | 
			
		||||
    [Route("{tooltype}")]
 | 
			
		||||
    public IActionResult Post(string tooltype)
 | 
			
		||||
    public IActionResult Post(string tooltype, JsonElement? jsonElement)
 | 
			
		||||
    {
 | 
			
		||||
        IPAddress? remoteIP = HttpContext.Connection.RemoteIpAddress;
 | 
			
		||||
        if (!_InboundRepository.IsIPAddressAllowed(_AppSettings.InboundApiAllowedIPList, remoteIP))
 | 
			
		||||
@ -54,8 +42,7 @@ public partial class InboundController : ControllerBase, IInboundController<IAct
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            string? json = GetJson(Request.Body);
 | 
			
		||||
            DataResponse dataResponse = _InboundRepository.Data(_MetrologyRepository, _InboundDataService, tooltype, json);
 | 
			
		||||
            DataResponse dataResponse = _InboundRepository.Data(_MetrologyRepository, _InboundDataService, tooltype, jsonElement);
 | 
			
		||||
            if (dataResponse.Errors.Count == 0)
 | 
			
		||||
                return Ok(dataResponse);
 | 
			
		||||
            else
 | 
			
		||||
@ -65,7 +52,7 @@ public partial class InboundController : ControllerBase, IInboundController<IAct
 | 
			
		||||
 | 
			
		||||
    [HttpPost]
 | 
			
		||||
    [Route("{tooltype}/attachment")]
 | 
			
		||||
    public IActionResult AttachFile(string tooltype, [FromQuery] long headerid, [FromQuery] string datauniqueid = "")
 | 
			
		||||
    public IActionResult AttachFile(string tooltype, Attachment? attachment)
 | 
			
		||||
    {
 | 
			
		||||
        IPAddress? remoteIP = HttpContext.Connection.RemoteIpAddress;
 | 
			
		||||
        if (!_InboundRepository.IsIPAddressAllowed(_AppSettings.InboundApiAllowedIPList, remoteIP))
 | 
			
		||||
@ -75,16 +62,8 @@ public partial class InboundController : ControllerBase, IInboundController<IAct
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            if (Request.Form is null)
 | 
			
		||||
                return BadRequest($"Invalid form");
 | 
			
		||||
            if (Request.Form.Files.Count != 1)
 | 
			
		||||
                return BadRequest($"Invalid file count");
 | 
			
		||||
            IFormFile formFile = Request.Form.Files[0];
 | 
			
		||||
            string? message = _InboundRepository.AttachFile(_MetrologyRepository, _AttachmentsService, tooltype, headerid, datauniqueid, formFile.FileName, formFile);
 | 
			
		||||
            if (message is null)
 | 
			
		||||
                return Ok();
 | 
			
		||||
            else
 | 
			
		||||
                return BadRequest(message);
 | 
			
		||||
            _InboundRepository.AttachFile(_MetrologyRepository, _AttachmentsService, tooltype, attachment);
 | 
			
		||||
            return Ok();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -79,4 +79,8 @@ public class InfinityQSV4Controller : Controller, IInfinityQSV4Controller<IActio
 | 
			
		||||
    public IActionResult GetProductionSpecification(string part) =>
 | 
			
		||||
       Content(_InfinityQSRepositoryV4.GetProductionSpecification(part));
 | 
			
		||||
 | 
			
		||||
    [HttpGet("{process}/last-group-id-with-value")]
 | 
			
		||||
    public IActionResult GetLastGroupIdWithValue(string process, string? part, int? test) =>
 | 
			
		||||
       Content(_InfinityQSRepositoryV4.GetLastGroupIdWithValue(process, part, test));
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -66,23 +66,6 @@ public class ToolTypesController : Controller, IToolTypesController<IActionResul
 | 
			
		||||
        return Content(json);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [HttpGet]
 | 
			
		||||
    [Route("{toolTypeId}/export")]
 | 
			
		||||
    public IActionResult GetExportData(int toolTypeId, [FromQuery] string? datebegin, [FromQuery] string? dateend)
 | 
			
		||||
    {
 | 
			
		||||
        Shared.DataModels.Result<DataTable> r = _ToolTypesRepository.GetExportData(_MetrologyRepo, toolTypeId, datebegin, dateend);
 | 
			
		||||
        string json = JsonConvert.SerializeObject(r);
 | 
			
		||||
        return Content(json);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [HttpGet]
 | 
			
		||||
    [Route("{toolTypeId}/csv")]
 | 
			
		||||
    public IActionResult GetCSVExport(int toolTypeId, [FromQuery] string? datebegin, [FromQuery] string? dateend, [FromQuery] string? filename)
 | 
			
		||||
    {
 | 
			
		||||
        byte[] r = _ToolTypesRepository.GetCSVExport(_MetrologyRepo, toolTypeId, datebegin, dateend);
 | 
			
		||||
        return File(r, "application/octet-stream", filename);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [HttpGet]
 | 
			
		||||
    [Route("{toolTypeId}/{tabletype}/files/{attachmentId}/{filename}")]
 | 
			
		||||
    public IActionResult GetAttachment(int toolTypeId, string tabletype, string attachmentId, string filename)
 | 
			
		||||
 | 
			
		||||
@ -1,160 +0,0 @@
 | 
			
		||||
using Infineon.Monitoring.MonA;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc.Filters;
 | 
			
		||||
using OI.Metrology.Server.Models;
 | 
			
		||||
using OI.Metrology.Shared.DataModels;
 | 
			
		||||
using OI.Metrology.Shared.Models.Stateless;
 | 
			
		||||
using OI.Metrology.Shared.ViewModels;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
namespace OI.Metrology.Server.Controllers;
 | 
			
		||||
 | 
			
		||||
public class ExportController : Controller
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    private readonly ILogger _Logger;
 | 
			
		||||
    private readonly AppSettings _AppSettings;
 | 
			
		||||
    private readonly bool _IsTestDatabase;
 | 
			
		||||
    private readonly IMetrologyRepository _MetrologyRepository;
 | 
			
		||||
 | 
			
		||||
    public ExportController(AppSettings appSettings, ILogger<ExportController> logger, IMetrologyRepository metrologyRepository)
 | 
			
		||||
    {
 | 
			
		||||
        _Logger = logger;
 | 
			
		||||
        _AppSettings = appSettings;
 | 
			
		||||
        _MetrologyRepository = metrologyRepository;
 | 
			
		||||
        _IsTestDatabase = appSettings.ConnectionString.Contains("test", StringComparison.InvariantCultureIgnoreCase);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public override void OnActionExecuted(ActionExecutedContext context)
 | 
			
		||||
    {
 | 
			
		||||
        base.OnActionExecuted(context);
 | 
			
		||||
        ViewBag.IsTestDatabase = _IsTestDatabase;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private string GetApiUrl() => string.IsNullOrEmpty(_AppSettings.ApiUrl) ? Url.Content("~/") : _AppSettings.ApiUrl[0] == '~' ? Url.Content(_AppSettings.ApiUrl) : _AppSettings.ApiUrl;
 | 
			
		||||
 | 
			
		||||
    [HttpGet]
 | 
			
		||||
    [Route("/Export")]
 | 
			
		||||
    public ActionResult Index()
 | 
			
		||||
    {
 | 
			
		||||
        Export model = new()
 | 
			
		||||
        {
 | 
			
		||||
            StartTime = DateTime.Now.AddMonths(-1),
 | 
			
		||||
            EndTime = DateTime.Now
 | 
			
		||||
        };
 | 
			
		||||
        MonIn monIn = MonIn.GetInstance();
 | 
			
		||||
        _ = monIn.SendStatus(_AppSettings.MonASite, _AppSettings.MonAResource, "Heartbeat", State.Up);
 | 
			
		||||
        ViewBag.ApiUrl = GetApiUrl();
 | 
			
		||||
        return View(model);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [HttpPost]
 | 
			
		||||
    [Route("/ExportData")]
 | 
			
		||||
    public ActionResult ExportData(Export model)
 | 
			
		||||
    {
 | 
			
		||||
        ToolType? toolType = null;
 | 
			
		||||
        if (string.IsNullOrEmpty(model.ToolType))
 | 
			
		||||
            ModelState.AddModelError("Exception", "Invalid selection");
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            if (model.StartTime > model.EndTime)
 | 
			
		||||
                ModelState.AddModelError("EndTime", "End time must be after start time");
 | 
			
		||||
            IEnumerable<ToolType> toolTypes = _MetrologyRepository.GetToolTypes();
 | 
			
		||||
            toolType = toolTypes.Where(tt => tt.ID.ToString() == model.ToolType).SingleOrDefault();
 | 
			
		||||
            if (toolType is null)
 | 
			
		||||
                ModelState.AddModelError("ToolType", "Invalid selection");
 | 
			
		||||
            else if (string.IsNullOrWhiteSpace(toolType.ExportSPName))
 | 
			
		||||
                ModelState.AddModelError("ToolType", "Tool type is not exportable");
 | 
			
		||||
        }
 | 
			
		||||
        if (ModelState.IsValid)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                DateTime startDT = model.StartDate.Date.Add(model.StartTime.TimeOfDay);
 | 
			
		||||
                DateTime endDT = model.EndDate.Date.Add(model.EndTime.TimeOfDay);
 | 
			
		||||
 | 
			
		||||
                return DoCSVExport(toolType?.ToolTypeName, toolType?.ExportSPName, startDT, endDT);
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
                ModelState.AddModelError("Exception", "Error exporting data");
 | 
			
		||||
                ModelState.AddModelError("Exception", ex.Message);
 | 
			
		||||
                string errorMessage = $"Error exporting: {ex}";
 | 
			
		||||
                _Logger.LogError(message: errorMessage);
 | 
			
		||||
                MonIn monIn = MonIn.GetInstance();
 | 
			
		||||
                _ = monIn.SendStatus(_AppSettings.MonASite, _AppSettings.MonAResource, "Heartbeat", State.Warning);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        ViewBag.ApiUrl = GetApiUrl();
 | 
			
		||||
        return View("Index", model);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected ActionResult DoCSVExport(string? toolTypeName, string? spName, DateTime startTime, DateTime endTime)
 | 
			
		||||
    {
 | 
			
		||||
        string fileName = string.Format("Export_{0}_{1:yyyyMMddHHmm}_to_{2:yyyyMMddHHmm}.csv", toolTypeName, startTime, endTime);
 | 
			
		||||
        StringBuilder sb = new();
 | 
			
		||||
        if (spName is null)
 | 
			
		||||
            throw new NullReferenceException(nameof(spName));
 | 
			
		||||
        System.Data.DataTable dt = _MetrologyRepository.ExportData(spName, startTime, endTime);
 | 
			
		||||
        _ = sb.AppendLine(GetColumnHeaders(dt));
 | 
			
		||||
        foreach (System.Data.DataRow dr in dt.Rows)
 | 
			
		||||
            _ = sb.AppendLine(GetRowData(dr));
 | 
			
		||||
        byte[] contents = Encoding.UTF8.GetBytes(sb.ToString());
 | 
			
		||||
        return File(contents, "application/octet-stream", fileName);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected static string GetRowData(System.Data.DataRow dr)
 | 
			
		||||
    {
 | 
			
		||||
        StringBuilder r = new();
 | 
			
		||||
        for (int i = 0; i < dr.Table.Columns.Count; i++)
 | 
			
		||||
        {
 | 
			
		||||
            if (i > 0)
 | 
			
		||||
                _ = r.Append(',');
 | 
			
		||||
            object v = dr[i];
 | 
			
		||||
            if (!Convert.IsDBNull(v))
 | 
			
		||||
            {
 | 
			
		||||
                string? c = Convert.ToString(v);
 | 
			
		||||
                if (c is not null)
 | 
			
		||||
                    _ = r.Append(FormatForCSV(c));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return r.ToString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected static string GetColumnHeaders(System.Data.DataTable dt)
 | 
			
		||||
    {
 | 
			
		||||
        StringBuilder r = new();
 | 
			
		||||
        for (int i = 0; i < dt.Columns.Count; i++)
 | 
			
		||||
        {
 | 
			
		||||
            if (i > 0)
 | 
			
		||||
                _ = r.Append(',');
 | 
			
		||||
 | 
			
		||||
            _ = r.Append(FormatForCSV(dt.Columns[i].ColumnName.TrimEnd('_')));
 | 
			
		||||
        }
 | 
			
		||||
        return r.ToString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected static string FormatForCSV(string v)
 | 
			
		||||
    {
 | 
			
		||||
        bool doubleQuoted = false;
 | 
			
		||||
        StringBuilder r = new(v.Length + 2);
 | 
			
		||||
        if (v.StartsWith(' ') || v.EndsWith(' ') || v.Contains(',') || v.Contains('"'))
 | 
			
		||||
        {
 | 
			
		||||
            _ = r.Append('"');
 | 
			
		||||
            doubleQuoted = true;
 | 
			
		||||
        }
 | 
			
		||||
        foreach (char c in v)
 | 
			
		||||
        {
 | 
			
		||||
            _ = c switch
 | 
			
		||||
            {
 | 
			
		||||
                '\r' or '\n' => r.Append(' '),
 | 
			
		||||
                '"' => r.Append("\"\""),
 | 
			
		||||
                _ => r.Append(c),
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
        if (doubleQuoted)
 | 
			
		||||
            _ = r.Append('"');
 | 
			
		||||
        return r.ToString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -1,79 +0,0 @@
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc.Filters;
 | 
			
		||||
using OI.Metrology.Server.Models;
 | 
			
		||||
using OI.Metrology.Shared.Models.Stateless;
 | 
			
		||||
using OI.Metrology.Shared.ViewModels;
 | 
			
		||||
 | 
			
		||||
namespace OI.Metrology.Server.Controllers;
 | 
			
		||||
 | 
			
		||||
public class PagesController : Controller
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    private readonly bool _IsTestDatabase;
 | 
			
		||||
    private readonly AppSettings _AppSettings;
 | 
			
		||||
    private readonly IMetrologyRepository _MetrologyRepository;
 | 
			
		||||
 | 
			
		||||
    public PagesController(AppSettings appSettings, IMetrologyRepository metrologyRepository)
 | 
			
		||||
    {
 | 
			
		||||
        _AppSettings = appSettings;
 | 
			
		||||
        _MetrologyRepository = metrologyRepository;
 | 
			
		||||
        _IsTestDatabase = appSettings.ConnectionString.Contains("test", StringComparison.InvariantCultureIgnoreCase);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public override void OnActionExecuted(ActionExecutedContext context)
 | 
			
		||||
    {
 | 
			
		||||
        base.OnActionExecuted(context);
 | 
			
		||||
        ViewBag.IsTestDatabase = _IsTestDatabase;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private string GetApiUrl() => string.IsNullOrEmpty(_AppSettings.ApiUrl) ? Url.Content("~/") : _AppSettings.ApiUrl[0] == '~' ? Url.Content(_AppSettings.ApiUrl) : _AppSettings.ApiUrl;
 | 
			
		||||
 | 
			
		||||
    [HttpGet]
 | 
			
		||||
    [Route("/")]
 | 
			
		||||
    public IActionResult Index()
 | 
			
		||||
    {
 | 
			
		||||
        ViewBag.ApiUrl = GetApiUrl();
 | 
			
		||||
        return View("AwaitingDispo");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [HttpGet]
 | 
			
		||||
    [Route("/AwaitingDispo")]
 | 
			
		||||
    [Route("/Metrology/AwaitingDispo")]
 | 
			
		||||
    public IActionResult AwaitingDispo()
 | 
			
		||||
    {
 | 
			
		||||
        ViewBag.ApiUrl = GetApiUrl();
 | 
			
		||||
        return View();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [HttpGet]
 | 
			
		||||
    [Route("/RunInfo")]
 | 
			
		||||
    [Route("/Metrology/RunInfo")]
 | 
			
		||||
    public IActionResult RunInfo([FromQuery] int tooltypeid = 1, [FromQuery] int headerid = 0)
 | 
			
		||||
    {
 | 
			
		||||
        RunInfo m = new()
 | 
			
		||||
        {
 | 
			
		||||
            ToolTypeID = tooltypeid,
 | 
			
		||||
            HeaderID = headerid,
 | 
			
		||||
            HeaderAttachmentID = Guid.Empty,
 | 
			
		||||
        };
 | 
			
		||||
        if (headerid > 0)
 | 
			
		||||
        {
 | 
			
		||||
            m.HeaderAttachmentID = _MetrologyRepository.GetHeaderAttachmentID(tooltypeid, headerid);
 | 
			
		||||
        }
 | 
			
		||||
        ViewBag.ApiUrl = GetApiUrl();
 | 
			
		||||
        return View(m);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [HttpGet]
 | 
			
		||||
    [Route("/RunHeaders")]
 | 
			
		||||
    [Route("/Metrology/RunHeaders")]
 | 
			
		||||
    public IActionResult RunHeaders()
 | 
			
		||||
    {
 | 
			
		||||
        ViewBag.ApiUrl = GetApiUrl();
 | 
			
		||||
        return View();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [HttpGet]
 | 
			
		||||
    [Route("/Crash")]
 | 
			
		||||
    public IActionResult Crash() => throw new Exception("Test unhandled exception");
 | 
			
		||||
}
 | 
			
		||||
@ -13,6 +13,7 @@ public record AppSettings(string ApiFileShare,
 | 
			
		||||
                          string EcCharacterizationSi,
 | 
			
		||||
                          string EcMesaFileShareCharacterizationSi,
 | 
			
		||||
                          string EcMesaFileShareMetrologySi,
 | 
			
		||||
                          string EcMetrologySi,
 | 
			
		||||
                          string GitCommitSeven,
 | 
			
		||||
                          string InboundApiAllowedIPList,
 | 
			
		||||
                          string IqsColumns,
 | 
			
		||||
 | 
			
		||||
@ -17,6 +17,7 @@ public class AppSettings
 | 
			
		||||
    public string? EcCharacterizationSi { get; set; }
 | 
			
		||||
    public string? EcMesaFileShareCharacterizationSi { get; set; }
 | 
			
		||||
    public string? EcMesaFileShareMetrologySi { get; set; }
 | 
			
		||||
    public string? EcMetrologySi { get; set; }
 | 
			
		||||
    public string? GitCommitSeven { get; set; }
 | 
			
		||||
    public string? InboundApiAllowedIPList { get; set; }
 | 
			
		||||
    public string? IqsColumns { get; set; }
 | 
			
		||||
@ -74,6 +75,7 @@ public class AppSettings
 | 
			
		||||
        if (appSettings.EcCharacterizationSi is null) throw new NullReferenceException(nameof(EcCharacterizationSi));
 | 
			
		||||
        if (appSettings.EcMesaFileShareCharacterizationSi is null) throw new NullReferenceException(nameof(EcMesaFileShareCharacterizationSi));
 | 
			
		||||
        if (appSettings.EcMesaFileShareMetrologySi is null) throw new NullReferenceException(nameof(EcMesaFileShareMetrologySi));
 | 
			
		||||
        if (appSettings.EcMetrologySi is null) throw new NullReferenceException(nameof(EcMetrologySi));
 | 
			
		||||
        if (appSettings.GitCommitSeven is null) throw new NullReferenceException(nameof(GitCommitSeven));
 | 
			
		||||
        if (appSettings.InboundApiAllowedIPList is null) throw new NullReferenceException(nameof(InboundApiAllowedIPList));
 | 
			
		||||
        if (appSettings.IqsColumns is null) throw new NullReferenceException(nameof(IqsColumns));
 | 
			
		||||
@ -104,6 +106,7 @@ public class AppSettings
 | 
			
		||||
            appSettings.EcCharacterizationSi,
 | 
			
		||||
            appSettings.EcMesaFileShareCharacterizationSi,
 | 
			
		||||
            appSettings.EcMesaFileShareMetrologySi,
 | 
			
		||||
            appSettings.EcMetrologySi,
 | 
			
		||||
            appSettings.GitCommitSeven,
 | 
			
		||||
            appSettings.InboundApiAllowedIPList,
 | 
			
		||||
            appSettings.IqsColumns,
 | 
			
		||||
 | 
			
		||||
@ -25,22 +25,22 @@
 | 
			
		||||
        <Content Remove="compilerconfig.json" />
 | 
			
		||||
    </ItemGroup>
 | 
			
		||||
    <ItemGroup>
 | 
			
		||||
        <PackageReference Include="Dapper" Version="2.1.37" />
 | 
			
		||||
        <PackageReference Include="EntityFramework" Version="6.4.4" />
 | 
			
		||||
        <PackageReference Include="Dapper" Version="2.1.44" />
 | 
			
		||||
        <PackageReference Include="EntityFramework" Version="6.5.1" />
 | 
			
		||||
        <PackageReference Include="jQuery" Version="3.7.1" />
 | 
			
		||||
        <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.3" />
 | 
			
		||||
        <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" />
 | 
			
		||||
        <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
 | 
			
		||||
        <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.0" />
 | 
			
		||||
        <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
 | 
			
		||||
        <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" />
 | 
			
		||||
        <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
 | 
			
		||||
        <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.0" />
 | 
			
		||||
        <PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="8.0.0" />
 | 
			
		||||
        <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.10" />
 | 
			
		||||
        <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.1" />
 | 
			
		||||
        <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.1" />
 | 
			
		||||
        <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.1" />
 | 
			
		||||
        <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
 | 
			
		||||
        <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.1" />
 | 
			
		||||
        <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.1" />
 | 
			
		||||
        <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.1" />
 | 
			
		||||
        <PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="8.0.1" />
 | 
			
		||||
        <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
 | 
			
		||||
        <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
 | 
			
		||||
        <PackageReference Include="Swashbuckle.AspNetCore" Version="6.8.1" />
 | 
			
		||||
        <PackageReference Include="System.Data.SqlClient" Version="4.8.6" />
 | 
			
		||||
        <PackageReference Include="System.Drawing.Common" Version="8.0.3" />
 | 
			
		||||
        <PackageReference Include="System.Drawing.Common" Version="8.0.10" />
 | 
			
		||||
    </ItemGroup>
 | 
			
		||||
    <ItemGroup>
 | 
			
		||||
        <ProjectReference Include="..\Shared\OI.Metrology.Shared.csproj" />
 | 
			
		||||
 | 
			
		||||
@ -74,7 +74,6 @@ public class Program
 | 
			
		||||
            _ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV2Repository, InfinityQSV2Repository>();
 | 
			
		||||
            _ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV3Repository, InfinityQSV3Repository>();
 | 
			
		||||
            _ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV4Repository, InfinityQSV4Repository>();
 | 
			
		||||
            _ = webApplicationBuilder.Services.AddSingleton<IWaferCounterRepository, WaferCounterRepository>();
 | 
			
		||||
            _ = webApplicationBuilder.Services.AddSingleton<IClientSettingsRepository>(_ => clientSettingsRepository);
 | 
			
		||||
            _ = webApplicationBuilder.Services.AddSingleton<IServiceShopOrderRepository, ServiceShopOrderRepository>();
 | 
			
		||||
            _ = webApplicationBuilder.Services.AddSingleton<ISpreadingResistanceProfileService, SpreadingResistanceProfileService>();
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,10 @@ using OI.Metrology.Server.Models;
 | 
			
		||||
using OI.Metrology.Shared.DataModels;
 | 
			
		||||
using OI.Metrology.Shared.Models;
 | 
			
		||||
using OI.Metrology.Shared.Models.Stateless;
 | 
			
		||||
using System.Collections.ObjectModel;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Globalization;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Text.Json;
 | 
			
		||||
 | 
			
		||||
namespace OI.Metrology.Server.Repository;
 | 
			
		||||
@ -42,15 +45,15 @@ public class ExportRepository : IExportRepository
 | 
			
		||||
        List<NginxFileSystemSortable> results = new();
 | 
			
		||||
        Uri uri;
 | 
			
		||||
        string[] weeks = Get();
 | 
			
		||||
        List<NginxFileSystemSortable> nginxFileSystemSortableCollection;
 | 
			
		||||
        ReadOnlyCollection<NginxFileSystemSortable> collection;
 | 
			
		||||
        foreach (string weekYear in weeks)
 | 
			
		||||
        {
 | 
			
		||||
            if (headerCommon.ID < 1)
 | 
			
		||||
                uri = _FileShareRepository.Append(new Uri(_AppSettings.EcMesaFileShareMetrologySi), "Archive", "API", weekYear, $"-{headerCommon.PSN}", $"-{headerCommon.Reactor}", $"-{headerCommon.RDS}");
 | 
			
		||||
            else
 | 
			
		||||
                uri = _FileShareRepository.Append(new Uri(_AppSettings.EcMesaFileShareMetrologySi), "Archive", "API", weekYear, $"-{headerCommon.PSN}", $"-{headerCommon.Reactor}", $"-{headerCommon.RDS}", $"-{headerCommon.ID}");
 | 
			
		||||
            nginxFileSystemSortableCollection = _FileShareRepository.GetNginxFileSystemSortableCollection(httpClient, uri, endsWith);
 | 
			
		||||
            results.AddRange(nginxFileSystemSortableCollection);
 | 
			
		||||
            collection = _FileShareRepository.GetNginxFileSystemSortableCollection(httpClient, uri, endsWith);
 | 
			
		||||
            results.AddRange(collection);
 | 
			
		||||
        }
 | 
			
		||||
        return results.OrderByDescending(l => l.DateTime).ToArray();
 | 
			
		||||
    }
 | 
			
		||||
@ -160,4 +163,86 @@ public class ExportRepository : IExportRepository
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Result<DataTable> IExportRepository.GetExportData(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend)
 | 
			
		||||
    {
 | 
			
		||||
        Result<DataTable>? r;
 | 
			
		||||
        DateTime dateEnd = dateend is null ? DateTime.Now : DateTime.Parse(dateend);
 | 
			
		||||
        DateTime dateBegin = datebegin is null ? dateEnd.AddMonths(-1) : DateTime.Parse(datebegin);
 | 
			
		||||
        ToolType tt = metrologyRepository.GetToolTypeByID(toolTypeId);
 | 
			
		||||
        if (string.IsNullOrEmpty(tt.ExportSPName))
 | 
			
		||||
            throw new NullReferenceException(nameof(tt.ExportSPName));
 | 
			
		||||
        DataTable dataTable = metrologyRepository.ExportData(tt.ExportSPName, dateBegin, dateEnd);
 | 
			
		||||
        r = new()
 | 
			
		||||
        {
 | 
			
		||||
            Results = dataTable,
 | 
			
		||||
            TotalRows = dataTable.Rows.Count,
 | 
			
		||||
        };
 | 
			
		||||
        return r;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected static string FormatForCSV(string v)
 | 
			
		||||
    {
 | 
			
		||||
        StringBuilder result = new(v.Length + 2);
 | 
			
		||||
        bool doubleQuoted = false;
 | 
			
		||||
        if (v.StartsWith(' ') || v.EndsWith(' ') || v.Contains(',') || v.Contains('"'))
 | 
			
		||||
        {
 | 
			
		||||
            _ = result.Append('"');
 | 
			
		||||
            doubleQuoted = true;
 | 
			
		||||
        }
 | 
			
		||||
        foreach (char c in v)
 | 
			
		||||
        {
 | 
			
		||||
            _ = c switch
 | 
			
		||||
            {
 | 
			
		||||
                '\r' or '\n' => result.Append(' '),
 | 
			
		||||
                '"' => result.Append("\"\""),
 | 
			
		||||
                _ => result.Append(c),
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
        if (doubleQuoted)
 | 
			
		||||
            _ = result.Append('"');
 | 
			
		||||
        return result.ToString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected static string GetColumnHeaders(DataTable dataTable)
 | 
			
		||||
    {
 | 
			
		||||
        StringBuilder result = new();
 | 
			
		||||
        for (int i = 0; i < dataTable.Columns.Count; i++)
 | 
			
		||||
        {
 | 
			
		||||
            if (i > 0)
 | 
			
		||||
                _ = result.Append(',');
 | 
			
		||||
            _ = result.Append(FormatForCSV(dataTable.Columns[i].ColumnName.TrimEnd('_')));
 | 
			
		||||
        }
 | 
			
		||||
        return result.ToString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected static string GetRowData(DataRow dr)
 | 
			
		||||
    {
 | 
			
		||||
        StringBuilder result = new();
 | 
			
		||||
        for (int i = 0; i < dr.Table.Columns.Count; i++)
 | 
			
		||||
        {
 | 
			
		||||
            if (i > 0)
 | 
			
		||||
                _ = result.Append(',');
 | 
			
		||||
            object v = dr[i];
 | 
			
		||||
            if (v is not null && !Convert.IsDBNull(v))
 | 
			
		||||
                _ = result.Append(FormatForCSV(string.Concat(Convert.ToString(v))));
 | 
			
		||||
        }
 | 
			
		||||
        return result.ToString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    string IExportRepository.GetCSVExport(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend)
 | 
			
		||||
    {
 | 
			
		||||
        string results;
 | 
			
		||||
        Result<DataTable> result;
 | 
			
		||||
        IExportRepository repository = this;
 | 
			
		||||
        result = repository.GetExportData(metrologyRepository, toolTypeId, datebegin, dateend);
 | 
			
		||||
        if (result.Results is null)
 | 
			
		||||
            throw new NullReferenceException(nameof(result.Results));
 | 
			
		||||
        StringBuilder stringBuilder = new();
 | 
			
		||||
        _ = stringBuilder.AppendLine(GetColumnHeaders(result.Results));
 | 
			
		||||
        foreach (DataRow dr in result.Results.Rows)
 | 
			
		||||
            _ = stringBuilder.AppendLine(GetRowData(dr));
 | 
			
		||||
        results = stringBuilder.ToString();
 | 
			
		||||
        return results;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -1,6 +1,9 @@
 | 
			
		||||
using OI.Metrology.Shared.DataModels;
 | 
			
		||||
using OI.Metrology.Shared.Models;
 | 
			
		||||
using OI.Metrology.Shared.Models.Stateless;
 | 
			
		||||
using System.Collections.ObjectModel;
 | 
			
		||||
using System.Text.Json;
 | 
			
		||||
using System.Web;
 | 
			
		||||
 | 
			
		||||
namespace OI.Metrology.Server.Repository;
 | 
			
		||||
 | 
			
		||||
@ -49,7 +52,9 @@ public class FileShareRepository : IFileShareRepository
 | 
			
		||||
    void IFileShareRepository.CopyFile(HttpClient httpClient, string from, string to)
 | 
			
		||||
    {
 | 
			
		||||
        Uri uri = GetEndPoint(httpClient, "copy-file");
 | 
			
		||||
        Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(uri);
 | 
			
		||||
        string encodedTo = HttpUtility.UrlEncode(to);
 | 
			
		||||
        string encodedFrom = HttpUtility.UrlEncode(from);
 | 
			
		||||
        Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync($"{uri.OriginalString}?from={encodedFrom}&to={encodedTo}");
 | 
			
		||||
        httpResponseMessage.Wait();
 | 
			
		||||
        if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK)
 | 
			
		||||
            throw new Exception(httpResponseMessage.Result.StatusCode.ToString());
 | 
			
		||||
@ -58,16 +63,9 @@ public class FileShareRepository : IFileShareRepository
 | 
			
		||||
    void IFileShareRepository.MoveFile(HttpClient httpClient, string from, string to)
 | 
			
		||||
    {
 | 
			
		||||
        Uri uri = GetEndPoint(httpClient, "move-file");
 | 
			
		||||
        Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(uri);
 | 
			
		||||
        httpResponseMessage.Wait();
 | 
			
		||||
        if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK)
 | 
			
		||||
            throw new Exception(httpResponseMessage.Result.StatusCode.ToString());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void IFileShareRepository.FileWrite(HttpClient httpClient, string path, string contents)
 | 
			
		||||
    {
 | 
			
		||||
        Uri uri = GetEndPoint(httpClient, "file-write");
 | 
			
		||||
        Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(uri);
 | 
			
		||||
        string encodedTo = HttpUtility.UrlEncode(to);
 | 
			
		||||
        string encodedFrom = HttpUtility.UrlEncode(from);
 | 
			
		||||
        Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync($"{uri.OriginalString}?from={encodedFrom}&to={encodedTo}");
 | 
			
		||||
        httpResponseMessage.Wait();
 | 
			
		||||
        if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK)
 | 
			
		||||
            throw new Exception(httpResponseMessage.Result.StatusCode.ToString());
 | 
			
		||||
@ -82,7 +80,7 @@ public class FileShareRepository : IFileShareRepository
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    List<NginxFileSystemSortable> IFileShareRepository.GetNginxFileSystemSortableCollection(HttpClient httpClient, Uri uri, string? endsWith)
 | 
			
		||||
    ReadOnlyCollection<NginxFileSystemSortable> IFileShareRepository.GetNginxFileSystemSortableCollection(HttpClient httpClient, Uri uri, string? endsWith)
 | 
			
		||||
    {
 | 
			
		||||
        List<NginxFileSystemSortable> results = new();
 | 
			
		||||
        Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(uri);
 | 
			
		||||
@ -101,7 +99,13 @@ public class FileShareRepository : IFileShareRepository
 | 
			
		||||
                results.Add(nginxFileSystemSortable);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return results;
 | 
			
		||||
        return new(results);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ReadOnlyCollection<CharacterizationInfo> IFileShareRepository.GetArchiveData(CharacterizationParameters archiveParameters) =>
 | 
			
		||||
        throw new NotImplementedException();
 | 
			
		||||
 | 
			
		||||
    ReadOnlyCollection<ToolTypeNameId> IFileShareRepository.GetEquipmentIds() =>
 | 
			
		||||
        throw new NotImplementedException();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -31,76 +31,42 @@ public class InboundRepository : IInboundRepository
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // this is the main endpoint, it accepts a JSON message that contains both the header and data records together
 | 
			
		||||
    // tooltype is the ToolTypeName column from the ToolType table
 | 
			
		||||
    // JToken is how you can accept a JSON message without deserialization.
 | 
			
		||||
    // Using "string" doesn't work because ASP.NET Core will expect a json encoded string, not give you the actual string.
 | 
			
		||||
    DataResponse IInboundRepository.Data(IMetrologyRepository metrologyRepository, IInboundDataService inboundDataService, string tooltype, string? json)
 | 
			
		||||
    DataResponse IInboundRepository.Data(IMetrologyRepository metrologyRepository, IInboundDataService inboundDataService, string toolTypeName, JsonElement? jsonElement)
 | 
			
		||||
    {
 | 
			
		||||
        DataResponse result = new();
 | 
			
		||||
        ToolType? toolType = metrologyRepository.GetToolTypeByName(tooltype);
 | 
			
		||||
        if (toolType is null)
 | 
			
		||||
            result.Errors.Add($"Invalid tool type: {tooltype}");
 | 
			
		||||
        else
 | 
			
		||||
        if (jsonElement is null || jsonElement.Value.ValueKind != JsonValueKind.Object)
 | 
			
		||||
            throw new Exception("Invalid body!");
 | 
			
		||||
        string? json = jsonElement.ToString();
 | 
			
		||||
        JToken jToken = (string.IsNullOrEmpty(json) ? JToken.Parse("{}") : JToken.Parse(json)) ??
 | 
			
		||||
            throw new Exception($"Invalid body: {json}");
 | 
			
		||||
        ToolType toolType = metrologyRepository.GetToolTypeByName(toolTypeName) ??
 | 
			
		||||
            throw new Exception($"Invalid tool type: {toolTypeName}");
 | 
			
		||||
        List<ToolTypeMetadata> metaData = metrologyRepository.GetToolTypeMetadataByToolTypeID(toolType.ID).ToList();
 | 
			
		||||
        inboundDataService.ValidateJSONFields(jToken, 0, metaData, result.Errors, result.Warnings);
 | 
			
		||||
        if (result.Errors.Count == 0)
 | 
			
		||||
        {
 | 
			
		||||
            InboundCommon? inboundCommon = string.IsNullOrEmpty(json) ? null : JsonSerializer.Deserialize<InboundCommon>(json);
 | 
			
		||||
            if (inboundCommon is null || string.IsNullOrEmpty(inboundCommon.ProcessDataStandardFormat))
 | 
			
		||||
                result.Errors.Add($"Invalid body: {json}");
 | 
			
		||||
            else
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                string? sourceDirectory = Path.GetDirectoryName(inboundCommon.ProcessDataStandardFormat);
 | 
			
		||||
                string? parentDirectory = Path.GetDirectoryName(sourceDirectory);
 | 
			
		||||
                if (string.IsNullOrEmpty(sourceDirectory) || string.IsNullOrEmpty(parentDirectory) || !Directory.Exists(parentDirectory))
 | 
			
		||||
                    result.Errors.Add($"Invalid body:path: <{inboundCommon.ProcessDataStandardFormat}>");
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    JToken jToken = string.IsNullOrEmpty(json) ? JToken.Parse("{}") : JToken.Parse(json);
 | 
			
		||||
                    if (jToken is null)
 | 
			
		||||
                        result.Errors.Add($"Invalid body: {json}");
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        List<ToolTypeMetadata> metaData = metrologyRepository.GetToolTypeMetadataByToolTypeID(toolType.ID).ToList();
 | 
			
		||||
                        if (metaData is null)
 | 
			
		||||
                            result.Errors.Add($"Invalid metadata for tool type: {tooltype}");
 | 
			
		||||
                        else
 | 
			
		||||
                        {
 | 
			
		||||
                            inboundDataService.ValidateJSONFields(jToken, 0, metaData, result.Errors, result.Warnings);
 | 
			
		||||
                            if (result.Errors.Count == 0)
 | 
			
		||||
                            {
 | 
			
		||||
                                try
 | 
			
		||||
                                {
 | 
			
		||||
                                    result.HeaderID = inboundDataService.DoSQLInsert(jToken, toolType, metaData);
 | 
			
		||||
                                    result.Success = result.HeaderID > 0;
 | 
			
		||||
                                    string? destinationDirectory = Path.Combine(parentDirectory, result.HeaderID.ToString());
 | 
			
		||||
                                    Directory.Move(sourceDirectory, destinationDirectory);
 | 
			
		||||
                                }
 | 
			
		||||
                                catch (Exception ex) { result.Errors.Add(ex.Message); }
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                result.HeaderID = inboundDataService.DoSQLInsert(jToken, toolType, metaData);
 | 
			
		||||
                result.Success = result.HeaderID > 0;
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex) { result.Errors.Add(ex.Message); }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // this is the endpoint for attaching a field.  It is not JSON, it is form-data/multipart like an HTML form because that's the normal way.
 | 
			
		||||
    // header ID is the ID value from the Header table
 | 
			
		||||
    // datauniqueid is the Title value from the Data/Detail table
 | 
			
		||||
    string? IInboundRepository.AttachFile(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, string tooltype, long headerid, string datauniqueid, string fileName, object uploadedFile)
 | 
			
		||||
    void IInboundRepository.AttachFile(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, string toolTypeName, Attachment? attachment)
 | 
			
		||||
    {
 | 
			
		||||
        string? result = null;
 | 
			
		||||
        ToolType toolType = metrologyRepository.GetToolTypeByName(tooltype);
 | 
			
		||||
        if (toolType is null)
 | 
			
		||||
            result = $"Invalid tool type: {tooltype}";
 | 
			
		||||
        string filename = Path.GetFileName(fileName);
 | 
			
		||||
        if (string.IsNullOrWhiteSpace(filename))
 | 
			
		||||
            result = "Empty filename";
 | 
			
		||||
        if (filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0)
 | 
			
		||||
            result = "Invalid filename";
 | 
			
		||||
        if (result is null && toolType is not null)
 | 
			
		||||
            attachmentsService.SaveAttachment(toolType, headerid, datauniqueid, filename, uploadedFile);
 | 
			
		||||
        return result;
 | 
			
		||||
        if (attachment is null)
 | 
			
		||||
            throw new Exception("Invalid body!");
 | 
			
		||||
        ToolType toolType = metrologyRepository.GetToolTypeByName(toolTypeName) ??
 | 
			
		||||
            throw new Exception($"Invalid tool type: {toolTypeName}");
 | 
			
		||||
        if (string.IsNullOrWhiteSpace(attachment.DestinationFileName))
 | 
			
		||||
            throw new Exception("Empty filename");
 | 
			
		||||
        if (attachment.DestinationFileName.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0)
 | 
			
		||||
            throw new Exception("Invalid filename");
 | 
			
		||||
        attachmentsService.SaveAttachment(toolType, attachment);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -37,119 +37,117 @@ public class InfinityQSV4Repository : IInfinityQSV4Repository
 | 
			
		||||
 | 
			
		||||
    string IInfinityQSV4Repository.GetCommandText(string subGroupId)
 | 
			
		||||
    { // cSpell:disable
 | 
			
		||||
        StringBuilder result = new();
 | 
			
		||||
        List<string> results = [];
 | 
			
		||||
        if (string.IsNullOrEmpty(subGroupId))
 | 
			
		||||
            throw new ArgumentException(null, nameof(subGroupId));
 | 
			
		||||
        _ = result
 | 
			
		||||
            .AppendLine(" select ")
 | 
			
		||||
            .AppendLine("       sd.f_sgrp sd_sgrp, ")
 | 
			
		||||
            .AppendLine("       sd.f_tsno sd_tsno, ")
 | 
			
		||||
            .AppendLine("       dd.f_dsgp dd_dsgp, ")
 | 
			
		||||
            .AppendLine("       dg.f_name gd_name, ")
 | 
			
		||||
            .AppendLine("       dd.f_name dd_name ")
 | 
			
		||||
            .AppendLine(" from [SPCEPIWORLD].[dbo].[SGRP_DSC] sd ")
 | 
			
		||||
            .AppendLine(" join [SPCEPIWORLD].[dbo].[DESC_DAT] dd ")
 | 
			
		||||
            .AppendLine("   on sd.f_dsgp = dd.f_dsgp ")
 | 
			
		||||
            .AppendLine("  and sd.f_desc = dd.f_desc ")
 | 
			
		||||
            .AppendLine(" join [SPCEPIWORLD].[dbo].[DESC_GRP] dg ")
 | 
			
		||||
            .AppendLine("   on dd.f_dsgp = dg.f_dsgp ");
 | 
			
		||||
        _ = result.Append(" where sd.f_sgrp = ").Append(subGroupId).AppendLine(" ");
 | 
			
		||||
        _ = result.AppendLine(" for json path ");
 | 
			
		||||
        return result.ToString();
 | 
			
		||||
        results.Add(" select ");
 | 
			
		||||
        results.Add("       sd.f_sgrp sd_sgrp, ");
 | 
			
		||||
        results.Add("       sd.f_tsno sd_tsno, ");
 | 
			
		||||
        results.Add("       dd.f_dsgp dd_dsgp, ");
 | 
			
		||||
        results.Add("       dg.f_name gd_name, ");
 | 
			
		||||
        results.Add("       dd.f_name dd_name ");
 | 
			
		||||
        results.Add(" from [SPCEPIWORLD].[dbo].[SGRP_DSC] sd ");
 | 
			
		||||
        results.Add(" join [SPCEPIWORLD].[dbo].[DESC_DAT] dd ");
 | 
			
		||||
        results.Add("   on sd.f_dsgp = dd.f_dsgp ");
 | 
			
		||||
        results.Add("  and sd.f_desc = dd.f_desc ");
 | 
			
		||||
        results.Add(" join [SPCEPIWORLD].[dbo].[DESC_GRP] dg ");
 | 
			
		||||
        results.Add("   on dd.f_dsgp = dg.f_dsgp ");
 | 
			
		||||
        results.Add($" where sd.f_sgrp = {subGroupId} ");
 | 
			
		||||
        results.Add(" for json path ");
 | 
			
		||||
        return string.Join(' ', results);
 | 
			
		||||
    } // cSpell:enable
 | 
			
		||||
 | 
			
		||||
    string IInfinityQSV4Repository.GetCommandText(string? subGroupId, string? process, string? job, string? part, string? lot, string? dateTime)
 | 
			
		||||
    { // cSpell:disable
 | 
			
		||||
        StringBuilder result = new();
 | 
			
		||||
        List<string> results = [];
 | 
			
		||||
        const string dateTimeFormat = "yyyy-MM-dd HH:mm:ss";
 | 
			
		||||
        if (!string.IsNullOrEmpty(dateTime) && (dateTime.Contains('-') || dateTime.Contains(' ') || dateTime.Contains(':')) && dateTime.Length != dateTimeFormat.Length)
 | 
			
		||||
            throw new ArgumentException(null, nameof(dateTime));
 | 
			
		||||
        _ = result
 | 
			
		||||
            .AppendLine(" select case when iq.sl_loos is null then 0 else iq.sl_loos end + ")
 | 
			
		||||
            .AppendLine("        case when iq.sl_uoos is null then 0 else iq.sl_uoos end + ")
 | 
			
		||||
            .AppendLine("        iq.ev_count as iq_sum, ")
 | 
			
		||||
            .AppendLine("        iq.sl_aflag, ")
 | 
			
		||||
            .AppendLine("        iq.sl_loos, ")
 | 
			
		||||
            .AppendLine("        iq.sl_uoos, ")
 | 
			
		||||
            .AppendLine("        iq.se_sgrp, ")
 | 
			
		||||
            .AppendLine("        iq.se_sgtm, ")
 | 
			
		||||
            .AppendLine("        iq.se_tsno, ")
 | 
			
		||||
            .AppendLine("        iq.td_test, ")
 | 
			
		||||
            .AppendLine("        iq.pr_name, ")
 | 
			
		||||
            .AppendLine("        iq.jd_name, ")
 | 
			
		||||
            .AppendLine("        iq.pl_name, ")
 | 
			
		||||
            .AppendLine("        iq.pd_name, ")
 | 
			
		||||
            .AppendLine("        iq.td_name, ")
 | 
			
		||||
            .AppendLine("        iq.se_val, ")
 | 
			
		||||
            .AppendLine("        iq.sl_eflag, ")
 | 
			
		||||
            .AppendLine("        iq.sl_scal, ")
 | 
			
		||||
            .AppendLine("        iq.sl_sls, ")
 | 
			
		||||
            .AppendLine("        iq.sl_usl ")
 | 
			
		||||
            .AppendLine(" from ( ")
 | 
			
		||||
            .AppendLine(" select ")
 | 
			
		||||
            .AppendLine("       se.f_sgrp se_sgrp, ")
 | 
			
		||||
            .AppendLine("       se.f_sgtm se_sgtm, ")
 | 
			
		||||
            .AppendLine("       se.f_tsno se_tsno, ")
 | 
			
		||||
            .AppendLine("       se.f_val se_val, ")
 | 
			
		||||
            .AppendLine("       pr.f_name pr_name, ")
 | 
			
		||||
            .AppendLine("       jd.f_name jd_name, ")
 | 
			
		||||
            .AppendLine("       pl.f_name pl_name, ")
 | 
			
		||||
            .AppendLine("       pd.f_name pd_name, ")
 | 
			
		||||
            .AppendLine("       td.f_test td_test, ")
 | 
			
		||||
            .AppendLine("       td.f_name td_name, ")
 | 
			
		||||
            .AppendLine("       sl.f_eflag sl_eflag, ")
 | 
			
		||||
            .AppendLine("       sl.f_aflag sl_aflag, ")
 | 
			
		||||
            .AppendLine("       sl.f_scal sl_scal, ")
 | 
			
		||||
            .AppendLine("       sl.f_lsl sl_sls, ")
 | 
			
		||||
            .AppendLine("       sl.f_usl sl_usl, ")
 | 
			
		||||
            .AppendLine("       case when sl.f_aflag is null or sl.f_aflag = 0 then null else ")
 | 
			
		||||
            .AppendLine("         case when round(se.f_val, sl.F_scal, 1) < sl.f_lsl then 1 else 0 end ")
 | 
			
		||||
            .AppendLine("       end as sl_loos, ")
 | 
			
		||||
            .AppendLine("       case when sl.f_aflag is null or sl.f_aflag = 0 then null else ")
 | 
			
		||||
            .AppendLine("         case when round(se.f_val, sl.F_scal, 1) > sl.f_usl then 1 else 0 end ")
 | 
			
		||||
            .AppendLine("       end as sl_uoos, ")
 | 
			
		||||
            .AppendLine("       (select count(ev.f_evnt) ")
 | 
			
		||||
            .AppendLine("       from [spcepiworld].[dbo].[evnt_inf] ev ")
 | 
			
		||||
            .AppendLine("       where ev.f_prcs = pr.f_prcs ")
 | 
			
		||||
            .AppendLine("         and ev.f_part = pd.f_part ")
 | 
			
		||||
            .AppendLine("         and ev.f_sgtm = se.f_sgtm ")
 | 
			
		||||
            .AppendLine("       ) ev_count ")
 | 
			
		||||
            .AppendLine(" from [spcepiworld].[dbo].[sgrp_ext] se ")
 | 
			
		||||
            .AppendLine(" join [spcepiworld].[dbo].[prcs_dat] pr ")
 | 
			
		||||
            .AppendLine("   on se.f_prcs = pr.f_prcs ")
 | 
			
		||||
            .AppendLine(" join [spcepiworld].[dbo].[job_dat] jd ")
 | 
			
		||||
            .AppendLine("   on se.f_job = jd.f_job ")
 | 
			
		||||
            .AppendLine(" join [spcepiworld].[dbo].[part_lot] pl ")
 | 
			
		||||
            .AppendLine("   on se.f_lot = pl.f_lot ")
 | 
			
		||||
            .AppendLine(" join [spcepiworld].[dbo].[part_dat] pd ")
 | 
			
		||||
            .AppendLine("   on se.f_part = pd.f_part ")
 | 
			
		||||
            .AppendLine(" join [spcepiworld].[dbo].[test_dat] td ")
 | 
			
		||||
            .AppendLine("   on se.f_test = td.f_test ")
 | 
			
		||||
            .AppendLine(" left join [spcepiworld].[dbo].[spec_lim] sl ")
 | 
			
		||||
            .AppendLine("   on se.f_part = sl.f_part ")
 | 
			
		||||
            .AppendLine("  and se.f_test = sl.f_test ")
 | 
			
		||||
            .AppendLine(" where se.f_flag = 0 ")
 | 
			
		||||
            .AppendLine("   and (sl.f_prcs is null or se.f_prcs = sl.f_prcs or sl.f_prcs = 0) ");
 | 
			
		||||
        results.Add(" select case when iq.sl_loos is null then 0 else iq.sl_loos end + ");
 | 
			
		||||
        results.Add("        case when iq.sl_uoos is null then 0 else iq.sl_uoos end + ");
 | 
			
		||||
        results.Add("        iq.ev_count as iq_sum, ");
 | 
			
		||||
        results.Add("        iq.sl_aflag, ");
 | 
			
		||||
        results.Add("        iq.sl_loos, ");
 | 
			
		||||
        results.Add("        iq.sl_uoos, ");
 | 
			
		||||
        results.Add("        iq.se_sgrp, ");
 | 
			
		||||
        results.Add("        iq.se_sgtm, ");
 | 
			
		||||
        results.Add("        iq.se_tsno, ");
 | 
			
		||||
        results.Add("        iq.td_test, ");
 | 
			
		||||
        results.Add("        iq.pr_name, ");
 | 
			
		||||
        results.Add("        iq.jd_name, ");
 | 
			
		||||
        results.Add("        iq.pl_name, ");
 | 
			
		||||
        results.Add("        iq.pd_name, ");
 | 
			
		||||
        results.Add("        iq.td_name, ");
 | 
			
		||||
        results.Add("        iq.se_val, ");
 | 
			
		||||
        results.Add("        iq.sl_eflag, ");
 | 
			
		||||
        results.Add("        iq.sl_scal, ");
 | 
			
		||||
        results.Add("        iq.sl_sls, ");
 | 
			
		||||
        results.Add("        iq.sl_usl ");
 | 
			
		||||
        results.Add(" from ( ");
 | 
			
		||||
        results.Add(" select ");
 | 
			
		||||
        results.Add("       se.f_sgrp se_sgrp, ");
 | 
			
		||||
        results.Add("       se.f_sgtm se_sgtm, ");
 | 
			
		||||
        results.Add("       se.f_tsno se_tsno, ");
 | 
			
		||||
        results.Add("       se.f_val se_val, ");
 | 
			
		||||
        results.Add("       pr.f_name pr_name, ");
 | 
			
		||||
        results.Add("       jd.f_name jd_name, ");
 | 
			
		||||
        results.Add("       pl.f_name pl_name, ");
 | 
			
		||||
        results.Add("       pd.f_name pd_name, ");
 | 
			
		||||
        results.Add("       td.f_test td_test, ");
 | 
			
		||||
        results.Add("       td.f_name td_name, ");
 | 
			
		||||
        results.Add("       sl.f_eflag sl_eflag, ");
 | 
			
		||||
        results.Add("       sl.f_aflag sl_aflag, ");
 | 
			
		||||
        results.Add("       sl.f_scal sl_scal, ");
 | 
			
		||||
        results.Add("       sl.f_lsl sl_sls, ");
 | 
			
		||||
        results.Add("       sl.f_usl sl_usl, ");
 | 
			
		||||
        results.Add("       case when sl.f_aflag is null or sl.f_aflag = 0 then null else ");
 | 
			
		||||
        results.Add("         case when round(se.f_val, sl.F_scal, 1) < sl.f_lsl then 1 else 0 end ");
 | 
			
		||||
        results.Add("       end as sl_loos, ");
 | 
			
		||||
        results.Add("       case when sl.f_aflag is null or sl.f_aflag = 0 then null else ");
 | 
			
		||||
        results.Add("         case when round(se.f_val, sl.F_scal, 1) > sl.f_usl then 1 else 0 end ");
 | 
			
		||||
        results.Add("       end as sl_uoos, ");
 | 
			
		||||
        results.Add("       (select count(ev.f_evnt) ");
 | 
			
		||||
        results.Add("       from [spcepiworld].[dbo].[evnt_inf] ev ");
 | 
			
		||||
        results.Add("       where ev.f_prcs = pr.f_prcs ");
 | 
			
		||||
        results.Add("         and ev.f_part = pd.f_part ");
 | 
			
		||||
        results.Add("         and ev.f_sgtm = se.f_sgtm ");
 | 
			
		||||
        results.Add("       ) ev_count ");
 | 
			
		||||
        results.Add(" from [spcepiworld].[dbo].[sgrp_ext] se ");
 | 
			
		||||
        results.Add(" join [spcepiworld].[dbo].[prcs_dat] pr ");
 | 
			
		||||
        results.Add("   on se.f_prcs = pr.f_prcs ");
 | 
			
		||||
        results.Add(" join [spcepiworld].[dbo].[job_dat] jd ");
 | 
			
		||||
        results.Add("   on se.f_job = jd.f_job ");
 | 
			
		||||
        results.Add(" join [spcepiworld].[dbo].[part_lot] pl ");
 | 
			
		||||
        results.Add("   on se.f_lot = pl.f_lot ");
 | 
			
		||||
        results.Add(" join [spcepiworld].[dbo].[part_dat] pd ");
 | 
			
		||||
        results.Add("   on se.f_part = pd.f_part ");
 | 
			
		||||
        results.Add(" join [spcepiworld].[dbo].[test_dat] td ");
 | 
			
		||||
        results.Add("   on se.f_test = td.f_test ");
 | 
			
		||||
        results.Add(" left join [spcepiworld].[dbo].[spec_lim] sl ");
 | 
			
		||||
        results.Add("   on se.f_part = sl.f_part ");
 | 
			
		||||
        results.Add("  and se.f_test = sl.f_test ");
 | 
			
		||||
        results.Add(" where se.f_flag = 0 ");
 | 
			
		||||
        results.Add("   and (sl.f_prcs is null or se.f_prcs = sl.f_prcs or sl.f_prcs = 0) ");
 | 
			
		||||
        if (!string.IsNullOrEmpty(subGroupId))
 | 
			
		||||
            _ = result.Append("   and se.f_sgrp = ").Append(subGroupId.Split(" ")[0]).AppendLine("  ");
 | 
			
		||||
            results.Add($"   and se.f_sgrp = {subGroupId.Split(" ")[0]} ");
 | 
			
		||||
        if (!string.IsNullOrEmpty(process))
 | 
			
		||||
            _ = result.Append("   and pr.f_name = '").Append(process).AppendLine("' ");
 | 
			
		||||
            results.Add($"   and pr.f_name = '{process}' ");
 | 
			
		||||
        if (!string.IsNullOrEmpty(part))
 | 
			
		||||
            _ = result.Append("   and pd.f_name = '").Append(part).AppendLine("' ");
 | 
			
		||||
            results.Add($"   and pd.f_name = '{part}' ");
 | 
			
		||||
        if (!string.IsNullOrEmpty(job))
 | 
			
		||||
            _ = result.Append("   and jd.f_name = '").Append(job).AppendLine("' ");
 | 
			
		||||
            results.Add($"   and jd.f_name = '{job}' ");
 | 
			
		||||
        if (!string.IsNullOrEmpty(lot))
 | 
			
		||||
            _ = result.Append("   and pl.f_name = '").Append(lot).AppendLine("' ");
 | 
			
		||||
            results.Add($"   and pl.f_name = '{lot}' ");
 | 
			
		||||
        if (!string.IsNullOrEmpty(dateTime) && (dateTime.Contains('-') || dateTime.Contains(' ') || dateTime.Contains(':')))
 | 
			
		||||
            _ = result.Append("   and dateadd(HH, -7, (dateadd(SS, convert(bigint, se.f_sgtm), '19700101'))) = '").Append(dateTime).AppendLine("' ");
 | 
			
		||||
        _ = result.AppendLine(" ) as iq ")
 | 
			
		||||
                  .AppendLine(" order by iq.sl_loos + iq.sl_uoos + iq.ev_count desc, ")
 | 
			
		||||
                  .AppendLine("          iq.sl_aflag desc, ")
 | 
			
		||||
                  .AppendLine("          iq.se_sgrp, ")
 | 
			
		||||
                  .AppendLine("          iq.se_tsno, ")
 | 
			
		||||
                  .AppendLine("          iq.td_test ")
 | 
			
		||||
                  .AppendLine("   for json path ");
 | 
			
		||||
        return result.ToString();
 | 
			
		||||
            results.Add($"   and dateadd(HH, -7, (dateadd(SS, convert(bigint, se.f_sgtm), '19700101'))) = '{dateTime}' ");
 | 
			
		||||
        results.Add(" ) as iq ");
 | 
			
		||||
        results.Add(" order by iq.sl_loos + iq.sl_uoos + iq.ev_count desc, ");
 | 
			
		||||
        results.Add("          iq.sl_aflag desc, ");
 | 
			
		||||
        results.Add("          iq.se_sgrp, ");
 | 
			
		||||
        results.Add("          iq.se_tsno, ");
 | 
			
		||||
        results.Add("          iq.td_test ");
 | 
			
		||||
        results.Add("   for json path ");
 | 
			
		||||
        return string.Join(' ', results);
 | 
			
		||||
    } // cSpell:enable
 | 
			
		||||
 | 
			
		||||
    private JsonElement[] GetAllReactorsAsJsonElementElement()
 | 
			
		||||
@ -171,6 +169,7 @@ public class InfinityQSV4Repository : IInfinityQSV4Repository
 | 
			
		||||
    private static StringBuilder GetForJsonPath(IDbConnectionFactory dbConnectionFactory, string commandText, bool useIqsConnection)
 | 
			
		||||
    {
 | 
			
		||||
        StringBuilder stringBuilder = new();
 | 
			
		||||
        File.WriteAllText("../../.sql", commandText);
 | 
			
		||||
        using DbConnection dbConnection = dbConnectionFactory.GetDbConnection(useIqsConnection);
 | 
			
		||||
        DbCommand dbCommand = dbConnection.CreateCommand();
 | 
			
		||||
        dbCommand.CommandText = commandText;
 | 
			
		||||
@ -186,6 +185,7 @@ public class InfinityQSV4Repository : IInfinityQSV4Repository
 | 
			
		||||
        if (string.IsNullOrEmpty(infinityQSV4.Part))
 | 
			
		||||
            throw new ArgumentException(nameof(infinityQSV4.Part));
 | 
			
		||||
        string json = infinityQSV4Repository.GetProductionSpecification(infinityQSV4.Part);
 | 
			
		||||
        File.WriteAllText("../../.json", json);
 | 
			
		||||
        ProdSpecRoot? prodSpec = JsonSerializer.Deserialize(json, ProdSpecRootSourceGenerationContext.Default.ProdSpecRoot);
 | 
			
		||||
        if (prodSpec is null)
 | 
			
		||||
        {
 | 
			
		||||
@ -293,33 +293,32 @@ public class InfinityQSV4Repository : IInfinityQSV4Repository
 | 
			
		||||
 | 
			
		||||
    string IInfinityQSV4Repository.GetCommandText(InfinityQSV4 infinityQSV4)
 | 
			
		||||
    { // cSpell:disable
 | 
			
		||||
        StringBuilder result = new();
 | 
			
		||||
        List<string> results = [];
 | 
			
		||||
        if (string.IsNullOrEmpty(infinityQSV4.Process))
 | 
			
		||||
            throw new ArgumentException(nameof(infinityQSV4.Process));
 | 
			
		||||
        if (string.IsNullOrEmpty(infinityQSV4.Part))
 | 
			
		||||
            throw new ArgumentException(nameof(infinityQSV4.Part));
 | 
			
		||||
        _ = result
 | 
			
		||||
            .AppendLine(" select ")
 | 
			
		||||
            .AppendLine(" ev.f_evnt [ev_evnt], ")
 | 
			
		||||
            .AppendLine(" ev.f_sgtm [ev_sgtm], ")
 | 
			
		||||
            .AppendLine(" dateadd(HH, -7, (dateadd(SS, convert(bigint, ev.f_sgtm), '19700101'))) [ev_utc7], ")
 | 
			
		||||
            .AppendLine(" pr.f_name [pr_name], ")
 | 
			
		||||
            .AppendLine(" pd.f_name [pd_name], ")
 | 
			
		||||
            .AppendLine(" td.f_test [td_test], ")
 | 
			
		||||
            .AppendLine(" td.f_name [td_name], ")
 | 
			
		||||
            .AppendLine(" ev.f_name [ev_name] ")
 | 
			
		||||
            .AppendLine(" from [spcepiworld].[dbo].[evnt_inf] ev ")
 | 
			
		||||
            .AppendLine(" join [spcepiworld].[dbo].[prcs_dat] pr ")
 | 
			
		||||
            .AppendLine(" on ev.f_prcs = pr.f_prcs ")
 | 
			
		||||
            .AppendLine(" join [spcepiworld].[dbo].[part_dat] pd ")
 | 
			
		||||
            .AppendLine(" on ev.f_part = pd.f_part ")
 | 
			
		||||
            .AppendLine(" join [spcepiworld].[dbo].[test_dat] td ")
 | 
			
		||||
            .AppendLine(" on ev.f_test = td.f_test ")
 | 
			
		||||
            .Append(" where pr.f_name = '").Append(infinityQSV4.Process).AppendLine("' ")
 | 
			
		||||
            .Append(" and pd.f_name = '").Append(infinityQSV4.Part).AppendLine("' ")
 | 
			
		||||
            .Append(" and ev.f_sgtm = ").Append(infinityQSV4.SubGroupDateTime).AppendLine(" ")
 | 
			
		||||
            .AppendLine(" for json path ");
 | 
			
		||||
        return result.ToString();
 | 
			
		||||
        results.Add(" select ");
 | 
			
		||||
        results.Add(" ev.f_evnt [ev_evnt], ");
 | 
			
		||||
        results.Add(" ev.f_sgtm [ev_sgtm], ");
 | 
			
		||||
        results.Add(" dateadd(HH, -7, (dateadd(SS, convert(bigint, ev.f_sgtm), '19700101'))) [ev_utc7], ");
 | 
			
		||||
        results.Add(" pr.f_name [pr_name], ");
 | 
			
		||||
        results.Add(" pd.f_name [pd_name], ");
 | 
			
		||||
        results.Add(" td.f_test [td_test], ");
 | 
			
		||||
        results.Add(" td.f_name [td_name], ");
 | 
			
		||||
        results.Add(" ev.f_name [ev_name] ");
 | 
			
		||||
        results.Add(" from [spcepiworld].[dbo].[evnt_inf] ev ");
 | 
			
		||||
        results.Add(" join [spcepiworld].[dbo].[prcs_dat] pr ");
 | 
			
		||||
        results.Add(" on ev.f_prcs = pr.f_prcs ");
 | 
			
		||||
        results.Add(" join [spcepiworld].[dbo].[part_dat] pd ");
 | 
			
		||||
        results.Add(" on ev.f_part = pd.f_part ");
 | 
			
		||||
        results.Add(" join [spcepiworld].[dbo].[test_dat] td ");
 | 
			
		||||
        results.Add(" on ev.f_test = td.f_test ");
 | 
			
		||||
        results.Add($" where pr.f_name = '{infinityQSV4.Process}' ");
 | 
			
		||||
        results.Add($" and pd.f_name = '{infinityQSV4.Part}' ");
 | 
			
		||||
        results.Add($" and ev.f_sgtm = {infinityQSV4.SubGroupDateTime} ");
 | 
			
		||||
        results.Add(" for json path ");
 | 
			
		||||
        return string.Join(' ', results);
 | 
			
		||||
    } // cSpell:enable
 | 
			
		||||
 | 
			
		||||
    Result<InfinityQSV4[]> IInfinityQSV4Repository.GetHeader(string subGroupId)
 | 
			
		||||
@ -348,28 +347,27 @@ public class InfinityQSV4Repository : IInfinityQSV4Repository
 | 
			
		||||
 | 
			
		||||
    string IInfinityQSV4Repository.GetCommandText(string process, string? part)
 | 
			
		||||
    { // cSpell:disable
 | 
			
		||||
        StringBuilder result = new();
 | 
			
		||||
        List<string> results = [];
 | 
			
		||||
        if (string.IsNullOrEmpty(process))
 | 
			
		||||
            throw new ArgumentException(null, nameof(process));
 | 
			
		||||
        if (string.IsNullOrEmpty(part))
 | 
			
		||||
            throw new ArgumentException(null, nameof(part));
 | 
			
		||||
        _ = result
 | 
			
		||||
            .AppendLine(" select [f_mean] as ProcessMean, ")
 | 
			
		||||
            .AppendLine("        [f_sp] as ProcessSigma ")
 | 
			
		||||
            .AppendLine(" from [spcepiworld].[dbo].[test_dat] test ")
 | 
			
		||||
            .AppendLine(" join [spcepiworld].[dbo].[ctrl_lim] ctrl ")
 | 
			
		||||
            .AppendLine("   on test.f_test = ctrl.f_test ")
 | 
			
		||||
            .AppendLine("   and test.f_tsgp = 1104848523 /* Product Data */ ")
 | 
			
		||||
            .AppendLine(" join [spcepiworld].[dbo].[part_dat] part ")
 | 
			
		||||
            .AppendLine("   on part.f_part = ctrl.f_part ")
 | 
			
		||||
            .AppendLine("  and ctrl.f_test = 1125073605 /* Average Sum of Defects */ ")
 | 
			
		||||
            .AppendLine(" join [spcepiworld].[dbo].[prcs_dat] process ")
 | 
			
		||||
            .AppendLine("   on process.f_prcs = ctrl.f_prcs ")
 | 
			
		||||
            .AppendLine(" where test.f_name = 'Average Sum of Defects' ")
 | 
			
		||||
            .Append("       and process.f_name = '").Append(process).AppendLine("' ")
 | 
			
		||||
            .Append("       and part.f_name = '").Append(part).AppendLine("' ")
 | 
			
		||||
            .AppendLine(" for json path; ");
 | 
			
		||||
        return result.ToString();
 | 
			
		||||
        results.Add(" select [f_mean] as ProcessMean, ");
 | 
			
		||||
        results.Add("        [f_sp] as ProcessSigma ");
 | 
			
		||||
        results.Add(" from [spcepiworld].[dbo].[test_dat] test ");
 | 
			
		||||
        results.Add(" join [spcepiworld].[dbo].[ctrl_lim] ctrl ");
 | 
			
		||||
        results.Add("   on test.f_test = ctrl.f_test ");
 | 
			
		||||
        results.Add("   and test.f_tsgp = 1104848523 /* Product Data */ ");
 | 
			
		||||
        results.Add(" join [spcepiworld].[dbo].[part_dat] part ");
 | 
			
		||||
        results.Add("   on part.f_part = ctrl.f_part ");
 | 
			
		||||
        results.Add("  and ctrl.f_test = 1125073605 /* Average Sum of Defects */ ");
 | 
			
		||||
        results.Add(" join [spcepiworld].[dbo].[prcs_dat] process ");
 | 
			
		||||
        results.Add("   on process.f_prcs = ctrl.f_prcs ");
 | 
			
		||||
        results.Add(" where test.f_name = 'Average Sum of Defects' ");
 | 
			
		||||
        results.Add($"       and process.f_name = '{process}' ");
 | 
			
		||||
        results.Add($"       and part.f_name = '{part}' ");
 | 
			
		||||
        results.Add(" for json path; ");
 | 
			
		||||
        return string.Join(' ', results);
 | 
			
		||||
    } // cSpell:enable
 | 
			
		||||
 | 
			
		||||
    string IInfinityQSV4Repository.GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(string process, string? recipe)
 | 
			
		||||
@ -393,53 +391,52 @@ public class InfinityQSV4Repository : IInfinityQSV4Repository
 | 
			
		||||
 | 
			
		||||
    string IInfinityQSV4Repository.GetCommandText(List<string> eppReactorNumbers)
 | 
			
		||||
    { // cSpell:disable
 | 
			
		||||
        StringBuilder result = new();
 | 
			
		||||
        _ = result
 | 
			
		||||
            .AppendLine(" select se.f_sgrp, ")
 | 
			
		||||
            .AppendLine("        dateadd(HH, -7, (dateadd(SS, convert(bigint, se.f_sgrp), '19700101'))) date_time, ")
 | 
			
		||||
            .AppendLine("        iq.pr_name, ")
 | 
			
		||||
            .AppendLine("        iq.pd_name, ")
 | 
			
		||||
            .AppendLine("        max(case ")
 | 
			
		||||
            .AppendLine("         when td.f_test = 1104769646 ")
 | 
			
		||||
            .AppendLine("         then se.f_val ")
 | 
			
		||||
            .AppendLine("         else null ")
 | 
			
		||||
            .AppendLine("         end) as iq_value, ")
 | 
			
		||||
            .AppendLine("        max(case ")
 | 
			
		||||
            .AppendLine("         when td.f_test = 1312288843 ")
 | 
			
		||||
            .AppendLine("         then se.f_val else null ")
 | 
			
		||||
            .AppendLine("         end) as iq_temp_offset_percent ")
 | 
			
		||||
            .AppendLine(" from ( ")
 | 
			
		||||
            .AppendLine(" select ")
 | 
			
		||||
            .AppendLine("       max(se.f_sgrp) se_max_sgrp, ")
 | 
			
		||||
            .AppendLine("       se.f_test se_test, ")
 | 
			
		||||
            .AppendLine("       pr.f_name pr_name, ")
 | 
			
		||||
            .AppendLine("       pd.f_name pd_name ")
 | 
			
		||||
            .AppendLine(" from [spcepiworld].[dbo].[sgrp_ext] se ")
 | 
			
		||||
            .AppendLine(" join [spcepiworld].[dbo].[prcs_dat] pr ")
 | 
			
		||||
            .AppendLine("   on se.f_prcs = pr.f_prcs ")
 | 
			
		||||
            .AppendLine(" join [spcepiworld].[dbo].[part_dat] pd ")
 | 
			
		||||
            .AppendLine("   on se.f_part = pd.f_part ")
 | 
			
		||||
            .AppendLine(" where se.f_flag = 0 ")
 | 
			
		||||
            .Append("   and pr.f_name in (").Append(string.Join(',', eppReactorNumbers)).AppendLine(") ")
 | 
			
		||||
            .AppendLine("   and pd.f_name = '1090 - Full Load' ")
 | 
			
		||||
            .AppendLine("   and se.f_test in (1104769646, 1312288843) ")
 | 
			
		||||
            .AppendLine(" group by se.f_test, ")
 | 
			
		||||
            .AppendLine("          pr.f_name, ")
 | 
			
		||||
            .AppendLine("          pd.f_name ")
 | 
			
		||||
            .AppendLine(" ) as iq ")
 | 
			
		||||
            .AppendLine(" join [spcepiworld].[dbo].[sgrp_ext] se ")
 | 
			
		||||
            .AppendLine("   on iq.se_max_sgrp = se.f_sgrp ")
 | 
			
		||||
            .AppendLine(" join [spcepiworld].[dbo].[test_dat] td ")
 | 
			
		||||
            .AppendLine("   on iq.se_test = td.f_test ")
 | 
			
		||||
            .AppendLine("  and se.f_test = td.f_test ")
 | 
			
		||||
            .AppendLine(" where se.f_flag = 0 ")
 | 
			
		||||
            .AppendLine("   and td.f_test in (1104769646, 1312288843) ")
 | 
			
		||||
            .AppendLine(" group by se.f_sgrp, ")
 | 
			
		||||
            .AppendLine("          iq.pr_name, ")
 | 
			
		||||
            .AppendLine("          iq.pd_name ")
 | 
			
		||||
            .AppendLine(" order by iq.pr_name ")
 | 
			
		||||
            .AppendLine(" for json path; ");
 | 
			
		||||
        return result.ToString();
 | 
			
		||||
        List<string> results = [];
 | 
			
		||||
        results.Add(" select se.f_sgrp, ");
 | 
			
		||||
        results.Add("        dateadd(HH, -7, (dateadd(SS, convert(bigint, se.f_sgrp), '19700101'))) date_time, ");
 | 
			
		||||
        results.Add("        iq.pr_name, ");
 | 
			
		||||
        results.Add("        iq.pd_name, ");
 | 
			
		||||
        results.Add("        max(case ");
 | 
			
		||||
        results.Add("         when td.f_test = 1104769646 ");
 | 
			
		||||
        results.Add("         then se.f_val ");
 | 
			
		||||
        results.Add("         else null ");
 | 
			
		||||
        results.Add("         end) as iq_value, ");
 | 
			
		||||
        results.Add("        max(case ");
 | 
			
		||||
        results.Add("         when td.f_test = 1312288843 ");
 | 
			
		||||
        results.Add("         then se.f_val else null ");
 | 
			
		||||
        results.Add("         end) as iq_temp_offset_percent ");
 | 
			
		||||
        results.Add(" from ( ");
 | 
			
		||||
        results.Add(" select ");
 | 
			
		||||
        results.Add("       max(se.f_sgrp) se_max_sgrp, ");
 | 
			
		||||
        results.Add("       se.f_test se_test, ");
 | 
			
		||||
        results.Add("       pr.f_name pr_name, ");
 | 
			
		||||
        results.Add("       pd.f_name pd_name ");
 | 
			
		||||
        results.Add(" from [spcepiworld].[dbo].[sgrp_ext] se ");
 | 
			
		||||
        results.Add(" join [spcepiworld].[dbo].[prcs_dat] pr ");
 | 
			
		||||
        results.Add("   on se.f_prcs = pr.f_prcs ");
 | 
			
		||||
        results.Add(" join [spcepiworld].[dbo].[part_dat] pd ");
 | 
			
		||||
        results.Add("   on se.f_part = pd.f_part ");
 | 
			
		||||
        results.Add(" where se.f_flag = 0 ");
 | 
			
		||||
        results.Add($"   and pr.f_name in ({string.Join(',', eppReactorNumbers)}) ");
 | 
			
		||||
        results.Add("   and pd.f_name = '1090 - Full Load' ");
 | 
			
		||||
        results.Add("   and se.f_test in (1104769646, 1312288843) ");
 | 
			
		||||
        results.Add(" group by se.f_test, ");
 | 
			
		||||
        results.Add("          pr.f_name, ");
 | 
			
		||||
        results.Add("          pd.f_name ");
 | 
			
		||||
        results.Add(" ) as iq ");
 | 
			
		||||
        results.Add(" join [spcepiworld].[dbo].[sgrp_ext] se ");
 | 
			
		||||
        results.Add("   on iq.se_max_sgrp = se.f_sgrp ");
 | 
			
		||||
        results.Add(" join [spcepiworld].[dbo].[test_dat] td ");
 | 
			
		||||
        results.Add("   on iq.se_test = td.f_test ");
 | 
			
		||||
        results.Add("  and se.f_test = td.f_test ");
 | 
			
		||||
        results.Add(" where se.f_flag = 0 ");
 | 
			
		||||
        results.Add("   and td.f_test in (1104769646, 1312288843) ");
 | 
			
		||||
        results.Add(" group by se.f_sgrp, ");
 | 
			
		||||
        results.Add("          iq.pr_name, ");
 | 
			
		||||
        results.Add("          iq.pd_name ");
 | 
			
		||||
        results.Add(" order by iq.pr_name ");
 | 
			
		||||
        results.Add(" for json path; ");
 | 
			
		||||
        return string.Join(' ', results);
 | 
			
		||||
    } // cSpell:enable
 | 
			
		||||
 | 
			
		||||
    List<string[]> IInfinityQSV4Repository.GetEpiProTempVerificationRows(int[] night)
 | 
			
		||||
@ -651,4 +648,55 @@ public class InfinityQSV4Repository : IInfinityQSV4Repository
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static string GetCommandText(string process, string? part, int? test)
 | 
			
		||||
    { // cSpell:disable
 | 
			
		||||
        List<string> results = [];
 | 
			
		||||
        if (string.IsNullOrEmpty(process))
 | 
			
		||||
            throw new ArgumentException(null, nameof(process));
 | 
			
		||||
        if (string.IsNullOrEmpty(part))
 | 
			
		||||
            throw new ArgumentException(null, nameof(part));
 | 
			
		||||
        if (test is null)
 | 
			
		||||
            throw new ArgumentException(null, nameof(test));
 | 
			
		||||
        results.Add(" select se_max_sgrp, se.f_val se_value ");
 | 
			
		||||
        results.Add(" from ( ");
 | 
			
		||||
        results.Add("   select ");
 | 
			
		||||
        results.Add("         max(se.f_sgrp) se_max_sgrp ");
 | 
			
		||||
        results.Add("   from [spcepiworld].[dbo].[sgrp_ext] se ");
 | 
			
		||||
        results.Add("   join [spcepiworld].[dbo].[prcs_dat] pr ");
 | 
			
		||||
        results.Add("     on se.f_prcs = pr.f_prcs ");
 | 
			
		||||
        results.Add("   join [spcepiworld].[dbo].[part_dat] pd ");
 | 
			
		||||
        results.Add("     on se.f_part = pd.f_part ");
 | 
			
		||||
        results.Add("   where se.f_flag = 0 ");
 | 
			
		||||
        results.Add("     and se.f_tsno = 1 ");
 | 
			
		||||
        results.Add($"     and pr.f_name = '{process}' ");
 | 
			
		||||
        results.Add($"     and pd.f_name = '{part}' ");
 | 
			
		||||
        results.Add($"     and se.f_test = {test.Value} ");
 | 
			
		||||
        results.Add(" ) as iq ");
 | 
			
		||||
        results.Add(" join [spcepiworld].[dbo].[sgrp_ext] se ");
 | 
			
		||||
        results.Add("   on se_max_sgrp = se.f_sgrp ");
 | 
			
		||||
        results.Add(" where se.f_flag = 0 ");
 | 
			
		||||
        results.Add("   and se.f_tsno = 1 ");
 | 
			
		||||
        results.Add($"   and se.f_test = {test.Value} ");
 | 
			
		||||
        results.Add(" for json path ");
 | 
			
		||||
        return string.Join(' ', results);
 | 
			
		||||
    } // cSpell:enable
 | 
			
		||||
 | 
			
		||||
    string IInfinityQSV4Repository.GetLastGroupIdWithValue(string process, string? part, int? test)
 | 
			
		||||
    {
 | 
			
		||||
        StringBuilder result;
 | 
			
		||||
        if (!string.IsNullOrEmpty(_MockRoot))
 | 
			
		||||
        {
 | 
			
		||||
            string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IInfinityQSV4Repository.GetLastGroupIdWithValue)}.json"));
 | 
			
		||||
            result = new(json);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            string commandText = GetCommandText(process, part, test);
 | 
			
		||||
            result = GetForJsonPath(_DBConnectionFactory, commandText, useIqsConnection: false);
 | 
			
		||||
            if (result.Length == 0)
 | 
			
		||||
                result = new("{}");
 | 
			
		||||
        }
 | 
			
		||||
        return result.ToString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -16,6 +16,7 @@ namespace OI.Metrology.Server.Repositories;
 | 
			
		||||
 | 
			
		||||
public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    private readonly string _MockRoot;
 | 
			
		||||
    private readonly string _RepositoryName;
 | 
			
		||||
    private readonly IMemoryCache _MemoryCache;
 | 
			
		||||
@ -32,7 +33,8 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
    protected DbProviderFactory GetDbProviderFactory(IDbConnection conn) =>
 | 
			
		||||
        DbProviderFactories.GetFactory(conn.GetType().Namespace);
 | 
			
		||||
 | 
			
		||||
    internal static TransactionScope StartTransaction() => new();
 | 
			
		||||
    internal static TransactionScope StartTransaction() =>
 | 
			
		||||
        new();
 | 
			
		||||
 | 
			
		||||
    protected void CacheItem(string key, object v)
 | 
			
		||||
    {
 | 
			
		||||
@ -56,7 +58,7 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
        return r;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal ToolType GetToolTypeByName(string name)
 | 
			
		||||
    ToolType IMetrologyRepository.GetToolTypeByName(string name)
 | 
			
		||||
    {
 | 
			
		||||
        ToolType cached;
 | 
			
		||||
        string cacheKey = "GetToolTypeByName_" + name;
 | 
			
		||||
@ -107,7 +109,7 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
        return r;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal long InsertToolDataJSON(JToken jsonrow, long headerId, List<ToolTypeMetadata> metaData, string tableName)
 | 
			
		||||
    long IMetrologyRepository.InsertToolDataJSON(JToken jsonrow, long headerId, List<ToolTypeMetadata> metaData, string tableName)
 | 
			
		||||
    {
 | 
			
		||||
        long r = -1;
 | 
			
		||||
        using (DbConnection conn = _DBConnectionFactory.GetDbConnection())
 | 
			
		||||
@ -115,7 +117,8 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
            bool isHeader = headerId <= 0;
 | 
			
		||||
 | 
			
		||||
            // get fields from metadata
 | 
			
		||||
            List<ToolTypeMetadata> fields = metaData.Where(md => md.Header == isHeader).ToList();
 | 
			
		||||
            List<ToolTypeMetadata> fields = metaData.Where(md =>
 | 
			
		||||
                md.Header == isHeader).ToList();
 | 
			
		||||
 | 
			
		||||
            // maps ApiName to ColumnName
 | 
			
		||||
            Dictionary<string, string> fieldmap = new();
 | 
			
		||||
@ -155,7 +158,8 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                // Find the container field in the json
 | 
			
		||||
                JProperty contJP = jsonrow.Children<JProperty>().Where(c => string.Equals(c.Name.Trim(), containerField, StringComparison.OrdinalIgnoreCase)).SingleOrDefault();
 | 
			
		||||
                JProperty contJP = jsonrow.Children<JProperty>().Where(c =>
 | 
			
		||||
                    string.Equals(c.Name.Trim(), containerField, StringComparison.OrdinalIgnoreCase)).SingleOrDefault();
 | 
			
		||||
 | 
			
		||||
                if ((contJP is not null) && (contJP.Value is JArray array))
 | 
			
		||||
                {
 | 
			
		||||
@ -182,7 +186,7 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
        _ = cmd.Parameters.Add(p);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected long InsertRowFromJSON(
 | 
			
		||||
    private long InsertRowFromJSON(
 | 
			
		||||
        IDbConnection conn,
 | 
			
		||||
        string tableName,
 | 
			
		||||
        JToken jsonrow,
 | 
			
		||||
@ -262,7 +266,7 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
        return Convert.ToInt64(o);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal DataTable ExportData(string spName, DateTime startTime, DateTime endTime)
 | 
			
		||||
    DataTable IMetrologyRepository.ExportData(string spName, DateTime startTime, DateTime endTime)
 | 
			
		||||
    {
 | 
			
		||||
        DataTable dt = new();
 | 
			
		||||
        DateTime endTimeLocal = endTime.ToLocalTime();
 | 
			
		||||
@ -312,7 +316,7 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
        return sb.ToString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal DataTable GetHeaders(int toolTypeId, string? startTime, string? endTime, int? pageNo, int? pageSize, long? headerId, out long totalRecords)
 | 
			
		||||
    DataTable IMetrologyRepository.GetHeaders(int toolTypeId, string? startTime, string? endTime, int? pageNo, int? pageSize, long? headerId, out long totalRecords)
 | 
			
		||||
    {
 | 
			
		||||
        ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
 | 
			
		||||
 | 
			
		||||
@ -324,7 +328,8 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
            StringBuilder sb = new();
 | 
			
		||||
            _ = sb.Append(
 | 
			
		||||
                FormDynamicSelectQuery(
 | 
			
		||||
                    md.Where(m => m.Header == true).ToList(),
 | 
			
		||||
                    md.Where(m =>
 | 
			
		||||
                        m.Header == true).ToList(),
 | 
			
		||||
                    tt.HeaderTableName)
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
@ -401,7 +406,7 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
        return dt;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal DataTable GetData(int toolTypeId, long headerid)
 | 
			
		||||
    DataTable IMetrologyRepository.GetData(int toolTypeId, long headerid)
 | 
			
		||||
    {
 | 
			
		||||
        ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
 | 
			
		||||
 | 
			
		||||
@ -413,7 +418,9 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
            StringBuilder sb = new();
 | 
			
		||||
            _ = sb.Append(
 | 
			
		||||
                FormDynamicSelectQuery(
 | 
			
		||||
                    md.Where(m => m.Header == false).OrderBy(m => m.GridDisplayOrder).ToList(),
 | 
			
		||||
                    md.Where(m =>
 | 
			
		||||
                        m.Header == false).OrderBy(m =>
 | 
			
		||||
                        m.GridDisplayOrder).ToList(),
 | 
			
		||||
                    tt.DataTableName)
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
@ -492,17 +499,32 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
        return dt;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal Guid GetHeaderAttachmentID(int toolTypeId, long headerId)
 | 
			
		||||
    Guid IMetrologyRepository.GetHeaderAttachmentID(int toolTypeId, long headerId)
 | 
			
		||||
    {
 | 
			
		||||
        Guid result;
 | 
			
		||||
        ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
 | 
			
		||||
 | 
			
		||||
        using DbConnection conn = _DBConnectionFactory.GetDbConnection();
 | 
			
		||||
        string sql =
 | 
			
		||||
            $"SELECT AttachmentID FROM [{tt.HeaderTableName}] WHERE ID = @HeaderID";
 | 
			
		||||
        result = conn.ExecuteScalar<Guid>(sql, param: new { HeaderID = headerId });
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void IMetrologyRepository.SetHeaderAttachmentID(int toolTypeId, long headerId, string attachmentId)
 | 
			
		||||
    {
 | 
			
		||||
        ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
 | 
			
		||||
 | 
			
		||||
        using DbConnection conn = _DBConnectionFactory.GetDbConnection();
 | 
			
		||||
        string sql =
 | 
			
		||||
            $"UPDATE [{tt.HeaderTableName}] SET AttachmentID = NEWID() WHERE ID = @HeaderID AND AttachmentID IS NULL; " +
 | 
			
		||||
            $"UPDATE [{tt.HeaderTableName}] SET AttachmentID = @AttachmentID WHERE ID = @HeaderID AND AttachmentID IS NULL; " +
 | 
			
		||||
            $"SELECT AttachmentID FROM [{tt.HeaderTableName}] WHERE ID = @HeaderID";
 | 
			
		||||
        return conn.ExecuteScalar<Guid>(sql, param: new { HeaderID = headerId });
 | 
			
		||||
        Guid guid = conn.ExecuteScalar<Guid>(sql, param: new { HeaderID = headerId, AttachmentID = attachmentId });
 | 
			
		||||
        if (attachmentId != guid.ToString())
 | 
			
		||||
            throw new NotSupportedException($"{attachmentId} != {guid}");
 | 
			
		||||
    }
 | 
			
		||||
    internal string GetHeaderInsertDate(int toolTypeId, long headerId)
 | 
			
		||||
 | 
			
		||||
    string IMetrologyRepository.GetHeaderInsertDate(int toolTypeId, long headerId)
 | 
			
		||||
    {
 | 
			
		||||
        ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
 | 
			
		||||
 | 
			
		||||
@ -511,7 +533,8 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
            $"SELECT CONVERT(varchar, case when [InsertDate] < [Date] or [Date] is null then [InsertDate] else [Date] end, 120) d FROM[{tt.HeaderTableName}] where ID = @HeaderID";
 | 
			
		||||
        return conn.ExecuteScalar<string>(sql, param: new { HeaderID = headerId });
 | 
			
		||||
    }
 | 
			
		||||
    internal string GetAttachmentInsertDateByGUID(string tableName, Guid attachmentId)
 | 
			
		||||
 | 
			
		||||
    string IMetrologyRepository.GetAttachmentInsertDateByGUID(string tableName, Guid attachmentId)
 | 
			
		||||
    {
 | 
			
		||||
        using DbConnection conn = _DBConnectionFactory.GetDbConnection();
 | 
			
		||||
        string sql = "";
 | 
			
		||||
@ -526,24 +549,27 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
 | 
			
		||||
        return conn.ExecuteScalar<string>(sql, param: new { AttachmentID = attachmentId });
 | 
			
		||||
    }
 | 
			
		||||
    internal void SetHeaderDirName(string tableName, long headerId, string dateDir)
 | 
			
		||||
 | 
			
		||||
    void IMetrologyRepository.SetHeaderDirName(string tableName, long headerId, string dateDir)
 | 
			
		||||
    {
 | 
			
		||||
        using DbConnection conn = _DBConnectionFactory.GetDbConnection();
 | 
			
		||||
        _ = conn.Execute($"UPDATE [{tableName}] SET AttachDirName = @AttachDirName WHERE ID = @HeaderID;", new { HeaderID = headerId, AttachDirName = dateDir });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal Guid GetDataAttachmentID(int toolTypeId, long headerId, string title)
 | 
			
		||||
    void IMetrologyRepository.SetDataAttachmentID(int toolTypeId, long headerId, string title, string attachmentId)
 | 
			
		||||
    {
 | 
			
		||||
        ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
 | 
			
		||||
 | 
			
		||||
        using DbConnection conn = _DBConnectionFactory.GetDbConnection();
 | 
			
		||||
        string sql =
 | 
			
		||||
            $"UPDATE [{tt.DataTableName}] SET AttachmentID = NEWID() WHERE HeaderID = @HeaderID AND Title = @Title AND AttachmentID IS NULL; " +
 | 
			
		||||
            $"UPDATE [{tt.DataTableName}] SET AttachmentID = @AttachmentID WHERE HeaderID = @HeaderID AND Title = @Title AND AttachmentID IS NULL; " +
 | 
			
		||||
            $"SELECT AttachmentID FROM [{tt.DataTableName}] WHERE HeaderID = @HeaderID AND Title = @Title";
 | 
			
		||||
        return conn.ExecuteScalar<Guid>(sql, param: new { HeaderID = headerId, Title = title });
 | 
			
		||||
        Guid guid = conn.ExecuteScalar<Guid>(sql, param: new { HeaderID = headerId, AttachmentID = attachmentId, Title = title });
 | 
			
		||||
        if (attachmentId != guid.ToString())
 | 
			
		||||
            throw new NotSupportedException($"{attachmentId} != {guid}");
 | 
			
		||||
    }
 | 
			
		||||
    // J Ouellette Added
 | 
			
		||||
    internal string GetDataInsertDate(int toolTypeId, long headerId, string title)
 | 
			
		||||
 | 
			
		||||
    string IMetrologyRepository.GetDataInsertDate(int toolTypeId, long headerId, string title)
 | 
			
		||||
    {
 | 
			
		||||
        ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
 | 
			
		||||
 | 
			
		||||
@ -560,7 +586,8 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
 | 
			
		||||
        return conn.ExecuteScalar<string>(sql, param: new { HeaderID = headerId, Title = title });
 | 
			
		||||
    }
 | 
			
		||||
    internal void SetDataDirName(string tableName, long headerId, string title, string dateDir)
 | 
			
		||||
 | 
			
		||||
    void IMetrologyRepository.SetDataDirName(string tableName, long headerId, string title, string dateDir)
 | 
			
		||||
    {
 | 
			
		||||
        using DbConnection conn = _DBConnectionFactory.GetDbConnection();
 | 
			
		||||
        string sql =
 | 
			
		||||
@ -568,13 +595,13 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
        _ = conn.Execute(sql, param: new { HeaderID = headerId, Title = title, AttachDirName = dateDir });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal void PurgeExistingData(int toolTypeId, string title)
 | 
			
		||||
    void IMetrologyRepository.PurgeExistingData(int toolTypeId, string title)
 | 
			
		||||
    {
 | 
			
		||||
        using DbConnection conn = _DBConnectionFactory.GetDbConnection();
 | 
			
		||||
        _ = conn.Execute("PurgeExistingData", param: new { ToolTypeID = toolTypeId, Title = title }, commandType: CommandType.StoredProcedure);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal DataSet GetOIExportData(int toolTypeId, long headerid)
 | 
			
		||||
    DataSet IMetrologyRepository.GetOIExportData(int toolTypeId, long headerid)
 | 
			
		||||
    {
 | 
			
		||||
        ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
 | 
			
		||||
 | 
			
		||||
@ -626,7 +653,7 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
        return results.ToArray();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal HeaderCommon[] GetHeaderTitles(int? toolTypeId, int? pageNo, int? pageSize, out long totalRecords)
 | 
			
		||||
    HeaderCommon[] IMetrologyRepository.GetHeaderTitles(int? toolTypeId, int? pageNo, int? pageSize, out long totalRecords)
 | 
			
		||||
    {
 | 
			
		||||
        HeaderCommon[] headers;
 | 
			
		||||
        if (toolTypeId is not null && (pageNo is not null || pageSize is not null))
 | 
			
		||||
@ -662,7 +689,7 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
        return headers;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal IEnumerable<KeyValuePair<string, string>> GetHeaderFields(int toolTypeId, long headerid)
 | 
			
		||||
    IEnumerable<KeyValuePair<string, string>> IMetrologyRepository.GetHeaderFields(int toolTypeId, long headerid)
 | 
			
		||||
    {
 | 
			
		||||
        ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
 | 
			
		||||
 | 
			
		||||
@ -689,7 +716,9 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
            if (dt.Rows.Count > 0)
 | 
			
		||||
                dr = dt.Rows[0];
 | 
			
		||||
 | 
			
		||||
            foreach (ToolTypeMetadata m in md.Where(m => m.Header == true && m.TableDisplayOrder > 0).OrderBy(m => m.TableDisplayOrder))
 | 
			
		||||
            foreach (ToolTypeMetadata m in md.Where(m =>
 | 
			
		||||
                m.Header == true && m.TableDisplayOrder > 0).OrderBy(m =>
 | 
			
		||||
                m.TableDisplayOrder))
 | 
			
		||||
            {
 | 
			
		||||
                string v = "";
 | 
			
		||||
                if (dr is not null)
 | 
			
		||||
@ -705,7 +734,7 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
        return r;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal IEnumerable<AwaitingDisposition> GetAwaitingDisposition()
 | 
			
		||||
    IEnumerable<AwaitingDisposition> IMetrologyRepository.GetAwaitingDisposition()
 | 
			
		||||
    {
 | 
			
		||||
        IEnumerable<AwaitingDisposition>? r;
 | 
			
		||||
        if (!string.IsNullOrEmpty(_MockRoot))
 | 
			
		||||
@ -723,7 +752,7 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
        return r;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal int UpdateReviewDate(int toolTypeId, long headerId, bool clearDate)
 | 
			
		||||
    int IMetrologyRepository.UpdateReviewDate(int toolTypeId, long headerId, bool clearDate)
 | 
			
		||||
    {
 | 
			
		||||
        ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
 | 
			
		||||
 | 
			
		||||
@ -743,7 +772,7 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal Guid GetHeaderAttachmentIDByTitle(int toolTypeId, string title)
 | 
			
		||||
    Guid IMetrologyRepository.GetHeaderAttachmentIDByTitle(int toolTypeId, string title)
 | 
			
		||||
    {
 | 
			
		||||
        ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
 | 
			
		||||
 | 
			
		||||
@ -753,7 +782,7 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
        return conn.ExecuteScalar<Guid>(sql, param: new { Title = title });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal Guid GetDataAttachmentIDByTitle(int toolTypeId, string title)
 | 
			
		||||
    Guid IMetrologyRepository.GetDataAttachmentIDByTitle(int toolTypeId, string title)
 | 
			
		||||
    {
 | 
			
		||||
        ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
 | 
			
		||||
 | 
			
		||||
@ -763,31 +792,13 @@ public class MetrologyRepository : IMetrologyRepository
 | 
			
		||||
        return conn.ExecuteScalar<Guid>(sql, param: new { Title = title });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    DataTable IMetrologyRepository.GetDataSharePoint(int toolTypeId, string headerId) => throw new NotImplementedException();
 | 
			
		||||
 | 
			
		||||
    IEnumerable<ToolType> IMetrologyRepository.GetToolTypes() => GetToolTypes();
 | 
			
		||||
    ToolType IMetrologyRepository.GetToolTypeByName(string name) => GetToolTypeByName(name);
 | 
			
		||||
    ToolType IMetrologyRepository.GetToolTypeByID(int id) => GetToolTypeByID(id);
 | 
			
		||||
    IEnumerable<ToolTypeMetadata> IMetrologyRepository.GetToolTypeMetadataByToolTypeID(int id) => GetToolTypeMetadataByToolTypeID(id);
 | 
			
		||||
    TransactionScope IMetrologyRepository.StartTransaction() => StartTransaction();
 | 
			
		||||
    void IMetrologyRepository.PurgeExistingData(int toolTypeId, string title) => PurgeExistingData(toolTypeId, title);
 | 
			
		||||
    long IMetrologyRepository.InsertToolDataJSON(JToken jsonbody, long headerId, List<ToolTypeMetadata> metaData, string tableName) => InsertToolDataJSON(jsonbody, headerId, metaData, tableName);
 | 
			
		||||
    DataTable IMetrologyRepository.ExportData(string spName, DateTime startTime, DateTime endTime) => ExportData(spName, startTime, endTime);
 | 
			
		||||
    DataTable IMetrologyRepository.GetHeaders(int toolTypeId, string? startTime, string? endTime, int? pageNo, int? pageSize, long? headerid, out long totalRecords) => GetHeaders(toolTypeId, startTime, endTime, pageNo, pageSize, headerid, out totalRecords);
 | 
			
		||||
    DataTable IMetrologyRepository.GetData(int toolTypeId, long headerId) => GetData(toolTypeId, headerId);
 | 
			
		||||
    HeaderCommon[] IMetrologyRepository.GetHeaderTitles(int? toolTypeId, int? pageNo, int? pageSize, out long totalRecords) => GetHeaderTitles(toolTypeId, pageNo, pageSize, out totalRecords);
 | 
			
		||||
    Guid IMetrologyRepository.GetHeaderAttachmentIDByTitle(int toolTypeId, string title) => GetHeaderAttachmentIDByTitle(toolTypeId, title);
 | 
			
		||||
    Guid IMetrologyRepository.GetDataAttachmentIDByTitle(int toolTypeId, string title) => GetDataAttachmentIDByTitle(toolTypeId, title);
 | 
			
		||||
    Guid IMetrologyRepository.GetHeaderAttachmentID(int toolTypeId, long headerId) => GetHeaderAttachmentID(toolTypeId, headerId);
 | 
			
		||||
    string IMetrologyRepository.GetHeaderInsertDate(int toolTypeId, long headerId) => GetHeaderInsertDate(toolTypeId, headerId);
 | 
			
		||||
    string IMetrologyRepository.GetAttachmentInsertDateByGUID(string tableName, Guid attachmentId) => GetAttachmentInsertDateByGUID(tableName, attachmentId);
 | 
			
		||||
    void IMetrologyRepository.SetHeaderDirName(string tableName, long headerId, string dateDir) => SetHeaderDirName(tableName, headerId, dateDir);
 | 
			
		||||
    Guid IMetrologyRepository.GetDataAttachmentID(int toolTypeId, long headerId, string title) => GetDataAttachmentID(toolTypeId, headerId, title);
 | 
			
		||||
    string IMetrologyRepository.GetDataInsertDate(int toolTypeId, long headerId, string title) => GetDataInsertDate(toolTypeId, headerId, title);
 | 
			
		||||
    void IMetrologyRepository.SetDataDirName(string tableName, long headerId, string title, string dateDir) => SetDataDirName(tableName, headerId, title, dateDir);
 | 
			
		||||
    DataSet IMetrologyRepository.GetOIExportData(int toolTypeId, long headerid) => GetOIExportData(toolTypeId, headerid);
 | 
			
		||||
    IEnumerable<KeyValuePair<string, string>> IMetrologyRepository.GetHeaderFields(int toolTypeId, long headerid) => GetHeaderFields(toolTypeId, headerid);
 | 
			
		||||
    IEnumerable<AwaitingDisposition> IMetrologyRepository.GetAwaitingDisposition() => GetAwaitingDisposition();
 | 
			
		||||
    int IMetrologyRepository.UpdateReviewDate(int toolTypeId, long headerId, bool clearDate) => UpdateReviewDate(toolTypeId, headerId, clearDate);
 | 
			
		||||
    IEnumerable<ToolType> IMetrologyRepository.GetToolTypes() =>
 | 
			
		||||
        GetToolTypes();
 | 
			
		||||
    ToolType IMetrologyRepository.GetToolTypeByID(int id) =>
 | 
			
		||||
        GetToolTypeByID(id);
 | 
			
		||||
    TransactionScope IMetrologyRepository.StartTransaction() =>
 | 
			
		||||
        StartTransaction();
 | 
			
		||||
    IEnumerable<ToolTypeMetadata> IMetrologyRepository.GetToolTypeMetadataByToolTypeID(int id) =>
 | 
			
		||||
        GetToolTypeMetadataByToolTypeID(id);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -3,7 +3,6 @@ using OI.Metrology.Shared.DataModels;
 | 
			
		||||
using OI.Metrology.Shared.Models.Stateless;
 | 
			
		||||
using OI.Metrology.Shared.Services;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Text.Json;
 | 
			
		||||
 | 
			
		||||
namespace OI.Metrology.Server.Repository;
 | 
			
		||||
@ -228,7 +227,7 @@ public class ToolTypesRepository : IToolTypesRepository
 | 
			
		||||
                {
 | 
			
		||||
                    HttpClient httpClient = _HttpClientFactory.CreateClient();
 | 
			
		||||
                    httpClient.BaseAddress = new(_AppSettings.ApiFileShare);
 | 
			
		||||
                    _FileShareRepository.CopyFile(httpClient, processDataStandardFormat, Path.Combine(directly, $"Viewer_{Path.GetFileName(processDataStandardFormat)}"));
 | 
			
		||||
                    _FileShareRepository.CopyFile(httpClient, processDataStandardFormat, Path.Combine(directly, $"Viewer{Path.GetFileName(processDataStandardFormat)}"));
 | 
			
		||||
                    result = null;
 | 
			
		||||
                }
 | 
			
		||||
                catch (Exception ex) { result = ex.Message; }
 | 
			
		||||
@ -237,96 +236,4 @@ public class ToolTypesRepository : IToolTypesRepository
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Result<DataTable> IToolTypesRepository.GetExportData(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend)
 | 
			
		||||
    {
 | 
			
		||||
        Result<DataTable>? r;
 | 
			
		||||
        if (!string.IsNullOrEmpty(_MockRoot))
 | 
			
		||||
        {
 | 
			
		||||
            string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IToolTypesRepository.GetExportData)}.json"));
 | 
			
		||||
            r = Newtonsoft.Json.JsonConvert.DeserializeObject<Result<DataTable>>(json);
 | 
			
		||||
            if (r is null)
 | 
			
		||||
                throw new NullReferenceException(nameof(r));
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            DateTime dateEnd = dateend is null ? DateTime.Now : DateTime.Parse(dateend);
 | 
			
		||||
            DateTime dateBegin = datebegin is null ? dateEnd.AddMonths(-1) : DateTime.Parse(datebegin);
 | 
			
		||||
            ToolType tt = metrologyRepository.GetToolTypeByID(toolTypeId);
 | 
			
		||||
            if (string.IsNullOrEmpty(tt.ExportSPName))
 | 
			
		||||
                throw new NullReferenceException(nameof(tt.ExportSPName));
 | 
			
		||||
            DataTable dataTable = metrologyRepository.ExportData(tt.ExportSPName, dateBegin, dateEnd);
 | 
			
		||||
            r = new()
 | 
			
		||||
            {
 | 
			
		||||
                Results = dataTable,
 | 
			
		||||
                TotalRows = dataTable.Rows.Count,
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
        return r;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected static string FormatForCSV(string v)
 | 
			
		||||
    {
 | 
			
		||||
        StringBuilder result = new(v.Length + 2);
 | 
			
		||||
        bool doubleQuoted = false;
 | 
			
		||||
        if (v.StartsWith(' ') || v.EndsWith(' ') || v.Contains(',') || v.Contains('"'))
 | 
			
		||||
        {
 | 
			
		||||
            _ = result.Append('"');
 | 
			
		||||
            doubleQuoted = true;
 | 
			
		||||
        }
 | 
			
		||||
        foreach (char c in v)
 | 
			
		||||
        {
 | 
			
		||||
            _ = c switch
 | 
			
		||||
            {
 | 
			
		||||
                '\r' or '\n' => result.Append(' '),
 | 
			
		||||
                '"' => result.Append("\"\""),
 | 
			
		||||
                _ => result.Append(c),
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
        if (doubleQuoted)
 | 
			
		||||
            _ = result.Append('"');
 | 
			
		||||
        return result.ToString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected static string GetColumnHeaders(DataTable dataTable)
 | 
			
		||||
    {
 | 
			
		||||
        StringBuilder result = new();
 | 
			
		||||
        for (int i = 0; i < dataTable.Columns.Count; i++)
 | 
			
		||||
        {
 | 
			
		||||
            if (i > 0)
 | 
			
		||||
                _ = result.Append(',');
 | 
			
		||||
            _ = result.Append(FormatForCSV(dataTable.Columns[i].ColumnName.TrimEnd('_')));
 | 
			
		||||
        }
 | 
			
		||||
        return result.ToString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected static string GetRowData(DataRow dr)
 | 
			
		||||
    {
 | 
			
		||||
        StringBuilder result = new();
 | 
			
		||||
        for (int i = 0; i < dr.Table.Columns.Count; i++)
 | 
			
		||||
        {
 | 
			
		||||
            if (i > 0)
 | 
			
		||||
                _ = result.Append(',');
 | 
			
		||||
            object v = dr[i];
 | 
			
		||||
            if (v is not null && !Convert.IsDBNull(v))
 | 
			
		||||
                _ = result.Append(FormatForCSV(string.Concat(Convert.ToString(v))));
 | 
			
		||||
        }
 | 
			
		||||
        return result.ToString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    byte[] IToolTypesRepository.GetCSVExport(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend)
 | 
			
		||||
    {
 | 
			
		||||
        byte[] results;
 | 
			
		||||
        Result<DataTable> result;
 | 
			
		||||
        IToolTypesRepository repository = this;
 | 
			
		||||
        result = repository.GetExportData(metrologyRepository, toolTypeId, datebegin, dateend);
 | 
			
		||||
        if (result.Results is null)
 | 
			
		||||
            throw new NullReferenceException(nameof(result.Results));
 | 
			
		||||
        StringBuilder stringBuilder = new();
 | 
			
		||||
        _ = stringBuilder.AppendLine(GetColumnHeaders(result.Results));
 | 
			
		||||
        foreach (DataRow dr in result.Results.Rows)
 | 
			
		||||
            _ = stringBuilder.AppendLine(GetRowData(dr));
 | 
			
		||||
        results = Encoding.UTF8.GetBytes(stringBuilder.ToString());
 | 
			
		||||
        return results;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -39,7 +39,7 @@ public class AttachmentsService : IAttachmentsService
 | 
			
		||||
        HttpClient httpClient = _HttpClientFactory.CreateClient();
 | 
			
		||||
        Uri mesaFileShareMetrologySi = new(_AppSettings.EcMesaFileShareMetrologySi);
 | 
			
		||||
        int weekNum = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(insertDate, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
 | 
			
		||||
        Uri uri = _FileShareRepository.Append(mesaFileShareMetrologySi, $"{tableName}_", year, $"WW{weekNum:00}", attachmentId.ToString(), filename);
 | 
			
		||||
        Uri uri = _FileShareRepository.Append(mesaFileShareMetrologySi, "MetrologyAttachments", $"{tableName}_", year, $"WW{weekNum:00}", attachmentId.ToString(), filename);
 | 
			
		||||
        HttpResponseMessage httpResponseMessage = _FileShareRepository.ReadFile(httpClient, uri);
 | 
			
		||||
        if (httpResponseMessage.StatusCode != System.Net.HttpStatusCode.OK)
 | 
			
		||||
            throw new Exception("File not found!");
 | 
			
		||||
@ -77,63 +77,36 @@ public class AttachmentsService : IAttachmentsService
 | 
			
		||||
        return GetAttachmentStream(tableName, attachmentId, filename);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void SaveAttachment(ToolType toolType, long headerId, string dataUniqueId, string filename, IFormFile uploadedFile)
 | 
			
		||||
    void IAttachmentsService.SaveAttachment(ToolType toolType, Attachment attachment)
 | 
			
		||||
    {
 | 
			
		||||
        if (toolType is null)
 | 
			
		||||
            throw new Exception("Invalid tool type");
 | 
			
		||||
 | 
			
		||||
        using System.Transactions.TransactionScope trans = _MetrologyRepository.StartTransaction();
 | 
			
		||||
        Guid attachmentId = Guid.Empty;
 | 
			
		||||
        DateTime insertDate = new();
 | 
			
		||||
        string? tableName = "";
 | 
			
		||||
        if (string.IsNullOrWhiteSpace(dataUniqueId))
 | 
			
		||||
        {
 | 
			
		||||
            attachmentId = _MetrologyRepository.GetHeaderAttachmentID(toolType.ID, headerId);
 | 
			
		||||
            insertDate = Convert.ToDateTime(_MetrologyRepository.GetHeaderInsertDate(toolType.ID, headerId));
 | 
			
		||||
            tableName = toolType.HeaderTableName;
 | 
			
		||||
        }
 | 
			
		||||
        if (attachment.HeaderId is null)
 | 
			
		||||
            throw new NullReferenceException($"{nameof(attachment.HeaderId)}");
 | 
			
		||||
        if (attachment.AttachmentId is null)
 | 
			
		||||
            throw new NullReferenceException($"{nameof(attachment.AttachmentId)}");
 | 
			
		||||
        if (attachment.DestinationFileName is null)
 | 
			
		||||
            throw new NullReferenceException($"{nameof(attachment.DestinationFileName)}");
 | 
			
		||||
        if (string.IsNullOrWhiteSpace(attachment.UniqueId))
 | 
			
		||||
            throw new NullReferenceException($"{nameof(attachment.UniqueId)}");
 | 
			
		||||
        if (attachment.DestinationFileName != "Image.pdf")
 | 
			
		||||
            _MetrologyRepository.SetHeaderAttachmentID(toolType.ID, attachment.HeaderId.Value, attachment.AttachmentId);
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            attachmentId = _MetrologyRepository.GetDataAttachmentID(toolType.ID, headerId, dataUniqueId);
 | 
			
		||||
            insertDate = Convert.ToDateTime(_MetrologyRepository.GetDataInsertDate(toolType.ID, headerId, dataUniqueId));
 | 
			
		||||
            // Get Date for new directory name
 | 
			
		||||
            tableName = toolType.DataTableName;
 | 
			
		||||
        }
 | 
			
		||||
        if (Equals(attachmentId, Guid.Empty))
 | 
			
		||||
        {
 | 
			
		||||
            trans.Dispose();
 | 
			
		||||
            throw new Exception("Invalid attachment ID!");
 | 
			
		||||
        }
 | 
			
		||||
        string year = insertDate.Year.ToString();
 | 
			
		||||
        HttpClient httpClient = _HttpClientFactory.CreateClient();
 | 
			
		||||
        Uri mesaFileShareMetrologySi = new(_AppSettings.EcMesaFileShareMetrologySi);
 | 
			
		||||
        int weekNum = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(insertDate, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
 | 
			
		||||
        Uri uri = _FileShareRepository.Append(mesaFileShareMetrologySi, $"{tableName}_", year, $"WW{weekNum:00}", attachmentId.ToString(), filename);
 | 
			
		||||
        HttpResponseMessage httpResponseMessage = _FileShareRepository.ReadFile(httpClient, uri);
 | 
			
		||||
        if (httpResponseMessage.StatusCode != System.Net.HttpStatusCode.OK)
 | 
			
		||||
        {
 | 
			
		||||
            trans.Dispose();
 | 
			
		||||
            throw new Exception("Invalid attachment path!");
 | 
			
		||||
        }
 | 
			
		||||
        uploadedFile.CopyTo(httpResponseMessage.Content.ReadAsStream());
 | 
			
		||||
        trans.Complete();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void IAttachmentsService.SaveAttachment(ToolType toolType, long headerId, string dataUniqueId, string filename, object uploadedFile)
 | 
			
		||||
    {
 | 
			
		||||
        IFormFile formFile = (IFormFile)uploadedFile;
 | 
			
		||||
        SaveAttachment(toolType, headerId, dataUniqueId, filename, formFile);
 | 
			
		||||
            _MetrologyRepository.SetDataAttachmentID(toolType.ID, attachment.HeaderId.Value, attachment.UniqueId, attachment.AttachmentId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    string? IAttachmentsService.GetProcessDataStandardFormat(IMetrologyRepository metrologyRepository, int toolTypeId, long headerId)
 | 
			
		||||
    {
 | 
			
		||||
        string? result;
 | 
			
		||||
        int weekNum;
 | 
			
		||||
        string file;
 | 
			
		||||
        string year;
 | 
			
		||||
        string directory;
 | 
			
		||||
        Task<string> json;
 | 
			
		||||
        Uri weekDirectory;
 | 
			
		||||
        Uri checkDirectory;
 | 
			
		||||
        List<string> files = new();
 | 
			
		||||
        string[] collection = ["-", string.Empty];
 | 
			
		||||
        NginxFileSystem[]? nginxFileSystemCollection;
 | 
			
		||||
        Task<HttpResponseMessage> httpResponseMessage;
 | 
			
		||||
        HttpClient httpClient = _HttpClientFactory.CreateClient();
 | 
			
		||||
@ -142,21 +115,32 @@ public class AttachmentsService : IAttachmentsService
 | 
			
		||||
        ToolType toolType = metrologyRepository.GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
 | 
			
		||||
        foreach (DateTime dateTime in dateTimes)
 | 
			
		||||
        {
 | 
			
		||||
            year = dateTime.Year.ToString();
 | 
			
		||||
            weekNum = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
 | 
			
		||||
            weekDirectory = _FileShareRepository.Append(mesaFileShareMetrologySi, $"{toolType.HeaderTableName}_", year, $"WW{weekNum:00}");
 | 
			
		||||
            checkDirectory = _FileShareRepository.Append(weekDirectory, headerId.ToString());
 | 
			
		||||
            httpResponseMessage = httpClient.GetAsync(checkDirectory);
 | 
			
		||||
            httpResponseMessage.Wait();
 | 
			
		||||
            if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK)
 | 
			
		||||
                continue;
 | 
			
		||||
            json = httpResponseMessage.Result.Content.ReadAsStringAsync();
 | 
			
		||||
            json.Wait();
 | 
			
		||||
            nginxFileSystemCollection = JsonSerializer.Deserialize(json.Result, NginxFileSystemCollectionSourceGenerationContext.Default.NginxFileSystemArray);
 | 
			
		||||
            if (nginxFileSystemCollection is null)
 | 
			
		||||
                continue;
 | 
			
		||||
            foreach (NginxFileSystem nginxFileSystem in nginxFileSystemCollection)
 | 
			
		||||
                files.Add(_FileShareRepository.Append(checkDirectory, nginxFileSystem.Name).AbsoluteUri);
 | 
			
		||||
            foreach (string item in collection)
 | 
			
		||||
            {
 | 
			
		||||
                year = dateTime.Year.ToString();
 | 
			
		||||
                weekNum = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
 | 
			
		||||
                weekDirectory = _FileShareRepository.Append(mesaFileShareMetrologySi, "MetrologyAttachments", $"{toolType.HeaderTableName}_", year, $"WW{weekNum:00}");
 | 
			
		||||
                checkDirectory = _FileShareRepository.Append(weekDirectory, $"{item}{headerId}");
 | 
			
		||||
                directory = Path.Combine(_AppSettings.EcMetrologySi, "MetrologyAttachments", $"{toolType.HeaderTableName}_", year, $"WW{weekNum:00}", $"{item}{headerId}");
 | 
			
		||||
                httpResponseMessage = httpClient.GetAsync(checkDirectory);
 | 
			
		||||
                httpResponseMessage.Wait();
 | 
			
		||||
                if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK)
 | 
			
		||||
                    continue;
 | 
			
		||||
                json = httpResponseMessage.Result.Content.ReadAsStringAsync();
 | 
			
		||||
                json.Wait();
 | 
			
		||||
                nginxFileSystemCollection = JsonSerializer.Deserialize(json.Result, NginxFileSystemCollectionSourceGenerationContext.Default.NginxFileSystemArray);
 | 
			
		||||
                if (nginxFileSystemCollection is null)
 | 
			
		||||
                    continue;
 | 
			
		||||
                foreach (NginxFileSystem nginxFileSystem in nginxFileSystemCollection)
 | 
			
		||||
                {
 | 
			
		||||
                    if (!nginxFileSystem.Name.EndsWith(".pdsf"))
 | 
			
		||||
                        continue;
 | 
			
		||||
                    file = Path.Combine(directory, nginxFileSystem.Name);
 | 
			
		||||
                    files.Add(file);
 | 
			
		||||
                }
 | 
			
		||||
                if (files.Count != 0)
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
            if (files.Count != 0)
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -1,96 +0,0 @@
 | 
			
		||||
@using OI.Metrology.Shared.ViewModels
 | 
			
		||||
@model OI.Metrology.Shared.ViewModels.Export
 | 
			
		||||
@{
 | 
			
		||||
    ViewData["Title"] = "Export Data";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
<style>
 | 
			
		||||
    td {
 | 
			
		||||
        padding-bottom: 2em;
 | 
			
		||||
        padding-right: 1em;
 | 
			
		||||
    }
 | 
			
		||||
</style>
 | 
			
		||||
 | 
			
		||||
<h3>Export Data</h3>
 | 
			
		||||
 | 
			
		||||
<hr />
 | 
			
		||||
 | 
			
		||||
<form asp-controller="Export" asp-action="ExportData" method="post" class="form-inline">
 | 
			
		||||
    <div class="form-group">
 | 
			
		||||
        <label for="ToolType">Tool Type</label>
 | 
			
		||||
        <div class="form-control" id="ToolType" name="ToolType"></div>
 | 
			
		||||
        @Html.ValidationMessage("ToolType", new { @class = "text-danger" })
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="form-group">
 | 
			
		||||
        <label for="StartDate">Start Time</label>
 | 
			
		||||
        <div class="form-control mb-2 mr-sm-2" id="StartDateControl"></div>
 | 
			
		||||
        <div class="form-control mb-2 mr-sm-2" id="StartTimeControl"></div>
 | 
			
		||||
        @Html.ValidationMessage("StartDate", new { @class = "text-danger" })
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="form-group">
 | 
			
		||||
        <label for="EndDate">End Time</label>
 | 
			
		||||
        <div class="form-control mb-2 mr-sm-2" id="EndDateControl"></div>
 | 
			
		||||
        <div class="form-control mb-2 mr-sm-2" id="EndTimeControl"></div>
 | 
			
		||||
        @Html.ValidationMessage("EndDate", new { @class = "text-danger" })
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="form-group">
 | 
			
		||||
        <button type="submit" class="btn btn-primary">Export Data</button>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="form-group">
 | 
			
		||||
        @Html.ValidationMessage("Exception", new { @class = "text-danger" })
 | 
			
		||||
    </div>
 | 
			
		||||
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
 | 
			
		||||
 | 
			
		||||
</form>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
 | 
			
		||||
    $(document).ready(function () {
 | 
			
		||||
        
 | 
			
		||||
        var apiUrl = "@ViewBag.ApiUrl";
 | 
			
		||||
        
 | 
			
		||||
        $("#ToolType").igCombo({
 | 
			
		||||
            dataSource: apiUrl + '/tooltypes',
 | 
			
		||||
            responseDataKey: "Results",
 | 
			
		||||
            textKey: "ToolTypeName",
 | 
			
		||||
            valueKey: "ID",
 | 
			
		||||
            mode: "dropdown",
 | 
			
		||||
            width: 150
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        var startTime = new Date("@Model.StartTime.ToString("yyyy-MM-ddTHH:mm")");
 | 
			
		||||
 | 
			
		||||
        $("#StartDateControl").igDatePicker({
 | 
			
		||||
            dateInputFormat: "date",
 | 
			
		||||
            value: startTime,
 | 
			
		||||
            width: 125,
 | 
			
		||||
            inputName: "StartDate",
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        $("#StartTimeControl").igTimePicker({
 | 
			
		||||
            dateInputFormat: "time",
 | 
			
		||||
            value: startTime,
 | 
			
		||||
            width: 110,
 | 
			
		||||
            inputName: "StartTime",
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        var endTime = new Date("@Model.EndTime.ToString("yyyy-MM-ddTHH:mm")");
 | 
			
		||||
 | 
			
		||||
        $("#EndDateControl").igDatePicker({
 | 
			
		||||
            dateInputFormat: "date",
 | 
			
		||||
            value: endTime,
 | 
			
		||||
            width: 125,
 | 
			
		||||
            inputName: "EndDate",
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        $("#EndTimeControl").igTimePicker({
 | 
			
		||||
            dateInputFormat: "time",
 | 
			
		||||
            value: endTime,
 | 
			
		||||
            width: 110,
 | 
			
		||||
            inputName: "EndTime",
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
@ -1,28 +0,0 @@
 | 
			
		||||
@{
 | 
			
		||||
    ViewData["Title"] = "Awaiting Disposition";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
<h4>Awaiting Disposition</h4>
 | 
			
		||||
 | 
			
		||||
<div style="height: 450px;">
 | 
			
		||||
    <table id="grid"></table>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div class="row" style="margin-top: 10px; margin-bottom: 20px;">
 | 
			
		||||
    <div class="col-xs-1">
 | 
			
		||||
        <input type="button" id="OpenButton" value="Open" />
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="col-xs-1">
 | 
			
		||||
        <input type="button" id="RefreshButton" value="Refresh" />
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
 | 
			
		||||
    $(document).ready(function () {
 | 
			
		||||
 | 
			
		||||
        initAwaitingDisposition("@ViewBag.ApiUrl");
 | 
			
		||||
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
@ -1,3 +0,0 @@
 | 
			
		||||
@{
 | 
			
		||||
    ViewData["Title"] = "Metrology Home Page";
 | 
			
		||||
}
 | 
			
		||||
@ -1,57 +0,0 @@
 | 
			
		||||
@{
 | 
			
		||||
    ViewData["Title"] = "Run Headers";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
<style>
 | 
			
		||||
    html,
 | 
			
		||||
    body {
 | 
			
		||||
        height: 100%;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    div.container-fluid {
 | 
			
		||||
        height: 90%;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #HeaderGrid,
 | 
			
		||||
    #FieldsGrid {
 | 
			
		||||
        font-size: 12px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .FieldTitle {
 | 
			
		||||
        font-weight: bold;
 | 
			
		||||
    }
 | 
			
		||||
</style>
 | 
			
		||||
 | 
			
		||||
<h4>Run Headers</h4>
 | 
			
		||||
 | 
			
		||||
<table>
 | 
			
		||||
    <tr>
 | 
			
		||||
        <td>
 | 
			
		||||
            <label for="ToolType">Tool Type:</label>
 | 
			
		||||
        </td>
 | 
			
		||||
        <td>
 | 
			
		||||
            <div id="ToolType"></div>
 | 
			
		||||
        </td>
 | 
			
		||||
    </tr>
 | 
			
		||||
</table>
 | 
			
		||||
 | 
			
		||||
<table width="100%" height="80%">
 | 
			
		||||
    <tr>
 | 
			
		||||
        <td width="50%">
 | 
			
		||||
            <table id="HeaderGrid"></table>
 | 
			
		||||
        </td>
 | 
			
		||||
        <td width="50%">
 | 
			
		||||
            <table id="FieldsGrid"></table>
 | 
			
		||||
        </td>
 | 
			
		||||
    </tr>
 | 
			
		||||
</table>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
 | 
			
		||||
    $(document).ready(function () {
 | 
			
		||||
 | 
			
		||||
        initRunHeaders("@ViewBag.ApiUrl");
 | 
			
		||||
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
@ -1,104 +0,0 @@
 | 
			
		||||
@model OI.Metrology.Shared.ViewModels.RunInfo
 | 
			
		||||
@{
 | 
			
		||||
    ViewData["Title"] = "Run Information";
 | 
			
		||||
}
 | 
			
		||||
<style>
 | 
			
		||||
    #HeaderGridDiv,
 | 
			
		||||
    #DetailsGridDiv {
 | 
			
		||||
        font-size: 12px;
 | 
			
		||||
    }
 | 
			
		||||
</style>
 | 
			
		||||
 | 
			
		||||
<h4>Run Information</h4>
 | 
			
		||||
 | 
			
		||||
<form class="form-inline mb-4">
 | 
			
		||||
    <div class="form-group">
 | 
			
		||||
        <label for="ToolType">Tool Type</label>
 | 
			
		||||
        <div class="form-control" id="ToolType"></div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="form-group">
 | 
			
		||||
        <label for="StartDate">Start Time</label>
 | 
			
		||||
        <div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
 | 
			
		||||
        <div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="form-group">
 | 
			
		||||
        <label for="EndDate">End Time</label>
 | 
			
		||||
        <div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
 | 
			
		||||
        <div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
 | 
			
		||||
    </div>  
 | 
			
		||||
    <div class="form-group">
 | 
			
		||||
        <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
 | 
			
		||||
    </div>  
 | 
			
		||||
    <div class="form-group">
 | 
			
		||||
        <label class="form-check-label" for="chkAutoRefresh">
 | 
			
		||||
            Auto-Refresh
 | 
			
		||||
        </label>
 | 
			
		||||
        <input class="form-check-input" type="checkbox" id="chkAutoRefresh">
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="form-group">
 | 
			
		||||
        <label class="form-check-label" for="chkCopyOnGet">
 | 
			
		||||
            Copy-On-Get
 | 
			
		||||
        </label>
 | 
			
		||||
        <input class="form-check-input" type="checkbox" id="chkCopyOnGet">
 | 
			
		||||
    </div>
 | 
			
		||||
</form>
 | 
			
		||||
 | 
			
		||||
<div style="height: 300px;" id="HeaderGridDiv">
 | 
			
		||||
    <span id="ToolTypeID" hidden></span>
 | 
			
		||||
    <table id="HeaderGrid"></table>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div class="row" style="margin-top: 10px; margin-bottom: 20px;">
 | 
			
		||||
    <div class="col-xs-1">
 | 
			
		||||
        <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="col-xs-1">
 | 
			
		||||
        <input type="button" class="btn" id="ReviewButton" value="Review" disabled />
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="col-xs-1">
 | 
			
		||||
        <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="col-xs-1">
 | 
			
		||||
        <input type="button" class="btn" id="ViewButton" value="View" disabled />
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="col-xs-1">
 | 
			
		||||
        <input type="button" class="btn" id="PinButton" value="Pin" disabled />
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="DetailsDiv" hidden>
 | 
			
		||||
 | 
			
		||||
    <span id="HeaderId" hidden></span>
 | 
			
		||||
    <span id="HeaderAttachmentId" hidden></span>
 | 
			
		||||
    <div style="padding-bottom: 20px;" id="DetailsGridDiv">
 | 
			
		||||
        <table id="DetailsGrid"></table>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div id="ExportDiv" style="margin-top: 10px;" hidden>
 | 
			
		||||
        <input type="button" value="Send to OpenInsight" id="OIExportButton" />
 | 
			
		||||
        <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <p style="margin-top: 20px;">
 | 
			
		||||
        <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;" hidden></iframe>
 | 
			
		||||
        <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
 | 
			
		||||
         
 | 
			
		||||
        <div id="DataAttachmentDiv" hidden>
 | 
			
		||||
            <canvas id="DataAttachmentCanvas"></canvas>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div id="HeaderAttachmentDiv" hidden>
 | 
			
		||||
            <canvas id="HeaderAttachmentCanvas"></canvas>
 | 
			
		||||
        </div>
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
 | 
			
		||||
    $(document).ready(function () {
 | 
			
		||||
 | 
			
		||||
        initRunInfo("@ViewBag.ApiUrl", "@Model.ToolTypeID", "@Model.HeaderID", "@Model.HeaderAttachmentID");
 | 
			
		||||
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
@ -103,6 +103,6 @@
 | 
			
		||||
        $("#runDataSheet5").click(function () { runDataSheet(5, $(this).val()) });
 | 
			
		||||
        $("#runDataSheet6").click(function () { runDataSheet(6, $(this).val()) });
 | 
			
		||||
        $("#restartButton").click(function () { restartButton() });
 | 
			
		||||
        initWorkMaterial("@ViewBag.ApiUrl");
 | 
			
		||||
        initWorkMaterial("@ViewBag.ApiUrl", "");
 | 
			
		||||
    });
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
@ -6,36 +6,42 @@
 | 
			
		||||
    <meta name="viewport" content="width=device-width" />
 | 
			
		||||
    <title>@ViewBag.Title</title>
 | 
			
		||||
 | 
			
		||||
    <script src="~/js/modernizr-3.6.0-custom.js" type="text/javascript" asp-append-version="true"></script>
 | 
			
		||||
    <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <link href="~/styles/bootstrap.min.css" rel="stylesheet" asp-append-version="true" />
 | 
			
		||||
    <link href="~/igniteui/css/themes/bootstrap3/default/infragistics.theme.css" rel="stylesheet"
 | 
			
		||||
        asp-append-version="true" />
 | 
			
		||||
    <link href="~/igniteui/css/structure/infragistics.css" rel="stylesheet" asp-append-version="true" />
 | 
			
		||||
    <link href="~/styles/site-server.css" rel="stylesheet" asp-append-version="true" />
 | 
			
		||||
    <link href="https://oi-metrology-viewer-prod.mes.infineon.com/styles/bootstrap.min.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
    <link
 | 
			
		||||
        href="https://oi-metrology-viewer-prod.mes.infineon.com/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
    <link
 | 
			
		||||
        href="https://oi-metrology-viewer-prod.mes.infineon.com/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
    <link href="https://oi-metrology-viewer-prod.mes.infineon.com/styles/site-server.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
    <link href="https://oi-metrology-viewer-prod.mes.infineon.com/styles/index.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
 | 
			
		||||
    <script src="~/js/jquery-3.6.0.min.js" type="text/javascript" asp-append-version="true"></script>
 | 
			
		||||
    <script src="~/js/jquery-ui.min.js" type="text/javascript" asp-append-version="true"></script>
 | 
			
		||||
    <script src="~/igniteui/js/infragistics.core.js" type="text/javascript" asp-append-version="true"></script>
 | 
			
		||||
    <script src="~/igniteui/js/infragistics.lob.js" type="text/javascript" asp-append-version="true"></script>
 | 
			
		||||
    <script src="~/igniteui/js/infragistics.dv.js" type="text/javascript" asp-append-version="true"></script>
 | 
			
		||||
    <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
    <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/jquery-ui.min.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
    <script
 | 
			
		||||
        src="https://oi-metrology-viewer-prod.mes.infineon.com/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
    <script
 | 
			
		||||
        src="https://oi-metrology-viewer-prod.mes.infineon.com/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
    <script
 | 
			
		||||
        src="https://oi-metrology-viewer-prod.mes.infineon.com/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="~/js/chart-4.3.0.min.js" type="module"></script>
 | 
			
		||||
    <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/chart-4.3.0.min.js" type="module"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="~/js/common.js" type="text/javascript" asp-append-version="true"></script>
 | 
			
		||||
    <script src="~/js/site-server.js" type="text/javascript" asp-append-version="true"></script>
 | 
			
		||||
    <script>
 | 
			
		||||
        $(document).ready(function () {
 | 
			
		||||
            if (location.pathname == "/") {
 | 
			
		||||
                route = "/AwaitingDispo";
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                route = location.pathname;
 | 
			
		||||
            }
 | 
			
		||||
            $('ul.nav.navbar-nav').find('a[href="' + route + '"]')
 | 
			
		||||
                .closest('li').addClass('alert-info');
 | 
			
		||||
        });
 | 
			
		||||
    </script>
 | 
			
		||||
    <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/common.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
    <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/site-server.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
@ -57,7 +63,9 @@
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                </button>
 | 
			
		||||
                <div class="navbar-brand">
 | 
			
		||||
                    <a href="/"><img src="~/images/IFX_LOGO_RGB.png" height="20" /></a>
 | 
			
		||||
                    <a href="https://oi-metrology-viewer-prod.mes.infineon.com"><img
 | 
			
		||||
                            src="https://oi-metrology-viewer-prod.mes.infineon.com/images/IFX_LOGO_RGB.png"
 | 
			
		||||
                            height="20" /></a>
 | 
			
		||||
                    OI Metrology Viewer
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
@ -91,8 +99,10 @@
 | 
			
		||||
 | 
			
		||||
    <div id="MessageModal"></div>
 | 
			
		||||
 | 
			
		||||
    <script src="~/js/bootstrap.min.js" type="text/javascript" asp-append-version="true"></script>
 | 
			
		||||
    <script src="~/js/respond.min.js" type="text/javascript" asp-append-version="true"></script>
 | 
			
		||||
    <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/bootstrap.min.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
    <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/respond.min.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
    @RenderSection("scripts", required: false)
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										183
									
								
								Server/wwwroot/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,183 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width" />
 | 
			
		||||
    <title>Run Information</title>
 | 
			
		||||
 | 
			
		||||
    <script src="https://metrology-viewer-prod.mes.infineon.com/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <link href="https://metrology-viewer-prod.mes.infineon.com/styles/bootstrap.min.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
    <link
 | 
			
		||||
        href="https://metrology-viewer-prod.mes.infineon.com/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
    <link
 | 
			
		||||
        href="https://metrology-viewer-prod.mes.infineon.com/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
    <link href="https://metrology-viewer-prod.mes.infineon.com/styles/site-server.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
    <link href="https://metrology-viewer-prod.mes.infineon.com/styles/index.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
 | 
			
		||||
    <script src="https://metrology-viewer-prod.mes.infineon.com/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
    <script src="https://metrology-viewer-prod.mes.infineon.com/js/jquery-ui.min.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
    <script
 | 
			
		||||
        src="https://metrology-viewer-prod.mes.infineon.com/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
    <script
 | 
			
		||||
        src="https://metrology-viewer-prod.mes.infineon.com/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
    <script
 | 
			
		||||
        src="https://metrology-viewer-prod.mes.infineon.com/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="https://metrology-viewer-prod.mes.infineon.com/js/chart-4.3.0.min.js" type="module"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="https://metrology-viewer-prod.mes.infineon.com/js/common.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
    <script src="https://metrology-viewer-prod.mes.infineon.com/js/site-server.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
    <div class="navbar navbar-fixed-top">
 | 
			
		||||
        <div class="container-fluid">
 | 
			
		||||
            <div class="navbar-header">
 | 
			
		||||
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                </button>
 | 
			
		||||
                <div class="navbar-brand">
 | 
			
		||||
                    <a href="https://metrology-viewer-prod.mes.infineon.com"><img
 | 
			
		||||
                            src="https://metrology-viewer-prod.mes.infineon.com/images/IFX_LOGO_RGB.png"
 | 
			
		||||
                            height="20" /></a>
 | 
			
		||||
                    OI Metrology Viewer
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="navbar-collapse collapse">
 | 
			
		||||
                <ul class="nav navbar-nav">
 | 
			
		||||
                    <li><a href="https://metrology-viewer-prod.mes.infineon.com/awaiting-disposition.html">Awaiting
 | 
			
		||||
                            Disposition</a></li>
 | 
			
		||||
                    <li><a href="https://metrology-viewer-prod.mes.infineon.com/index.html" class="alert-info">Run
 | 
			
		||||
                            Information</a></li>
 | 
			
		||||
                    <li><a href="https://metrology-viewer-prod.mes.infineon.com/run-headers.html">Run Headers</a></li>
 | 
			
		||||
                    <li><a href="https://oi-metrology-viewer-prod.mes.infineon.com/Export" target="_blank">Export</a>
 | 
			
		||||
                    </li>
 | 
			
		||||
                    <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
 | 
			
		||||
                </ul>
 | 
			
		||||
                <p class="navbar-text navbar-right">
 | 
			
		||||
                     
 | 
			
		||||
                </p>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="container-fluid body-content">
 | 
			
		||||
 | 
			
		||||
        <h4>Run Information</h4>
 | 
			
		||||
 | 
			
		||||
        <form class="form-inline mb-4">
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="ToolType">Tool Type</label>
 | 
			
		||||
                <div class="form-control" id="ToolType"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="StartDate">Start Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="EndDate">End Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkAutoRefresh">
 | 
			
		||||
                    Auto-Refresh
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkAutoRefresh">
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkCopyOnGet">
 | 
			
		||||
                    Copy-On-Get
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkCopyOnGet">
 | 
			
		||||
            </div>
 | 
			
		||||
        </form>
 | 
			
		||||
 | 
			
		||||
        <div style="height: 300px;" id="HeaderGridDiv">
 | 
			
		||||
            <span id="ToolTypeID" hidden></span>
 | 
			
		||||
            <table id="HeaderGrid"></table>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="row" style="margin-top: 10px; margin-bottom: 20px;">
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="ReviewButton" value="Review" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="ViewButton" value="View" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="PinButton" value="Pin" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div id="DetailsDiv" hidden>
 | 
			
		||||
 | 
			
		||||
            <span id="HeaderId" hidden></span>
 | 
			
		||||
            <span id="HeaderAttachmentId" hidden></span>
 | 
			
		||||
            <div style="padding-bottom: 20px;" id="DetailsGridDiv">
 | 
			
		||||
                <table id="DetailsGrid"></table>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <div id="ExportDiv" style="margin-top: 10px;" hidden>
 | 
			
		||||
                <input type="button" value="Send to OpenInsight" id="OIExportButton" />
 | 
			
		||||
                <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <p style="margin-top: 20px;">
 | 
			
		||||
                <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
 | 
			
		||||
                    hidden></iframe>
 | 
			
		||||
                <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
 | 
			
		||||
                 
 | 
			
		||||
            <div id="DataAttachmentDiv" hidden>
 | 
			
		||||
                <canvas id="DataAttachmentCanvas"></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div id="HeaderAttachmentDiv" hidden>
 | 
			
		||||
                <canvas id="HeaderAttachmentCanvas"></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
            </p>
 | 
			
		||||
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <hr />
 | 
			
		||||
        <footer>
 | 
			
		||||
            <p>© 2024 - Infineon Technologies</p>
 | 
			
		||||
        </footer>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div id="MessageModal"></div>
 | 
			
		||||
 | 
			
		||||
    <script src="https://metrology-viewer-prod.mes.infineon.com/js/bootstrap.min.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
    <script src="https://metrology-viewer-prod.mes.infineon.com/js/respond.min.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
    <script src="https://metrology-viewer-prod.mes.infineon.com/js/index.js?no-cache=2024-06-18-10-54"
 | 
			
		||||
        type="text/javascript"></script>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
@ -3,6 +3,13 @@ namespace OI.Metrology.Shared.DataModels;
 | 
			
		||||
public record WaferCounter(DateTime DateTime,
 | 
			
		||||
                           string DateTimeFormatted,
 | 
			
		||||
                           string EquipmentId,
 | 
			
		||||
                           string Message,
 | 
			
		||||
                           string Text,
 | 
			
		||||
                           int Total,
 | 
			
		||||
                           string SlotMap);
 | 
			
		||||
                           string SlotMap)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    public static WaferCounter GetWaferCounter(string message) =>
 | 
			
		||||
        new(DateTime.MinValue, string.Empty, string.Empty, message, string.Empty, 0, string.Empty);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										36
									
								
								Shared/DataModels/WaferCounterArchive.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,36 @@
 | 
			
		||||
using System.Text.Json.Serialization;
 | 
			
		||||
 | 
			
		||||
namespace OI.Metrology.Shared.DataModels;
 | 
			
		||||
 | 
			
		||||
public class WaferCounterArchive
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    public long ID { get; set; }
 | 
			
		||||
    public DateTime InsertDate { get; set; }
 | 
			
		||||
    public Guid AttachmentID { get; set; }
 | 
			
		||||
    public string? Title { get; set; }
 | 
			
		||||
    public DateTime Date { get; set; }
 | 
			
		||||
    public long ToolTypeID { get; set; }
 | 
			
		||||
    public string? ToolTypeName { get; set; }
 | 
			
		||||
 | 
			
		||||
    public string? MesEntity { get; set; }
 | 
			
		||||
 | 
			
		||||
    public string? Employee { get; set; }
 | 
			
		||||
    public string? Layer { get; set; }
 | 
			
		||||
    public string? PSN { get; set; }
 | 
			
		||||
    public string? RDS { get; set; }
 | 
			
		||||
    public string? Reactor { get; set; }
 | 
			
		||||
    public string? Recipe { get; set; }
 | 
			
		||||
    public string? Zone { get; set; }
 | 
			
		||||
 | 
			
		||||
    public string? SlotMap { get; set; }
 | 
			
		||||
    public string? Text { get; set; }
 | 
			
		||||
    public int? Total { get; set; }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)]
 | 
			
		||||
[JsonSerializable(typeof(WaferCounterArchive))]
 | 
			
		||||
public partial class WaferCounterArchiveSourceGenerationContext : JsonSerializerContext
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								Shared/Models/Attachment.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,17 @@
 | 
			
		||||
using System.Text.Json.Serialization;
 | 
			
		||||
 | 
			
		||||
namespace OI.Metrology.Shared.Models;
 | 
			
		||||
 | 
			
		||||
public record Attachment(string? SubGroupId,
 | 
			
		||||
                         long? HeaderId,
 | 
			
		||||
                         string? HeaderIdDirectory,
 | 
			
		||||
                         string? UniqueId,
 | 
			
		||||
                         string? DestinationFileName,
 | 
			
		||||
                         string? SourceFileName,
 | 
			
		||||
                         string? AttachmentId);
 | 
			
		||||
 | 
			
		||||
[JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)]
 | 
			
		||||
[JsonSerializable(typeof(Attachment))]
 | 
			
		||||
public partial class AttachmentSourceGenerationContext : JsonSerializerContext
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										5
									
								
								Shared/Models/CharacterizationInfo.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,5 @@
 | 
			
		||||
namespace OI.Metrology.Shared.Models;
 | 
			
		||||
 | 
			
		||||
public record CharacterizationInfo(string? Lot,
 | 
			
		||||
                                   DateTime LastWriteTime,
 | 
			
		||||
                                   string[] Lines);
 | 
			
		||||
							
								
								
									
										16
									
								
								Shared/Models/CharacterizationParameters.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,16 @@
 | 
			
		||||
using System.Text.Json.Serialization;
 | 
			
		||||
 | 
			
		||||
namespace OI.Metrology.Shared.Models;
 | 
			
		||||
 | 
			
		||||
public record CharacterizationParameters([property: JsonPropertyName("area")] string? Area,
 | 
			
		||||
                                         [property: JsonPropertyName("equipment-id")] string? EquipmentId,
 | 
			
		||||
                                         [property: JsonPropertyName("search-pattern")] string? SearchPattern,
 | 
			
		||||
                                         [property: JsonPropertyName("start-time")] string? StartTime,
 | 
			
		||||
                                         [property: JsonPropertyName("end-time")] string? EndTime,
 | 
			
		||||
                                         [property: JsonPropertyName("wafer-size")] string? WaferSize);
 | 
			
		||||
 | 
			
		||||
[JsonSourceGenerationOptions(WriteIndented = true)]
 | 
			
		||||
[JsonSerializable(typeof(CharacterizationParameters))]
 | 
			
		||||
public partial class CharacterizationParametersSourceGenerationContext : JsonSerializerContext
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
@ -8,7 +8,7 @@ public record Cleans(
 | 
			
		||||
// [property: JsonPropertyName("cleanTools")] object[] cleanTools
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
[JsonSourceGenerationOptions(WriteIndented = true)]
 | 
			
		||||
[JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)]
 | 
			
		||||
[JsonSerializable(typeof(Cleans))]
 | 
			
		||||
public partial class CleansSourceGenerationContext : JsonSerializerContext
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,7 @@ public record Inspection(
 | 
			
		||||
// [property: JsonPropertyName("backSide")] BackSide BackSide
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
[JsonSourceGenerationOptions(WriteIndented = true)]
 | 
			
		||||
[JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)]
 | 
			
		||||
[JsonSerializable(typeof(Inspection))]
 | 
			
		||||
public partial class InspectionSourceGenerationContext : JsonSerializerContext
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										17
									
								
								Shared/Models/PollValue.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,17 @@
 | 
			
		||||
using System.Text.Json.Serialization;
 | 
			
		||||
 | 
			
		||||
namespace OI.Metrology.Shared.Models;
 | 
			
		||||
 | 
			
		||||
public record PollValue(string? Json,
 | 
			
		||||
                        [property: JsonPropertyName("id")] int? Id,
 | 
			
		||||
                        [property: JsonPropertyName("page")] string? Page,
 | 
			
		||||
                        string? QueryString,
 | 
			
		||||
                        string? RemoteIpAddress,
 | 
			
		||||
                        [property: JsonPropertyName("time")] long? Time,
 | 
			
		||||
                        [property: JsonPropertyName("value")] int? Value);
 | 
			
		||||
 | 
			
		||||
[JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)]
 | 
			
		||||
[JsonSerializable(typeof(PollValue))]
 | 
			
		||||
public partial class PollValueSourceGenerationContext : JsonSerializerContext
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
@ -19,7 +19,7 @@ public record ProdSpec(
 | 
			
		||||
    [property: JsonPropertyName("prsStages")] PrsStage[] PrsStages
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
[JsonSourceGenerationOptions(WriteIndented = true)]
 | 
			
		||||
[JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)]
 | 
			
		||||
[JsonSerializable(typeof(ProdSpec))]
 | 
			
		||||
public partial class ProdSpecSourceGenerationContext : JsonSerializerContext
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -8,7 +8,7 @@ public record ProdSpecRoot(
 | 
			
		||||
// [property: JsonPropertyName("_class")] string Class
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
[JsonSourceGenerationOptions(WriteIndented = true)]
 | 
			
		||||
[JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)]
 | 
			
		||||
[JsonSerializable(typeof(ProdSpecRoot))]
 | 
			
		||||
public partial class ProdSpecRootSourceGenerationContext : JsonSerializerContext
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -12,7 +12,7 @@ public record PrsStage(
 | 
			
		||||
    [property: JsonPropertyName("qaMetTests")] QaMetTest[] QaMetTests
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
[JsonSourceGenerationOptions(WriteIndented = true)]
 | 
			
		||||
[JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)]
 | 
			
		||||
[JsonSerializable(typeof(PrsStage))]
 | 
			
		||||
public partial class PrsStageSourceGenerationContext : JsonSerializerContext
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -20,7 +20,7 @@ public record QaMetTest(
 | 
			
		||||
    [property: JsonPropertyName("sequence")] string Sequence
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
[JsonSourceGenerationOptions(WriteIndented = true)]
 | 
			
		||||
[JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)]
 | 
			
		||||
[JsonSerializable(typeof(QaMetTest))]
 | 
			
		||||
public partial class QaMetTestSourceGenerationContext : JsonSerializerContext
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -14,5 +14,6 @@ public interface IAwaitingDispoController<T>
 | 
			
		||||
    T Index();
 | 
			
		||||
    T MarkAsReviewed(long headerid, int tooltypeid);
 | 
			
		||||
    T MarkAsAwaiting(long headerid, int tooltypeid);
 | 
			
		||||
    T GetHeaderAttachmentID(int toolTypeId, long headerid);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										16
									
								
								Shared/Models/Stateless/IAzureDevOpsController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,16 @@
 | 
			
		||||
namespace OI.Metrology.Shared.Models.Stateless;
 | 
			
		||||
 | 
			
		||||
public interface IAzureDevOpsController<T>
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    enum Action : int
 | 
			
		||||
    {
 | 
			
		||||
        Index = 0,
 | 
			
		||||
        Save = 1
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static string GetRouteName() => nameof(IAzureDevOpsController<T>)[1..^10];
 | 
			
		||||
 | 
			
		||||
    T Save();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										8
									
								
								Shared/Models/Stateless/IAzureDevOpsRepository.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,8 @@
 | 
			
		||||
namespace OI.Metrology.Shared.Models.Stateless;
 | 
			
		||||
 | 
			
		||||
public interface IAzureDevOpsRepository
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    void Save(PollValue pollValue);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -1,4 +1,5 @@
 | 
			
		||||
using OI.Metrology.Shared.DataModels;
 | 
			
		||||
using System.Data;
 | 
			
		||||
 | 
			
		||||
namespace OI.Metrology.Shared.Models.Stateless;
 | 
			
		||||
 | 
			
		||||
@ -9,5 +10,7 @@ public interface IExportRepository
 | 
			
		||||
    Result<HeaderCommon[]> GetHeaders(HeaderCommon headerCommon);
 | 
			
		||||
    Result<HeaderCommon[]> GetLogistics(HeaderCommon headerCommon);
 | 
			
		||||
    string GetProcessDataStandardFormat(HeaderCommon headerCommon);
 | 
			
		||||
    string GetCSVExport(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend);
 | 
			
		||||
    Result<DataTable> GetExportData(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -6,7 +6,9 @@ public interface IFileShareController<T>
 | 
			
		||||
    enum Action : int
 | 
			
		||||
    {
 | 
			
		||||
        Index = 0,
 | 
			
		||||
        MarkAsPinned = 1
 | 
			
		||||
        CopyFile = 1,
 | 
			
		||||
        MoveFile = 2,
 | 
			
		||||
        FileWrite = 3,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static string GetRouteName() => nameof(IFileShareController<T>)[1..^10];
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,6 @@
 | 
			
		||||
using OI.Metrology.Shared.DataModels;
 | 
			
		||||
using System.Collections.ObjectModel;
 | 
			
		||||
 | 
			
		||||
namespace OI.Metrology.Shared.Models.Stateless;
 | 
			
		||||
 | 
			
		||||
public interface IFileShareRepository
 | 
			
		||||
@ -7,10 +10,10 @@ public interface IFileShareRepository
 | 
			
		||||
    void MoveFile(string from, string to);
 | 
			
		||||
    Uri Append(Uri uri, params string[] paths);
 | 
			
		||||
    void FileWrite(string path, string contents);
 | 
			
		||||
    ReadOnlyCollection<ToolTypeNameId> GetEquipmentIds();
 | 
			
		||||
    HttpResponseMessage ReadFile(HttpClient httpClient, Uri uri);
 | 
			
		||||
    void CopyFile(HttpClient httpClient, string from, string to);
 | 
			
		||||
    void MoveFile(HttpClient httpClient, string from, string to);
 | 
			
		||||
    void FileWrite(HttpClient httpClient, string path, string contents);
 | 
			
		||||
    List<NginxFileSystemSortable> GetNginxFileSystemSortableCollection(HttpClient httpClient, Uri uri, string? endsWith);
 | 
			
		||||
 | 
			
		||||
    ReadOnlyCollection<CharacterizationInfo> GetArchiveData(CharacterizationParameters characterizationParameters);
 | 
			
		||||
    ReadOnlyCollection<NginxFileSystemSortable> GetNginxFileSystemSortableCollection(HttpClient httpClient, Uri uri, string? endsWith);
 | 
			
		||||
}
 | 
			
		||||
@ -1,3 +1,5 @@
 | 
			
		||||
using System.Text.Json;
 | 
			
		||||
 | 
			
		||||
namespace OI.Metrology.Shared.Models.Stateless;
 | 
			
		||||
 | 
			
		||||
public interface IInboundController<T>
 | 
			
		||||
@ -9,7 +11,7 @@ public interface IInboundController<T>
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static string GetRouteName() => nameof(IInboundController<T>)[1..^10];
 | 
			
		||||
    T Post(string tooltype);
 | 
			
		||||
    T AttachFile(string tooltype, long headerid, string datauniqueid = "");
 | 
			
		||||
    T Post(string tooltype, JsonElement? jsonElement);
 | 
			
		||||
    T AttachFile(string tooltype, Attachment? attachment);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -1,5 +1,6 @@
 | 
			
		||||
using OI.Metrology.Shared.Services;
 | 
			
		||||
using System.Net;
 | 
			
		||||
using System.Text.Json;
 | 
			
		||||
 | 
			
		||||
namespace OI.Metrology.Shared.Models.Stateless;
 | 
			
		||||
 | 
			
		||||
@ -7,7 +8,7 @@ public interface IInboundRepository
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    bool IsIPAddressAllowed(string inboundApiAllowedIPList, IPAddress? remoteIP);
 | 
			
		||||
    DataResponse Data(IMetrologyRepository metrologyRepository, IInboundDataService inboundDataService, string tooltype, string? json);
 | 
			
		||||
    string? AttachFile(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, string tooltype, long headerid, string datauniqueid, string fileName, object uploadedFile);
 | 
			
		||||
    void AttachFile(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, string toolTypeName, Attachment? attachment);
 | 
			
		||||
    DataResponse Data(IMetrologyRepository metrologyRepository, IInboundDataService inboundDataService, string toolTypeName, JsonElement? jsonElement);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -9,12 +9,15 @@ public interface IInfinityQSV4Controller<T>
 | 
			
		||||
        MarkAsPinned = 1
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static string GetRouteName() => nameof(IInfinityQSV4Controller<T>)[1..^10];
 | 
			
		||||
    static string GetRouteName() => nameof(IInfinityQSV4Controller<T>)[1..^12];
 | 
			
		||||
    static string GetRouteVersion() => nameof(IInfinityQSV4Controller<T>)[1..^10][^2..];
 | 
			
		||||
    
 | 
			
		||||
    T GetData(string sub_group_id);
 | 
			
		||||
    T GetHeader(string sub_group_id);
 | 
			
		||||
    T GetDescriptors(string sub_group_id);
 | 
			
		||||
    T GetEpiProTempVerification(int[] night);
 | 
			
		||||
    T GetEpiProTempVerificationRows(int[] night);
 | 
			
		||||
    T GetLastGroupIdWithValue(string process, string? part, int? test);
 | 
			
		||||
    T GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(string process, string? recipe);
 | 
			
		||||
    T GetCommandText(string sub_group_id, string process, string job, string part, string lot, string date_time);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -17,6 +17,7 @@ public interface IInfinityQSV4Repository
 | 
			
		||||
    string GetCommandText(List<string> eppReactorNumbers);
 | 
			
		||||
    List<string[]> GetEpiProTempVerificationRows(int[] night);
 | 
			
		||||
    Result<InfinityQSDescriptorV4[]> GetDescriptors(string subGroupId);
 | 
			
		||||
    string GetLastGroupIdWithValue(string process, string? part, int? test);
 | 
			
		||||
    string GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(string process, string? recipe);
 | 
			
		||||
    string GetCommandText(string? subGroupId, string? process, string? job, string? part, string? lot, string? dateTime);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -8,42 +8,30 @@ namespace OI.Metrology.Shared.Models.Stateless;
 | 
			
		||||
public interface IMetrologyRepository
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    ToolType GetToolTypeByID(int id);
 | 
			
		||||
    TransactionScope StartTransaction();
 | 
			
		||||
    IEnumerable<ToolType> GetToolTypes();
 | 
			
		||||
    ToolType GetToolTypeByName(string name);
 | 
			
		||||
    ToolType GetToolTypeByID(int id);
 | 
			
		||||
 | 
			
		||||
    IEnumerable<ToolTypeMetadata> GetToolTypeMetadataByToolTypeID(int id);
 | 
			
		||||
 | 
			
		||||
    TransactionScope StartTransaction();
 | 
			
		||||
 | 
			
		||||
    void PurgeExistingData(int toolTypeId, string title);
 | 
			
		||||
    long InsertToolDataJSON(JToken jsonbody, long headerId, List<ToolTypeMetadata> metaData, string tableName);
 | 
			
		||||
 | 
			
		||||
    DataTable ExportData(string spName, DateTime startTime, DateTime endTime);
 | 
			
		||||
 | 
			
		||||
    DataTable GetHeaders(int toolTypeId, string? startTime, string? endTime, int? pageNo, int? pageSize, long? headerid, out long totalRecords);
 | 
			
		||||
    DataTable GetData(int toolTypeId, long headerId);
 | 
			
		||||
    DataTable GetDataSharePoint(int toolTypeId, string headerId);
 | 
			
		||||
 | 
			
		||||
    HeaderCommon[] GetHeaderTitles(int? toolTypeId, int? pageNo, int? pageSize, out long totalRecords);
 | 
			
		||||
 | 
			
		||||
    Guid GetHeaderAttachmentIDByTitle(int toolTypeId, string title);
 | 
			
		||||
    Guid GetDataAttachmentIDByTitle(int toolTypeId, string title);
 | 
			
		||||
 | 
			
		||||
    Guid GetHeaderAttachmentID(int toolTypeId, long headerId);
 | 
			
		||||
    string GetHeaderInsertDate(int toolTypeId, long headerId);
 | 
			
		||||
    string GetAttachmentInsertDateByGUID(string tableName, Guid attachmentId);
 | 
			
		||||
    void SetHeaderDirName(string tableName, long headerId, string dateDir);
 | 
			
		||||
    Guid GetDataAttachmentID(int toolTypeId, long headerId, string title);
 | 
			
		||||
    string GetDataInsertDate(int toolTypeId, long headerId, string title);
 | 
			
		||||
 | 
			
		||||
    void SetDataDirName(string tableName, long headerId, string title, string dateDir);
 | 
			
		||||
    void PurgeExistingData(int toolTypeId, string title);
 | 
			
		||||
    DataSet GetOIExportData(int toolTypeId, long headerid);
 | 
			
		||||
 | 
			
		||||
    IEnumerable<KeyValuePair<string, string>> GetHeaderFields(int toolTypeId, long headerid);
 | 
			
		||||
 | 
			
		||||
    Guid GetHeaderAttachmentID(int toolTypeId, long headerId);
 | 
			
		||||
    IEnumerable<AwaitingDisposition> GetAwaitingDisposition();
 | 
			
		||||
 | 
			
		||||
    string GetHeaderInsertDate(int toolTypeId, long headerId);
 | 
			
		||||
    Guid GetDataAttachmentIDByTitle(int toolTypeId, string title);
 | 
			
		||||
    Guid GetHeaderAttachmentIDByTitle(int toolTypeId, string title);
 | 
			
		||||
    int UpdateReviewDate(int toolTypeId, long headerId, bool clearDate);
 | 
			
		||||
    IEnumerable<ToolTypeMetadata> GetToolTypeMetadataByToolTypeID(int id);
 | 
			
		||||
    string GetDataInsertDate(int toolTypeId, long headerId, string title);
 | 
			
		||||
    void SetHeaderDirName(string tableName, long headerId, string dateDir);
 | 
			
		||||
    DataTable ExportData(string spName, DateTime startTime, DateTime endTime);
 | 
			
		||||
    string GetAttachmentInsertDateByGUID(string tableName, Guid attachmentId);
 | 
			
		||||
    void SetHeaderAttachmentID(int toolTypeId, long headerId, string attachmentId);
 | 
			
		||||
    void SetDataDirName(string tableName, long headerId, string title, string dateDir);
 | 
			
		||||
    IEnumerable<KeyValuePair<string, string>> GetHeaderFields(int toolTypeId, long headerid);
 | 
			
		||||
    void SetDataAttachmentID(int toolTypeId, long headerId, string title, string attachmentId);
 | 
			
		||||
    HeaderCommon[] GetHeaderTitles(int? toolTypeId, int? pageNo, int? pageSize, out long totalRecords);
 | 
			
		||||
    long InsertToolDataJSON(JToken jsonbody, long headerId, List<ToolTypeMetadata> metaData, string tableName);
 | 
			
		||||
    DataTable GetHeaders(int toolTypeId, string? startTime, string? endTime, int? pageNo, int? pageSize, long? headerid, out long totalRecords);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -10,10 +10,8 @@ public interface IToolTypesRepository
 | 
			
		||||
    Result<ToolTypeNameId[]> Index(IMetrologyRepository metrologyRepository);
 | 
			
		||||
    Result<DataTable> GetData(IMetrologyRepository metrologyRepository, int id, long headerid);
 | 
			
		||||
    Result<ColumnValue[]> GetHeaderFields(IMetrologyRepository metrologyRepository, int id, long headerid);
 | 
			
		||||
    byte[] GetCSVExport(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend);
 | 
			
		||||
    Result<HeaderCommon[]> GetHeaderTitles(IMetrologyRepository metrologyRepository, int id, int? page, int? pagesize);
 | 
			
		||||
    Result<ToolTypeMetadataResult> GetToolTypeMetadata(IMetrologyRepository metrologyRepository, int id, string sortby = "");
 | 
			
		||||
    Result<DataTable> GetExportData(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend);
 | 
			
		||||
    string? OIExport(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, int toolTypeId, long headerid);
 | 
			
		||||
    Result<DataTable> GetHeaders(IMetrologyRepository metrologyRepository, int id, string? datebegin, string? dateend, int? page, int? pagesize, long? headerid);
 | 
			
		||||
    (string?, string?, Stream?) GetAttachment(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, int toolTypeId, string tabletype, string attachmentId, string filename);
 | 
			
		||||
 | 
			
		||||
@ -11,6 +11,6 @@ public interface IWaferCounterController<T>
 | 
			
		||||
 | 
			
		||||
    static string GetRouteName() => nameof(IWaferCounterController<T>)[1..^10];
 | 
			
		||||
 | 
			
		||||
    T GetLastQuantityAndSlotMap(string area, string waferSize);
 | 
			
		||||
    T GetLastQuantityAndSlotMap(string area, string waferSize, string text);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -4,6 +4,6 @@ public interface IWaferCounterRepository
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    string? GetSlotMap(string line1, string line2);
 | 
			
		||||
    DataModels.WaferCounter GetLastQuantityAndSlotMap(string area, string waferSize);
 | 
			
		||||
    DataModels.WaferCounter? GetLastQuantityAndSlotMap(string area, string waferSize, string text);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -7,7 +7,7 @@ public record Surfscan(
 | 
			
		||||
    [property: JsonPropertyName("surfscanRecipes")] SurfscanRecipe[] SurfscanRecipes
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
[JsonSourceGenerationOptions(WriteIndented = true)]
 | 
			
		||||
[JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)]
 | 
			
		||||
[JsonSerializable(typeof(Surfscan))]
 | 
			
		||||
public partial class SurfscanSourceGenerationContext : JsonSerializerContext
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -9,7 +9,7 @@ public record SurfscanRecipe(
 | 
			
		||||
    [property: JsonPropertyName("sampleSize")] int? SampleSize
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
[JsonSourceGenerationOptions(WriteIndented = true)]
 | 
			
		||||
[JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)]
 | 
			
		||||
[JsonSerializable(typeof(SurfscanRecipe))]
 | 
			
		||||
public partial class SurfscanRecipeSourceGenerationContext : JsonSerializerContext
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,7 @@
 | 
			
		||||
namespace OI.Metrology.Shared.Services;
 | 
			
		||||
 | 
			
		||||
using DataModels;
 | 
			
		||||
using OI.Metrology.Shared.Models;
 | 
			
		||||
using OI.Metrology.Shared.Models.Stateless;
 | 
			
		||||
 | 
			
		||||
public interface IAttachmentsService
 | 
			
		||||
@ -8,5 +9,5 @@ public interface IAttachmentsService
 | 
			
		||||
    Stream GetAttachmentStreamByTitle(ToolType toolType, bool header, string title, string filename);
 | 
			
		||||
    Stream GetAttachmentStreamByAttachmentId(ToolType toolType, bool header, Guid attachmentId, string filename);
 | 
			
		||||
    string? GetProcessDataStandardFormat(IMetrologyRepository metrologyRepository, int toolTypeId, long headerId);
 | 
			
		||||
    void SaveAttachment(ToolType toolType, long headerId, string dataUniqueId, string filename, object uploadedFile);
 | 
			
		||||
    void SaveAttachment(ToolType toolType, Attachment attachment);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										5
									
								
								Static/.vscode/mklink.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,5 @@
 | 
			
		||||
# mklink
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
mklink /J "D:\wwwRoot" "L:\DevOps\Mesa_FI\OI-Metrology\Static"
 | 
			
		||||
```
 | 
			
		||||
							
								
								
									
										5
									
								
								Static/.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,5 @@
 | 
			
		||||
{
 | 
			
		||||
    "cSpell.words": [
 | 
			
		||||
        "Infineon"
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										28
									
								
								Static/.vscode/tasks.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,28 @@
 | 
			
		||||
{
 | 
			
		||||
    "version": "2.0.0",
 | 
			
		||||
    "tasks": [
 | 
			
		||||
        {
 | 
			
		||||
            "type": "shell",
 | 
			
		||||
            "label": "MakeDirctory",
 | 
			
		||||
            "command": "mkdir",
 | 
			
		||||
            "args": [
 | 
			
		||||
                "D:\\web-sites\\OI-Metrology\\pp-6737ddfb-_______-OI-Metrology-Release"
 | 
			
		||||
            ],
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type": "shell",
 | 
			
		||||
            "label": "CopySite",
 | 
			
		||||
            "command": "robocopy",
 | 
			
		||||
            "args": [
 | 
			
		||||
                "L:\\DevOps\\Mesa_FI\\OI-Metrology\\Static",
 | 
			
		||||
                "D:\\web-sites\\OI-Metrology\\pp-6737ddfb-_______-OI-Metrology-Release\\Static",
 | 
			
		||||
                "/E",
 | 
			
		||||
                "/MT:6",
 | 
			
		||||
                "/NFL",
 | 
			
		||||
                "/NDL",
 | 
			
		||||
                "/NJH",
 | 
			
		||||
                "/NJS"
 | 
			
		||||
            ],
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										161
									
								
								Static/AwaitingDispo/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,161 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width" />
 | 
			
		||||
    <title>Run Information</title>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
 | 
			
		||||
    <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/chart-4.3.0.min.js" type="module"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
    <div class="navbar navbar-fixed-top">
 | 
			
		||||
        <div class="container-fluid">
 | 
			
		||||
            <div class="navbar-header">
 | 
			
		||||
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                </button>
 | 
			
		||||
                <div class="navbar-brand">
 | 
			
		||||
                    <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
 | 
			
		||||
                    OI Metrology Viewer
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="navbar-collapse collapse">
 | 
			
		||||
                <ul class="nav navbar-nav">
 | 
			
		||||
                    <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
 | 
			
		||||
                    <li><a href="/index.html" class="alert-info">Run Information</a></li>
 | 
			
		||||
                    <li><a href="/run-headers.html">Run Headers</a></li>
 | 
			
		||||
                    <li><a href="/files.html">Files</a></li>
 | 
			
		||||
                    <li><a href="/export.html">Export</a></li>
 | 
			
		||||
                    <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
 | 
			
		||||
                    <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
 | 
			
		||||
                    <li><a href="/mes.html" target="_blank">FI Backlog</a></li>
 | 
			
		||||
                </ul>
 | 
			
		||||
                <p class="navbar-text navbar-right">
 | 
			
		||||
                     
 | 
			
		||||
                </p>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="container-fluid body-content">
 | 
			
		||||
 | 
			
		||||
        <h4>Run Information</h4>
 | 
			
		||||
 | 
			
		||||
        <form class="form-inline mb-4">
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="ToolType">Tool Type</label>
 | 
			
		||||
                <div class="form-control" id="ToolType"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="StartDate">Start Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="EndDate">End Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkAutoRefresh">
 | 
			
		||||
                    Auto-Refresh
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkAutoRefresh">
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkCopyOnGet">
 | 
			
		||||
                    Copy-On-Get
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkCopyOnGet">
 | 
			
		||||
            </div>
 | 
			
		||||
        </form>
 | 
			
		||||
 | 
			
		||||
        <div style="height: 300px;" id="HeaderGridDiv">
 | 
			
		||||
            <span id="ToolTypeID" hidden></span>
 | 
			
		||||
            <table id="HeaderGrid"></table>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="row" style="margin-top: 10px; margin-bottom: 20px;">
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="ReviewButton" value="Review" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="ViewButton" value="View" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="PinButton" value="Pin" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div id="DetailsDiv" hidden>
 | 
			
		||||
 | 
			
		||||
            <span id="HeaderId" hidden></span>
 | 
			
		||||
            <span id="HeaderAttachmentId" hidden></span>
 | 
			
		||||
            <div style="padding-bottom: 20px;" id="DetailsGridDiv">
 | 
			
		||||
                <table id="DetailsGrid"></table>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <div id="ExportDiv" style="margin-top: 10px;" hidden>
 | 
			
		||||
                <input type="button" value="Send to OpenInsight" id="OIExportButton" />
 | 
			
		||||
                <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <p style="margin-top: 20px;">
 | 
			
		||||
                <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
 | 
			
		||||
                    hidden></iframe>
 | 
			
		||||
                <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
 | 
			
		||||
                 
 | 
			
		||||
            <div id="DataAttachmentDiv" hidden>
 | 
			
		||||
                <canvas id="DataAttachmentCanvas"></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div id="HeaderAttachmentDiv" hidden>
 | 
			
		||||
                <canvas id="HeaderAttachmentCanvas"></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
            </p>
 | 
			
		||||
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <hr />
 | 
			
		||||
        <footer>
 | 
			
		||||
            <p>© 2024 - Infineon Technologies</p>
 | 
			
		||||
        </footer>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div id="MessageModal"></div>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										161
									
								
								Static/Export/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,161 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width" />
 | 
			
		||||
    <title>Run Information</title>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
 | 
			
		||||
    <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/chart-4.3.0.min.js" type="module"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
    <div class="navbar navbar-fixed-top">
 | 
			
		||||
        <div class="container-fluid">
 | 
			
		||||
            <div class="navbar-header">
 | 
			
		||||
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                </button>
 | 
			
		||||
                <div class="navbar-brand">
 | 
			
		||||
                    <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
 | 
			
		||||
                    OI Metrology Viewer
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="navbar-collapse collapse">
 | 
			
		||||
                <ul class="nav navbar-nav">
 | 
			
		||||
                    <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
 | 
			
		||||
                    <li><a href="/index.html" class="alert-info">Run Information</a></li>
 | 
			
		||||
                    <li><a href="/run-headers.html">Run Headers</a></li>
 | 
			
		||||
                    <li><a href="/files.html">Files</a></li>
 | 
			
		||||
                    <li><a href="/export.html">Export</a></li>
 | 
			
		||||
                    <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
 | 
			
		||||
                    <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
 | 
			
		||||
                    <li><a href="/mes.html" target="_blank">FI Backlog</a></li>
 | 
			
		||||
                </ul>
 | 
			
		||||
                <p class="navbar-text navbar-right">
 | 
			
		||||
                     
 | 
			
		||||
                </p>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="container-fluid body-content">
 | 
			
		||||
 | 
			
		||||
        <h4>Run Information</h4>
 | 
			
		||||
 | 
			
		||||
        <form class="form-inline mb-4">
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="ToolType">Tool Type</label>
 | 
			
		||||
                <div class="form-control" id="ToolType"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="StartDate">Start Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="EndDate">End Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkAutoRefresh">
 | 
			
		||||
                    Auto-Refresh
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkAutoRefresh">
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkCopyOnGet">
 | 
			
		||||
                    Copy-On-Get
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkCopyOnGet">
 | 
			
		||||
            </div>
 | 
			
		||||
        </form>
 | 
			
		||||
 | 
			
		||||
        <div style="height: 300px;" id="HeaderGridDiv">
 | 
			
		||||
            <span id="ToolTypeID" hidden></span>
 | 
			
		||||
            <table id="HeaderGrid"></table>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="row" style="margin-top: 10px; margin-bottom: 20px;">
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="ReviewButton" value="Review" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="ViewButton" value="View" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="PinButton" value="Pin" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div id="DetailsDiv" hidden>
 | 
			
		||||
 | 
			
		||||
            <span id="HeaderId" hidden></span>
 | 
			
		||||
            <span id="HeaderAttachmentId" hidden></span>
 | 
			
		||||
            <div style="padding-bottom: 20px;" id="DetailsGridDiv">
 | 
			
		||||
                <table id="DetailsGrid"></table>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <div id="ExportDiv" style="margin-top: 10px;" hidden>
 | 
			
		||||
                <input type="button" value="Send to OpenInsight" id="OIExportButton" />
 | 
			
		||||
                <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <p style="margin-top: 20px;">
 | 
			
		||||
                <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
 | 
			
		||||
                    hidden></iframe>
 | 
			
		||||
                <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
 | 
			
		||||
                 
 | 
			
		||||
            <div id="DataAttachmentDiv" hidden>
 | 
			
		||||
                <canvas id="DataAttachmentCanvas"></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div id="HeaderAttachmentDiv" hidden>
 | 
			
		||||
                <canvas id="HeaderAttachmentCanvas"></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
            </p>
 | 
			
		||||
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <hr />
 | 
			
		||||
        <footer>
 | 
			
		||||
            <p>© 2024 - Infineon Technologies</p>
 | 
			
		||||
        </footer>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div id="MessageModal"></div>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										161
									
								
								Static/Metrology/AwaitingDispo/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,161 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width" />
 | 
			
		||||
    <title>Run Information</title>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
 | 
			
		||||
    <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/chart-4.3.0.min.js" type="module"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
    <div class="navbar navbar-fixed-top">
 | 
			
		||||
        <div class="container-fluid">
 | 
			
		||||
            <div class="navbar-header">
 | 
			
		||||
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                </button>
 | 
			
		||||
                <div class="navbar-brand">
 | 
			
		||||
                    <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
 | 
			
		||||
                    OI Metrology Viewer
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="navbar-collapse collapse">
 | 
			
		||||
                <ul class="nav navbar-nav">
 | 
			
		||||
                    <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
 | 
			
		||||
                    <li><a href="/index.html" class="alert-info">Run Information</a></li>
 | 
			
		||||
                    <li><a href="/run-headers.html">Run Headers</a></li>
 | 
			
		||||
                    <li><a href="/files.html">Files</a></li>
 | 
			
		||||
                    <li><a href="/export.html">Export</a></li>
 | 
			
		||||
                    <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
 | 
			
		||||
                    <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
 | 
			
		||||
                    <li><a href="/mes.html" target="_blank">FI Backlog</a></li>
 | 
			
		||||
                </ul>
 | 
			
		||||
                <p class="navbar-text navbar-right">
 | 
			
		||||
                     
 | 
			
		||||
                </p>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="container-fluid body-content">
 | 
			
		||||
 | 
			
		||||
        <h4>Run Information</h4>
 | 
			
		||||
 | 
			
		||||
        <form class="form-inline mb-4">
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="ToolType">Tool Type</label>
 | 
			
		||||
                <div class="form-control" id="ToolType"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="StartDate">Start Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="EndDate">End Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkAutoRefresh">
 | 
			
		||||
                    Auto-Refresh
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkAutoRefresh">
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkCopyOnGet">
 | 
			
		||||
                    Copy-On-Get
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkCopyOnGet">
 | 
			
		||||
            </div>
 | 
			
		||||
        </form>
 | 
			
		||||
 | 
			
		||||
        <div style="height: 300px;" id="HeaderGridDiv">
 | 
			
		||||
            <span id="ToolTypeID" hidden></span>
 | 
			
		||||
            <table id="HeaderGrid"></table>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="row" style="margin-top: 10px; margin-bottom: 20px;">
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="ReviewButton" value="Review" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="ViewButton" value="View" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="PinButton" value="Pin" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div id="DetailsDiv" hidden>
 | 
			
		||||
 | 
			
		||||
            <span id="HeaderId" hidden></span>
 | 
			
		||||
            <span id="HeaderAttachmentId" hidden></span>
 | 
			
		||||
            <div style="padding-bottom: 20px;" id="DetailsGridDiv">
 | 
			
		||||
                <table id="DetailsGrid"></table>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <div id="ExportDiv" style="margin-top: 10px;" hidden>
 | 
			
		||||
                <input type="button" value="Send to OpenInsight" id="OIExportButton" />
 | 
			
		||||
                <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <p style="margin-top: 20px;">
 | 
			
		||||
                <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
 | 
			
		||||
                    hidden></iframe>
 | 
			
		||||
                <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
 | 
			
		||||
                 
 | 
			
		||||
            <div id="DataAttachmentDiv" hidden>
 | 
			
		||||
                <canvas id="DataAttachmentCanvas"></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div id="HeaderAttachmentDiv" hidden>
 | 
			
		||||
                <canvas id="HeaderAttachmentCanvas"></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
            </p>
 | 
			
		||||
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <hr />
 | 
			
		||||
        <footer>
 | 
			
		||||
            <p>© 2024 - Infineon Technologies</p>
 | 
			
		||||
        </footer>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div id="MessageModal"></div>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										161
									
								
								Static/Metrology/Export/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,161 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width" />
 | 
			
		||||
    <title>Run Information</title>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
 | 
			
		||||
    <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/chart-4.3.0.min.js" type="module"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
    <div class="navbar navbar-fixed-top">
 | 
			
		||||
        <div class="container-fluid">
 | 
			
		||||
            <div class="navbar-header">
 | 
			
		||||
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                </button>
 | 
			
		||||
                <div class="navbar-brand">
 | 
			
		||||
                    <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
 | 
			
		||||
                    OI Metrology Viewer
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="navbar-collapse collapse">
 | 
			
		||||
                <ul class="nav navbar-nav">
 | 
			
		||||
                    <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
 | 
			
		||||
                    <li><a href="/index.html" class="alert-info">Run Information</a></li>
 | 
			
		||||
                    <li><a href="/run-headers.html">Run Headers</a></li>
 | 
			
		||||
                    <li><a href="/files.html">Files</a></li>
 | 
			
		||||
                    <li><a href="/export.html">Export</a></li>
 | 
			
		||||
                    <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
 | 
			
		||||
                    <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
 | 
			
		||||
                    <li><a href="/mes.html" target="_blank">FI Backlog</a></li>
 | 
			
		||||
                </ul>
 | 
			
		||||
                <p class="navbar-text navbar-right">
 | 
			
		||||
                     
 | 
			
		||||
                </p>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="container-fluid body-content">
 | 
			
		||||
 | 
			
		||||
        <h4>Run Information</h4>
 | 
			
		||||
 | 
			
		||||
        <form class="form-inline mb-4">
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="ToolType">Tool Type</label>
 | 
			
		||||
                <div class="form-control" id="ToolType"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="StartDate">Start Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="EndDate">End Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkAutoRefresh">
 | 
			
		||||
                    Auto-Refresh
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkAutoRefresh">
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkCopyOnGet">
 | 
			
		||||
                    Copy-On-Get
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkCopyOnGet">
 | 
			
		||||
            </div>
 | 
			
		||||
        </form>
 | 
			
		||||
 | 
			
		||||
        <div style="height: 300px;" id="HeaderGridDiv">
 | 
			
		||||
            <span id="ToolTypeID" hidden></span>
 | 
			
		||||
            <table id="HeaderGrid"></table>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="row" style="margin-top: 10px; margin-bottom: 20px;">
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="ReviewButton" value="Review" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="ViewButton" value="View" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="PinButton" value="Pin" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div id="DetailsDiv" hidden>
 | 
			
		||||
 | 
			
		||||
            <span id="HeaderId" hidden></span>
 | 
			
		||||
            <span id="HeaderAttachmentId" hidden></span>
 | 
			
		||||
            <div style="padding-bottom: 20px;" id="DetailsGridDiv">
 | 
			
		||||
                <table id="DetailsGrid"></table>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <div id="ExportDiv" style="margin-top: 10px;" hidden>
 | 
			
		||||
                <input type="button" value="Send to OpenInsight" id="OIExportButton" />
 | 
			
		||||
                <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <p style="margin-top: 20px;">
 | 
			
		||||
                <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
 | 
			
		||||
                    hidden></iframe>
 | 
			
		||||
                <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
 | 
			
		||||
                 
 | 
			
		||||
            <div id="DataAttachmentDiv" hidden>
 | 
			
		||||
                <canvas id="DataAttachmentCanvas"></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div id="HeaderAttachmentDiv" hidden>
 | 
			
		||||
                <canvas id="HeaderAttachmentCanvas"></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
            </p>
 | 
			
		||||
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <hr />
 | 
			
		||||
        <footer>
 | 
			
		||||
            <p>© 2024 - Infineon Technologies</p>
 | 
			
		||||
        </footer>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div id="MessageModal"></div>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										161
									
								
								Static/Metrology/RunHeaders/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,161 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width" />
 | 
			
		||||
    <title>Run Information</title>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
 | 
			
		||||
    <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/chart-4.3.0.min.js" type="module"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
    <div class="navbar navbar-fixed-top">
 | 
			
		||||
        <div class="container-fluid">
 | 
			
		||||
            <div class="navbar-header">
 | 
			
		||||
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                </button>
 | 
			
		||||
                <div class="navbar-brand">
 | 
			
		||||
                    <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
 | 
			
		||||
                    OI Metrology Viewer
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="navbar-collapse collapse">
 | 
			
		||||
                <ul class="nav navbar-nav">
 | 
			
		||||
                    <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
 | 
			
		||||
                    <li><a href="/index.html" class="alert-info">Run Information</a></li>
 | 
			
		||||
                    <li><a href="/run-headers.html">Run Headers</a></li>
 | 
			
		||||
                    <li><a href="/files.html">Files</a></li>
 | 
			
		||||
                    <li><a href="/export.html">Export</a></li>
 | 
			
		||||
                    <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
 | 
			
		||||
                    <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
 | 
			
		||||
                    <li><a href="/mes.html" target="_blank">FI Backlog</a></li>
 | 
			
		||||
                </ul>
 | 
			
		||||
                <p class="navbar-text navbar-right">
 | 
			
		||||
                     
 | 
			
		||||
                </p>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="container-fluid body-content">
 | 
			
		||||
 | 
			
		||||
        <h4>Run Information</h4>
 | 
			
		||||
 | 
			
		||||
        <form class="form-inline mb-4">
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="ToolType">Tool Type</label>
 | 
			
		||||
                <div class="form-control" id="ToolType"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="StartDate">Start Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="EndDate">End Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkAutoRefresh">
 | 
			
		||||
                    Auto-Refresh
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkAutoRefresh">
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkCopyOnGet">
 | 
			
		||||
                    Copy-On-Get
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkCopyOnGet">
 | 
			
		||||
            </div>
 | 
			
		||||
        </form>
 | 
			
		||||
 | 
			
		||||
        <div style="height: 300px;" id="HeaderGridDiv">
 | 
			
		||||
            <span id="ToolTypeID" hidden></span>
 | 
			
		||||
            <table id="HeaderGrid"></table>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="row" style="margin-top: 10px; margin-bottom: 20px;">
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="ReviewButton" value="Review" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="ViewButton" value="View" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="PinButton" value="Pin" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div id="DetailsDiv" hidden>
 | 
			
		||||
 | 
			
		||||
            <span id="HeaderId" hidden></span>
 | 
			
		||||
            <span id="HeaderAttachmentId" hidden></span>
 | 
			
		||||
            <div style="padding-bottom: 20px;" id="DetailsGridDiv">
 | 
			
		||||
                <table id="DetailsGrid"></table>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <div id="ExportDiv" style="margin-top: 10px;" hidden>
 | 
			
		||||
                <input type="button" value="Send to OpenInsight" id="OIExportButton" />
 | 
			
		||||
                <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <p style="margin-top: 20px;">
 | 
			
		||||
                <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
 | 
			
		||||
                    hidden></iframe>
 | 
			
		||||
                <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
 | 
			
		||||
                 
 | 
			
		||||
            <div id="DataAttachmentDiv" hidden>
 | 
			
		||||
                <canvas id="DataAttachmentCanvas"></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div id="HeaderAttachmentDiv" hidden>
 | 
			
		||||
                <canvas id="HeaderAttachmentCanvas"></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
            </p>
 | 
			
		||||
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <hr />
 | 
			
		||||
        <footer>
 | 
			
		||||
            <p>© 2024 - Infineon Technologies</p>
 | 
			
		||||
        </footer>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div id="MessageModal"></div>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										161
									
								
								Static/Metrology/RunInfo/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,161 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width" />
 | 
			
		||||
    <title>Run Information</title>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
 | 
			
		||||
    <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/chart-4.3.0.min.js" type="module"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
    <div class="navbar navbar-fixed-top">
 | 
			
		||||
        <div class="container-fluid">
 | 
			
		||||
            <div class="navbar-header">
 | 
			
		||||
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                </button>
 | 
			
		||||
                <div class="navbar-brand">
 | 
			
		||||
                    <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
 | 
			
		||||
                    OI Metrology Viewer
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="navbar-collapse collapse">
 | 
			
		||||
                <ul class="nav navbar-nav">
 | 
			
		||||
                    <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
 | 
			
		||||
                    <li><a href="/index.html" class="alert-info">Run Information</a></li>
 | 
			
		||||
                    <li><a href="/run-headers.html">Run Headers</a></li>
 | 
			
		||||
                    <li><a href="/files.html">Files</a></li>
 | 
			
		||||
                    <li><a href="/export.html">Export</a></li>
 | 
			
		||||
                    <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
 | 
			
		||||
                    <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
 | 
			
		||||
                    <li><a href="/mes.html" target="_blank">FI Backlog</a></li>
 | 
			
		||||
                </ul>
 | 
			
		||||
                <p class="navbar-text navbar-right">
 | 
			
		||||
                     
 | 
			
		||||
                </p>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="container-fluid body-content">
 | 
			
		||||
 | 
			
		||||
        <h4>Run Information</h4>
 | 
			
		||||
 | 
			
		||||
        <form class="form-inline mb-4">
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="ToolType">Tool Type</label>
 | 
			
		||||
                <div class="form-control" id="ToolType"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="StartDate">Start Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="EndDate">End Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkAutoRefresh">
 | 
			
		||||
                    Auto-Refresh
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkAutoRefresh">
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkCopyOnGet">
 | 
			
		||||
                    Copy-On-Get
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkCopyOnGet">
 | 
			
		||||
            </div>
 | 
			
		||||
        </form>
 | 
			
		||||
 | 
			
		||||
        <div style="height: 300px;" id="HeaderGridDiv">
 | 
			
		||||
            <span id="ToolTypeID" hidden></span>
 | 
			
		||||
            <table id="HeaderGrid"></table>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="row" style="margin-top: 10px; margin-bottom: 20px;">
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="ReviewButton" value="Review" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="ViewButton" value="View" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="PinButton" value="Pin" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div id="DetailsDiv" hidden>
 | 
			
		||||
 | 
			
		||||
            <span id="HeaderId" hidden></span>
 | 
			
		||||
            <span id="HeaderAttachmentId" hidden></span>
 | 
			
		||||
            <div style="padding-bottom: 20px;" id="DetailsGridDiv">
 | 
			
		||||
                <table id="DetailsGrid"></table>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <div id="ExportDiv" style="margin-top: 10px;" hidden>
 | 
			
		||||
                <input type="button" value="Send to OpenInsight" id="OIExportButton" />
 | 
			
		||||
                <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <p style="margin-top: 20px;">
 | 
			
		||||
                <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
 | 
			
		||||
                    hidden></iframe>
 | 
			
		||||
                <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
 | 
			
		||||
                 
 | 
			
		||||
            <div id="DataAttachmentDiv" hidden>
 | 
			
		||||
                <canvas id="DataAttachmentCanvas"></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div id="HeaderAttachmentDiv" hidden>
 | 
			
		||||
                <canvas id="HeaderAttachmentCanvas"></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
            </p>
 | 
			
		||||
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <hr />
 | 
			
		||||
        <footer>
 | 
			
		||||
            <p>© 2024 - Infineon Technologies</p>
 | 
			
		||||
        </footer>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div id="MessageModal"></div>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										161
									
								
								Static/Metrology/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,161 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width" />
 | 
			
		||||
    <title>Run Information</title>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
 | 
			
		||||
    <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/chart-4.3.0.min.js" type="module"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
    <div class="navbar navbar-fixed-top">
 | 
			
		||||
        <div class="container-fluid">
 | 
			
		||||
            <div class="navbar-header">
 | 
			
		||||
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                </button>
 | 
			
		||||
                <div class="navbar-brand">
 | 
			
		||||
                    <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
 | 
			
		||||
                    OI Metrology Viewer
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="navbar-collapse collapse">
 | 
			
		||||
                <ul class="nav navbar-nav">
 | 
			
		||||
                    <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
 | 
			
		||||
                    <li><a href="/index.html" class="alert-info">Run Information</a></li>
 | 
			
		||||
                    <li><a href="/run-headers.html">Run Headers</a></li>
 | 
			
		||||
                    <li><a href="/files.html">Files</a></li>
 | 
			
		||||
                    <li><a href="/export.html">Export</a></li>
 | 
			
		||||
                    <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
 | 
			
		||||
                    <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
 | 
			
		||||
                    <li><a href="/mes.html" target="_blank">FI Backlog</a></li>
 | 
			
		||||
                </ul>
 | 
			
		||||
                <p class="navbar-text navbar-right">
 | 
			
		||||
                     
 | 
			
		||||
                </p>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="container-fluid body-content">
 | 
			
		||||
 | 
			
		||||
        <h4>Run Information</h4>
 | 
			
		||||
 | 
			
		||||
        <form class="form-inline mb-4">
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="ToolType">Tool Type</label>
 | 
			
		||||
                <div class="form-control" id="ToolType"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="StartDate">Start Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="EndDate">End Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkAutoRefresh">
 | 
			
		||||
                    Auto-Refresh
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkAutoRefresh">
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkCopyOnGet">
 | 
			
		||||
                    Copy-On-Get
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkCopyOnGet">
 | 
			
		||||
            </div>
 | 
			
		||||
        </form>
 | 
			
		||||
 | 
			
		||||
        <div style="height: 300px;" id="HeaderGridDiv">
 | 
			
		||||
            <span id="ToolTypeID" hidden></span>
 | 
			
		||||
            <table id="HeaderGrid"></table>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="row" style="margin-top: 10px; margin-bottom: 20px;">
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="ReviewButton" value="Review" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="ViewButton" value="View" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="PinButton" value="Pin" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div id="DetailsDiv" hidden>
 | 
			
		||||
 | 
			
		||||
            <span id="HeaderId" hidden></span>
 | 
			
		||||
            <span id="HeaderAttachmentId" hidden></span>
 | 
			
		||||
            <div style="padding-bottom: 20px;" id="DetailsGridDiv">
 | 
			
		||||
                <table id="DetailsGrid"></table>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <div id="ExportDiv" style="margin-top: 10px;" hidden>
 | 
			
		||||
                <input type="button" value="Send to OpenInsight" id="OIExportButton" />
 | 
			
		||||
                <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <p style="margin-top: 20px;">
 | 
			
		||||
                <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
 | 
			
		||||
                    hidden></iframe>
 | 
			
		||||
                <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
 | 
			
		||||
                 
 | 
			
		||||
            <div id="DataAttachmentDiv" hidden>
 | 
			
		||||
                <canvas id="DataAttachmentCanvas"></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div id="HeaderAttachmentDiv" hidden>
 | 
			
		||||
                <canvas id="HeaderAttachmentCanvas"></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
            </p>
 | 
			
		||||
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <hr />
 | 
			
		||||
        <footer>
 | 
			
		||||
            <p>© 2024 - Infineon Technologies</p>
 | 
			
		||||
        </footer>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div id="MessageModal"></div>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										161
									
								
								Static/RunHeaders/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,161 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width" />
 | 
			
		||||
    <title>Run Information</title>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
 | 
			
		||||
    <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/chart-4.3.0.min.js" type="module"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
    <div class="navbar navbar-fixed-top">
 | 
			
		||||
        <div class="container-fluid">
 | 
			
		||||
            <div class="navbar-header">
 | 
			
		||||
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                </button>
 | 
			
		||||
                <div class="navbar-brand">
 | 
			
		||||
                    <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
 | 
			
		||||
                    OI Metrology Viewer
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="navbar-collapse collapse">
 | 
			
		||||
                <ul class="nav navbar-nav">
 | 
			
		||||
                    <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
 | 
			
		||||
                    <li><a href="/index.html" class="alert-info">Run Information</a></li>
 | 
			
		||||
                    <li><a href="/run-headers.html">Run Headers</a></li>
 | 
			
		||||
                    <li><a href="/files.html">Files</a></li>
 | 
			
		||||
                    <li><a href="/export.html">Export</a></li>
 | 
			
		||||
                    <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
 | 
			
		||||
                    <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
 | 
			
		||||
                    <li><a href="/mes.html" target="_blank">FI Backlog</a></li>
 | 
			
		||||
                </ul>
 | 
			
		||||
                <p class="navbar-text navbar-right">
 | 
			
		||||
                     
 | 
			
		||||
                </p>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="container-fluid body-content">
 | 
			
		||||
 | 
			
		||||
        <h4>Run Information</h4>
 | 
			
		||||
 | 
			
		||||
        <form class="form-inline mb-4">
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="ToolType">Tool Type</label>
 | 
			
		||||
                <div class="form-control" id="ToolType"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="StartDate">Start Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="EndDate">End Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkAutoRefresh">
 | 
			
		||||
                    Auto-Refresh
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkAutoRefresh">
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkCopyOnGet">
 | 
			
		||||
                    Copy-On-Get
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkCopyOnGet">
 | 
			
		||||
            </div>
 | 
			
		||||
        </form>
 | 
			
		||||
 | 
			
		||||
        <div style="height: 300px;" id="HeaderGridDiv">
 | 
			
		||||
            <span id="ToolTypeID" hidden></span>
 | 
			
		||||
            <table id="HeaderGrid"></table>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="row" style="margin-top: 10px; margin-bottom: 20px;">
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="ReviewButton" value="Review" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="ViewButton" value="View" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="PinButton" value="Pin" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div id="DetailsDiv" hidden>
 | 
			
		||||
 | 
			
		||||
            <span id="HeaderId" hidden></span>
 | 
			
		||||
            <span id="HeaderAttachmentId" hidden></span>
 | 
			
		||||
            <div style="padding-bottom: 20px;" id="DetailsGridDiv">
 | 
			
		||||
                <table id="DetailsGrid"></table>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <div id="ExportDiv" style="margin-top: 10px;" hidden>
 | 
			
		||||
                <input type="button" value="Send to OpenInsight" id="OIExportButton" />
 | 
			
		||||
                <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <p style="margin-top: 20px;">
 | 
			
		||||
                <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
 | 
			
		||||
                    hidden></iframe>
 | 
			
		||||
                <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
 | 
			
		||||
                 
 | 
			
		||||
            <div id="DataAttachmentDiv" hidden>
 | 
			
		||||
                <canvas id="DataAttachmentCanvas"></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div id="HeaderAttachmentDiv" hidden>
 | 
			
		||||
                <canvas id="HeaderAttachmentCanvas"></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
            </p>
 | 
			
		||||
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <hr />
 | 
			
		||||
        <footer>
 | 
			
		||||
            <p>© 2024 - Infineon Technologies</p>
 | 
			
		||||
        </footer>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div id="MessageModal"></div>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										161
									
								
								Static/RunInfo/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,161 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width" />
 | 
			
		||||
    <title>Run Information</title>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
 | 
			
		||||
    <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/chart-4.3.0.min.js" type="module"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
    <div class="navbar navbar-fixed-top">
 | 
			
		||||
        <div class="container-fluid">
 | 
			
		||||
            <div class="navbar-header">
 | 
			
		||||
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                </button>
 | 
			
		||||
                <div class="navbar-brand">
 | 
			
		||||
                    <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
 | 
			
		||||
                    OI Metrology Viewer
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="navbar-collapse collapse">
 | 
			
		||||
                <ul class="nav navbar-nav">
 | 
			
		||||
                    <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
 | 
			
		||||
                    <li><a href="/index.html" class="alert-info">Run Information</a></li>
 | 
			
		||||
                    <li><a href="/run-headers.html">Run Headers</a></li>
 | 
			
		||||
                    <li><a href="/files.html">Files</a></li>
 | 
			
		||||
                    <li><a href="/export.html">Export</a></li>
 | 
			
		||||
                    <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
 | 
			
		||||
                    <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
 | 
			
		||||
                    <li><a href="/mes.html" target="_blank">FI Backlog</a></li>
 | 
			
		||||
                </ul>
 | 
			
		||||
                <p class="navbar-text navbar-right">
 | 
			
		||||
                     
 | 
			
		||||
                </p>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="container-fluid body-content">
 | 
			
		||||
 | 
			
		||||
        <h4>Run Information</h4>
 | 
			
		||||
 | 
			
		||||
        <form class="form-inline mb-4">
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="ToolType">Tool Type</label>
 | 
			
		||||
                <div class="form-control" id="ToolType"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="StartDate">Start Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="EndDate">End Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkAutoRefresh">
 | 
			
		||||
                    Auto-Refresh
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkAutoRefresh">
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkCopyOnGet">
 | 
			
		||||
                    Copy-On-Get
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkCopyOnGet">
 | 
			
		||||
            </div>
 | 
			
		||||
        </form>
 | 
			
		||||
 | 
			
		||||
        <div style="height: 300px;" id="HeaderGridDiv">
 | 
			
		||||
            <span id="ToolTypeID" hidden></span>
 | 
			
		||||
            <table id="HeaderGrid"></table>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="row" style="margin-top: 10px; margin-bottom: 20px;">
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="ReviewButton" value="Review" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="ViewButton" value="View" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="PinButton" value="Pin" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div id="DetailsDiv" hidden>
 | 
			
		||||
 | 
			
		||||
            <span id="HeaderId" hidden></span>
 | 
			
		||||
            <span id="HeaderAttachmentId" hidden></span>
 | 
			
		||||
            <div style="padding-bottom: 20px;" id="DetailsGridDiv">
 | 
			
		||||
                <table id="DetailsGrid"></table>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <div id="ExportDiv" style="margin-top: 10px;" hidden>
 | 
			
		||||
                <input type="button" value="Send to OpenInsight" id="OIExportButton" />
 | 
			
		||||
                <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <p style="margin-top: 20px;">
 | 
			
		||||
                <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
 | 
			
		||||
                    hidden></iframe>
 | 
			
		||||
                <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
 | 
			
		||||
                 
 | 
			
		||||
            <div id="DataAttachmentDiv" hidden>
 | 
			
		||||
                <canvas id="DataAttachmentCanvas"></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div id="HeaderAttachmentDiv" hidden>
 | 
			
		||||
                <canvas id="HeaderAttachmentCanvas"></canvas>
 | 
			
		||||
            </div>
 | 
			
		||||
            </p>
 | 
			
		||||
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <hr />
 | 
			
		||||
        <footer>
 | 
			
		||||
            <p>© 2024 - Infineon Technologies</p>
 | 
			
		||||
        </footer>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div id="MessageModal"></div>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										88
									
								
								Static/awaiting-disposition.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,88 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width" />
 | 
			
		||||
    <title>Awaiting Disposition</title>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
 | 
			
		||||
    <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/chart-4.3.0.min.js" type="module"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
    <div class="navbar navbar-fixed-top">
 | 
			
		||||
        <div class="container-fluid">
 | 
			
		||||
            <div class="navbar-header">
 | 
			
		||||
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                </button>
 | 
			
		||||
                <div class="navbar-brand">
 | 
			
		||||
                    <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
 | 
			
		||||
                    OI Metrology Viewer
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="navbar-collapse collapse">
 | 
			
		||||
                <ul class="nav navbar-nav">
 | 
			
		||||
                    <li><a href="/awaiting-disposition.html" class="alert-info">Awaiting Disposition</a></li>
 | 
			
		||||
                    <li><a href="/index.html">Run Information</a></li>
 | 
			
		||||
                    <li><a href="/run-headers.html">Run Headers</a></li>
 | 
			
		||||
                    <li><a href="/files.html">Files</a></li>
 | 
			
		||||
                    <li><a href="/export.html">Export</a></li>
 | 
			
		||||
                    <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
 | 
			
		||||
                    <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
 | 
			
		||||
                    <li><a href="/mes.html" target="_blank">FI Backlog</a></li>
 | 
			
		||||
                </ul>
 | 
			
		||||
                <p class="navbar-text navbar-right">
 | 
			
		||||
                     
 | 
			
		||||
                </p>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="container-fluid body-content">
 | 
			
		||||
        <h4>Awaiting Disposition</h4>
 | 
			
		||||
 | 
			
		||||
        <div style="height: 450px;">
 | 
			
		||||
            <table id="grid"></table>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="row" style="margin-top: 10px; margin-bottom: 20px;">
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" id="OpenButton" value="Open" />
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" id="RefreshButton" value="Refresh" />
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <hr />
 | 
			
		||||
        <footer>
 | 
			
		||||
            <p>© 2024 - Infineon Technologies</p>
 | 
			
		||||
        </footer>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div id="MessageModal"></div>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/awaiting-disposition.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										96
									
								
								Static/export.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,96 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width" />
 | 
			
		||||
    <title>Export Data</title>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/export.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
 | 
			
		||||
 | 
			
		||||
    <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/chart-4.3.0.min.js" type="module"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
    <div class="navbar navbar-fixed-top">
 | 
			
		||||
        <div class="container-fluid">
 | 
			
		||||
            <div class="navbar-header">
 | 
			
		||||
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                </button>
 | 
			
		||||
                <div class="navbar-brand">
 | 
			
		||||
                    <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
 | 
			
		||||
                    OI Metrology Viewer
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="navbar-collapse collapse">
 | 
			
		||||
                <ul class="nav navbar-nav">
 | 
			
		||||
                    <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
 | 
			
		||||
                    <li><a href="/index.html">Run Information</a></li>
 | 
			
		||||
                    <li><a href="/run-headers.html">Run Headers</a></li>
 | 
			
		||||
                    <li><a href="/files.html">Files</a></li>
 | 
			
		||||
                    <li><a href="/export.html" class="alert-info">Export</a></li>
 | 
			
		||||
                    <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
 | 
			
		||||
                    <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
 | 
			
		||||
                    <li><a href="/mes.html" target="_blank">FI Backlog</a></li>
 | 
			
		||||
                </ul>
 | 
			
		||||
                <p class="navbar-text navbar-right">
 | 
			
		||||
                     
 | 
			
		||||
                </p>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="container-fluid body-content">
 | 
			
		||||
        <h3>Export Data</h3>
 | 
			
		||||
 | 
			
		||||
        <hr />
 | 
			
		||||
 | 
			
		||||
        <form class="form-inline">
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="ToolType">Tool Type</label>
 | 
			
		||||
                <div class="form-control" id="ToolType" name="ToolType"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="StartDate">Start Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="EndDate">End Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <button type="button" id="ExportButton" class="btn btn-primary">Export Data</button>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
 | 
			
		||||
        </form>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div id="MessageModal"></div>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/export.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/FileSaver.min.js" type="text/javascript"></script>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								Static/favicon.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.0 KiB  | 
							
								
								
									
										129
									
								
								Static/files.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,129 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width" />
 | 
			
		||||
    <title>File(s)</title>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-10-04-08-34" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <link href="/styles/bootstrap.min.css?no-cache=2024-10-04-08-34" rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-10-04-08-34"
 | 
			
		||||
        rel="stylesheet" />
 | 
			
		||||
    <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-10-04-08-34" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/site-server.css?no-cache=2024-10-04-08-34" rel="stylesheet" />
 | 
			
		||||
    <link href="/styles/files.css?no-cache=2024-10-04-08-34" rel="stylesheet" />
 | 
			
		||||
 | 
			
		||||
    <script src="/js/jquery-3.6.0.min.js?no-cache=2024-10-04-08-34" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/jquery-ui.min.js?no-cache=2024-10-04-08-34" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.core.js?no-cache=2024-10-04-08-34" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-10-04-08-34" type="text/javascript"></script>
 | 
			
		||||
    <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-10-04-08-34" type="text/javascript"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/chart-4.3.0.min.js" type="module"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/common.js?no-cache=2024-10-04-08-34" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/site-server.js?no-cache=2024-10-04-08-34" type="text/javascript"></script>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
    <div class="navbar navbar-fixed-top">
 | 
			
		||||
        <div class="container-fluid">
 | 
			
		||||
            <div class="navbar-header">
 | 
			
		||||
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                </button>
 | 
			
		||||
                <div class="navbar-brand">
 | 
			
		||||
                    <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
 | 
			
		||||
                    OI Metrology Viewer
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="navbar-collapse collapse">
 | 
			
		||||
                <ul class="nav navbar-nav">
 | 
			
		||||
                    <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
 | 
			
		||||
                    <li><a href="/index.html">Run Information</a></li>
 | 
			
		||||
                    <li><a href="/run-headers.html">Run Headers</a></li>
 | 
			
		||||
                    <li><a href="/files.html" class="alert-info">Files</a></li>
 | 
			
		||||
                    <li><a href="/export.html">Export</a></li>
 | 
			
		||||
                    <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
 | 
			
		||||
                    <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
 | 
			
		||||
                    <li><a href="/mes.html" target="_blank">FI Backlog</a></li>
 | 
			
		||||
                </ul>
 | 
			
		||||
                <p class="navbar-text navbar-right">
 | 
			
		||||
                     
 | 
			
		||||
                </p>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="container-fluid body-content">
 | 
			
		||||
 | 
			
		||||
        <h4>Run Information</h4>
 | 
			
		||||
 | 
			
		||||
        <form class="form-inline mb-4">
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="ToolType">Tool</label>
 | 
			
		||||
                <div class="form-control" id="ToolType"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="StartDate">Start Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label for="EndDate">End Time</label>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
 | 
			
		||||
                <div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
 | 
			
		||||
            </div>  
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkAutoRefresh">
 | 
			
		||||
                    Auto-Refresh
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkAutoRefresh">
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="form-group">
 | 
			
		||||
                <label class="form-check-label" for="chkCopyOnGet">
 | 
			
		||||
                    Copy-On-Get
 | 
			
		||||
                </label>
 | 
			
		||||
                <input class="form-check-input" type="checkbox" id="chkCopyOnGet">
 | 
			
		||||
            </div>
 | 
			
		||||
        </form>
 | 
			
		||||
 | 
			
		||||
        <div style="height: 500px;" id="HeaderGridDiv">
 | 
			
		||||
            <span id="ToolTypeID" hidden></span>
 | 
			
		||||
            <table id="HeaderGrid"></table>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="row" style="margin-top: 10px; margin-bottom: 20px;">
 | 
			
		||||
            <div class="col-xs-1">
 | 
			
		||||
                <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div id="DetailsDiv" hidden>
 | 
			
		||||
            <span id="HeaderId" hidden></span>
 | 
			
		||||
            <span id="HeaderAttachmentId" hidden></span>
 | 
			
		||||
            <div style="padding-bottom: 20px;" id="DetailsGridDiv">
 | 
			
		||||
                <table id="DetailsGrid"></table>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <hr />
 | 
			
		||||
        <footer>
 | 
			
		||||
            <p>© 2024 - Infineon Technologies</p>
 | 
			
		||||
        </footer>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div id="MessageModal"></div>
 | 
			
		||||
 | 
			
		||||
    <script src="/js/bootstrap.min.js?no-cache=2024-10-04-08-34" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/respond.min.js?no-cache=2024-10-04-08-34" type="text/javascript"></script>
 | 
			
		||||
    <script src="/js/files.js?no-cache=2024-10-04-08-34" type="text/javascript"></script>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 272 KiB After Width: | Height: | Size: 272 KiB  | 
| 
		 Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB  | 
| 
		 Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB  | 
| 
		 Before Width: | Height: | Size: 210 B After Width: | Height: | Size: 210 B  | 
| 
		 Before Width: | Height: | Size: 225 B After Width: | Height: | Size: 225 B  | 
| 
		 Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB  | 
| 
		 Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB  | 
| 
		 Before Width: | Height: | Size: 418 B After Width: | Height: | Size: 418 B  | 
| 
		 Before Width: | Height: | Size: 985 B After Width: | Height: | Size: 985 B  | 
| 
		 Before Width: | Height: | Size: 964 B After Width: | Height: | Size: 964 B  | 
| 
		 Before Width: | Height: | Size: 486 B After Width: | Height: | Size: 486 B  | 
| 
		 Before Width: | Height: | Size: 483 B After Width: | Height: | Size: 483 B  | 
| 
		 Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB  | 
| 
		 Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB  | 
| 
		 Before Width: | Height: | Size: 999 B After Width: | Height: | Size: 999 B  | 
| 
		 Before Width: | Height: | Size: 993 B After Width: | Height: | Size: 993 B  | 
| 
		 Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB  | 
| 
		 Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB  | 
| 
		 Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB  | 
| 
		 Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB  |