j1-template 2020.0.22 → 2020.0.24

Sign up to get free protection for your applications and to get access to all the features.
Files changed (266) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/themes/j1/layouts/content_generator_page.html +1 -1
  3. data/_includes/themes/j1/layouts/content_generator_post.html +63 -161
  4. data/_includes/themes/j1/modules/connectors/ad/google-adsense.html +14 -0
  5. data/_includes/themes/j1/modules/connectors/analytic/google-analytics.html +1 -3
  6. data/_includes/themes/j1/modules/connectors/comment/disqus.html +37 -24
  7. data/_includes/themes/j1/modules/navigator/generator.html +8 -3
  8. data/_includes/themes/j1/modules/navigator/procedures/topsearch.proc +36 -26
  9. data/_includes/themes/j1/procedures/layouts/module_writer.proc +1 -1
  10. data/_includes/themes/j1/procedures/posts/create_series_header.proc +9 -5
  11. data/assets/data/banner.html +1 -1
  12. data/assets/data/fam.html +124 -0
  13. data/assets/data/mmenu_sidebar.html +3 -3
  14. data/assets/data/panel.html +9 -9
  15. data/assets/data/quicklinks.html +13 -13
  16. data/assets/error_pages/HTTP204.html +1 -0
  17. data/assets/error_pages/HTTP400.html +3 -2
  18. data/assets/error_pages/HTTP401.html +3 -2
  19. data/assets/error_pages/HTTP403.html +3 -2
  20. data/assets/error_pages/HTTP404.html +3 -2
  21. data/assets/error_pages/HTTP500.html +3 -2
  22. data/assets/error_pages/HTTP501.html +3 -2
  23. data/assets/error_pages/HTTP502.html +3 -2
  24. data/assets/error_pages/HTTP503.html +3 -2
  25. data/assets/error_pages/HTTP520.html +3 -2
  26. data/assets/error_pages/HTTP521.html +3 -2
  27. data/assets/error_pages/HTTP533.html +3 -2
  28. data/assets/themes/j1/adapter/js/{ssm.js → fam.js} +248 -138
  29. data/assets/themes/j1/adapter/js/framer.js +72 -56
  30. data/assets/themes/j1/adapter/js/gallery_customizer.js +2 -1
  31. data/assets/themes/j1/adapter/js/j1.js +8 -2
  32. data/assets/themes/j1/adapter/js/{searcher.js → lunr_search.js} +68 -65
  33. data/assets/themes/j1/adapter/js/toccer.js +62 -30
  34. data/assets/themes/j1/core/css/bootstrap.css +7154 -0
  35. data/assets/themes/j1/core/css/bootstrap.min.css +6 -0
  36. data/assets/themes/j1/core/css/custom.scss +28 -0
  37. data/assets/themes/j1/core/css/globals.css +14523 -0
  38. data/assets/themes/j1/core/css/globals.min.css +1 -0
  39. data/assets/themes/j1/core/css/globals.scss +28 -0
  40. data/assets/themes/j1/core/css/theme_extensions.css +11558 -0
  41. data/assets/themes/j1/core/css/theme_extensions.min.css +1 -0
  42. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.css +7 -4
  43. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.min.css +2 -2
  44. data/assets/themes/j1/core/css/themes/uno-dark/bootstrap.css +7 -4
  45. data/assets/themes/j1/core/css/themes/uno-dark/bootstrap.min.css +2 -2
  46. data/assets/themes/j1/core/css/themes/uno-light/bootstrap.css +514 -417
  47. data/assets/themes/j1/core/css/themes/uno-light/bootstrap.min.css +2 -2
  48. data/assets/themes/j1/core/css/uno.css +11823 -0
  49. data/assets/themes/j1/core/css/uno.min.css +1 -0
  50. data/assets/themes/j1/core/css/uno.scss +28 -0
  51. data/assets/themes/j1/core/css/vendor.css +5 -4
  52. data/assets/themes/j1/core/css/vendor.min.css +1 -1
  53. data/assets/themes/j1/core/css/vendor.scss +28 -0
  54. data/assets/themes/j1/core/js/template.js +6 -11
  55. data/assets/themes/j1/core/js/template.js.map +1 -1
  56. data/assets/themes/j1/core/js/template.min.js +1 -1
  57. data/assets/themes/j1/modules/bmd/js/bootstrap-material-design.js +6 -0
  58. data/assets/themes/j1/modules/cash/js/cash.js +1374 -0
  59. data/assets/themes/j1/modules/cash/js/cash.min.js +42 -0
  60. data/assets/themes/j1/modules/fam/css/uno/fam.css +369 -0
  61. data/assets/themes/j1/modules/fam/js/fam.js +477 -0
  62. data/assets/themes/j1/modules/iframeResizer/examples/frame.nested.html +1 -1
  63. data/assets/themes/j1/modules/iframeResizer/js/{iframeResizer.js → resizer.js} +0 -0
  64. data/assets/themes/j1/modules/iframeResizer/js/{iframeResizer.map → resizer.map} +0 -0
  65. data/assets/themes/j1/modules/iframeResizer/js/{iframeResizer.min.js → resizer.min.js} +0 -0
  66. data/assets/themes/j1/modules/jquery/js/require.js +2145 -0
  67. data/assets/themes/j1/modules/jquery/js/require.min.js +5 -0
  68. data/assets/themes/j1/modules/lunrSearch/css/lunr_search.css +32 -0
  69. data/assets/themes/j1/modules/lunrSearch/css/lunr_search.min.css +25 -0
  70. data/assets/themes/j1/modules/lunrSearch/js/dateformat.js +125 -0
  71. data/assets/themes/j1/modules/lunrSearch/js/dateformat.min.js +14 -0
  72. data/assets/themes/j1/modules/lunrSearch/js/lunr.js +3475 -0
  73. data/assets/themes/j1/modules/lunrSearch/js/lunr.min.js +51 -0
  74. data/assets/themes/j1/modules/lunrSearch/js/lunr_search.js +184 -0
  75. data/assets/themes/j1/modules/lunrSearch/js/lunr_search.min.js +17 -0
  76. data/assets/themes/j1/modules/lunrSearch/js/mustache.js +772 -0
  77. data/assets/themes/j1/modules/lunrSearch/js/mustache.min.js +772 -0
  78. data/assets/themes/j1/modules/lunrSearch/js/uri.js +2340 -0
  79. data/assets/themes/j1/modules/lunrSearch/js/uri.min.js +93 -0
  80. data/assets/themes/j1/modules/materialize/js/anime.js +1283 -0
  81. data/assets/themes/j1/modules/materialize/js/anime.min.js +34 -0
  82. data/assets/themes/j1/modules/materialize/js/autocomplete.js +450 -0
  83. data/assets/themes/j1/modules/materialize/js/buttons.js +409 -0
  84. data/assets/themes/j1/modules/materialize/js/cards.js +40 -0
  85. data/assets/themes/j1/modules/materialize/js/carousel.js +717 -0
  86. data/assets/themes/j1/modules/materialize/js/cash-dom.js +1044 -0
  87. data/assets/themes/j1/modules/materialize/js/cash.js +960 -0
  88. data/assets/themes/j1/modules/materialize/js/characterCounter.js +136 -0
  89. data/assets/themes/j1/modules/materialize/js/chips.js +481 -0
  90. data/assets/themes/j1/modules/materialize/js/collapsible.js +275 -0
  91. data/assets/themes/j1/modules/materialize/js/component.js +44 -0
  92. data/assets/themes/j1/modules/materialize/js/datepicker.js +975 -0
  93. data/assets/themes/j1/modules/materialize/js/dropdown.js +617 -0
  94. data/assets/themes/j1/modules/materialize/js/forms.js +275 -0
  95. data/assets/themes/j1/modules/materialize/js/global.js +427 -0
  96. data/assets/themes/j1/modules/materialize/js/materialbox.js +453 -0
  97. data/assets/themes/j1/modules/materialize/js/modal.js +382 -0
  98. data/assets/themes/j1/modules/materialize/js/parallax.js +138 -0
  99. data/assets/themes/j1/modules/materialize/js/pushpin.js +145 -0
  100. data/assets/themes/j1/modules/materialize/js/range.js +263 -0
  101. data/assets/themes/j1/modules/materialize/js/ripple.js +335 -0
  102. data/assets/themes/j1/modules/materialize/js/scrollspy.js +295 -0
  103. data/assets/themes/j1/modules/materialize/js/select.js +432 -0
  104. data/assets/themes/j1/modules/materialize/js/sidenav.js +580 -0
  105. data/assets/themes/j1/modules/materialize/js/slider.js +359 -0
  106. data/assets/themes/j1/modules/materialize/js/tabs.js +402 -0
  107. data/assets/themes/j1/modules/materialize/js/tapTarget.js +314 -0
  108. data/assets/themes/j1/modules/materialize/js/timepicker.js +647 -0
  109. data/assets/themes/j1/modules/materialize/js/toasts.js +310 -0
  110. data/assets/themes/j1/modules/materialize/js/tooltip.js +303 -0
  111. data/assets/themes/j1/modules/materialize/js/waves.js +335 -0
  112. data/assets/themes/j1/modules/materialize/scss/components/_badges.scss +55 -0
  113. data/assets/themes/j1/modules/materialize/scss/components/_buttons.scss +322 -0
  114. data/assets/themes/j1/modules/materialize/scss/components/_cards.scss +195 -0
  115. data/assets/themes/j1/modules/materialize/scss/components/_carousel.scss +90 -0
  116. data/assets/themes/j1/modules/materialize/scss/components/_chips.scss +90 -0
  117. data/assets/themes/j1/modules/materialize/scss/components/_collapsible.scss +91 -0
  118. data/assets/themes/j1/modules/materialize/scss/components/_color-classes.scss +32 -0
  119. data/assets/themes/j1/modules/materialize/scss/components/_color-variables.scss +370 -0
  120. data/assets/themes/j1/modules/materialize/scss/components/_datepicker.scss +191 -0
  121. data/assets/themes/j1/modules/materialize/scss/components/_dropdown.scss +85 -0
  122. data/assets/themes/j1/modules/materialize/scss/components/_global.scss +769 -0
  123. data/assets/themes/j1/modules/materialize/scss/components/_grid.scss +156 -0
  124. data/assets/themes/j1/modules/materialize/scss/components/_icons-material-design.scss +5 -0
  125. data/assets/themes/j1/modules/materialize/scss/components/_materialbox.scss +43 -0
  126. data/assets/themes/j1/modules/materialize/scss/components/_modal.scss +94 -0
  127. data/assets/themes/j1/modules/materialize/scss/components/_navbar.scss +208 -0
  128. data/assets/themes/j1/modules/materialize/scss/components/_normalize.scss +447 -0
  129. data/assets/themes/j1/modules/materialize/scss/components/_preloader.scss +334 -0
  130. data/assets/themes/j1/modules/materialize/scss/components/_pulse.scss +34 -0
  131. data/assets/themes/j1/modules/materialize/scss/components/_sidenav.scss +216 -0
  132. data/assets/themes/j1/modules/materialize/scss/components/_slider.scss +92 -0
  133. data/assets/themes/j1/modules/materialize/scss/components/_table_of_contents.scss +33 -0
  134. data/assets/themes/j1/modules/materialize/scss/components/_tabs.scss +99 -0
  135. data/assets/themes/j1/modules/materialize/scss/components/_tapTarget.scss +103 -0
  136. data/assets/themes/j1/modules/materialize/scss/components/_timepicker.scss +183 -0
  137. data/assets/themes/j1/modules/materialize/scss/components/_toast.scss +58 -0
  138. data/assets/themes/j1/modules/materialize/scss/components/_tooltip.scss +32 -0
  139. data/assets/themes/j1/modules/materialize/scss/components/_transitions.scss +13 -0
  140. data/assets/themes/j1/modules/materialize/scss/components/_typography.scss +60 -0
  141. data/assets/themes/j1/modules/materialize/scss/components/_variables.scss +349 -0
  142. data/assets/themes/j1/modules/materialize/scss/components/_waves.scss +114 -0
  143. data/assets/themes/j1/modules/materialize/scss/components/forms/_checkboxes.scss +200 -0
  144. data/assets/themes/j1/modules/materialize/scss/components/forms/_file-input.scss +44 -0
  145. data/assets/themes/j1/modules/materialize/scss/components/forms/_forms.scss +22 -0
  146. data/assets/themes/j1/modules/materialize/scss/components/forms/_input-fields.scss +354 -0
  147. data/assets/themes/j1/modules/materialize/scss/components/forms/_radio-buttons.scss +115 -0
  148. data/assets/themes/j1/modules/materialize/scss/components/forms/_range.scss +161 -0
  149. data/assets/themes/j1/modules/materialize/scss/components/forms/_select.scss +180 -0
  150. data/assets/themes/j1/modules/materialize/scss/components/forms/_switches.scss +89 -0
  151. data/assets/themes/j1/modules/materialize/scss/materialize.scss +41 -0
  152. data/assets/themes/j1/modules/{bsThemeSwitcher → themeSwitcher}/js/switcher.js +0 -0
  153. data/assets/themes/j1/modules/{bsThemeSwitcher → themeSwitcher}/js/switcher.min.js +0 -0
  154. data/lib/j1/version.rb +1 -1
  155. data/lib/starter_web/Gemfile +12 -16
  156. data/lib/starter_web/_config.yml +95 -21
  157. data/lib/starter_web/_data/blocks/banner.yml +1 -1
  158. data/lib/starter_web/_data/blocks/panel.yml +6 -6
  159. data/lib/starter_web/_data/j1_config.yml +7 -6
  160. data/lib/starter_web/_data/layouts/home.yml +13 -3
  161. data/lib/starter_web/_data/layouts/page.yml +10 -0
  162. data/lib/starter_web/_data/layouts/post.yml +10 -0
  163. data/lib/starter_web/_data/modules/defaults/{ssm.yml → fam.yml} +12 -15
  164. data/lib/starter_web/_data/modules/defaults/lunr_search.yml +171 -0
  165. data/lib/starter_web/_data/modules/defaults/navigator.yml +4 -4
  166. data/lib/starter_web/_data/modules/defaults/toccer.yml +4 -2
  167. data/lib/starter_web/_data/modules/fam.yml +158 -0
  168. data/lib/starter_web/_data/modules/{back2top.yml → lunr_search.yml} +15 -9
  169. data/lib/starter_web/_data/modules/navigator.yml +2 -2
  170. data/lib/starter_web/_data/modules/navigator_menu.yml +57 -6
  171. data/lib/starter_web/_data/modules/toccer.yml +0 -73
  172. data/lib/starter_web/_data/resources.yml +151 -104
  173. data/lib/starter_web/_includes/attributes.asciidoc +2 -2
  174. data/lib/starter_web/_includes/breadcrumbs.html +11 -0
  175. data/lib/starter_web/_plugins/debug.rb +0 -1
  176. data/lib/starter_web/_plugins/filters.rb +0 -1
  177. data/lib/starter_web/_plugins/{lorem-inline.rb → lorem_inline.rb} +1 -2
  178. data/lib/starter_web/_plugins/lunr_index.rb +313 -0
  179. data/lib/starter_web/_plugins/prettify.rb +0 -3
  180. data/lib/starter_web/_plugins/simple_search_filter.rb +0 -1
  181. data/lib/starter_web/_plugins/symlink_watcher.rb +2 -3
  182. data/lib/starter_web/assets/images/modules/attics/banner/lunr-banner-1280x800.jpg +0 -0
  183. data/lib/starter_web/assets/images/pages/winlogbeat/coordinate-map.png +0 -0
  184. data/lib/starter_web/assets/images/pages/winlogbeat/kibana-powershell.jpg +0 -0
  185. data/lib/starter_web/assets/images/pages/winlogbeat/option_ignore_outgoing.png +0 -0
  186. data/lib/starter_web/assets/images/pages/winlogbeat/winlogbeat-dashboard.png +0 -0
  187. data/lib/starter_web/collections/posts/public/featured/_posts/2018-05-01-confusion-about-base-url.adoc +2 -4
  188. data/lib/starter_web/collections/posts/public/featured/_posts/2019-05-01-top-open-source-static-site-generators.adoc +4 -2
  189. data/lib/starter_web/collections/posts/public/featured/_posts/2019-06-01-about-cookies.adoc +3 -2
  190. data/lib/starter_web/collections/posts/public/series/_posts/2018-11-01-docker-using-shared-folders.adoc +5 -4
  191. data/lib/starter_web/collections/posts/public/series/_posts/2020-01-01-post-test-series.adoc +144 -0
  192. data/lib/starter_web/collections/posts/public/series/_posts/2020-01-02-post-test-series.adoc +146 -0
  193. data/lib/starter_web/collections/posts/public/series/_posts/2020-01-03-post-test-series.adoc +146 -0
  194. data/lib/starter_web/collections/posts/public/series/_posts/2020-01-04-post-test-series.adoc +146 -0
  195. data/lib/starter_web/collections/posts/public/test_posts/_posts/2020-09-11-test_post.adoc +2 -4
  196. data/lib/starter_web/collections/posts/public/wikipedia/_posts/2016-11-20-minneapolis.adoc +2 -3
  197. data/lib/starter_web/collections/posts/public/wikipedia/_posts/2016-11-24-narcisse-snake-dens.adoc +2 -7
  198. data/lib/starter_web/collections/posts/public/wikipedia/_posts/2016-11-26-columbia-river.adoc +2 -6
  199. data/lib/starter_web/index.html +16 -10
  200. data/lib/starter_web/package.json +5 -2
  201. data/lib/starter_web/pages/public/about/about_site.adoc +0 -2
  202. data/lib/starter_web/pages/public/about/become_a_patron.adoc +1 -3
  203. data/lib/starter_web/pages/public/blog/navigator/archive.html +8 -1
  204. data/lib/starter_web/pages/public/blog/navigator/archive/categoryview.html +7 -3
  205. data/lib/starter_web/pages/public/blog/navigator/archive/dateview.html +8 -1
  206. data/lib/starter_web/pages/public/blog/navigator/archive/tagview.html +7 -2
  207. data/lib/starter_web/pages/public/blog/navigator/index.html +6 -2
  208. data/lib/starter_web/pages/public/learn/kickstarter/web_in_a_day/100_meet_and_greet_jekyll.adoc +3 -4
  209. data/lib/starter_web/pages/public/learn/kickstarter/web_in_a_day/200_preparations.adoc +3 -4
  210. data/lib/starter_web/pages/public/learn/kickstarter/web_in_a_day/300_first_awesome_web.adoc +3 -4
  211. data/lib/starter_web/pages/public/learn/roundtrip/100_present_images.adoc +25 -20
  212. data/lib/starter_web/pages/public/learn/roundtrip/100_present_videos.adoc +14 -12
  213. data/lib/starter_web/pages/public/learn/roundtrip/200_typography.adoc +20 -20
  214. data/lib/starter_web/pages/public/learn/roundtrip/300_icon_fonts.adoc +13 -8
  215. data/lib/starter_web/pages/public/learn/roundtrip/400_asciidoc_extensions.adoc +14 -9
  216. data/lib/starter_web/pages/public/learn/roundtrip/410_bs_modals_extentions.adoc +9 -6
  217. data/lib/starter_web/pages/public/learn/roundtrip/420_responsive_tables_extensions.adoc +62 -8
  218. data/lib/starter_web/pages/public/learn/roundtrip/500_themes.adoc +9 -7
  219. data/lib/starter_web/pages/public/learn/roundtrip/600_lunr.adoc +237 -0
  220. data/lib/starter_web/pages/public/learn/roundtrip/610_fam.adoc +302 -0
  221. data/lib/starter_web/pages/public/learn/where_to_go.adoc +3 -7
  222. data/lib/starter_web/pages/public/legal/de/100_impress.adoc +3 -2
  223. data/lib/starter_web/pages/public/legal/de/200_terms_of_use.adoc +2 -1
  224. data/lib/starter_web/pages/public/legal/de/300_privacy.adoc +2 -1
  225. data/lib/starter_web/pages/public/legal/de/400_license_agreement.adoc +2 -1
  226. data/lib/starter_web/pages/public/legal/de/500_support.adoc +2 -1
  227. data/lib/starter_web/pages/public/legal/en/000_copyright.adoc +30 -27
  228. data/lib/starter_web/pages/public/legal/en/100_impress.adoc +8 -5
  229. data/lib/starter_web/pages/public/legal/en/200_terms_of_use.adoc +12 -8
  230. data/lib/starter_web/pages/public/legal/en/300_privacy.adoc +7 -0
  231. data/lib/starter_web/pages/public/legal/en/400_license_agreement.adoc +8 -1
  232. data/lib/starter_web/pages/public/legal/en/500_support.adoc +8 -1
  233. data/lib/starter_web/pages/public/previewer/bootstrap_theme.adoc +3 -1
  234. data/lib/starter_web/pages/public/previewer/iframer.adoc +36 -28
  235. data/lib/starter_web/pages/public/previewer/justified_gallery.html +2 -1
  236. data/lib/starter_web/pages/public/previewer/mdi_icons_preview.adoc +2 -1
  237. data/lib/starter_web/pages/public/previewer/rouge.adoc +4 -2
  238. data/lib/starter_web/pages/public/previewer/twitter_emoji_preview.adoc +2 -1
  239. data/lib/starter_web/pages/public/test_pages/breadcrumbs_tester.adoc +62 -0
  240. data/lib/starter_web/pages/public/test_pages/deck_of_posts.adoc +3 -0
  241. data/lib/starter_web/pages/public/test_pages/floating_actions_button.adoc +523 -0
  242. data/lib/starter_web/pages/public/test_pages/floating_ad.adoc +1 -0
  243. data/lib/starter_web/pages/public/test_pages/floating_div.adoc +1 -0
  244. data/lib/starter_web/pages/public/test_pages/lunr_tester.adoc +89 -0
  245. data/lib/starter_web/pages/public/test_pages/nav_pagination_tester.adoc +1 -0
  246. data/lib/starter_web/pages/public/test_pages/page_attribute_tester.adoc +1 -0
  247. data/lib/starter_web/pages/public/test_pages/responsive_images.adoc +3 -2
  248. data/lib/starter_web/pages/public/test_pages/responsive_tables.adoc +1 -0
  249. data/lib/starter_web/pages/public/test_pages/toccer_tester.adoc +2245 -0
  250. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  251. data/lib/starter_web/utilsrv/package.json +1 -1
  252. metadata +137 -29
  253. data/assets/data/search.json +0 -165
  254. data/assets/data/ssm.html +0 -242
  255. data/assets/themes/j1/adapter/js/back2top.js +0 -231
  256. data/assets/themes/j1/modules/jekyllSearch/js/simple-jekyll-search.js +0 -468
  257. data/assets/themes/j1/modules/jekyllSearch/js/simple-jekyll-search.min.js +0 -6
  258. data/assets/themes/j1/modules/tocbot/css/theme/uno.css +0 -95
  259. data/assets/themes/j1/modules/tocbot/css/theme/uno.min.css +0 -15
  260. data/assets/themes/j1/modules/tocbot/css/tocbot.css +0 -75
  261. data/assets/themes/j1/modules/tocbot/css/tocbot.min.css +0 -19
  262. data/assets/themes/j1/modules/tocbot/js/tocbot.js +0 -19
  263. data/assets/themes/j1/modules/tocbot/js/tocbot.min.js +0 -19
  264. data/lib/starter_web/_data/modules/defaults/back2top.yml +0 -146
  265. data/lib/starter_web/_data/modules/defaults/stickybits.yml +0 -36
  266. data/lib/starter_web/_data/modules/ssm.yml +0 -142
