Skip to content

Instantly share code, notes, and snippets.

@tigerhawkvok
Created July 28, 2015 04:21
Show Gist options
  • Save tigerhawkvok/1d570d5605bcd30735ee to your computer and use it in GitHub Desktop.
Save tigerhawkvok/1d570d5605bcd30735ee to your computer and use it in GitHub Desktop.
Workaround for lack of paper-dropdown
bindPaperMenuButton = (selector = "paper-menu-button", unbindTargets = true) ->
###
# Use a paper-menu-button and make the
# .dropdown-label gain the selected value
#
# Reference:
# https://github.com/polymerelements/paper-menu-button
# https://elements.polymer-project.org/elements/paper-menu-button
###
for dropdown in $(selector)
menu = $(dropdown).find("paper-menu")
if unbindTargets
$(menu).unbind()
do relabelSelectedItem = (target = menu, activeDropdown = dropdown) ->
# A menu item has been selected!
selectText = $(target).polymerSelected(null, true)
# console.log("iron-select fired! We fetched '#{selectText}'")
labelSpan = $(activeDropdown).find(".dropdown-label")
$(labelSpan).text(selectText)
$(target).polymerSelected()
$(menu).on "iron-select", ->
relabelSelectedItem this, dropdown
false
jQuery.fn.polymerSelected = (setSelected = undefined, attrLookup = "attrForSelected") ->
###
# See
# https://elements.polymer-project.org/elements/paper-menu
# https://elements.polymer-project.org/elements/paper-radio-group
#
# @param attrLookup is based on
# https://elements.polymer-project.org/elements/iron-selector?active=Polymer.IronSelectableBehavior
###
unless attrLookup is true
attr = $(this).attr(attrLookup)
else
# If we pass the flag true, we get the label instead
attr = true
if setSelected?
if not isBool(setSelected)
try
$(this).get(0).select(setSelected)
catch e
return false
else
$(this).parent().children().removeAttribute("aria-selected")
$(this).parent().children().removeAttribute("active")
$(this).parent().children().removeClass("iron-selected")
$(this).prop("selected",setSelected)
$(this).prop("active",setSelected)
$(this).prop("aria-selected",setSelected)
if setSelected is true
$(this).addClass("iron-selected")
else
val = undefined
try
val = $(this).get(0).selected
if isNumber(val) and not isNull(attr)
itemSelector = $(this).find("paper-item")[toInt(val)]
unless attr is true
val = $(itemSelector).attr(attr)
else
# Fetch the label
val = $(itemSelector).text()
catch e
return false
if val is "null" or not val?
val = undefined
val
isEmpty = (str) -> not str or str.length is 0
isBlank = (str) -> not str or /^\s*$/.test(str)
isNull = (str) ->
try
if isEmpty(str) or isBlank(str) or not str?
unless str is false or str is 0 then return true
false
isNumber = (n) -> not isNaN(parseFloat(n)) and isFinite(n)
bindPaperMenuButton()
// Generated by CoffeeScript 1.9.3
(function() {
var bindPaperMenuButton, isBlank, isEmpty, isNull, isNumber;
bindPaperMenuButton = function(selector, unbindTargets) {
var dropdown, i, len, menu, ref, relabelSelectedItem;
if (selector == null) {
selector = "paper-menu-button";
}
if (unbindTargets == null) {
unbindTargets = true;
}
/*
* Use a paper-menu-button and make the
* .dropdown-label gain the selected value
*
* Reference:
* https://github.com/polymerelements/paper-menu-button
* https://elements.polymer-project.org/elements/paper-menu-button
*/
ref = $(selector);
for (i = 0, len = ref.length; i < len; i++) {
dropdown = ref[i];
menu = $(dropdown).find("paper-menu");
if (unbindTargets) {
$(menu).unbind();
}
(relabelSelectedItem = function(target, activeDropdown) {
var labelSpan, selectText;
selectText = $(target).polymerSelected(null, true);
labelSpan = $(activeDropdown).find(".dropdown-label");
$(labelSpan).text(selectText);
return $(target).polymerSelected();
})(menu, dropdown);
$(menu).on("iron-select", function() {
return relabelSelectedItem(this, dropdown);
});
}
return false;
};
jQuery.fn.polymerSelected = function(setSelected, attrLookup) {
var attr, e, itemSelector, val;
if (setSelected == null) {
setSelected = void 0;
}
if (attrLookup == null) {
attrLookup = "attrForSelected";
}
/*
* See
* https://elements.polymer-project.org/elements/paper-menu
* https://elements.polymer-project.org/elements/paper-radio-group
*
* @param attrLookup is based on
* https://elements.polymer-project.org/elements/iron-selector?active=Polymer.IronSelectableBehavior
*/
if (attrLookup !== true) {
attr = $(this).attr(attrLookup);
} else {
attr = true;
}
if (setSelected != null) {
if (!isBool(setSelected)) {
try {
return $(this).get(0).select(setSelected);
} catch (_error) {
e = _error;
return false;
}
} else {
$(this).parent().children().removeAttribute("aria-selected");
$(this).parent().children().removeAttribute("active");
$(this).parent().children().removeClass("iron-selected");
$(this).prop("selected", setSelected);
$(this).prop("active", setSelected);
$(this).prop("aria-selected", setSelected);
if (setSelected === true) {
return $(this).addClass("iron-selected");
}
}
} else {
val = void 0;
try {
val = $(this).get(0).selected;
if (isNumber(val) && !isNull(attr)) {
itemSelector = $(this).find("paper-item")[toInt(val)];
if (attr !== true) {
val = $(itemSelector).attr(attr);
} else {
val = $(itemSelector).text();
}
}
} catch (_error) {
e = _error;
return false;
}
if (val === "null" || (val == null)) {
val = void 0;
}
return val;
}
};
isEmpty = function(str) {
return !str || str.length === 0;
};
isBlank = function(str) {
return !str || /^\s*$/.test(str);
};
isNull = function(str) {
try {
if (isEmpty(str) || isBlank(str) || (str == null)) {
if (!(str === false || str === 0)) {
return true;
}
}
} catch (_error) {}
return false;
};
isNumber = function(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
};
bindPaperMenuButton();
}).call(this);
<!-- Sample HTML from SSARHerps.org -->
<paper-menu-button>
<paper-button class="dropdown-trigger"><iron-icon icon="icons:filter-list"></iron-icon><span id="filter-what" class="dropdown-label"></span></paper-button>
<paper-menu label="Group" data-column="linnean_order" class="cndb-filter dropdown-content" id="linnean-order" name="type" attrForSelected="data-type" selected="0">
<paper-item data-type="any">All</paper-item>
<paper-item data-type="squamata">Non-Snake Lizards</paper-item>
<paper-item data-type="serpentes">Snakes</paper-item>
<paper-item data-type="testudines">Turtles</paper-item>
<paper-item data-type="crocodylia">Crocodiles &amp; Alligators</paper-item>
<paper-item data-type="caudata">Salamanders</paper-item>
<paper-item data-type="anura">Frogs</paper-item>
<paper-item data-type="gymnophiona">Caecilians</paper-item>
</paper-menu>
</paper-menu-button>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment