Revise QR code generation library, enhance POS flow, and update Edge Gateway management views and tests

This commit is contained in:
Jeppe Bundgaard
2026-04-23 10:48:08 +02:00
parent fc26e12013
commit 50190da52f
14 changed files with 16884 additions and 68 deletions
+37 -19
View File
@@ -3320,7 +3320,9 @@ function ensureEdgeGatewayHardwareFixture(edgeGatewayFixture) {
}
function buildEdgeGatewayHardwareBindingsIndex(edgeGatewayFixture, departmentId) {
const gateways = edgeGatewayFixture.gateways.filter((gateway) => Number(gateway.department_id) === Number(departmentId));
const gateways = edgeGatewayFixture.gateways.filter(
(gateway) => Number(gateway.department_id) === Number(departmentId)
);
const bindingsByRelayId = {};
gateways.forEach((gateway) => {
@@ -3420,8 +3422,7 @@ function buildEdgeGatewayHardwareDepartmentWorkspace(edgeGatewayFixture, departm
required: requiredRelayCount,
bound: boundRelayCount,
missing: Math.max(0, requiredRelayCount - boundRelayCount),
state:
requiredRelayCount === 0 ? "NOT_REQUIRED" : boundRelayCount === requiredRelayCount ? "READY" : "MISSING",
state: requiredRelayCount === 0 ? "NOT_REQUIRED" : boundRelayCount === requiredRelayCount ? "READY" : "MISSING",
},
links: {
legacy: `/superuser/department/lanes/${lane.id}`,
@@ -3478,7 +3479,10 @@ function buildEdgeGatewayHardwareDepartmentWorkspace(edgeGatewayFixture, departm
const scansByScannerId = {};
(hardware.scans || [])
.filter((scan) => Number(scan.department_id) === Number(departmentId))
.sort((left, right) => new Date(String(right.created_at || 0)).getTime() - new Date(String(left.created_at || 0)).getTime())
.sort(
(left, right) =>
new Date(String(right.created_at || 0)).getTime() - new Date(String(left.created_at || 0)).getTime()
)
.forEach((scan) => {
const scannerId = Number(scan.plate_scanner_id || 0);
if (!scansByScannerId[scannerId]) {
@@ -3514,11 +3518,19 @@ function buildEdgeGatewayHardwareDepartmentWorkspace(edgeGatewayFixture, departm
});
const issues = [];
const onlineGatewayCount = gatewayPayloads.filter((gateway) => String(gateway?.status || "").toUpperCase() === "ONLINE").length;
const transportMode = String(gatewayPayloads[0]?.department_transport_mode || gateways[0]?.department_transport_mode || "cloud");
const onlineGatewayCount = gatewayPayloads.filter(
(gateway) => String(gateway?.status || "").toUpperCase() === "ONLINE"
).length;
const transportMode = String(
gatewayPayloads[0]?.department_transport_mode || gateways[0]?.department_transport_mode || "cloud"
);
if (gatewayPayloads.length === 0) {
issues.push({ severity: "danger", code: "NO_GATEWAY", message: "No edge gateway has been claimed for this department." });
issues.push({
severity: "danger",
code: "NO_GATEWAY",
message: "No edge gateway has been claimed for this department.",
});
} else if (transportMode === "gateway" && onlineGatewayCount === 0) {
issues.push({
severity: "danger",
@@ -3663,17 +3675,17 @@ function buildEdgeGatewayHardwareDepartmentWorkspace(edgeGatewayFixture, departm
});
const primaryGateway = gatewayPayloads.find((gateway) => gateway?.is_primary) || gatewayPayloads[0] || null;
const recentScanAt = scanners
.map((scanner) => scanner?.recent_scan_at)
.filter(Boolean)
.sort((left, right) => new Date(String(right || 0)).getTime() - new Date(String(left || 0)).getTime())[0] || null;
const recentScanAt =
scanners
.map((scanner) => scanner?.recent_scan_at)
.filter(Boolean)
.sort((left, right) => new Date(String(right || 0)).getTime() - new Date(String(left || 0)).getTime())[0] || null;
const health =
issues.some((issue) => issue.severity === "danger")
? "AT_RISK"
: issues.length > 0
? "PARTIAL"
: "READY";
const health = issues.some((issue) => issue.severity === "danger")
? "AT_RISK"
: issues.length > 0
? "PARTIAL"
: "READY";
const summary = {
department_id: department.id,
@@ -3820,7 +3832,9 @@ async function handleEdgeGatewayRoute({ route, request, parsedUrl, pathname, met
if (edgeGatewayWorkspaceDepartmentsPattern.test(pathname) && method === "GET") {
const hardware = ensureEdgeGatewayHardwareFixture(edgeGatewayFixture);
const summaries = (hardware?.departments || [])
.map((department) => buildEdgeGatewayHardwareDepartmentWorkspace(edgeGatewayFixture, department.id, false)?.summary)
.map(
(department) => buildEdgeGatewayHardwareDepartmentWorkspace(edgeGatewayFixture, department.id, false)?.summary
)
.filter(Boolean)
.sort((left, right) => Number(left?.order_priority || 0) - Number(right?.order_priority || 0));
await route.fulfill(json({ data: summaries }));
@@ -3837,7 +3851,11 @@ async function handleEdgeGatewayRoute({ route, request, parsedUrl, pathname, met
if (numberPlateScannersPattern.test(pathname) && method === "GET") {
const hardware = ensureEdgeGatewayHardwareFixture(edgeGatewayFixture);
const rows = cloneJson(hardware?.scanners || []);
const paginated = paginateRows(rows, parsedUrl.searchParams.get("page") || 1, parsedUrl.searchParams.get("limit") || 10);
const paginated = paginateRows(
rows,
parsedUrl.searchParams.get("page") || 1,
parsedUrl.searchParams.get("limit") || 10
);
await route.fulfill(
json({
success: true,