/* * This file function is written to get form elements values for creating payload JSON for ISV success program page and also * show the success,reject, error popup as per the result. */ (function (document) { "use strict"; const uuidTracking = () => { return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) => (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16) ); }; const manualReviewUrlUpdate = (isvId) => { const linkEl = $('#formMessagingModal_review a[data-target^="https://aka.ms/ISVSuccessFurtherReview"]') const link = linkEl.attr("data-target"); const url = new URL(link); const search_params = url.searchParams; // new value of "isvId" is set to reviewIsvId search_params.set('isvID', isvId); search_params.set('ctx', `{"isvID": "${isvId}"}`) url.search = search_params.toString(); // the updated URL with the isvID from the response const updatedURL = url.toString(); // adding new url to data-target and href attributes linkEl.attr("data-target", updatedURL).attr("href", updatedURL); }; const isAnyHiddenFieldFilled = (formId) => { let hiddenFields = $(`#${formId} input[type="hidden"]`) let anyFilled = false /* * This function is to set anyFilled variable true if any hidden field is having value. */ hiddenFields.each(function () { let value = $(this).val() if (value != null && value.length > 0) { anyFilled = true } }) return anyFilled } const createISVFormDataPayLoad = (isvForm, isvFormData) => { const isvFormDataInit = {}; let personalDataArr = []; let referralDataArr = []; const otherDataArr = []; const parentObject = { partnerPersonalData: [], partnerReferralData: [], partnerFormData: [] }; const promoConsent = window.countryPromoConsentInstances; if(promoConsent.length > 0) { personalDataArr.push({questionId: "LCID", answer: LocaleUtil?.getPageLocale()}); } const questionKeys = [...new Set(isvFormData.map((val) => val.name))]; questionKeys.forEach((key) => { isvFormDataInit[key] = []; }); isvFormData.forEach((val) => { isvFormDataInit[val.name].push(val.value); }); const isvFormDataPayLoad = questionKeys.map((key) => ({ questionId: key, answer: isvFormDataInit[key].join(", ") })); /* * This function is to create a map for PII data elements and their values. */ const piiDataQKeys = isvForm.find('[data-ispiidata=true] input, [data-ispiidata=true] select') .map(function () { return $(this).attr('name'); }).get(); const partnerReferralQKeys = isvForm.find('[data-isinternalreferraldata=true] input, [data-isinternalreferraldata=true] select') .map(function () { return $(this).attr('name'); }).get(); isvFormDataPayLoad.forEach((payload) => { if (piiDataQKeys.includes(payload.questionId) && payload.answer) { personalDataArr.push(payload); } else if(partnerReferralQKeys.includes(payload.questionId) && payload.answer){ referralDataArr.push(payload); } else if(payload.answer) { otherDataArr.push(payload); } }); const promoConsentJson = promoConsent.map(consent => { const countryElement = isvForm.find(`[data-compid='${consent.compId}']`); const countryId = countryElement.find("select.country-dropdown")[0].name; if (countryElement.length > 0) { const consentChecboxEle = countryElement.find(".msg-consent .consent-checkbox"); const promoConsentAnswers = []; consentChecboxEle.each((i, ele) => { promoConsentAnswers.push({ key: ele.id, selected: ele.checked, type: ele.dataset.consentType }) }); return { countryQuestionId: countryId, promoConsentAnswers } } }); promoConsentJson.forEach(json => { personalDataArr = personalDataArr.filter(personalData => personalData.questionId !== `${json.countryQuestionId}_consent`); const finalJson = {}; finalJson["questionId"] = `${json.countryQuestionId}_consent`; finalJson["answers"] = json.promoConsentAnswers; personalDataArr.push(finalJson); }); parentObject.partnerPersonalData = personalDataArr; parentObject.partnerReferralData = referralDataArr; parentObject.partnerFormData = otherDataArr; return parentObject; }; const applyRulesToISVFormData = (formId, rules) => { if (!rules) { return; } const form = $(`#${formId}`); const formInputElements = form.find('input, select'); const showRules = rules .flatMap(rule => rule.rules.filter(innerRules => innerRules.type === 'show')) .map(rule => rule.qkey); showRules.forEach(showRule => { const input = $(`[name="${showRule}"]`, form); const formCheckRequired = input.attr('data-form-check-required'); input.closest('.form-element').hide(); if(formCheckRequired) { input.attr('data-form-check-required', 'false'); } input.prop('required', false); }); /* * This function is to show-hide questions on the basis of selections in form elements. */ formInputElements.on('change', function (event) { const { type, name, value } = this; if (type === 'checkbox') { const selectedRules = rules.find(rule => rule.qkey === name && rule.anskey === value); if (selectedRules) { selectedRules.rules.forEach(rule => { handleRule(event.target.checked, rule.qkey); }); } } else if (type === 'radio' || type === 'select-one') { let ruleQkeyisTrue; const selectedQKeyRules = rules.filter(rule => rule.qkey === name); selectedQKeyRules.forEach(rule => { const isAnskeyMatch = value === rule.anskey; rule.rules.forEach(eachRule => { const shouldHandleRule = isAnskeyMatch || eachRule.qkey !== ruleQkeyisTrue; if (shouldHandleRule) { handleRule(isAnskeyMatch, eachRule.qkey); ruleQkeyisTrue = eachRule.qkey; } }); }); } }); }; const handleRule = (isAnskeyMatch, qkey) => { const inputElement = $(`[name="${qkey}"]`); const formElement = inputElement.closest('.form-element'); const isValidationRequired = inputElement.attr('data-feedback-content'); const isDisclaimer = inputElement.hasClass('disclaimer'); formElement.toggle(isAnskeyMatch); inputElement.prop('checked', isDisclaimer ? isAnskeyMatch : false); if (isValidationRequired) { handleValidationAndReset(qkey, isAnskeyMatch); } } const handleValidationAndReset = (qkeyVal, isVisible) => { const inputField = $(`[name="${qkeyVal}"]`); const isCheckbox = (inputField.attr('type') === 'checkbox'); inputField.prop('required', isVisible); if (isCheckbox) { inputField.attr('data-form-check-required', isVisible); } if (!isVisible) { if (inputField[0].type === 'text' || inputField[0].type === 'select-one') { inputField.val(""); } else { inputField.prop('checked', false); } } }; const openAccordionandFocus = (errorID) => { const accordionItem = $(`${errorID}`).closest('.accordion-item'); accordionItem.find('.btn-collapse').attr('aria-expanded', true); accordionItem.find('.collapse').addClass('show'); $(errorID).focus(); } const disableMRQuestion= (mrQuestionInputs, mrQuestionContinueBtn) => { mrQuestionInputs.prop('disabled', true); mrQuestionContinueBtn.addClass('disabled'); } const getMRQuestionValues = (mrQuestionInputs) => { return mrQuestionInputs.filter(':checked').map((index, element) => $(element).val()).toArray(); } const showMRQuestionInfo = (isvForm, mrQuestionInputs, mrQuestionContinueBtn, formMessagingModal) => { const selectedValues = getMRQuestionValues(mrQuestionInputs); const isAppMarketing = selectedValues.length === 1 && selectedValues.includes("appMarketing"); disableMRQuestion(mrQuestionInputs, mrQuestionContinueBtn); if (isAppMarketing) { const modalToShow = formMessagingModal.find(modalObj => modalObj.qualificationStatus === 4)?.modal; if (modalToShow) { modalToShow.show(); return; } } $(isvForm).addClass("display"); }; const updateMRContinueBtn = (mrQuestionInputs, mrQuestionContinueBtn) => { const selectedMRQuestion = getMRQuestionValues(mrQuestionInputs); mrQuestionContinueBtn.toggleClass('disabled', !selectedMRQuestion.length); } const getCookieValue = (cookieName) => { const value = `; ${document.cookie}`; const parts = value.split(`; ${cookieName}=`); if (parts.length === 2) return parts.pop().split(';').shift(); } const mrQuestionExist = (mrQuestionInputs) => { return mrQuestionInputs.length > 0; } document.addEventListener("DOMContentLoaded", () => { const attrElement = $("#data-attributes"); const formId = attrElement.data("formid"); const isvForm = $(`#${formId}`)[0]; const mwf = window.mwf; let rules = null; const mrQuestionInputs = $(isvForm).find('[name="mrQuestion"], [name="helpAreas"]'); const mrQuestionContinueBtn = $(isvForm).find('#mrQuestion_continue a'); const errAlert = $(isvForm).find('.alert'); const mrQuestionAuthored = mrQuestionExist(mrQuestionInputs); const formMessagingModal = []; const appMarketingPopup = $('#formMessagingModal_appMarketing'); const appMarketingRejectPopup = $('#formMessagingModal_appMarketing_reject'); const acceptPopup = $('#formMessagingModal_accept'); const rejectPopup = $('#formMessagingModal_reject'); const errorPopup = $('#formMessagingModal_error'); const noRedirectPopup = $(isvForm).data("nopopup"); const qualificationStatusEnum = { success: 1, reject: 3, rejectAppMarketing: 5 } const telemetryConfig = { success: { id: "isv_formsubmit_success", cn: "isv-formsubmit-success", issuccess: true, behavior: 162 // registration complete }, notEligible: { id: "isv_formsubmit_noteligible", cn: "isv-formsubmit_noteligible", issuccess: false }, error: { id: "isv_formsubmit_notfilledallfields", cn: "isv-formsubmit_notfilledallfields", issuccess: false } }; if (!mrQuestionAuthored) { $(isvForm).addClass("display"); } $(`#${formId} [data-mount="collapse-controls"]`).hide(); if (typeof rulesForISV !== "undefined") { rules = rulesForISV; } applyRulesToISVFormData(formId, rules); mrQuestionContinueBtn.on('click', (event) => { event.preventDefault(); if(!mrQuestionContinueBtn.hasClass('disabled')){ showMRQuestionInfo(isvForm, mrQuestionInputs, mrQuestionContinueBtn, formMessagingModal); } }); mrQuestionInputs.on('click', () => { updateMRContinueBtn(mrQuestionInputs, mrQuestionContinueBtn) }); $(".modal .close").on("click", () => { if (mrQuestionAuthored) { location.reload(); } else { isvForm.reset(); applyRulesToISVFormData(formId, rules); } }); $('.alert-content').on('click', 'li a', (el) => { let errorID = el.currentTarget.hash; openAccordionandFocus(errorID); }); let validationInstance = new mwf.FormValidation({ el: document.querySelector(`#${formId}`), }); const pushModalIfExists = (popup, qualificationStatus, modalId) => { if (popup.length > 0) { formMessagingModal.push({ qualificationStatus, modal: new mwf.Modal({ el: document.querySelector(modalId) }) }); } }; pushModalIfExists(acceptPopup, 1, "#formMessagingModal_accept"); pushModalIfExists(rejectPopup, 3, "#formMessagingModal_reject"); pushModalIfExists(errorPopup, 0, "#formMessagingModal_error"); if (mrQuestionAuthored) { pushModalIfExists(appMarketingPopup, 4, "#formMessagingModal_appMarketing"); pushModalIfExists(appMarketingRejectPopup, 5, "#formMessagingModal_appMarketing_reject"); } formMessagingModal.forEach(formModal => { const modalInstances = mwf.Modal.getInstances(); const modalInstance = modalInstances.find(instance =>{ return (instance.el === formModal.modal.el); }); modalInstance.el.addEventListener('onHidden', () => { location.reload(); }); formModal.modal.el.addEventListener('click.dismiss', () => { if (mrQuestionAuthored) { if($('.modal.show').length > 0){ location.reload(); } } else { isvForm.reset(); applyRulesToISVFormData(formId, rules); } }); }); const showErrorModal = () => { const errorModalToShow = formMessagingModal.filter((modalObj) => { return modalObj.qualificationStatus == 0 })[0].modal; errorModalToShow.show(); } const fireTelemetry = (status) => { // Trigger telemetry on submit click if (window?.telemetry?.webAnalyticsPlugin?.capturePageAction) { const { id, cn, issuccess, behavior } = telemetryConfig[status]; let telemetryOverrides = { actionType: "A", // automatic, not user-initiated contentTags: { id, cn, issuccess } } // Include behavior only for the success scenario if (status === 'success') { telemetryOverrides.behavior = behavior; } window.telemetry.webAnalyticsPlugin.capturePageAction(null, telemetryOverrides); window.dispatchEvent(new CustomEvent('isvSuccessPrequalProcessed', { detail: { prequalSuccess: true } })); } } isvForm.addEventListener("submit", () => { if (rules) { validationInstance.feedbackListContainer.querySelector('ol').innerHTML = ""; validationInstance.update(); } if (isAnyHiddenFieldFilled(formId)) { showErrorModal(); } else if (validationInstance.isFormValid()) { errAlert.addClass('d-none'); if (mrQuestionAuthored) { mrQuestionInputs.prop('disabled', false); } const ISV_form = $(`#${formId}`); const isvFormData = ISV_form.serializeArray(); mrQuestionInputs.prop('disabled', true); const isAuthor = attrElement.data("isauthor"); const cookieValue = getCookieValue("MC1"); const isvPartnerQualificationEndpoint = { author: "/msonecloudapi/isv/isvSuccess/partnerQualificationForm/create?ock=782163515ae76ede931d40f765e4000a", nonAuthor: "/msonecloudapi/isv/isvSuccess/partnerQualificationForm/create" } const isvPartnerQualificationData = JSON.stringify(createISVFormDataPayLoad(ISV_form, isvFormData)); let headers = {}; headers["trackingId"] = uuidTracking(); if (cookieValue) { headers["MC1"] = cookieValue; } const isEnvNonProd = attrElement.data('isenvnonprod'); if (isEnvNonProd) { headers["x-msoc-env"] = "ppe"; } const apiUrl = isvPartnerQualificationEndpoint[(isAuthor == true) ? "author" : "nonAuthor"]; $(`#spinner-${formId}`).removeClass('d-none'); $(`#form-submit-btn-${formId}`).prop('disabled', true); const ajaxISVsuccess = new AjaxUtil({ isProd: !isEnvNonProd, // Flag indicating if it's a production or non-production environment isAuthor: isAuthor // Flag indicating if it's an author or non-author environment }); const ajaxISVsuccessRequest = ajaxISVsuccess.invokeRequest({ headers: headers, // Request headers method: "POST", // Request method type contentType: "applicationhttps://www.microsoft.com/json", // Content type of the request url: apiUrl, // URL for the request body: isvPartnerQualificationData // Request data }); ajaxISVsuccessRequest.then(response => response.json()).then(function(response) { // Handle the response sessionStorage.setItem("isvId", response.isvId); let qualificationStatus = response.qualifcationStatus; const successQuals = [qualificationStatusEnum.success, qualificationStatusEnum.reject]; if(qualificationStatus === qualificationStatusEnum.reject) { fireTelemetry("notEligible"); } if (successQuals.indexOf(qualificationStatus) > -1) { const modalToShow = formMessagingModal.filter((modalObj) => { if (qualificationStatus === qualificationStatusEnum.reject && mrQuestionAuthored && getMRQuestionValues(mrQuestionInputs).includes("appMarketing")) { qualificationStatus = qualificationStatusEnum.rejectAppMarketing; } return modalObj.qualificationStatus == qualificationStatus; })[0].modal; if(qualificationStatus == qualificationStatusEnum.success && noRedirectPopup) { fireTelemetry("success"); isvForm.reset(); applyRulesToISVFormData(formId, rules); window.openPartnerCenter(); location.reload(); } else { modalToShow.show(); if (qualificationStatus == qualificationStatusEnum.success) { $("#oc-isvsuccessdirect-custom-action").on("click", () => { modalToShow.hide(); isvForm.reset(); applyRulesToISVFormData(formId, rules); }); fireTelemetry("success"); } } } }).catch(function(error) { // Handle the error showErrorModal(); }).finally(function() { // Perform cleanup or final actions $(`#spinner-${formId}`).addClass('d-none'); $(`#form-submit-btn-${formId}`).prop('disabled', false); }); } else { fireTelemetry('error'); } }); }); })(document);