$(document).ready(function () {
handleEvents();
LoadCountryCodes('#selectCountryCode');
});
// Load country codes from Dataverse and populate the dropdown
function LoadCountryCodes(selector) {
showLoader();
const query =
"cr4e9_ricountrycodeses?$select=cr4e9_country,cr4e9_code,cr4e9_ricountrycodesid&$orderby=cr4e9_country asc";
apiService.getItems(query)
.then((response) => {
const countryCodes = response.value;
hideLoader();
if (countryCodes && countryCodes.length > 0) {
countryCodes.forEach((countryCode) => {
$("#selectCountryCode").append(
``
);
});
} else {
$("#selectCountryCode").append(
``
);
}
})
.catch((error) => {
hideLoader();
console.error("Error fetching country codes:", error);
showErrorToast("Failed to load country codes");
})
}
function handleEvents() {
// Prevent typing '+' character in phone number field
$('#phoneNumber').on('keypress', function (e) {
if (e.key === '+') {
e.preventDefault();
}
});
$("#btnVerify").on("click", function (e) {
e.preventDefault();
const firstName = $('#firstName').val().trim();
const lastName = $('#lastName').val().trim();
const email = $('#email_address').val().trim();
const countryCode = $('#selectCountryCode').val();
const phoneNumber = $('#phoneNumber').val().trim();
const accountNumber = $('#accountNumber').val().trim();
const password = $('#password').val();
const confirmPassword = $('#confirmPassword').val();
let isValid = true;
$('#createAccountModal input').removeClass('is-invalid');
$('#passwordError').hide();
$('#confirmPasswordError').hide();
// Validate fields
const namePattern = /^[A-Za-z]+$/;
if (firstName === '') {
$('#firstName').addClass('is-invalid');
$('#firstName').next('.invalid-feedback').text('First name is required.');
isValid = false;
} else if (!namePattern.test(firstName)) {
$('#firstName').addClass('is-invalid');
$('#firstName').next('.invalid-feedback').text('First name must contain only letters (no spaces, numbers, or special characters).');
isValid = false;
}
if (lastName === '') {
$('#lastName').addClass('is-invalid');
$('#lastName').next('.invalid-feedback').text('Last name is required.');
isValid = false;
} else if (!namePattern.test(lastName)) {
$('#lastName').addClass('is-invalid');
$('#lastName').next('.invalid-feedback').text('Last name must contain only letters (no spaces, numbers, or special characters).');
isValid = false;
}
if (email === '') {
$('#email_address').addClass('is-invalid');
isValid = false;
} else if (!validateEmail(email)) {
$('#email_address').addClass('is-invalid');
isValid = false;
}
// Require exactly 10 digits, no extension code
let phonePattern = /^\d{10}$/;
// let phonePattern=/^\+[0-9]{1,3}[- ]?[0-9]{7,12}$/; // Updated pattern to allow country code
if (phoneNumber === '') {
$('#phoneNumber').addClass('is-invalid');
$('#phoneNumberError').show().text('Business phone number is required and must be 10 digits.');
isValid = false;
} else if (!phonePattern.test(phoneNumber)) {
$('#phoneNumber').addClass('is-invalid');
$('#phoneNumberError').show().text('Please enter a valid 10-digit phone number.');
//$('#phoneNumberError').show().text('A valid phone number with the country code is required (e.g., +1 5551234567).');
isValid = false;
} else {
$('#phoneNumber').removeClass('is-invalid').addClass('is-valid');
$('#phoneNumberError').hide();
}
if (accountNumber === '') {
$('#accountNumber').addClass('is-invalid');
isValid = false;
}
//country code validation
if (!countryCode) {
$('#selectCountryCode').addClass('is-invalid');
$('#selectCountryCode').next('.invalid-feedback').text('Country code is required.');
isValid = false;
} else {
$('#selectCountryCode').removeClass('is-invalid').addClass('is-valid');
$('#selectCountryCode').next('.invalid-feedback').text('');
}
// Password validation
const passwordRequirements = [
{ regex: /.{8,}/, message: "at least 8 characters" },
{ regex: /[A-Z]/, message: "one uppercase letter" },
{ regex: /[a-z]/, message: "one lowercase letter" },
{ regex: /[0-9]/, message: "one number" },
{ regex: /[^A-Za-z0-9]/, message: "one special character" }
];
let passwordErrors = [];
if (!password) {
passwordErrors.push("Password is required.");
} else {
passwordRequirements.forEach(req => {
if (!req.regex.test(password)) {
passwordErrors.push("Password must contain " + req.message + ".");
}
});
}
if (passwordErrors.length > 0) {
$('#password').addClass('is-invalid');
$('#passwordError').show().html(passwordErrors.join('
'));
isValid = false;
}
if (!confirmPassword) {
$('#confirmPassword').addClass('is-invalid');
$('#confirmPasswordError').show().text('Confirm password is required.');
isValid = false;
}
if (password && confirmPassword && password !== confirmPassword) {
$('#password').addClass('is-invalid');
$('#confirmPassword').addClass('is-invalid');
$('#confirmPasswordError').show().text('Passwords do not match.');
isValid = false;
}
if (!isValid) {
return;
}
const payload = {
AccountNumber: accountNumber,
Email: email,
PhoneNumber: phoneNumber,
FirstName: firstName,
LastName: lastName,
Password: password,
CountryCode: countryCode
};
verifyAccount(payload);
});
$("#btnCancel").on('click', function () {
clearForm();
$('#createAccountModal input').removeClass('is-invalid');
});
$('#createAccountModal').on('hidden.bs.modal', function () {
clearForm();
$('#createAccountModal input').removeClass('is-invalid');
});
}
function validateEmail(email) {
// Simple regex pattern for email validation
const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return re.test(email);
}
function verifyAccount(data) {
showLoader();
let payload = {};
payload.eventData = JSON.stringify(data);
shell.ajaxSafePost({
type: "POST",
contentType: "application/json",
url:"/_api/cloudflow/v1.0/trigger/cb819af6-91ce-f011-bbd2-7ced8d3c711d",
// url: "/_api/cloudflow/v1.0/trigger/5d97494d-1ba1-f011-bbd3-6045bd088d91",
processData: false,
data: JSON.stringify(payload),
global: false,
})
.done(function (res) {
hideLoader();
let response;
try {
response = JSON.parse(res);
} catch (e) {
console.error("Failed to parse response:", e);
showErrorToast("Invalid response");
return;
}
if (document.activeElement) {
document.activeElement.blur();
}
if (response.status != "Contact exists" && response.status != "No account exists" && response.status != "Something went wrong") {
// Only close the modal on success
const modalEl = document.getElementById('createAccountModal');
const modal = bootstrap.Modal.getInstance(modalEl) || new bootstrap.Modal(modalEl);
modal.hide();
$('.modal-backdrop').remove();
$('body').removeClass('modal-open');
clearForm();
// Show success modal
const successModalEl = document.getElementById('successModal');
if (window.setSuccessModalLoginHint) {
window.setSuccessModalLoginHint(data.Email);
}
setTimeout(async () => {
successModalEl.removeAttribute('aria-hidden');
successModalEl.style.display = '';
let successModal = bootstrap.Modal.getInstance(successModalEl);
if (!successModal) {
successModal = new bootstrap.Modal(successModalEl, {
backdrop: 'static',
keyboard: true
});
}
await ShowPopupMessage("CP-Create-Account-Success","#createAccountSuccessModalContent");
successModal.show();
const focusTarget = successModalEl.querySelector('button, h1, [tabindex]');
if (focusTarget) focusTarget.focus();
}, 200);
}
else {
// Do NOT close or reset the modal on error
if (response.status === "Contact exists") {
showErrorToast("You already have an account.");
} else if (response.status === "No account exists") {
showErrorToast("Account number is invalid.");
} else if (response.status === "Something went wrong") {
showErrorToast("Something went wrong. Please try again later.");
} else {
showErrorToast("Something went wrong. Please try again later.");
}
}
})
.fail(function (error) {
hideLoader();
showErrorToast("failure");
console.log(error);
// Do not close or reset the modal on failure
})
}
function clearForm() {
$('#createAccountModal input').val('');
$('#phoneNumber').removeClass('is-invalid');
$('#phoneNumber').removeClass('is-valid');
$('#phoneNumberError').hide();
$('#selectCountryCode').removeClass('is-invalid').removeClass('is-valid');
$('#selectCountryCode').next('.invalid-feedback').text('');
$('#selectCountryCode').val('Select Country Code');
}