activeadmin_materialize_theme 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +26 -0
  4. data/Rakefile +34 -0
  5. data/app/assets/config/activeadmin_materialize_theme_manifest.js +1 -0
  6. data/app/assets/javascripts/activeadmin_materialize_theme.js +65 -0
  7. data/app/assets/javascripts/materialize/anime.min.js +34 -0
  8. data/app/assets/javascripts/materialize/autocomplete.js +450 -0
  9. data/app/assets/javascripts/materialize/bin/materialize.js +12374 -0
  10. data/app/assets/javascripts/materialize/bin/materialize.min.js +6 -0
  11. data/app/assets/javascripts/materialize/buttons.js +354 -0
  12. data/app/assets/javascripts/materialize/cards.js +40 -0
  13. data/app/assets/javascripts/materialize/carousel.js +717 -0
  14. data/app/assets/javascripts/materialize/cash.js +960 -0
  15. data/app/assets/javascripts/materialize/characterCounter.js +136 -0
  16. data/app/assets/javascripts/materialize/chips.js +481 -0
  17. data/app/assets/javascripts/materialize/collapsible.js +275 -0
  18. data/app/assets/javascripts/materialize/component.js +44 -0
  19. data/app/assets/javascripts/materialize/datepicker.js +975 -0
  20. data/app/assets/javascripts/materialize/dropdown.js +617 -0
  21. data/app/assets/javascripts/materialize/forms.js +275 -0
  22. data/app/assets/javascripts/materialize/global.js +427 -0
  23. data/app/assets/javascripts/materialize/materialbox.js +453 -0
  24. data/app/assets/javascripts/materialize/modal.js +382 -0
  25. data/app/assets/javascripts/materialize/parallax.js +138 -0
  26. data/app/assets/javascripts/materialize/pushpin.js +145 -0
  27. data/app/assets/javascripts/materialize/range.js +263 -0
  28. data/app/assets/javascripts/materialize/scrollspy.js +295 -0
  29. data/app/assets/javascripts/materialize/select.js +432 -0
  30. data/app/assets/javascripts/materialize/sidenav.js +580 -0
  31. data/app/assets/javascripts/materialize/slider.js +359 -0
  32. data/app/assets/javascripts/materialize/tabs.js +402 -0
  33. data/app/assets/javascripts/materialize/tapTarget.js +314 -0
  34. data/app/assets/javascripts/materialize/timepicker.js +647 -0
  35. data/app/assets/javascripts/materialize/toasts.js +310 -0
  36. data/app/assets/javascripts/materialize/tooltip.js +303 -0
  37. data/app/assets/javascripts/materialize/waves.js +335 -0
  38. data/app/assets/stylesheets/activeadmin_materialize_theme/base.scss +107 -0
  39. data/app/assets/stylesheets/activeadmin_materialize_theme/components/footer.scss +18 -0
  40. data/app/assets/stylesheets/activeadmin_materialize_theme/components/form.scss +140 -0
  41. data/app/assets/stylesheets/activeadmin_materialize_theme/components/header.scss +61 -0
  42. data/app/assets/stylesheets/activeadmin_materialize_theme/components/layout_index.scss +83 -0
  43. data/app/assets/stylesheets/activeadmin_materialize_theme/components/layout_show.scss +56 -0
  44. data/app/assets/stylesheets/activeadmin_materialize_theme/components/sidebar.scss +37 -0
  45. data/app/assets/stylesheets/activeadmin_materialize_theme/components/title_bar.scss +43 -0
  46. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/LICENSE +21 -0
  47. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/README.md +91 -0
  48. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_badges.scss +55 -0
  49. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_buttons.scss +322 -0
  50. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_cards.scss +195 -0
  51. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_carousel.scss +90 -0
  52. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_chips.scss +90 -0
  53. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_collapsible.scss +91 -0
  54. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_color-classes.scss +32 -0
  55. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_color-variables.scss +370 -0
  56. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_datepicker.scss +191 -0
  57. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_dropdown.scss +85 -0
  58. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_global.scss +769 -0
  59. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_grid.scss +156 -0
  60. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_icons-material-design.scss +5 -0
  61. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_materialbox.scss +43 -0
  62. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_modal.scss +94 -0
  63. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_navbar.scss +208 -0
  64. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_normalize.scss +447 -0
  65. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_preloader.scss +334 -0
  66. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_pulse.scss +34 -0
  67. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_sidenav.scss +216 -0
  68. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_slider.scss +92 -0
  69. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_table_of_contents.scss +33 -0
  70. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_tabs.scss +99 -0
  71. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_tapTarget.scss +103 -0
  72. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_timepicker.scss +183 -0
  73. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_toast.scss +58 -0
  74. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_tooltip.scss +32 -0
  75. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_transitions.scss +13 -0
  76. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_typography.scss +60 -0
  77. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_variables.scss +349 -0
  78. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_waves.scss +114 -0
  79. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/forms/_checkboxes.scss +200 -0
  80. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/forms/_file-input.scss +44 -0
  81. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/forms/_forms.scss +22 -0
  82. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/forms/_input-fields.scss +354 -0
  83. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/forms/_radio-buttons.scss +115 -0
  84. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/forms/_range.scss +161 -0
  85. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/forms/_select.scss +180 -0
  86. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/forms/_switches.scss +89 -0
  87. data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/materialize.scss +41 -0
  88. data/app/assets/stylesheets/activeadmin_materialize_theme/normalize.css +349 -0
  89. data/app/assets/stylesheets/activeadmin_materialize_theme/theme.scss +13 -0
  90. data/app/assets/stylesheets/activeadmin_materialize_theme/variables.scss +14 -0
  91. data/lib/activeadmin_materialize_theme.rb +6 -0
  92. data/lib/activeadmin_materialize_theme/engine.rb +7 -0
  93. data/lib/activeadmin_materialize_theme/version.rb +5 -0
  94. metadata +149 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6549ff445c844c97a9da951f609bc9dc831a2d4f2105e79821cc35d628f0c35b