@@ -0,0 +1,136 @@
1
+ (function($) {
2
+ 'use strict';
3
+
4
+ let _defaults = {};
5
+
6
+ /**
7
+ * @class
8
+ *
9
+ */
10
+ class CharacterCounter extends Component {
11
+ /**
12
+ * Construct CharacterCounter instance
13
+ * @constructor
14
+ * @param {Element} el
15
+ * @param {Object} options
16
+ */
17
+ constructor(el, options) {
18
+ super(CharacterCounter, el, options);
19
+
20
+ this.el.M_CharacterCounter = this;
21
+
22
+ /**
23
+ * Options for the character counter
24
+ */
25
+ this.options = $.extend({}, CharacterCounter.defaults, options);
26
+
27
+ this.isInvalid = false;
28
+ this.isValidLength = false;
29
+ this._setupCounter();
30
+ this._setupEventHandlers();
31
+ }
32
+
33
+ static get defaults() {
34
+ return _defaults;
35
+ }
36
+
37
+ static init(els, options) {
38
+ return super.init(this, els, options);
39
+ }
40
+
41
+ /**
42
+ * Get Instance
43
+ */
44
+ static getInstance(el) {
45
+ let domElem = !!el.jquery ? el[0] : el;
46
+ return domElem.M_CharacterCounter;
47
+ }
48
+
49
+ /**
50
+ * Teardown component
51
+ */
52
+ destroy() {
53
+ this._removeEventHandlers();
54
+ this.el.CharacterCounter = undefined;
55
+ this._removeCounter();
56
+ }
57
+
58
+ /**
59
+ * Setup Event Handlers
60
+ */
61
+ _setupEventHandlers() {
62
+ this._handleUpdateCounterBound = this.updateCounter.bind(this);
63
+
64
+ this.el.addEventListener('focus', this._handleUpdateCounterBound, true);
65
+ this.el.addEventListener('input', this._handleUpdateCounterBound, true);
66
+ }
67
+
68
+ /**
69
+ * Remove Event Handlers
70
+ */
71
+ _removeEventHandlers() {
72
+ this.el.removeEventListener('focus', this._handleUpdateCounterBound, true);
73
+ this.el.removeEventListener('input', this._handleUpdateCounterBound, true);
74
+ }
75
+
76
+ /**
77
+ * Setup counter element
78
+ */
79
+ _setupCounter() {
80
+ this.counterEl = document.createElement('span');
81
+ $(this.counterEl)
82
+ .addClass('character-counter')
83
+ .css({
84
+ float: 'right',
85
+ 'font-size': '12px',
86
+ height: 1
87
+ });
88
+
89
+ this.$el.parent().append(this.counterEl);
90
+ }
91
+
92
+ /**
93
+ * Remove counter element
94
+ */
95
+ _removeCounter() {
96
+ $(this.counterEl).remove();
97
+ }
98
+
99
+ /**
100
+ * Update counter
101
+ */
102
+ updateCounter() {
103
+ let maxLength = +this.$el.attr('data-length'),
104
+ actualLength = this.el.value.length;
105
+ this.isValidLength = actualLength <= maxLength;
106
+ let counterString = actualLength;
107
+
108
+ if (maxLength) {
109
+ counterString += '/' + maxLength;
110
+ this._validateInput();
111
+ }
112
+
113
+ $(this.counterEl).html(counterString);
114
+ }
115
+
116
+ /**
117
+ * Add validation classes
118
+ */
119
+ _validateInput() {
120
+ if (this.isValidLength && this.isInvalid) {
121
+ this.isInvalid = false;
122
+ this.$el.removeClass('invalid');
123
+ } else if (!this.isValidLength && !this.isInvalid) {
124
+ this.isInvalid = true;
125
+ this.$el.removeClass('valid');
126
+ this.$el.addClass('invalid');
127
+ }
128
+ }
129
+ }
130
+
131
+ M.CharacterCounter = CharacterCounter;
132
+
133
+ if (M.jQueryLoaded) {
134
+ M.initializeJqueryWrapper(CharacterCounter, 'characterCounter', 'M_CharacterCounter');
135
+ }
136
+ })(cash);
@@ -0,0 +1,481 @@
1
+ (function($) {
2
+ 'use strict';
3
+
4
+ let _defaults = {
5
+ data: [],
6
+ placeholder: '',
7
+ secondaryPlaceholder: '',
8
+ autocompleteOptions: {},
9
+ limit: Infinity,
10
+ onChipAdd: null,
11
+ onChipSelect: null,
12
+ onChipDelete: null
13
+ };
14
+
15
+ /**
16
+ * @typedef {Object} chip
17
+ * @property {String} tag chip tag string
18
+ * @property {String} [image] chip avatar image string
19
+ */
20
+
21
+ /**
22
+ * @class
23
+ *
24
+ */
25
+ class Chips extends Component {
26
+ /**
27
+ * Construct Chips instance and set up overlay
28
+ * @constructor
29
+ * @param {Element} el
30
+ * @param {Object} options
31
+ */
32
+ constructor(el, options) {
33
+ super(Chips, el, options);
34
+
35
+ this.el.M_Chips = this;
36
+
37
+ /**
38
+ * Options for the modal
39
+ * @member Chips#options
40
+ * @prop {Array} data
41
+ * @prop {String} placeholder
42
+ * @prop {String} secondaryPlaceholder
43
+ * @prop {Object} autocompleteOptions
44
+ */
45
+ this.options = $.extend({}, Chips.defaults, options);
46
+
47
+ this.$el.addClass('chips input-field');
48
+ this.chipsData = [];
49
+ this.$chips = $();
50
+ this._setupInput();
51
+ this.hasAutocomplete = Object.keys(this.options.autocompleteOptions).length > 0;
52
+
53
+ // Set input id
54
+ if (!this.$input.attr('id')) {
55
+ this.$input.attr('id', M.guid());
56
+ }
57
+
58
+ // Render initial chips
59
+ if (this.options.data.length) {
60
+ this.chipsData = this.options.data;
61
+ this._renderChips(this.chipsData);
62
+ }
63
+
64
+ // Setup autocomplete if needed
65
+ if (this.hasAutocomplete) {
66
+ this._setupAutocomplete();
67
+ }
68
+
69
+ this._setPlaceholder();
70
+ this._setupLabel();
71
+ this._setupEventHandlers();
72
+ }
73
+
74
+ static get defaults() {
75
+ return _defaults;
76
+ }
77
+
78
+ static init(els, options) {
79
+ return super.init(this, els, options);
80
+ }
81
+
82
+ /**
83
+ * Get Instance
84
+ */
85
+ static getInstance(el) {
86
+ let domElem = !!el.jquery ? el[0] : el;
87
+ return domElem.M_Chips;
88
+ }
89
+
90
+ /**
91
+ * Get Chips Data
92
+ */
93
+ getData() {
94
+ return this.chipsData;
95
+ }
96
+
97
+ /**
98
+ * Teardown component
99
+ */
100
+ destroy() {
101
+ this._removeEventHandlers();
102
+ this.$chips.remove();
103
+ this.el.M_Chips = undefined;
104
+ }
105
+
106
+ /**
107
+ * Setup Event Handlers
108
+ */
109
+ _setupEventHandlers() {
110
+ this._handleChipClickBound = this._handleChipClick.bind(this);
111
+ this._handleInputKeydownBound = this._handleInputKeydown.bind(this);
112
+ this._handleInputFocusBound = this._handleInputFocus.bind(this);
113
+ this._handleInputBlurBound = this._handleInputBlur.bind(this);
114
+
115
+ this.el.addEventListener('click', this._handleChipClickBound);
116
+ document.addEventListener('keydown', Chips._handleChipsKeydown);
117
+ document.addEventListener('keyup', Chips._handleChipsKeyup);
118
+ this.el.addEventListener('blur', Chips._handleChipsBlur, true);
119
+ this.$input[0].addEventListener('focus', this._handleInputFocusBound);
120
+ this.$input[0].addEventListener('blur', this._handleInputBlurBound);
121
+ this.$input[0].addEventListener('keydown', this._handleInputKeydownBound);
122
+ }
123
+
124
+ /**
125
+ * Remove Event Handlers
126
+ */
127
+ _removeEventHandlers() {
128
+ this.el.removeEventListener('click', this._handleChipClickBound);
129
+ document.removeEventListener('keydown', Chips._handleChipsKeydown);
130
+ document.removeEventListener('keyup', Chips._handleChipsKeyup);
131
+ this.el.removeEventListener('blur', Chips._handleChipsBlur, true);
132
+ this.$input[0].removeEventListener('focus', this._handleInputFocusBound);
133
+ this.$input[0].removeEventListener('blur', this._handleInputBlurBound);
134
+ this.$input[0].removeEventListener('keydown', this._handleInputKeydownBound);
135
+ }
136
+
137
+ /**
138
+ * Handle Chip Click
139
+ * @param {Event} e
140
+ */
141
+ _handleChipClick(e) {
142
+ let $chip = $(e.target).closest('.chip');
143
+ let clickedClose = $(e.target).is('.close');
144
+ if ($chip.length) {
145
+ let index = $chip.index();
146
+ if (clickedClose) {
147
+ // delete chip
148
+ this.deleteChip(index);
149
+ this.$input[0].focus();
150
+ } else {
151
+ // select chip
152
+ this.selectChip(index);
153
+ }
154
+
155
+ // Default handle click to focus on input
156
+ } else {
157
+ this.$input[0].focus();
158
+ }
159
+ }
160
+
161
+ /**
162
+ * Handle Chips Keydown
163
+ * @param {Event} e
164
+ */
165
+ static _handleChipsKeydown(e) {
166
+ Chips._keydown = true;
167
+
168
+ let $chips = $(e.target).closest('.chips');
169
+ let chipsKeydown = e.target && $chips.length;
170
+
171
+ // Don't handle keydown inputs on input and textarea
172
+ if ($(e.target).is('input, textarea') || !chipsKeydown) {
173
+ return;
174
+ }
175
+
176
+ let currChips = $chips[0].M_Chips;
177
+
178
+ // backspace and delete
179
+ if (e.keyCode === 8 || e.keyCode === 46) {
180
+ e.preventDefault();
181
+
182
+ let selectIndex = currChips.chipsData.length;
183
+ if (currChips._selectedChip) {
184
+ let index = currChips._selectedChip.index();
185
+ currChips.deleteChip(index);
186
+ currChips._selectedChip = null;
187
+
188
+ // Make sure selectIndex doesn't go negative
189
+ selectIndex = Math.max(index - 1, 0);
190
+ }
191
+
192
+ if (currChips.chipsData.length) {
193
+ currChips.selectChip(selectIndex);
194
+ }
195
+
196
+ // left arrow key
197
+ } else if (e.keyCode === 37) {
198
+ if (currChips._selectedChip) {
199
+ let selectIndex = currChips._selectedChip.index() - 1;
200
+ if (selectIndex < 0) {
201
+ return;
202
+ }
203
+ currChips.selectChip(selectIndex);
204
+ }
205
+
206
+ // right arrow key
207
+ } else if (e.keyCode === 39) {
208
+ if (currChips._selectedChip) {
209
+ let selectIndex = currChips._selectedChip.index() + 1;
210
+
211
+ if (selectIndex >= currChips.chipsData.length) {
212
+ currChips.$input[0].focus();
213
+ } else {
214
+ currChips.selectChip(selectIndex);
215
+ }
216
+ }
217
+ }
218
+ }
219
+
220
+ /**
221
+ * Handle Chips Keyup
222
+ * @param {Event} e
223
+ */
224
+ static _handleChipsKeyup(e) {
225
+ Chips._keydown = false;
226
+ }
227
+
228
+ /**
229
+ * Handle Chips Blur
230
+ * @param {Event} e
231
+ */
232
+ static _handleChipsBlur(e) {
233
+ if (!Chips._keydown) {
234
+ let $chips = $(e.target).closest('.chips');
235
+ let currChips = $chips[0].M_Chips;
236
+
237
+ currChips._selectedChip = null;
238
+ }
239
+ }
240
+
241
+ /**
242
+ * Handle Input Focus
243
+ */
244
+ _handleInputFocus() {
245
+ this.$el.addClass('focus');
246
+ }
247
+
248
+ /**
249
+ * Handle Input Blur
250
+ */
251
+ _handleInputBlur() {
252
+ this.$el.removeClass('focus');
253
+ }
254
+
255
+ /**
256
+ * Handle Input Keydown
257
+ * @param {Event} e
258
+ */
259
+ _handleInputKeydown(e) {
260
+ Chips._keydown = true;
261
+
262
+ // enter
263
+ if (e.keyCode === 13) {
264
+ // Override enter if autocompleting.
265
+ if (this.hasAutocomplete && this.autocomplete && this.autocomplete.isOpen) {
266
+ return;
267
+ }
268
+
269
+ e.preventDefault();
270
+ this.addChip({
271
+ tag: this.$input[0].value
272
+ });
273
+ this.$input[0].value = '';
274
+
275
+ // delete or left
276
+ } else if (
277
+ (e.keyCode === 8 || e.keyCode === 37) &&
278
+ this.$input[0].value === '' &&
279
+ this.chipsData.length
280
+ ) {
281
+ e.preventDefault();
282
+ this.selectChip(this.chipsData.length - 1);
283
+ }
284
+ }
285
+
286
+ /**
287
+ * Render Chip
288
+ * @param {chip} chip
289
+ * @return {Element}
290
+ */
291
+ _renderChip(chip) {
292
+ if (!chip.tag) {
293
+ return;
294
+ }
295
+
296
+ let renderedChip = document.createElement('div');
297
+ let closeIcon = document.createElement('i');
298
+ renderedChip.classList.add('chip');
299
+ renderedChip.textContent = chip.tag;
300
+ renderedChip.setAttribute('tabindex', 0);
301
+ $(closeIcon).addClass('material-icons close');
302
+ closeIcon.textContent = 'close';
303
+
304
+ // attach image if needed
305
+ if (chip.image) {
306
+ let img = document.createElement('img');
307
+ img.setAttribute('src', chip.image);
308
+ renderedChip.insertBefore(img, renderedChip.firstChild);
309
+ }
310
+
311
+ renderedChip.appendChild(closeIcon);
312
+ return renderedChip;
313
+ }
314
+
315
+ /**
316
+ * Render Chips
317
+ */
318
+ _renderChips() {
319
+ this.$chips.remove();
320
+ for (let i = 0; i < this.chipsData.length; i++) {
321
+ let chipEl = this._renderChip(this.chipsData[i]);
322
+ this.$el.append(chipEl);
323
+ this.$chips.add(chipEl);
324
+ }
325
+
326
+ // move input to end
327
+ this.$el.append(this.$input[0]);
328
+ }
329
+
330
+ /**
331
+ * Setup Autocomplete
332
+ */
333
+ _setupAutocomplete() {
334
+ this.options.autocompleteOptions.onAutocomplete = (val) => {
335
+ this.addChip({
336
+ tag: val
337
+ });
338
+ this.$input[0].value = '';
339
+ this.$input[0].focus();
340
+ };
341
+
342
+ this.autocomplete = M.Autocomplete.init(this.$input[0], this.options.autocompleteOptions);
343
+ }
344
+
345
+ /**
346
+ * Setup Input
347
+ */
348
+ _setupInput() {
349
+ this.$input = this.$el.find('input');
350
+ if (!this.$input.length) {
351
+ this.$input = $('<input></input>');
352
+ this.$el.append(this.$input);
353
+ }
354
+
355
+ this.$input.addClass('input');
356
+ }
357
+
358
+ /**
359
+ * Setup Label
360
+ */
361
+ _setupLabel() {
362
+ this.$label = this.$el.find('label');
363
+ if (this.$label.length) {
364
+ this.$label.setAttribute('for', this.$input.attr('id'));
365
+ }
366
+ }
367
+
368
+ /**
369
+ * Set placeholder
370
+ */
371
+ _setPlaceholder() {
372
+ if (this.chipsData !== undefined && !this.chipsData.length && this.options.placeholder) {
373
+ $(this.$input).prop('placeholder', this.options.placeholder);
374
+ } else if (
375
+ (this.chipsData === undefined || !!this.chipsData.length) &&
376
+ this.options.secondaryPlaceholder
377
+ ) {
378
+ $(this.$input).prop('placeholder', this.options.secondaryPlaceholder);
379
+ }
380
+ }
381
+
382
+ /**
383
+ * Check if chip is valid
384
+ * @param {chip} chip
385
+ */
386
+ _isValid(chip) {
387
+ if (chip.hasOwnProperty('tag') && chip.tag !== '') {
388
+ let exists = false;
389
+ for (let i = 0; i < this.chipsData.length; i++) {
390
+ if (this.chipsData[i].tag === chip.tag) {
391
+ exists = true;
392
+ break;
393
+ }
394
+ }
395
+ return !exists;
396
+ }
397
+
398
+ return false;
399
+ }
400
+
401
+ /**
402
+ * Add chip
403
+ * @param {chip} chip
404
+ */
405
+ addChip(chip) {
406
+ if (!this._isValid(chip) || this.chipsData.length >= this.options.limit) {
407
+ return;
408
+ }
409
+
410
+ let renderedChip = this._renderChip(chip);
411
+ this.$chips.add(renderedChip);
412
+ this.chipsData.push(chip);
413
+ $(this.$input).before(renderedChip);
414
+ this._setPlaceholder();
415
+
416
+ // fire chipAdd callback
417
+ if (typeof this.options.onChipAdd === 'function') {
418
+ this.options.onChipAdd.call(this, this.$el, renderedChip);
419
+ }
420
+ }
421
+
422
+ /**
423
+ * Delete chip
424
+ * @param {Number} chip
425
+ */
426
+ deleteChip(chipIndex) {
427
+ let $chip = this.$chips.eq(chipIndex);
428
+ this.$chips.eq(chipIndex).remove();
429
+ this.$chips = this.$chips.filter(function(el) {
430
+ return $(el).index() >= 0;
431
+ });
432
+ this.chipsData.splice(chipIndex, 1);
433
+ this._setPlaceholder();
434
+
435
+ // fire chipDelete callback
436
+ if (typeof this.options.onChipDelete === 'function') {
437
+ this.options.onChipDelete.call(this, this.$el, $chip[0]);
438
+ }
439
+ }
440
+
441
+ /**
442
+ * Select chip
443
+ * @param {Number} chip
444
+ */
445
+ selectChip(chipIndex) {
446
+ let $chip = this.$chips.eq(chipIndex);
447
+ this._selectedChip = $chip;
448
+ $chip[0].focus();
449
+
450
+ // fire chipSelect callback
451
+ if (typeof this.options.onChipSelect === 'function') {
452
+ this.options.onChipSelect.call(this, this.$el, $chip[0]);
453
+ }
454
+ }
455
+ }
456
+
457
+ /**
458
+ * @static
459
+ * @memberof Chips
460
+ */
461
+ Chips._keydown = false;
462
+
463
+ M.Chips = Chips;
464
+
465
+ if (M.jQueryLoaded) {
466
+ M.initializeJqueryWrapper(Chips, 'chips', 'M_Chips');
467
+ }
468
+
469
+ $(document).ready(function() {
470
+ // Handle removal of static chips.
471
+ $(document.body).on('click', '.chip .close', function() {
472
+ let $chips = $(this).closest('.chips');
473
+ if ($chips.length && $chips[0].M_Chips) {
474
+ return;
475
+ }
476
+ $(this)
477
+ .closest('.chip')
478
+ .remove();
479
+ });
480
+ });
481
+ })(cash);