54 lines
2.6 KiB
JavaScript
54 lines
2.6 KiB
JavaScript
function createInstallBaseAction({ messageTypes, requestConsumerTokenServiceOnce, sendRuntimeMessage,
|
|
appendBackgroundRequestLog, openInstallBaseModal, environment }) {
|
|
const { document } = environment;
|
|
const pending = new Map();
|
|
|
|
async function load(partyNumber) {
|
|
const authorizations = await requestConsumerTokenServiceOnce();
|
|
const response = await sendRuntimeMessage({
|
|
type: messageTypes.requestInstallBase, partyNumber,
|
|
authorizations: { accountSummary: authorizations.accountSummary, installBase: authorizations.installBase }
|
|
});
|
|
appendBackgroundRequestLog(response?.debugRequests);
|
|
if (!response?.ok) throw new Error(response?.error || "Unable to load installed base.");
|
|
return response.items;
|
|
}
|
|
|
|
function createInstallBaseButton(opportunity) {
|
|
const button = document.createElement("button");
|
|
button.type = "button";
|
|
button.className = "opportunities-extension-action-button";
|
|
button.title = "View customer installed base";
|
|
button.setAttribute("aria-label", `View installed base for ${opportunity.CustomerAccount?.PartyUniqueName || "customer"}`);
|
|
const icon = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
icon.setAttribute("viewBox", "0 0 24 24");
|
|
icon.setAttribute("aria-hidden", "true");
|
|
icon.setAttribute("focusable", "false");
|
|
const path = document.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
path.setAttribute("d", "M4 3h16v7H4z M4 14h16v7H4z M7 6.5h.01 M7 17.5h.01 M11 6.5h6 M11 17.5h6 M8 10v4 M16 10v4");
|
|
path.setAttribute("fill", "none");
|
|
path.setAttribute("stroke", "currentColor");
|
|
path.setAttribute("stroke-width", "1.7");
|
|
path.setAttribute("stroke-linecap", "round");
|
|
path.setAttribute("stroke-linejoin", "round");
|
|
icon.append(path);
|
|
button.append(icon);
|
|
button.addEventListener("click", async () => {
|
|
const view = openInstallBaseModal(opportunity, button);
|
|
const partyNumber = String(opportunity.CustomerAccount?.PartyNumber || "");
|
|
try {
|
|
if (!partyNumber) throw new Error("Customer Party Number is unavailable.");
|
|
if (!pending.has(partyNumber)) {
|
|
const request = load(partyNumber).finally(() => { if (pending.get(partyNumber) === request) pending.delete(partyNumber); });
|
|
pending.set(partyNumber, request);
|
|
}
|
|
view.render(await pending.get(partyNumber));
|
|
} catch (error) {
|
|
view.render([], error.message || "Unable to load installed base.");
|
|
}
|
|
});
|
|
return button;
|
|
}
|
|
return { createInstallBaseButton, resetRequests: () => pending.clear() };
|
|
}
|