4
+ data.tar.gz: e0b3ee1c6de8d2ec07cf450b694f1c82f96dd7749d39a88ad282dd697693e64c
5
+ SHA512:
6
+ metadata.gz: 4f7d306351a90d3f58526c5cc4f373226649fa9ddae22aa7cb94d8aae923aabff227bf891810be8b536d7f2f367d00cd7029863e10e07c84552e52f3fd166d63
7
+ data.tar.gz: 0dd6a6f8710dc9b980cf0791348ad9d898b7fa26ece978194f6f36dff7ebf0c660b73db0c76bd84288c357b11077b148d50d4905eacb5fc8f93fdfd1aa9eb1ce
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2020 Mattia Roccoberton
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,26 @@
1
+ # Active Admin Materialize Theme
2
+ A theme for Active Admin based on Materialize framework.
3
+
4
+ > NOTICE: this is still a beta version
5
+
6
+ ## Installation
7
+ - Add to the Gemfile: `gem 'activeadmin_materialize_theme'` (and execute `bundle`)
8
+ - In _app/assets/stylesheets/active_admin.scss_) leave only this import line:
9
+ ```scss
10
+ @import 'activeadmin_materialize_theme/theme';
11
+ ```
12
+ - Add at the end of your Active Admin javascripts (_app/assets/javascripts/active_admin.js_):
13
+ ```js
14
+ //= require activeadmin_materialize_theme
15
+ ```
16
+
17
+ ## Do you like it? Star it!
18
+ If you use this component just star it. A developer is more motivated to improve a project when there is some interest.
19
+
20
+ Take a look at [other Active Admin components](https://github.com/blocknotes?utf8=✓&tab=repositories&q=activeadmin&type=source) that I made if you are curious.
21
+
22
+ ## Contributors
23
+ [Mattia Roccoberton](http://blocknot.es): author
24
+
25
+ ## License
26
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ begin
4
+ require 'bundler/setup'
5
+ rescue LoadError
6
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
7
+ end
8
+
9
+ require 'rdoc/task'
10
+
11
+ RDoc::Task.new(:rdoc) do |rdoc|
12
+ rdoc.rdoc_dir = 'rdoc'
13
+ rdoc.title = 'ActiveadminMaterializeTheme'
14
+ rdoc.options << '--line-numbers'
15
+ rdoc.rdoc_files.include('README.md')
16
+ rdoc.rdoc_files.include('lib/**/*.rb')
17
+ end
18
+
19
+ APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
20
+ load 'rails/tasks/engine.rake'
21
+
22
+ load 'rails/tasks/statistics.rake'
23
+
24
+ require 'bundler/gem_tasks'
25
+
26
+ require 'rake/testtask'
27
+
28
+ Rake::TestTask.new(:test) do |t|
29
+ t.libs << 'test'
30
+ t.pattern = 'test/**/*_test.rb'
31
+ t.verbose = false
32
+ end
33
+
34
+ task default: :test
@@ -0,0 +1 @@
1
+ //= link_directory ../stylesheets/activeadmin_materialize_theme .css
@@ -0,0 +1,65 @@
1
+ //= require ./materialize/bin/materialize
2
+
3
+ (function () {
4
+ // --- functions -------------------------------------------------------------
5
+ function addClassToElements(class_name, elements) {
6
+ document.querySelectorAll(elements).forEach(
7
+ (el) => el.className += ' ' + class_name
8
+ )
9
+ }
10
+
11
+ function initCheckboxes() {
12
+ document.querySelectorAll('body.active_admin .resource_selection_cell').forEach((el) => {
13
+ const checkbox = el.querySelector('[type="checkbox"]')
14
+ const label = document.createElement('label')
15
+ const span = document.createElement('span')
16
+ label.appendChild(span)
17
+ el.appendChild(label)
18
+ label.insertBefore(checkbox, span)
19
+ })
20
+ }
21
+
22
+ function initDropdowns() {
23
+ let cnt = 0;
24
+ document.querySelectorAll('body.active_admin .dropdown_menu').forEach((el) => {
25
+ cnt += 1
26
+ button = el.querySelector('.dropdown_menu_button')
27
+ button.className += ' dropdown-trigger'
28
+ button.setAttribute('data-target', `#dropdown-${cnt}`)
29
+ button.setAttribute('href', 'Javascript:void(0)')
30
+ list_wrapper = el.querySelector('.dropdown_menu_list_wrapper')
31
+ list_wrapper.className += ' dropdown-content'
32
+ list_wrapper.setAttribute('id', `#dropdown-${cnt}`)
33
+ })
34
+ }
35
+
36
+ function initFormFields() {
37
+ addClassToElements('input-field', 'body.active_admin .formtastic .input')
38
+ addClassToElements('materialize-textarea', 'body.active_admin .formtastic textarea')
39
+ document.querySelectorAll('body.active_admin .input-field.boolean > label').forEach((el) => {
40
+ const text = el.lastChild
41
+ if (text.nodeType == Node.TEXT_NODE) {
42
+ const span = document.createElement('span')
43
+ span.innerHTML = text.textContent
44
+ text.replaceWith(span)
45
+ }
46
+ })
47
+ }
48
+
49
+ function setup() {
50
+ addClassToElements('no-autoinit', 'body.active_admin #header >.tabs')
51
+ initCheckboxes()
52
+ initDropdowns()
53
+ initFormFields()
54
+ M.AutoInit()
55
+ }
56
+
57
+ // --- events ----------------------------------------------------------------
58
+ document.addEventListener('DOMContentLoaded', () => {
59
+ setup()
60
+ })
61
+
62
+ $(document).on('has_many_add:after', '.has_many_container', () => {
63
+ setup()
64
+ })
65
+ })()
@@ -0,0 +1,34 @@
1
+ /*
2
+ v2.2.0
3
+ 2017 Julian Garnier
4
+ Released under the MIT license
5
+ */
6
+ var $jscomp={scope:{}};$jscomp.defineProperty="function"==typeof Object.defineProperties?Object.defineProperty:function(e,r,p){if(p.get||p.set)throw new TypeError("ES3 does not support getters and setters.");e!=Array.prototype&&e!=Object.prototype&&(e[r]=p.value)};$jscomp.getGlobal=function(e){return"undefined"!=typeof window&&window===e?e:"undefined"!=typeof global&&null!=global?global:e};$jscomp.global=$jscomp.getGlobal(this);$jscomp.SYMBOL_PREFIX="jscomp_symbol_";
7
+ $jscomp.initSymbol=function(){$jscomp.initSymbol=function(){};$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)};$jscomp.symbolCounter_=0;$jscomp.Symbol=function(e){return $jscomp.SYMBOL_PREFIX+(e||"")+$jscomp.symbolCounter_++};
8
+ $jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var e=$jscomp.global.Symbol.iterator;e||(e=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator"));"function"!=typeof Array.prototype[e]&&$jscomp.defineProperty(Array.prototype,e,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};$jscomp.arrayIterator=function(e){var r=0;return $jscomp.iteratorPrototype(function(){return r<e.length?{done:!1,value:e[r++]}:{done:!0}})};
9
+ $jscomp.iteratorPrototype=function(e){$jscomp.initSymbolIterator();e={next:e};e[$jscomp.global.Symbol.iterator]=function(){return this};return e};$jscomp.array=$jscomp.array||{};$jscomp.iteratorFromArray=function(e,r){$jscomp.initSymbolIterator();e instanceof String&&(e+="");var p=0,m={next:function(){if(p<e.length){var u=p++;return{value:r(u,e[u]),done:!1}}m.next=function(){return{done:!0,value:void 0}};return m.next()}};m[Symbol.iterator]=function(){return m};return m};
10
+ $jscomp.polyfill=function(e,r,p,m){if(r){p=$jscomp.global;e=e.split(".");for(m=0;m<e.length-1;m++){var u=e[m];u in p||(p[u]={});p=p[u]}e=e[e.length-1];m=p[e];r=r(m);r!=m&&null!=r&&$jscomp.defineProperty(p,e,{configurable:!0,writable:!0,value:r})}};$jscomp.polyfill("Array.prototype.keys",function(e){return e?e:function(){return $jscomp.iteratorFromArray(this,function(e){return e})}},"es6-impl","es3");var $jscomp$this=this;
11
+ (function(r){M.anime=r()})(function(){function e(a){if(!h.col(a))try{return document.querySelectorAll(a)}catch(c){}}function r(a,c){for(var d=a.length,b=2<=arguments.length?arguments[1]:void 0,f=[],n=0;n<d;n++)if(n in a){var k=a[n];c.call(b,k,n,a)&&f.push(k)}return f}function p(a){return a.reduce(function(a,d){return a.concat(h.arr(d)?p(d):d)},[])}function m(a){if(h.arr(a))return a;
12
+ h.str(a)&&(a=e(a)||a);return a instanceof NodeList||a instanceof HTMLCollection?[].slice.call(a):[a]}function u(a,c){return a.some(function(a){return a===c})}function C(a){var c={},d;for(d in a)c[d]=a[d];return c}function D(a,c){var d=C(a),b;for(b in a)d[b]=c.hasOwnProperty(b)?c[b]:a[b];return d}function z(a,c){var d=C(a),b;for(b in c)d[b]=h.und(a[b])?c[b]:a[b];return d}function T(a){a=a.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,function(a,c,d,k){return c+c+d+d+k+k});var c=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(a);
13
+ a=parseInt(c[1],16);var d=parseInt(c[2],16),c=parseInt(c[3],16);return"rgba("+a+","+d+","+c+",1)"}function U(a){function c(a,c,b){0>b&&(b+=1);1<b&&--b;return b<1/6?a+6*(c-a)*b:.5>b?c:b<2/3?a+(c-a)*(2/3-b)*6:a}var d=/hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.exec(a)||/hsla\((\d+),\s*([\d.]+)%,\s*([\d.]+)%,\s*([\d.]+)\)/g.exec(a);a=parseInt(d[1])/360;var b=parseInt(d[2])/100,f=parseInt(d[3])/100,d=d[4]||1;if(0==b)f=b=a=f;else{var n=.5>f?f*(1+b):f+b-f*b,k=2*f-n,f=c(k,n,a+1/3),b=c(k,n,a);a=c(k,n,a-1/3)}return"rgba("+
14
+ 255*f+","+255*b+","+255*a+","+d+")"}function y(a){if(a=/([\+\-]?[0-9#\.]+)(%|px|pt|em|rem|in|cm|mm|ex|ch|pc|vw|vh|vmin|vmax|deg|rad|turn)?$/.exec(a))return a[2]}function V(a){if(-1<a.indexOf("translate")||"perspective"===a)return"px";if(-1<a.indexOf("rotate")||-1<a.indexOf("skew"))return"deg"}function I(a,c){return h.fnc(a)?a(c.target,c.id,c.total):a}function E(a,c){if(c in a.style)return getComputedStyle(a).getPropertyValue(c.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase())||"0"}function J(a,c){if(h.dom(a)&&
15
+ u(W,c))return"transform";if(h.dom(a)&&(a.getAttribute(c)||h.svg(a)&&a[c]))return"attribute";if(h.dom(a)&&"transform"!==c&&E(a,c))return"css";if(null!=a[c])return"object"}function X(a,c){var d=V(c),d=-1<c.indexOf("scale")?1:0+d;a=a.style.transform;if(!a)return d;for(var b=[],f=[],n=[],k=/(\w+)\((.+?)\)/g;b=k.exec(a);)f.push(b[1]),n.push(b[2]);a=r(n,function(a,b){return f[b]===c});return a.length?a[0]:d}function K(a,c){switch(J(a,c)){case "transform":return X(a,c);case "css":return E(a,c);case "attribute":return a.getAttribute(c)}return a[c]||
16
+ 0}function L(a,c){var d=/^(\*=|\+=|-=)/.exec(a);if(!d)return a;var b=y(a)||0;c=parseFloat(c);a=parseFloat(a.replace(d[0],""));switch(d[0][0]){case "+":return c+a+b;case "-":return c-a+b;case "*":return c*a+b}}function F(a,c){return Math.sqrt(Math.pow(c.x-a.x,2)+Math.pow(c.y-a.y,2))}function M(a){a=a.points;for(var c=0,d,b=0;b<a.numberOfItems;b++){var f=a.getItem(b);0<b&&(c+=F(d,f));d=f}return c}function N(a){if(a.getTotalLength)return a.getTotalLength();switch(a.tagName.toLowerCase()){case "circle":return 2*
17
+ Math.PI*a.getAttribute("r");case "rect":return 2*a.getAttribute("width")+2*a.getAttribute("height");case "line":return F({x:a.getAttribute("x1"),y:a.getAttribute("y1")},{x:a.getAttribute("x2"),y:a.getAttribute("y2")});case "polyline":return M(a);case "polygon":var c=a.points;return M(a)+F(c.getItem(c.numberOfItems-1),c.getItem(0))}}function Y(a,c){function d(b){b=void 0===b?0:b;return a.el.getPointAtLength(1<=c+b?c+b:0)}var b=d(),f=d(-1),n=d(1);switch(a.property){case "x":return b.x;case "y":return b.y;
18
+ case "angle":return 180*Math.atan2(n.y-f.y,n.x-f.x)/Math.PI}}function O(a,c){var d=/-?\d*\.?\d+/g,b;b=h.pth(a)?a.totalLength:a;if(h.col(b))if(h.rgb(b)){var f=/rgb\((\d+,\s*[\d]+,\s*[\d]+)\)/g.exec(b);b=f?"rgba("+f[1]+",1)":b}else b=h.hex(b)?T(b):h.hsl(b)?U(b):void 0;else f=(f=y(b))?b.substr(0,b.length-f.length):b,b=c&&!/\s/g.test(b)?f+c:f;b+="";return{original:b,numbers:b.match(d)?b.match(d).map(Number):[0],strings:h.str(a)||c?b.split(d):[]}}function P(a){a=a?p(h.arr(a)?a.map(m):m(a)):[];return r(a,
19
+ function(a,d,b){return b.indexOf(a)===d})}function Z(a){var c=P(a);return c.map(function(a,b){return{target:a,id:b,total:c.length}})}function aa(a,c){var d=C(c);if(h.arr(a)){var b=a.length;2!==b||h.obj(a[0])?h.fnc(c.duration)||(d.duration=c.duration/b):a={value:a}}return m(a).map(function(a,b){b=b?0:c.delay;a=h.obj(a)&&!h.pth(a)?a:{value:a};h.und(a.delay)&&(a.delay=b);return a}).map(function(a){return z(a,d)})}function ba(a,c){var d={},b;for(b in a){var f=I(a[b],c);h.arr(f)&&(f=f.map(function(a){return I(a,
20
+ c)}),1===f.length&&(f=f[0]));d[b]=f}d.duration=parseFloat(d.duration);d.delay=parseFloat(d.delay);return d}function ca(a){return h.arr(a)?A.apply(this,a):Q[a]}function da(a,c){var d;return a.tweens.map(function(b){b=ba(b,c);var f=b.value,e=K(c.target,a.name),k=d?d.to.original:e,k=h.arr(f)?f[0]:k,w=L(h.arr(f)?f[1]:f,k),e=y(w)||y(k)||y(e);b.from=O(k,e);b.to=O(w,e);b.start=d?d.end:a.offset;b.end=b.start+b.delay+b.duration;b.easing=ca(b.easing);b.elasticity=(1E3-Math.min(Math.max(b.elasticity,1),999))/
21
+ 1E3;b.isPath=h.pth(f);b.isColor=h.col(b.from.original);b.isColor&&(b.round=1);return d=b})}function ea(a,c){return r(p(a.map(function(a){return c.map(function(b){var c=J(a.target,b.name);if(c){var d=da(b,a);b={type:c,property:b.name,animatable:a,tweens:d,duration:d[d.length-1].end,delay:d[0].delay}}else b=void 0;return b})})),function(a){return!h.und(a)})}function R(a,c,d,b){var f="delay"===a;return c.length?(f?Math.min:Math.max).apply(Math,c.map(function(b){return b[a]})):f?b.delay:d.offset+b.delay+
22
+ b.duration}function fa(a){var c=D(ga,a),d=D(S,a),b=Z(a.targets),f=[],e=z(c,d),k;for(k in a)e.hasOwnProperty(k)||"targets"===k||f.push({name:k,offset:e.offset,tweens:aa(a[k],d)});a=ea(b,f);return z(c,{children:[],animatables:b,animations:a,duration:R("duration",a,c,d),delay:R("delay",a,c,d)})}function q(a){function c(){return window.Promise&&new Promise(function(a){return p=a})}function d(a){return g.reversed?g.duration-a:a}function b(a){for(var b=0,c={},d=g.animations,f=d.length;b<f;){var e=d[b],
23
+ k=e.animatable,h=e.tweens,n=h.length-1,l=h[n];n&&(l=r(h,function(b){return a<b.end})[0]||l);for(var h=Math.min(Math.max(a-l.start-l.delay,0),l.duration)/l.duration,w=isNaN(h)?1:l.easing(h,l.elasticity),h=l.to.strings,p=l.round,n=[],m=void 0,m=l.to.numbers.length,t=0;t<m;t++){var x=void 0,x=l.to.numbers[t],q=l.from.numbers[t],x=l.isPath?Y(l.value,w*x):q+w*(x-q);p&&(l.isColor&&2<t||(x=Math.round(x*p)/p));n.push(x)}if(l=h.length)for(m=h[0],w=0;w<l;w++)p=h[w+1],t=n[w],isNaN(t)||(m=p?m+(t+p):m+(t+" "));
24
+ else m=n[0];ha[e.type](k.target,e.property,m,c,k.id);e.currentValue=m;b++}if(b=Object.keys(c).length)for(d=0;d<b;d++)H||(H=E(document.body,"transform")?"transform":"-webkit-transform"),g.animatables[d].target.style[H]=c[d].join(" ");g.currentTime=a;g.progress=a/g.duration*100}function f(a){if(g[a])g[a](g)}function e(){g.remaining&&!0!==g.remaining&&g.remaining--}function k(a){var k=g.duration,n=g.offset,w=n+g.delay,r=g.currentTime,x=g.reversed,q=d(a);if(g.children.length){var u=g.children,v=u.length;
25
+ if(q>=g.currentTime)for(var G=0;G<v;G++)u[G].seek(q);else for(;v--;)u[v].seek(q)}if(q>=w||!k)g.began||(g.began=!0,f("begin")),f("run");if(q>n&&q<k)b(q);else if(q<=n&&0!==r&&(b(0),x&&e()),q>=k&&r!==k||!k)b(k),x||e();f("update");a>=k&&(g.remaining?(t=h,"alternate"===g.direction&&(g.reversed=!g.reversed)):(g.pause(),g.completed||(g.completed=!0,f("complete"),"Promise"in window&&(p(),m=c()))),l=0)}a=void 0===a?{}:a;var h,t,l=0,p=null,m=c(),g=fa(a);g.reset=function(){var a=g.direction,c=g.loop;g.currentTime=
26
+ 0;g.progress=0;g.paused=!0;g.began=!1;g.completed=!1;g.reversed="reverse"===a;g.remaining="alternate"===a&&1===c?2:c;b(0);for(a=g.children.length;a--;)g.children[a].reset()};g.tick=function(a){h=a;t||(t=h);k((l+h-t)*q.speed)};g.seek=function(a){k(d(a))};g.pause=function(){var a=v.indexOf(g);-1<a&&v.splice(a,1);g.paused=!0};g.play=function(){g.paused&&(g.paused=!1,t=0,l=d(g.currentTime),v.push(g),B||ia())};g.reverse=function(){g.reversed=!g.reversed;t=0;l=d(g.currentTime)};g.restart=function(){g.pause();
27
+ g.reset();g.play()};g.finished=m;g.reset();g.autoplay&&g.play();return g}var ga={update:void 0,begin:void 0,run:void 0,complete:void 0,loop:1,direction:"normal",autoplay:!0,offset:0},S={duration:1E3,delay:0,easing:"easeOutElastic",elasticity:500,round:0},W="translateX translateY translateZ rotate rotateX rotateY rotateZ scale scaleX scaleY scaleZ skewX skewY perspective".split(" "),H,h={arr:function(a){return Array.isArray(a)},obj:function(a){return-1<Object.prototype.toString.call(a).indexOf("Object")},
28
+ pth:function(a){return h.obj(a)&&a.hasOwnProperty("totalLength")},svg:function(a){return a instanceof SVGElement},dom:function(a){return a.nodeType||h.svg(a)},str:function(a){return"string"===typeof a},fnc:function(a){return"function"===typeof a},und:function(a){return"undefined"===typeof a},hex:function(a){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(a)},rgb:function(a){return/^rgb/.test(a)},hsl:function(a){return/^hsl/.test(a)},col:function(a){return h.hex(a)||h.rgb(a)||h.hsl(a)}},A=function(){function a(a,
29
+ d,b){return(((1-3*b+3*d)*a+(3*b-6*d))*a+3*d)*a}return function(c,d,b,f){if(0<=c&&1>=c&&0<=b&&1>=b){var e=new Float32Array(11);if(c!==d||b!==f)for(var k=0;11>k;++k)e[k]=a(.1*k,c,b);return function(k){if(c===d&&b===f)return k;if(0===k)return 0;if(1===k)return 1;for(var h=0,l=1;10!==l&&e[l]<=k;++l)h+=.1;--l;var l=h+(k-e[l])/(e[l+1]-e[l])*.1,n=3*(1-3*b+3*c)*l*l+2*(3*b-6*c)*l+3*c;if(.001<=n){for(h=0;4>h;++h){n=3*(1-3*b+3*c)*l*l+2*(3*b-6*c)*l+3*c;if(0===n)break;var m=a(l,c,b)-k,l=l-m/n}k=l}else if(0===
30
+ n)k=l;else{var l=h,h=h+.1,g=0;do m=l+(h-l)/2,n=a(m,c,b)-k,0<n?h=m:l=m;while(1e-7<Math.abs(n)&&10>++g);k=m}return a(k,d,f)}}}}(),Q=function(){function a(a,b){return 0===a||1===a?a:-Math.pow(2,10*(a-1))*Math.sin(2*(a-1-b/(2*Math.PI)*Math.asin(1))*Math.PI/b)}var c="Quad Cubic Quart Quint Sine Expo Circ Back Elastic".split(" "),d={In:[[.55,.085,.68,.53],[.55,.055,.675,.19],[.895,.03,.685,.22],[.755,.05,.855,.06],[.47,0,.745,.715],[.95,.05,.795,.035],[.6,.04,.98,.335],[.6,-.28,.735,.045],a],Out:[[.25,
31
+ .46,.45,.94],[.215,.61,.355,1],[.165,.84,.44,1],[.23,1,.32,1],[.39,.575,.565,1],[.19,1,.22,1],[.075,.82,.165,1],[.175,.885,.32,1.275],function(b,c){return 1-a(1-b,c)}],InOut:[[.455,.03,.515,.955],[.645,.045,.355,1],[.77,0,.175,1],[.86,0,.07,1],[.445,.05,.55,.95],[1,0,0,1],[.785,.135,.15,.86],[.68,-.55,.265,1.55],function(b,c){return.5>b?a(2*b,c)/2:1-a(-2*b+2,c)/2}]},b={linear:A(.25,.25,.75,.75)},f={},e;for(e in d)f.type=e,d[f.type].forEach(function(a){return function(d,f){b["ease"+a.type+c[f]]=h.fnc(d)?
32
+ d:A.apply($jscomp$this,d)}}(f)),f={type:f.type};return b}(),ha={css:function(a,c,d){return a.style[c]=d},attribute:function(a,c,d){return a.setAttribute(c,d)},object:function(a,c,d){return a[c]=d},transform:function(a,c,d,b,f){b[f]||(b[f]=[]);b[f].push(c+"("+d+")")}},v=[],B=0,ia=function(){function a(){B=requestAnimationFrame(c)}function c(c){var b=v.length;if(b){for(var d=0;d<b;)v[d]&&v[d].tick(c),d++;a()}else cancelAnimationFrame(B),B=0}return a}();q.version="2.2.0";q.speed=1;q.running=v;q.remove=
33
+ function(a){a=P(a);for(var c=v.length;c--;)for(var d=v[c],b=d.animations,f=b.length;f--;)u(a,b[f].animatable.target)&&(b.splice(f,1),b.length||d.pause())};q.getValue=K;q.path=function(a,c){var d=h.str(a)?e(a)[0]:a,b=c||100;return function(a){return{el:d,property:a,totalLength:N(d)*(b/100)}}};q.setDashoffset=function(a){var c=N(a);a.setAttribute("stroke-dasharray",c);return c};q.bezier=A;q.easings=Q;q.timeline=function(a){var c=q(a);c.pause();c.duration=0;c.add=function(d){c.children.forEach(function(a){a.began=
34
+ !0;a.completed=!0});m(d).forEach(function(b){var d=z(b,D(S,a||{}));d.targets=d.targets||a.targets;b=c.duration;var e=d.offset;d.autoplay=!1;d.direction=c.direction;d.offset=h.und(e)?b:L(e,b);c.began=!0;c.completed=!0;c.seek(d.offset);d=q(d);d.began=!0;d.completed=!0;d.duration>b&&(c.duration=d.duration);c.children.push(d)});c.seek(0);c.reset();c.autoplay&&c.restart();return c};return c};q.random=function(a,c){return Math.floor(Math.random()*(c-a+1))+a};return q});
@@ -0,0 +1,450 @@
1
+ (function($) {
2
+ 'use strict';
3
+
4
+ let _defaults = {
5
+ data: {}, // Autocomplete data set
6
+ limit: Infinity, // Limit of results the autocomplete shows
7
+ onAutocomplete: null, // Callback for when autocompleted
8
+ minLength: 1, // Min characters before autocomplete starts
9
+ sortFunction: function(a, b, inputString) {
10
+ // Sort function for sorting autocomplete results
11
+ return a.indexOf(inputString) - b.indexOf(inputString);
12
+ }
13
+ };
14
+
15
+ /**
16
+ * @class
17
+ *
18
+ */
19
+ class Autocomplete extends Component {
20
+ /**
21
+ * Construct Autocomplete instance
22
+ * @constructor
23
+ * @param {Element} el
24
+ * @param {Object} options
25
+ */
26
+ constructor(el, options) {
27
+ super(Autocomplete, el, options);
28
+
29
+ this.el.M_Autocomplete = this;
30
+
31
+ /**
32
+ * Options for the autocomplete
33
+ * @member Autocomplete#options
34
+ * @prop {Number} duration
35
+ * @prop {Number} dist
36
+ * @prop {number} shift
37
+ * @prop {number} padding
38
+ * @prop {Boolean} fullWidth
39
+ * @prop {Boolean} indicators
40
+ * @prop {Boolean} noWrap
41
+ * @prop {Function} onCycleTo
42
+ */
43
+ this.options = $.extend({}, Autocomplete.defaults, options);
44
+
45
+ // Setup
46
+ this.isOpen = false;
47
+ this.count = 0;
48
+ this.activeIndex = -1;
49
+ this.oldVal;
50
+ this.$inputField = this.$el.closest('.input-field');
51
+ this.$active = $();
52
+ this._mousedown = false;
53
+ this._setupDropdown();
54
+
55
+ this._setupEventHandlers();
56
+ }
57
+
58
+ static get defaults() {
59
+ return _defaults;
60
+ }
61
+
62
+ static init(els, options) {
63
+ return super.init(this, els, options);
64
+ }
65
+
66
+ /**
67
+ * Get Instance
68
+ */
69
+ static getInstance(el) {
70
+ let domElem = !!el.jquery ? el[0] : el;
71
+ return domElem.M_Autocomplete;
72
+ }
73
+
74
+ /**
75
+ * Teardown component
76
+ */
77
+ destroy() {
78
+ this._removeEventHandlers();
79
+ this._removeDropdown();
80
+ this.el.M_Autocomplete = undefined;
81
+ }
82
+
83
+ /**
84
+ * Setup Event Handlers
85
+ */
86
+ _setupEventHandlers() {
87
+ this._handleInputBlurBound = this._handleInputBlur.bind(this);
88
+ this._handleInputKeyupAndFocusBound = this._handleInputKeyupAndFocus.bind(this);
89
+ this._handleInputKeydownBound = this._handleInputKeydown.bind(this);
90
+ this._handleInputClickBound = this._handleInputClick.bind(this);
91
+ this._handleContainerMousedownAndTouchstartBound = this._handleContainerMousedownAndTouchstart.bind(
92
+ this
93
+ );
94
+ this._handleContainerMouseupAndTouchendBound = this._handleContainerMouseupAndTouchend.bind(
95
+ this
96
+ );
97
+
98
+ this.el.addEventListener('blur', this._handleInputBlurBound);
99
+ this.el.addEventListener('keyup', this._handleInputKeyupAndFocusBound);
100
+ this.el.addEventListener('focus', this._handleInputKeyupAndFocusBound);
101
+ this.el.addEventListener('keydown', this._handleInputKeydownBound);
102
+ this.el.addEventListener('click', this._handleInputClickBound);
103
+ this.container.addEventListener(
104
+ 'mousedown',
105
+ this._handleContainerMousedownAndTouchstartBound
106
+ );
107
+ this.container.addEventListener('mouseup', this._handleContainerMouseupAndTouchendBound);
108
+
109
+ if (typeof window.ontouchstart !== 'undefined') {
110
+ this.container.addEventListener(
111
+ 'touchstart',
112
+ this._handleContainerMousedownAndTouchstartBound
113
+ );
114
+ this.container.addEventListener('touchend', this._handleContainerMouseupAndTouchendBound);
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Remove Event Handlers
120
+ */
121
+ _removeEventHandlers() {
122
+ this.el.removeEventListener('blur', this._handleInputBlurBound);
123
+ this.el.removeEventListener('keyup', this._handleInputKeyupAndFocusBound);
124
+ this.el.removeEventListener('focus', this._handleInputKeyupAndFocusBound);
125
+ this.el.removeEventListener('keydown', this._handleInputKeydownBound);
126
+ this.el.removeEventListener('click', this._handleInputClickBound);
127
+ this.container.removeEventListener(
128
+ 'mousedown',
129
+ this._handleContainerMousedownAndTouchstartBound
130
+ );
131
+ this.container.removeEventListener('mouseup', this._handleContainerMouseupAndTouchendBound);
132
+
133
+ if (typeof window.ontouchstart !== 'undefined') {
134
+ this.container.removeEventListener(
135
+ 'touchstart',
136
+ this._handleContainerMousedownAndTouchstartBound
137
+ );
138
+ this.container.removeEventListener(
139
+ 'touchend',
140
+ this._handleContainerMouseupAndTouchendBound
141
+ );
142
+ }
143
+ }
144
+
145
+ /**
146
+ * Setup dropdown
147
+ */
148
+ _setupDropdown() {
149
+ this.container = document.createElement('ul');
150
+ this.container.id = `autocomplete-options-${M.guid()}`;
151
+ $(this.container).addClass('autocomplete-content dropdown-content');
152
+ this.$inputField.append(this.container);
153
+ this.el.setAttribute('data-target', this.container.id);
154
+
155
+ this.dropdown = M.Dropdown.init(this.el, {
156
+ autoFocus: false,
157
+ closeOnClick: false,
158
+ coverTrigger: false,
159
+ onItemClick: (itemEl) => {
160
+ this.selectOption($(itemEl));
161
+ }
162
+ });
163
+
164
+ // Sketchy removal of dropdown click handler
165
+ this.el.removeEventListener('click', this.dropdown._handleClickBound);
166
+ }
167
+
168
+ /**
169
+ * Remove dropdown
170
+ */
171
+ _removeDropdown() {
172
+ this.container.parentNode.removeChild(this.container);
173
+ }
174
+
175
+ /**
176
+ * Handle Input Blur
177
+ */
178
+ _handleInputBlur() {
179
+ if (!this._mousedown) {
180
+ this.close();
181
+ this._resetAutocomplete();
182
+ }
183
+ }
184
+
185
+ /**
186
+ * Handle Input Keyup and Focus
187
+ * @param {Event} e
188
+ */
189
+ _handleInputKeyupAndFocus(e) {
190
+ if (e.type === 'keyup') {
191
+ Autocomplete._keydown = false;
192
+ }
193
+
194
+ this.count = 0;
195
+ let val = this.el.value.toLowerCase();
196
+
197
+ // Don't capture enter or arrow key usage.
198
+ if (e.keyCode === 13 || e.keyCode === 38 || e.keyCode === 40) {
199
+ return;
200
+ }
201
+
202
+ // Check if the input isn't empty
203
+ // Check if focus triggered by tab
204
+ if (this.oldVal !== val && (M.tabPressed || e.type !== 'focus')) {
205
+ this.open();
206
+ }
207
+
208
+ // Update oldVal
209
+ this.oldVal = val;
210
+ }
211
+
212
+ /**
213
+ * Handle Input Keydown
214
+ * @param {Event} e
215
+ */
216
+ _handleInputKeydown(e) {
217
+ Autocomplete._keydown = true;
218
+
219
+ // Arrow keys and enter key usage
220
+ let keyCode = e.keyCode,
221
+ liElement,
222
+ numItems = $(this.container).children('li').length;
223
+
224
+ // select element on Enter
225
+ if (keyCode === M.keys.ENTER && this.activeIndex >= 0) {
226
+ liElement = $(this.container)
227
+ .children('li')
228
+ .eq(this.activeIndex);
229
+ if (liElement.length) {
230
+ this.selectOption(liElement);
231
+ e.preventDefault();
232
+ }
233
+ return;
234
+ }
235
+
236
+ // Capture up and down key
237
+ if (keyCode === M.keys.ARROW_UP || keyCode === M.keys.ARROW_DOWN) {
238
+ e.preventDefault();
239
+
240
+ if (keyCode === M.keys.ARROW_UP && this.activeIndex > 0) {
241
+ this.activeIndex--;
242
+ }
243
+
244
+ if (keyCode === M.keys.ARROW_DOWN && this.activeIndex < numItems - 1) {
245
+ this.activeIndex++;
246
+ }
247
+
248
+ this.$active.removeClass('active');
249
+ if (this.activeIndex >= 0) {
250
+ this.$active = $(this.container)
251
+ .children('li')
252
+ .eq(this.activeIndex);
253
+ this.$active.addClass('active');
254
+ }
255
+ }
256
+ }
257
+
258
+ /**
259
+ * Handle Input Click
260
+ * @param {Event} e
261
+ */
262
+ _handleInputClick(e) {
263
+ this.open();
264
+ }
265
+
266
+ /**
267
+ * Handle Container Mousedown and Touchstart
268
+ * @param {Event} e
269
+ */
270
+ _handleContainerMousedownAndTouchstart(e) {
271
+ this._mousedown = true;
272
+ }
273
+
274
+ /**
275
+ * Handle Container Mouseup and Touchend
276
+ * @param {Event} e
277
+ */
278
+ _handleContainerMouseupAndTouchend(e) {
279
+ this._mousedown = false;
280
+ }
281
+
282
+ /**
283
+ * Highlight partial match
284
+ */
285
+ _highlight(string, $el) {
286
+ let img = $el.find('img');
287
+ let matchStart = $el
288
+ .text()
289
+ .toLowerCase()
290
+ .indexOf('' + string.toLowerCase() + ''),
291
+ matchEnd = matchStart + string.length - 1,
292
+ beforeMatch = $el.text().slice(0, matchStart),
293
+ matchText = $el.text().slice(matchStart, matchEnd + 1),
294
+ afterMatch = $el.text().slice(matchEnd + 1);
295
+ $el.html(
296
+ `<span>${beforeMatch}<span class='highlight'>${matchText}</span>${afterMatch}</span>`
297
+ );
298
+ if (img.length) {
299
+ $el.prepend(img);
300
+ }
301
+ }
302
+
303
+ /**
304
+ * Reset current element position
305
+ */
306
+ _resetCurrentElement() {
307
+ this.activeIndex = -1;
308
+ this.$active.removeClass('active');
309
+ }
310
+
311
+ /**
312
+ * Reset autocomplete elements
313
+ */
314
+ _resetAutocomplete() {
315
+ $(this.container).empty();
316
+ this._resetCurrentElement();
317
+ this.oldVal = null;
318
+ this.isOpen = false;
319
+ this._mousedown = false;
320
+ }
321
+
322
+ /**
323
+ * Select autocomplete option
324
+ * @param {Element} el Autocomplete option list item element
325
+ */
326
+ selectOption(el) {
327
+ let text = el.text().trim();
328
+ this.el.value = text;
329
+ this.$el.trigger('change');
330
+ this._resetAutocomplete();
331
+ this.close();
332
+
333
+ // Handle onAutocomplete callback.
334
+ if (typeof this.options.onAutocomplete === 'function') {
335
+ this.options.onAutocomplete.call(this, text);
336
+ }
337
+ }
338
+
339
+ /**
340
+ * Render dropdown content
341
+ * @param {Object} data data set
342
+ * @param {String} val current input value
343
+ */
344
+ _renderDropdown(data, val) {
345
+ this._resetAutocomplete();
346
+
347
+ let matchingData = [];
348
+
349
+ // Gather all matching data
350
+ for (let key in data) {
351
+ if (data.hasOwnProperty(key) && key.toLowerCase().indexOf(val) !== -1) {
352
+ // Break if past limit
353
+ if (this.count >= this.options.limit) {
354
+ break;
355
+ }
356
+
357
+ let entry = {
358
+ data: data[key],
359
+ key: key
360
+ };
361
+ matchingData.push(entry);
362
+
363
+ this.count++;
364
+ }
365
+ }
366
+
367
+ // Sort
368
+ if (this.options.sortFunction) {
369
+ let sortFunctionBound = (a, b) => {
370
+ return this.options.sortFunction(
371
+ a.key.toLowerCase(),
372
+ b.key.toLowerCase(),
373
+ val.toLowerCase()
374
+ );
375
+ };
376
+ matchingData.sort(sortFunctionBound);
377
+ }
378
+
379
+ // Render
380
+ for (let i = 0; i < matchingData.length; i++) {
381
+ let entry = matchingData[i];
382
+ let $autocompleteOption = $('<li></li>');
383
+ if (!!entry.data) {
384
+ $autocompleteOption.append(
385
+ `<img src="${entry.data}" class="right circle"><span>${entry.key}</span>`
386
+ );
387
+ } else {
388
+ $autocompleteOption.append('<span>' + entry.key + '</span>');
389
+ }
390
+
391
+ $(this.container).append($autocompleteOption);
392
+ this._highlight(val, $autocompleteOption);
393
+ }
394
+ }
395
+
396
+ /**
397
+ * Open Autocomplete Dropdown
398
+ */
399
+ open() {
400
+ let val = this.el.value.toLowerCase();
401
+
402
+ this._resetAutocomplete();
403
+
404
+ if (val.length >= this.options.minLength) {
405
+ this.isOpen = true;
406
+ this._renderDropdown(this.options.data, val);
407
+ }
408
+
409
+ // Open dropdown
410
+ if (!this.dropdown.isOpen) {
411
+ this.dropdown.open();
412
+ } else {
413
+ // Recalculate dropdown when its already open
414
+ this.dropdown.recalculateDimensions();
415
+ }
416
+ }
417
+
418
+ /**
419
+ * Close Autocomplete Dropdown
420
+ */
421
+ close() {
422
+ this.dropdown.close();
423
+ }
424
+
425
+ /**
426
+ * Update Data
427
+ * @param {Object} data
428
+ */
429
+ updateData(data) {
430
+ let val = this.el.value.toLowerCase();
431
+ this.options.data = data;
432
+
433
+ if (this.isOpen) {
434
+ this._renderDropdown(data, val);
435
+ }
436
+ }
437
+ }
438
+
439
+ /**
440
+ * @static
441
+ * @memberof Autocomplete
442
+ */
443
+ Autocomplete._keydown = false;
444
+
445
+ M.Autocomplete = Autocomplete;
446
+
447
+ if (M.jQueryLoaded) {
448
+ M.initializeJqueryWrapper(Autocomplete, 'autocomplete', 'M_Autocomplete');
449
+ }
450
+ })(cash);