wickes-css2 2.103.0-IC-976-pre-commit-lint.2 → 2.103.0-IC-976-pre-commit-lint.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (672) hide show
  1. package/build/css/main.css +1 -1
  2. package/build/css/pages/page_book-consultant-thank-you-new.css +1 -1
  3. package/build/css/pages/page_pre_home_thank-you.css +1 -1
  4. package/build/css/pages/page_top-rated.css +1 -1
  5. package/build/img/TradePaint.svg +42 -14
  6. package/build/img/apple-pay.svg +12 -7
  7. package/build/img/big-white-apple-pay.svg +10 -5
  8. package/build/img/billie-logo.svg +4 -2
  9. package/build/img/billie-modal.svg +4 -2
  10. package/build/img/billie-pdp.svg +12 -9
  11. package/build/img/billie-spinner.svg +5 -3
  12. package/build/img/billie.svg +3 -1
  13. package/build/img/clearpay-logo.svg +6 -1
  14. package/build/img/clearpay-spinner.svg +4 -1
  15. package/build/img/energy-efficiency/energy-marker.svg +12 -1
  16. package/build/img/google-spinner.svg +14 -7
  17. package/build/img/googlepay.svg +23 -12
  18. package/build/img/home-banner_arrow.svg +7 -1
  19. package/build/img/ic-menu.svg +7 -1
  20. package/build/img/ic_info_big.svg +4 -1
  21. package/build/img/klarna-big.svg +18 -9
  22. package/build/img/klarna-sm.svg +5 -2
  23. package/build/img/klarna-spinner.svg +3 -1
  24. package/build/img/logo-klarna.svg +5 -2
  25. package/build/img/mastercard.svg +6 -3
  26. package/build/img/payapal_text.svg +6 -1
  27. package/build/img/payment/checkout/applepay.svg +12 -7
  28. package/build/img/payment/checkout/billie.svg +4 -2
  29. package/build/img/payment/checkout/clearpay.svg +5 -1
  30. package/build/img/payment/checkout/googlepay.svg +23 -12
  31. package/build/img/payment/checkout/mastercard.svg +13 -1
  32. package/build/img/payment/checkout/paypal.svg +37 -1
  33. package/build/img/payment/checkout/visa.svg +8 -1
  34. package/build/img/payment/footer/applepay.svg +12 -7
  35. package/build/img/payment/footer/billie.svg +3 -1
  36. package/build/img/payment/footer/clearpay.svg +18 -10
  37. package/build/img/payment/footer/googlepay.svg +23 -12
  38. package/build/img/payment/footer/mastercard.svg +13 -1
  39. package/build/img/payment/footer/paypal.svg +37 -1
  40. package/build/img/payment/footer/visa.svg +8 -1
  41. package/build/img/paypal.svg +8 -1
  42. package/build/img/paypal_logo_loader_paypal.svg +4 -1
  43. package/build/img/paypal_logo_loader_pp.svg +10 -1
  44. package/build/img/placeholders/full-width-img.svg +9 -1
  45. package/build/img/placeholders/img-2-to-1.svg +9 -1
  46. package/build/img/placeholders/img-3-to-4.svg +9 -1
  47. package/build/img/placeholders/img-4-to-3.svg +9 -1
  48. package/build/img/proposition_arrow_click.svg +7 -1
  49. package/build/img/proposition_delivery.svg +7 -1
  50. package/build/img/proposition_price.svg +7 -1
  51. package/build/img/proposition_returns.svg +7 -1
  52. package/build/img/social-icon-facebook.svg +8 -1
  53. package/build/img/social-icon-instagram.svg +15 -1
  54. package/build/img/social-icon-pinterest.svg +7 -1
  55. package/build/img/socials/facebook.svg +5 -1
  56. package/build/img/socials/instagram.svg +5 -1
  57. package/build/img/socials/pinterest.svg +5 -1
  58. package/build/img/socials/tiktok.svg +5 -1
  59. package/build/img/socials/x-twitter.svg +5 -1
  60. package/build/img/socials/youtube.svg +5 -1
  61. package/build/img/socials_facebook_color.svg +7 -1
  62. package/build/img/socials_facebook_white_blue_color.svg +5 -1
  63. package/build/img/socials_info_big.svg +7 -1
  64. package/build/img/socials_instagram_color.svg +16 -1
  65. package/build/img/socials_pinterest_color.svg +4 -1
  66. package/build/img/socials_twitter_color.svg +4 -1
  67. package/build/img/socials_whatsapp_color.svg +5 -1
  68. package/build/img/socials_youtube_color.svg +4 -1
  69. package/build/img/stars.svg +8 -1
  70. package/build/img/visa-logo.svg +3 -1
  71. package/build/img/wickes-dc-logo.svg +17 -13
  72. package/build/img/wickes-logo-v2.svg +15 -1
  73. package/build/img/wickes-logo.svg +36 -1
  74. package/build/img/young-minds.svg +10 -8
  75. package/build/js/account-members.min.js +1 -1
  76. package/build/js/basket.min.js +2 -2
  77. package/build/js/bootstrap.bundle.min.js +1 -1
  78. package/build/js/bundle.min.js +1 -1
  79. package/build/js/checkout.min.js +2 -2
  80. package/build/js/emulation.min.js +11866 -10333
  81. package/build/js/general.bundle.min.js +1 -1
  82. package/build/js/iframeResizer.min.js +2 -2
  83. package/build/js/kitchen/kitchen-plp.min.js +1 -1
  84. package/build/js/merged-checkout.min.js +2 -2
  85. package/build/js/my-orders.min.js +1 -1
  86. package/build/js/page/accordion.js +31 -29
  87. package/build/js/page/account-deletion.js +13 -13
  88. package/build/js/page/account-hub.js +128 -119
  89. package/build/js/page/account-members.js +229 -216
  90. package/build/js/page/address-book.js +186 -184
  91. package/build/js/page/basket/add-project-list-id.js +158 -130
  92. package/build/js/page/basket/clearpay.js +17 -17
  93. package/build/js/page/basket/display-energy-efficiency.js +13 -13
  94. package/build/js/page/basket/gtm.js +60 -54
  95. package/build/js/page/basket/klarna.js +2 -2
  96. package/build/js/page/basket/paypal.js +33 -33
  97. package/build/js/page/basket/session-sync.js +5 -5
  98. package/build/js/page/basket/summary-mobile.js +16 -16
  99. package/build/js/page/basket/wisdom.js +54 -39
  100. package/build/js/page/basket-v2.js +415 -261
  101. package/build/js/page/basket.js +42 -39
  102. package/build/js/page/billie-business-type.js +22 -22
  103. package/build/js/page/business-account-form.js +12 -12
  104. package/build/js/page/buying-guides-guttering.js +3 -3
  105. package/build/js/page/category-landing.js +18 -11
  106. package/build/js/page/change-password.js +100 -99
  107. package/build/js/page/checkout-confirmation-new.js +127 -70
  108. package/build/js/page/checkout-confirmation.js +6 -6
  109. package/build/js/page/checkout-delivery-address.js +35 -32
  110. package/build/js/page/checkout-delivery-details-loader.js +2 -5
  111. package/build/js/page/checkout-edit-address.js +1 -1
  112. package/build/js/page/checkout-payment-details.js +170 -172
  113. package/build/js/page/checkout-sign-in.js +15 -11
  114. package/build/js/page/checkout.js +1 -1
  115. package/build/js/page/cms-homepage.js +87 -45
  116. package/build/js/page/components/charity.js +114 -120
  117. package/build/js/page/components/csrf.js +4 -4
  118. package/build/js/page/components/discounts.js +39 -39
  119. package/build/js/page/components/favourite-product.js +125 -113
  120. package/build/js/page/components/global-search.js +204 -192
  121. package/build/js/page/components/modal-observer.js +43 -46
  122. package/build/js/page/components/order-summary.js +26 -22
  123. package/build/js/page/components/pagination.js +124 -117
  124. package/build/js/page/components/retry-action.js +2 -2
  125. package/build/js/page/components/saving-shopping-list.js +381 -314
  126. package/build/js/page/components/sticky-order-observer.js +36 -39
  127. package/build/js/page/components/voucher.js +46 -47
  128. package/build/js/page/copy-project-id.js +23 -23
  129. package/build/js/page/countdown-timer.js +6 -6
  130. package/build/js/page/default-store.js +40 -34
  131. package/build/js/page/design-appointment.js +6 -3
  132. package/build/js/page/energy-efficiency.js +39 -25
  133. package/build/js/page/finance-tabs.js +4 -4
  134. package/build/js/page/general/cookie.js +20 -10
  135. package/build/js/page/installation/calculator.js +12 -16
  136. package/build/js/page/installation/fi.js +76 -71
  137. package/build/js/page/installation/generic.js +21 -20
  138. package/build/js/page/installation/installation.js +36 -22
  139. package/build/js/page/installation/pdp-generic.js +3 -9
  140. package/build/js/page/installation/ti.js +26 -24
  141. package/build/js/page/installer-files-form.js +98 -76
  142. package/build/js/page/installer-form.js +502 -447
  143. package/build/js/page/installer-validation.js +848 -761
  144. package/build/js/page/instore-checkout.js +2 -2
  145. package/build/js/page/kitchen/card-carousel.js +21 -21
  146. package/build/js/page/kitchen/colour-swatches.js +153 -149
  147. package/build/js/page/kitchen/kitchen-card.js +62 -64
  148. package/build/js/page/kitchen/mobile-nav.js +26 -27
  149. package/build/js/page/kitchen/plp-filters-chips.js +72 -70
  150. package/build/js/page/kitchen/plp-filters-mobile.js +64 -60
  151. package/build/js/page/kitchen/plp-filters-panel.js +106 -102
  152. package/build/js/page/kitchen/plp-filters-utils.js +54 -53
  153. package/build/js/page/kitchen/plp-filters.js +210 -194
  154. package/build/js/page/kitchen/sort-by.js +149 -149
  155. package/build/js/page/klarna-modal-scroll-disable.js +4 -4
  156. package/build/js/page/merged-checkout.js +6 -3
  157. package/build/js/page/my-account.js +44 -46
  158. package/build/js/page/my-orders.js +153 -149
  159. package/build/js/page/online-exclusive.js +28 -31
  160. package/build/js/page/pdp-favourite.js +4 -4
  161. package/build/js/page/pdp-tile.js +0 -4
  162. package/build/js/page/pdp.js +41 -37
  163. package/build/js/page/personal-details.js +307 -277
  164. package/build/js/page/plp-cards-v2.js +39 -25
  165. package/build/js/page/plp-favourite.js +9 -9
  166. package/build/js/page/plp-img-v2.js +2 -3
  167. package/build/js/page/plp-load-more.js +66 -66
  168. package/build/js/page/plp.js +9 -10
  169. package/build/js/page/pre-home.js +159 -144
  170. package/build/js/page/project-list/generate-project-id.js +77 -68
  171. package/build/js/page/project-list-note.js +234 -232
  172. package/build/js/page/project-list.js +2 -3
  173. package/build/js/page/quiz.js +292 -292
  174. package/build/js/page/select-address.js +27 -14
  175. package/build/js/page/smart-banner.js +8 -5
  176. package/build/js/page/ti.js +67 -42
  177. package/build/js/page/top-rated.js +36 -29
  178. package/build/js/page/track-my-order.js +172 -156
  179. package/build/js/page/tradePro-rewards.js +34 -36
  180. package/build/js/page/utils/array-utils.js +13 -10
  181. package/build/js/page/utils/copy-to-clipboard.js +45 -45
  182. package/build/js/page/utils/create-event.js +8 -8
  183. package/build/js/page/utils/errorMesages.js +12 -11
  184. package/build/js/page/utils/helpers.js +14 -9
  185. package/build/js/page/utils/http-action.js +4 -5
  186. package/build/js/page/utils/loader.js +5 -5
  187. package/build/js/page/utils/routes.js +9 -9
  188. package/build/js/page/utils/url-query.js +4 -4
  189. package/build/js/page/utils/validation.js +93 -96
  190. package/build/js/page/wickes-dc.js +51 -44
  191. package/build/js/page/wismo.js +12 -12
  192. package/build/js/page/your-details.js +77 -41
  193. package/build/js/pdp-favourite-product.bundle.min.js +1 -1
  194. package/build/js/pdp.bundle.min.js +1 -1
  195. package/build/js/personal-details.min.js +1 -1
  196. package/build/js/plp-favourite-product.bundle.min.js +1 -1
  197. package/build/js/plp.bundle.min.js +1 -1
  198. package/build/js/project-list.min.js +16 -16
  199. package/build/js/pstrength.min.js +28 -34
  200. package/build/js/wickers.json +2069 -2069
  201. package/package.json +6 -2
  202. package/src/data/data_account-families.json +1 -1
  203. package/src/data/data_bathroom-installation.json +1 -1
  204. package/src/data/data_bathroom-ranges.json +14 -14
  205. package/src/data/data_business-pages.json +27 -27
  206. package/src/data/data_calendar.json +7 -1
  207. package/src/data/data_checkout-order.json +306 -306
  208. package/src/data/data_contact-us-form.json +17 -17
  209. package/src/data/data_contact-us-reasons.json +16 -16
  210. package/src/data/data_design-appointment.json +27 -12
  211. package/src/data/data_discounts.json +4 -4
  212. package/src/data/data_fdl-new-product.json +6 -6
  213. package/src/data/data_fdl-product.json +75 -87
  214. package/src/data/data_flooring-installation.json +6 -6
  215. package/src/data/data_great-quality.json +2 -2
  216. package/src/data/data_heating-plumbing.json +2 -2
  217. package/src/data/data_how-to_fit-corrugated-sheeting.json +245 -258
  218. package/src/data/data_journey-price-lists.json +1 -1
  219. package/src/data/data_kb-brouchure-requests.json +10 -10
  220. package/src/data/data_kitchen-brochure-request.json +1 -1
  221. package/src/data/data_kitchen-cabinets.json +1 -1
  222. package/src/data/data_kitchen-plp.json +24 -18
  223. package/src/data/data_kitchen-ranges.json +21 -23
  224. package/src/data/data_latest-offers.json +1044 -1044
  225. package/src/data/data_locators.json +130 -132
  226. package/src/data/data_next-steps.json +20 -20
  227. package/src/data/data_notification-page.json +72 -24
  228. package/src/data/data_online-ranges.json +1 -1
  229. package/src/data/data_page-category-hub.json +1 -1
  230. package/src/data/data_page-confirmation.json +9 -9
  231. package/src/data/data_page-project-multiple-list.json +18 -18
  232. package/src/data/data_pre-home.json +1090 -1082
  233. package/src/data/data_price-event-new.json +1 -1
  234. package/src/data/data_saved-project-list.json +8 -8
  235. package/src/data/data_seo-widgets.json +31 -31
  236. package/src/data/data_shopping-cart-v2.json +1 -2
  237. package/src/data/data_shopping-cart-with-energy.json +229 -229
  238. package/src/data/data_storage-solutions.json +99 -99
  239. package/src/data/data_tile-installation.json +1 -1
  240. package/src/data/data_top-rated-perfect-product.json +204 -204
  241. package/src/data/data_trade-essentials.json +1 -1
  242. package/src/data/data_tradePro_cards.json +0 -1
  243. package/src/data/data_user-address-saved.json +33 -33
  244. package/src/data/data_voucher_tradePro.json +5 -5
  245. package/src/data/data_wismo.json +12 -12
  246. package/src/data/how-to-guides/data-how_to_fit-bath-and-taps.json +2 -2
  247. package/src/data/how-to-guides/data_how-to-change-door-window-furniture.json +274 -274
  248. package/src/data/how-to-guides/data_how-to-fit-door-locks.json +3 -8
  249. package/src/data/how-to-guides/data_how-to-fit-worktop.json +5 -13
  250. package/src/data/how-to-guides/data_how-to-fit_basin-and-taps.json +2 -6
  251. package/src/data/how-to-guides/data_how-to-fit_bath-and-taps.json +3 -10
  252. package/src/data/how-to-guides/data_how-to-plumb-a-kitchen-appliance.json +3 -7
  253. package/src/data/how-to-guides/data_how-to-unblock-sink.json +5 -7
  254. package/src/data/how-to-guides/data_how-to_bleed-radiator.json +134 -134
  255. package/src/data/how-to-guides/data_how-to_build-raised-deck.json +4 -4
  256. package/src/data/how-to-guides/data_how-to_change-socket.json +2 -2
  257. package/src/data/how-to-guides/data_how-to_fit-guttering.json +282 -282
  258. package/src/data/how-to-guides/data_how-to_fit-toilet.json +2 -2
  259. package/src/data/how-to-guides/data_how-to_fit-wall-tiles.json +77 -23
  260. package/src/data/how-to-guides/data_how-to_fit-worktops.json +3 -4
  261. package/src/data/how-to-guides/data_how-to_fix-leaking-sink.json +3 -3
  262. package/src/data/how-to-guides/data_how-to_fix-leaking-tap.json +3 -3
  263. package/src/data/how-to-guides/data_how-to_garden-calendar.json +4 -5
  264. package/src/data/how-to-guides/data_how-to_grow-fruit-veg.json +3 -3
  265. package/src/data/how-to-guides/data_how-to_hang-internal-door.json +266 -266
  266. package/src/data/how-to-guides/data_how-to_install-artificial-grass.json +3 -4
  267. package/src/data/how-to-guides/data_how-to_install-base-wall-cabinets.json +3 -4
  268. package/src/data/how-to-guides/data_how-to_install-composite-decking.json +6 -14
  269. package/src/data/how-to-guides/data_how-to_install-deck-lighting.json +4 -7
  270. package/src/data/how-to-guides/data_how-to_install-fence.json +5 -5
  271. package/src/data/how-to-guides/data_how-to_insulate-loft.json +2 -2
  272. package/src/data/how-to-guides/data_how-to_lay-deck.json +4 -6
  273. package/src/data/how-to-guides/data_how-to_lay-laminate-flooring.json +3 -8
  274. package/src/data/how-to-guides/data_how-to_lay-maintain-turf.json +4 -4
  275. package/src/data/how-to-guides/data_how-to_lay-path.json +5 -6
  276. package/src/data/how-to-guides/data_how-to_lay-patio.json +5 -5
  277. package/src/data/how-to-guides/data_how-to_lay-solid-wood-flooring.json +0 -8
  278. package/src/data/how-to-guides/data_how-to_lay-vinyl-carpet-tiles.json +3 -3
  279. package/src/data/how-to-guides/data_how-to_paint-a-room.json +5 -5
  280. package/src/data/how-to-guides/data_how-to_plaster-wall.json +8 -6
  281. package/src/data/how-to-guides/data_how-to_plumb-kitchen-appliances.json +3 -3
  282. package/src/data/how-to-guides/data_how-to_prepare-interior-woodwork.json +5 -5
  283. package/src/data/how-to-guides/data_how-to_prepare-paint-exterior-walls.json +1 -1
  284. package/src/data/how-to-guides/data_how-to_prepare-wall-and-ceilings.json +9 -9
  285. package/src/data/how-to-guides/data_how-to_put_up_shelf.json +4 -4
  286. package/src/data/how-to-guides/data_how-to_remove-replace-tiles.json +3 -3
  287. package/src/data/how-to-guides/data_how-to_repair-wall.json +384 -385
  288. package/src/data/how-to-guides/data_how-to_tile-bathroom.json +3 -4
  289. package/src/data/how-to-guides/data_how-to_unblock-sink.json +3 -3
  290. package/src/data/how-to-guides/data_install-composite-decking.json +4 -4
  291. package/src/data/how-to-guides/data_planting-techniques.json +3 -3
  292. package/src/data/how-to-guides/fit-roofing-shingles.json +4 -4
  293. package/src/data/how-to-guides/hubs/data_how-to_hub_home.json +1 -1
  294. package/src/data/my-account/data_address-book.json +12 -3
  295. package/src/data/my-account/data_my-order.json +1 -1
  296. package/src/data/my-account/data_personal-details.json +32 -8
  297. package/src/data/navigation.json +1016 -805
  298. package/src/data/page_how-to-choose-your-doors.json +1 -2
  299. package/src/data/public/wickers.json +2069 -2069
  300. package/src/img/TradePaint.svg +42 -14
  301. package/src/img/apple-pay.svg +12 -7
  302. package/src/img/big-white-apple-pay.svg +10 -5
  303. package/src/img/billie-logo.svg +4 -2
  304. package/src/img/billie-modal.svg +4 -2
  305. package/src/img/billie-pdp.svg +12 -9
  306. package/src/img/billie-spinner.svg +5 -3
  307. package/src/img/billie.svg +3 -1
  308. package/src/img/clearpay-logo.svg +6 -1
  309. package/src/img/clearpay-spinner.svg +4 -1
  310. package/src/img/energy-efficiency/energy-marker.svg +12 -1
  311. package/src/img/google-spinner.svg +14 -7
  312. package/src/img/googlepay.svg +23 -12
  313. package/src/img/home-banner_arrow.svg +7 -1
  314. package/src/img/ic-menu.svg +7 -1
  315. package/src/img/ic_info_big.svg +4 -1
  316. package/src/img/klarna-big.svg +18 -9
  317. package/src/img/klarna-sm.svg +5 -2
  318. package/src/img/klarna-spinner.svg +3 -1
  319. package/src/img/logo-klarna.svg +5 -2
  320. package/src/img/mastercard.svg +6 -3
  321. package/src/img/payapal_text.svg +6 -1
  322. package/src/img/payment/checkout/applepay.svg +12 -7
  323. package/src/img/payment/checkout/billie.svg +4 -2
  324. package/src/img/payment/checkout/clearpay.svg +5 -1
  325. package/src/img/payment/checkout/googlepay.svg +23 -12
  326. package/src/img/payment/checkout/mastercard.svg +13 -1
  327. package/src/img/payment/checkout/paypal.svg +37 -1
  328. package/src/img/payment/checkout/visa.svg +8 -1
  329. package/src/img/payment/footer/applepay.svg +12 -7
  330. package/src/img/payment/footer/billie.svg +3 -1
  331. package/src/img/payment/footer/clearpay.svg +18 -10
  332. package/src/img/payment/footer/googlepay.svg +23 -12
  333. package/src/img/payment/footer/mastercard.svg +13 -1
  334. package/src/img/payment/footer/paypal.svg +37 -1
  335. package/src/img/payment/footer/visa.svg +8 -1
  336. package/src/img/paypal.svg +8 -1
  337. package/src/img/paypal_logo_loader_paypal.svg +4 -1
  338. package/src/img/paypal_logo_loader_pp.svg +10 -1
  339. package/src/img/placeholders/full-width-img.svg +9 -1
  340. package/src/img/placeholders/img-2-to-1.svg +9 -1
  341. package/src/img/placeholders/img-3-to-4.svg +9 -1
  342. package/src/img/placeholders/img-4-to-3.svg +9 -1
  343. package/src/img/proposition_arrow_click.svg +7 -1
  344. package/src/img/proposition_delivery.svg +7 -1
  345. package/src/img/proposition_price.svg +7 -1
  346. package/src/img/proposition_returns.svg +7 -1
  347. package/src/img/social-icon-facebook.svg +8 -1
  348. package/src/img/social-icon-instagram.svg +15 -1
  349. package/src/img/social-icon-pinterest.svg +7 -1
  350. package/src/img/socials/facebook.svg +5 -1
  351. package/src/img/socials/instagram.svg +5 -1
  352. package/src/img/socials/pinterest.svg +5 -1
  353. package/src/img/socials/tiktok.svg +5 -1
  354. package/src/img/socials/x-twitter.svg +5 -1
  355. package/src/img/socials/youtube.svg +5 -1
  356. package/src/img/socials_facebook_color.svg +7 -1
  357. package/src/img/socials_facebook_white_blue_color.svg +5 -1
  358. package/src/img/socials_info_big.svg +7 -1
  359. package/src/img/socials_instagram_color.svg +16 -1
  360. package/src/img/socials_pinterest_color.svg +4 -1
  361. package/src/img/socials_twitter_color.svg +4 -1
  362. package/src/img/socials_whatsapp_color.svg +5 -1
  363. package/src/img/socials_youtube_color.svg +4 -1
  364. package/src/img/stars.svg +8 -1
  365. package/src/img/visa-logo.svg +3 -1
  366. package/src/img/wickes-dc-logo.svg +17 -13
  367. package/src/img/wickes-logo-v2.svg +15 -1
  368. package/src/img/wickes-logo.svg +36 -1
  369. package/src/img/young-minds.svg +10 -8
  370. package/src/js/components/anchors-scroll.js +9 -6
  371. package/src/js/components/badge-cashback.js +5 -6
  372. package/src/js/components/banner-placement-manager.js +269 -232
  373. package/src/js/components/card-color-slider.js +29 -29
  374. package/src/js/components/card-slider.js +78 -73
  375. package/src/js/components/cards-slider.js +64 -58
  376. package/src/js/components/charity-donations.js +3 -4
  377. package/src/js/components/checkout_your-details.js +68 -67
  378. package/src/js/components/clamp.js +47 -32
  379. package/src/js/components/click-disable.js +7 -7
  380. package/src/js/components/date-selection.js +50 -37
  381. package/src/js/components/file-loader.js +33 -33
  382. package/src/js/components/finance.js +3 -4
  383. package/src/js/components/flatpickr.js +135 -149
  384. package/src/js/components/gallery-pdp.js +97 -98
  385. package/src/js/components/gallery-range.js +107 -109
  386. package/src/js/components/general/accordion.js +31 -29
  387. package/src/js/components/general/back-to-top.js +40 -37
  388. package/src/js/components/general/backdrop.js +15 -15
  389. package/src/js/components/general/cart-slider.js +15 -12
  390. package/src/js/components/general/clamp-content.js +80 -80
  391. package/src/js/components/general/clamp.js +53 -38
  392. package/src/js/components/general/clear-input.js +25 -25
  393. package/src/js/components/general/cookie-chat-back.js +19 -13
  394. package/src/js/components/general/cookies-policy.js +5 -5
  395. package/src/js/components/general/create-popup-slider.js +169 -175
  396. package/src/js/components/general/device-type.js +3 -3
  397. package/src/js/components/general/footer.js +82 -52
  398. package/src/js/components/general/handleAccordion.js +28 -28
  399. package/src/js/components/general/is-trade-pro.js +15 -9
  400. package/src/js/components/general/main-nav.js +8 -8
  401. package/src/js/components/general/main-navigation.js +67 -73
  402. package/src/js/components/general/mini-basket-slider.js +6 -6
  403. package/src/js/components/general/notification.js +58 -40
  404. package/src/js/components/general/offer-banner.js +58 -58
  405. package/src/js/components/general/scroll-disable.js +45 -44
  406. package/src/js/components/general/search-filter.js +16 -16
  407. package/src/js/components/general/search.js +27 -29
  408. package/src/js/components/general/snack-bar.js +20 -11
  409. package/src/js/components/general/sticky_header.js +8 -7
  410. package/src/js/components/general/switchVat.js +154 -154
  411. package/src/js/components/general/text-clamp.js +14 -16
  412. package/src/js/components/general/tooltips.js +2 -2
  413. package/src/js/components/general/validation.js +47 -41
  414. package/src/js/components/leave-event.js +116 -113
  415. package/src/js/components/loader.js +11 -11
  416. package/src/js/components/modal-slider.js +57 -52
  417. package/src/js/components/order-item-cc.js +59 -69
  418. package/src/js/components/pdp-read-more.js +7 -11
  419. package/src/js/components/pdp-video.js +2 -2
  420. package/src/js/components/pwdstrength.js +13 -17
  421. package/src/js/components/range-cards.js +12 -12
  422. package/src/js/components/range-types.js +11 -11
  423. package/src/js/components/scrollbar.js +23 -20
  424. package/src/js/components/share-project-list.js +4 -5
  425. package/src/js/components/show-more-less.js +2 -2
  426. package/src/js/components/similar-slider.js +19 -10
  427. package/src/js/components/sticky-aside.js +84 -83
  428. package/src/js/components/store-locator-facilities.js +17 -15
  429. package/src/js/components/tabs.js +16 -17
  430. package/src/js/components/toggle-password-visibility.js +50 -50
  431. package/src/js/components/tradepro-notification-copy.js +5 -6
  432. package/src/js/components/voucher-remove.js +1 -2
  433. package/src/js/components/wisdom.js +35 -26
  434. package/src/js/components/zoom.js +67 -59
  435. package/src/js/emulation/account-hub.js +40 -40
  436. package/src/js/emulation/account-members.js +37 -36
  437. package/src/js/emulation/add-project-list-id-local.js +24 -18
  438. package/src/js/emulation/add.to.any.customisation.js +44 -38
  439. package/src/js/emulation/autocomplete.js +123 -114
  440. package/src/js/emulation/banner-placement-manager.js +40 -35
  441. package/src/js/emulation/basket-data.js +2123 -2037
  442. package/src/js/emulation/basket.js +58 -57
  443. package/src/js/emulation/big-wins.js +1079 -903
  444. package/src/js/emulation/chat-bot.js +14 -14
  445. package/src/js/emulation/checkLocalEnv.js +4 -4
  446. package/src/js/emulation/checkout-delivery-details.js +28 -25
  447. package/src/js/emulation/checkout-payment-details.js +46 -37
  448. package/src/js/emulation/checkout-sign-in-emulation.js +36 -33
  449. package/src/js/emulation/checkout_your-details.js +47 -46
  450. package/src/js/emulation/click-and-collect-modal.js +18 -20
  451. package/src/js/emulation/cnc-notifications.js +9 -10
  452. package/src/js/emulation/custom-slider-emulation.js +16 -17
  453. package/src/js/emulation/date-selection.js +25 -25
  454. package/src/js/emulation/default-store.js +92 -86
  455. package/src/js/emulation/favourite-product-local.js +31 -29
  456. package/src/js/emulation/find-address.js +41 -42
  457. package/src/js/emulation/footer-date.js +6 -3
  458. package/src/js/emulation/forms.js +352 -308
  459. package/src/js/emulation/generate-project-id-local.js +26 -23
  460. package/src/js/emulation/global-search-local.js +125 -122
  461. package/src/js/emulation/google-maps-store-info.js +25 -29
  462. package/src/js/emulation/home-movers.js +47 -49
  463. package/src/js/emulation/input-file.js +638 -558
  464. package/src/js/emulation/kitchen-plp-data.js +4528 -3670
  465. package/src/js/emulation/loadMore.js +13 -14
  466. package/src/js/emulation/main-nav-data.js +1058 -848
  467. package/src/js/emulation/mini-basket.js +34 -34
  468. package/src/js/emulation/mini-cart.js +12 -11
  469. package/src/js/emulation/mock.js +23 -23
  470. package/src/js/emulation/my-orders-local.js +30 -30
  471. package/src/js/emulation/paymentLoader.js +16 -16
  472. package/src/js/emulation/pdf-file-loader.js +88 -90
  473. package/src/js/emulation/pdp.js +18 -12
  474. package/src/js/emulation/personal-details-local.js +57 -56
  475. package/src/js/emulation/plp-load-more.js +16 -13
  476. package/src/js/emulation/popover-mini-basket.js +244 -238
  477. package/src/js/emulation/project-list-multiple.js +24 -18
  478. package/src/js/emulation/project-list-pdp.js +319 -316
  479. package/src/js/emulation/project-list-print.js +43 -40
  480. package/src/js/emulation/quiz-local.js +11 -11
  481. package/src/js/emulation/reference-field.js +2 -7
  482. package/src/js/emulation/selectable.js +19 -18
  483. package/src/js/emulation/shopping-list.js +19 -17
  484. package/src/js/emulation/sign-up.js +17 -21
  485. package/src/js/emulation/store-locator-list.js +11 -13
  486. package/src/js/emulation/switchCalendar.js +12 -8
  487. package/src/js/emulation/total-amount-loader.js +14 -13
  488. package/src/js/emulation/user.js +32 -32
  489. package/src/js/emulation/vat-toggle.js +1 -1
  490. package/src/js/emulation/wickes-responsive.js +178 -189
  491. package/src/js/emulation/wismo-details.js +22 -30
  492. package/src/js/emulation/your-details.js +34 -22
  493. package/src/js/helpers/jquery.cookiebar.js +270 -192
  494. package/src/js/helpers/responsive.js +69 -69
  495. package/src/js/helpers/safari-back.js +4 -4
  496. package/src/js/libs/bootstrap.bundle.min.js +1 -1
  497. package/src/js/libs/iframeResizer.min.js +2 -2
  498. package/src/js/libs/jquery.pstrength.custom-1.2.0.js +28 -34
  499. package/src/js/libs/simplebar.js +3 -3
  500. package/src/js/page/accordion.js +31 -29
  501. package/src/js/page/account-deletion.js +13 -13
  502. package/src/js/page/account-hub.js +128 -119
  503. package/src/js/page/account-members.js +229 -216
  504. package/src/js/page/address-book.js +186 -184
  505. package/src/js/page/basket/add-project-list-id.js +158 -130
  506. package/src/js/page/basket/clearpay.js +17 -17
  507. package/src/js/page/basket/display-energy-efficiency.js +13 -13
  508. package/src/js/page/basket/gtm.js +60 -54
  509. package/src/js/page/basket/klarna.js +2 -2
  510. package/src/js/page/basket/paypal.js +33 -33
  511. package/src/js/page/basket/session-sync.js +5 -5
  512. package/src/js/page/basket/summary-mobile.js +16 -16
  513. package/src/js/page/basket/wisdom.js +54 -39
  514. package/src/js/page/basket-v2.js +415 -261
  515. package/src/js/page/basket.js +42 -39
  516. package/src/js/page/billie-business-type.js +22 -22
  517. package/src/js/page/business-account-form.js +12 -12
  518. package/src/js/page/buying-guides-guttering.js +3 -3
  519. package/src/js/page/category-landing.js +18 -11
  520. package/src/js/page/change-password.js +100 -99
  521. package/src/js/page/checkout-confirmation-new.js +127 -70
  522. package/src/js/page/checkout-confirmation.js +6 -6
  523. package/src/js/page/checkout-delivery-address.js +35 -32
  524. package/src/js/page/checkout-delivery-details-loader.js +2 -5
  525. package/src/js/page/checkout-edit-address.js +1 -1
  526. package/src/js/page/checkout-payment-details.js +170 -172
  527. package/src/js/page/checkout-sign-in.js +15 -11
  528. package/src/js/page/checkout.js +1 -1
  529. package/src/js/page/cms-homepage.js +87 -45
  530. package/src/js/page/components/charity.js +114 -120
  531. package/src/js/page/components/csrf.js +4 -4
  532. package/src/js/page/components/discounts.js +39 -39
  533. package/src/js/page/components/favourite-product.js +125 -113
  534. package/src/js/page/components/global-search.js +204 -192
  535. package/src/js/page/components/modal-observer.js +43 -46
  536. package/src/js/page/components/order-summary.js +26 -22
  537. package/src/js/page/components/pagination.js +124 -117
  538. package/src/js/page/components/retry-action.js +2 -2
  539. package/src/js/page/components/saving-shopping-list.js +381 -314
  540. package/src/js/page/components/sticky-order-observer.js +36 -39
  541. package/src/js/page/components/voucher.js +46 -47
  542. package/src/js/page/copy-project-id.js +23 -23
  543. package/src/js/page/countdown-timer.js +6 -6
  544. package/src/js/page/default-store.js +40 -34
  545. package/src/js/page/design-appointment.js +6 -3
  546. package/src/js/page/energy-efficiency.js +39 -25
  547. package/src/js/page/finance-tabs.js +4 -4
  548. package/src/js/page/general/cookie.js +20 -10
  549. package/src/js/page/installation/calculator.js +12 -16
  550. package/src/js/page/installation/fi.js +76 -71
  551. package/src/js/page/installation/generic.js +21 -20
  552. package/src/js/page/installation/installation.js +36 -22
  553. package/src/js/page/installation/pdp-generic.js +3 -9
  554. package/src/js/page/installation/ti.js +26 -24
  555. package/src/js/page/installer-files-form.js +98 -76
  556. package/src/js/page/installer-form.js +502 -447
  557. package/src/js/page/installer-validation.js +848 -761
  558. package/src/js/page/instore-checkout.js +2 -2
  559. package/src/js/page/kitchen/card-carousel.js +21 -21
  560. package/src/js/page/kitchen/colour-swatches.js +153 -149
  561. package/src/js/page/kitchen/kitchen-card.js +62 -64
  562. package/src/js/page/kitchen/mobile-nav.js +26 -27
  563. package/src/js/page/kitchen/plp-filters-chips.js +72 -70
  564. package/src/js/page/kitchen/plp-filters-mobile.js +64 -60
  565. package/src/js/page/kitchen/plp-filters-panel.js +106 -102
  566. package/src/js/page/kitchen/plp-filters-utils.js +54 -53
  567. package/src/js/page/kitchen/plp-filters.js +210 -194
  568. package/src/js/page/kitchen/sort-by.js +149 -149
  569. package/src/js/page/klarna-modal-scroll-disable.js +4 -4
  570. package/src/js/page/merged-checkout.js +6 -3
  571. package/src/js/page/my-account.js +44 -46
  572. package/src/js/page/my-orders.js +153 -149
  573. package/src/js/page/online-exclusive.js +28 -31
  574. package/src/js/page/pdp-favourite.js +4 -4
  575. package/src/js/page/pdp-tile.js +0 -4
  576. package/src/js/page/pdp.js +41 -37
  577. package/src/js/page/personal-details.js +307 -277
  578. package/src/js/page/plp-cards-v2.js +39 -25
  579. package/src/js/page/plp-favourite.js +9 -9
  580. package/src/js/page/plp-img-v2.js +2 -3
  581. package/src/js/page/plp-load-more.js +66 -66
  582. package/src/js/page/plp.js +9 -10
  583. package/src/js/page/pre-home.js +159 -144
  584. package/src/js/page/project-list/generate-project-id.js +77 -68
  585. package/src/js/page/project-list-note.js +234 -232
  586. package/src/js/page/project-list.js +2 -3
  587. package/src/js/page/quiz.js +292 -292
  588. package/src/js/page/select-address.js +27 -14
  589. package/src/js/page/smart-banner.js +8 -5
  590. package/src/js/page/ti.js +67 -42
  591. package/src/js/page/top-rated.js +36 -29
  592. package/src/js/page/track-my-order.js +172 -156
  593. package/src/js/page/tradePro-rewards.js +34 -36
  594. package/src/js/page/utils/array-utils.js +13 -10
  595. package/src/js/page/utils/copy-to-clipboard.js +45 -45
  596. package/src/js/page/utils/create-event.js +8 -8
  597. package/src/js/page/utils/errorMesages.js +12 -11
  598. package/src/js/page/utils/helpers.js +14 -9
  599. package/src/js/page/utils/http-action.js +4 -5
  600. package/src/js/page/utils/loader.js +5 -5
  601. package/src/js/page/utils/routes.js +9 -9
  602. package/src/js/page/utils/url-query.js +4 -4
  603. package/src/js/page/utils/validation.js +93 -96
  604. package/src/js/page/wickes-dc.js +51 -44
  605. package/src/js/page/wismo.js +12 -12
  606. package/src/js/page/your-details.js +77 -41
  607. package/src/layouts/app_sticky_header.hbs +0 -1
  608. package/src/scss/barclays-paypage-combined.css +585 -585
  609. package/src/scss/barclays-paypage-desktop.css +496 -496
  610. package/src/scss/barclays-paypage-mobile.css +494 -494
  611. package/src/scss/category-main.scss +8 -2
  612. package/src/scss/common/_cat-common.scss +1 -0
  613. package/src/scss/common/_plp-common.scss +1 -0
  614. package/src/scss/components/_billie-modal.scss +2 -2
  615. package/src/scss/components/_card.scss +1 -0
  616. package/src/scss/components/_find-a-store.scss +1 -0
  617. package/src/scss/components/_gallery-pdp-critical.scss +2 -2
  618. package/src/scss/components/_kitchen-card.scss +2 -2
  619. package/src/scss/components/_notifications-critical.scss +2 -2
  620. package/src/scss/components/_offer-banner.scss +1 -0
  621. package/src/scss/components/_order-summary.scss +1 -1
  622. package/src/scss/components/_page-overlay.scss +1 -1
  623. package/src/scss/components/_price-block.scss +1 -0
  624. package/src/scss/components/_price.scss +1 -1
  625. package/src/scss/components/_range-card.scss +0 -1
  626. package/src/scss/components/_recommended.scss +0 -1
  627. package/src/scss/components/_rewards.scss +1 -1
  628. package/src/scss/components/_share-list-modal.scss +1 -1
  629. package/src/scss/components/_shopping-list-note.scss +1 -1
  630. package/src/scss/components/_steps-three.scss +1 -1
  631. package/src/scss/components/_steps.scss +2 -2
  632. package/src/scss/components/_tc-generic.scss +1 -1
  633. package/src/scss/components/_thank-you-modal.scss +3 -1
  634. package/src/scss/components/_ti-total-area.scss +1 -1
  635. package/src/scss/components/_user-address-delivery.scss +1 -1
  636. package/src/scss/components/kitchen/_price.scss +1 -1
  637. package/src/scss/components/my-account/_contacts.scss +3 -1
  638. package/src/scss/components/special-opening-schedule-v2.scss +3 -3
  639. package/src/scss/components/special-opening-schedule.scss +2 -2
  640. package/src/scss/helpers/_variables.scss +157 -154
  641. package/src/scss/helpers/helpers-pdp-critical/_elements-critical-pdp.scss +1 -0
  642. package/src/scss/helpers/helpers-pdp-critical/_helpers-critical-pdp.scss +4 -0
  643. package/src/scss/libs/_bootstrap-extracted.scss +24 -6
  644. package/src/scss/libs/_skeleton.scss +3 -3
  645. package/src/scss/libs/simplebar.css +3 -3
  646. package/src/scss/libs/swiper.css +479 -384
  647. package/src/scss/main.scss +140 -70
  648. package/src/scss/my-account-main-v2.scss +38 -19
  649. package/src/scss/my-account-main.scss +38 -19
  650. package/src/scss/pages/_checkout-widget.scss +1 -1
  651. package/src/scss/pages/_checkout_your-details.scss +1 -0
  652. package/src/scss/pages/checkout-new.scss +1 -0
  653. package/src/scss/pages/checkout.scss +1 -0
  654. package/src/scss/pages/iframe-paypage.scss +9 -8
  655. package/src/scss/pages/page_book-consultant-thank-you-new.scss +2 -2
  656. package/src/scss/pages/page_installer.scss +2 -2
  657. package/src/scss/pages/page_my-account_tradePro.scss +1 -1
  658. package/src/scss/pages/page_new-checkout_login-register.scss +1 -1
  659. package/src/scss/pages/page_pre_home_thank-you.scss +2 -2
  660. package/src/scss/pages/page_product-details-critical.scss +1 -0
  661. package/src/scss/pages/page_products-list-combined.scss +4 -0
  662. package/src/scss/pages/page_store-locator-details.scss +1 -1
  663. package/src/scss/pages/page_top-rated.scss +14 -14
  664. package/src/scss/pages/page_wismo-details.scss +1 -1
  665. package/src/scss/pages/tradePro-rewards-old.scss +1 -1
  666. package/src/scss/partials/_breadcrumbs-critical.scss +2 -2
  667. package/src/scss/partials/_breadcrumbs.scss +2 -2
  668. package/src/scss/partials/_header-critical.scss +1 -1
  669. package/src/scss/partials/_header.scss +1 -1
  670. package/src/scss/store-locator-main.scss +3 -0
  671. package/build/js/page/business-pages.js +0 -13
  672. package/src/js/page/business-pages.js +0 -13
