diff --git a/angularjs-compatible b/angularjs-compatible new file mode 100644 index 0000000..0e005c9 --- /dev/null +++ b/angularjs-compatible @@ -0,0 +1,533 @@ +/* globals jQuery, window, document */ + +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS + module.exports = factory(require('jquery')); + } else { + // Browser globals + factory(jQuery); + } +}(function($) { + + var methods = { + options : { + "optionClass": "", + "dropdownClass": "", + "autoinit": false, + "callback": false, + "onSelected": false, + "destroy": function(element) { + this.destroy(element); + }, + "dynamicOptLabel": "Add a new option..." + }, + init: function(options) { + + // Apply user options if user has defined some + if (options) { + options = $.extend(methods.options, options); + } else { + options = methods.options; + } + + function initElement($select) { + // Don't do anything if this is not a select or if this select was already initialized + if ($select.data("dropdownjs") || !$select.is("select")) { + return; + } + + // Is it a multi select? + var multi = $select.attr("multiple"); + + // Does it allow to create new options dynamically? + var dynamicOptions = $select.attr("data-dynamic-opts"), + $dynamicInput = $(); + + // Create the dropdown wrapper + var $dropdown = $("
"); + $dropdown.addClass("dropdownjs").addClass(options.dropdownClass); + $dropdown.data("select", $select); + + // Create the fake input used as "select" element and cache it as $input + var $input = $(""); + if ($.material) { $input.data("mdproc", true); } + // Append it to the dropdown wrapper + $dropdown.append($input); + + // Create the UL that will be used as dropdown and cache it AS $ul + var $ul = $(""); + $ul.data("select", $select); + + // Append it to the dropdown + $dropdown.append($ul); + + // Transfer the placeholder attribute + $input.attr("placeholder", $select.attr("placeholder")); + + // Loop trough options/optgroups and transfer them to the dropdown menu + var $items = $select.find("> optgroup, > option"); + if ($items.length > 0) { + $items.each(function () { + var $this = $(this); + if ($this.is("optgroup")) { + //add in the option group label + methods._addOption($ul, $this); + //loop through the list and add each option + $this.find("option").each(function (index, item) { + methods._addOption($ul, $(item)); + }); + } else { + //$this is "option" + methods._addOption($ul, $this); + } + }); + } + + + // If this select allows dynamic options add the widget + if (dynamicOptions) { + $dynamicInput = $(""); + $dynamicInput.append(""); + $dynamicInput.find("input").attr("placeholder", options.dynamicOptLabel); + $ul.append($dynamicInput); + } + + + + // Cache the dropdown options + var selectOptions = $dropdown.find("li"); + + // If is a single select, selected the first one or the last with selected attribute + if (!multi) { + var $selected; + if ($select.find(":selected").length) { + $selected = $select.find(":selected").last(); + } + else { + $selected = $select.find("option, li").first(); + // $selected = $select.find("option").first(); + } + methods._select($dropdown, $selected); + } else { + var selectors = [], val = $select.val() + for (var i in val) { + selectors.push('li[value=' + val[i] + ']') + } + if (selectors.length > 0) { + methods._select($dropdown, $dropdown.find(selectors.join(','))); + } + } + + // Transfer the classes of the select to the input dropdown + $input.addClass($select[0].className); + + // Hide the old and ugly select + $select.hide().attr("data-dropdownjs", true); + + // Bring to life our awesome dropdownjs + $select.after($dropdown); + + // Call the callback + if (options.callback) { + options.callback($dropdown); + } + + //---------------------------------------// + // DROPDOWN EVENTS // + //---------------------------------------// + + // On click, set the clicked one as selected + $ul.on("click", "li:not(.dropdownjs-add)", function(e) { + methods._select($dropdown, $(this)); + // trigger change event, if declared on the original selector + //$select.change(); + $select.trigger('change'); + }); + $ul.on("click", "span.optgroup", function (e) { + return false; + }); + $ul.on("keydown", "li:not(.dropdownjs-add)", function(e) { + if (e.which === 27) { + $(".dropdownjs > ul > li").attr("tabindex", -1); + return $input.removeClass("focus").blur(); + } + if (e.which === 32 && !$(e.target).is("input")) { + methods._select($dropdown, $(this)); + return false; + } + }); + + $ul.on("focus", "li:not(.dropdownjs-add)", function() { + if ($select.is(":disabled")) { + return; + } + $input.addClass("focus"); + }); + + // Add new options when the widget is used + if (dynamicOptions && dynamicOptions.length) { + $dynamicInput.on("keydown", function(e) { + if(e.which !== 13) return; + var $option = $("