select.js 6.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. "use strict";
  2. app.factory("SelectFx", ["$http", function(e) {
  3. function t(e, t) { if (!e) return !1; for (var s = e.target || e.srcElement || e || !1; s && s != t;) s = s.parentNode || !1; return s !== !1 }
  4. function s(e, t) { for (var s in t) t.hasOwnProperty(s) && (e[s] = t[s]); return e }
  5. function i(e, t) { this.el = e[0], this.options = s({}, this.options), s(this.options, t), this._init() }
  6. function n(e) { return new RegExp("(^|\\s+)" + e + "(\\s+|$)") }
  7. function l(e, t) {
  8. var s = r(e, t) ? o : a;
  9. s(e, t)
  10. }
  11. var r, a, o;
  12. "classList" in document.documentElement ? (r = function(e, t) { return e.classList.contains(t) }, a = function(e, t) { e.classList.add(t) }, o = function(e, t) { e.classList.remove(t) }) : (r = function(e, t) { return n(t).test(e.className) }, a = function(e, t) { r(e, t) || (e.className = e.className + " " + t) }, o = function(e, t) { e.className = e.className.replace(n(t), " ") });
  13. var c = { hasClass: r, addClass: a, removeClass: o, toggleClass: l, has: r, add: a, remove: o, toggle: l };
  14. return "function" == typeof define && define.amd ? define(c) : window.classie = c, i.prototype.options = { init: void 0, newTab: !0, stickyPlaceholder: !0, onChange: function(e) { return !1 } }, i.prototype._init = function() {
  15. var e = !1;
  16. this.el.hasAttribute("disabled") && (this.el.className = this.el.className + " disabled", e = !0);
  17. var t = this.el.querySelector("option[selected]");
  18. if (this.hasDefaultPlaceholder = t && t.disabled, this.selectedOpt = t || this.el.querySelector("option"), this.options.init) {
  19. var s = this.options.init,
  20. i = this;
  21. [].slice.call(this.el.querySelectorAll("option")).forEach(function(e) { e.value === s && (i.selectedOpt = e) })
  22. }
  23. this._createSelectEl(), this.selOpts = [].slice.call(this.selEl.querySelectorAll("li[data-option]")), this.selOptsCount = this.selOpts.length, this.current = this.selOpts.indexOf(this.selEl.querySelector("li.cs-selected")) || -1, this.selPlaceholder = this.selEl.querySelector("span.cs-placeholder"), e || this._initEvents()
  24. }, i.prototype._createSelectEl = function() {
  25. var e = "",
  26. t = function(e) {
  27. var t = "",
  28. s = "",
  29. i = "";
  30. return !e.selectedOpt || this.foundSelected || this.hasDefaultPlaceholder || (s += "cs-selected ", this.foundSelected = !0), e.getAttribute("data-class") && (s += e.getAttribute("data-class")), e.getAttribute("data-link") && (i = "data-link=" + e.getAttribute("data-link")), "" !== s && (t = 'class="' + s + '" '), "<li " + t + i + ' data-option data-value="' + e.value + '"><span>' + e.textContent + "</span></li>"
  31. };
  32. [].slice.call(this.el.children).forEach(function(s) { if (!s.disabled) { var i = s.tagName.toLowerCase(); "option" === i ? e += t(s) : "optgroup" === i && (e += '<li class="cs-optgroup"><span>' + s.label + "</span><ul>", [].slice.call(s.children).forEach(function(s) { e += t(s) }), e += "</ul></li>") } });
  33. var s = '<div class="cs-options"><ul>' + e + "</ul></div>";
  34. this.selEl = document.createElement("div"), this.selEl.className = this.el.className, this.selEl.tabIndex = this.el.tabIndex, this.selEl.innerHTML = '<span class="cs-placeholder">' + this.selectedOpt.textContent + "</span>" + s, this.el.parentNode.appendChild(this.selEl), this.selEl.appendChild(this.el)
  35. }, i.prototype._initEvents = function() {
  36. var e = this;
  37. this.selPlaceholder.addEventListener("click", function() { e._toggleSelect() }), this.selOpts.forEach(function(t, s) { t.addEventListener("click", function() { e.current = s, e._changeOption(), e._toggleSelect() }) }), document.addEventListener("click", function(s) {
  38. var i = s.target;
  39. e._isOpen() && i !== e.selEl && !t(i, e.selEl) && e._toggleSelect()
  40. }), this.selEl.addEventListener("keydown", function(t) {
  41. var s = t.keyCode || t.which;
  42. switch (s) {
  43. case 38:
  44. t.preventDefault(), e._navigateOpts("prev");
  45. break;
  46. case 40:
  47. t.preventDefault(), e._navigateOpts("next");
  48. break;
  49. case 32:
  50. t.preventDefault(), e._isOpen() && "undefined" != typeof e.preSelCurrent && e.preSelCurrent !== -1 && e._changeOption(), e._toggleSelect();
  51. break;
  52. case 13:
  53. t.preventDefault(), e._isOpen() && "undefined" != typeof e.preSelCurrent && e.preSelCurrent !== -1 && (e._changeOption(), e._toggleSelect());
  54. break;
  55. case 27:
  56. t.preventDefault(), e._isOpen() && e._toggleSelect()
  57. }
  58. })
  59. }, i.prototype._navigateOpts = function(e) {
  60. this._isOpen() || this._toggleSelect();
  61. var t = "undefined" != typeof this.preSelCurrent && this.preSelCurrent !== -1 ? this.preSelCurrent : this.current;
  62. ("prev" === e && t > 0 || "next" === e && t < this.selOptsCount - 1) && (this.preSelCurrent = "next" === e ? t + 1 : t - 1, this._removeFocus(), c.add(this.selOpts[this.preSelCurrent], "cs-focus"))
  63. }, i.prototype._toggleSelect = function() { this._removeFocus(), this._isOpen() ? (this.current !== -1 && (this.selPlaceholder.textContent = this.selOpts[this.current].textContent), c.remove(this.selEl, "cs-active")) : (this.hasDefaultPlaceholder && this.options.stickyPlaceholder && (this.selPlaceholder.textContent = this.selectedOpt.textContent), c.add(this.selEl, "cs-active")) }, i.prototype._changeOption = function() {
  64. "undefined" != typeof this.preSelCurrent && this.preSelCurrent !== -1 && (this.current = this.preSelCurrent, this.preSelCurrent = -1);
  65. var e = this.selOpts[this.current];
  66. this.selPlaceholder.textContent = e.textContent, this.el.value = e.getAttribute("data-value");
  67. var t = new Event("change");
  68. this.el.dispatchEvent(t);
  69. var s = this.selEl.querySelector("li.cs-selected");
  70. s && c.remove(s, "cs-selected"), c.add(e, "cs-selected"), e.getAttribute("data-link") && (this.options.newTab ? window.open(e.getAttribute("data-link"), "_blank") : window.location = e.getAttribute("data-link")), this.options.onChange(this.el.value)
  71. }, i.prototype._isOpen = function(e) { return c.has(this.selEl, "cs-active") }, i.prototype._removeFocus = function(e) {
  72. var t = this.selEl.querySelector("li.cs-focus");
  73. t && c.remove(t, "cs-focus")
  74. }, i
  75. }]), app.directive("csSelect", ["SelectFx", function(e) { return { restrict: "AC", link: function(t, s, i) { new e(s, { init: t[i.ngModel] }) } } }]);