administrate-materialize-theme 0.1.0
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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +49 -0
- data/Rakefile +1 -0
- data/app/assets/javascripts/administrate-materialize-theme/anime.min.js +34 -0
- data/app/assets/javascripts/administrate-materialize-theme/autocomplete.js +450 -0
- data/app/assets/javascripts/administrate-materialize-theme/bin/materialize.js +12374 -0
- data/app/assets/javascripts/administrate-materialize-theme/bin/materialize.min.js +6 -0
- data/app/assets/javascripts/administrate-materialize-theme/buttons.js +354 -0
- data/app/assets/javascripts/administrate-materialize-theme/cards.js +40 -0
- data/app/assets/javascripts/administrate-materialize-theme/carousel.js +717 -0
- data/app/assets/javascripts/administrate-materialize-theme/cash.js +960 -0
- data/app/assets/javascripts/administrate-materialize-theme/characterCounter.js +136 -0
- data/app/assets/javascripts/administrate-materialize-theme/chips.js +481 -0
- data/app/assets/javascripts/administrate-materialize-theme/collapsible.js +275 -0
- data/app/assets/javascripts/administrate-materialize-theme/component.js +44 -0
- data/app/assets/javascripts/administrate-materialize-theme/datepicker.js +975 -0
- data/app/assets/javascripts/administrate-materialize-theme/dropdown.js +617 -0
- data/app/assets/javascripts/administrate-materialize-theme/forms.js +275 -0
- data/app/assets/javascripts/administrate-materialize-theme/global.js +427 -0
- data/app/assets/javascripts/administrate-materialize-theme/materialbox.js +453 -0
- data/app/assets/javascripts/administrate-materialize-theme/modal.js +382 -0
- data/app/assets/javascripts/administrate-materialize-theme/parallax.js +138 -0
- data/app/assets/javascripts/administrate-materialize-theme/pushpin.js +145 -0
- data/app/assets/javascripts/administrate-materialize-theme/range.js +263 -0
- data/app/assets/javascripts/administrate-materialize-theme/scrollspy.js +295 -0
- data/app/assets/javascripts/administrate-materialize-theme/select.js +432 -0
- data/app/assets/javascripts/administrate-materialize-theme/sidenav.js +580 -0
- data/app/assets/javascripts/administrate-materialize-theme/slider.js +359 -0
- data/app/assets/javascripts/administrate-materialize-theme/tabs.js +402 -0
- data/app/assets/javascripts/administrate-materialize-theme/tapTarget.js +314 -0
- data/app/assets/javascripts/administrate-materialize-theme/theme.js +6 -0
- data/app/assets/javascripts/administrate-materialize-theme/timepicker.js +647 -0
- data/app/assets/javascripts/administrate-materialize-theme/toasts.js +310 -0
- data/app/assets/javascripts/administrate-materialize-theme/tooltip.js +303 -0
- data/app/assets/javascripts/administrate-materialize-theme/waves.js +335 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_badges.scss +55 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_buttons.scss +322 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_cards.scss +195 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_carousel.scss +90 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_chips.scss +90 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_collapsible.scss +91 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_color-classes.scss +32 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_color-variables.scss +370 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_datepicker.scss +191 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_dropdown.scss +85 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_global.scss +769 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_grid.scss +156 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_icons-material-design.scss +5 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_materialbox.scss +43 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_modal.scss +94 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_navbar.scss +208 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_normalize.scss +447 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_preloader.scss +334 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_pulse.scss +34 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_sidenav.scss +216 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_slider.scss +92 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_table_of_contents.scss +33 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_tabs.scss +99 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_tapTarget.scss +103 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_timepicker.scss +183 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_toast.scss +58 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_tooltip.scss +32 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_transitions.scss +13 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_typography.scss +60 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_variables.scss +349 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/_waves.scss +114 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/forms/_checkboxes.scss +200 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/forms/_file-input.scss +44 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/forms/_forms.scss +22 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/forms/_input-fields.scss +354 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/forms/_radio-buttons.scss +115 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/forms/_range.scss +161 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/forms/_select.scss +180 -0
- data/app/assets/stylesheets/administrate-materialize-theme/components/forms/_switches.scss +89 -0
- data/app/assets/stylesheets/administrate-materialize-theme/materialize.scss +41 -0
- data/app/assets/stylesheets/administrate-materialize-theme/theme.scss +200 -0
- data/lib/administrate-materialize-theme.rb +6 -0
- data/lib/administrate-materialize-theme/engine.rb +7 -0
- data/lib/administrate-materialize-theme/version.rb +5 -0
- metadata +150 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 8e9b57be04016df2e8622c07deafeccc4dbb15315a625adf4977239b3d5c2001
|
|
4
|
+
data.tar.gz: 6be1ef420e4868dcc2b5ea45e2333e1e34b4143eb5de410dc4a13e7e9aabead1
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 7a458136fa14171318c348764820fe27d57eedc8afb200c42b800521fa32b9c6063fce41063f2f86a4be85d98625df1dd974676eb241ab556c34dadc0d127807
|
|
7
|
+
data.tar.gz: c53e8bf8500de6de16274d24eea50171fa98d33903119caf40dc7281c420b1dfb244a10793574e32799305ec93ba39098ad08515de9e1b8a9d7b968c84f8071c
|
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,49 @@
|
|
|
1
|
+
# Administrate Materialize Theme
|
|
2
|
+
A Material theme form [Administrate](https://github.com/thoughtbot/administrate), based on [Materialize](https://materializecss.com) framework.
|
|
3
|
+
|
|
4
|
+
Features:
|
|
5
|
+
- Material design responsive theme;
|
|
6
|
+
- customizable using SASS variables;
|
|
7
|
+
- allow to use *Materialize* in the admin.
|
|
8
|
+
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
## Installation
|
|
12
|
+
- If not already installed Administrate, set it up
|
|
13
|
+
- Add to *Gemfile*: `gem 'administrate-materialize-theme'` (and execute `bundle`)
|
|
14
|
+
- Edit *app/assets/config/manifest.js*, adding at the end:
|
|
15
|
+
|
|
16
|
+
```js
|
|
17
|
+
//= link administrate-materialize-theme/theme.css
|
|
18
|
+
//= link administrate-materialize-theme/theme.js
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- Edit *app/views/layouts/admin/application.html.erb* (you can generate it using `rails generate administrate:views:layout`), adding before head closing tag:
|
|
22
|
+
|
|
23
|
+
```html
|
|
24
|
+
<%= stylesheet_link_tag 'administrate-materialize-theme/theme', media: 'all' %>
|
|
25
|
+
<%= javascript_include_tag 'administrate-materialize-theme/theme' %>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Customizations
|
|
29
|
+
To change Materialize variables it's necessary to create a new *.scss* (or *.sass*) file like this one (ex. *admin.scss*):
|
|
30
|
+
|
|
31
|
+
```scss
|
|
32
|
+
// app/assets/stylesheets/admin.scss
|
|
33
|
+
$primary-color: #FB1;
|
|
34
|
+
@import 'administrate-materialize-theme/theme';
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
And replace the link tag in the *application.html.erb* with: `<%= stylesheet_link_tag 'admin', media: 'all' %>`
|
|
38
|
+
|
|
39
|
+
For the complete list of options take a look [here](app/assets/stylesheets/administrate-materialize-theme/components/_variables.scss).
|
|
40
|
+
|
|
41
|
+
## Do you like it? Star it!
|
|
42
|
+
If you use this component just star it. A developer is more motivated to improve a project when there
|
|
43
|
+
is some interest.
|
|
44
|
+
|
|
45
|
+
## Contributors
|
|
46
|
+
- [Mattia Roccoberton](https://blocknot.es/): author
|
|
47
|
+
|
|
48
|
+
## License
|
|
49
|
+
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 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
@@ -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);
|