ⓘ SCANNED DETAILS
@@ -103,7 +97,7 @@
@(item.ShipmentMarked ? "TRUE" : "FALSE")
- @item.ProcessedAtUtc.ToString("dd MMM yyyy h:mm tt") |
+ @DateTime.SpecifyKind(item.ProcessedAtUtc, DateTimeKind.Utc).ToLocalTime().ToString("dd MMM yyyy h:mm tt") |
System |
rowNumber++;
@@ -122,7 +116,7 @@
@section Scripts {
diff --git a/Views/Shared/_Layout.cshtml b/Views/Shared/_Layout.cshtml
index 71e4d65..7646d25 100644
--- a/Views/Shared/_Layout.cshtml
+++ b/Views/Shared/_Layout.cshtml
@@ -3,7 +3,7 @@
- @ViewData["Title"] - AVS Carton Shipment Verifier
+ @ViewData["Title"] - SHIPPING MARK
diff --git a/appsettings.json b/appsettings.json
index 3673401..8c200c6 100644
--- a/appsettings.json
+++ b/appsettings.json
@@ -1,11 +1,15 @@
{
"ConnectionStrings": {
- "VerificationDatabase": "Server=utopia-industries-rr.c5qech8o9lgg.us-east-1.rds.amazonaws.com;Port=3306;Database=item_verification_system;User ID=muhammad.faique;Password=21)3lq6b!A@.;SslMode=Preferred;Allow User Variables=True;"
+ "VerificationDatabase": ""
},
"CartonVerification": {
"TableName": "carton_verification_log",
"QrColumnName": "qr",
- "ShipmentVerificationFlagColumnName": "shipment_verification_flag"
+ "MovedToWarehouseColumnName": "moved_to_warehouse"
+ },
+ "ScanHistory": {
+ "DatabasePath": "C:\\Users\\Public\\AVSCartonShipmentVerifier\\scan-history.db",
+ "MaxRecordsToKeep": 500
},
"Logging": {
"LogLevel": {
diff --git a/wwwroot/css/site.css b/wwwroot/css/site.css
index 8b9f0af..95320f3 100644
--- a/wwwroot/css/site.css
+++ b/wwwroot/css/site.css
@@ -58,7 +58,7 @@ body {
.top-grid {
display: grid;
- grid-template-columns: 1.15fr 0.75fr 1.1fr;
+ grid-template-columns: 1fr 1fr;
gap: 10px;
}
@@ -164,56 +164,18 @@ body {
color: #4f6687;
}
-.panel-center-status {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- text-align: center;
- min-height: 314px;
-}
-
-.status-visual {
- width: 94px;
- height: 94px;
- border-radius: 50%;
- background: #8b9cb8;
- color: #fff;
- display: grid;
- place-items: center;
- font-size: 2.4rem;
- font-weight: 800;
- margin-bottom: 10px;
-}
-
-.status-headline {
- color: #123d73;
- font-size: 2.6rem;
- font-weight: 800;
-}
-
-.status-message {
- margin-top: 6px;
- color: #5f7392;
- font-size: 1.2rem;
-}
-
-.status-success .status-visual,
.status-success .status-mini-icon {
background: #3cae58;
}
-.status-failed .status-visual,
.status-failed .status-mini-icon {
background: #d54d56;
}
-.status-success .status-headline,
.status-success .status-mini-headline {
color: #2f9950;
}
-.status-failed .status-headline,
.status-failed .status-mini-headline {
color: #bf3340;
}
@@ -347,10 +309,6 @@ body {
grid-template-columns: 1fr;
}
- .panel-center-status {
- min-height: 220px;
- }
-
.info-grid {
grid-template-columns: 1fr;
}
diff --git a/wwwroot/js/verification-dashboard.js b/wwwroot/js/verification-dashboard.js
index 6b03a64..e742bae 100644
--- a/wwwroot/js/verification-dashboard.js
+++ b/wwwroot/js/verification-dashboard.js
@@ -1,12 +1,8 @@
(() => {
const qrInput = document.getElementById("qr-input");
const statusCard = document.getElementById("status-card");
- const statusCenterCard = document.getElementById("status-center-card");
- const statusVisual = document.getElementById("status-visual");
const statusMiniIcon = document.getElementById("status-mini-icon");
- const statusHeadline = document.getElementById("status-headline");
const statusMiniHeadline = document.getElementById("status-mini-headline");
- const statusText = document.getElementById("status-text");
const statusMiniMessage = document.getElementById("status-mini-message");
const lastUpdatedTime = document.getElementById("last-updated-time");
const historyBody = document.querySelector("#history-table tbody");
@@ -21,6 +17,7 @@
};
const antiForgeryToken = document.querySelector('input[name="__RequestVerificationToken"]')?.value;
+ let isSubmitting = false;
qrInput.addEventListener("keydown", async event => {
if (event.key !== "Enter") {
@@ -28,16 +25,36 @@
}
event.preventDefault();
- const qrValue = qrInput.value.trim();
- if (!qrValue) {
+ await submitCurrentInput();
+ });
+
+ qrInput.addEventListener("paste", async event => {
+ const pastedValue = event.clipboardData?.getData("text")?.trim();
+ if (!pastedValue) {
return;
}
- await submitScan(qrValue);
- qrInput.value = "";
- qrInput.focus();
+ event.preventDefault();
+ qrInput.value = pastedValue;
+ await submitCurrentInput();
});
+ async function submitCurrentInput() {
+ const qrValue = qrInput.value.trim();
+ if (!qrValue || isSubmitting) {
+ return;
+ }
+
+ isSubmitting = true;
+ try {
+ await submitScan(qrValue);
+ qrInput.value = "";
+ qrInput.focus();
+ } finally {
+ isSubmitting = false;
+ }
+ }
+
async function submitScan(qrValue) {
try {
const response = await fetch("/api/verification/scan", {
@@ -72,11 +89,8 @@
function renderStatus(result) {
if (result.isSuccessful) {
setStatusClasses("status-success");
- statusVisual.textContent = "\u2713";
statusMiniIcon.textContent = "\u2713";
- statusHeadline.textContent = "VERIFIED";
statusMiniHeadline.textContent = "VERIFIED";
- statusText.textContent = result.message;
statusMiniMessage.textContent = result.message;
lastUpdatedTime.textContent = formatDisplayTime(result.processedAtUtc);
return;
@@ -88,18 +102,14 @@
function setFailedState(message) {
setStatusClasses("status-failed");
- statusVisual.textContent = "!";
statusMiniIcon.textContent = "!";
- statusHeadline.textContent = "FAILED";
statusMiniHeadline.textContent = "FAILED";
- statusText.textContent = message;
statusMiniMessage.textContent = message;
lastUpdatedTime.textContent = "-";
}
function setStatusClasses(statusClass) {
statusCard.className = `panel panel-status ${statusClass}`;
- statusCenterCard.className = `panel panel-center-status ${statusClass}`;
}
function renderDetails(result) {