activeadmin_materialize_theme 0.1.2

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 (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);