<div class="registration-membership-summary registration_hide">
<div class="title">
<div class="registration-form-title">
Membership details
</div>
</div>
<div class="sub-title">
<div class="registration-membership-sub-title">Please check that the below information is correct before making payment.</div>
</div>
<div class="registration-error registration-server-error registration_hide" role="alert">
<span class="registration-error-message">sitecore api error</span>
</div>
<div class="sub-title">
<div class="registration-form-sub-title">
</div>
</div>
<div class="membership-container" data-total-cost="TOTAL COST" data-adult-mebership-count="Adult Membership x" data-junior-membership-count="Junior Membership x" data-england-supports-travel-club-expiring=" x England Supporters Travel Club expiring" data-adult-membership-details="Adult Membership Details" data-name="Name" data-fan="FAN"></div>
<div class="separator"></div>
<div class="membership-container-junior"></div>
<div class="separator"></div>
<div class="membership-container-junior"></div>
<div class="cta">
<div class="registration-membership-summary__pay">
<a href="/" class="cta cta--r-primary ">
<p>PAY</p>
</a>
</div>
<div class="registration-membership-summary__add-junior">
<a href="/" class="cta cta--r-secondary ">
<p>ADD JUNIOR</p>
</a>
</div>
</div>
<div id="remove-junior-modal" class="modal-remove">
<div class="modal-remove-content">
<h2>Are you sure you want to remove junior?</h2>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Voluptatum iste optio fugit totam mollitia? Quisquam impedit, provident ipsa fuga vel aspernatur ipsam unde labore quasi doloremque ea harum, amet possimus?</p>
<div class="btn-remove-container">
<button class="btn-yes">YES</button>
<button class="btn-no">NO</button>
</div>
</div>
</div>
</div>
No notes defined.
{
"title": {
"copy": "Membership details"
},
"sub-title-one": {
"copy": "Please check that the below information is correct before making payment."
},
"sub-title": {
"copy": ""
},
"total-cost": {
"copy": "TOTAL COST"
},
"adult-membershipx1": {
"copy": "Adult Membership x1"
},
"adult-membershipx1-price": {
"copy": "£75.00"
},
"total-cost-price": {
"copy": "£105.00"
},
"junior-membershipx1": {
"copy": "Junior Membership x1"
},
"junior-membershipx1-price": {
"copy": "£30.00"
},
"adult-membership-details": {
"copy": "Adult Membership details"
},
"adult-membership-name": {
"copy": "Name"
},
"adult-membership-name-detail": {
"copy": "Name of Adult"
},
"adult-membership-fan": {
"copy": "FAN"
},
"adult-membership-fan-detail": {
"copy": "47894344"
},
"remove-junior": {
"copy": "Remove Junior"
},
"popup-title": {
"copy": "Are you sure you want to remove junior?"
},
"popup-para": {
"copy": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Voluptatum iste optio fugit totam mollitia? Quisquam impedit, provident ipsa fuga vel aspernatur ipsam unde labore quasi doloremque ea harum, amet possimus?"
},
"yes-button": {
"copy": "YES"
},
"no-button": {
"copy": "NO"
},
"btn-1": {
"copy": "PAY"
},
"btn-2": {
"copy": "ADD JUNIOR"
}
}
/* eslint-disable operator-linebreak */
import { showRegistrationLoader } from '../../registration-loader/registration-loader';
import {
hideServerError,
showServerError,
} from '../../registration-server-error/registration-server-error';
import {
currentPage,
getNode,
onComponentVisible,
showStep,
} from '../../registrationUtility';
import { GET, membershipRegisterPath } from '../../service';
export default currentElement => {
let orderData;
const membershipContainer = currentElement.querySelector(
'.membership-container'
);
const adultMembershipTitle = membershipContainer.getAttribute(
'data-adult-membership-details'
);
const totalCost = membershipContainer.getAttribute('data-total-cost');
const adultMembershipCount = membershipContainer.getAttribute(
'data-adult-mebership-count'
);
const juniorMembershipCount = membershipContainer.getAttribute(
'data-junior-membership-count'
);
// eslint-disable-next-line no-unused-vars
const englandSupportsTravelClubExpiring = membershipContainer.getAttribute(
'data-england-supports-travel-club-expiring'
);
const nameLabel = membershipContainer.getAttribute('data-name');
const fanLabel = membershipContainer.getAttribute('data-fan');
const generateJuniorMember = (
name,
fancode
) => `<div class="membership-remove" id="fan_${fancode}">
<div class="adult-membership-wrapper">
<div class="left-border"></div>
<div class="adult-membership-container">
<div class="info details-adult">
<span class="details-adult">${adultMembershipTitle}</span>
</div>
<div class="info"><span class="membership-details">${nameLabel}</span><span style="text-transform: capitalize;" class="price">${name}</span></div>
<div class="info"><span class="membership-details">${fanLabel}</span><span class="price">${fancode}</span></div>
</div>
</div>
<div id="fan">
<a id="remove-junior" class="link-button" href="javascript:void(0);">Remove</a>
</div>
</div>`;
const generateAdultMember = (name, fancode) => `<div id="fan_${fancode}">
<div class="adult-membership-wrapper">
<div class="left-border"></div>
<div class="adult-membership-container">
<div class="info details-adult">
<span class="details-adult">${adultMembershipTitle}</span>
</div>
<div class="info"><span class="membership-details">${nameLabel}</span><span style="text-transform: capitalize;" class="price">${name}</span></div>
<div class="info"><span class="membership-details">${fanLabel}</span><span class="price">${fancode}</span></div>
</div>
</div>
<div id="fan">
</div>
</div>`;
const setDatatocurrentElementPage = ({
orderItems,
customerFancode,
...rest
}) => {
const members = orderItems.reduce(
(preV, nextV) => {
if (nextV.fanCode === customerFancode) {
return { adult: nextV, junior: preV.junior };
}
return { adult: preV.adult, junior: [...preV.junior, nextV] };
},
{ adult: {}, junior: [] }
);
let childMembership = '';
let adultMembeship = '';
adultMembeship = generateAdultMember(
members.adult.customerDisplayName,
members.adult.fanCode
);
members.junior.forEach(({ fanCode, customerDisplayName }) => {
childMembership += generateJuniorMember(fanCode, customerDisplayName);
});
// eslint-disable-next-line no-param-reassign
currentElement.querySelector(
'.membership-container-junior'
).innerHTML = `${adultMembeship} ${childMembership}`;
function triggerContentChange() {
const event = new Event('contentchange');
currentElement.dispatchEvent(event);
}
triggerContentChange();
// eslint-disable-next-line no-param-reassign
membershipContainer.innerHTML = `<div class="info total-cost">
<span class="total-cost"><strong>${totalCost}</strong></span>
<span class="price">£${rest.totalAmount.toFixed(2)}</span>
</div>
${
members.adult.fanCode
? `<div class="info">
<span class="membership-details">${adultMembershipCount} ${
members.adult ? '1' : 0
}
</span><span class="price">£${members.adult.totalAmount.toFixed(
2
)}</span>
</div>`
: ''
}
${
members.junior.length
? `<div class="info">
<span class="membership-details">${juniorMembershipCount} ${
members.junior.length
}
</span>
<span class="price">
${rest.totalAmount - members.adult.totalAmount.toFixed(2)}
</span>
</div>`
: ''
}`;
};
onComponentVisible(currentElement, async () => {
showStep('08');
currentPage.page = currentElement;
hideServerError(currentElement);
orderData = sessionStorage.getItem('orderResponse');
if (!orderData) {
showServerError(currentElement, 'Could not find Order');
} else {
orderData = JSON.parse(orderData);
hideServerError(currentElement);
// eslint-disable-next-line no-param-reassign
currentElement.querySelector(
'.registration-form-sub-title'
).innerText = `${
orderData.orderItems.length
} ${englandSupportsTravelClubExpiring} ${orderData.expiryDate}`;
setDatatocurrentElementPage(orderData);
}
});
// eslint-disable-next-line func-names
currentElement.addEventListener('contentchange', () => {
const modal = currentElement.querySelector('#remove-junior-modal');
const yesBtn = currentElement.querySelector('.btn-yes');
const noBtn = currentElement.querySelector('.btn-no');
let targetElement = null;
currentElement.querySelectorAll('.link-button').forEach(btn => {
btn.addEventListener('click', () => {
modal.style.display = 'flex';
targetElement = btn.closest('.membership-remove');
});
});
const payBtn = currentElement.querySelector(
'.registration-membership-summary__pay'
);
payBtn.addEventListener('click', async event => {
event.preventDefault();
const response = await GET(membershipRegisterPath(orderData.orderId));
if (response.success) {
showRegistrationLoader();
const paymentRequest = response.paymentReq;
if (paymentRequest != null) {
getNode(
currentElement,
'#SmartPayRequest_MerchantReference'
).setAttribute('value', paymentRequest.merchantReference);
getNode(
currentElement,
'#SmartPayRequest_PaymentAmount'
).setAttribute('value', paymentRequest.paymentAmount);
getNode(currentElement, '#SmartPayRequest_Currency').setAttribute(
'value',
paymentRequest.currency
);
getNode(
currentElement,
'#SmartPayRequest_ShipBeforeDate'
).setAttribute('value', paymentRequest.shipBeforeDate);
getNode(
currentElement,
'#SmartPayRequest_MerchantSkinCode'
).setAttribute('value', paymentRequest.merchantSkinCode);
getNode(
currentElement,
'#SmartPayRequest_MerchantAccountCode'
).setAttribute('value', paymentRequest.merchantAccountCode);
getNode(
currentElement,
'#SmartPayRequest_SessionValidity'
).setAttribute('value', paymentRequest.sessionValidity);
getNode(
currentElement,
'#SmartPayRequest_MerchantReturnData'
).setAttribute('value', paymentRequest.merchantReturnData);
getNode(currentElement, '#SmartPayRequest_Email').setAttribute(
'value',
paymentRequest.email
);
getNode(currentElement, '#SmartPayRequest_FanCode').setAttribute(
'value',
paymentRequest.fanCode
);
getNode(currentElement, '#SmartPayRequest_Description').setAttribute(
'value',
paymentRequest.description
);
getNode(currentElement, '#SmartPayRequest_Country').setAttribute(
'value',
paymentRequest.country
);
getNode(
currentElement,
'#SmartPayRequest_ShopperLocale'
).setAttribute('value', paymentRequest.shopperLocale);
getNode(currentElement, '#SmartPayRequest_OrderData').setAttribute(
'value',
paymentRequest.orderData
);
getNode(
currentElement,
'#SmartPayRequest_MerchantSignature'
).setAttribute('value', paymentRequest.merchantSignature);
getNode(
currentElement,
'#SmartPayRequest_RecurringContract'
).setAttribute('value', paymentRequest.recurringContract);
// Smartpay Fuse request fields
getNode(
currentElement,
'#SmartPayFuseRequest_access_key'
).setAttribute('value', paymentRequest.accessKey);
getNode(
currentElement,
'#SmartPayFuseRequest_profile_id'
).setAttribute('value', paymentRequest.profileId);
getNode(
currentElement,
'#SmartPayFuseRequest_transaction_uuid'
).setAttribute('value', paymentRequest.transactionUuid);
getNode(
currentElement,
'#SmartPayFuseRequest_signed_field_names'
).setAttribute('value', paymentRequest.signedFieldNames);
getNode(
currentElement,
'#SmartPayFuseRequest_unsigned_field_names'
).setAttribute('value', paymentRequest.unsignedFieldNames);
getNode(
currentElement,
'#SmartPayFuseRequest_signed_date_time'
).setAttribute('value', paymentRequest.signedDateTime);
getNode(currentElement, '#SmartPayFuseRequest_locale').setAttribute(
'value',
paymentRequest.locale
);
getNode(
currentElement,
'#SmartPayFuseRequest_transaction_type'
).setAttribute('value', paymentRequest.transactionType);
getNode(
currentElement,
'#SmartPayFuseRequest_reference_number'
).setAttribute('value', paymentRequest.merchantReference);
getNode(currentElement, '#SmartPayFuseRequest_amount').setAttribute(
'value',
paymentRequest.paymentAmount
);
getNode(currentElement, '#SmartPayFuseRequest_currency').setAttribute(
'value',
paymentRequest.currency
);
getNode(
currentElement,
'#SmartPayFuseRequest_signature'
).setAttribute('value', paymentRequest.signature);
getNode(currentElement, '#PaymentForm').setAttribute(
'action',
paymentRequest.paymentGatewayUrl
);
getNode(currentElement, '#PaymentForm').submit();
}
} else {
showServerError(currentElement, response.error);
}
});
yesBtn.addEventListener('click', () => {
if (targetElement) {
targetElement.remove();
targetElement = null;
}
modal.style.display = 'none';
});
noBtn.addEventListener('click', () => {
modal.style.display = 'none';
targetElement = null;
});
});
};
.registration-membership-summary {
& > .cta {
margin-top: 40px;
gap: 24px;
.cta--r-secondary,
.cta--r-primary {
min-height: 44px;
font-size: 16px;
margin-bottom: 15px;
}
}
.registration-form-sub-title {
margin-bottom: 0;
}
.registration-membership-sub-title {
font-family: $registration-font;
font-weight: 400;
font-size: 16px;
color: $light-blue;
line-height: 24px;
margin-top: 24px;
@media screen and (max-width: $mq-medium) {
font-size: 16px;
}
}
.membership-container {
margin-bottom: 32px;
border: 1px solid $blue-accent3;
border-radius: 8px;
background-color: $light-red;
}
.adult-membership-container {
margin-bottom: 20px;
height: 96px;
width: 100%;
border: 1px solid $blue-accent3;
border-top-right-radius: 8px;
border-bottom-right-radius: 8px;
background-color: $light-red;
}
.total-cost {
font-family: $registration-font;
font-size: 16px;
font-weight: 700;
line-height: 24px;
text-align: left;
color: $white;
padding-left: 17px;
}
.details-adult {
font-family: $registration-font;
font-size: 16px;
font-weight: 400;
line-height: 24px;
text-align: left;
color: $white;
padding-left: 17px;
}
.membership-details {
font-family: $registration-font;
font-size: 16px;
font-weight: 400;
line-height: 24px;
text-align: left;
color: $white;
padding-left: 17px;
}
.price {
font-family: $registration-font;
font-size: 16px;
font-weight: 400;
line-height: 24px;
text-align: right;
color: $white;
padding-right: 17px;
}
.membership-container .info {
padding: 4px;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid $blue-accent4;
border-bottom-right-radius: 8px;
border-bottom-left-radius: 8px;
background-color: $blue-accent5;
}
.adult-membership-container .info {
padding: 3.6px;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid $blue-accent4;
background-color: $blue-accent5;
}
.membership-container .info.total-cost {
background-color: $alto1;
border-top-left-radius: 8px;
border-top-right-radius: 8px;
}
.adult-membership-container .info.details-adult {
background-color: $alto1;
border-top-right-radius: 8px;
}
.membership-container .info:last-child {
border-bottom: none;
}
.adult-membership-container .info:last-child {
border-bottom: none;
border-bottom-right-radius: 8px;
}
.adult-membership-wrapper {
display: flex;
align-items: flex-start;
}
.left-border {
width: 8px;
height: 96px;
background-color: $blue-accent5;
border-radius: 2px, 0, 0, 2px;
margin-right: 3px;
}
.separator {
width: 100%;
height: 2px;
background-color: $blue-accent3;
margin: 20px 0;
border-radius: 2px;
margin-bottom: 32px;
}
.membership-remove {
padding-bottom: 15px;
}
.link-button {
color: $light-blue;
padding-bottom: 30px;
font-family: $registration-font;
font-size: 16px;
font-weight: 400;
line-height: 26px;
letter-spacing: -0.01em;
text-decoration: underline;
cursor: pointer;
}
#fan {
text-align: end;
}
.modal-remove {
display: none;
position: fixed;
z-index: 1;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: $light-black;
justify-content: center;
align-items: center;
overflow: hidden;
}
.modal-remove-content {
background-color: $white;
padding-top: 80px;
padding-left: 20px;
padding-right: 20px;
border: 1px solid $light-red1;
width: 90%;
max-height: 80vh;
max-width: 600px;
text-align: left;
top: 288px;
left: 416px;
overflow-y: auto;
border-radius: 8px 8px 8px 8px;
box-sizing: border-box;
}
.modal-remove-content h2 {
margin-bottom: 24px;
padding-bottom: 10px;
color: $dark-black;
font-family: $registration-font;
font-size: 26px;
font-weight: 400;
line-height: 28px;
letter-spacing: -0.01em;
text-align: left;
}
.modal-remove-content p {
color: $dark-black;
margin-bottom: 20px;
font-family: $registration-font;
font-size: 16px;
font-weight: 400;
line-height: 24px;
text-align: left;
}
.modal-remove-content .btn-remove-container {
display: flex;
justify-content: space-between;
flex-direction: column;
gap: 20px;
border-radius: 2px;
border: 1px;
margin-bottom: 24px;
}
.modal-remove-content .btn-remove-container button {
width: 100%;
padding: 10px;
border: none;
cursor: pointer;
border-radius: 4px;
font-size: 16px;
color: white;
transition: background-color 0.3s, color 0.3s, border 0.3s;
}
.modal-remove-content .btn-yes {
background-color: $red-rj;
font-family: $registration-font;
font-size: 16px;
font-weight: 700;
line-height: 26px;
letter-spacing: -0.01em;
text-align: center;
}
.modal-remove-content .btn-no {
background-color: $blue-accent6;
font-family: $registration-font;
font-size: 16px;
font-weight: 700;
line-height: 26px;
letter-spacing: -0.01em;
text-align: center;
}
.modal-remove-content .btn-yes:hover {
background-color: $white;
color: $blue;
border: 1px solid $blue;
}
.modal-remove-content .btn-no:hover {
background-color: $white;
color: $blue;
border: 1px solid $blue;
}
}
@media screen and (min-width: $mq-medium) {
.registration-membership-summary {
.modal-remove {
.modal-remove-content {
.btn-remove-container {
flex-direction: row;
}
}
}
}
}
<div class="registration-membership-summary registration_hide">
<div class="title">
{{render '@registration-form-title' title}}
</div>
<div class="sub-title">
<div class="registration-membership-sub-title">{{sub-title-one.copy}}</div>
</div>
{{!-- adding error --}}
{{render '@registration-server-error'}}
<div class="sub-title">
{{render '@registration-form-sub-title' sub-title}}
</div>
<div class="membership-container" data-total-cost="TOTAL COST" data-adult-mebership-count="Adult Membership x" data-junior-membership-count="Junior Membership x" data-england-supports-travel-club-expiring=" x England Supporters Travel Club expiring" data-adult-membership-details="Adult Membership Details" data-name="Name" data-fan="FAN"></div>
<div class="separator"></div>
<div class="membership-container-junior"></div>
<div class="separator"></div>
<div class="membership-container-junior"></div>
<div class="cta">
<div class="registration-membership-summary__pay">
{{render '@cta--r-primary' btn-1 merge="true"}}
</div>
<div class="registration-membership-summary__add-junior">
{{render '@cta--r-secondary' btn-2 merge="true"}}
</div>
</div>
<div id="remove-junior-modal" class="modal-remove">
<div class="modal-remove-content">
<h2>{{popup-title.copy}}</h2>
<p>{{popup-para.copy}}</p>
<div class="btn-remove-container">
<button class="btn-yes">{{yes-button.copy}}</button>
<button class="btn-no">{{no-button.copy}}</button>
</div>
</div>
</div>
</div>