station 0.0.0 → 0.0.93

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 (619) hide show
  1. checksums.yaml +7 -0
  2. data/.buildpacks +1 -0
  3. data/.editorconfig +23 -0
  4. data/.env.example +33 -0
  5. data/.gitignore +37 -22
  6. data/CODE_OF_CONDUCT.md +46 -0
  7. data/CONTRIBUTING.md +46 -0
  8. data/Dockerfile +68 -0
  9. data/Gemfile +2 -0
  10. data/Gemfile.lock +14 -0
  11. data/LICENSE.md +400 -20
  12. data/LICENSE.txt +9 -0
  13. data/Procfile +1 -0
  14. data/README.md +54 -20
  15. data/app.json +24 -0
  16. data/babel.config.js +74 -0
  17. data/bin/nexmo-developer +112 -0
  18. data/docs/Getting-Started.md +39 -0
  19. data/docs/How-To-Use.md +272 -0
  20. data/docs/_config.yml +5 -0
  21. data/docs/index.md +46 -0
  22. data/lib/nexmo_developer/.disallowed_words +2 -0
  23. data/lib/nexmo_developer/.dockerignore +1 -0
  24. data/lib/nexmo_developer/.eslintrc.js +6 -0
  25. data/lib/nexmo_developer/.nvmrc +1 -0
  26. data/lib/nexmo_developer/.postcssrc.yml +4 -0
  27. data/lib/nexmo_developer/.pre-commit-config.yaml +8 -0
  28. data/lib/nexmo_developer/.rspec +3 -0
  29. data/lib/nexmo_developer/.rubocop.yml +273 -0
  30. data/lib/nexmo_developer/.ruby-version +1 -0
  31. data/lib/nexmo_developer/Dockerfile +28 -0
  32. data/lib/nexmo_developer/Gemfile +192 -0
  33. data/lib/nexmo_developer/Gemfile.lock +630 -0
  34. data/lib/nexmo_developer/Guardfile +109 -0
  35. data/lib/nexmo_developer/Procfile +2 -0
  36. data/lib/nexmo_developer/Rakefile +6 -0
  37. data/lib/nexmo_developer/Runbook.md +69 -0
  38. data/lib/nexmo_developer/app/admin/active_admin_feedback_author.rb +23 -0
  39. data/lib/nexmo_developer/app/admin/active_admin_redirect.rb +22 -0
  40. data/lib/nexmo_developer/app/admin/active_admin_session.rb +34 -0
  41. data/lib/nexmo_developer/app/admin/admin_building_block_event.rb +31 -0
  42. data/lib/nexmo_developer/app/admin/admin_event.rb +40 -0
  43. data/lib/nexmo_developer/app/admin/admin_feedback_feedback.rb +54 -0
  44. data/lib/nexmo_developer/app/admin/admin_feedback_resource.rb +42 -0
  45. data/lib/nexmo_developer/app/admin/admin_user.rb +37 -0
  46. data/lib/nexmo_developer/app/assets/config/manifest.js +5 -0
  47. data/lib/nexmo_developer/app/assets/fonts/Lato-Black.woff +0 -0
  48. data/lib/nexmo_developer/app/assets/fonts/Lato-Black.woff2 +0 -0
  49. data/lib/nexmo_developer/app/assets/fonts/Lato-Regular.woff +0 -0
  50. data/lib/nexmo_developer/app/assets/fonts/Lato-Regular.woff2 +0 -0
  51. data/lib/nexmo_developer/app/assets/fonts/Lato-Semibold.woff +0 -0
  52. data/lib/nexmo_developer/app/assets/fonts/Lato-Semibold.woff2 +0 -0
  53. data/lib/nexmo_developer/app/assets/fonts/icomoon.eot +0 -0
  54. data/lib/nexmo_developer/app/assets/fonts/icomoon.json +1257 -0
  55. data/lib/nexmo_developer/app/assets/fonts/icomoon.svg +55 -0
  56. data/lib/nexmo_developer/app/assets/fonts/icomoon.ttf +0 -0
  57. data/lib/nexmo_developer/app/assets/fonts/icomoon.woff +0 -0
  58. data/lib/nexmo_developer/app/assets/fonts/nexmo-developer.json +36483 -0
  59. data/lib/nexmo_developer/app/assets/images/.keep +0 -0
  60. data/lib/nexmo_developer/app/assets/images/logo@3x.png +0 -0
  61. data/lib/nexmo_developer/app/assets/images/logo_vonage.png +0 -0
  62. data/lib/nexmo_developer/app/assets/images/nexmo-developer-logo.svg +25 -0
  63. data/lib/nexmo_developer/app/assets/images/nexmo-logo-collapsed.svg +10 -0
  64. data/lib/nexmo_developer/app/assets/images/nexmo-vonage-white.svg +79 -0
  65. data/lib/nexmo_developer/app/assets/images/posters/chatapp.jpg +0 -0
  66. data/lib/nexmo_developer/app/assets/images/posters/chatapp_small.png +0 -0
  67. data/lib/nexmo_developer/app/assets/images/posters/nexmo.jpg +0 -0
  68. data/lib/nexmo_developer/app/assets/images/posters/numberinsight.jpg +0 -0
  69. data/lib/nexmo_developer/app/assets/images/posters/numberinsight_small.png +0 -0
  70. data/lib/nexmo_developer/app/assets/images/posters/sms.jpg +0 -0
  71. data/lib/nexmo_developer/app/assets/images/posters/sms_small.png +0 -0
  72. data/lib/nexmo_developer/app/assets/images/posters/verify.jpg +0 -0
  73. data/lib/nexmo_developer/app/assets/images/posters/verify_small.png +0 -0
  74. data/lib/nexmo_developer/app/assets/images/posters/voice.jpg +0 -0
  75. data/lib/nexmo_developer/app/assets/images/posters/voice_small.png +0 -0
  76. data/lib/nexmo_developer/app/assets/images/select-dropdown.png +0 -0
  77. data/lib/nexmo_developer/app/assets/images/slack.svg +33 -0
  78. data/lib/nexmo_developer/app/assets/images/themes/ea/topography.png +0 -0
  79. data/lib/nexmo_developer/app/assets/javascripts/active_admin.js.coffee +1 -0
  80. data/lib/nexmo_developer/app/assets/javascripts/application.js +19 -0
  81. data/lib/nexmo_developer/app/assets/javascripts/stats.js +14 -0
  82. data/lib/nexmo_developer/app/assets/regex/matching_chars.rb +1 -0
  83. data/lib/nexmo_developer/app/assets/regex/sequence_diagram_regex.rb +1 -0
  84. data/lib/nexmo_developer/app/assets/regex/stats_regex.rb +1 -0
  85. data/lib/nexmo_developer/app/assets/regex/webfont_regex.rb +1 -0
  86. data/lib/nexmo_developer/app/assets/stylesheets/active_admin.scss +17 -0
  87. data/lib/nexmo_developer/app/assets/stylesheets/application.css +1 -0
  88. data/lib/nexmo_developer/app/channels/application_cable/channel.rb +4 -0
  89. data/lib/nexmo_developer/app/channels/application_cable/connection.rb +4 -0
  90. data/lib/nexmo_developer/app/constraints/documentation_constraint.rb +25 -0
  91. data/lib/nexmo_developer/app/constraints/landing_page_constraint.rb +18 -0
  92. data/lib/nexmo_developer/app/constraints/locale_constraint.rb +17 -0
  93. data/lib/nexmo_developer/app/constraints/open_api_constraint.rb +49 -0
  94. data/lib/nexmo_developer/app/controllers/admin_api/code_snippets_controller.rb +45 -0
  95. data/lib/nexmo_developer/app/controllers/admin_api/feedback_controller.rb +11 -0
  96. data/lib/nexmo_developer/app/controllers/admin_api_controller.rb +17 -0
  97. data/lib/nexmo_developer/app/controllers/api_controller.rb +33 -0
  98. data/lib/nexmo_developer/app/controllers/api_errors_controller.rb +82 -0
  99. data/lib/nexmo_developer/app/controllers/application_controller.rb +93 -0
  100. data/lib/nexmo_developer/app/controllers/careers_controller.rb +9 -0
  101. data/lib/nexmo_developer/app/controllers/concerns/.keep +0 -0
  102. data/lib/nexmo_developer/app/controllers/dashboard_controller.rb +216 -0
  103. data/lib/nexmo_developer/app/controllers/extend_controller.rb +45 -0
  104. data/lib/nexmo_developer/app/controllers/feedback/feedbacks_controller.rb +85 -0
  105. data/lib/nexmo_developer/app/controllers/feeds_controller.rb +20 -0
  106. data/lib/nexmo_developer/app/controllers/jobs_controller.rb +64 -0
  107. data/lib/nexmo_developer/app/controllers/markdown_controller.rb +160 -0
  108. data/lib/nexmo_developer/app/controllers/search_controller.rb +35 -0
  109. data/lib/nexmo_developer/app/controllers/sessions_controller.rb +12 -0
  110. data/lib/nexmo_developer/app/controllers/slack_controller.rb +61 -0
  111. data/lib/nexmo_developer/app/controllers/static_controller.rb +195 -0
  112. data/lib/nexmo_developer/app/controllers/tutorial_controller.rb +113 -0
  113. data/lib/nexmo_developer/app/controllers/usage/ab_result_controller.rb +10 -0
  114. data/lib/nexmo_developer/app/controllers/usage/code_snippet_controller.rb +19 -0
  115. data/lib/nexmo_developer/app/controllers/use_case_controller.rb +65 -0
  116. data/lib/nexmo_developer/app/extensions/nokogiri/html/document.rb +23 -0
  117. data/lib/nexmo_developer/app/helpers/application_helper.rb +66 -0
  118. data/lib/nexmo_developer/app/helpers/date_range_helper.rb +9 -0
  119. data/lib/nexmo_developer/app/helpers/navigation_helper.rb +56 -0
  120. data/lib/nexmo_developer/app/helpers/parameter_values_helper.rb +5 -0
  121. data/lib/nexmo_developer/app/helpers/video_helper.rb +20 -0
  122. data/lib/nexmo_developer/app/jobs/application_job.rb +2 -0
  123. data/lib/nexmo_developer/app/mailers/application_mailer.rb +4 -0
  124. data/lib/nexmo_developer/app/middleware/nexmo_developer/building_block_redirect.rb +18 -0
  125. data/lib/nexmo_developer/app/middleware/nexmo_developer/visitor_id.rb +13 -0
  126. data/lib/nexmo_developer/app/models/api_error.rb +31 -0
  127. data/lib/nexmo_developer/app/models/application_record.rb +3 -0
  128. data/lib/nexmo_developer/app/models/concerns/.keep +0 -0
  129. data/lib/nexmo_developer/app/models/concerns/publishable.rb +13 -0
  130. data/lib/nexmo_developer/app/models/event.rb +38 -0
  131. data/lib/nexmo_developer/app/models/feedback.rb +5 -0
  132. data/lib/nexmo_developer/app/models/feedback/author.rb +5 -0
  133. data/lib/nexmo_developer/app/models/feedback/config.rb +16 -0
  134. data/lib/nexmo_developer/app/models/feedback/feedback.rb +34 -0
  135. data/lib/nexmo_developer/app/models/feedback/resource.rb +45 -0
  136. data/lib/nexmo_developer/app/models/product.rb +22 -0
  137. data/lib/nexmo_developer/app/models/redirect.rb +2 -0
  138. data/lib/nexmo_developer/app/models/session.rb +9 -0
  139. data/lib/nexmo_developer/app/models/tutorial.rb +189 -0
  140. data/lib/nexmo_developer/app/models/tutorial/file_loader.rb +28 -0
  141. data/lib/nexmo_developer/app/models/tutorial/metadata.rb +54 -0
  142. data/lib/nexmo_developer/app/models/tutorial/prerequisite.rb +31 -0
  143. data/lib/nexmo_developer/app/models/tutorial/task.rb +45 -0
  144. data/lib/nexmo_developer/app/models/usage.rb +5 -0
  145. data/lib/nexmo_developer/app/models/usage/code_snippet_event.rb +7 -0
  146. data/lib/nexmo_developer/app/models/user.rb +14 -0
  147. data/lib/nexmo_developer/app/presenters/card.rb +20 -0
  148. data/lib/nexmo_developer/app/presenters/career.rb +40 -0
  149. data/lib/nexmo_developer/app/presenters/feedback_presenter.rb +31 -0
  150. data/lib/nexmo_developer/app/presenters/footer.rb +88 -0
  151. data/lib/nexmo_developer/app/presenters/head.rb +96 -0
  152. data/lib/nexmo_developer/app/presenters/header.rb +56 -0
  153. data/lib/nexmo_developer/app/presenters/improve_page_presenter.rb +19 -0
  154. data/lib/nexmo_developer/app/presenters/languages_dropdown_presenter.rb +19 -0
  155. data/lib/nexmo_developer/app/presenters/locale_switcher_presenter.rb +36 -0
  156. data/lib/nexmo_developer/app/presenters/navigation.rb +44 -0
  157. data/lib/nexmo_developer/app/presenters/page_title.rb +38 -0
  158. data/lib/nexmo_developer/app/presenters/product_dropdown_presenter.rb +39 -0
  159. data/lib/nexmo_developer/app/presenters/sidenav.rb +64 -0
  160. data/lib/nexmo_developer/app/presenters/sidenav_item.rb +58 -0
  161. data/lib/nexmo_developer/app/presenters/sidenav_resolver.rb +136 -0
  162. data/lib/nexmo_developer/app/presenters/sidenav_subitem.rb +71 -0
  163. data/lib/nexmo_developer/app/presenters/title_normalizer.rb +25 -0
  164. data/lib/nexmo_developer/app/presenters/topnav.rb +23 -0
  165. data/lib/nexmo_developer/app/presenters/topnav_item.rb +19 -0
  166. data/lib/nexmo_developer/app/presenters/tutorial_list_item.rb +99 -0
  167. data/lib/nexmo_developer/app/screenshots/webhook-url-for-delivery-receipt.js +44 -0
  168. data/lib/nexmo_developer/app/screenshots/webhook-url-for-inbound-message.js +44 -0
  169. data/lib/nexmo_developer/app/services/diff.rb +146 -0
  170. data/lib/nexmo_developer/app/services/email_validator.rb +6 -0
  171. data/lib/nexmo_developer/app/services/feedback_slack_notifier.rb +141 -0
  172. data/lib/nexmo_developer/app/services/greenhouse.rb +45 -0
  173. data/lib/nexmo_developer/app/services/load_config.rb +14 -0
  174. data/lib/nexmo_developer/app/services/locale_redirector.rb +29 -0
  175. data/lib/nexmo_developer/app/services/not_found_notifier.rb +34 -0
  176. data/lib/nexmo_developer/app/services/open_api_definition_resolver.rb +25 -0
  177. data/lib/nexmo_developer/app/services/redirector.rb +33 -0
  178. data/lib/nexmo_developer/app/services/search/article.rb +39 -0
  179. data/lib/nexmo_developer/app/services/search/document.rb +37 -0
  180. data/lib/nexmo_developer/app/services/search_terms.rb +27 -0
  181. data/lib/nexmo_developer/app/services/smartling_api.rb +72 -0
  182. data/lib/nexmo_developer/app/services/translator/file_translator.rb +61 -0
  183. data/lib/nexmo_developer/app/services/translator/smartling/api/base.rb +54 -0
  184. data/lib/nexmo_developer/app/services/translator/smartling/api/create_batch.rb +48 -0
  185. data/lib/nexmo_developer/app/services/translator/smartling/api/create_job.rb +44 -0
  186. data/lib/nexmo_developer/app/services/translator/smartling/api/download_file.rb +44 -0
  187. data/lib/nexmo_developer/app/services/translator/smartling/api/file_status.rb +43 -0
  188. data/lib/nexmo_developer/app/services/translator/smartling/api/file_uris.rb +46 -0
  189. data/lib/nexmo_developer/app/services/translator/smartling/api/upload_file.rb +67 -0
  190. data/lib/nexmo_developer/app/services/translator/smartling/api_requests_generator.rb +64 -0
  191. data/lib/nexmo_developer/app/services/translator/smartling/token_generator.rb +16 -0
  192. data/lib/nexmo_developer/app/services/translator/smartling_coordinator.rb +56 -0
  193. data/lib/nexmo_developer/app/services/translator/smartling_downloader.rb +57 -0
  194. data/lib/nexmo_developer/app/services/translator/translation_request.rb +11 -0
  195. data/lib/nexmo_developer/app/services/translator/translator_coordinator.rb +33 -0
  196. data/lib/nexmo_developer/app/services/translator/utils.rb +42 -0
  197. data/lib/nexmo_developer/app/services/tutorial_list.rb +39 -0
  198. data/lib/nexmo_developer/app/views/admin/feedbacks/_steps.html.erb +44 -0
  199. data/lib/nexmo_developer/app/views/admin_api/code_snippets/index.json.erb +1 -0
  200. data/lib/nexmo_developer/app/views/admin_api/feedback/index.json.jbuilder +3 -0
  201. data/lib/nexmo_developer/app/views/api/show.html.erb +1 -0
  202. data/lib/nexmo_developer/app/views/api_errors/_error_example.html.erb +9 -0
  203. data/lib/nexmo_developer/app/views/api_errors/_error_table.html.erb +30 -0
  204. data/lib/nexmo_developer/app/views/api_errors/index.html.erb +45 -0
  205. data/lib/nexmo_developer/app/views/api_errors/show.html.erb +27 -0
  206. data/lib/nexmo_developer/app/views/careers/index.html.erb +76 -0
  207. data/lib/nexmo_developer/app/views/code_languages/_icon.html.erb +11 -0
  208. data/lib/nexmo_developer/app/views/contribute/administration/page-links.md +179 -0
  209. data/lib/nexmo_developer/app/views/contribute/code-snippets/how-to-update-code-snippets.md +89 -0
  210. data/lib/nexmo_developer/app/views/contribute/code-snippets/sample-code-snippet.md +42 -0
  211. data/lib/nexmo_developer/app/views/contribute/guides/code-examples.md +190 -0
  212. data/lib/nexmo_developer/app/views/contribute/guides/introduction.md +32 -0
  213. data/lib/nexmo_developer/app/views/contribute/guides/landing-pages.md +556 -0
  214. data/lib/nexmo_developer/app/views/contribute/guides/markdown-guide.md +420 -0
  215. data/lib/nexmo_developer/app/views/contribute/guides/platform.md +220 -0
  216. data/lib/nexmo_developer/app/views/contribute/guides/tutorials-and-use-cases.md +64 -0
  217. data/lib/nexmo_developer/app/views/contribute/guides/writing-style-guide.md +278 -0
  218. data/lib/nexmo_developer/app/views/contribute/overview.md +39 -0
  219. data/lib/nexmo_developer/app/views/contribute/structure/content-types/code-snippets.md +140 -0
  220. data/lib/nexmo_developer/app/views/contribute/structure/content-types/guides.md +14 -0
  221. data/lib/nexmo_developer/app/views/contribute/structure/content-types/overviews.md +34 -0
  222. data/lib/nexmo_developer/app/views/contribute/structure/content-types/tutorials.md +59 -0
  223. data/lib/nexmo_developer/app/views/contribute/structure/content-types/use-cases.md +18 -0
  224. data/lib/nexmo_developer/app/views/contribute/structure/overview.md +55 -0
  225. data/lib/nexmo_developer/app/views/contribute/tutorials-and-use-cases/tutorials.md +197 -0
  226. data/lib/nexmo_developer/app/views/contribute/tutorials-and-use-cases/use-cases.md +22 -0
  227. data/lib/nexmo_developer/app/views/dashboard/_performance_table.html.erb +18 -0
  228. data/lib/nexmo_developer/app/views/dashboard/coverage.html.erb +169 -0
  229. data/lib/nexmo_developer/app/views/dashboard/stats.html.erb +134 -0
  230. data/lib/nexmo_developer/app/views/dashboard/stats_summary.html.erb +62 -0
  231. data/lib/nexmo_developer/app/views/extend/index.html.erb +33 -0
  232. data/lib/nexmo_developer/app/views/extend/show.html.erb +31 -0
  233. data/lib/nexmo_developer/app/views/layouts/api.html.erb +24 -0
  234. data/lib/nexmo_developer/app/views/layouts/application.html.erb +15 -0
  235. data/lib/nexmo_developer/app/views/layouts/documentation-index.html.erb +16 -0
  236. data/lib/nexmo_developer/app/views/layouts/documentation.html.erb +26 -0
  237. data/lib/nexmo_developer/app/views/layouts/landing.html.erb +17 -0
  238. data/lib/nexmo_developer/app/views/layouts/mailer.html.erb +13 -0
  239. data/lib/nexmo_developer/app/views/layouts/mailer.text.erb +1 -0
  240. data/lib/nexmo_developer/app/views/layouts/open-api.html.erb +10 -0
  241. data/lib/nexmo_developer/app/views/layouts/page-full.html.erb +9 -0
  242. data/lib/nexmo_developer/app/views/layouts/page.html.erb +15 -0
  243. data/lib/nexmo_developer/app/views/layouts/partials/_feedback.html.erb +14 -0
  244. data/lib/nexmo_developer/app/views/layouts/partials/_footer.html.erb +50 -0
  245. data/lib/nexmo_developer/app/views/layouts/partials/_head.html.erb +139 -0
  246. data/lib/nexmo_developer/app/views/layouts/partials/_header.html.erb +57 -0
  247. data/lib/nexmo_developer/app/views/layouts/partials/_improve_this_page.html.erb +16 -0
  248. data/lib/nexmo_developer/app/views/layouts/partials/_locale_switcher.html.erb +28 -0
  249. data/lib/nexmo_developer/app/views/layouts/partials/_notices.html.erb +29 -0
  250. data/lib/nexmo_developer/app/views/layouts/partials/_post-body-tags.html.erb +4 -0
  251. data/lib/nexmo_developer/app/views/layouts/partials/_product_dropdown.html.erb +30 -0
  252. data/lib/nexmo_developer/app/views/layouts/partials/_programming_languages_dropdown.html.erb +29 -0
  253. data/lib/nexmo_developer/app/views/layouts/partials/_sidenav.html.erb +3 -0
  254. data/lib/nexmo_developer/app/views/layouts/partials/_sidenav_item.html.erb +18 -0
  255. data/lib/nexmo_developer/app/views/layouts/partials/_sidenav_subitem.html.erb +34 -0
  256. data/lib/nexmo_developer/app/views/layouts/partials/api/_voice.html.erb +84 -0
  257. data/lib/nexmo_developer/app/views/layouts/static.html.erb +33 -0
  258. data/lib/nexmo_developer/app/views/markdown/show.html.erb +1 -0
  259. data/lib/nexmo_developer/app/views/markdown/wip.html.erb +5 -0
  260. data/lib/nexmo_developer/app/views/product-lifecycle/beta.md +28 -0
  261. data/lib/nexmo_developer/app/views/product-lifecycle/dev-preview.md +22 -0
  262. data/lib/nexmo_developer/app/views/search/_result.html.erb +31 -0
  263. data/lib/nexmo_developer/app/views/search/results.html.erb +26 -0
  264. data/lib/nexmo_developer/app/views/sessions/set_user_locale.js.erb +1 -0
  265. data/lib/nexmo_developer/app/views/slack/join.html.erb +25 -0
  266. data/lib/nexmo_developer/app/views/static/404.html.erb +26 -0
  267. data/lib/nexmo_developer/app/views/static/_career.html.erb +15 -0
  268. data/lib/nexmo_developer/app/views/static/_community.html.erb +24 -0
  269. data/lib/nexmo_developer/app/views/static/_dotnet.html.erb +26 -0
  270. data/lib/nexmo_developer/app/views/static/_event.html.erb +7 -0
  271. data/lib/nexmo_developer/app/views/static/_products.html.erb +450 -0
  272. data/lib/nexmo_developer/app/views/static/_profile.html.erb +9 -0
  273. data/lib/nexmo_developer/app/views/static/_slack.html.erb +2 -0
  274. data/lib/nexmo_developer/app/views/static/_xwithy.html.erb +33 -0
  275. data/lib/nexmo_developer/app/views/static/default_landing.html.erb +22 -0
  276. data/lib/nexmo_developer/app/views/static/default_landing/partials/_action_button.html.erb +13 -0
  277. data/lib/nexmo_developer/app/views/static/default_landing/partials/_api_list.html.erb +30 -0
  278. data/lib/nexmo_developer/app/views/static/default_landing/partials/_call_to_action.html.erb +35 -0
  279. data/lib/nexmo_developer/app/views/static/default_landing/partials/_career.html.erb +3 -0
  280. data/lib/nexmo_developer/app/views/static/default_landing/partials/_client_sdk_card.html.erb +17 -0
  281. data/lib/nexmo_developer/app/views/static/default_landing/partials/_contact_community.html.erb +15 -0
  282. data/lib/nexmo_developer/app/views/static/default_landing/partials/_contact_support.html.erb +14 -0
  283. data/lib/nexmo_developer/app/views/static/default_landing/partials/_event_search_results.js.erb +2 -0
  284. data/lib/nexmo_developer/app/views/static/default_landing/partials/_event_search_results_content.html.erb +9 -0
  285. data/lib/nexmo_developer/app/views/static/default_landing/partials/_event_search_results_map_content.html.erb +10 -0
  286. data/lib/nexmo_developer/app/views/static/default_landing/partials/_events.html.erb +80 -0
  287. data/lib/nexmo_developer/app/views/static/default_landing/partials/_featured_session.html.erb +18 -0
  288. data/lib/nexmo_developer/app/views/static/default_landing/partials/_github_repo.html.erb +31 -0
  289. data/lib/nexmo_developer/app/views/static/default_landing/partials/_header.html.erb +24 -0
  290. data/lib/nexmo_developer/app/views/static/default_landing/partials/_headshot.html.erb +43 -0
  291. data/lib/nexmo_developer/app/views/static/default_landing/partials/_html.html.erb +3 -0
  292. data/lib/nexmo_developer/app/views/static/default_landing/partials/_join_slack.html.erb +3 -0
  293. data/lib/nexmo_developer/app/views/static/default_landing/partials/_line_divider.html.erb +5 -0
  294. data/lib/nexmo_developer/app/views/static/default_landing/partials/_linked_image.html.erb +10 -0
  295. data/lib/nexmo_developer/app/views/static/default_landing/partials/_migrate_details.html.erb +57 -0
  296. data/lib/nexmo_developer/app/views/static/default_landing/partials/_products.html.erb +1 -0
  297. data/lib/nexmo_developer/app/views/static/default_landing/partials/_section_header.html.erb +10 -0
  298. data/lib/nexmo_developer/app/views/static/default_landing/partials/_sessions.html.erb +30 -0
  299. data/lib/nexmo_developer/app/views/static/default_landing/partials/_structured_text.html.erb +24 -0
  300. data/lib/nexmo_developer/app/views/static/default_landing/partials/_submit_your_idea_form.html.erb +58 -0
  301. data/lib/nexmo_developer/app/views/static/default_landing/partials/_table.html.erb +25 -0
  302. data/lib/nexmo_developer/app/views/static/default_landing/partials/_team_members.html.erb +5 -0
  303. data/lib/nexmo_developer/app/views/static/default_landing/partials/_text.html.erb +5 -0
  304. data/lib/nexmo_developer/app/views/static/default_landing/partials/_tutorial.html.erb +30 -0
  305. data/lib/nexmo_developer/app/views/static/default_landing/partials/_unordered_list.html.erb +11 -0
  306. data/lib/nexmo_developer/app/views/static/default_landing/partials/_warning_callout.html.erb +8 -0
  307. data/lib/nexmo_developer/app/views/static/default_landing/partials/_write_for_nexmo.html.erb +12 -0
  308. data/lib/nexmo_developer/app/views/static/documentation.html.erb +1 -0
  309. data/lib/nexmo_developer/app/views/static/landing.html.erb +47 -0
  310. data/lib/nexmo_developer/app/views/static/past_events.html.erb +19 -0
  311. data/lib/nexmo_developer/app/views/static/podcast.html.erb +40 -0
  312. data/lib/nexmo_developer/app/views/static/robots.txt.erb +4 -0
  313. data/lib/nexmo_developer/app/views/tools/concatenation.html +1 -0
  314. data/lib/nexmo_developer/app/views/tutorial/_prerequisites.html.erb +23 -0
  315. data/lib/nexmo_developer/app/views/tutorial/index.html.erb +81 -0
  316. data/lib/nexmo_developer/app/views/tutorial/list.html.erb +63 -0
  317. data/lib/nexmo_developer/app/views/tutorial/single.html.erb +1 -0
  318. data/lib/nexmo_developer/app/views/use_case/_index.html.erb +53 -0
  319. data/lib/nexmo_developer/app/views/use_case/index.html.erb +12 -0
  320. data/lib/nexmo_developer/app/views/use_case/list/plain.html.erb +5 -0
  321. data/lib/nexmo_developer/app/views/use_case/show.html.erb +8 -0
  322. data/lib/nexmo_developer/app/webpacker/javascript/api_status/index.js +20 -0
  323. data/lib/nexmo_developer/app/webpacker/javascript/careers/index.js +134 -0
  324. data/lib/nexmo_developer/app/webpacker/javascript/code_snippet_events/index.js +89 -0
  325. data/lib/nexmo_developer/app/webpacker/javascript/components/concatenation/Concatenation.vue +96 -0
  326. data/lib/nexmo_developer/app/webpacker/javascript/components/concatenation/character_counter.js +112 -0
  327. data/lib/nexmo_developer/app/webpacker/javascript/components/feedback/Feedback.vue +155 -0
  328. data/lib/nexmo_developer/app/webpacker/javascript/components/feedback/FeedbackPath.vue +56 -0
  329. data/lib/nexmo_developer/app/webpacker/javascript/components/feedback/eventHub.js +3 -0
  330. data/lib/nexmo_developer/app/webpacker/javascript/components/feedback/step/FieldSet.vue +78 -0
  331. data/lib/nexmo_developer/app/webpacker/javascript/components/feedback/step/Plain.vue +26 -0
  332. data/lib/nexmo_developer/app/webpacker/javascript/components/feedback/step/RadioGroup.vue +65 -0
  333. data/lib/nexmo_developer/app/webpacker/javascript/components/feedback/step/TextArea.vue +86 -0
  334. data/lib/nexmo_developer/app/webpacker/javascript/components/feedback/step/base.vue +53 -0
  335. data/lib/nexmo_developer/app/webpacker/javascript/components/feedback/store.js +50 -0
  336. data/lib/nexmo_developer/app/webpacker/javascript/components/jwt_generator/JwtGenerator.vue +220 -0
  337. data/lib/nexmo_developer/app/webpacker/javascript/components/search/NDPArticle.vue +38 -0
  338. data/lib/nexmo_developer/app/webpacker/javascript/components/search/Search.vue +182 -0
  339. data/lib/nexmo_developer/app/webpacker/javascript/components/search/ZendeskArticle.vue +30 -0
  340. data/lib/nexmo_developer/app/webpacker/javascript/format/index.js +36 -0
  341. data/lib/nexmo_developer/app/webpacker/javascript/github_cards/index.js +16 -0
  342. data/lib/nexmo_developer/app/webpacker/javascript/locale_switcher/index.js +40 -0
  343. data/lib/nexmo_developer/app/webpacker/javascript/notices/index.js +52 -0
  344. data/lib/nexmo_developer/app/webpacker/javascript/scroll/index.js +25 -0
  345. data/lib/nexmo_developer/app/webpacker/javascript/sidenav/index.js +251 -0
  346. data/lib/nexmo_developer/app/webpacker/javascript/spotlight/index.js +12 -0
  347. data/lib/nexmo_developer/app/webpacker/javascript/volta/tooltip.min.js +5 -0
  348. data/lib/nexmo_developer/app/webpacker/javascript/volta/volta.js +2145 -0
  349. data/lib/nexmo_developer/app/webpacker/javascript/volta_tabbed_examples/index.js +106 -0
  350. data/lib/nexmo_developer/app/webpacker/javascript/volta_tabbed_examples/user_preference.js +78 -0
  351. data/lib/nexmo_developer/app/webpacker/packs/application.js +136 -0
  352. data/lib/nexmo_developer/app/webpacker/src/application.css +0 -0
  353. data/lib/nexmo_developer/app/webpacker/stylesheets/application.scss +62 -0
  354. data/lib/nexmo_developer/app/webpacker/stylesheets/custom/_core.scss +196 -0
  355. data/lib/nexmo_developer/app/webpacker/stylesheets/custom/_mixins.scss +51 -0
  356. data/lib/nexmo_developer/app/webpacker/stylesheets/custom/_syntax.scss +63 -0
  357. data/lib/nexmo_developer/app/webpacker/stylesheets/custom/_typography.scss +248 -0
  358. data/lib/nexmo_developer/app/webpacker/stylesheets/custom/_variables.scss +23 -0
  359. data/lib/nexmo_developer/app/webpacker/stylesheets/layout/_api.scss +166 -0
  360. data/lib/nexmo_developer/app/webpacker/stylesheets/layout/_careers.scss +29 -0
  361. data/lib/nexmo_developer/app/webpacker/stylesheets/layout/_community.scss +70 -0
  362. data/lib/nexmo_developer/app/webpacker/stylesheets/layout/_feedback.scss +16 -0
  363. data/lib/nexmo_developer/app/webpacker/stylesheets/layout/_footer.scss +113 -0
  364. data/lib/nexmo_developer/app/webpacker/stylesheets/layout/_header.scss +207 -0
  365. data/lib/nexmo_developer/app/webpacker/stylesheets/layout/_hero.scss +16 -0
  366. data/lib/nexmo_developer/app/webpacker/stylesheets/layout/_print.scss +14 -0
  367. data/lib/nexmo_developer/app/webpacker/stylesheets/layout/_search.scss +115 -0
  368. data/lib/nexmo_developer/app/webpacker/stylesheets/layout/_team.scss +36 -0
  369. data/lib/nexmo_developer/app/webpacker/stylesheets/objects/_building-block.scss +32 -0
  370. data/lib/nexmo_developer/app/webpacker/stylesheets/objects/_card.scss +150 -0
  371. data/lib/nexmo_developer/app/webpacker/stylesheets/objects/_collapsible.scss +18 -0
  372. data/lib/nexmo_developer/app/webpacker/stylesheets/objects/_content-block.scss +24 -0
  373. data/lib/nexmo_developer/app/webpacker/stylesheets/objects/_extend.scss +49 -0
  374. data/lib/nexmo_developer/app/webpacker/stylesheets/objects/_focus.scss +5 -0
  375. data/lib/nexmo_developer/app/webpacker/stylesheets/objects/_icons.scss +334 -0
  376. data/lib/nexmo_developer/app/webpacker/stylesheets/objects/_js-sequence-diagram.scss +9 -0
  377. data/lib/nexmo_developer/app/webpacker/stylesheets/objects/_navigation.scss +113 -0
  378. data/lib/nexmo_developer/app/webpacker/stylesheets/objects/_notices.scss +49 -0
  379. data/lib/nexmo_developer/app/webpacker/stylesheets/objects/_tabs.scss +35 -0
  380. data/lib/nexmo_developer/app/webpacker/stylesheets/objects/_use_cases.scss +29 -0
  381. data/lib/nexmo_developer/app/webpacker/stylesheets/objects/_video.scss +14 -0
  382. data/lib/nexmo_developer/app/webpacker/stylesheets/themes/_ea.scss +32 -0
  383. data/lib/nexmo_developer/bin/initiate +23 -0
  384. data/lib/nexmo_developer/bin/rails +4 -0
  385. data/lib/nexmo_developer/bin/setup +36 -0
  386. data/lib/nexmo_developer/bin/update +31 -0
  387. data/lib/nexmo_developer/bin/webpack +19 -0
  388. data/lib/nexmo_developer/bin/webpack-dev-server +19 -0
  389. data/lib/nexmo_developer/bin/yarn +11 -0
  390. data/lib/nexmo_developer/config.ru +5 -0
  391. data/lib/nexmo_developer/config/application.rb +44 -0
  392. data/lib/nexmo_developer/config/boot.rb +4 -0
  393. data/lib/nexmo_developer/config/cable.yml +10 -0
  394. data/lib/nexmo_developer/config/credentials.yml.enc +1 -0
  395. data/lib/nexmo_developer/config/database.yml +91 -0
  396. data/lib/nexmo_developer/config/dynamic_content.yml +1 -0
  397. data/lib/nexmo_developer/config/environment.rb +7 -0
  398. data/lib/nexmo_developer/config/environments/development.rb +63 -0
  399. data/lib/nexmo_developer/config/environments/production.rb +102 -0
  400. data/lib/nexmo_developer/config/environments/staging.rb +86 -0
  401. data/lib/nexmo_developer/config/environments/test.rb +48 -0
  402. data/lib/nexmo_developer/config/feedback.yml +104 -0
  403. data/lib/nexmo_developer/config/initializers/active_admin.rb +295 -0
  404. data/lib/nexmo_developer/config/initializers/algolia.rb +30 -0
  405. data/lib/nexmo_developer/config/initializers/application_controller_renderer.rb +8 -0
  406. data/lib/nexmo_developer/config/initializers/assets.rb +16 -0
  407. data/lib/nexmo_developer/config/initializers/backtrace_silencers.rb +7 -0
  408. data/lib/nexmo_developer/config/initializers/bugsnag.rb +8 -0
  409. data/lib/nexmo_developer/config/initializers/content_security_policy.rb +25 -0
  410. data/lib/nexmo_developer/config/initializers/cookies_serializer.rb +5 -0
  411. data/lib/nexmo_developer/config/initializers/devise.rb +279 -0
  412. data/lib/nexmo_developer/config/initializers/doc_finder.rb +10 -0
  413. data/lib/nexmo_developer/config/initializers/filter_parameter_logging.rb +4 -0
  414. data/lib/nexmo_developer/config/initializers/geocoder.rb +24 -0
  415. data/lib/nexmo_developer/config/initializers/gravatar_image_tag.rb +5 -0
  416. data/lib/nexmo_developer/config/initializers/greenhouse_io.rb +7 -0
  417. data/lib/nexmo_developer/config/initializers/inflections.rb +16 -0
  418. data/lib/nexmo_developer/config/initializers/locale.rb +6 -0
  419. data/lib/nexmo_developer/config/initializers/mime_types.rb +4 -0
  420. data/lib/nexmo_developer/config/initializers/recaptcha.rb +6 -0
  421. data/lib/nexmo_developer/config/initializers/session_store.rb +3 -0
  422. data/lib/nexmo_developer/config/initializers/slack_safety_check.rb +29 -0
  423. data/lib/nexmo_developer/config/initializers/split.rb +5 -0
  424. data/lib/nexmo_developer/config/initializers/wrap_parameters.rb +14 -0
  425. data/lib/nexmo_developer/config/initializers/zeitwerk.rb +7 -0
  426. data/lib/nexmo_developer/config/master.key +1 -0
  427. data/lib/nexmo_developer/config/newrelic.yml +35 -0
  428. data/lib/nexmo_developer/config/puma.rb +41 -0
  429. data/lib/nexmo_developer/config/redirects.yml +280 -0
  430. data/lib/nexmo_developer/config/repos.yml +27 -0
  431. data/lib/nexmo_developer/config/routes.rb +108 -0
  432. data/lib/nexmo_developer/config/secrets.yml +25 -0
  433. data/lib/nexmo_developer/config/spring.rb +6 -0
  434. data/lib/nexmo_developer/config/stitch-redirects.yml +145 -0
  435. data/lib/nexmo_developer/config/storage.yml +34 -0
  436. data/lib/nexmo_developer/config/tutorials/.gitkeep +0 -0
  437. data/lib/nexmo_developer/config/tutorials/en/app-to-app.yml +49 -0
  438. data/lib/nexmo_developer/config/tutorials/en/app-to-phone.yml +43 -0
  439. data/lib/nexmo_developer/config/tutorials/en/create-and-retrieve-a-report.yml +24 -0
  440. data/lib/nexmo_developer/config/tutorials/en/create-report-using-graphical-tools.yml +20 -0
  441. data/lib/nexmo_developer/config/tutorials/en/get-json-records-cli.yml +20 -0
  442. data/lib/nexmo_developer/config/tutorials/en/ifttt-to-sms.yml +10 -0
  443. data/lib/nexmo_developer/config/tutorials/en/in-app-messaging.yml +4 -0
  444. data/lib/nexmo_developer/config/tutorials/en/in-app-messaging/javascript.yml +50 -0
  445. data/lib/nexmo_developer/config/tutorials/en/in-app-messaging/kotlin.yml +52 -0
  446. data/lib/nexmo_developer/config/tutorials/en/in-app-messaging/objective_c.yml +50 -0
  447. data/lib/nexmo_developer/config/tutorials/en/in-app-messaging/swift.yml +50 -0
  448. data/lib/nexmo_developer/config/tutorials/en/number-insight-api-aspnet.yml +11 -0
  449. data/lib/nexmo_developer/config/tutorials/en/phone-to-app.yml +4 -0
  450. data/lib/nexmo_developer/config/tutorials/en/phone-to-app/javascript.yml +38 -0
  451. data/lib/nexmo_developer/config/tutorials/en/receive-sms-dotnet.yml +9 -0
  452. data/lib/nexmo_developer/config/tutorials/en/receive-sms-with-java.yml +9 -0
  453. data/lib/nexmo_developer/config/tutorials/en/receive-sms-with-php.yml +10 -0
  454. data/lib/nexmo_developer/config/tutorials/en/receive-sms-with-ruby.yml +9 -0
  455. data/lib/nexmo_developer/config/tutorials/en/send-facebook-message-with-failover.yml +41 -0
  456. data/lib/nexmo_developer/config/tutorials/en/send-fbm-message.yml +42 -0
  457. data/lib/nexmo_developer/config/tutorials/en/send-sms-with-dotnet.yml +9 -0
  458. data/lib/nexmo_developer/config/tutorials/en/send-sms-with-flask.yml +9 -0
  459. data/lib/nexmo_developer/config/tutorials/en/send-sms-with-java.yml +9 -0
  460. data/lib/nexmo_developer/config/tutorials/en/send-sms-with-messages.yml +38 -0
  461. data/lib/nexmo_developer/config/tutorials/en/send-sms-with-php.yml +9 -0
  462. data/lib/nexmo_developer/config/tutorials/en/send-sms-with-ruby.yml +9 -0
  463. data/lib/nexmo_developer/config/tutorials/en/send-viber-message.yml +40 -0
  464. data/lib/nexmo_developer/config/tutorials/en/send-whatsapp-message.yml +40 -0
  465. data/lib/nexmo_developer/config/tutorials/en/sms-browser-notifications.yml +10 -0
  466. data/lib/nexmo_developer/config/tutorials/en/sms-dlr-with-dotnet.yml +9 -0
  467. data/lib/nexmo_developer/config/tutorials/en/sms-dlr-with-php.yml +9 -0
  468. data/lib/nexmo_developer/config/tutorials/en/sms-dlr-with-ruby.yml +9 -0
  469. data/lib/nexmo_developer/config/tutorials/en/sms-fortune-cookies-with-ibm-cloud.yml +10 -0
  470. data/lib/nexmo_developer/config/tutorials/en/two-factor-authentication-dotnet-verify-api.yml +11 -0
  471. data/lib/nexmo_developer/config/webpack/development.js +3 -0
  472. data/lib/nexmo_developer/config/webpack/environment.js +18 -0
  473. data/lib/nexmo_developer/config/webpack/loaders/vue.js +6 -0
  474. data/lib/nexmo_developer/config/webpack/production.js +3 -0
  475. data/lib/nexmo_developer/config/webpack/staging.js +4 -0
  476. data/lib/nexmo_developer/config/webpack/test.js +3 -0
  477. data/lib/nexmo_developer/config/webpacker.yml +82 -0
  478. data/lib/nexmo_developer/db/migrate/20170215101603_create_events.rb +15 -0
  479. data/lib/nexmo_developer/db/migrate/20170413143802_enable_uuid_ossp_extension.rb +6 -0
  480. data/lib/nexmo_developer/db/migrate/20170413154102_change_event_id_to_uuid.rb +7 -0
  481. data/lib/nexmo_developer/db/migrate/20170413154510_create_sessions.rb +13 -0
  482. data/lib/nexmo_developer/db/migrate/20170831144035_create_feedback_feedbacks.rb +18 -0
  483. data/lib/nexmo_developer/db/migrate/20170831150024_create_feedback_resources.rb +10 -0
  484. data/lib/nexmo_developer/db/migrate/20170901093402_sorcery_core.rb +17 -0
  485. data/lib/nexmo_developer/db/migrate/20170907172926_create_feedback_authors.rb +10 -0
  486. data/lib/nexmo_developer/db/migrate/20170908112821_create_active_admin_comments.rb +19 -0
  487. data/lib/nexmo_developer/db/migrate/20170908153555_change_events_start_at_and_end_at_to_date_type.rb +6 -0
  488. data/lib/nexmo_developer/db/migrate/20170914145346_add_code_language_to_feedback.rb +6 -0
  489. data/lib/nexmo_developer/db/migrate/20170915081222_correct_uri_of_resources.rb +31 -0
  490. data/lib/nexmo_developer/db/migrate/20170919151243_add_langugage_set_filters_to_feedbacks.rb +9 -0
  491. data/lib/nexmo_developer/db/migrate/20170920153649_add_resolved_to_feedback_feedbacks.rb +6 -0
  492. data/lib/nexmo_developer/db/migrate/20170921120626_drop_users.rb +5 -0
  493. data/lib/nexmo_developer/db/migrate/20170921121218_devise_create_users.rb +44 -0
  494. data/lib/nexmo_developer/db/migrate/20171030115603_add_api_key_and_api_secret_to_users.rb +6 -0
  495. data/lib/nexmo_developer/db/migrate/20180125163023_add_api_secret_to_users.rb +18 -0
  496. data/lib/nexmo_developer/db/migrate/20180306142355_create_careers.rb +14 -0
  497. data/lib/nexmo_developer/db/migrate/20180306161650_add_summary_and_icon_to_careers.rb +6 -0
  498. data/lib/nexmo_developer/db/migrate/20180306184030_create_friendly_id_slugs.rb +15 -0
  499. data/lib/nexmo_developer/db/migrate/20180306184642_add_slug_to_career.rb +6 -0
  500. data/lib/nexmo_developer/db/migrate/20180306185340_add_description_short_to_careers.rb +5 -0
  501. data/lib/nexmo_developer/db/migrate/20180308101927_add_role_group_to_careers.rb +6 -0
  502. data/lib/nexmo_developer/db/migrate/20180403111850_add_product_to_feedback_resources.rb +41 -0
  503. data/lib/nexmo_developer/db/migrate/20180404124814_add_published_to_sessions.rb +6 -0
  504. data/lib/nexmo_developer/db/migrate/20180827133110_usage_building_block_events.rb +16 -0
  505. data/lib/nexmo_developer/db/migrate/20181006144242_create_redirects.rb +8 -0
  506. data/lib/nexmo_developer/db/migrate/20190220092207_add_city_country_to_events.rb +6 -0
  507. data/lib/nexmo_developer/db/migrate/20190306130440_add_latitude_longitude_to_events.rb +6 -0
  508. data/lib/nexmo_developer/db/migrate/20190415162421_rename_usage_building_block_events.rb +7 -0
  509. data/lib/nexmo_developer/db/migrate/20190711141227_drop_careers_table.rb +21 -0
  510. data/lib/nexmo_developer/db/migrate/20190711143408_drop_friendly_id_slugs_table.rb +16 -0
  511. data/lib/nexmo_developer/db/migrate/20191022100247_add_foreign_key_to_active_storage_for_blob_id.rb +10 -0
  512. data/lib/nexmo_developer/db/migrate/20200402092734_add_remote_to_events.rb +5 -0
  513. data/lib/nexmo_developer/db/migrate/20201016102902_create_feedback_config.rb +10 -0
  514. data/lib/nexmo_developer/db/migrate/20201016110604_add_details_to_feedback_feedback.rb +7 -0
  515. data/lib/nexmo_developer/db/schema.rb +152 -0
  516. data/lib/nexmo_developer/db/seeds.rb +70 -0
  517. data/lib/nexmo_developer/docker-compose.yml +43 -0
  518. data/lib/nexmo_developer/github_deploy_key.enc +0 -0
  519. data/lib/nexmo_developer/lib/common_errors.rb +5 -0
  520. data/lib/nexmo_developer/lib/tasks/.keep +0 -0
  521. data/lib/nexmo_developer/lib/tasks/cache.rake +6 -0
  522. data/lib/nexmo_developer/lib/tasks/careers.rake +8 -0
  523. data/lib/nexmo_developer/lib/tasks/ci.rake +171 -0
  524. data/lib/nexmo_developer/lib/tasks/diff.rake +40 -0
  525. data/lib/nexmo_developer/lib/tasks/documentation.rake +18 -0
  526. data/lib/nexmo_developer/lib/tasks/generate_search_terms.rake +39 -0
  527. data/lib/nexmo_developer/lib/tasks/links.rake +135 -0
  528. data/lib/nexmo_developer/lib/tasks/move.rake +58 -0
  529. data/lib/nexmo_developer/lib/tasks/repos.rake +57 -0
  530. data/lib/nexmo_developer/lib/tasks/screenshots.rake +11 -0
  531. data/lib/nexmo_developer/lib/tasks/section.rake +146 -0
  532. data/lib/nexmo_developer/lib/tasks/smartling.rake +65 -0
  533. data/lib/nexmo_developer/lib/tasks/test.rake +22 -0
  534. data/lib/nexmo_developer/nexmo_developer.rb +1 -0
  535. data/lib/nexmo_developer/public/404.html +67 -0
  536. data/lib/nexmo_developer/public/422.html +67 -0
  537. data/lib/nexmo_developer/public/500.html +66 -0
  538. data/lib/nexmo_developer/public/android-chrome-192x192.png +0 -0
  539. data/lib/nexmo_developer/public/android-chrome-512x512.png +0 -0
  540. data/lib/nexmo_developer/public/apple-touch-icon-precomposed.png +0 -0
  541. data/lib/nexmo_developer/public/apple-touch-icon.png +0 -0
  542. data/lib/nexmo_developer/public/browserconfig.xml +9 -0
  543. data/lib/nexmo_developer/public/favicon-16x16.png +0 -0
  544. data/lib/nexmo_developer/public/favicon-32x32.png +0 -0
  545. data/lib/nexmo_developer/public/favicon.ico +0 -0
  546. data/lib/nexmo_developer/public/fonts/Lato-Heavy.woff +0 -0
  547. data/lib/nexmo_developer/public/fonts/Lato-Heavy.woff2 +0 -0
  548. data/lib/nexmo_developer/public/fonts/Lato-Regular.woff +0 -0
  549. data/lib/nexmo_developer/public/fonts/Lato-Regular.woff2 +0 -0
  550. data/lib/nexmo_developer/public/fonts/Lato-Semibold.woff +0 -0
  551. data/lib/nexmo_developer/public/fonts/Lato-Semibold.woff2 +0 -0
  552. data/lib/nexmo_developer/public/manifest.json +17 -0
  553. data/lib/nexmo_developer/public/mstile-144x144.png +0 -0
  554. data/lib/nexmo_developer/public/mstile-150x150.png +0 -0
  555. data/lib/nexmo_developer/public/nexmo-developer-logo.svg +25 -0
  556. data/lib/nexmo_developer/public/nexmo-vonage-white.svg +79 -0
  557. data/lib/nexmo_developer/public/packs-test/css/application-5047da33.chunk.css +14950 -0
  558. data/lib/nexmo_developer/public/packs-test/css/application-5047da33.chunk.css.map +1 -0
  559. data/lib/nexmo_developer/public/packs-test/css/application-a5fa0fdb.chunk.css +15085 -0
  560. data/lib/nexmo_developer/public/packs-test/css/application-a5fa0fdb.chunk.css.map +1 -0
  561. data/lib/nexmo_developer/public/packs-test/css/application-f92656e6.chunk.css +13 -0
  562. data/lib/nexmo_developer/public/packs-test/css/application-f92656e6.chunk.css.map +1 -0
  563. data/lib/nexmo_developer/public/packs-test/css/application-f9d1bdbc.chunk.css +13 -0
  564. data/lib/nexmo_developer/public/packs-test/css/application-f9d1bdbc.chunk.css.map +1 -0
  565. data/lib/nexmo_developer/public/packs-test/js/0-e58f598fb97314a89835.chunk.js +59763 -0
  566. data/lib/nexmo_developer/public/packs-test/js/0-e58f598fb97314a89835.chunk.js.map +1 -0
  567. data/lib/nexmo_developer/public/packs-test/js/application-21483bf220c794127fa9.chunk.js +6405 -0
  568. data/lib/nexmo_developer/public/packs-test/js/application-21483bf220c794127fa9.chunk.js.map +1 -0
  569. data/lib/nexmo_developer/public/packs-test/js/application-6e53f67bc3230c42f9dd.chunk.js +7839 -0
  570. data/lib/nexmo_developer/public/packs-test/js/application-6e53f67bc3230c42f9dd.chunk.js.map +1 -0
  571. data/lib/nexmo_developer/public/packs-test/js/application-76d5a80c3775a7e2327a.chunk.js +6405 -0
  572. data/lib/nexmo_developer/public/packs-test/js/application-76d5a80c3775a7e2327a.chunk.js.map +1 -0
  573. data/lib/nexmo_developer/public/packs-test/js/application-c6f3e7a9d98562f76890.chunk.js +6619 -0
  574. data/lib/nexmo_developer/public/packs-test/js/application-c6f3e7a9d98562f76890.chunk.js.map +1 -0
  575. data/lib/nexmo_developer/public/packs-test/js/application-d280e78dd4f9d3d9b466.chunk.js +6405 -0
  576. data/lib/nexmo_developer/public/packs-test/js/application-d280e78dd4f9d3d9b466.chunk.js.map +1 -0
  577. data/lib/nexmo_developer/public/packs-test/js/runtime~application-1c11a8c601900ade80b6.js +155 -0
  578. data/lib/nexmo_developer/public/packs-test/js/runtime~application-1c11a8c601900ade80b6.js.map +1 -0
  579. data/lib/nexmo_developer/public/packs-test/js/vendors~application-6518249ed8d7aa985a8b.chunk.js +61849 -0
  580. data/lib/nexmo_developer/public/packs-test/js/vendors~application-6518249ed8d7aa985a8b.chunk.js.map +1 -0
  581. data/lib/nexmo_developer/public/packs-test/js/vendors~application-bc967911d70f3f4a5151.chunk.js +59077 -0
  582. data/lib/nexmo_developer/public/packs-test/js/vendors~application-bc967911d70f3f4a5151.chunk.js.map +1 -0
  583. data/lib/nexmo_developer/public/packs-test/js/vendors~application-d2bde7a8e622fafdeb1d.chunk.js +61843 -0
  584. data/lib/nexmo_developer/public/packs-test/js/vendors~application-d2bde7a8e622fafdeb1d.chunk.js.map +1 -0
  585. data/lib/nexmo_developer/public/packs-test/js/vendors~application-eb13e7814c54bf76b364.chunk.js +62431 -0
  586. data/lib/nexmo_developer/public/packs-test/js/vendors~application-eb13e7814c54bf76b364.chunk.js.map +1 -0
  587. data/lib/nexmo_developer/public/packs-test/manifest.json +85 -0
  588. data/lib/nexmo_developer/public/safari-pinned-tab.svg +1 -0
  589. data/lib/nexmo_developer/public/symbol/volta-brand-icons.svg +1 -0
  590. data/lib/nexmo_developer/public/symbol/volta-icons.svg +1 -0
  591. data/lib/nexmo_developer/vendor/assets/javascripts/.keep +0 -0
  592. data/lib/nexmo_developer/vendor/assets/javascripts/jquery-scrolltofixed.js +567 -0
  593. data/lib/nexmo_developer/vendor/assets/javascripts/mermaid.js +49 -0
  594. data/lib/nexmo_developer/vendor/assets/javascripts/underscore.js +5 -0
  595. data/lib/nexmo_developer/vendor/assets/javascripts/volta/addons/jquery.tablesorter.js +1031 -0
  596. data/lib/nexmo_developer/vendor/assets/javascripts/volta/addons/prism.js +22 -0
  597. data/lib/nexmo_developer/vendor/assets/javascripts/volta/components/side-navigation/volta.menu.js +377 -0
  598. data/lib/nexmo_developer/vendor/assets/javascripts/volta/components/volta.accordion.js +249 -0
  599. data/lib/nexmo_developer/vendor/assets/javascripts/volta/components/volta.dropdown.js +145 -0
  600. data/lib/nexmo_developer/vendor/assets/javascripts/volta/components/volta.flash.js +175 -0
  601. data/lib/nexmo_developer/vendor/assets/javascripts/volta/components/volta.modal.js +312 -0
  602. data/lib/nexmo_developer/vendor/assets/javascripts/volta/components/volta.tab.js +203 -0
  603. data/lib/nexmo_developer/vendor/assets/javascripts/volta/components/volta.tooltip.js +71 -0
  604. data/lib/nexmo_developer/vendor/assets/javascripts/volta/popper.min.js +5 -0
  605. data/lib/nexmo_developer/vendor/assets/javascripts/volta/svgxuse.min.js +12 -0
  606. data/lib/nexmo_developer/vendor/assets/javascripts/volta/tooltip.min.js +5 -0
  607. data/lib/nexmo_developer/vendor/assets/javascripts/volta/volta.core.js +238 -0
  608. data/lib/nexmo_developer/vendor/assets/javascripts/volta/volta.js +2141 -0
  609. data/lib/nexmo_developer/vendor/assets/javascripts/volta/volta.min.js +1 -0
  610. data/lib/nexmo_developer/vendor/assets/stylesheets/.keep +0 -0
  611. data/lib/nexmo_developer/version.rb +3 -0
  612. data/package.json +124 -0
  613. data/station.gemspec +87 -42
  614. data/yarn.lock +13919 -0
  615. metadata +1885 -55
  616. data/.document +0 -5
  617. data/Rakefile +0 -61
  618. data/VERSION +0 -1
  619. data/lib/station.rb +0 -3
