diff --git a/dist/chromium/content.js b/dist/chromium/content.js index 4dc40cb..3b9b406 100644 --- a/dist/chromium/content.js +++ b/dist/chromium/content.js @@ -1999,7 +1999,13 @@ function createOpportunityCrmServiceRequests({ requestCrmServiceRequest, isCurre const badge = environment.document.createElement(items.length && status === "ready" ? "button" : "span"); badge.className = "opportunities-extension-crm-sr-badge"; badge.setAttribute("data-state", status === "error" ? "error" : items.length ? "matched" : "missing"); - badge.textContent = status === "error" ? "SR ?" : items.length ? "\u2705 SR" : "\u26d4 SR"; + const hours = items.map(item => item.ReportedHours_c).filter(value => + (typeof value === "number" || (typeof value === "string" && value.trim() !== "")) && Number.isFinite(Number(value)) + ).map(Number); + const reportedHours = hours.length === items.length + ? new Intl.NumberFormat("en-US", { useGrouping: false, maximumFractionDigits: 10 }).format(hours.reduce((total, value) => total + value, 0)) + : "N/D"; + badge.textContent = status === "error" ? "SR ?" : items.length ? `\u2705 SR (${reportedHours}${reportedHours === "N/D" ? "" : "h"})` : "\u26d4 SR"; const display = value => value === null || value === undefined || value === "" ? "N/D" : String(value); const descriptions = items.map(item => [ `Title: ${display(item.Title)}`, diff --git a/dist/firefox/content.js b/dist/firefox/content.js index 4dc40cb..3b9b406 100644 --- a/dist/firefox/content.js +++ b/dist/firefox/content.js @@ -1999,7 +1999,13 @@ function createOpportunityCrmServiceRequests({ requestCrmServiceRequest, isCurre const badge = environment.document.createElement(items.length && status === "ready" ? "button" : "span"); badge.className = "opportunities-extension-crm-sr-badge"; badge.setAttribute("data-state", status === "error" ? "error" : items.length ? "matched" : "missing"); - badge.textContent = status === "error" ? "SR ?" : items.length ? "\u2705 SR" : "\u26d4 SR"; + const hours = items.map(item => item.ReportedHours_c).filter(value => + (typeof value === "number" || (typeof value === "string" && value.trim() !== "")) && Number.isFinite(Number(value)) + ).map(Number); + const reportedHours = hours.length === items.length + ? new Intl.NumberFormat("en-US", { useGrouping: false, maximumFractionDigits: 10 }).format(hours.reduce((total, value) => total + value, 0)) + : "N/D"; + badge.textContent = status === "error" ? "SR ?" : items.length ? `\u2705 SR (${reportedHours}${reportedHours === "N/D" ? "" : "h"})` : "\u26d4 SR"; const display = value => value === null || value === undefined || value === "" ? "N/D" : String(value); const descriptions = items.map(item => [ `Title: ${display(item.Title)}`, diff --git a/src/features/opportunities/crm-service-requests.js b/src/features/opportunities/crm-service-requests.js index 988ffd1..4846726 100644 --- a/src/features/opportunities/crm-service-requests.js +++ b/src/features/opportunities/crm-service-requests.js @@ -35,7 +35,13 @@ function createOpportunityCrmServiceRequests({ requestCrmServiceRequest, isCurre const badge = environment.document.createElement(items.length && status === "ready" ? "button" : "span"); badge.className = "opportunities-extension-crm-sr-badge"; badge.setAttribute("data-state", status === "error" ? "error" : items.length ? "matched" : "missing"); - badge.textContent = status === "error" ? "SR ?" : items.length ? "\u2705 SR" : "\u26d4 SR"; + const hours = items.map(item => item.ReportedHours_c).filter(value => + (typeof value === "number" || (typeof value === "string" && value.trim() !== "")) && Number.isFinite(Number(value)) + ).map(Number); + const reportedHours = hours.length === items.length + ? new Intl.NumberFormat("en-US", { useGrouping: false, maximumFractionDigits: 10 }).format(hours.reduce((total, value) => total + value, 0)) + : "N/D"; + badge.textContent = status === "error" ? "SR ?" : items.length ? `\u2705 SR (${reportedHours}${reportedHours === "N/D" ? "" : "h"})` : "\u26d4 SR"; const display = value => value === null || value === undefined || value === "" ? "N/D" : String(value); const descriptions = items.map(item => [ `Title: ${display(item.Title)}`, diff --git a/tests/crmServiceRequests.test.cjs b/tests/crmServiceRequests.test.cjs index 86d458b..6f5b4f1 100644 --- a/tests/crmServiceRequests.test.cjs +++ b/tests/crmServiceRequests.test.cjs @@ -14,6 +14,15 @@ const sr = (number, id = "SR-1") => ({ SrNumber: id, Title: ""]) assert.ok(found.attributes["aria-label"].includes(detail)); @@ -122,7 +131,7 @@ test("stale CRM results cannot overwrite a reopened modal or continue pagination await app.opportunityCrmServiceRequests.load("token", 2); resolveOld(response({ items: [sr("OLD")], hasMore: true, count: 1, offset: 0 })); await old; - assert.equal(app.opportunityCrmServiceRequests.createBadge("NEW").textContent, "\u2705 SR"); + assert.equal(app.opportunityCrmServiceRequests.createBadge("NEW").textContent, "\u2705 SR (0h)"); assert.equal(app.opportunityCrmServiceRequests.createBadge("OLD").textContent, "\u26d4 SR"); assert.equal(app.debugState.requestLog.length, 1); }); @@ -144,8 +153,8 @@ test("Reference changes share pending pagination and reuse completed CRM results app.opportunitiesQueryState.periodRequestVersion = 3; await app.opportunityCrmServiceRequests.load("token", 3); assert.equal(calls, 2); - assert.equal(app.opportunityCrmServiceRequests.createBadge("A").textContent, "\u2705 SR"); - assert.equal(app.opportunityCrmServiceRequests.createBadge("B").textContent, "\u2705 SR"); + assert.equal(app.opportunityCrmServiceRequests.createBadge("A").textContent, "\u2705 SR (0h)"); + assert.equal(app.opportunityCrmServiceRequests.createBadge("B").textContent, "\u2705 SR (0h)"); app.opportunityCrmServiceRequests.reset(); await app.opportunityCrmServiceRequests.load("token", 3); assert.equal(calls, 3); diff --git a/tests/opportunityTable.test.cjs b/tests/opportunityTable.test.cjs index 521880f..e94c192 100644 --- a/tests/opportunityTable.test.cjs +++ b/tests/opportunityTable.test.cjs @@ -124,11 +124,11 @@ test("CRM SR badge follows Ramp Months and remains visible while product data is }]; await h.app.opportunityCrmServiceRequests.load("synthetic", h.app.opportunitiesQueryState.periodRequestVersion); h.app.opportunitiesTable.renderOpportunitiesTable(); - assert.equal(findClass(h.cell("name"), "opportunities-extension-crm-sr-badge").textContent, "\u2705 SR"); + assert.equal(findClass(h.cell("name"), "opportunities-extension-crm-sr-badge").textContent, "\u2705 SR (0h)"); h.app.productsContentState.opptyProductsByNumber.set("TEST-1", { items: [{ RampMonths_c: 3 }] }); h.app.opportunitiesTable.renderOpportunitiesTable(); const actions = h.cell("name").children[0].children[1]; - assert.deepEqual(actions.children.map(child => child.textContent), ["1", "RM 3", "\u2705 SR", "Act ?"]); + assert.deepEqual(actions.children.map(child => child.textContent), ["1", "RM 3", "\u2705 SR (0h)", "Act ?"]); findClass(h.cell("name"), "opportunities-extension-products-count").click(); assert.ok(findClass(h.rows()[1], "opportunities-extension-products-table")); });