index.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import getMeta from '../../../utils/meta'
  2. import { swapModal } from '../../utils/swapModal'
  3. import * as eventTracking from '../../../infrastructure/event-tracking'
  4. import { createLocalizedGroupPlanPrice } from '../utils/group-plan-pricing'
  5. function getFormValues() {
  6. const modalEl = document.querySelector('[data-ol-group-plan-modal]')
  7. const planCode = modalEl.querySelector(
  8. 'input[name="plan_code"]:checked'
  9. ).value
  10. const size = modalEl.querySelector('#size').value
  11. const currency = modalEl.querySelector('#currency').value
  12. const usage = modalEl.querySelector('#usage').checked
  13. ? 'educational'
  14. : 'enterprise'
  15. return { planCode, size, currency, usage }
  16. }
  17. export function updateGroupModalPlanPricing() {
  18. const modalEl = document.querySelector('[data-ol-group-plan-modal]')
  19. const { planCode, size, currency, usage } = getFormValues()
  20. const { localizedPrice, localizedPerUserPrice } =
  21. createLocalizedGroupPlanPrice({
  22. plan: planCode,
  23. licenseSize: size,
  24. currency,
  25. usage,
  26. })
  27. modalEl.querySelectorAll('[data-ol-group-plan-plan-code]').forEach(el => {
  28. el.hidden = el.getAttribute('data-ol-group-plan-plan-code') !== planCode
  29. })
  30. modalEl.querySelectorAll('[data-ol-group-plan-usage]').forEach(el => {
  31. el.hidden = el.getAttribute('data-ol-group-plan-usage') !== usage
  32. })
  33. modalEl.querySelector('[data-ol-group-plan-display-price]').innerText =
  34. localizedPrice
  35. modalEl
  36. .querySelectorAll('[data-ol-group-plan-price-per-user]')
  37. .forEach(el => {
  38. el.innerText = `${localizedPerUserPrice} ${el.getAttribute(
  39. 'data-ol-group-plan-price-per-user'
  40. )}`
  41. })
  42. modalEl.querySelector('[data-ol-group-plan-educational-discount]').hidden =
  43. usage !== 'educational'
  44. modalEl.querySelector(
  45. '[data-ol-group-plan-educational-discount-applied]'
  46. ).hidden = size < 10
  47. modalEl.querySelector(
  48. '[data-ol-group-plan-educational-discount-ineligible]'
  49. ).hidden = size >= 10
  50. }
  51. const modalEl = $('[data-ol-group-plan-modal]')
  52. modalEl
  53. .on('shown.bs.modal', function () {
  54. const path = `${window.location.pathname}${window.location.search}`
  55. history.replaceState(null, document.title, path + '#groups')
  56. })
  57. .on('hidden.bs.modal', function () {
  58. const path = `${window.location.pathname}${window.location.search}`
  59. history.replaceState(null, document.title, path)
  60. })
  61. function showGroupPlanModal() {
  62. modalEl.modal()
  63. eventTracking.send(
  64. 'subscription-funnel',
  65. 'plans-page',
  66. 'group-inquiry-potential'
  67. ) // deprecated by plans-page-click
  68. }
  69. document
  70. .querySelectorAll('[data-ol-group-plan-form] select')
  71. .forEach(el => el.addEventListener('change', updateGroupModalPlanPricing))
  72. document
  73. .querySelectorAll('[data-ol-group-plan-form] input')
  74. .forEach(el => el.addEventListener('change', updateGroupModalPlanPricing))
  75. document.querySelectorAll('[data-ol-purchase-group-plan]').forEach(el =>
  76. el.addEventListener('click', e => {
  77. e.preventDefault()
  78. const { planCode, size, currency, usage } = getFormValues()
  79. const queryParams = new URLSearchParams(
  80. Object.entries({
  81. planCode: `group_${planCode}_${size}_${usage}`,
  82. currency,
  83. itm_campaign: 'groups',
  84. })
  85. )
  86. const itmContent = getMeta('ol-itm_content')
  87. if (itmContent) {
  88. queryParams.set('itm_content', itmContent)
  89. }
  90. eventTracking.sendMB('groups-modal-click', {
  91. plan: planCode,
  92. users: size,
  93. currency,
  94. type: usage,
  95. })
  96. const url = new URL('/user/subscription/new', window.origin)
  97. url.search = queryParams.toString()
  98. window.location = url.toString()
  99. })
  100. )
  101. document.querySelectorAll('[data-ol-open-group-plan-modal]').forEach(el => {
  102. const location = el.getAttribute('data-ol-location')
  103. el.addEventListener('click', function (e) {
  104. e.preventDefault()
  105. eventTracking.sendMB('plans-page-click', {
  106. button: 'group',
  107. location,
  108. 'billing-period': 'annual',
  109. })
  110. showGroupPlanModal()
  111. })
  112. })
  113. document
  114. .querySelectorAll('[data-ol-open-contact-form-for-more-than-50-licenses]')
  115. .forEach(el => {
  116. el.addEventListener('click', function (e) {
  117. e.preventDefault()
  118. swapModal(
  119. '[data-ol-group-plan-modal]',
  120. '[data-ol-contact-form-modal="general"]'
  121. )
  122. })
  123. })
  124. const isGroupPlanModalAvailable = document.querySelector(
  125. '[data-ol-group-plan-modal]'
  126. )
  127. if (isGroupPlanModalAvailable) {
  128. updateGroupModalPlanPricing()
  129. }
  130. if (window.location.hash === '#groups') {
  131. showGroupPlanModal()
  132. }