@@ -0,0 +1,12 @@
1
+ import Volta from "../volta/volta.js"
2
+
3
+ export default () => {
4
+ $(document).ready(function() {
5
+ $(document).on('ajax:success', '#spotlight-form', function(event, response) {
6
+ Volta.flash.show('success');
7
+ event.target.reset();
8
+ }).on('ajax:error', '#spotlight-form', function(event) {
9
+ Volta.flash.show('error');
10
+ });
11
+ });
12
+ }
@@ -0,0 +1,5 @@
1
+ /*
2
+ Copyright (C) Federico Zivolo 2018
3
+ Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT).
4
+ */(function(a,b){'object'==typeof exports&&'undefined'!=typeof module?module.exports=b(require('popper.js')):'function'==typeof define&&define.amd?define(['popper.js'],b):a.Tooltip=b(a.Popper)})(this,function(a){'use strict';function b(a){return a&&'[object Function]'==={}.toString.call(a)}a=a&&a.hasOwnProperty('default')?a['default']:a;var c=function(a,b){if(!(a instanceof b))throw new TypeError('Cannot call a class as a function')},d=function(){function a(a,b){for(var c,d=0;d<b.length;d++)c=b[d],c.enumerable=c.enumerable||!1,c.configurable=!0,'value'in c&&(c.writable=!0),Object.defineProperty(a,c.key,c)}return function(b,c,d){return c&&a(b.prototype,c),d&&a(b,d),b}}(),e=Object.assign||function(a){for(var b,c=1;c<arguments.length;c++)for(var d in b=arguments[c],b)Object.prototype.hasOwnProperty.call(b,d)&&(a[d]=b[d]);return a},f={container:!1,delay:0,html:!1,placement:'top',title:'',template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:'hover focus',offset:0},g=function(){function g(a,b){c(this,g),h.call(this),b=e({},f,b),a.jquery&&(a=a[0]),this.reference=a,this.options=b;var d='string'==typeof b.trigger?b.trigger.split(' ').filter(function(a){return-1!==['click','hover','focus'].indexOf(a)}):[];this._isOpen=!1,this._popperOptions={},this._setEventListeners(a,d,b)}return d(g,[{key:'_create',value:function(a,b,c,d){var e=window.document.createElement('div');e.innerHTML=b.trim();var f=e.childNodes[0];f.id='tooltip_'+Math.random().toString(36).substr(2,10),f.setAttribute('aria-hidden','false');var g=e.querySelector(this.innerSelector);return this._addTitleContent(a,c,d,g),f}},{key:'_addTitleContent',value:function(a,c,d,e){if(1===c.nodeType||11===c.nodeType)d&&e.appendChild(c);else if(b(c)){var f=c.call(a);d?e.innerHTML=f:e.textContent=f}else d?e.innerHTML=c:e.textContent=c}},{key:'_show',value:function(b,c){if(this._isOpen&&!this._isOpening)return this;if(this._isOpen=!0,this._tooltipNode)return this._tooltipNode.style.display='',this._tooltipNode.setAttribute('aria-hidden','false'),this.popperInstance.update(),this;var d=b.getAttribute('title')||c.title;if(!d)return this;var f=this._create(b,c.template,d,c.html);b.setAttribute('aria-describedby',f.id);var g=this._findContainer(c.container,b);return this._append(f,g),this._popperOptions=e({},c.popperOptions,{placement:c.placement}),this._popperOptions.modifiers=e({},this._popperOptions.modifiers,{arrow:{element:this.arrowSelector},offset:{offset:c.offset}}),c.boundariesElement&&(this._popperOptions.modifiers.preventOverflow={boundariesElement:c.boundariesElement}),this.popperInstance=new a(b,f,this._popperOptions),this._tooltipNode=f,this}},{key:'_hide',value:function(){return this._isOpen?(this._isOpen=!1,this._tooltipNode.style.display='none',this._tooltipNode.setAttribute('aria-hidden','true'),this):this}},{key:'_dispose',value:function(){var a=this;return this._events.forEach(function(b){var c=b.func,d=b.event;a.reference.removeEventListener(d,c)}),this._events=[],this._tooltipNode&&(this._hide(),this.popperInstance.destroy(),!this.popperInstance.options.removeOnDestroy&&(this._tooltipNode.parentNode.removeChild(this._tooltipNode),this._tooltipNode=null)),this}},{key:'_findContainer',value:function(a,b){return'string'==typeof a?a=window.document.querySelector(a):!1===a&&(a=b.parentNode),a}},{key:'_append',value:function(a,b){b.appendChild(a)}},{key:'_setEventListeners',value:function(a,b,c){var d=this,e=[],f=[];b.forEach(function(a){'hover'===a?(e.push('mouseenter'),f.push('mouseleave')):'focus'===a?(e.push('focus'),f.push('blur')):'click'===a?(e.push('click'),f.push('click')):void 0}),e.forEach(function(b){var e=function(b){!0===d._isOpening||(b.usedByTooltip=!0,d._scheduleShow(a,c.delay,c,b))};d._events.push({event:b,func:e}),a.addEventListener(b,e)}),f.forEach(function(b){var e=function(b){!0===b.usedByTooltip||d._scheduleHide(a,c.delay,c,b)};d._events.push({event:b,func:e}),a.addEventListener(b,e)})}},{key:'_scheduleShow',value:function(a,b,c){var d=this;this._isOpening=!0;var e=b&&b.show||b||0;this._showTimeout=window.setTimeout(function(){return d._show(a,c)},e)}},{key:'_scheduleHide',value:function(a,b,c,d){var e=this;this._isOpening=!1;var f=b&&b.hide||b||0;window.setTimeout(function(){if((window.clearTimeout(e._showTimeout),!1!==e._isOpen)&&document.body.contains(e._tooltipNode)){if('mouseleave'===d.type){var f=e._setTooltipNodeEvent(d,a,b,c);if(f)return}e._hide(a,c)}},f)}},{key:'_updateTitleContent',value:function(a){if('undefined'==typeof this._tooltipNode)return void('undefined'!=typeof this.options.title&&(this.options.title=a));var b=this._tooltipNode.parentNode.querySelector(this.innerSelector);this._clearTitleContent(b,this.options.html,this.reference.getAttribute('title')||this.options.title),this._addTitleContent(this.reference,a,this.options.html,b),this.options.title=a,this.popperInstance.update()}},{key:'_clearTitleContent',value:function(a,b,c){1===c.nodeType||11===c.nodeType?b&&a.removeChild(c):b?a.innerHTML='':a.textContent=''}}]),g}(),h=function(){var a=this;this.show=function(){return a._show(a.reference,a.options)},this.hide=function(){return a._hide()},this.dispose=function(){return a._dispose()},this.toggle=function(){return a._isOpen?a.hide():a.show()},this.updateTitleContent=function(b){return a._updateTitleContent(b)},this.arrowSelector='.tooltip-arrow, .tooltip__arrow',this.innerSelector='.tooltip-inner, .tooltip__inner',this._events=[],this._setTooltipNodeEvent=function(b,c,d,e){var f=b.relatedreference||b.toElement||b.relatedTarget;return!!a._tooltipNode.contains(f)&&(a._tooltipNode.addEventListener(b.type,function d(f){var g=f.relatedreference||f.toElement||f.relatedTarget;a._tooltipNode.removeEventListener(b.type,d),c.contains(g)||a._scheduleHide(c,e.delay,e,f)}),!0)}};return g});
5
+ //# sourceMappingURL=tooltip.min.js.map
@@ -0,0 +1,2145 @@
1
+ import Tooltip from './tooltip.min.js';
2
+
3
+ /**
4
+ * Copyright (c) 2001-present, Vonage.
5
+ *
6
+ * Core of volta
7
+ */
8
+ 'use strict';
9
+ var Volta;
10
+
11
+ Volta = function (){
12
+ return {
13
+ _closest: closest,
14
+ _hasClass: hasClass,
15
+ init: initialise,
16
+ _isMobile: isMobileDevice,
17
+ _getElementSiblings: getElementSiblings,
18
+ _getFunction: getFunctionFromString,
19
+ _removeFromArr: removeFromArr
20
+ }
21
+
22
+ /**
23
+ * @private
24
+ *
25
+ * @description Finds the first ancestor of the given element, matching a specific selector.
26
+ * @param {HTMLElement} element Starting element
27
+ * @param {string} selector Selector to find (can be .class, #id, div...)
28
+ * @param {string} stopSelector Selector to stop searching on (can be .class, #id, div...)
29
+ * @returns {HTMLElement|null} The matched element or null if no element is found
30
+ */
31
+ function closest(element, selector, stopSelector) {
32
+ var match = null;
33
+ while (element) {
34
+ if (element.matches(selector)) {
35
+ match = element;
36
+ break
37
+ } else if (stopSelector && element.matches(stopSelector)) {
38
+ break
39
+ }
40
+ element = element.parentElement;
41
+ }
42
+ return match;
43
+ }
44
+
45
+ /**
46
+ * @private
47
+ * @description Given the name of a function returns the function itself
48
+ * @param {string} callbackFnName The function name e.g. "testFunction" OR "test.function"
49
+ * @returns {Function}
50
+ */
51
+ function getFunctionFromString(fnName) {
52
+ var fn;
53
+
54
+ if(fnName) {
55
+ var fnNames = fnName.split(".");
56
+ var fn = window;
57
+ for(var i = 0; i < fnNames.length; i++) {
58
+ fn = fn[fnNames[i]];
59
+ }
60
+ }
61
+
62
+ return fn;
63
+ }
64
+
65
+ /**
66
+ * @private
67
+ * @description Get all siblings of an element
68
+ * @param {HTMLElement} el
69
+ */
70
+ function getElementSiblings(element) {
71
+ var siblings = [];
72
+ element = element.parentNode.firstChild;
73
+ do {
74
+ if(element.nodeType === 1) {
75
+ siblings.push(element);
76
+ }
77
+ } while (element = element.nextSibling);
78
+ return siblings;
79
+ }
80
+
81
+ /**
82
+ * @private
83
+ *
84
+ * @description Check if the given element has a particular class
85
+ * @param {HTMLElement} el Element to evaluate
86
+ * @param {string} className Class name to check for
87
+ * @returns {boolean} True if the element has the class or false if not
88
+ */
89
+ function hasClass(element, className) {
90
+ if(!element) {
91
+ return false;
92
+ }
93
+ return (" " + element.className + " ").replace(/[\n\t]/g, " ").indexOf(" " + className+ " ") > -1;
94
+ }
95
+
96
+ /**
97
+ * @private
98
+ *
99
+ * @description Is the current device a mobile
100
+ * @returns {boolean} True if mobile false if not
101
+ */
102
+ function isMobileDevice() {
103
+ var isMobile = /Android|webOS|iPhone|iPad|BlackBerry|Windows Phone|Opera Mini|IEMobile|Mobile/i;
104
+
105
+ return isMobile.test(navigator.userAgent);
106
+ }
107
+
108
+ /**
109
+ * @public
110
+ *
111
+ * @description Initailise volta with required components
112
+ * @param {Array} components Array of strings, names of the components to initialise
113
+ */
114
+ function initialise(components) {
115
+ polyfilsForIE11();
116
+
117
+ if(components.indexOf('accordion') !== -1){
118
+ if(Volta.accordion) {
119
+ Volta.accordion.init();
120
+ } else {
121
+ console.warn('Volta: volta.accordion.js component missing')
122
+ }
123
+ }
124
+ if(components.indexOf('callout') !== -1){
125
+ if(Volta.callout) {
126
+ Volta.callout.init();
127
+ } else {
128
+ console.warn('Volta: volta.callout.js component missing')
129
+ }
130
+ }
131
+ if(components.indexOf('badge') !== -1){
132
+ if(Volta.badge) {
133
+ Volta.badge.init();
134
+ } else {
135
+ console.warn('Volta: volta.badge.js component missing')
136
+ }
137
+ }
138
+ if(components.indexOf('dropdown') !== -1){
139
+ if(Volta.dropdown) {
140
+ Volta.dropdown.init();
141
+ } else {
142
+ console.warn('Volta: volta.dropdown.js component missing')
143
+ }
144
+ }
145
+ if(components.indexOf('flash') !== -1){
146
+ if(Volta.flash) {
147
+ Volta.flash.init();
148
+ } else {
149
+ console.warn('Volta: volta.dropdown.js component missing')
150
+ }
151
+ }
152
+ if(components.indexOf('menu') !== -1){
153
+ if(Volta.menu) {
154
+ Volta.menu.init();
155
+ } else {
156
+ console.warn('Volta: volta.menu.js component missing')
157
+ }
158
+ }
159
+ if(components.indexOf('menuCollapse') !== -1){
160
+ if(Volta.menuCollapse) {
161
+ Volta.menuCollapse.init();
162
+ } else {
163
+ console.warn('Volta: volta.menuCollapse.js component missing')
164
+ }
165
+ }
166
+ if(components.indexOf('modal') !== -1){
167
+ if(Volta.modal) {
168
+ Volta.modal.init();
169
+ } else {
170
+ console.warn('Volta: volta.modal.js component missing')
171
+ }
172
+ }
173
+ if(components.indexOf('tab') !== -1){
174
+ if(Volta.tab) {
175
+ Volta.tab.init();
176
+ } else {
177
+ console.warn('Volta: volta.tab.js component missing')
178
+ }
179
+ }
180
+ if(components.indexOf('table') !== -1){
181
+ if(Volta.table) {
182
+ Volta.table.init();
183
+ } else {
184
+ console.warn('Volta: volta.table.js component missing')
185
+ }
186
+ }
187
+ if(components.indexOf('tooltip') !== -1){
188
+ if(Volta.tooltip) {
189
+ Volta.tooltip.init();
190
+ } else {
191
+ console.warn('Volta: volta.tooltip.js component missing')
192
+ }
193
+ }
194
+ }
195
+
196
+ /**
197
+ * @private
198
+ *
199
+ * @description Remove an element from an array
200
+ * @param {Array} arr The array containing the element
201
+ * @param {Element} element The element to remove
202
+ * @returns {Array} The array minus the element
203
+ */
204
+ function removeFromArr(arr, element) {
205
+ var index = arr.indexOf(element);
206
+ arr.splice(index, 1);
207
+ return arr;
208
+ }
209
+
210
+ /**
211
+ * @private
212
+ *
213
+ */
214
+ function polyfilsForIE11() {
215
+ if (window.NodeList && !NodeList.prototype.forEach) {
216
+ NodeList.prototype.forEach = function (callback, thisArg) {
217
+ thisArg = thisArg || window;
218
+ for (var i = 0; i < this.length; i++) {
219
+ callback.call(thisArg, this[i], i, this);
220
+ }
221
+ };
222
+ }
223
+
224
+ if (!Element.prototype.matches) {
225
+ Element.prototype.matches =
226
+ Element.prototype.matchesSelector ||
227
+ Element.prototype.mozMatchesSelector ||
228
+ Element.prototype.msMatchesSelector ||
229
+ Element.prototype.oMatchesSelector ||
230
+ Element.prototype.webkitMatchesSelector ||
231
+ function(s) {
232
+ var matches = (this.document || this.ownerDocument).querySelectorAll(s),
233
+ i = matches.length;
234
+ while (--i >= 0 && matches.item(i) !== this) {}
235
+ return i > -1;
236
+ };
237
+ }
238
+ }
239
+ }();
240
+
241
+ /**
242
+ * Copyright (c) 2001-present, Vonage.
243
+ *
244
+ * Accordions (requires core)
245
+ */
246
+
247
+ 'use strict';
248
+
249
+ Volta.accordion = function () {
250
+ var _class = {
251
+ standard: {
252
+ container: 'Vlt-accordion',
253
+ containerGroup: 'Vlt-accordion--group',
254
+ trigger: 'Vlt-accordion__trigger',
255
+ triggerActive: 'Vlt-accordion__trigger_active',
256
+ content: 'Vlt-accordion__content',
257
+ contentOpen: 'Vlt-accordion__content_open',
258
+ contentOpening: 'Vlt-accordion__content_opening',
259
+ contentClosing: 'Vlt-accordion__content_closing',
260
+ },
261
+ js: {
262
+ content: 'Vlt-js-accordion__content',
263
+ contentOpen: 'Vlt-js-accordion__content_open',
264
+ contentOpening: 'Vlt-js-accordion__content_opening',
265
+ contentClosing: 'Vlt-js-accordion__content_closing',
266
+ trigger: 'Vlt-js-accordion__trigger',
267
+ triggerActive: 'Vlt-js-accordion__trigger_active'
268
+ }
269
+ }
270
+
271
+ function Accordion() {}
272
+
273
+ Accordion.prototype = {
274
+ init: function(element, suppressClickHandler, triggerElem) {
275
+ if(this.isStandard) {
276
+ this._initStandard(element, suppressClickHandler);
277
+ } else {
278
+ this._initJs(element, suppressClickHandler, triggerElem);
279
+ }
280
+ },
281
+ _initStandard: function(element, suppressClickHandler) {
282
+ var self = this;
283
+
284
+ if(!suppressClickHandler) {
285
+ element.querySelectorAll('.' + _class.standard.trigger).forEach(function(trigger) {
286
+ var parent = Volta._closest(trigger, '.' + _class.standard.container, _class.standard.container);
287
+
288
+ if(parent && parent == element) {
289
+ trigger.addEventListener('click', function(){
290
+ self.toggle(trigger);
291
+ });
292
+ }
293
+ });
294
+ }
295
+ },
296
+ _initJs: function(element, suppressClickHandler, triggerElem) {
297
+ this._content = element;
298
+
299
+ if(triggerElem) {
300
+ this.trigger = triggerElem;
301
+ } else if(this._content.dataset.trigger) {
302
+ var triggerId = this._content.dataset.trigger;
303
+ this.trigger = document.querySelector('#' + triggerId);
304
+ } else {
305
+ console.warn("Volta: js accordion trigger missing");
306
+ }
307
+
308
+ var self = this;
309
+ if(!suppressClickHandler && this.trigger) {
310
+ this.trigger.addEventListener('click', function(){
311
+ self.toggle();
312
+ });
313
+ }
314
+ },
315
+ close: function(trigger) {
316
+ var panel = this._content || trigger.nextElementSibling;
317
+ var trigger = this.trigger || trigger;
318
+ var classes = this.trigger ? _class.js : _class.standard;
319
+
320
+ trigger.classList.remove(classes.triggerActive);
321
+ panel.classList.add(classes.contentClosing);
322
+
323
+ panel.style.height = window.getComputedStyle(panel).height;
324
+ panel.offsetHeight; // force repaint
325
+ panel.style.height = '0px';
326
+ panel.classList.remove(classes.contentOpen);
327
+
328
+ var self = this;
329
+ panel.addEventListener('transitionend', function closingTransitionEndEvent(event) {
330
+ if (event.propertyName == 'height' && Volta._hasClass(panel, classes.contentClosing)) {
331
+ panel.classList.remove(classes.contentClosing);
332
+ panel.style.height = '0px';
333
+ panel.removeEventListener('transitionend', closingTransitionEndEvent, false);
334
+
335
+ if(self.isGroup && self._isTriggerActive(trigger, true)){
336
+ self._activeGroupTrigger = undefined;
337
+ }
338
+ }
339
+ }, { passive: true, once: true });
340
+ },
341
+ isOpening: false,
342
+ _activeGroupTrigger: undefined,
343
+ _isTriggerActive: function(trigger, match) {
344
+ return (this.isGroup && this._activeGroupTrigger && (!match || this._activeGroupTrigger === trigger)) || Volta._hasClass(trigger, _class.standard.triggerActive);
345
+ },
346
+ open: function(trigger) {
347
+ if(!this.trigger) {
348
+ if(this._isTriggerActive(trigger, false)) {
349
+ this.close(this._activeGroupTrigger || trigger);
350
+ }
351
+ if(this.isGroup) {
352
+ this._activeGroupTrigger = trigger;
353
+ }
354
+ }
355
+
356
+ var trig = this.trigger || trigger;
357
+ var classes = this.trigger ? _class.js : _class.standard;
358
+ var panel = this._content || trig.nextElementSibling;
359
+
360
+ this.isOpening = true;
361
+
362
+ trig.classList.add(classes.triggerActive);
363
+ panel.classList.add(classes.contentOpening);
364
+
365
+ var startHeight = panel.style.height;
366
+ panel.style.height = 'auto';
367
+ var endHeight = window.getComputedStyle(panel).height;
368
+ panel.style.height = startHeight;
369
+ panel.offsetHeight; // force repaint
370
+ panel.style.height = endHeight;
371
+
372
+ var self = this;
373
+ panel.addEventListener('transitionend', function openingTransitionEndEvent(event) {
374
+ if (event.propertyName == 'height' && Volta._hasClass(panel, classes.contentOpening)) {
375
+ panel.style.height = 'auto';
376
+ panel.classList.remove(classes.contentOpening);
377
+ panel.classList.add(classes.contentOpen);
378
+ panel.removeEventListener('transitionend', openingTransitionEndEvent, false);
379
+ self.isOpening = false;
380
+ }
381
+ }, { passive: true, once: true });
382
+ },
383
+ toggle: function(trigger) {
384
+ if(this.isOpening) {
385
+ return false;
386
+ }
387
+ if((this.trigger && Volta._hasClass(this._content, _class.js.contentOpen))
388
+ || (!this.trigger && this._isTriggerActive(trigger, true))) {
389
+ this.close(trigger);
390
+ } else {
391
+ this.open(trigger);
392
+ }
393
+ }
394
+ }
395
+
396
+ return {
397
+ create: create,
398
+ init: initialise
399
+ }
400
+
401
+ /**
402
+ * @public
403
+ *
404
+ * @description Create an individual accordion object
405
+ * @param {Element|string} elementOrId Reference to the accordion content element or the id
406
+ * @param {Boolean} suppressClickHandler Whether click events should be attached on creation
407
+ * @param {Element} trigger Private required for legacy accordions
408
+ * @param {Boolean} isGroup Private required for legacy accordions
409
+ * @return {Object}
410
+ */
411
+ function create(elementOrId, suppressClickHandler, trigger, isGroup, isStandard) {
412
+ if(!elementOrId) {
413
+ console.warn("Volta: no parameter supplied to accordion.create()");
414
+ }
415
+ var accordion = Object.create(Accordion.prototype, {});
416
+ var element = getElement(elementOrId);
417
+
418
+ Object.defineProperties(accordion, {
419
+ 'isStandard': {
420
+ value: isStandard || Volta._hasClass(element, _class.standard.container),
421
+ writable: false
422
+ }
423
+ });
424
+
425
+ Object.defineProperties(accordion, {
426
+ 'isGroup': {
427
+ value: isGroup,
428
+ writable: false
429
+ }
430
+ });
431
+
432
+ accordion.init(element, suppressClickHandler, trigger);
433
+
434
+ return accordion;
435
+ }
436
+
437
+ /**
438
+ * @public
439
+ *
440
+ * @description Initialise all the accordions on the current screen
441
+ */
442
+ function initialise() {
443
+ //standard
444
+ var standardAccordions = document.querySelectorAll('.' + _class.standard.container);
445
+
446
+ if(standardAccordions.length) {
447
+ standardAccordions.forEach(function(accordion){
448
+ create(accordion, false, null, Volta._hasClass(accordion, _class.standard.containerGroup), true);
449
+ });
450
+ }
451
+
452
+ //js
453
+ var triggers = document.querySelectorAll('.' + _class.js.trigger + '[data-accordion]');
454
+ if(triggers.length > 0) {
455
+ triggers.forEach(function(trigger) {
456
+ var accordionId = trigger.dataset.accordion;
457
+ if(!accordionId) {
458
+ return;
459
+ }
460
+ create(accordionId, false, trigger);
461
+ });
462
+ }
463
+
464
+ //js - legacy
465
+ var jsAccordions = document.querySelectorAll('.' + _class.js.content + '[data-trigger]');
466
+ if(jsAccordions.length > 0) {
467
+ jsAccordions.forEach(function(jsLegacy) {
468
+ create(jsLegacy);
469
+ });
470
+ }
471
+ }
472
+
473
+ /**
474
+ * @private
475
+ */
476
+ function getElement(elementOrId) {
477
+ var element;
478
+
479
+ if(elementOrId.classList) {
480
+ element = elementOrId;
481
+ } else if (elementOrId.substring(0, 1) === "#") {
482
+ element = document.querySelector(elementOrId);
483
+ } else {
484
+ element = document.querySelector('#' + elementOrId);
485
+ }
486
+
487
+ return element;
488
+ }
489
+ }();
490
+
491
+ /**
492
+ * Copyright (c) 2001-present, Vonage.
493
+ *
494
+ * Badges (requires core)
495
+ */
496
+
497
+ 'use strict';
498
+
499
+ Volta.badge = function () {
500
+ var _class = {
501
+ badge: 'Vlt-badge',
502
+ dismiss: 'Vlt-badge__dismiss',
503
+ dismissed: 'Vlt-badge--dismissed'
504
+ }
505
+
506
+ return {
507
+ dismiss: dismiss,
508
+ init: attachBadgeHandlers
509
+ }
510
+
511
+ /**
512
+ * @public
513
+ *
514
+ * @description Attach a one time listener to dismissable badges
515
+ */
516
+ function attachBadgeHandlers() {
517
+ document.querySelectorAll('.' + _class.dismiss).forEach(create);
518
+ }
519
+
520
+ /**
521
+ * @private
522
+ *
523
+ * @description Create a badge
524
+ * @param {HTMLElement} badge
525
+ */
526
+ function create(badgeOrDismiss) {
527
+ var badge, badgeDismiss;
528
+
529
+ if(Volta._hasClass(badgeOrDismiss, _class.badge)) {
530
+ badge = badgeOrDismiss;
531
+ badgeDismiss = badge.querySelector('.' + _class.dismiss);
532
+ } else if(Volta._hasClass(badgeOrDismiss, _class.dismiss)){
533
+ badgeDismiss = badgeOrDismiss;
534
+ badge = badgeDismiss.parentElement;
535
+ }
536
+
537
+ badgeDismiss.addEventListener('click', function(){
538
+ dismiss(badge);
539
+ }, { once : true});
540
+ }
541
+
542
+ /**
543
+ * @public
544
+ *
545
+ * @description Dismiss a badge
546
+ * @param {HTMLElement} badge
547
+ */
548
+ function dismiss(badge) {
549
+ badge.classList.add(_class.dismissed);
550
+
551
+ if(badge.dataset.callback) {
552
+ return Volta._getFunction(badgeWrapper.dataset.callback)();
553
+ }
554
+ }
555
+ }();
556
+ /**
557
+ * Copyright (c) 2001-present, Vonage.
558
+ *
559
+ * Callouts (requires core)
560
+ */
561
+
562
+ 'use strict';
563
+
564
+ Volta.callout = function () {
565
+ var _class = {
566
+ callout: 'Vlt-callout',
567
+ dismiss: 'Vlt-callout__dismiss',
568
+ dismissed: 'Vlt-callout--dismissed'
569
+ }
570
+
571
+ return {
572
+ dismiss: dismiss,
573
+ init: attachCalloutHandlers
574
+ }
575
+
576
+ /**
577
+ * @public
578
+ *
579
+ * @description Attach a one time listener to dismissable callouts
580
+ */
581
+ function attachCalloutHandlers() {
582
+ document.querySelectorAll('.' + _class.dismiss).forEach(create);
583
+ }
584
+
585
+ /**
586
+ * @private
587
+ *
588
+ * @description Create a callout
589
+ * @param {HTMLElement} callout
590
+ */
591
+ function create(calloutOrDismiss) {
592
+ var callout, calloutDismiss;
593
+
594
+ if(Volta._hasClass(calloutOrDismiss, _class.callout)) {
595
+ callout = calloutOrDismiss;
596
+ calloutDismiss = callout.querySelector('.' + _class.dismiss);
597
+ } else if(Volta._hasClass(calloutOrDismiss, _class.dismiss)){
598
+ calloutDismiss = calloutOrDismiss;
599
+ callout = calloutDismiss.parentElement;
600
+ }
601
+
602
+ calloutDismiss.addEventListener('click', function(){
603
+ dismiss(callout);
604
+ }, { once : true});
605
+ }
606
+
607
+ /**
608
+ * @public
609
+ *
610
+ * @description Dismiss a callout
611
+ * @param {HTMLElement} callout
612
+ */
613
+ function dismiss(callout) {
614
+ callout.classList.add(_class.dismissed);
615
+
616
+ if(callout.dataset.callback) {
617
+ return Volta._getFunction(calloutWrapper.dataset.callback)();
618
+ }
619
+ }
620
+ }();
621
+ /**
622
+ * Copyright (c) 2001-present, Vonage.
623
+ *
624
+ * Dropdowns (requires core)
625
+ */
626
+
627
+ 'use strict';
628
+
629
+ Volta.dropdown = function () {
630
+ var _class = {
631
+ wrapper: 'Vlt-dropdown',
632
+ block: 'Vlt-dropdown__block',
633
+ btn: 'Vlt-dropdown__trigger',
634
+ btnLegacy: 'Vlt-dropdown__btn',
635
+ dismissed: 'Vlt-callout--dismissed',
636
+ expanded: 'Vlt-dropdown--expanded',
637
+ label: 'Vlt-dropdown__label',
638
+ link: 'Vlt-dropdown__link',
639
+ noCloseLink: 'Vlt-dropdown__link--noclose',
640
+ noCloseBlock: 'Vlt-dropdown__block--noclose',
641
+ panel: 'Vlt-dropdown__panel',
642
+ panelContent: 'Vlt-dropdown__panel__content',
643
+ selection: 'Vlt-dropdown__selection',
644
+ switch: 'Vlt-switch',
645
+ switchSlider: 'Vlt-switch__slider'
646
+ }
647
+
648
+ function Dropdown() {}
649
+
650
+ Dropdown.prototype = {
651
+ init: function(element, supressClickHandler) {
652
+ this.dropdown = element;
653
+ this.selection = this.dropdown.querySelector('.' + _class.selection);
654
+ this.isSelectionVisible = !!this.selection;
655
+ this.btn = this.dropdown.querySelector('.' + _class.btn) || this.dropdown.querySelector('.' + _class.btnLegacy);
656
+ this._suppress = supressClickHandler;
657
+
658
+ if(!this._suppress) {
659
+ this._addEventListener();
660
+ }
661
+ },
662
+ _addEventListener: function(){
663
+ var openHandler = this.open.bind(this);
664
+ this.dropdown.addEventListener('click', openHandler, { once: true })
665
+ },
666
+ close: function(text) {
667
+ if(text) {
668
+ this._setDropdownSelectionText(text);
669
+ }
670
+ this.dropdown.classList.remove(_class.expanded);
671
+
672
+ if(!this._suppress){
673
+ this._addEventListener();
674
+ }
675
+
676
+ },
677
+ _closeEventHandler: undefined,
678
+ _closeEvent: function(e) {
679
+ var targetIsPanel = Volta._hasClass(e.target, _class.panel);
680
+ var parentIsPanel = Volta._closest(e.target, '.' + _class.panelContent, _class.panel) !== null;
681
+ var parentLink = Volta._closest(e.target, '.' + _class.link, _class.wrapper);
682
+ var parentIsLink = parentLink && parentLink.length === 1;
683
+ var isSwitchSlider = Volta._hasClass(e.target, _class.switchSlider);
684
+ var isParentSwitch = Volta._closest(e.target,'.' + _class.switch, _class.link);
685
+ var isNoClose = Volta._hasClass(e.target, _class.noCloseLink) || Volta._hasClass(e.target, _class.noCloseBlock);
686
+ var isNoCloseParent = Volta._closest(e.target,'.' + _class.noCloseLink, _class.link) || Volta._closest(e.target,'.' + _class.noCloseBlock, _class.noCloseBlock);
687
+ var isInput = e.target instanceof HTMLInputElement;
688
+
689
+ if(!targetIsPanel && !parentIsPanel && !parentIsLink && !isNoClose && !isInput && !isNoCloseParent) {
690
+ e.preventDefault();
691
+ e.stopPropagation();
692
+ }
693
+
694
+ if(isSwitchSlider || isParentSwitch || isNoClose || isInput || isNoCloseParent) {
695
+ return null;
696
+ }
697
+
698
+ var text;
699
+ if(parentIsPanel && Volta._hasClass(e.target, _class.label)) {
700
+ text = e.target.innerHTML;
701
+ } else if (parentIsPanel) {
702
+ var label = e.target.querySelector('.' + _class.label);
703
+ if(label) {
704
+ text = label.innerHTML;
705
+ }
706
+ }
707
+
708
+ this.close(text);
709
+
710
+ document.querySelector('body').removeEventListener('click', this._closeEventHandler );
711
+ },
712
+ open: function(event) {
713
+ if(event) {
714
+ event.preventDefault();
715
+ event.stopPropagation();
716
+ }
717
+
718
+ this.dropdown.classList.add(_class.expanded);
719
+
720
+ if(!this._suppress){
721
+ this._closeEventHandler = this._closeEvent.bind(this);
722
+ document.querySelector('body').addEventListener('click', this._closeEventHandler );
723
+ }
724
+ },
725
+ _setDropdownSelectionText: function(text) {
726
+ if(this.isSelectionVisible) {
727
+ this.selection.innerText = text;
728
+ } else {
729
+ this.btn.innerText = text;
730
+ this.btn.value = text;
731
+ }
732
+ },
733
+ _suppress: false
734
+ }
735
+
736
+ return {
737
+ create: create,
738
+ init: attachDropdownHandlers
739
+ }
740
+
741
+ /**
742
+ * @public
743
+ *
744
+ * @description Attach a listeners to dropdowns
745
+ */
746
+ function attachDropdownHandlers() {
747
+ document.querySelectorAll('.' + _class.wrapper).forEach(attachHandler);
748
+
749
+ function attachHandler(dropdown) {
750
+ create(dropdown);
751
+ }
752
+ }
753
+
754
+ /**
755
+ * @private
756
+ *
757
+ * @description Create a dropdown element
758
+ * @param {HTMLElement} element
759
+ */
760
+ function create(element){
761
+ var dropdown = Object.create(Dropdown.prototype, {})
762
+ dropdown.init(element);
763
+ return dropdown;
764
+ }
765
+ }();
766
+ /**
767
+ * Copyright (c) 2001-present, Vonage.
768
+ *
769
+ * Tabs (requires core)
770
+ */
771
+
772
+ 'use strict';
773
+
774
+ Volta.flash = function () {
775
+ var _class = {
776
+ flash: 'Vlt-flash',
777
+ trigger: 'Vlt-flash-trigger',
778
+ visible: 'Vlt-flash_visible'
779
+ }
780
+
781
+ var gap = 20,
782
+ openBottomFlashes = [],
783
+ openTopFlashes = [],
784
+ timeouts =[];
785
+
786
+ return {
787
+ closeAll: closeAll,
788
+ init: attachFlashHandlers,
789
+ show: show
790
+ }
791
+
792
+ /**
793
+ * @public
794
+ *
795
+ * @description Attach a click listener to each flash's trigger on the screen
796
+ * @param {HTMLElement} element
797
+ */
798
+ function attachFlashHandlers() {
799
+ var triggers = document.querySelectorAll('.' + _class.trigger);
800
+
801
+ if(triggers.length === 0) {
802
+ return;
803
+ }
804
+
805
+ triggers.forEach(attachHandler);
806
+
807
+ function attachHandler(trigger) {
808
+ trigger.addEventListener('click', function() {
809
+ if(trigger.dataset.flash) {
810
+ var flash = document.querySelector('#' + trigger.dataset.flash);
811
+ show(flash);
812
+ } else {
813
+ console.warn("Volta: flash trigger is missing data-flash attribute");
814
+ }
815
+ });
816
+ }
817
+ }
818
+
819
+ /**
820
+ * @public
821
+ *
822
+ * @description Close all open flashes
823
+ */
824
+ function closeAll() {
825
+ if(timeouts.length > 0) {
826
+ timeouts.forEach(function(timeout){
827
+ clearTimeout(timeout);
828
+ });
829
+ }
830
+ if(openBottomFlashes.length > 0) {
831
+ clearQueue(openBottomFlashes);
832
+ }
833
+ if(openTopFlashes.length > 0) {
834
+ clearQueue(openTopFlashes);
835
+ }
836
+
837
+ timeouts = [];
838
+ openBottomFlashes = [];
839
+ openTopFlashes = [];
840
+
841
+ function clearQueue(elementArr) {
842
+ elementArr.forEach(function(element){
843
+ _hide(element);
844
+ });
845
+ elementArr = [];
846
+ }
847
+ }
848
+
849
+ /**
850
+ * @public
851
+ *
852
+ * @description Show the flash
853
+ * @param {HTMLElement} element
854
+ */
855
+ function show(elementOrId, time) {
856
+ if(!elementOrId || elementOrId.length == 0) {
857
+ return;
858
+ }
859
+
860
+ time = time || 5000;
861
+
862
+ var element = !elementOrId.classList ? document.querySelector('#' + elementOrId) : elementOrId;
863
+ var position = Volta._hasClass(element, 'Vlt-flash--bottom') ? 'bottom' : 'top';
864
+ var arr = position === 'bottom' ? openBottomFlashes : openTopFlashes;
865
+
866
+ if(arr.indexOf(element) !== -1) {
867
+ return;
868
+ }
869
+
870
+ _setFlashPosition(arr, element, position);
871
+
872
+ arr.push(element);
873
+
874
+ element.classList.add(_class.visible);
875
+
876
+ var hideTimeout = setTimeout(function(){
877
+ _hide(element, true);
878
+ Volta._removeFromArr(timeouts, hideTimeout);
879
+ }, time);
880
+
881
+ timeouts.push(hideTimeout);
882
+ }
883
+
884
+ /**
885
+ * @private
886
+ * @description Hide the flash
887
+ * @param {HTMLElement} element
888
+ */
889
+ function _hide(element, shouldRemove) {
890
+ var position = Volta._hasClass(element, 'Vlt-flash--bottom') ? 'bottom' : 'top';
891
+ var arr = position === 'bottom' ? openBottomFlashes : openTopFlashes;
892
+
893
+ if(shouldRemove) {
894
+ Volta._removeFromArr(arr, element);
895
+ }
896
+
897
+ _updateFlashPositions(arr, element, position);
898
+
899
+ element.style[position] = '';
900
+ element.classList.remove(_class.visible);
901
+ }
902
+
903
+ /**
904
+ * @private
905
+ * @description Set the position of the flash
906
+ * @param {HTMLElement} element
907
+ */
908
+ function _setFlashPosition(arr, element, position) {
909
+ var positionPx = arr.reduce(function(px, flash) {
910
+ return px + flash.clientHeight;
911
+ }, 0);
912
+ if(positionPx > 0) {
913
+ element.style[position] = (gap * arr.length) + gap + positionPx + 'px';
914
+ }
915
+ }
916
+
917
+ /**
918
+ * @private
919
+ * @description Update the position of all the visible flashes
920
+ * @param {Array} arr
921
+ * @param {HTMLElement} element
922
+ * @param {string} position
923
+ */
924
+ function _updateFlashPositions(arr, element, position){
925
+ if(arr.length > 0) {
926
+ var elementHeight = element.clientHeight;
927
+
928
+ arr.forEach(function(flash) {
929
+ var newPosition;
930
+
931
+ if(position === 'bottom') {
932
+ newPosition = Number(flash.style.bottom.substring(0, flash.style.bottom.length - 2));
933
+ } else {
934
+ newPosition = flash.getBoundingClientRect()[position];
935
+ }
936
+ flash.style[position] = newPosition -elementHeight - gap + "px";
937
+ });
938
+ }
939
+ }
940
+ }();
941
+ /**
942
+ * Copyright (c) 2001-present, Vonage.
943
+ *
944
+ * Modals (requires core)
945
+ */
946
+
947
+ 'use strict';
948
+
949
+ Volta.modal = function () {
950
+ var _class = {
951
+ auto: 'Vlt-modal--auto',
952
+ bodyModalOpen: 'Vlt-body--modal-open',
953
+ cancel: 'Vlt-modal__cancel',
954
+ confirm: 'Vlt-modal__confirm',
955
+ content: 'Vlt-modal__content',
956
+ modal: 'Vlt-modal',
957
+ out: 'Vlt-modal--out',
958
+ panel: 'Vlt-modal__panel',
959
+ trigger: 'Vlt-modal-trigger',
960
+ visible: 'Vlt-modal_visible',
961
+ dismiss: 'Vlt-modal__dismiss',
962
+ }
963
+
964
+ var body,
965
+ dismissModalHandler,
966
+ cancelModalHandler,
967
+ confirmModalHandler,
968
+ escHandler,
969
+ clickHandler,
970
+ escAttached;
971
+
972
+ function Modal() {}
973
+
974
+ Modal.prototype = {
975
+ attachButtons: function() {
976
+ var _this = this;
977
+ _this.dismissBtn = _this.modal.querySelector('.' + _class.dismiss);
978
+
979
+ if(_this.dismissBtn) {
980
+ dismissModalHandler = dismissModal.bind(_this);
981
+ _this.dismissBtn.addEventListener('click', dismissModalHandler);
982
+ }
983
+
984
+ _this.cancelBtn = _this.modal.querySelector('.' + _class.cancel);
985
+
986
+ if(_this.cancelBtn) {
987
+ cancelModalHandler = cancelModal.bind(_this);
988
+ _this.cancelBtn.addEventListener('click', cancelModalHandler);
989
+ }
990
+
991
+ _this.confirmBtn = _this.modal.querySelector('.' + _class.confirm);
992
+
993
+ if(_this.confirmBtn) {
994
+ confirmModalHandler = confirmModal.bind(_this);
995
+ _this.confirmBtn.addEventListener('click', confirmModalHandler);
996
+ }
997
+ },
998
+ html: function(newHtml) {
999
+ this.modal.innerHTML = newHtml;
1000
+ return this;
1001
+ },
1002
+ init: function(elementOrId) {
1003
+ if(elementOrId.length) {
1004
+ this.modal = document.querySelector('#' + elementOrId);
1005
+ } else {
1006
+ this.modal = elementOrId;
1007
+ }
1008
+
1009
+ this._callback = Volta._getFunction(this.modal.dataset.callback);
1010
+ },
1011
+ open: function(e) {
1012
+ if(e && e.preventDefault) {
1013
+ e.preventDefault();
1014
+ e.stopPropagation();
1015
+ }
1016
+
1017
+ this.modal.classList.remove(_class.out);
1018
+ this.modal.classList.add(_class.visible);
1019
+ this.attachButtons();
1020
+
1021
+ disableScroll();
1022
+
1023
+ if(!escAttached && !this.modal.dataset.disableEsc || this.modal.dataset.disableEsc === "false") {
1024
+ escHandler = closeModalOnEscape.bind(this);
1025
+ body.addEventListener('keyup', escHandler, { once: true });
1026
+ escAttached = true;
1027
+ }
1028
+
1029
+ if(!this.modal.dataset.disableClick || this.modal.dataset.disableClick === "false") {
1030
+ clickHandler = closeModalOnClick.bind(this);
1031
+ this.modal.addEventListener('click', clickHandler, { once: true });
1032
+ }
1033
+ },
1034
+ dismiss: function(e, confirmed) {
1035
+ var _this = this;
1036
+
1037
+ if(e && e.preventDefault) {
1038
+ e.preventDefault();
1039
+ e.stopPropagation();
1040
+ }
1041
+
1042
+ enableScroll();
1043
+
1044
+ if(_this.modal){
1045
+ _this.modal.classList.remove(_class.visible);
1046
+ _this.modal.classList.add(_class.out);
1047
+ }
1048
+
1049
+ if(_this._callback) {
1050
+ _this._callback(confirmed);
1051
+ }
1052
+
1053
+ removeModal(_this);
1054
+ }
1055
+ }
1056
+
1057
+ return {
1058
+ create: create,
1059
+ init: attachModalHandlers
1060
+ }
1061
+
1062
+ /**
1063
+ * @public
1064
+ *
1065
+ * @description Attach a click listener to each modals trigger on the screen, which will open the modal
1066
+ */
1067
+ function attachModalHandlers() {
1068
+ if(!body) {
1069
+ body = document.querySelector('body');
1070
+ }
1071
+
1072
+ var triggers = document.querySelectorAll('.' + _class.trigger);
1073
+
1074
+ if(triggers.length > 0) {
1075
+ triggers.forEach(attachTriggerHandler);
1076
+ }
1077
+
1078
+ //Not the recommended way to use modals
1079
+ var modals = document.querySelectorAll('.' + _class.modal);
1080
+
1081
+ if(modals.length > 0) {
1082
+ modals.forEach(attachModalHandler);
1083
+ }
1084
+
1085
+ function attachModalHandler(modal) {
1086
+ if(Volta._hasClass(modal, _class.auto)) {
1087
+ var trigger = document.querySelector('#' + modal.dataset.trigger);
1088
+ trigger.addEventListener('click', function() {
1089
+ create(modal).open();
1090
+ });
1091
+ }
1092
+ }
1093
+
1094
+ function attachTriggerHandler(trigger) {
1095
+ if(trigger.dataset.modal) {
1096
+ var modal = document.querySelector('#' + trigger.dataset.modal);
1097
+
1098
+ if(!modal) {
1099
+ console.warn('Volta: modal ' + trigger.dataset.modal + ' cannot be found');
1100
+ }
1101
+
1102
+ trigger.addEventListener('click', function() {
1103
+ create(modal).open();
1104
+ });
1105
+ }
1106
+ }
1107
+ }
1108
+
1109
+ /**
1110
+ * @private
1111
+ *
1112
+ * @description Close the modal, triggered by cancel button, passes false to callback function
1113
+ * @param {event} e
1114
+ */
1115
+ function cancelModal(e) {
1116
+ return this.dismiss(e, false);
1117
+ }
1118
+
1119
+ /**
1120
+ * @private
1121
+ *
1122
+ * @description Close the modal, triggered by confirm button, passes true to callback function
1123
+ * @param {event} e
1124
+ */
1125
+ function confirmModal(e) {
1126
+ return this.dismiss(e, true);
1127
+ }
1128
+
1129
+ /**
1130
+ * @private
1131
+ *
1132
+ * @description Close the modal, triggered by 'x' button, passes false to callback function
1133
+ * @param {event} e
1134
+ */
1135
+ function dismissModal(e) {
1136
+ return this.dismiss(e, false);
1137
+ }
1138
+
1139
+ /** @private
1140
+ *
1141
+ * @description Close the modal, triggered by 'esc' key, passes false to callback function
1142
+ * @param {event} e
1143
+ */
1144
+ function closeModalOnEscape(e){
1145
+ if(e && e.keyCode === 27) {
1146
+ this.dismiss(e, false);
1147
+ } else {
1148
+ body.addEventListener('click', escHandler, { once: true });
1149
+ }
1150
+ }
1151
+
1152
+
1153
+ /** @private
1154
+ *
1155
+ * @description Close the modal, triggered by 'body click, passes false to callback function
1156
+ * @param {event} e
1157
+ */
1158
+ function closeModalOnClick(e){
1159
+ if(!Volta._hasClass(e.target, _class.trigger)
1160
+ && !Volta._closest(e.target, '.' + _class.trigger, '.' + _class.trigger)
1161
+ && !Volta._closest(e.target, '.' + _class.panel, '.' + _class.panel)) {
1162
+ this.dismiss(e, false);
1163
+ } else if(this.modal) {
1164
+ this.modal.addEventListener('click', clickHandler, { once: true });
1165
+ }
1166
+ }
1167
+
1168
+ /**
1169
+ * @public
1170
+ *
1171
+ * @description Create the modal object
1172
+ * @param {HTMLElement|string} elementOrId Reference to the modal element or the id
1173
+ *. @return {Object} A modal object
1174
+ */
1175
+ function create(elementOrId) {
1176
+ if(!body) {
1177
+ body = document.querySelector('body');
1178
+ }
1179
+ var modal = Object.create(Modal.prototype, {})
1180
+ modal.init(elementOrId);
1181
+ return modal;
1182
+ }
1183
+
1184
+ /**
1185
+ * Private functions to disable body scroll when modal is open
1186
+ */
1187
+ function disableScroll() {
1188
+ body.classList.add(_class.bodyModalOpen);
1189
+ body.addEventListener('touchmove', preventScroll);
1190
+
1191
+ if (body.querySelector('.Vlt-main')) {
1192
+ body.querySelector('.Vlt-main').addEventListener('touchmove', preventScroll);
1193
+ } else {
1194
+ body.addEventListener('touchmove', preventScroll);
1195
+ }
1196
+
1197
+ body.querySelector('.' + _class.content).addEventListener('touchmove', allowScroll);
1198
+ }
1199
+
1200
+ function enableScroll() {
1201
+ body.classList.remove(_class.bodyModalOpen);
1202
+ body.removeEventListener('touchmove', preventScroll);
1203
+
1204
+ if (body.querySelector('.Vlt-main')) {
1205
+ body.querySelector('.Vlt-main').removeEventListener('touchmove', preventScroll);
1206
+ } else {
1207
+ body.removeEventListener('touchmove', preventScroll);
1208
+ }
1209
+
1210
+ var modalContent = body.querySelector('.' + _class.content);
1211
+ if(modalContent) modalContent.removeEventListener('touchmove', allowScroll);
1212
+ }
1213
+
1214
+ function allowScroll(e) {
1215
+ e.stopPropagation();
1216
+ }
1217
+
1218
+ function preventScroll(e) {
1219
+ e.preventDefault();
1220
+ }
1221
+
1222
+ /**
1223
+ * @private
1224
+ *
1225
+ * @description Remove the modal after dismiss, makes sure to delete the modal properties so it can be garbage collected, and removes event listeners
1226
+ * @param {HTMLElement|string} elementOrId Reference to the modal element or the id
1227
+ */
1228
+ function removeModal(modal) {
1229
+ delete modal.modal;
1230
+
1231
+ if(modal.dismissBtn) {
1232
+ modal.dismissBtn.removeEventListener('click', dismissModalHandler);
1233
+ }
1234
+
1235
+ if(modal.cancelBtn) {
1236
+ modal.cancelBtn.removeEventListener('click', cancelModalHandler);
1237
+ }
1238
+
1239
+ if(modal.confirmBtn) {
1240
+ modal.confirmBtn.removeEventListener('click', confirmModalHandler);
1241
+ }
1242
+
1243
+ if(clickHandler) {
1244
+ body.removeEventListener('click', clickHandler);
1245
+ }
1246
+
1247
+ if(escHandler) {
1248
+ body.removeEventListener('keyup', escHandler);
1249
+ escAttached = false;
1250
+ }
1251
+ }
1252
+ }();
1253
+ /**
1254
+ * Copyright (c) 2001-present, Vonage.
1255
+ *
1256
+ * Tabs (requires core)
1257
+ */
1258
+
1259
+ 'use strict';
1260
+
1261
+ Volta.tab = function () {
1262
+ var _class = {
1263
+ link: 'Vlt-tabs__link',
1264
+ linkJs: 'Vlt-js-tabs__link',
1265
+ linkActive: 'Vlt-tabs__link_active',
1266
+ linkDisabled: 'Vlt-tabs__link_disabled',
1267
+ linkJsActive: 'Vlt-js-tabs__link_active',
1268
+ panel: 'Vlt-tabs__panel',
1269
+ panelActive: 'Vlt-tabs__panel_active',
1270
+ panelJsActive: 'Vlt-js-tabs__panel_active',
1271
+ tabs: 'Vlt-tabs',
1272
+ }
1273
+
1274
+ function Tabs() { }
1275
+
1276
+ Tabs.prototype = {
1277
+ _keys: {
1278
+ left: 37,
1279
+ right: 39
1280
+ },
1281
+
1282
+ init: function (element, isWrapper) {
1283
+ var _this = this,
1284
+ tabsHeader,
1285
+ tabsContent;
1286
+
1287
+ if (isWrapper) {
1288
+ tabsHeader = element.children.item(0);
1289
+ tabsContent = element.children.item(1);
1290
+ } else {
1291
+ _this.isJs = true;
1292
+ tabsHeader = element;
1293
+ tabsContent = element.dataset.tabContent ?
1294
+ document.querySelector('#' + element.dataset.tabContent)
1295
+ : null;
1296
+ }
1297
+
1298
+ var linkClass = _this.isJs ? _class.linkJs : _class.link;
1299
+ _this._links = tabsHeader.querySelectorAll('.' + linkClass);
1300
+ _this._panels = tabsContent ? tabsContent.children : undefined;
1301
+
1302
+ this._deactivateElements();
1303
+ this._setActiveElements();
1304
+
1305
+ if (_this._panels && _this._panels.length === _this._links.length) {
1306
+ _this._links.forEach(function (link, index) {
1307
+ var link = link;
1308
+
1309
+ link.index = index;
1310
+ link.addEventListener('keyup', _this._keyUpEventListener.bind(_this));
1311
+ link.addEventListener('toggle', function () {
1312
+ _this.toggle(link);
1313
+ });
1314
+ link.addEventListener('click', function () {
1315
+ _this.toggle(link);
1316
+ });
1317
+ });
1318
+ } else if (_this._panels && _this._panels.length > 0) {
1319
+ console.log('Volta: Tabs, number of links and panels do not match');
1320
+ }
1321
+ },
1322
+ toggle: function (linkElement) {
1323
+ var linkActiveClass = this.isJs ? _class.linkJsActive : _class.linkActive;
1324
+ var panelActiveClass = this.isJs ? _class.panelJsActive : _class.panelActive;
1325
+
1326
+ if (!Volta._hasClass(linkElement, _class.linkDisabled) && (!this._activeLink || this._activeLink !== linkElement)) {
1327
+ if (this._activeLink) {
1328
+ this._activeLink.classList.remove(linkActiveClass);
1329
+ this._activePanel.classList.remove(panelActiveClass);
1330
+ }
1331
+
1332
+ this._deactivateElements();
1333
+ this._setActiveElements(linkElement);
1334
+
1335
+ this._activeLink.classList.add(linkActiveClass);
1336
+ this._activePanel.classList.add(panelActiveClass);
1337
+
1338
+ if (Volta.tooltip) {
1339
+ Volta.tooltip.init();
1340
+ }
1341
+ }
1342
+ },
1343
+ _deactivateElements: function () {
1344
+ this._links.forEach(function (link) {
1345
+ link.setAttribute('tabIndex', '-1');
1346
+ link.setAttribute('aria-selected', 'false');
1347
+ });
1348
+ Array.from(this._panels).forEach(function (panel) {
1349
+ panel.setAttribute('hidden', 'hidden');
1350
+ });
1351
+ },
1352
+ _setActiveElements: function (linkElement) {
1353
+ var linkActiveClass = this.isJs ? _class.linkJsActive : _class.linkActive;
1354
+
1355
+ if (!linkElement) {
1356
+ this._activeLink = this._links.item(linkActiveClass);
1357
+ } else {
1358
+ this._activeLink = linkElement;
1359
+ }
1360
+
1361
+ var tabIndex;
1362
+ var currentNode = 0;
1363
+
1364
+ while (!tabIndex && currentNode < this._links.length) {
1365
+ if (this._links.item(currentNode) === this._activeLink) {
1366
+ tabIndex = currentNode;
1367
+ break;
1368
+ }
1369
+ currentNode++;
1370
+ }
1371
+
1372
+ if (this._panels) {
1373
+ this._activePanel = this._panels.item(tabIndex);
1374
+ }
1375
+
1376
+ this._activeLink.setAttribute('tabindex', '0');
1377
+ this._activeLink.setAttribute('aria-selected', 'true');
1378
+ if (this._activePanel) {
1379
+ this._activePanel.removeAttribute('hidden');
1380
+ }
1381
+ },
1382
+ _keyUpEventListener: function (event) {
1383
+ var key = event.keyCode;
1384
+
1385
+ switch (key) {
1386
+ case this._keys.left:
1387
+ case this._keys.right:
1388
+ this._switchTab(event);
1389
+ break;
1390
+ }
1391
+ },
1392
+ _switchTab: function (event) {
1393
+ var nextTab;
1394
+
1395
+ if (this._keys.left === event.keyCode) {
1396
+ nextTab = this._findNextTab(-1);
1397
+ } else if (this._keys.right === event.keyCode) {
1398
+ nextTab = this._findNextTab(1);
1399
+ }
1400
+ this.toggle(nextTab);
1401
+ },
1402
+ _findNextTab: function (direction) {
1403
+ var tab, nextTab;
1404
+ var currentIndex = this._activeLink.index;
1405
+ for (var i = currentIndex + direction; !nextTab && (this._calculateIndex(i) !== currentIndex); i += direction) {
1406
+ tab = this._links.item(this._calculateIndex(i));
1407
+ if (!Volta._hasClass(tab, _class.linkDisabled)) {
1408
+ nextTab = tab;
1409
+ }
1410
+ }
1411
+ return nextTab;
1412
+ },
1413
+ _calculateIndex: function (i) {
1414
+ var length = this._links.length;
1415
+ return ((i % length) + length) % length;
1416
+ }
1417
+ }
1418
+
1419
+ return {
1420
+ create: create,
1421
+ init: attachTabHandlers
1422
+ }
1423
+
1424
+ /**
1425
+ * @public
1426
+ *
1427
+ * @description Attach a listener to the tab header
1428
+ */
1429
+ function attachTabHandlers() {
1430
+ //traditional tabs
1431
+ document.querySelectorAll('.' + _class.tabs).forEach(create);
1432
+
1433
+ document.querySelectorAll('[data-tab-content]').forEach(create);
1434
+ }
1435
+
1436
+ /**
1437
+ * @public
1438
+ *
1439
+ * @description Create a tabs component
1440
+ * @param {HTMLElement} element
1441
+ */
1442
+ function create(element) {
1443
+ var tabs = Object.create(Tabs.prototype, {})
1444
+
1445
+ if (Volta._hasClass(element, _class.tabs)) {
1446
+ tabs.init(element, true);
1447
+ } else {
1448
+ tabs.init(element);
1449
+ }
1450
+
1451
+ return tabs;
1452
+ }
1453
+ }();
1454
+
1455
+ /**
1456
+ * Copyright (c) 2001-present, Vonage.
1457
+ *
1458
+ * tables (requires core)
1459
+ */
1460
+
1461
+ 'use strict';
1462
+
1463
+ Volta.table = function () {
1464
+ var _class = {
1465
+ table: 'Vlt-table',
1466
+ tall: 'Vlt-table--tall',
1467
+ short: 'Vlt-table--short',
1468
+ trigger: 'Vlt-table__density',
1469
+ buttonActive: 'Vlt-btn_active'
1470
+ }
1471
+
1472
+ return {
1473
+ init: attachTableDensityHandlers
1474
+ }
1475
+
1476
+ /**
1477
+ * @public
1478
+ *
1479
+ * @description Attach a listener to the table density triggers
1480
+ */
1481
+ function attachTableDensityHandlers() {
1482
+ var triggers = document.querySelectorAll('.' + _class.trigger);
1483
+
1484
+ if(triggers.length > 0) {
1485
+ triggers.forEach(attachTriggerHandler);
1486
+ }
1487
+
1488
+ function attachTriggerHandler(trigger) {
1489
+ if(trigger.dataset.table) {
1490
+ var table = document.querySelector('#' + trigger.dataset.table);
1491
+
1492
+ if(!table) {
1493
+ console.warn('Volta: table ' + trigger.dataset.table + ' cannot be found');
1494
+ return;
1495
+ }
1496
+
1497
+ var activeButton = trigger.querySelector('.' + _class.buttonActive);
1498
+
1499
+ trigger.querySelectorAll('.Vlt-btn').forEach( function(button) {
1500
+ button.addEventListener('click', function() {
1501
+ if (this.dataset.density) {
1502
+ console.log('in')
1503
+ if (this.dataset.density == 'short') {
1504
+ table.classList.add(_class.short)
1505
+ table.classList.remove(_class.tall)
1506
+ } else if (this.dataset.density == 'tall') {
1507
+ table.classList.add(_class.tall)
1508
+ table.classList.remove(_class.short)
1509
+ } else {
1510
+ table.classList.remove(_class.tall)
1511
+ table.classList.remove(_class.short)
1512
+ }
1513
+
1514
+ // update classes on buttons
1515
+ if(activeButton) {
1516
+ activeButton.classList.remove(_class.buttonActive);
1517
+ }
1518
+ activeButton = this;
1519
+ this.classList.add(_class.buttonActive);
1520
+ }
1521
+ })
1522
+ });
1523
+ }
1524
+ }
1525
+ }
1526
+
1527
+ }();
1528
+ /**
1529
+ * Copyright (c) 2001-present, Vonage.
1530
+ *
1531
+ * Tooltips (requires popper.js, tooltip.js)
1532
+ */
1533
+ 'use strict';
1534
+
1535
+ Volta.tooltip = function () {
1536
+ var _class = {
1537
+ bottom: 'Vlt-tooltip--bottom',
1538
+ left: 'Vlt-tooltip--left',
1539
+ tooltip: 'Vlt-tooltip',
1540
+ top: 'Vlt-tooltip--top',
1541
+ right: 'Vlt-tooltip--right'
1542
+ }
1543
+
1544
+ var currentTooltip = undefined,
1545
+ currentTooltipContent = undefined;
1546
+
1547
+ return {
1548
+ create: create,
1549
+ init: attachTooltipHandlers
1550
+ }
1551
+
1552
+ /**
1553
+ * @public
1554
+ *
1555
+ * @description Create a Tooltip instance for every Vlt-tooltip
1556
+ */
1557
+ function attachTooltipHandlers() {
1558
+ document.querySelectorAll('.' + _class.tooltip).forEach(create);
1559
+ }
1560
+
1561
+ /**
1562
+ * @public
1563
+ *
1564
+ * @description Create a Tooltip instance
1565
+ * @param {HTMLElement} tooltip
1566
+ * @return {object} a Tooltip element
1567
+ */
1568
+ function create(tooltip) {
1569
+ var placement;
1570
+
1571
+ if (Volta._hasClass(tooltip, _class.bottom)) {
1572
+ placement = 'bottom';
1573
+ } else if (Volta._hasClass(tooltip, _class.top)) {
1574
+ placement = 'top';
1575
+ } else if (Volta._hasClass(tooltip, _class.left)) {
1576
+ placement = 'left';
1577
+ } else if (Volta._hasClass(tooltip, _class.right)) {
1578
+ placement = 'right';
1579
+ }
1580
+
1581
+ var template =
1582
+ '<div class="Vlt-tooltip--js" role="tooltip">' +
1583
+ '<div class="tooltip-arrow Vlt-tooltip__arrow"></div>' +
1584
+ '<div class="tooltip-inner Vlt-tooltip__content"></div>' +
1585
+ '</div>';
1586
+
1587
+ var title = tooltip.title;
1588
+ //remove the title so deafult title does not show
1589
+ tooltip.title = "";
1590
+
1591
+ return new Tooltip(tooltip, {
1592
+ html: true,
1593
+ template: template,
1594
+ title: title,
1595
+ placement: placement
1596
+ });
1597
+ }
1598
+ }();
1599
+ /**
1600
+ * Copyright (c) 2001-present, Vonage.
1601
+ *
1602
+ * Menu Collapse (requires core, menu)
1603
+ */
1604
+
1605
+ 'use strict';
1606
+
1607
+ Volta.menuCollapse = function () {
1608
+ var _class = {
1609
+ animate: 'Vlt-sidenav--animate',
1610
+ collapsed: 'Vlt-sidenav--collapsed',
1611
+ visible: 'Vlt-sidenav_visible'
1612
+ }
1613
+
1614
+ var _id = {
1615
+ collapse: '#Vlt-sidenav-collapse-trigger'
1616
+ }
1617
+
1618
+ var menuCollapseString = "menuCollapse";
1619
+
1620
+ return {
1621
+ attachCloseHandler: attachCloseHandler,
1622
+ init: initialise
1623
+ }
1624
+
1625
+ /**
1626
+ * @private
1627
+ *
1628
+ * @description Attach listener to trigger for collapsing the menu
1629
+ */
1630
+ function attachMenuCollapseHandler() {
1631
+ var collapseTrigger = document.querySelector(_id.collapse);
1632
+
1633
+ if(collapseTrigger) {
1634
+ collapseTrigger.addEventListener('click', function(e) {
1635
+ e.preventDefault();
1636
+ e.stopPropagation();
1637
+
1638
+ var hasCollapsedClass = Volta._hasClass(Volta.menu._element, _class.collapsed);
1639
+ var isMobile = Volta._hasClass(Volta.menu._element, _class.visible);
1640
+
1641
+ Volta.menu._element.classList.add(_class.animate);
1642
+
1643
+ if (isMobile) {
1644
+ Volta.menu._element.classList.remove(_class.visible);
1645
+ } else if (hasCollapsedClass) {
1646
+ unCollapseMenu(Volta.menu._element);
1647
+ } else {
1648
+ collapseMenu(Volta.menu._element);
1649
+ }
1650
+ });
1651
+ }
1652
+ }
1653
+
1654
+ /**
1655
+ * @public
1656
+ *
1657
+ * @description Attach listener to trigger for closing the menu
1658
+ */
1659
+ function attachCloseHandler(expandedMenus) {
1660
+ if(document.querySelector('.' + _class.collapsed) && expandedMenus) {
1661
+ document.querySelector('body').addEventListener('click', closeMenu, { once: true });
1662
+ }
1663
+
1664
+ function closeMenu(e) {
1665
+ if(!Volta._hasClass(e.target, Volta.menu._class.link)
1666
+ && !Volta._hasClass(e.target.parentElement, Volta.menu._class.link)) {
1667
+ e.preventDefault();
1668
+ e.stopPropagation();
1669
+
1670
+ Volta.menu.closeAll();
1671
+ } else {
1672
+ document.querySelector('body').addEventListener('click', closeMenu, { once: true });
1673
+ }
1674
+ }
1675
+ }
1676
+
1677
+ /**
1678
+ * @private
1679
+ *
1680
+ * @description Collapse the expanded menu
1681
+ */
1682
+ function collapseMenu() {
1683
+ Volta.menu.closeAll();
1684
+ Volta.menu.selectActiveTab();
1685
+
1686
+ Volta.menu._element.classList.add(_class.collapsed);
1687
+
1688
+ document.querySelectorAll(Volta.menu._class.trigger).forEach(function(menuItem){
1689
+ menuItem.nextElementSibling.style = "top: " + menuItem.positionTop;
1690
+ });
1691
+
1692
+ if(localStorage) {
1693
+ localStorage.setItem(menuCollapseString, true);
1694
+ }
1695
+
1696
+ var sideTabs = Volta.menu._element.querySelector('.' + Volta.menu._class.sideTabs);
1697
+
1698
+ if(sideTabs) {
1699
+ sideTabs.querySelectorAll('.' + Volta.menu._class.sideTabsTrigger).forEach(function(trigger){
1700
+ trigger.classList.remove(Volta.menu._class.sideTabsTrigger);
1701
+ trigger.classList.add(Volta.menu._class.trigger);
1702
+ trigger.addEventListener('click', Volta.menu.showCollapsed);
1703
+ });
1704
+
1705
+ sideTabs.querySelectorAll('.' + Volta.menu._class.sideTabsLink).forEach(function(link){
1706
+ link.classList.remove(Volta.menu._class.sideTabsLink);
1707
+ link.classList.add(Volta.menu._class.link);
1708
+ });
1709
+ }
1710
+
1711
+ Volta.menu.styleActiveTrigger();
1712
+ }
1713
+
1714
+ /**
1715
+ * @public
1716
+ *
1717
+ * @description Initailise the menu collapsing
1718
+ */
1719
+ function initialise() {
1720
+ if(!Volta.menu || !Volta.menu._element) return;
1721
+
1722
+ attachMenuCollapseHandler();
1723
+
1724
+ var menuCollapsedFlag = localStorage ? localStorage.getItem(menuCollapseString) : false;
1725
+
1726
+ if(menuCollapsedFlag) {
1727
+ Volta.menu._element.querySelectorAll('.' + Volta.menu._class.triggerActive).forEach(function(trigger) {
1728
+ trigger.classList.remove(Volta.menu._class.triggerActive);
1729
+ });
1730
+ collapseMenu();
1731
+ } else {
1732
+ Volta.menu.expand();
1733
+ }
1734
+ }
1735
+
1736
+ /**
1737
+ * @public
1738
+ *
1739
+ * @description Expand the collapsed menu
1740
+ */
1741
+ function unCollapseMenu() {
1742
+ Volta.menu._element.classList.remove(_class.collapsed);
1743
+
1744
+ if(localStorage) {
1745
+ localStorage.removeItem(menuCollapseString);
1746
+ }
1747
+
1748
+ var sideTabs = Volta.menu._element.querySelector('.' + Volta.menu._class.sideTabs);
1749
+
1750
+ if(sideTabs) {
1751
+ sideTabs.querySelectorAll('.' + Volta.menu._class.trigger).forEach(function(trigger){
1752
+ trigger.classList.add(Volta.menu._class.sideTabsTrigger);
1753
+ trigger.classList.remove(Volta.menu._class.trigger);
1754
+ trigger.removeEventListener('click', Volta.menu.showCollapsed);
1755
+ });
1756
+
1757
+ sideTabs.querySelectorAll('.' + Volta.menu._class.link).forEach(function(link){
1758
+ link.classList.add(Volta.menu._class.sideTabsLink);
1759
+ link.classList.remove(Volta.menu._class.link);
1760
+ });
1761
+ }
1762
+
1763
+ Volta.menu.expand(true);
1764
+ }
1765
+ }();
1766
+ /**
1767
+ * Copyright (c) 2001-present, Vonage.
1768
+ *
1769
+ * Menu (requires core)
1770
+ */
1771
+
1772
+ 'use strict';
1773
+
1774
+ Volta.menu = function () {
1775
+ var _class = {
1776
+ mobile: 'Vlt-sidenav__mobile',
1777
+ mobileOpen: 'Vlt-body--mobile-menu-open',
1778
+ mobileTrigger: 'Vlt-sidenav__mobile-trigger',
1779
+ link: 'Vlt-sidemenu__link',
1780
+ linkActive: 'Vlt-sidemenu__link_active',
1781
+ sideMenu: 'Vlt-sidemenu',
1782
+ sideTabs: 'Vlt-sidetabs',
1783
+ sideTabsLinkActive: 'Vlt-js-tabs__link_active',
1784
+ sideTabsPanel: 'Vlt-js-tabs__panel',
1785
+ sideTabsPanelActive: 'Vlt-js-tabs__panel_active',
1786
+ sideTabsLink: 'Vlt-sidetabs__link',
1787
+ sideTabsTrigger: 'Vlt-sidetabs__trigger',
1788
+ trigger: 'Vlt-sidemenu__trigger',
1789
+ triggerActive: 'Vlt-sidemenu__trigger_active',
1790
+ triggerCurrent: 'Vlt-sidemenu__trigger_current',
1791
+ triggerEnabled: '.Vlt-tabs__link:not(.Vlt-tabs__link_disabled)',
1792
+ visible: 'Vlt-sidenav_visible'
1793
+ }
1794
+
1795
+ var _id = {
1796
+ menu: '#Vlt-sidenav',
1797
+ mobileTrigger: '#Vlt-sidenav-mobile-trigger'
1798
+ }
1799
+
1800
+ var expandedMenus = [],
1801
+ mobileMenuTriggeredTwice;
1802
+
1803
+ return {
1804
+ _class: _class,
1805
+ _element: undefined,
1806
+
1807
+ closeAll: removeAllMenuItemsFromSelectedArr,
1808
+ init: initialise,
1809
+ expand: expandActiveMenu,
1810
+ showCollapsed: expandMenu,
1811
+ _triggerHandler: attachTriggerHandlers,
1812
+ selectActiveTab: selectActiveTab,
1813
+ styleActiveTrigger: styleActiveTrigger
1814
+ }
1815
+
1816
+ /**
1817
+ * @private
1818
+ *
1819
+ * @description Adds the parents of the active menu to the exoanded menus array
1820
+ * @param {HTMLElement} element The active menu
1821
+ */
1822
+ function addExpandedParentMenuToArr(element){
1823
+ var nestedMenuUl = Volta._closest(element, 'ul', '.' + _class.sideMenu);
1824
+ var nestedMenuTrigger = nestedMenuUl.previousElementSibling;
1825
+
1826
+ if(nestedMenuTrigger && Volta._hasClass(nestedMenuTrigger, _class.trigger)) {
1827
+ if(!Volta._hasClass(nestedMenuTrigger, _class.triggerActive)) {
1828
+ nestedMenuTrigger.classList.add(_class.triggerActive);
1829
+ }
1830
+
1831
+ expandedMenus.push(nestedMenuTrigger);
1832
+ addExpandedParentMenuToArr(nestedMenuTrigger);
1833
+ }
1834
+ }
1835
+
1836
+ /**
1837
+ * @private
1838
+ *
1839
+ * @description Attach the listener for the mobile menu trigger
1840
+ */
1841
+ function attachMobileTriggerHandler() {
1842
+ var mobileMenuTrigger = document.querySelector(_id.mobileTrigger);
1843
+
1844
+ if(mobileMenuTrigger) {
1845
+ mobileMenuTrigger.addEventListener('click', function(e){
1846
+ if(mobileMenuTriggeredTwice) {
1847
+ mobileMenuTriggeredTwice = false;
1848
+ e.stopPropagation();
1849
+ return;
1850
+ }
1851
+ if(!Volta._hasClass(Volta.menu._element, _class.visible)) {
1852
+ Volta.menu._element.classList.add(_class.visible);
1853
+ document.body.classList.add(_class.mobileOpen);
1854
+
1855
+ //stop propagation otherwise will immediately call handler
1856
+ e.stopPropagation();
1857
+ addMobileMenuCollapseListeners();
1858
+ }
1859
+ });
1860
+ }
1861
+ }
1862
+
1863
+ /**
1864
+ * @private
1865
+ *
1866
+ * @description Attach the listeners for closing the expanded mobile menu
1867
+ */
1868
+ function addMobileMenuCollapseListeners() {
1869
+ document.querySelector('body').addEventListener('click', closeMenu, { once: true });
1870
+ document.querySelector('body').addEventListener('touchstart', closeMenu, { once: true });
1871
+ }
1872
+
1873
+ /**
1874
+ * @public
1875
+ *
1876
+ * @description Attach the listeners to the trigger elements of the menu
1877
+ */
1878
+ function attachTriggerHandlers() {
1879
+ attachMobileTriggerHandler();
1880
+ Volta.menu._element.querySelectorAll('.' + _class.trigger).forEach(attachHandler);
1881
+
1882
+ function attachHandler(triggerElem) {
1883
+ triggerElem.addEventListener('click', expandMenu);
1884
+ }
1885
+ }
1886
+
1887
+ /**
1888
+ * @private
1889
+ *
1890
+ * @description Checks if the passed in menu is nested
1891
+ * @param {HTMLElement} menuItem
1892
+ * @return {boolean} If the menu item is nested returns true, otherwise false
1893
+ */
1894
+ function checkMenuItemIsNested(menuItem) {
1895
+ return isNestedDescendant(menuItem);
1896
+ }
1897
+
1898
+ /**
1899
+ * @private
1900
+ *
1901
+ * @description Recursive function to check if the passed in menu is nested
1902
+ * @param {HTMLElement} menuItem
1903
+ * @param {Boolean} isAncestor
1904
+ * @return {boolean} If the menu item is nested returns true, otherwise false
1905
+ */
1906
+ function isNestedDescendant(menuItem, isAncestor) {
1907
+ var isNested = false;
1908
+ var ancestor = isAncestor ? menuItem.parentElement : menuItem.parentElement.parentElement;
1909
+ var ancestorSibling = ancestor.previousElementSibling;
1910
+
1911
+ if(ancestorSibling) {
1912
+ isNested = Volta._hasClass(ancestorSibling, _class.trigger);
1913
+ }
1914
+
1915
+ if(ancestorSibling && !isNested) {
1916
+ return isNestedDescendant(ancestor, true);
1917
+ }
1918
+
1919
+ return isNested;
1920
+ }
1921
+
1922
+ /**
1923
+ * @private
1924
+ *
1925
+ * @description Attach the listeners to the trigger elements of the menu
1926
+ * @param {HTMLElement} menuItem
1927
+ * @return {boolean} If the menu item is nested returns true, otherwise false
1928
+ */
1929
+ function closeMenu(e) {
1930
+ if(!Volta._hasClass(e.target, _class.sideMenu) && !Volta._closest(e.target, '.' + _class.sideMenu) &&
1931
+ !Volta._hasClass(e.target, _class.sideTabs) && !Volta._closest(e.target, '.' + _class.sideTabs)) {
1932
+ Volta.menu._element.classList.remove(_class.visible);
1933
+
1934
+ document.body.classList.remove(_class.mobileOpen);
1935
+
1936
+ var isMobileMenu = Volta._closest(e.target, '.' + _class.mobile);
1937
+ if(Volta._hasClass(e.target, _class.mobileTrigger) || isMobileMenu) {
1938
+ mobileMenuTriggeredTwice = true;
1939
+ }
1940
+ } else {
1941
+ addMobileMenuCollapseListeners();
1942
+ }
1943
+ }
1944
+
1945
+ /**
1946
+ * @private
1947
+ *
1948
+ * @description Expand the nested menu
1949
+ * @param {event} e
1950
+ */
1951
+ function expandMenu(e) {
1952
+ e.preventDefault();
1953
+ e.stopPropagation();
1954
+
1955
+ var _this = this;
1956
+
1957
+ var isNestedMenu = checkMenuItemIsNested(_this);
1958
+
1959
+ if (expandedMenus.indexOf(_this) >= 0 && isNestedMenu) {
1960
+ removeMenuFromSelectedArr(_this);
1961
+ } else if(expandedMenus.indexOf(_this) >= 0) {
1962
+ removeAllMenuItemsFromSelectedArr();
1963
+ } else {
1964
+ if(!isNestedMenu) {
1965
+ removeAllMenuItemsFromSelectedArr();
1966
+ } else {
1967
+ removeSiblingFromSelectedArr(_this);
1968
+ }
1969
+ expandedMenus.push(_this);
1970
+ _this.classList.add(_class.triggerActive);
1971
+ }
1972
+
1973
+ if(Volta.menuCollapse) {
1974
+ Volta.menuCollapse.attachCloseHandler(expandedMenus);
1975
+ }
1976
+ }
1977
+
1978
+ /**
1979
+ * @public
1980
+ *
1981
+ * @description Expand the active menu - typically used on page load
1982
+ * @param {boolean} isUserForced Whether the action has been trigger by the user
1983
+ */
1984
+ function expandActiveMenu(isUserForced) {
1985
+ var activeMenuItem = Volta.menu._element.querySelector('.' + _class.linkActive);
1986
+
1987
+ selectActiveTab(activeMenuItem);
1988
+
1989
+ if(activeMenuItem) {
1990
+ var activeTriggerUl = Volta._closest(activeMenuItem, 'ul', '.' + _class.sideMenu);
1991
+ var activeTrigger = activeTriggerUl ? activeTriggerUl.previousElementSibling : null;
1992
+ if(activeTrigger) {
1993
+ var isNestedMenu = checkMenuItemIsNested(activeTrigger);
1994
+ if(isNestedMenu) {
1995
+ addExpandedParentMenuToArr(activeTrigger);
1996
+ }
1997
+
1998
+ if(!Volta._hasClass(activeTrigger, _class.triggerActive)) {
1999
+ activeTrigger.classList.add(_class.triggerActive);
2000
+ //console.log("HEY!!!");
2001
+ }
2002
+
2003
+ expandedMenus.push(activeTrigger);
2004
+ }
2005
+ styleActiveTrigger(activeMenuItem);
2006
+ }
2007
+ }
2008
+
2009
+ /**
2010
+ * @public
2011
+ *
2012
+ * @description Initialise the menu
2013
+ * @param {boolean} menuCollapse Whether the collapse module has been included
2014
+ */
2015
+ function initialise(menuCollapse) {
2016
+ expandedMenus = [];
2017
+ Volta.menu._element = document.querySelector(_id.menu);
2018
+
2019
+ if(Volta.menu._element) {
2020
+ if(!Volta.menuCollapse) {
2021
+ expandActiveMenu();
2022
+ } else if(menuCollapse) {
2023
+ Volta.menuCollapse.init();
2024
+ }
2025
+
2026
+ attachTriggerHandlers();
2027
+ }
2028
+ }
2029
+
2030
+ /**
2031
+ * @public
2032
+ *
2033
+ * @description Clear the selected menus array, and close all of the nested menus
2034
+ */
2035
+ function removeAllMenuItemsFromSelectedArr(){
2036
+ expandedMenus.forEach(function(menuItem){
2037
+ menuItem.classList.remove(_class.triggerActive);
2038
+ });
2039
+ expandedMenus = [];
2040
+ }
2041
+
2042
+ /**
2043
+ * @private
2044
+ *
2045
+ * @description Remove a specific menu item from the selected array and close
2046
+ */
2047
+ function removeMenuFromSelectedArr(menuItem) {
2048
+ var menuIndex = expandedMenus.indexOf(menuItem);
2049
+ menuItem.classList.remove(_class.triggerActive);
2050
+ expandedMenus.splice(menuIndex, 1);
2051
+ }
2052
+
2053
+ /**
2054
+ * @private
2055
+ *
2056
+ * @description Remove sibling menu item from the selected array and close
2057
+ */
2058
+ function removeSiblingFromSelectedArr(menuItem) {
2059
+ var ancestors = menuItem.parentElement.parentElement.children;
2060
+ var openSibling;
2061
+ var count = ancestors.length - 1;
2062
+
2063
+ while(openSibling === undefined && count >= 0) {
2064
+ var siblingIndex = expandedMenus.indexOf(ancestors[count].children[0]);
2065
+ if(siblingIndex >= 0) {
2066
+ openSibling = expandedMenus[siblingIndex];
2067
+ }
2068
+ count--;
2069
+ }
2070
+
2071
+ if(openSibling) {
2072
+ removeMenuFromSelectedArr(openSibling);
2073
+ }
2074
+ }
2075
+
2076
+ /**
2077
+ * @public
2078
+ *
2079
+ * @description Select the active side tab
2080
+ * @param {activeMenuItem} Element(optional) The active menu item
2081
+ */
2082
+ function selectActiveTab(activeMenuItem) {
2083
+ activeMenuItem = activeMenuItem || Volta.menu._element.querySelector('.' + _class.linkActive);
2084
+ var navTabs = document.querySelector(_id.menu + ' .' + _class.sideTabs);
2085
+
2086
+ if(!navTabs || !activeMenuItem) {
2087
+ return null;
2088
+ }
2089
+
2090
+ var sideMenus = Volta.menu._element.querySelectorAll('.' + _class.sideMenu);
2091
+ var menuTab = Volta._closest(activeMenuItem, '.' + _class.sideTabsPanel, '.' + _class.sideMenu);
2092
+
2093
+ var tabIndex;
2094
+ var currentNode = 0;
2095
+
2096
+ while(!tabIndex && currentNode < sideMenus.length) {
2097
+ if(sideMenus.item(currentNode) === menuTab) {
2098
+ tabIndex = currentNode;
2099
+ break;
2100
+ }
2101
+ currentNode++;
2102
+ }
2103
+ var sideTabs = Volta.menu._element.querySelectorAll('.' + _class.sideTabsLink);
2104
+ sideTabs[tabIndex].click();
2105
+ }
2106
+
2107
+ /**
2108
+ * @public
2109
+ *
2110
+ * @description Adds a class to the top level active trigger
2111
+ * @param {activeMenuItem} Element(optional) The active menu item
2112
+ */
2113
+ function styleActiveTrigger(activeMenuItem) {
2114
+ activeMenuItem = activeMenuItem || Volta.menu._element.querySelector('.' + _class.linkActive);
2115
+
2116
+ if(activeMenuItem) {
2117
+ var topLevelTrigger = getTopLevelTrigger(activeMenuItem);
2118
+
2119
+ if(topLevelTrigger) {
2120
+ topLevelTrigger.classList.add(_class.triggerCurrent);
2121
+ }
2122
+ }
2123
+
2124
+ function getTopLevelTrigger(activeMenuItem) {
2125
+ var element = activeMenuItem;
2126
+ var trigger = null;
2127
+
2128
+ while (element) {
2129
+ if(element.matches('ul') && Volta._hasClass(element, _class.sideMenu)) {
2130
+ break;
2131
+ }
2132
+
2133
+ if (element.matches('ul')) {
2134
+ trigger = element;
2135
+ }
2136
+
2137
+ element = element.parentElement;
2138
+ }
2139
+
2140
+ return trigger ? trigger.previousElementSibling : null;
2141
+ }
2142
+ }
2143
+ }();
2144
+
2145
+ export default Volta;