activeadmin_materialize_theme 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +26 -0
- data/Rakefile +34 -0
- data/app/assets/config/activeadmin_materialize_theme_manifest.js +1 -0
- data/app/assets/javascripts/activeadmin_materialize_theme.js +65 -0
- data/app/assets/javascripts/materialize/anime.min.js +34 -0
- data/app/assets/javascripts/materialize/autocomplete.js +450 -0
- data/app/assets/javascripts/materialize/bin/materialize.js +12374 -0
- data/app/assets/javascripts/materialize/bin/materialize.min.js +6 -0
- data/app/assets/javascripts/materialize/buttons.js +354 -0
- data/app/assets/javascripts/materialize/cards.js +40 -0
- data/app/assets/javascripts/materialize/carousel.js +717 -0
- data/app/assets/javascripts/materialize/cash.js +960 -0
- data/app/assets/javascripts/materialize/characterCounter.js +136 -0
- data/app/assets/javascripts/materialize/chips.js +481 -0
- data/app/assets/javascripts/materialize/collapsible.js +275 -0
- data/app/assets/javascripts/materialize/component.js +44 -0
- data/app/assets/javascripts/materialize/datepicker.js +975 -0
- data/app/assets/javascripts/materialize/dropdown.js +617 -0
- data/app/assets/javascripts/materialize/forms.js +275 -0
- data/app/assets/javascripts/materialize/global.js +427 -0
- data/app/assets/javascripts/materialize/materialbox.js +453 -0
- data/app/assets/javascripts/materialize/modal.js +382 -0
- data/app/assets/javascripts/materialize/parallax.js +138 -0
- data/app/assets/javascripts/materialize/pushpin.js +145 -0
- data/app/assets/javascripts/materialize/range.js +263 -0
- data/app/assets/javascripts/materialize/scrollspy.js +295 -0
- data/app/assets/javascripts/materialize/select.js +432 -0
- data/app/assets/javascripts/materialize/sidenav.js +580 -0
- data/app/assets/javascripts/materialize/slider.js +359 -0
- data/app/assets/javascripts/materialize/tabs.js +402 -0
- data/app/assets/javascripts/materialize/tapTarget.js +314 -0
- data/app/assets/javascripts/materialize/timepicker.js +647 -0
- data/app/assets/javascripts/materialize/toasts.js +310 -0
- data/app/assets/javascripts/materialize/tooltip.js +303 -0
- data/app/assets/javascripts/materialize/waves.js +335 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/base.scss +107 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/components/footer.scss +18 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/components/form.scss +140 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/components/header.scss +61 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/components/layout_index.scss +83 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/components/layout_show.scss +56 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/components/sidebar.scss +37 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/components/title_bar.scss +43 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/LICENSE +21 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/README.md +91 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_badges.scss +55 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_buttons.scss +322 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_cards.scss +195 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_carousel.scss +90 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_chips.scss +90 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_collapsible.scss +91 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_color-classes.scss +32 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_color-variables.scss +370 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_datepicker.scss +191 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_dropdown.scss +85 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_global.scss +769 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_grid.scss +156 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_icons-material-design.scss +5 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_materialbox.scss +43 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_modal.scss +94 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_navbar.scss +208 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_normalize.scss +447 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_preloader.scss +334 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_pulse.scss +34 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_sidenav.scss +216 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_slider.scss +92 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_table_of_contents.scss +33 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_tabs.scss +99 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_tapTarget.scss +103 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_timepicker.scss +183 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_toast.scss +58 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_tooltip.scss +32 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_transitions.scss +13 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_typography.scss +60 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_variables.scss +349 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/_waves.scss +114 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/forms/_checkboxes.scss +200 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/forms/_file-input.scss +44 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/forms/_forms.scss +22 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/forms/_input-fields.scss +354 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/forms/_radio-buttons.scss +115 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/forms/_range.scss +161 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/forms/_select.scss +180 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/components/forms/_switches.scss +89 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/materialize/materialize.scss +41 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/normalize.css +349 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/theme.scss +13 -0
- data/app/assets/stylesheets/activeadmin_materialize_theme/variables.scss +14 -0
- data/lib/activeadmin_materialize_theme.rb +6 -0
- data/lib/activeadmin_materialize_theme/engine.rb +7 -0
- data/lib/activeadmin_materialize_theme/version.rb +5 -0
- 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);
|