livewire-select2-adapter
Version:
Enables seamless integration between Select2 and Laravel Livewire.
109 lines (108 loc) • 5.09 kB
JavaScript
/**
* Livewire Select2 Adapter (xdn27)
* Version: 1.2.2
* Enables seamless integration between Select2 and Laravel Livewire.
*
* @author
* xdn27 - https://github.com/xdn27
*
* @license MIT
*/
(function(n) {
typeof define == "function" && define.amd ? define(["jquery", "select2"], n) : typeof exports == "object" ? module.exports = n(require("jquery"), require("select2")) : n(jQuery, window.jQuery.fn.select2);
})(function(n, c) {
if (!n.fn.select2) {
console.error("[LivewireSelect2Adapter] Select2 is not loaded!");
return;
}
var l = n.fn.select2.amd.require("select2/data/array");
function r(e, i) {
l.call(this, e, i), this._defaultEventName = "select2-results", this._defaultEmitName = "select2-query", this.livewireConfig = n.extend(
{
eventName: this._defaultEventName,
emitName: this._defaultEmitName,
eventOnSelect: "model",
delay: 300
},
i.get("livewire") || {}
), this._element = e, this._wireModel = e.attr("wire:model") || e.attr("wire:model.live"), this._registeredEventName = this.livewireConfig.eventName, this._registeredEventName === this._defaultEventName && this._wireModel && (this._registeredEventName += "-" + this._wireModel), this._initLivewireListener(), this._attachLivewireReinit();
}
r.prototype = Object.create(l.prototype), r.prototype.constructor = r, r.prototype.current = function(e) {
var i = [];
this._element.find(":selected").each(function() {
var t = n(this);
i.push({
id: t.val(),
text: t.text(),
selected: !0
});
}), e(i);
}, r.prototype._initLivewireListener = function() {
var e = this;
this._eventHandler = function(i) {
e._pendingCallback && (e._pendingCallback({
results: i.detail[0].results
}), e._pendingCallback = null);
}, window.addEventListener(this._registeredEventName, this._eventHandler), e._element.prop("multiple") || this._element.on("select2:select", function(i) {
e._handleSelection(i);
}), this._observer = new MutationObserver(function(i) {
i.forEach(function(t) {
t.removedNodes.forEach(function(o) {
o.contains(e._element[0]) && e.destroy();
});
});
}), this._observer.observe(document.body, { childList: !0, subtree: !0 });
}, r.prototype._handleSelection = function(e) {
var i = this;
if (i.livewireConfig.eventOnSelect === "model") {
var t = i._wireModel;
if (t && window.Livewire) {
var o = e.target.closest("[wire\\:id]"), s = o ? o.getAttribute("wire:id") : null;
if (s) {
var a = window.Livewire.find(s);
if (a) {
var d = !t.includes(".live"), w = e.params.data.id;
a.set(t, w, d);
}
}
}
} else i.livewireConfig.eventOnSelect && window.Livewire && (typeof window.Livewire.dispatch == "function" ? window.Livewire.dispatch(
i.livewireConfig.eventOnSelect,
e.params.data
) : typeof window.Livewire.emit == "function" ? window.Livewire.emit(
i.livewireConfig.eventOnSelect,
e.params.data
) : console.error(
"[LivewireSelect2Adapter] Livewire emit/dispatch is not available."
));
}, r.prototype._attachLivewireReinit = function() {
window.__livewire_select2_reinit_hook_attached || (window.__livewire_select2_reinit_hook_attached = !0, document.addEventListener("livewire:init", function() {
window.Livewire && window.Livewire.hook && window.Livewire.hook("morphed", function() {
n("[data-select2-livewire]").each(function() {
var e = n(this);
if (e.data("select2")) {
var i = e.data("select2").options.options;
e.select2(i);
}
});
});
}));
}, r.prototype.query = function(e, i) {
var t = this;
clearTimeout(this._queryTimeout), this._queryTimeout = setTimeout(function() {
if (t._pendingCallback = i, window.Livewire) {
var o = t.livewireConfig.emitName;
o === t._defaultEmitName && t._wireModel && (o += "-" + t._wireModel), typeof window.Livewire.dispatch == "function" ? window.Livewire.dispatch(o, e) : typeof window.Livewire.emit == "function" ? window.Livewire.emit(o, e) : console.error(
"[LivewireSelect2Adapter] Livewire emit/dispatch is not available."
);
} else
console.error("[LivewireSelect2Adapter] Livewire is not available.");
}, this.livewireConfig.delay);
}, r.prototype.destroy = function() {
this._eventHandler && (window.removeEventListener(this._registeredEventName, this._eventHandler), this._eventHandler = null), this._observer && (this._observer.disconnect(), this._observer = null), this._element && this._element.off("select2:select");
}, r.prototype.render = function() {
return l.prototype.render.call(this);
}, r.prototype.bind = function(e, i) {
return l.prototype.bind.call(this, e, i);
}, window.select2 = window.select2 || {}, window.select2.LivewireModelAdapter = r, window.select2.LivewireModelAdapterVersion = "1.2.0";
});