diff --git a/app/assets/javascripts/ajax_auth.js b/app/assets/javascripts/ajax_auth.js index f2a2d554..27f81bbb 100644 --- a/app/assets/javascripts/ajax_auth.js +++ b/app/assets/javascripts/ajax_auth.js @@ -1,20 +1,20 @@ (function () { var CSRFProtection; - var token = $('meta[name="csrf-token"]').attr('content'); + var token = $('meta[name="csrf-token"]').attr("content"); if (token) { - CSRFProtection = function(xhr, settings) { - var sendToken = ( - (typeof settings.useCSRFProtection === 'undefined') // default to true - || settings.useCSRFProtection); + CSRFProtection = function (xhr, settings) { + var sendToken = + typeof settings.useCSRFProtection === "undefined" || // default to true + settings.useCSRFProtection; if (sendToken) { - xhr.setRequestHeader('X-CSRF-Token', token); + xhr.setRequestHeader("X-CSRF-Token", token); } - } + }; } else { CSRFProtection = $.noop; } $.ajaxSetup({ - beforeSend: CSRFProtection + beforeSend: CSRFProtection, }); })(); diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index b8b1a698..07c1bbbc 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -1,3 +1,3 @@ -document.getElementById('locale').addEventListener('change', function() { - document.getElementById('locale-form').submit(); +document.getElementById("locale").addEventListener("change", function () { + document.getElementById("locale-form").submit(); }); diff --git a/app/assets/javascripts/closet_hangers/index.js b/app/assets/javascripts/closet_hangers/index.js index 02f81ae1..c2e65ca8 100644 --- a/app/assets/javascripts/closet_hangers/index.js +++ b/app/assets/javascripts/closet_hangers/index.js @@ -6,7 +6,7 @@ } function hangersInit() { - for(var i = 0; i < hangersInitCallbacks.length; i++) { + for (var i = 0; i < hangersInitCallbacks.length; i++) { hangersInitCallbacks[i](); } } @@ -19,33 +19,33 @@ var hangerGroups = []; - $('div.closet-hangers-group').each(function () { + $("div.closet-hangers-group").each(function () { var el = $(this); var lists = []; - el.find('div.closet-list').each(function () { + el.find("div.closet-list").each(function () { var el = $(this); - var id = el.attr('data-id'); - if(id) { + var id = el.attr("data-id"); + if (id) { lists[lists.length] = { id: parseInt(id, 10), - label: el.find('h4').text() - } + label: el.find("h4").text(), + }; } }); hangerGroups[hangerGroups.length] = { - label: el.find('h3').text(), + label: el.find("h3").text(), lists: lists, - owned: (el.attr('data-owned') == 'true') + owned: el.attr("data-owned") == "true", }; }); - $('div.closet-hangers-group span.toggle').live('click', function () { - $(this).closest('.closet-hangers-group').toggleClass('hidden'); + $("div.closet-hangers-group span.toggle").live("click", function () { + $(this).closest(".closet-hangers-group").toggleClass("hidden"); }); - var hangersElQuery = '#closet-hangers'; + var hangersElQuery = "#closet-hangers"; var hangersEl = $(hangersElQuery); /* @@ -54,8 +54,8 @@ */ - $('#toggle-compare').click(function () { - hangersEl.toggleClass('comparing'); + $("#toggle-compare").click(function () { + hangersEl.toggleClass("comparing"); }); /* @@ -65,7 +65,7 @@ */ var body = $(document.body).addClass("js"); - if(!body.hasClass("current-user")) return false; + if (!body.hasClass("current-user")) return false; // When we get hangers HTML, add the controls. We do this in JS rather than // in the HTML for caching, since otherwise the requests can take forever. @@ -81,11 +81,11 @@ $("#closet-hangers div.closet-hangers-group").each(function () { var groupEl = $(this); var owned = groupEl.data("owned"); - + groupEl.find("div.closet-list").each(function () { var listEl = $(this); var listId = listEl.data("id"); - + listEl.find("div.object").each(function () { var hangerEl = $(this); var hangerId = hangerEl.data("id"); @@ -94,32 +94,32 @@ // Ooh, this part is weird. We only want the name to be linked, so // lift everything else out. - var checkboxId = 'hanger-selected-' + hangerId; - var label = $('', {'for': checkboxId}); - var link = hangerEl.children('a'); - link.children(':not(.name)').detach().appendTo(label); + var checkboxId = "hanger-selected-" + hangerId; + var label = $("", { for: checkboxId }); + var link = hangerEl.children("a"); + link.children(":not(.name)").detach().appendTo(label); link.detach().appendTo(label); - var checkbox = $('', { - type: 'checkbox', - id: checkboxId + var checkbox = $("", { + type: "checkbox", + id: checkboxId, }).appendTo(hangerEl); label.appendTo(hangerEl); // I don't usually like to _blank things, but it's too easy to click // the text when you didn't mean to and lose your selection work. - link.attr('target', '_blank'); + link.attr("target", "_blank"); $.tmpl("updateFormTmpl", { user_id: currentUserId, closet_hanger_id: hangerId, quantity: quantity, list_id: listId, - owned: owned + owned: owned, }).appendTo(quantityEl); - + $.tmpl("destroyFormTmpl", { user_id: currentUserId, - closet_hanger_id: hangerId + closet_hanger_id: hangerId, }).appendTo(hangerEl); }); }); @@ -127,7 +127,7 @@ }); $.fn.liveDraggable = function (opts) { - this.live("mouseover", function() { + this.live("mouseover", function () { if (!$(this).data("init")) { $(this).data("init", true).draggable(opts); } @@ -135,52 +135,59 @@ }; $.fn.disableForms = function () { - return this.data("formsDisabled", true).find("input").attr("disabled", "disabled").end(); - } + return this.data("formsDisabled", true) + .find("input") + .attr("disabled", "disabled") + .end(); + }; $.fn.enableForms = function () { - return this.data("formsDisabled", false).find("input").removeAttr("disabled").end(); - } + return this.data("formsDisabled", false) + .find("input") + .removeAttr("disabled") + .end(); + }; $.fn.hasChanged = function () { - return this.attr('data-previous-value') != this.val(); - } + return this.attr("data-previous-value") != this.val(); + }; $.fn.revertValue = function () { return this.each(function () { var el = $(this); - el.val(el.attr('data-previous-value')); + el.val(el.attr("data-previous-value")); }); - } + }; $.fn.storeValue = function () { return this.each(function () { var el = $(this); - el.attr('data-previous-value', el.val()); + el.attr("data-previous-value", el.val()); }); - } + }; $.fn.insertIntoSortedList = function (list, compare) { - var newChild = this, inserted = false; + var newChild = this, + inserted = false; list.children().each(function () { - if(compare(newChild, $(this)) < 1) { + if (compare(newChild, $(this)) < 1) { newChild.insertBefore(this); inserted = true; return false; } }); - if(!inserted) newChild.appendTo(list); + if (!inserted) newChild.appendTo(list); return this; - } + }; function handleSaveError(xhr, action) { try { var data = $.parseJSON(xhr.responseText); - } catch(e) { + } catch (e) { var data = {}; } - if(typeof data.errors != 'undefined') { + if (typeof data.errors != "undefined") { $.jGrowl("Error " + action + ": " + data.errors.join(", ")); } else { $.jGrowl("We had trouble " + action + " just now. Try again?"); @@ -188,88 +195,98 @@ } function objectRemoved(objectWrapper) { - objectWrapper.hide(250, function() { + objectWrapper.hide(250, function () { objectWrapper.remove(); updateBulkActions(); }); } function compareItemsByName(a, b) { - return a.find('span.name').text().localeCompare(b.find('span.name').text()); + return a.find("span.name").text().localeCompare(b.find("span.name").text()); } function findList(owned, id, item) { - if(id) { - return $('#closet-list-' + id); + if (id) { + return $("#closet-list-" + id); } else { - return $("div.closet-hangers-group[data-owned=" + owned + "] div.closet-list.unlisted"); + return $( + "div.closet-hangers-group[data-owned=" + + owned + + "] div.closet-list.unlisted", + ); } } function updateListHangersCount(el) { - el.attr('data-hangers-count', el.find('div.object').length); + el.attr("data-hangers-count", el.find("div.object").length); } function moveItemToList(item, owned, listId) { var newList = findList(owned, listId, item); - var oldList = item.closest('div.closet-list'); - var hangersWrapper = newList.find('div.closet-list-hangers'); + var oldList = item.closest("div.closet-list"); + var hangersWrapper = newList.find("div.closet-list-hangers"); item.insertIntoSortedList(hangersWrapper, compareItemsByName); updateListHangersCount(oldList); updateListHangersCount(newList); } function submitUpdateForm(form) { - if(form.data('loading')) return false; - var quantityEl = form.children("input[name=closet_hanger\[quantity\]]"); - var ownedEl = form.children("input[name=closet_hanger\[owned\]]"); - var listEl = form.children("input[name=closet_hanger\[list_id\]]"); + if (form.data("loading")) return false; + var quantityEl = form.children("input[name=closet_hanger[quantity]]"); + var ownedEl = form.children("input[name=closet_hanger[owned]]"); + var listEl = form.children("input[name=closet_hanger[list_id]]"); var listChanged = ownedEl.hasChanged() || listEl.hasChanged(); - if(listChanged || quantityEl.hasChanged()) { + if (listChanged || quantityEl.hasChanged()) { var objectWrapper = form.closest(".object").addClass("loading"); var newQuantity = quantityEl.val(); var quantitySpan = objectWrapper.find(".quantity span").text(newQuantity); - objectWrapper.attr('data-quantity', newQuantity); + objectWrapper.attr("data-quantity", newQuantity); var data = form.serialize(); // get data before disabling inputs objectWrapper.disableForms(); - form.data('loading', true); - if(listChanged) moveItemToList(objectWrapper, ownedEl.val(), listEl.val()); + form.data("loading", true); + if (listChanged) + moveItemToList(objectWrapper, ownedEl.val(), listEl.val()); $.ajax({ url: form.attr("action") + ".json", type: "post", data: data, dataType: "json", complete: function (data) { - if(quantityEl.val() == 0) { + if (quantityEl.val() == 0) { objectRemoved(objectWrapper); } else { objectWrapper.removeClass("loading").enableForms(); } - form.data('loading', false); + form.data("loading", false); }, success: function () { // Now that the move was successful, let's merge it with any // conflicting hangers var id = objectWrapper.attr("data-item-id"); - var conflictingHanger = findList(ownedEl.val(), listEl.val(), objectWrapper). - find("div[data-item-id=" + id + "]").not(objectWrapper); - if(conflictingHanger.length) { + var conflictingHanger = findList( + ownedEl.val(), + listEl.val(), + objectWrapper, + ) + .find("div[data-item-id=" + id + "]") + .not(objectWrapper); + if (conflictingHanger.length) { var conflictingQuantity = parseInt( - conflictingHanger.attr('data-quantity'), - 10 + conflictingHanger.attr("data-quantity"), + 10, ); - + var currentQuantity = parseInt(newQuantity, 10); - + var mergedQuantity = conflictingQuantity + currentQuantity; - + quantitySpan.text(mergedQuantity); quantityEl.val(mergedQuantity); - objectWrapper.attr('data-quantity', mergedQuantity); - + objectWrapper.attr("data-quantity", mergedQuantity); + conflictingHanger.remove(); } - + quantityEl.storeValue(); ownedEl.storeValue(); listEl.storeValue(); @@ -280,84 +297,94 @@ quantityEl.revertValue(); ownedEl.revertValue(); listEl.revertValue(); - if(listChanged) moveItemToList(objectWrapper, ownedEl.val(), listEl.val()); + if (listChanged) + moveItemToList(objectWrapper, ownedEl.val(), listEl.val()); quantitySpan.text(quantityEl.val()); handleSaveError(xhr, "updating the quantity"); - } + }, }); } } - $(hangersElQuery + ' form.closet-hanger-update').live('submit', function (e) { + $(hangersElQuery + " form.closet-hanger-update").live("submit", function (e) { e.preventDefault(); submitUpdateForm($(this)); }); function editableInputs() { return $(hangersElQuery).find( - 'input[name=closet_hanger\[quantity\]], ' + - 'input[name=closet_hanger\[owned\]], ' + - 'input[name=closet_hanger\[list_id\]]' - ) + "input[name=closet_hanger[quantity]], " + + "input[name=closet_hanger[owned]], " + + "input[name=closet_hanger[list_id]]", + ); } - $(hangersElQuery + 'input[name=closet_hanger\[quantity\]]').live('change', function () { - submitUpdateForm($(this).parent()); - }).storeValue(); + $(hangersElQuery + "input[name=closet_hanger[quantity]]") + .live("change", function () { + submitUpdateForm($(this).parent()); + }) + .storeValue(); onHangersInit(function () { editableInputs().storeValue(); }); - $(hangersElQuery + ' div.object').live('mouseleave', function () { - submitUpdateForm($(this).find('form.closet-hanger-update')); - }).liveDraggable({ - appendTo: '#closet-hangers', - distance: 20, - helper: "clone", - revert: "invalid" - }); - - $(hangersElQuery + " form.closet-hanger-destroy").live("submit", function (e) { - e.preventDefault(); - var form = $(this); - var button = form.children("input[type=submit]").val("Removing…"); - var objectWrapper = form.closest(".object").addClass("loading"); - var data = form.serialize(); // get data before disabling inputs - objectWrapper.addClass("loading").disableForms(); - $.ajax({ - url: form.attr("action") + ".json", - type: "post", - data: data, - dataType: "json", - complete: function () { - button.val("Remove"); - }, - success: function () { - objectRemoved(objectWrapper); - }, - error: function () { - objectWrapper.removeClass("loading").enableForms(); - $.jGrowl("Error removing item. Try again?"); - } + $(hangersElQuery + " div.object") + .live("mouseleave", function () { + submitUpdateForm($(this).find("form.closet-hanger-update")); + }) + .liveDraggable({ + appendTo: "#closet-hangers", + distance: 20, + helper: "clone", + revert: "invalid", }); - }); - $(hangersElQuery + " .select-all").live("click", function(e) { - var checkboxes = $(this).closest(".closet-list").find(".object input[type=checkbox]"); + $(hangersElQuery + " form.closet-hanger-destroy").live( + "submit", + function (e) { + e.preventDefault(); + var form = $(this); + var button = form.children("input[type=submit]").val("Removing…"); + var objectWrapper = form.closest(".object").addClass("loading"); + var data = form.serialize(); // get data before disabling inputs + objectWrapper.addClass("loading").disableForms(); + $.ajax({ + url: form.attr("action") + ".json", + type: "post", + data: data, + dataType: "json", + complete: function () { + button.val("Remove"); + }, + success: function () { + objectRemoved(objectWrapper); + }, + error: function () { + objectWrapper.removeClass("loading").enableForms(); + $.jGrowl("Error removing item. Try again?"); + }, + }); + }, + ); + + $(hangersElQuery + " .select-all").live("click", function (e) { + var checkboxes = $(this) + .closest(".closet-list") + .find(".object input[type=checkbox]"); var allChecked = true; - checkboxes.each(function() { + checkboxes.each(function () { if (!this.checked) { allChecked = false; return false; } }); - checkboxes.attr('checked', !allChecked); + checkboxes.attr("checked", !allChecked); - updateBulkActions(); // setting the checked prop doesn't fire change events + updateBulkActions(); // setting the checked prop doesn't fire change events }); function getCheckboxes() { @@ -366,30 +393,38 @@ function getCheckedIds() { var checkedIds = []; - getCheckboxes().filter(':checked').each(function() { - if (this.checked) checkedIds.push(this.id); - }); + getCheckboxes() + .filter(":checked") + .each(function () { + if (this.checked) checkedIds.push(this.id); + }); return checkedIds; } getCheckboxes().live("change", updateBulkActions); function updateBulkActions() { - var checkedCount = getCheckboxes().filter(':checked').length; - $('.bulk-actions').attr('data-target-count', checkedCount); - $('.bulk-actions-target-count').text(checkedCount); + var checkedCount = getCheckboxes().filter(":checked").length; + $(".bulk-actions").attr("data-target-count", checkedCount); + $(".bulk-actions-target-count").text(checkedCount); } - $(".bulk-actions-move-all").bind("submit", function(e) { + $(".bulk-actions-move-all").bind("submit", function (e) { // TODO: DRY e.preventDefault(); var form = $(this); var data = form.serializeArray(); - data.push({name: "return_to", value: window.location.pathname + window.location.search}); + data.push({ + name: "return_to", + value: window.location.pathname + window.location.search, + }); - var checkedBoxes = getCheckboxes().filter(':checked'); - checkedBoxes.each(function() { - data.push({name: "ids[]", value: $(this).closest('.object').attr('data-id')}); + var checkedBoxes = getCheckboxes().filter(":checked"); + checkedBoxes.each(function () { + data.push({ + name: "ids[]", + value: $(this).closest(".object").attr("data-id"), + }); }); $.ajax({ @@ -398,32 +433,38 @@ data: data, success: function (html) { var doc = $(html); - hangersEl.html( doc.find('#closet-hangers').html() ); + hangersEl.html(doc.find("#closet-hangers").html()); hangersInit(); - updateBulkActions(); // don't want to maintain checked; deselect em all - doc.find('.flash').hide().insertBefore(hangersEl).show(500).delay(5000).hide(250); + updateBulkActions(); // don't want to maintain checked; deselect em all + doc + .find(".flash") + .hide() + .insertBefore(hangersEl) + .show(500) + .delay(5000) + .hide(250); itemsSearchField.val(""); }, error: function (xhr) { handleSaveError(xhr, "moving these items"); - } + }, }); }); - $(".bulk-actions-remove-all").bind("submit", function(e) { + $(".bulk-actions-remove-all").bind("submit", function (e) { e.preventDefault(); var form = $(this); var hangerIds = []; - var checkedBoxes = getCheckboxes().filter(':checked'); + var checkedBoxes = getCheckboxes().filter(":checked"); var hangerEls = $(); - checkedBoxes.each(function() { - hangerEls = hangerEls.add($(this).closest('.object')); + checkedBoxes.each(function () { + hangerEls = hangerEls.add($(this).closest(".object")); }); - hangerEls.each(function() { - hangerIds.push($(this).attr('data-id')); + hangerEls.each(function () { + hangerIds.push($(this).attr("data-id")); }); $.ajax({ - url: form.attr("action") + ".json?" + $.param({ids: hangerIds}), + url: form.attr("action") + ".json?" + $.param({ ids: hangerIds }), type: "delete", dataType: "json", success: function () { @@ -431,20 +472,20 @@ }, error: function () { $.jGrowl("Error removing items. Try again?"); - } + }, }); }); - $(".bulk-actions-deselect-all").bind("click", function(e) { - getCheckboxes().filter(':checked').attr('checked', false); + $(".bulk-actions-deselect-all").bind("click", function (e) { + getCheckboxes().filter(":checked").attr("checked", false); updateBulkActions(); }); // hahaha, nasty hacks to make stickUp use our old jQuery $.fn.on = $.fn.bind; - $(function() { - $('.bulk-actions').stickUp(); + $(function () { + $(".bulk-actions").stickUp(); }); function maintainCheckboxes(fn) { @@ -452,7 +493,7 @@ fn(); - checkedIds.forEach(function(id) { + checkedIds.forEach(function (id) { document.getElementById(id).checked = true; }); updateBulkActions(); @@ -464,14 +505,14 @@ */ - $('input, textarea').placeholder(); + $("input, textarea").placeholder(); var itemsSearchForm = $("#closet-hangers-items-search[data-current-user-id]"); var itemsSearchField = itemsSearchForm.children("input[name=q]"); itemsSearchField.autocomplete({ select: function (e, ui) { - if(ui.item.is_item) { + if (ui.item.is_item) { // Let the autocompleter finish up this search before starting a new one setTimeout(function () { itemsSearchField.autocomplete("search", ui.item); @@ -484,107 +525,141 @@ var closetHanger = { owned: group.owned, - list_id: ui.item.list ? ui.item.list.id : '' + list_id: ui.item.list ? ui.item.list.id : "", }; - if(!item.hasHanger) closetHanger.quantity = 1; + if (!item.hasHanger) closetHanger.quantity = 1; $.ajax({ - url: "/user/" + itemsSearchForm.data("current-user-id") + "/items/" + item.id + "/closet_hangers", + url: + "/user/" + + itemsSearchForm.data("current-user-id") + + "/items/" + + item.id + + "/closet_hangers", type: "post", - data: {closet_hanger: closetHanger, return_to: window.location.pathname + window.location.search}, + data: { + closet_hanger: closetHanger, + return_to: window.location.pathname + window.location.search, + }, complete: function () { itemsSearchField.removeClass("loading"); }, success: function (html) { var doc = $(html); - maintainCheckboxes(function() { - hangersEl.html( doc.find('#closet-hangers').html() ); + maintainCheckboxes(function () { + hangersEl.html(doc.find("#closet-hangers").html()); hangersInit(); }); - doc.find('.flash').hide().insertBefore(hangersEl).show(500).delay(5000).hide(250); + doc + .find(".flash") + .hide() + .insertBefore(hangersEl) + .show(500) + .delay(5000) + .hide(250); itemsSearchField.val(""); }, error: function (xhr) { handleSaveError(xhr, "adding the item"); - } + }, }); } }, source: function (input, callback) { - if(typeof input.term == 'string') { // user-typed query + if (typeof input.term == "string") { + // user-typed query $.getJSON("/items.json?q=" + input.term, function (data) { var output = []; var items = data.items; - for(var i in items) { + for (var i in items) { items[i].label = items[i].name; items[i].is_item = true; output[output.length] = items[i]; } callback(output); }); - } else { // item was chosen, now choose a group to insert - var groupInserts = [], group; - var item = input.term, itemEl, occupiedGroups, hasHanger; - for(var i in hangerGroups) { + } else { + // item was chosen, now choose a group to insert + var groupInserts = [], + group; + var item = input.term, + itemEl, + occupiedGroups, + hasHanger; + for (var i in hangerGroups) { group = hangerGroups[i]; - itemEl = $('div.closet-hangers-group[data-owned=' + group.owned + '] div.object[data-item-id=' + item.id + ']'); - occupiedGroups = itemEl.closest('.closet-list'); - hasHanger = occupiedGroups.filter('.unlisted').length > 0; + itemEl = $( + "div.closet-hangers-group[data-owned=" + + group.owned + + "] div.object[data-item-id=" + + item.id + + "]", + ); + occupiedGroups = itemEl.closest(".closet-list"); + hasHanger = occupiedGroups.filter(".unlisted").length > 0; groupInserts[groupInserts.length] = { group: group, item: item, label: item.label, - hasHanger: hasHanger - } + hasHanger: hasHanger, + }; - for(var i = 0; i < group.lists.length; i++) { - hasHanger = occupiedGroups. - filter("[data-id=" + group.lists[i].id + "]").length > 0; + for (var i = 0; i < group.lists.length; i++) { + hasHanger = + occupiedGroups.filter("[data-id=" + group.lists[i].id + "]") + .length > 0; groupInserts[groupInserts.length] = { group: group, item: item, label: item.label, list: group.lists[i], - hasHanger: hasHanger - } + hasHanger: hasHanger, + }; } } callback(groupInserts); } - } + }, }); var autocompleter = itemsSearchField.data("autocomplete"); - autocompleter._renderItem = function( ul, item ) { + autocompleter._renderItem = function (ul, item) { var li = $("
").data("item.autocomplete", item); - if(item.is_item) { // these are items from the server - $('#autocomplete-item-tmpl').tmpl({item_name: item.label}).appendTo(li); - } else if(item.list) { // these are list inserts + if (item.is_item) { + // these are items from the server + $("#autocomplete-item-tmpl").tmpl({ item_name: item.label }).appendTo(li); + } else if (item.list) { + // these are list inserts var listName = item.list.label; - if(item.hasHanger) { - $('#autocomplete-already-in-collection-tmpl'). - tmpl({collection_name: listName}).appendTo(li); + if (item.hasHanger) { + $("#autocomplete-already-in-collection-tmpl") + .tmpl({ collection_name: listName }) + .appendTo(li); } else { - $('#autocomplete-add-to-list-tmpl').tmpl({list_name: listName}). - appendTo(li); + $("#autocomplete-add-to-list-tmpl") + .tmpl({ list_name: listName }) + .appendTo(li); } li.addClass("closet-list-autocomplete-item"); - } else { // these are group inserts + } else { + // these are group inserts var groupName = item.group.label; - if(!item.hasHanger) { - $('#autocomplete-add-to-group-tmpl'). - tmpl({group_name: groupName.replace(/\s+$/, '')}).appendTo(li); + if (!item.hasHanger) { + $("#autocomplete-add-to-group-tmpl") + .tmpl({ group_name: groupName.replace(/\s+$/, "") }) + .appendTo(li); } else { - $('#autocomplete-already-in-collection-tmpl'). - tmpl({collection_name: groupName}).appendTo(li); + $("#autocomplete-already-in-collection-tmpl") + .tmpl({ collection_name: groupName }) + .appendTo(li); } - li.addClass('closet-hangers-group-autocomplete-item'); + li.addClass("closet-hangers-group-autocomplete-item"); } return li.appendTo(ul); - } + }; /* @@ -592,48 +667,54 @@ */ - var contactEl = $('#closet-hangers-contact'); - var contactForm = contactEl.children('form'); - var contactField = contactForm.children('select'); + var contactEl = $("#closet-hangers-contact"); + var contactForm = contactEl.children("form"); + var contactField = contactForm.children("select"); - var contactAddOption = $('', - {text: contactField.attr('data-new-text'), value: -1}); + var contactAddOption = $("", { + text: contactField.attr("data-new-text"), + value: -1, + }); contactAddOption.appendTo(contactField); - var currentUserId = $('meta[name=current-user-id]').attr('content'); + var currentUserId = $("meta[name=current-user-id]").attr("content"); function submitContactForm() { var data = contactForm.serialize(); contactForm.disableForms(); $.ajax({ - url: contactForm.attr('action') + '.json', - type: 'post', + url: contactForm.attr("action") + ".json", + type: "post", data: data, - dataType: 'json', + dataType: "json", complete: function () { contactForm.enableForms(); }, error: function (xhr) { - handleSaveError(xhr, 'saving Neopets username'); - } + handleSaveError(xhr, "saving Neopets username"); + }, }); } - contactField.change(function(e) { + contactField.change(function (e) { if (contactField.val() < 0) { - var newUsername = $.trim(prompt(contactField.attr('data-new-prompt'), '')); + var newUsername = $.trim( + prompt(contactField.attr("data-new-prompt"), ""), + ); if (newUsername) { $.ajax({ - url: '/user/' + currentUserId + '/neopets-connections', - type: 'POST', - data: {neopets_connection: {neopets_username: newUsername}}, - dataType: 'json', - success: function(connection) { - var newOption = $('', {text: newUsername, - value: connection.id}) + url: "/user/" + currentUserId + "/neopets-connections", + type: "POST", + data: { neopets_connection: { neopets_username: newUsername } }, + dataType: "json", + success: function (connection) { + var newOption = $("", { + text: newUsername, + value: connection.id, + }); newOption.insertBefore(contactAddOption); contactField.val(connection.id); submitContactForm(); - } + }, }); } } else { @@ -647,8 +728,8 @@ */ - $('input[type=submit][data-confirm]').live('click', function (e) { - if(!confirm(this.getAttribute('data-confirm'))) e.preventDefault(); + $("input[type=submit][data-confirm]").live("click", function (e) { + if (!confirm(this.getAttribute("data-confirm"))) e.preventDefault(); }); /* @@ -658,23 +739,30 @@ */ onHangersInit(function () { - $('div.closet-list').droppable({ - accept: 'div.object', + $("div.closet-list").droppable({ + accept: "div.object", activate: function () { - $(this).find('.closet-list-content').animate({opacity: 0, height: 100}, 250); + $(this) + .find(".closet-list-content") + .animate({ opacity: 0, height: 100 }, 250); }, - activeClass: 'droppable-active', + activeClass: "droppable-active", deactivate: function () { - $(this).find('.closet-list-content').css('height', 'auto').animate({opacity: 1}, 250); + $(this) + .find(".closet-list-content") + .css("height", "auto") + .animate({ opacity: 1 }, 250); }, drop: function (e, ui) { - var form = ui.draggable.find('form.closet-hanger-update'); - form.find('input[name=closet_hanger\[list_id\]]'). - val(this.getAttribute('data-id')); - form.find('input[name=closet_hanger\[owned\]]'). - val($(this).closest('.closet-hangers-group').attr('data-owned')); + var form = ui.draggable.find("form.closet-hanger-update"); + form + .find("input[name=closet_hanger[list_id]]") + .val(this.getAttribute("data-id")); + form + .find("input[name=closet_hanger[owned]]") + .val($(this).closest(".closet-hangers-group").attr("data-owned")); submitUpdateForm(form); - } + }, }); }); @@ -685,16 +773,21 @@ */ function updateVisibilityDescription() { - var descriptions = $(this).closest('.visibility-form'). - find('ul.visibility-descriptions'); + var descriptions = $(this) + .closest(".visibility-form") + .find("ul.visibility-descriptions"); - descriptions.children('li.current').removeClass('current'); - descriptions.children('li[data-id=' + $(this).val() + ']').addClass('current'); + descriptions.children("li.current").removeClass("current"); + descriptions + .children("li[data-id=" + $(this).val() + "]") + .addClass("current"); } - function visibilitySelects() { return $('form.visibility-form select') } + function visibilitySelects() { + return $("form.visibility-form select"); + } - visibilitySelects().live('change', updateVisibilityDescription); + visibilitySelects().live("change", updateVisibilityDescription); onHangersInit(function () { visibilitySelects().each(updateVisibilityDescription); @@ -706,8 +799,8 @@ */ - $('#toggle-help').click(function () { - $('#closet-hangers-help').toggleClass('hidden'); + $("#toggle-help").click(function () { + $("#closet-hangers-help").toggleClass("hidden"); }); /* @@ -716,11 +809,13 @@ */ - $('#closet-hangers-share-box').mouseover(function () { - $(this).focus(); - }).mouseout(function () { - $(this).blur(); - }); + $("#closet-hangers-share-box") + .mouseover(function () { + $(this).focus(); + }) + .mouseout(function () { + $(this).blur(); + }); /* @@ -730,4 +825,3 @@ hangersInit(); })(); - diff --git a/app/assets/javascripts/closet_hangers/petpage.js b/app/assets/javascripts/closet_hangers/petpage.js index 1a642731..595f6bc7 100644 --- a/app/assets/javascripts/closet_hangers/petpage.js +++ b/app/assets/javascripts/closet_hangers/petpage.js @@ -1,8 +1,8 @@ (function () { function setChecked() { var el = $(this); - el.closest('li').toggleClass('checked', el.is(':checked')); + el.closest("li").toggleClass("checked", el.is(":checked")); } - $('#petpage-closet-lists input').click(setChecked).each(setChecked); + $("#petpage-closet-lists input").click(setChecked).each(setChecked); })(); diff --git a/app/assets/javascripts/outfits/index.js b/app/assets/javascripts/outfits/index.js index 6351a3bc..8ced8dac 100644 --- a/app/assets/javascripts/outfits/index.js +++ b/app/assets/javascripts/outfits/index.js @@ -1,4 +1,3 @@ -$('form.button_to input[type=submit]').click(function (e) { - if(!confirm(this.getAttribute('data-confirm'))) e.preventDefault(); +$("form.button_to input[type=submit]").click(function (e) { + if (!confirm(this.getAttribute("data-confirm"))) e.preventDefault(); }); - diff --git a/app/assets/javascripts/pets/bulk.js b/app/assets/javascripts/pets/bulk.js index a86b9e7f..44f69c97 100644 --- a/app/assets/javascripts/pets/bulk.js +++ b/app/assets/javascripts/pets/bulk.js @@ -1,102 +1,105 @@ -var DEBUG = (document.location.search.substr(0, 6) == '?debug'); +var DEBUG = document.location.search.substr(0, 6) == "?debug"; /* Needed items form */ (function () { var UI = {}; - UI.form = $('#needed-items-form'); - UI.alert = $('#needed-items-alert'); - UI.pet_name_field = $('#needed-items-pet-name-field'); - UI.pet_thumbnail = $('#needed-items-pet-thumbnail'); - UI.pet_header = $('#needed-items-pet-header'); - UI.reload = $('#needed-items-reload'); - UI.pet_items = $('#needed-items-pet-items'); - UI.item_template = $('#item-template'); - + UI.form = $("#needed-items-form"); + UI.alert = $("#needed-items-alert"); + UI.pet_name_field = $("#needed-items-pet-name-field"); + UI.pet_thumbnail = $("#needed-items-pet-thumbnail"); + UI.pet_header = $("#needed-items-pet-header"); + UI.reload = $("#needed-items-reload"); + UI.pet_items = $("#needed-items-pet-items"); + UI.item_template = $("#item-template"); + var current_request = { abort: function () {} }; function sendRequest(options) { current_request = $.ajax(options); } - + function cancelRequest() { - if(DEBUG) console.log("Canceling request", current_request); + if (DEBUG) console.log("Canceling request", current_request); current_request.abort(); } - + /* Pet */ - + var last_successful_pet_name = null; - + function loadPet(pet_name) { // If there is a request in progress, kill it. Our new pet request takes // priority, and, if I submit a name while the previous name is loading, I // don't want to process both responses. cancelRequest(); - + sendRequest({ - url: UI.form.attr('action') + '.json', - dataType: 'json', - data: {name: pet_name}, + url: UI.form.attr("action") + ".json", + dataType: "json", + data: { name: pet_name }, error: petError, - success: function (data) { petSuccess(data, pet_name) }, - complete: petComplete + success: function (data) { + petSuccess(data, pet_name); + }, + complete: petComplete, }); - - UI.form.removeClass('failed').addClass('loading-pet'); + + UI.form.removeClass("failed").addClass("loading-pet"); } - + function petComplete() { - UI.form.removeClass('loading-pet'); + UI.form.removeClass("loading-pet"); } - + function petError(xhr) { UI.alert.text(xhr.responseText); - UI.form.addClass('failed'); + UI.form.addClass("failed"); } - + function petSuccess(data, pet_name) { last_successful_pet_name = pet_name; - UI.pet_thumbnail.attr('src', petThumbnailUrl(pet_name)); + UI.pet_thumbnail.attr("src", petThumbnailUrl(pet_name)); UI.pet_header.empty(); - $('#needed-items-pet-header-template').tmpl({pet_name: pet_name}). - appendTo(UI.pet_header); + $("#needed-items-pet-header-template") + .tmpl({ pet_name: pet_name }) + .appendTo(UI.pet_header); loadItems(data.query); } - + function petThumbnailUrl(pet_name) { - return 'https://pets.neopets.com/cpn/' + pet_name + '/1/1.png'; + return "https://pets.neopets.com/cpn/" + pet_name + "/1/1.png"; } - + /* Items */ - + function loadItems(query) { - UI.form.addClass('loading-items'); + UI.form.addClass("loading-items"); sendRequest({ - url: '/items/needed.json', - dataType: 'json', + url: "/items/needed.json", + dataType: "json", data: query, - success: itemsSuccess + success: itemsSuccess, }); } - + function itemsSuccess(items) { - if(DEBUG) { + if (DEBUG) { // The dev server is missing lots of data, so sends me 2000+ needed // items. We don't need that many for styling, so limit it to 100 to make // my browser happier. items = items.slice(0, 100); } - + UI.pet_items.empty(); UI.item_template.tmpl(items).appendTo(UI.pet_items); - - UI.form.removeClass('loading-items').addClass('loaded'); + + UI.form.removeClass("loading-items").addClass("loaded"); } - + UI.form.submit(function (e) { e.preventDefault(); loadPet(UI.pet_name_field.val()); }); - + UI.reload.click(function (e) { e.preventDefault(); loadPet(last_successful_pet_name); @@ -105,28 +108,31 @@ var DEBUG = (document.location.search.substr(0, 6) == '?debug'); /* Bulk pets form */ (function () { - var form = $('#bulk-pets-form'), - queue_el = form.find('ul'), - names_el = form.find('textarea'), - add_el = $('#bulk-pets-form-add'), - clear_el = $('#bulk-pets-form-clear'), + var form = $("#bulk-pets-form"), + queue_el = form.find("ul"), + names_el = form.find("textarea"), + add_el = $("#bulk-pets-form-add"), + clear_el = $("#bulk-pets-form-clear"), bulk_load_queue; - $(document.body).addClass('js'); + $(document.body).addClass("js"); bulk_load_queue = new (function BulkLoadQueue() { var RECENTLY_SENT_INTERVAL_IN_SECONDS = 30; var RECENTLY_SENT_MAX = 3; - var pets = [], url = form.attr('action') + '.json', - recently_sent_count = 0, loading = false; - + var pets = [], + url = form.attr("action") + ".json", + recently_sent_count = 0, + loading = false; + function Pet(name) { - var el = $('#bulk-pets-submission-template').tmpl({pet_name: name}). - appendTo(queue_el); - + var el = $("#bulk-pets-submission-template") + .tmpl({ pet_name: name }) + .appendTo(queue_el); + this.load = function () { - el.removeClass('waiting').addClass('loading'); - var response_el = el.find('span.response'); + el.removeClass("waiting").addClass("loading"); + var response_el = el.find("span.response"); pets.shift(); loading = true; $.ajax({ @@ -134,20 +140,21 @@ var DEBUG = (document.location.search.substr(0, 6) == '?debug'); loading = false; loadNextIfReady(); }, - data: {name: name}, - dataType: 'json', + data: { name: name }, + dataType: "json", error: function (xhr) { - el.removeClass('loading').addClass('failed'); + el.removeClass("loading").addClass("failed"); response_el.text(xhr.responseText); }, success: function (data) { var points = data.points; - el.removeClass('loading').addClass('loaded'); - $('#bulk-pets-submission-success-template').tmpl({points: points}). - appendTo(response_el); + el.removeClass("loading").addClass("loaded"); + $("#bulk-pets-submission-success-template") + .tmpl({ points: points }) + .appendTo(response_el); }, - type: 'post', - url: url + type: "post", + url: url, }); recently_sent_count++; @@ -155,39 +162,42 @@ var DEBUG = (document.location.search.substr(0, 6) == '?debug'); recently_sent_count--; loadNextIfReady(); }, RECENTLY_SENT_INTERVAL_IN_SECONDS * 1000); - } - } - - this.add = function (name) { - name = name.replace(/^\s+|\s+$/g, ''); - if(name.length) { - var pet = new Pet(name); - pets.push(pet); - if(pets.length == 1) loadNextIfReady(); - } + }; } + this.add = function (name) { + name = name.replace(/^\s+|\s+$/g, ""); + if (name.length) { + var pet = new Pet(name); + pets.push(pet); + if (pets.length == 1) loadNextIfReady(); + } + }; + function loadNextIfReady() { - if(!loading && recently_sent_count < RECENTLY_SENT_MAX && pets.length) { + if (!loading && recently_sent_count < RECENTLY_SENT_MAX && pets.length) { pets[0].load(); } } })(); names_el.keyup(function () { - var names = this.value.split('\n'), x = names.length - 1, i, name; - for(i = 0; i < x; i++) { + var names = this.value.split("\n"), + x = names.length - 1, + i, + name; + for (i = 0; i < x; i++) { bulk_load_queue.add(names[i]); } - this.value = (x >= 0) ? names[x] : ''; + this.value = x >= 0 ? names[x] : ""; }); add_el.click(function () { bulk_load_queue.add(names_el.val()); - names_el.val(''); + names_el.val(""); }); clear_el.click(function () { - queue_el.children('li.loaded, li.failed').remove(); + queue_el.children("li.loaded, li.failed").remove(); }); })();