@@ -1,808 +1,895 @@
1
1
  var Wick = Wick || {};
2
2
 
3
3
  Wick.InstallerValidation = {
4
- steps: {
5
- ['1']: {
6
- installationTypes: {
7
- required: true,
8
- callback: function (value) {
9
- var elementsToHide = ['gasSafeCard', 'gasSafeCert'];
10
- elementsToHide.forEach(function (field) {
11
- var wrapper = $('[name="'+ field +'"]');
12
- if (value.indexOf('kitchens') >= 0) {
13
- wrapper.closest('.installer_question-wrap').slideDown();
14
- } else {
15
- wrapper.closest('.installer_question-wrap').slideUp();
4
+ steps: {
5
+ ['1']: {
6
+ installationTypes: {
7
+ required: true,
8
+ callback: function (value) {
9
+ var elementsToHide = ['gasSafeCard', 'gasSafeCert'];
10
+ elementsToHide.forEach(function (field) {
11
+ var wrapper = $('[name="' + field + '"]');
12
+ if (value.indexOf('kitchens') >= 0) {
13
+ wrapper.closest('.installer_question-wrap').slideDown();
14
+ } else {
15
+ wrapper.closest('.installer_question-wrap').slideUp();
16
+ }
17
+ });
18
+ },
19
+ },
20
+ installationsNumber_kitchen: {
21
+ dependsOnInput: 'installationTypes',
22
+ dependsOnValue: ['kitchens'],
23
+ required: true,
24
+ possibleValues: [
25
+ 'kitchen_installer_application_6-10_completed',
26
+ 'kitchen_installer_application_11_or_more_completed',
27
+ ],
28
+ error: [
29
+ "Unfortunately we can't progress your application to become a Wickes Approved Kitchen Installer any further at this time if you haven't completed at least 6 installations in the last 12 months.",
30
+ 'You can however, apply to become Wickes Approved Installer for another installation type if you have met this criteria. Please deselect Kitchen to continue.',
31
+ ],
32
+ },
33
+ canArrangePreviousWorks_kitchen: {
34
+ dependsOnInput: 'installationTypes',
35
+ dependsOnValue: ['kitchens'],
36
+ required: true,
37
+ possibleValues: ['installer_application_kitchen_installation_viewings_yes'],
38
+ error: [
39
+ "Unfortunately we can't progress your application to become a Wickes Approved Kitchen Installer any further at this time if you are unable to arrange for 2 x viewings of your previous work over the last 12 months.",
40
+ 'You can however, apply to become Wickes Approved Installer for another installation type if you can meet this criteria. Please deselect Kitchen to continue.',
41
+ ],
42
+ },
43
+ gasSafeRegistration: {
44
+ dependsOnInput: 'installationTypes',
45
+ dependsOnValue: ['kitchens'],
46
+ required: true,
47
+ possibleValues: [
48
+ 'gas_safe_kitchen_installer_application_yes_not_a_subcontractor',
49
+ 'gas_safe_kitchen_installer_application_yes_subcontractor',
50
+ ],
51
+ error: [
52
+ "Unfortunately we can't progress your application to become a Wickes Approved Kitchen Installer at this this time if your business does not have Gas Safe qualified engineer.",
53
+ 'If this changes however, we look forward to receiving a further application from you in the future.',
54
+ ],
55
+ },
56
+ hasSolidWorktopsExperience: {
57
+ dependsOnInput: 'installationTypes',
58
+ dependsOnValue: ['kitchens'],
59
+ required: true,
60
+ },
61
+ installationsNumber_bathroom: {
62
+ dependsOnInput: 'installationTypes',
63
+ dependsOnValue: ['bathrooms'],
64
+ required: true,
65
+ possibleValues: [
66
+ 'bathroom_installer_application_6-10_installations_completed',
67
+ 'bathroom_installer_application_11_or_more_installations_completed',
68
+ ],
69
+ error: [
70
+ "Unfortunately we can't progress your application to become a Wickes Approved Bathroom Installer any further at this time if you haven't completed at least 6 installations in the last 12 months.",
71
+ 'You can however, apply to become Wickes Approved Installer for another installation type if you have met this criteria. Please deselect Bathroom to continue.',
72
+ ],
73
+ },
74
+ canArrangePreviousWorks_bathroom: {
75
+ dependsOnInput: 'installationTypes',
76
+ dependsOnValue: ['bathrooms'],
77
+ required: true,
78
+ possibleValues: ['installer_application_bathroom_installation_viewings_yes'],
79
+ error: [
80
+ "Unfortunately we can't progress your application to become a Wickes Approved Bathroom Installer any further at this time if you are unable to arrange for 2 x viewings of your previous work over the last 12 months.",
81
+ 'You can however, apply to become Wickes Approved Installer for another installation type if you can meet this criteria. Please deselect Bathroom to continue.',
82
+ ],
83
+ },
84
+ installationsNumber_flooring: {
85
+ dependsOnInput: 'installationTypes',
86
+ dependsOnValue: ['flooring'],
87
+ required: true,
88
+ possibleValues: [
89
+ 'flooring_installer_application_6-10_installations_completed',
90
+ 'flooring_installer_application_11_or_more_completed',
91
+ ],
92
+ error: [
93
+ "Unfortunately we can't progress your application to become a Wickes Approved Flooring Installer any further at this time if you haven't completed at least 6 installations in the last 12 months.",
94
+ 'You can however, apply to become Wickes Approved Installer for another installation type if you have met this criteria. Please deselect Flooring to continue.',
95
+ ],
96
+ },
97
+ canArrangePreviousWorks_flooring: {
98
+ dependsOnInput: 'installationTypes',
99
+ dependsOnValue: ['flooring'],
100
+ required: true,
101
+ possibleValues: ['installer_application_flooring_installation_viewings_yes'],
102
+ error: [
103
+ "Unfortunately we can't progress your application to become a Wickes Approved Flooring Installer any further at this time if you are unable to arrange for 2 x viewings of your previous work over the last 12 months.",
104
+ 'You can however, apply to become Wickes Approved Installer for another installation type if you can meet this criteria. Please deselect Flooring to continue.',
105
+ ],
106
+ },
107
+ flooringTypes: {
108
+ dependsOnInput: 'installationTypes',
109
+ dependsOnValue: ['flooring'],
110
+ required: true,
111
+ },
112
+ installers_flooring: {
113
+ dependsOnInput: 'installationTypes',
114
+ dependsOnValue: ['flooring'],
115
+ required: true,
116
+ },
117
+ installationsNumber_tiling: {
118
+ dependsOnInput: 'installationTypes',
119
+ dependsOnValue: ['tiling'],
120
+ required: true,
121
+ possibleValues: [
122
+ 'tiling_installer_application_6-10_completed',
123
+ 'tiling_installer_application_11_or_more_completed',
124
+ ],
125
+ error: [
126
+ "Unfortunately we can't progress your application to become a Wickes Approved Tiling Installer any further at this time if you haven't completed at least 6 installations in the last 12 months.",
127
+ 'You can however, apply to become Wickes Approved Installer for another installation type if you have met this criteria. Please deselect Tiling to continue.',
128
+ ],
129
+ },
130
+ canArrangePreviousWorks_tiling: {
131
+ dependsOnInput: 'installationTypes',
132
+ dependsOnValue: ['tiling'],
133
+ required: true,
134
+ possibleValues: ['installer_application_tiling_installation_viewings_yes'],
135
+ error: [
136
+ "Unfortunately we can't progress your application to become a Wickes Approved Tiling Installer any further at this time if you are unable to arrange for 2 x viewings of your previous work over the last 12 months.",
137
+ 'You can however, apply to become Wickes Approved Installer for another installation type if you can meet this criteria. Please deselect Tiling to continue.',
138
+ ],
139
+ },
140
+ tilingTypes: {
141
+ dependsOnInput: 'installationTypes',
142
+ dependsOnValue: ['tiling'],
143
+ required: true,
144
+ },
145
+ installers_tiling: {
146
+ dependsOnInput: 'installationTypes',
147
+ dependsOnValue: ['tiling'],
148
+ required: true,
149
+ },
150
+ },
151
+ ['2']: {
152
+ businessType: {
153
+ required: true,
154
+ callback: function (value) {
155
+ var incorporationWrapper = $('[name="hasCompanyIncorporationCertificate"]');
156
+ var utrWrapper = $('[name="hasUtrNumber"]');
157
+ if (value === 'sole_trader') {
158
+ incorporationWrapper.closest('.installer_question-wrap').slideUp();
159
+ utrWrapper.closest('.installer_question-wrap').slideDown();
160
+ } else {
161
+ incorporationWrapper.closest('.installer_question-wrap').slideDown();
162
+ utrWrapper.closest('.installer_question-wrap').slideUp();
163
+ }
164
+ },
165
+ },
166
+ hasVatCertificate: {
167
+ required: true,
168
+ possibleValues: [
169
+ 'installer_application_vat_registered_yes',
170
+ 'installer_application_vat_registered_no',
171
+ ],
172
+ callback: function (value) {
173
+ var elementsToHide = ['vatCertificate'];
174
+ elementsToHide.forEach(function (field) {
175
+ var wrapper = $('[name="' + field + '"]');
176
+ if (value === 'installer_application_vat_registered_yes') {
177
+ wrapper.closest('.installer_question-wrap').slideDown();
178
+ } else {
179
+ wrapper.closest('.installer_question-wrap').slideUp();
180
+ }
181
+ });
182
+ },
183
+ },
184
+ hasLiabilityInsurance: {
185
+ required: true,
186
+ possibleValues: ['installer_application_public_liability_yes'],
187
+ error: [
188
+ "Unfortunately we can't progress your application to become a Wickes Approved Installer at this this time if your business does not have public liability insurance of at least £2 million.",
189
+ 'If this changes however, we look forward to receiving a further application from you in the future.',
190
+ ],
191
+ },
192
+ liabilityInsurance: {
193
+ required: false,
194
+ regex: '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(:[0-9]{2,5})?(\/.*)?$',
195
+ error: ['Invalid image source.'],
196
+ },
197
+ hasAsbestosAwarenessCertificate: {
198
+ required: true,
199
+ possibleValues: [
200
+ 'installer_application_completed_asbestos_awareness_course_yes',
201
+ 'installer_application_completed_asbestos_awareness_course_no',
202
+ ],
203
+ },
204
+ asbestosAwarenessCertificate: {
205
+ required: false,
206
+ regex: '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(:[0-9]{2,5})?(\/.*)?$',
207
+ error: ['Invalid image source.'],
208
+ },
209
+ hasPartPCertificate: {
210
+ required: true,
211
+ possibleValues: ['installer_application_part_p_yes'],
212
+ error: [
213
+ "Unfortunately we can't progress your application to become a Wickes Approved Installer at this this time if your business does not have a Part P qualified electrician.",
214
+ 'If this changes however, we look forward to receiving a further application from you in the future.',
215
+ ],
216
+ },
217
+ partPCertificateFront: {
218
+ required: false,
219
+ regex: '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(:[0-9]{2,5})?(\/.*)?$',
220
+ error: ['Invalid image source.'],
221
+ },
222
+ partPCertificateBack: {
223
+ required: false,
224
+ regex: '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(:[0-9]{2,5})?(\/.*)?$',
225
+ error: ['Invalid image source.'],
226
+ },
227
+ gasSafeCert: {
228
+ dependsOnInput: 'installationTypes',
229
+ dependsOnValue: ['kitchens'],
230
+ required: true,
231
+ possibleValues: ['gasSafeCert_yes', 'gasSafeCert_no'],
232
+ },
233
+ gasSafeCertificate: {
234
+ required: false,
235
+ regex: '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(:[0-9]{2,5})?(\/.*)?$',
236
+ error: ['Invalid image source.'],
237
+ },
238
+ gasSafeCard: {
239
+ dependsOnInput: 'installationTypes',
240
+ dependsOnValue: ['kitchens'],
241
+ required: true,
242
+ possibleValues: ['gasSafeCard_yes', 'gasSafeCard_no'],
243
+ },
244
+ gasSafeCardFront: {
245
+ required: false,
246
+ regex: '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(:[0-9]{2,5})?(\/.*)?$',
247
+ error: ['Invalid image source.'],
248
+ },
249
+ gasSafeCardBack: {
250
+ required: false,
251
+ regex: '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(:[0-9]{2,5})?(\/.*)?$',
252
+ error: ['Invalid image source.'],
253
+ },
254
+ hasCompanyIncorporationCertificate: {
255
+ dependsOnInput: 'businessType',
256
+ dependsOnValue: ['partnership', 'ltd_company', 'ltd_liability_partnership'],
257
+ required: true,
258
+ possibleValues: [
259
+ 'installer_application_company_incorporation_cert_yes',
260
+ 'installer_application_company_incorporation_cert_no',
261
+ ],
262
+ },
263
+ companyIncorporationCertificate: {
264
+ required: false,
265
+ regex: '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(:[0-9]{2,5})?(\/.*)?$',
266
+ error: ['Invalid image source.'],
267
+ },
268
+ vat_registered_partner: {
269
+ dependsOnInput: 'vat_registered_partner',
270
+ dependsOnValue: ['installer_application_vat_registered_yes'],
271
+ required: true,
272
+ possibleValues: ['vat_registered_partner_yes', 'vat_registered_partner_no'],
273
+ },
274
+ vatCertificate: {
275
+ required: false,
276
+ regex: '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(:[0-9]{2,5})?(\/.*)?$',
277
+ error: ['Invalid image source.'],
278
+ },
279
+ hasUtrNumber: {
280
+ dependsOnInput: 'businessType',
281
+ dependsOnValue: ['sole_trader'],
282
+ required: true,
283
+ possibleValues: ['installer_application_utr_yes', 'installer_application_utr_no'],
284
+ },
285
+ utrNumberCopy: {
286
+ required: false,
287
+ regex: '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(:[0-9]{2,5})?(\/.*)?$',
288
+ error: ['Invalid image source.'],
289
+ },
290
+ },
291
+ ['3']: {
292
+ title: {
293
+ required: true,
294
+ error: ['Please select a title'],
295
+ },
296
+ firstName: {
297
+ required: true,
298
+ regex: "^[\\w ()\/&.,‘’`´'-]+$",
299
+ maxLength: 255,
300
+ error: ['Please enter a first name'],
301
+ },
302
+ lastName: {
303
+ required: true,
304
+ regex: "^[\\w ()\/&.,‘’`´'-]+$",
305
+ maxLength: 255,
306
+ error: ['Please enter a surname'],
307
+ },
308
+ email: {
309
+ required: true,
310
+ regex: '^[\\w\\+-]+(\\.[\\w-]+)*@([A-Za-z\\d]+([A-Za-z\\d-]+(\\.[A-Za-z\\d]+)*(\\.[A-Za-z]{2,}))|(?:(?:25[0-5]|2[0-4][\\d]|[01]?[\\d][\\d]?)\\.){3}(?:25[0-5]|2[0-4][\\d]|[01]?[\\d][\\d]?))$',
311
+ maxLength: 255,
312
+ error: ['Please enter a valid email address e.g. user@domain.co.uk\n'],
313
+ },
314
+ mobileNumber: {
315
+ required: true,
316
+ regex: '^07{1}\\d{9}$|^07{1}\\d{3}\\s{1}\\d{6}$|^07{1}\\d{1}\\s{1}\\d{4}\\s{1}\\d{4}$|^07{1}\\d{2}\\s{1}\\d{3}\\s{1}\\d{4}$',
317
+ error: ['Please enter a valid mobile number with no spaces e.g. 07700900000'],
318
+ },
319
+ businessName: {
320
+ required: true,
321
+ regex: '^[A-Za-z0-9\\s&@£$€¥:;,.‘\'’`´\\"()\\[\\]{}<>!«»“?/\\\\=*#%+-]{1,100}$',
322
+ error: ['Please enter a business name'],
323
+ },
324
+ line1: {
325
+ required: true,
326
+ regex: "^[\\w ()\/&.,'-]{1,255}$",
327
+ error: ['Please enter address line 1'],
328
+ },
329
+ line2: {
330
+ required: false,
331
+ regex: "^[\\w ()\/&.,'-]{0,255}$",
332
+ error: ['Please enter address line 2'],
333
+ },
334
+ town: {
335
+ required: true,
336
+ regex: "^[\\w ()\/&.,'-]{1,255}$",
337
+ error: ['Please enter a town/city'],
338
+ },
339
+ postCode: {
340
+ required: true,
341
+ regex: '^([A-Za-z]{1,2}[0-9]{1,2}[A-Za-z]?)\\s*([0-9][A-Za-z]{2})$',
342
+ error: ['Please enter a valid postcode'],
343
+ },
344
+ additionalInstallationTypes: {
345
+ required: true,
346
+ callback: function (value, changedElemValue) {
347
+ if (
348
+ changedElemValue === 'installer_application_other_works_none_of_the_above'
349
+ ) {
350
+ $(
351
+ '[name="additionalInstallationTypes"]:not([value="installer_application_other_works_none_of_the_above"])'
352
+ ).prop('checked', false);
353
+ } else {
354
+ $(
355
+ '[name="additionalInstallationTypes"][value="installer_application_other_works_none_of_the_above"]'
356
+ ).prop('checked', false);
357
+ }
358
+ },
359
+ },
360
+ preferences: {
361
+ required: false,
362
+ },
363
+ termsAgreement: {
364
+ required: true,
365
+ },
366
+ },
367
+ },
368
+ findRequirementsByName: function (elementName) {
369
+ var step = $('[name="' + elementName + '"]')
370
+ .closest('.installer-block')
371
+ .attr('data-step');
372
+ return Wick.InstallerValidation.steps[step][elementName];
373
+ },
374
+ getValueByName: function (elementName) {
375
+ var element = $('[name="' + elementName + '"]');
376
+ var type = element.attr('type');
377
+
378
+ if (element.prop('tagName') === 'SELECT') {
379
+ return element.val();
380
+ }
381
+
382
+ switch (type) {
383
+ case 'radio':
384
+ return $('[name="' + elementName + '"]:checked').val();
385
+ case 'checkbox':
386
+ return $('[name="' + elementName + '"]:checked')
387
+ .map(function () {
388
+ return $(this).val();
389
+ })
390
+ .get();
391
+ case 'file':
392
+ return element.attr('data-value');
393
+ default:
394
+ return element.val().trim();
395
+ }
396
+ },
397
+ isInputValueNotEmpty: function (value) {
398
+ if (typeof value === 'string') return !!value;
399
+ if (Array.isArray(value)) return value.length > 0;
400
+
401
+ return false;
402
+ },
403
+ elemDependsCheck: function (dependentValue, requirements) {
404
+ var isValueExist = Wick.InstallerValidation.isInputValueNotEmpty(dependentValue);
405
+ if (isValueExist) {
406
+ if (requirements.dependsOnValue) {
407
+ if (typeof dependentValue === 'string' || Array.isArray(dependentValue)) {
408
+ return Wick.InstallerValidation.elemPossibleValuesCheck(
409
+ dependentValue,
410
+ requirements.dependsOnValue
411
+ );
412
+ } else {
413
+ return false;
414
+ }
16
415
  }
17
- })
416
+ } else {
417
+ return false;
18
418
  }
19
- },
20
- installationsNumber_kitchen: {
21
- dependsOnInput: 'installationTypes',
22
- dependsOnValue: ['kitchens'],
23
- required: true,
24
- possibleValues: [
25
- 'kitchen_installer_application_6-10_completed',
26
- 'kitchen_installer_application_11_or_more_completed'
27
- ],
28
- error: [
29
- 'Unfortunately we can\'t progress your application to become a Wickes Approved Kitchen Installer any further at this time if you haven\'t completed at least 6 installations in the last 12 months.',
30
- 'You can however, apply to become Wickes Approved Installer for another installation type if you have met this criteria. Please deselect Kitchen to continue.'
31
- ]
32
- },
33
- canArrangePreviousWorks_kitchen: {
34
- dependsOnInput: 'installationTypes',
35
- dependsOnValue: ['kitchens'],
36
- required: true,
37
- possibleValues: ['installer_application_kitchen_installation_viewings_yes'],
38
- error: [
39
- 'Unfortunately we can\'t progress your application to become a Wickes Approved Kitchen Installer any further at this time if you are unable to arrange for 2 x viewings of your previous work over the last 12 months.',
40
- 'You can however, apply to become Wickes Approved Installer for another installation type if you can meet this criteria. Please deselect Kitchen to continue.'
41
- ]
42
- },
43
- gasSafeRegistration: {
44
- dependsOnInput: 'installationTypes',
45
- dependsOnValue: ['kitchens'],
46
- required: true,
47
- possibleValues: ['gas_safe_kitchen_installer_application_yes_not_a_subcontractor', 'gas_safe_kitchen_installer_application_yes_subcontractor'],
48
- error: [
49
- 'Unfortunately we can\'t progress your application to become a Wickes Approved Kitchen Installer at this this time if your business does not have Gas Safe qualified engineer.',
50
- 'If this changes however, we look forward to receiving a further application from you in the future.'
51
- ]
52
- },
53
- hasSolidWorktopsExperience: {
54
- dependsOnInput: 'installationTypes',
55
- dependsOnValue: ['kitchens'],
56
- required: true
57
- },
58
- installationsNumber_bathroom: {
59
- dependsOnInput: 'installationTypes',
60
- dependsOnValue: ['bathrooms'],
61
- required: true,
62
- possibleValues: [
63
- 'bathroom_installer_application_6-10_installations_completed',
64
- 'bathroom_installer_application_11_or_more_installations_completed'
65
- ],
66
- error: [
67
- 'Unfortunately we can\'t progress your application to become a Wickes Approved Bathroom Installer any further at this time if you haven\'t completed at least 6 installations in the last 12 months.',
68
- 'You can however, apply to become Wickes Approved Installer for another installation type if you have met this criteria. Please deselect Bathroom to continue.'
69
- ]
70
- },
71
- canArrangePreviousWorks_bathroom: {
72
- dependsOnInput: 'installationTypes',
73
- dependsOnValue: ['bathrooms'],
74
- required: true,
75
- possibleValues: ['installer_application_bathroom_installation_viewings_yes'],
76
- error: [
77
- 'Unfortunately we can\'t progress your application to become a Wickes Approved Bathroom Installer any further at this time if you are unable to arrange for 2 x viewings of your previous work over the last 12 months.',
78
- 'You can however, apply to become Wickes Approved Installer for another installation type if you can meet this criteria. Please deselect Bathroom to continue.'
79
- ]
80
- },
81
- installationsNumber_flooring: {
82
- dependsOnInput: 'installationTypes',
83
- dependsOnValue: ['flooring'],
84
- required: true,
85
- possibleValues: [
86
- 'flooring_installer_application_6-10_installations_completed',
87
- 'flooring_installer_application_11_or_more_completed'
88
- ],
89
- error: [
90
- 'Unfortunately we can\'t progress your application to become a Wickes Approved Flooring Installer any further at this time if you haven\'t completed at least 6 installations in the last 12 months.',
91
- 'You can however, apply to become Wickes Approved Installer for another installation type if you have met this criteria. Please deselect Flooring to continue.'
92
- ]
93
- },
94
- canArrangePreviousWorks_flooring: {
95
- dependsOnInput: 'installationTypes',
96
- dependsOnValue: ['flooring'],
97
- required: true,
98
- possibleValues: ['installer_application_flooring_installation_viewings_yes'],
99
- error: [
100
- 'Unfortunately we can\'t progress your application to become a Wickes Approved Flooring Installer any further at this time if you are unable to arrange for 2 x viewings of your previous work over the last 12 months.',
101
- 'You can however, apply to become Wickes Approved Installer for another installation type if you can meet this criteria. Please deselect Flooring to continue.'
102
- ]
103
- },
104
- flooringTypes: {
105
- dependsOnInput: 'installationTypes',
106
- dependsOnValue: ['flooring'],
107
- required: true
108
- },
109
- installers_flooring: {
110
- dependsOnInput: 'installationTypes',
111
- dependsOnValue: ['flooring'],
112
- required: true
113
- },
114
- installationsNumber_tiling: {
115
- dependsOnInput: 'installationTypes',
116
- dependsOnValue: ['tiling'],
117
- required: true,
118
- possibleValues: [
119
- 'tiling_installer_application_6-10_completed',
120
- 'tiling_installer_application_11_or_more_completed'
121
- ],
122
- error: [
123
- 'Unfortunately we can\'t progress your application to become a Wickes Approved Tiling Installer any further at this time if you haven\'t completed at least 6 installations in the last 12 months.',
124
- 'You can however, apply to become Wickes Approved Installer for another installation type if you have met this criteria. Please deselect Tiling to continue.'
125
- ]
126
- },
127
- canArrangePreviousWorks_tiling: {
128
- dependsOnInput: 'installationTypes',
129
- dependsOnValue: ['tiling'],
130
- required: true,
131
- possibleValues: ['installer_application_tiling_installation_viewings_yes'],
132
- error: [
133
- 'Unfortunately we can\'t progress your application to become a Wickes Approved Tiling Installer any further at this time if you are unable to arrange for 2 x viewings of your previous work over the last 12 months.',
134
- 'You can however, apply to become Wickes Approved Installer for another installation type if you can meet this criteria. Please deselect Tiling to continue.'
135
- ]
136
- },
137
- tilingTypes: {
138
- dependsOnInput: 'installationTypes',
139
- dependsOnValue: ['tiling'],
140
- required: true
141
- },
142
- installers_tiling: {
143
- dependsOnInput: 'installationTypes',
144
- dependsOnValue: ['tiling'],
145
- required: true
146
- }
419
+
420
+ return true;
147
421
  },
148
- ['2']: {
149
- businessType: {
150
- required: true,
151
- callback: function (value) {
152
- var incorporationWrapper = $('[name="hasCompanyIncorporationCertificate"]');
153
- var utrWrapper = $('[name="hasUtrNumber"]');
154
- if (value === 'sole_trader') {
155
- incorporationWrapper.closest('.installer_question-wrap').slideUp();
156
- utrWrapper.closest('.installer_question-wrap').slideDown();
157
- } else {
158
- incorporationWrapper.closest('.installer_question-wrap').slideDown();
159
- utrWrapper.closest('.installer_question-wrap').slideUp();
160
- }
422
+ elemRequiredCheck: function (value, requirements) {
423
+ var isValueExist = Wick.InstallerValidation.isInputValueNotEmpty(value);
424
+ if (requirements.required && !isValueExist) {
425
+ return false;
161
426
  }
162
- },
163
- hasVatCertificate: {
164
- required: true,
165
- possibleValues: ['installer_application_vat_registered_yes', 'installer_application_vat_registered_no'],
166
- callback: function (value) {
167
- var elementsToHide = ['vatCertificate'];
168
- elementsToHide.forEach(function (field) {
169
- var wrapper = $('[name="'+ field +'"]');
170
- if (value === 'installer_application_vat_registered_yes') {
171
- wrapper.closest('.installer_question-wrap').slideDown();
172
- } else {
173
- wrapper.closest('.installer_question-wrap').slideUp();
427
+
428
+ return true;
429
+ },
430
+ elemPossibleValuesCheck: function (value, possibleValues) {
431
+ if (Array.isArray(possibleValues) && possibleValues.length > 0) {
432
+ if (typeof value === 'string') {
433
+ if (possibleValues && possibleValues.indexOf(value) < 0) {
434
+ return false;
435
+ }
436
+ }
437
+ if (Array.isArray(value) && value.length > 0) {
438
+ if (possibleValues) {
439
+ var isValid = value
440
+ .map(function (arrayValue) {
441
+ return possibleValues.indexOf(arrayValue) >= 0;
442
+ })
443
+ .some(function (result) {
444
+ return !!result;
445
+ });
446
+
447
+ if (!isValid) {
448
+ return false;
449
+ }
450
+ }
174
451
  }
175
- })
176
452
  }
177
- },
178
- hasLiabilityInsurance: {
179
- required: true,
180
- possibleValues: ['installer_application_public_liability_yes'],
181
- error: ['Unfortunately we can\'t progress your application to become a Wickes Approved Installer at this this time if your business does not have public liability insurance of at least £2 million.', 'If this changes however, we look forward to receiving a further application from you in the future.']
182
- },
183
- liabilityInsurance: {
184
- required: false,
185
- regex: '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(:[0-9]{2,5})?(\/.*)?$',
186
- error: ['Invalid image source.']
187
- },
188
- hasAsbestosAwarenessCertificate: {
189
- required: true,
190
- possibleValues: ['installer_application_completed_asbestos_awareness_course_yes', 'installer_application_completed_asbestos_awareness_course_no']
191
- },
192
- asbestosAwarenessCertificate: {
193
- required: false,
194
- regex: '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(:[0-9]{2,5})?(\/.*)?$',
195
- error: ['Invalid image source.']
196
- },
197
- hasPartPCertificate: {
198
- required: true,
199
- possibleValues: ['installer_application_part_p_yes'],
200
- error: ['Unfortunately we can\'t progress your application to become a Wickes Approved Installer at this this time if your business does not have a Part P qualified electrician.', 'If this changes however, we look forward to receiving a further application from you in the future.']
201
- },
202
- partPCertificateFront: {
203
- required: false,
204
- regex: '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(:[0-9]{2,5})?(\/.*)?$',
205
- error: ['Invalid image source.']
206
- },
207
- partPCertificateBack: {
208
- required: false,
209
- regex: '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(:[0-9]{2,5})?(\/.*)?$',
210
- error: ['Invalid image source.']
211
- },
212
- gasSafeCert: {
213
- dependsOnInput: 'installationTypes',
214
- dependsOnValue: ['kitchens'],
215
- required: true,
216
- possibleValues: ['gasSafeCert_yes', 'gasSafeCert_no']
217
- },
218
- gasSafeCertificate: {
219
- required: false,
220
- regex: '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(:[0-9]{2,5})?(\/.*)?$',
221
- error: ['Invalid image source.']
222
- },
223
- gasSafeCard: {
224
- dependsOnInput: 'installationTypes',
225
- dependsOnValue: ['kitchens'],
226
- required: true,
227
- possibleValues: ['gasSafeCard_yes', 'gasSafeCard_no']
228
- },
229
- gasSafeCardFront: {
230
- required: false,
231
- regex: '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(:[0-9]{2,5})?(\/.*)?$',
232
- error: ['Invalid image source.']
233
- },
234
- gasSafeCardBack: {
235
- required: false,
236
- regex: '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(:[0-9]{2,5})?(\/.*)?$',
237
- error: ['Invalid image source.']
238
- },
239
- hasCompanyIncorporationCertificate: {
240
- dependsOnInput: 'businessType',
241
- dependsOnValue: ['partnership', 'ltd_company', 'ltd_liability_partnership'],
242
- required: true,
243
- possibleValues: ['installer_application_company_incorporation_cert_yes', 'installer_application_company_incorporation_cert_no'],
244
- },
245
- companyIncorporationCertificate: {
246
- required: false,
247
- regex: '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(:[0-9]{2,5})?(\/.*)?$',
248
- error: ['Invalid image source.']
249
- },
250
- vat_registered_partner: {
251
- dependsOnInput: 'vat_registered_partner',
252
- dependsOnValue: ['installer_application_vat_registered_yes'],
253
- required: true,
254
- possibleValues: ['vat_registered_partner_yes', 'vat_registered_partner_no'],
255
- },
256
- vatCertificate: {
257
- required: false,
258
- regex: '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(:[0-9]{2,5})?(\/.*)?$',
259
- error: ['Invalid image source.']
260
- },
261
- hasUtrNumber: {
262
- dependsOnInput: 'businessType',
263
- dependsOnValue: ['sole_trader'],
264
- required: true,
265
- possibleValues: ['installer_application_utr_yes', 'installer_application_utr_no'],
266
- },
267
- utrNumberCopy: {
268
- required: false,
269
- regex: '^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(:[0-9]{2,5})?(\/.*)?$',
270
- error: ['Invalid image source.']
271
- }
453
+ return true;
454
+ },
455
+ elemRegexCheck: function (value, requirements) {
456
+ if (requirements.regex && !RegExp(requirements.regex).test(value)) {
457
+ return false;
458
+ }
459
+
460
+ return true;
272
461
  },
273
- ['3']: {
274
- title: {
275
- required: true,
276
- error: ['Please select a title']
277
- },
278
- firstName: {
279
- required: true,
280
- regex: "^[\\w ()\/&.,‘’`´'-]+$",
281
- maxLength: 255,
282
- error: ['Please enter a first name']
283
- },
284
- lastName: {
285
- required: true,
286
- regex: "^[\\w ()\/&.,‘’`´'-]+$",
287
- maxLength: 255,
288
- error: ['Please enter a surname']
289
- },
290
- email: {
291
- required: true,
292
- regex: '^[\\w\\+-]+(\\.[\\w-]+)*@([A-Za-z\\d]+([A-Za-z\\d-]+(\\.[A-Za-z\\d]+)*(\\.[A-Za-z]{2,}))|(?:(?:25[0-5]|2[0-4][\\d]|[01]?[\\d][\\d]?)\\.){3}(?:25[0-5]|2[0-4][\\d]|[01]?[\\d][\\d]?))$',
293
- maxLength: 255,
294
- error: ['Please enter a valid email address e.g. user@domain.co.uk\n']
295
- },
296
- mobileNumber: {
297
- required: true,
298
- regex: '^07{1}\\d{9}$|^07{1}\\d{3}\\s{1}\\d{6}$|^07{1}\\d{1}\\s{1}\\d{4}\\s{1}\\d{4}$|^07{1}\\d{2}\\s{1}\\d{3}\\s{1}\\d{4}$',
299
- error: ['Please enter a valid mobile number with no spaces e.g. 07700900000']
300
- },
301
- businessName: {
302
- required: true,
303
- regex: '^[A-Za-z0-9\\s&@£$€¥:;,.‘\'’`´\\"()\\[\\]{}<>!«»“?/\\\\=*#%+-]{1,100}$',
304
- error: ['Please enter a business name']
305
- },
306
- line1: {
307
- required: true,
308
- regex: '^[\\w ()\/&.,\'-]{1,255}$',
309
- error: ['Please enter address line 1'],
310
- },
311
- line2: {
312
- required: false,
313
- regex: '^[\\w ()\/&.,\'-]{0,255}$',
314
- error: ['Please enter address line 2'],
315
- },
316
- town: {
317
- required: true,
318
- regex: '^[\\w ()\/&.,\'-]{1,255}$',
319
- error: ['Please enter a town/city']
320
- },
321
- postCode: {
322
- required: true,
323
- regex: '^([A-Za-z]{1,2}[0-9]{1,2}[A-Za-z]?)\\s*([0-9][A-Za-z]{2})$',
324
- error: ['Please enter a valid postcode']
325
- },
326
- additionalInstallationTypes: {
327
- required: true,
328
- callback: function (value, changedElemValue) {
329
- if (changedElemValue === 'installer_application_other_works_none_of_the_above') {
330
- $('[name="additionalInstallationTypes"]:not([value="installer_application_other_works_none_of_the_above"])').prop('checked', false);
331
- } else {
332
- $('[name="additionalInstallationTypes"][value="installer_application_other_works_none_of_the_above"]').prop('checked', false);
333
- }
462
+ elemMaxLengthCheck: function (value, requirements) {
463
+ if (typeof value === 'string' && requirements.maxLength) {
464
+ return value.length <= requirements.maxLength;
334
465
  }
335
- },
336
- preferences: {
337
- required: false
338
- },
339
- termsAgreement: {
340
- required: true
341
- },
466
+
467
+ return true;
342
468
  },
343
- },
344
- findRequirementsByName: function (elementName) {
345
- var step = $('[name="'+ elementName +'"]').closest('.installer-block').attr('data-step');
346
- return Wick.InstallerValidation.steps[step][elementName];
347
- },
348
- getValueByName: function (elementName) {
349
- var element = $('[name="'+ elementName +'"]');
350
- var type = element.attr("type");
351
-
352
- if (element.prop('tagName') === 'SELECT') {
353
- return element.val()
354
- }
355
-
356
- switch (type) {
357
- case 'radio':
358
- return $('[name="'+ elementName +'"]:checked').val();
359
- case 'checkbox':
360
- return $('[name="'+ elementName +'"]:checked').map(function(){
361
- return $(this).val();
362
- }).get();
363
- case 'file':
364
- return element.attr('data-value');
365
- default:
366
- return element.val().trim();
367
- }
368
- },
369
- isInputValueNotEmpty: function (value) {
370
- if (typeof value === 'string') return !!value;
371
- if (Array.isArray(value)) return value.length > 0;
372
-
373
- return false;
374
- },
375
- elemDependsCheck: function (dependentValue, requirements) {
376
- var isValueExist = Wick.InstallerValidation.isInputValueNotEmpty(dependentValue);
377
- if (isValueExist) {
378
- if (requirements.dependsOnValue) {
379
- if (typeof dependentValue === 'string' || Array.isArray(dependentValue)) {
380
- return Wick.InstallerValidation.elemPossibleValuesCheck(dependentValue, requirements.dependsOnValue);
469
+ isElementValid: function (elementName) {
470
+ var requirements = Wick.InstallerValidation.findRequirementsByName(elementName);
471
+ var value = Wick.InstallerValidation.getValueByName(elementName);
472
+ var error = requirements.error;
473
+ var result;
474
+
475
+ if (value && typeof value === 'string') {
476
+ value = value.trim();
477
+ }
478
+
479
+ if (requirements.required) {
480
+ if (requirements.dependsOnInput) {
481
+ var dependentValue = Wick.InstallerValidation.getValueByName(
482
+ requirements.dependsOnInput
483
+ );
484
+ if (dependentValue) {
485
+ if (requirements.dependsOnValue) {
486
+ var elemDependsCheckResult = Wick.InstallerValidation.elemDependsCheck(
487
+ dependentValue,
488
+ requirements
489
+ );
490
+ if (elemDependsCheckResult) {
491
+ result = Wick.InstallerValidation.checkElementValidations(
492
+ value,
493
+ requirements
494
+ );
495
+ return { valid: result.valid, errorType: result.errorType, error };
496
+ }
497
+ } else {
498
+ result = Wick.InstallerValidation.checkElementValidations(
499
+ value,
500
+ requirements
501
+ );
502
+ return { valid: result.valid, errorType: result.errorType, error };
503
+ }
504
+ }
505
+ } else {
506
+ result = Wick.InstallerValidation.checkElementValidations(value, requirements);
507
+ return { valid: result.valid, errorType: result.errorType, error };
508
+ }
381
509
  } else {
382
- return false;
510
+ var isValueExist = Wick.InstallerValidation.isInputValueNotEmpty(value);
511
+ if (isValueExist) {
512
+ result = Wick.InstallerValidation.checkElementValidations(value, requirements);
513
+ return { valid: result.valid, errorType: result.errorType, error };
514
+ }
383
515
  }
384
- }
385
- } else {
386
- return false;
387
- }
388
-
389
- return true;
390
- },
391
- elemRequiredCheck: function (value, requirements) {
392
- var isValueExist = Wick.InstallerValidation.isInputValueNotEmpty(value);
393
- if (requirements.required && !isValueExist) {
394
- return false;
395
- }
396
-
397
- return true;
398
- },
399
- elemPossibleValuesCheck: function (value, possibleValues) {
400
- if (Array.isArray(possibleValues) && possibleValues.length > 0) {
401
- if (typeof value === 'string') {
402
- if (possibleValues && possibleValues.indexOf(value) < 0) {
403
- return false;
516
+
517
+ return { valid: true, error };
518
+ },
519
+ checkElementValidations: function (value, requirements) {
520
+ var elemRequiredCheckResult = Wick.InstallerValidation.elemRequiredCheck(
521
+ value,
522
+ requirements
523
+ );
524
+ var elemPossibleValuesCheckResult = Wick.InstallerValidation.elemPossibleValuesCheck(
525
+ value,
526
+ requirements.possibleValues
527
+ );
528
+ var elemRegexCheckResult = Wick.InstallerValidation.elemRegexCheck(value, requirements);
529
+ var elemMaxLengthCheckResult = Wick.InstallerValidation.elemMaxLengthCheck(
530
+ value,
531
+ requirements
532
+ );
533
+
534
+ if (!elemRequiredCheckResult) return { valid: false, errorType: 'required' };
535
+ if (!elemPossibleValuesCheckResult || !elemRegexCheckResult || !elemMaxLengthCheckResult)
536
+ return {
537
+ valid: false,
538
+ errorType: 'validation',
539
+ };
540
+
541
+ return { valid: true };
542
+ },
543
+ runElementCallback: function (elementName, changedElemValue) {
544
+ var value = Wick.InstallerValidation.getValueByName(elementName);
545
+ var requirements = Wick.InstallerValidation.findRequirementsByName(elementName);
546
+ if (requirements.callback) {
547
+ requirements.callback(value, changedElemValue);
404
548
  }
405
- }
406
- if (Array.isArray(value) && value.length > 0) {
407
- if (possibleValues) {
408
- var isValid = value
409
- .map(function (arrayValue) { return possibleValues.indexOf(arrayValue) >= 0 })
410
- .some(function (result) { return !!result });
411
-
412
- if (!isValid) {
413
- return false;
414
- }
549
+ },
550
+ checkElement: function (elementName, onChange) {
551
+ var result = Wick.InstallerValidation.isElementValid(elementName);
552
+ if (result.valid) {
553
+ if (onChange) {
554
+ Wick.InstallerValidation.removeErrorNotificationFromElement(elementName);
555
+ Wick.InstallerValidation.removeGlobalErrorNotification();
556
+ }
557
+ return result;
415
558
  }
416
- }
417
- }
418
- return true;
419
- },
420
- elemRegexCheck: function (value, requirements) {
421
- if (requirements.regex && !RegExp(requirements.regex).test(value)) {
422
- return false;
423
- }
424
-
425
- return true;
426
- },
427
- elemMaxLengthCheck: function (value, requirements) {
428
- if (typeof value === 'string' && requirements.maxLength) {
429
- return value.length <= requirements.maxLength;
430
- }
431
-
432
- return true;
433
- },
434
- isElementValid: function (elementName) {
435
- var requirements = Wick.InstallerValidation.findRequirementsByName(elementName);
436
- var value = Wick.InstallerValidation.getValueByName(elementName);
437
- var error = requirements.error;
438
-
439
- if (value && typeof value === 'string') {
440
- value = value.trim();
441
- }
442
-
443
- if (requirements.required) {
444
- if (requirements.dependsOnInput) {
445
- var dependentValue = Wick.InstallerValidation.getValueByName(requirements.dependsOnInput);
446
- if (dependentValue) {
447
- if (requirements.dependsOnValue) {
448
- var elemDependsCheckResult = Wick.InstallerValidation.elemDependsCheck(dependentValue, requirements);
449
- if (elemDependsCheckResult) {
450
- var result = Wick.InstallerValidation.checkElementValidations(value, requirements);
451
- return { valid: result.valid, errorType: result.errorType, error };
559
+
560
+ Wick.InstallerValidation.addErrorNotificationToElement(elementName, result.error, true);
561
+
562
+ return result;
563
+ },
564
+ appendErrorMessage: function (wrapper, elementName, error) {
565
+ var notification =
566
+ '<div' +
567
+ ' data-installer-input-name="' +
568
+ elementName +
569
+ '"' +
570
+ ' class="form-row__error"' +
571
+ ' >' +
572
+ error
573
+ .map(function (err) {
574
+ return '<p>' + err + '</p>';
575
+ })
576
+ .join('') +
577
+ ' </div>';
578
+ wrapper.append(notification);
579
+ },
580
+ addErrorNotificationToElement: function (elementName, error, removePrevNotification) {
581
+ if (!error) return;
582
+ var element = $('[name="' + elementName + '"]');
583
+ var wrapper = element.closest('[data-form-field]');
584
+ var prevNotification = wrapper.children(
585
+ '.form-row__error[data-installer-input-name="' + elementName + '"]'
586
+ );
587
+ if (prevNotification.length === 0) {
588
+ Wick.InstallerValidation.appendErrorMessage(wrapper, elementName, error);
589
+ } else {
590
+ if (removePrevNotification) {
591
+ prevNotification.remove();
592
+ Wick.InstallerValidation.appendErrorMessage(wrapper, elementName, error);
452
593
  }
453
- } else {
454
- var result = Wick.InstallerValidation.checkElementValidations(value, requirements);
455
- return { valid: result.valid, errorType: result.errorType, error };
456
- }
457
594
  }
458
- } else {
459
- var result = Wick.InstallerValidation.checkElementValidations(value, requirements);
460
- return { valid: result.valid, errorType: result.errorType, error };
461
- }
462
- } else {
463
- var isValueExist = Wick.InstallerValidation.isInputValueNotEmpty(value);
464
- if (isValueExist) {
465
- var result = Wick.InstallerValidation.checkElementValidations(value, requirements);
466
- return { valid: result.valid, errorType: result.errorType, error };
467
- }
468
- }
469
-
470
- return { valid: true, error };
471
- },
472
- checkElementValidations: function (value, requirements) {
473
- var elemRequiredCheckResult = Wick.InstallerValidation.elemRequiredCheck(value, requirements);
474
- var elemPossibleValuesCheckResult = Wick.InstallerValidation.elemPossibleValuesCheck(value, requirements.possibleValues);
475
- var elemRegexCheckResult = Wick.InstallerValidation.elemRegexCheck(value, requirements);
476
- var elemMaxLengthCheckResult = Wick.InstallerValidation.elemMaxLengthCheck(value, requirements);
477
-
478
- if (!elemRequiredCheckResult) return { valid: false, errorType: 'required' };
479
- if (!elemPossibleValuesCheckResult || !elemRegexCheckResult || !elemMaxLengthCheckResult) return { valid: false, errorType: 'validation' };
480
-
481
- return { valid: true };
482
- },
483
- runElementCallback: function (elementName, changedElemValue) {
484
- var value = Wick.InstallerValidation.getValueByName(elementName);
485
- var requirements = Wick.InstallerValidation.findRequirementsByName(elementName);
486
- if (requirements.callback) {
487
- requirements.callback(value, changedElemValue);
488
- }
489
- },
490
- checkElement: function (elementName, onChange) {
491
- var result = Wick.InstallerValidation.isElementValid(elementName);
492
- if (result.valid) {
493
- if (onChange) {
494
- Wick.InstallerValidation.removeErrorNotificationFromElement(elementName);
495
- Wick.InstallerValidation.removeGlobalErrorNotification();
496
- }
497
- return result;
498
- }
499
-
500
- Wick.InstallerValidation.addErrorNotificationToElement(elementName, result.error, true);
501
-
502
- return result;
503
- },
504
- appendErrorMessage: function (wrapper, elementName, error) {
505
- var notification = '<div' +
506
- ' data-installer-input-name="' + elementName + '"' +
507
- ' class="form-row__error"' +
508
- ' >' + error.map(function (err) { return '<p>' + err + '</p>';}).join('') +
509
- ' </div>';
510
- wrapper.append(notification);
511
- },
512
- addErrorNotificationToElement: function (elementName, error, removePrevNotification) {
513
- if (!error) return;
514
- var element = $('[name="'+ elementName +'"]');
515
- var wrapper = element.closest('[data-form-field]');
516
- var prevNotification = wrapper.children('.form-row__error[data-installer-input-name="'+ elementName +'"]');
517
- if (prevNotification.length === 0) {
518
- Wick.InstallerValidation.appendErrorMessage(wrapper, elementName, error);
519
- } else {
520
- if (removePrevNotification) {
521
- prevNotification.remove();
522
- Wick.InstallerValidation.appendErrorMessage(wrapper, elementName, error);
523
- }
524
- }
525
- },
526
- removeErrorNotificationFromElement: function (elementName) {
527
- var element = $('[name="'+ elementName +'"]');
528
- var wrapper = element.closest('[data-form-field]');
529
- var error = wrapper.children('.installer_question-error_wrapper[data-installer-input-name="'+ elementName +'"]');
530
- var formError = wrapper.find('.form-row__error[data-installer-input-name="'+ elementName +'"]');
531
- error.remove();
532
- formError.remove();
533
- },
534
- removeAllErrorsFromStep: function (step) {
535
- var installerBlock = $('.installer-block[data-step="'+ step +'"]');
536
- installerBlock.find('.form-row__error').remove();
537
- },
538
- addGlobalErrorNotification: function (step, errorTypes) {
539
- var wrapper = $('.installer-step-errors');
540
- wrapper.attr('data-step', step);
541
- wrapper.attr('data-step-error', '');
542
- errorTypes.forEach(function (type) {
543
- wrapper.attr(`data-error-${type}`, '');
544
- });
545
- },
546
- removeGlobalErrorNotification: function () {
547
- var wrapper = $('.installer-step-errors');
548
- wrapper.removeAttr('data-step-error');
549
- wrapper.removeAttr('data-error-required');
550
- wrapper.removeAttr('data-error-validation');
551
- },
552
- validateStepForInstallerForm: function (step) {
553
- Wick.InstallerValidation.removeAllErrorsFromStep(step);
554
-
555
- var inputNames = Object.keys(Wick.InstallerValidation.steps[step]);
556
- var results = inputNames
557
- .map(function (elementName) {
558
- return {
559
- name: elementName,
560
- result: Wick.InstallerValidation.checkElement(elementName)
561
- };
562
- });
563
- var isStepInvalid = results.some(function (result) { return !result.result.valid; });
564
- var errorTypes = results.reduce(function (prev, next) {
565
- var result = next.result.errorType ? { [next.result.errorType]: true } : {};
566
- return Object.assign(
567
- prev,
568
- result
569
- )
570
- }, {});
571
- errorTypes = Object.keys(errorTypes);
572
-
573
- if (isStepInvalid) {
574
- var firstErrorField = results.find(function (result) { return !result.result.valid; });
575
- Wick.InstallerValidation.scrollToField(firstErrorField.name);
576
- Wick.InstallerValidation.addGlobalErrorNotification(step, errorTypes);
577
- }
578
-
579
- return !isStepInvalid;
580
- },
581
- scrollToField: function (name) {
582
- var element = $('[name="'+ name +'"]:first');
583
- var elementHeight = element.height();
584
- $([document.documentElement, document.body]).animate({
585
- scrollTop: element.offset().top - elementHeight
586
- }, 1500);
587
- },
588
- validateInstallerForm: function () {
589
- var isStepsValid = Wick.InstallerForm.steps
590
- .map(function (step) { return Wick.InstallerValidation.validateStepForInstallerForm(step); })
591
- .every(function (result) { return !!result; });
592
-
593
- return isStepsValid;
594
- },
595
-
596
- bindFormTextInputs: function () {
597
- $('.installer-container').on({
598
- input: function() {
599
- var elementName = $(this).attr('name');
600
- Wick.InstallerValidation.checkElement(elementName, true);
601
- Wick.InstallerValidation.runElementCallback(elementName);
602
- },
603
- change: function() {
604
- var elementName = $(this).attr('name');
605
- Wick.InstallerValidation.checkElement(elementName, true);
606
- Wick.InstallerValidation.runElementCallback(elementName);
607
- },
608
- keydown: function(e) {
609
- var keyCode = e.keyCode || e.which;
610
-
611
- if (+keyCode === 9) {
612
- var elementName = $(this).attr('name');
613
- Wick.InstallerValidation.checkElement(elementName, true);
614
- Wick.InstallerValidation.runElementCallback(elementName);
595
+ },
596
+ removeErrorNotificationFromElement: function (elementName) {
597
+ var element = $('[name="' + elementName + '"]');
598
+ var wrapper = element.closest('[data-form-field]');
599
+ var error = wrapper.children(
600
+ '.installer_question-error_wrapper[data-installer-input-name="' + elementName + '"]'
601
+ );
602
+ var formError = wrapper.find(
603
+ '.form-row__error[data-installer-input-name="' + elementName + '"]'
604
+ );
605
+ error.remove();
606
+ formError.remove();
607
+ },
608
+ removeAllErrorsFromStep: function (step) {
609
+ var installerBlock = $('.installer-block[data-step="' + step + '"]');
610
+ installerBlock.find('.form-row__error').remove();
611
+ },
612
+ addGlobalErrorNotification: function (step, errorTypes) {
613
+ var wrapper = $('.installer-step-errors');
614
+ wrapper.attr('data-step', step);
615
+ wrapper.attr('data-step-error', '');
616
+ errorTypes.forEach(function (type) {
617
+ wrapper.attr(`data-error-${type}`, '');
618
+ });
619
+ },
620
+ removeGlobalErrorNotification: function () {
621
+ var wrapper = $('.installer-step-errors');
622
+ wrapper.removeAttr('data-step-error');
623
+ wrapper.removeAttr('data-error-required');
624
+ wrapper.removeAttr('data-error-validation');
625
+ },
626
+ validateStepForInstallerForm: function (step) {
627
+ Wick.InstallerValidation.removeAllErrorsFromStep(step);
628
+
629
+ var inputNames = Object.keys(Wick.InstallerValidation.steps[step]);
630
+ var results = inputNames.map(function (elementName) {
631
+ return {
632
+ name: elementName,
633
+ result: Wick.InstallerValidation.checkElement(elementName),
634
+ };
635
+ });
636
+ var isStepInvalid = results.some(function (result) {
637
+ return !result.result.valid;
638
+ });
639
+ var errorTypes = results.reduce(function (prev, next) {
640
+ var result = next.result.errorType ? { [next.result.errorType]: true } : {};
641
+ return Object.assign(prev, result);
642
+ }, {});
643
+ errorTypes = Object.keys(errorTypes);
644
+
645
+ if (isStepInvalid) {
646
+ var firstErrorField = results.find(function (result) {
647
+ return !result.result.valid;
648
+ });
649
+ Wick.InstallerValidation.scrollToField(firstErrorField.name);
650
+ Wick.InstallerValidation.addGlobalErrorNotification(step, errorTypes);
615
651
  }
616
- }
617
- }, 'input[type="text"]');
618
-
619
- // Need to be tested on android
620
- $(document).on('focus', '.installer-container input[type="text"]', function(){
621
- var userAgent = navigator.userAgent || navigator.vendor || window.opera;
622
- if (/android/i.test(userAgent)) {
623
- var boxheight = $(window).height() - 60;
624
- $('main').append("<div id='blank' style='height:"+boxheight+"px;'"+"></div>");
625
- $('html, body').animate({scrollTop: $(this).offset().top - 100}, 500);
626
- }
627
- });
628
652
 
629
- $(document).on('focusout', '.installer-container input[type="text"]', function(){
630
- var userAgent = navigator.userAgent || navigator.vendor || window.opera;
631
- if (/android/i.test(userAgent)) {
632
- $('#blank').remove();
633
- }
634
- });
635
- },
636
- bindFormCheckboxInputs: function () {
637
- $('.installer-container input[type="radio"], input[type="checkbox"], select').on('change', function(event) {
638
- var elementName = $(this).attr('name');
639
- var changedElemValue = $(this)[0].value;
640
- Wick.InstallerValidation.checkElement(elementName, true);
641
- Wick.InstallerValidation.runElementCallback(elementName, changedElemValue);
642
- });
643
- },
653
+ return !isStepInvalid;
654
+ },
655
+ scrollToField: function (name) {
656
+ var element = $('[name="' + name + '"]:first');
657
+ var elementHeight = element.height();
658
+ $([document.documentElement, document.body]).animate(
659
+ {
660
+ scrollTop: element.offset().top - elementHeight,
661
+ },
662
+ 1500
663
+ );
664
+ },
665
+ validateInstallerForm: function () {
666
+ var isStepsValid = Wick.InstallerForm.steps
667
+ .map(function (step) {
668
+ return Wick.InstallerValidation.validateStepForInstallerForm(step);
669
+ })
670
+ .every(function (result) {
671
+ return !!result;
672
+ });
673
+
674
+ return isStepsValid;
675
+ },
676
+
677
+ bindFormTextInputs: function () {
678
+ $('.installer-container').on(
679
+ {
680
+ input: function () {
681
+ var elementName = $(this).attr('name');
682
+ Wick.InstallerValidation.checkElement(elementName, true);
683
+ Wick.InstallerValidation.runElementCallback(elementName);
684
+ },
685
+ change: function () {
686
+ var elementName = $(this).attr('name');
687
+ Wick.InstallerValidation.checkElement(elementName, true);
688
+ Wick.InstallerValidation.runElementCallback(elementName);
689
+ },
690
+ keydown: function (e) {
691
+ var keyCode = e.keyCode || e.which;
692
+
693
+ if (+keyCode === 9) {
694
+ var elementName = $(this).attr('name');
695
+ Wick.InstallerValidation.checkElement(elementName, true);
696
+ Wick.InstallerValidation.runElementCallback(elementName);
697
+ }
698
+ },
699
+ },
700
+ 'input[type="text"]'
701
+ );
702
+
703
+ // Need to be tested on android
704
+ $(document).on('focus', '.installer-container input[type="text"]', function () {
705
+ var userAgent = navigator.userAgent || navigator.vendor || window.opera;
706
+ if (/android/i.test(userAgent)) {
707
+ var boxheight = $(window).height() - 60;
708
+ $('main').append("<div id='blank' style='height:" + boxheight + "px;'></div>");
709
+ $('html, body').animate({ scrollTop: $(this).offset().top - 100 }, 500);
710
+ }
711
+ });
712
+
713
+ $(document).on('focusout', '.installer-container input[type="text"]', function () {
714
+ var userAgent = navigator.userAgent || navigator.vendor || window.opera;
715
+ if (/android/i.test(userAgent)) {
716
+ $('#blank').remove();
717
+ }
718
+ });
719
+ },
720
+
721
+ bindFormCheckboxInputs: function () {
722
+ $('.installer-container input[type="radio"], input[type="checkbox"], select').on(
723
+ 'change',
724
+ function () {
725
+ var elementName = $(this).attr('name');
726
+ var changedElemValue = $(this)[0].value;
727
+ Wick.InstallerValidation.checkElement(elementName, true);
728
+ Wick.InstallerValidation.runElementCallback(elementName, changedElemValue);
729
+ }
730
+ );
731
+ },
644
732
  };
645
733
 
646
734
  $(document).ready(function () {
647
- Wick.InstallerValidation.bindFormTextInputs();
648
- Wick.InstallerValidation.bindFormCheckboxInputs();
735
+ Wick.InstallerValidation.bindFormTextInputs();
736
+ Wick.InstallerValidation.bindFormCheckboxInputs();
649
737
  });
650
738
 
651
739
  // Polyfills
652
740
  if (!Array.prototype.some) {
653
- Array.prototype.some = function(fun, thisArg) {
654
- 'use strict';
741
+ Array.prototype.some = function (fun, thisArg) {
742
+ 'use strict';
655
743
 
656
- if (this == null) {
657
- throw new TypeError('Array.prototype.some called on null or undefined');
658
- }
744
+ if (this == null) {
745
+ throw new TypeError('Array.prototype.some called on null or undefined');
746
+ }
659
747
 
660
- if (typeof fun !== 'function') {
661
- throw new TypeError();
662
- }
748
+ if (typeof fun !== 'function') {
749
+ throw new TypeError();
750
+ }
663
751
 
664
- var t = Object(this);
665
- var len = t.length >>> 0;
752
+ var t = Object(this);
753
+ var len = t.length >>> 0;
666
754
 
667
- for (var i = 0; i < len; i++) {
668
- if (i in t && fun.call(thisArg, t[i], i, t)) {
669
- return true;
670
- }
671
- }
755
+ for (var i = 0; i < len; i++) {
756
+ if (i in t && fun.call(thisArg, t[i], i, t)) {
757
+ return true;
758
+ }
759
+ }
672
760
 
673
- return false;
674
- };
761
+ return false;
762
+ };
675
763
  }
676
764
 
677
765
  if (!Array.isArray) {
678
- Array.isArray = function(arg) {
679
- return Object.prototype.toString.call(arg) === '[object Array]';
680
- };
766
+ Array.isArray = function (arg) {
767
+ return Object.prototype.toString.call(arg) === '[object Array]';
768
+ };
681
769
  }
682
770
 
683
771
  if (!Array.prototype.every) {
684
- Array.prototype.every = function(callbackfn, thisArg) {
685
- 'use strict';
686
- var T, k;
687
-
688
- if (this == null) {
689
- throw new TypeError('this is null or not defined');
690
- }
691
-
692
- // 1. Let O be the result of calling ToObject passing the this
693
- // value as the argument.
694
- var O = Object(this);
695
-
696
- // 2. Let lenValue be the result of calling the Get internal method
697
- // of O with the argument "length".
698
- // 3. Let len be ToUint32(lenValue).
699
- var len = O.length >>> 0;
700
-
701
- // 4. If IsCallable(callbackfn) is false, throw a TypeError exception.
702
- if (typeof callbackfn !== 'function' && Object.prototype.toString.call(callbackfn) !== '[object Function]') {
703
- throw new TypeError();
704
- }
705
-
706
- // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
707
- if (arguments.length > 1) {
708
- T = thisArg;
709
- }
710
-
711
- // 6. Let k be 0.
712
- k = 0;
713
-
714
- // 7. Repeat, while k < len
715
- while (k < len) {
716
-
717
- var kValue;
718
-
719
- // a. Let Pk be ToString(k).
720
- // This is implicit for LHS operands of the in operator
721
- // b. Let kPresent be the result of calling the HasProperty internal
722
- // method of O with argument Pk.
723
- // This step can be combined with c
724
- // c. If kPresent is true, then
725
- if (k in O) {
726
- var testResult;
727
- // i. Let kValue be the result of calling the Get internal method
728
- // of O with argument Pk.
729
- kValue = O[k];
730
-
731
- // ii. Let testResult be the result of calling the Call internal method
732
- // of callbackfn with T as the this value if T is not undefined
733
- // else is the result of calling callbackfn
734
- // and argument list containing kValue, k, and O.
735
- if(T) testResult = callbackfn.call(T, kValue, k, O);
736
- else testResult = callbackfn(kValue,k,O)
737
-
738
- // iii. If ToBoolean(testResult) is false, return false.
739
- if (!testResult) {
740
- return false;
772
+ Array.prototype.every = function (callbackfn, thisArg) {
773
+ 'use strict';
774
+ var T, k;
775
+
776
+ if (this == null) {
777
+ throw new TypeError('this is null or not defined');
741
778
  }
742
- }
743
- k++;
744
- }
745
- return true;
746
- };
747
- }
748
779
 
749
- if (!Array.prototype.reduce) {
750
- Object.defineProperty(Array.prototype, 'reduce', {
751
- value: function(callback /*, initialValue*/) {
752
- if (this === null) {
753
- throw new TypeError( 'Array.prototype.reduce ' +
754
- 'called on null or undefined' );
755
- }
756
- if (typeof callback !== 'function') {
757
- throw new TypeError( callback +
758
- ' is not a function');
759
- }
760
-
761
- // 1. Let O be ? ToObject(this value).
762
- var o = Object(this);
763
-
764
- // 2. Let len be ? ToLength(? Get(O, "length")).
765
- var len = o.length >>> 0;
766
-
767
- // Steps 3, 4, 5, 6, 7
768
- var k = 0;
769
- var value;
770
-
771
- if (arguments.length >= 2) {
772
- value = arguments[1];
773
- } else {
774
- while (k < len && !(k in o)) {
775
- k++;
780
+ // 1. Let O be the result of calling ToObject passing the this
781
+ // value as the argument.
782
+ var O = Object(this);
783
+
784
+ // 2. Let lenValue be the result of calling the Get internal method
785
+ // of O with the argument "length".
786
+ // 3. Let len be ToUint32(lenValue).
787
+ var len = O.length >>> 0;
788
+
789
+ // 4. If IsCallable(callbackfn) is false, throw a TypeError exception.
790
+ if (
791
+ typeof callbackfn !== 'function' &&
792
+ Object.prototype.toString.call(callbackfn) !== '[object Function]'
793
+ ) {
794
+ throw new TypeError();
776
795
  }
777
796
 
778
- // 3. If len is 0 and initialValue is not present,
779
- // throw a TypeError exception.
780
- if (k >= len) {
781
- throw new TypeError( 'Reduce of empty array ' +
782
- 'with no initial value' );
797
+ // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
798
+ if (arguments.length > 1) {
799
+ T = thisArg;
783
800
  }
784
- value = o[k++];
785
- }
786
-
787
- // 8. Repeat, while k < len
788
- while (k < len) {
789
- // a. Let Pk be ! ToString(k).
790
- // b. Let kPresent be ? HasProperty(O, Pk).
791
- // c. If kPresent is true, then
792
- // i. Let kValue be ? Get(O, Pk).
793
- // ii. Let accumulator be ? Call(
794
- // callbackfn, undefined,
795
- // « accumulator, kValue, k, O »).
796
- if (k in o) {
797
- value = callback(value, o[k], k, o);
801
+
802
+ // 6. Let k be 0.
803
+ k = 0;
804
+
805
+ // 7. Repeat, while k < len
806
+ while (k < len) {
807
+ var kValue;
808
+
809
+ // a. Let Pk be ToString(k).
810
+ // This is implicit for LHS operands of the in operator
811
+ // b. Let kPresent be the result of calling the HasProperty internal
812
+ // method of O with argument Pk.
813
+ // This step can be combined with c
814
+ // c. If kPresent is true, then
815
+ if (k in O) {
816
+ var testResult;
817
+ // i. Let kValue be the result of calling the Get internal method
818
+ // of O with argument Pk.
819
+ kValue = O[k];
820
+
821
+ // ii. Let testResult be the result of calling the Call internal method
822
+ // of callbackfn with T as the this value if T is not undefined
823
+ // else is the result of calling callbackfn
824
+ // and argument list containing kValue, k, and O.
825
+ if (T) testResult = callbackfn.call(T, kValue, k, O);
826
+ else testResult = callbackfn(kValue, k, O);
827
+
828
+ // iii. If ToBoolean(testResult) is false, return false.
829
+ if (!testResult) {
830
+ return false;
831
+ }
832
+ }
833
+ k++;
798
834
  }
835
+ return true;
836
+ };
837
+ }
838
+
839
+ if (!Array.prototype.reduce) {
840
+ Object.defineProperty(Array.prototype, 'reduce', {
841
+ value: function (callback /*, initialValue*/) {
842
+ if (this === null) {
843
+ throw new TypeError('Array.prototype.reduce ' + 'called on null or undefined');
844
+ }
845
+ if (typeof callback !== 'function') {
846
+ throw new TypeError(callback + ' is not a function');
847
+ }
799
848
 
800
- // d. Increase k by 1.
801
- k++;
802
- }
849
+ // 1. Let O be ? ToObject(this value).
850
+ var o = Object(this);
803
851
 
804
- // 9. Return accumulator.
805
- return value;
806
- }
807
- });
852
+ // 2. Let len be ? ToLength(? Get(O, "length")).
853
+ var len = o.length >>> 0;
854
+
855
+ // Steps 3, 4, 5, 6, 7
856
+ var k = 0;
857
+ var value;
858
+
859
+ if (arguments.length >= 2) {
860
+ value = arguments[1];
861
+ } else {
862
+ while (k < len && !(k in o)) {
863
+ k++;
864
+ }
865
+
866
+ // 3. If len is 0 and initialValue is not present,
867
+ // throw a TypeError exception.
868
+ if (k >= len) {
869
+ throw new TypeError('Reduce of empty array ' + 'with no initial value');
870
+ }
871
+ value = o[k++];
872
+ }
873
+
874
+ // 8. Repeat, while k < len
875
+ while (k < len) {
876
+ // a. Let Pk be ! ToString(k).
877
+ // b. Let kPresent be ? HasProperty(O, Pk).
878
+ // c. If kPresent is true, then
879
+ // i. Let kValue be ? Get(O, Pk).
880
+ // ii. Let accumulator be ? Call(
881
+ // callbackfn, undefined,
882
+ // « accumulator, kValue, k, O »).
883
+ if (k in o) {
884
+ value = callback(value, o[k], k, o);
885
+ }
886
+
887
+ // d. Increase k by 1.
888
+ k++;
889
+ }
890
+
891
+ // 9. Return accumulator.
892
+ return value;
893
+ },
894
+ });
808
895
  }