//= require_self /** This is a collection of javascript functions and whatnot under the spree namespace that do stuff we find helpful. Hopefully, this will evolve into a propper class. **/ $(document).ajaxStart(function(){ $("#progress").slideDown(); }); $(document).ajaxStop(function(){ $("#progress").slideUp(); }); $.fn.visible = function(cond) { this[cond ? 'show' : 'hide' ]() }; show_flash_error = function(message) { error_div = $('.flash.error'); if (error_div.length > 0) { error_div.html(message); error_div.show(); } else { if ($("#content .toolbar").length > 0) { $("#content .toolbar").before('
' + message + '
'); } else { $("#content h1").before('
' + message + '
'); } } } // Apply to individual radio button that makes another element visible when checked $.fn.radioControlsVisibilityOfElement = function(dependentElementSelector){ if(!this.get(0)){ return } showValue = this.get(0).value; radioGroup = $("input[name='" + this.get(0).name + "']"); radioGroup.each(function(){ $(this).click(function(){ $(dependentElementSelector).visible(this.checked && this.value == showValue) }); if(this.checked){ this.click() } }); } // Product autocompletion image_html = function(item){ return ""; } format_product_autocomplete = function(item){ var html = ""; var product = item.data['product']; if(item.data['variant']==undefined){ if(product['images'].length!=0){ html = image_html(product); } html += "

" + product['name'] + "

"; html += "Sku: " + product['master']['sku'] + ""; html += "On Hand: " + product['count_on_hand'] + "
"; }else{ // variant var variant = item.data['variant']; var name = item.data.product['name']; if(variant['images'].length!=0){ html = image_html(variant); }else{ if(product['images'].length!=0){ html = image_html(product); } } name += " - " + $.map(variant['option_values'], function(option_value){ return option_value["option_type"]["presentation"] + ": " + option_value['name']; }).join(", ") html += "

" + name + "

"; html += "Sku: " + variant['sku'] + ""; html += "On Hand: " + variant['count_on_hand'] + "
"; } return html } prep_product_autocomplete_data = function(data){ return $.map(eval(data), function(row) { var product = row['product']; if(product['variants'].length>0 && ['expand_variants']){ //variants return $.map(product['variants'], function(variant){ var name = product['name']; name += " - " + $.map(variant['option_values'], function(option_value){ return option_value["option_type"]["presentation"] + ": " + option_value['name']; }).join(", "); return { data: {product: product, variant: variant}, value: name, result: name } }); }else{ return { data: {product: product}, value: product['name'], result: product['name'] } } }); } $.fn.product_autocomplete = function(){ return this.each(function() { $(this).autocomplete({ source: function(request, response) { $.get("/admin/products.json?q=" + $('#add_product_name').val() + "&authenticity_token=" + encodeURIComponent($('meta[name=csrf-token]').attr("content")), function(data) { result = prep_product_autocomplete_data(data) response(result); }); }, minLength: 4, focus: function(event, ui) { $('#add_product_name').val(ui.item.label); return false; }, select: function(event, ui) { $('#add_product_name').val(ui.item.label); product = ui.item.data; if (product['variant'] == undefined) { // product $('#add_variant_id').val(product['product']['master']['id']); } else { // variant $('#add_variant_id').val(product['variant']['id']); } return false; } }).data("autocomplete")._renderItem = function(ul, item) { $(ul).addClass('ac_results'); html = format_product_autocomplete(item); return $("
  • ") .data("item.autocomplete", item) .append("" + html + "") .appendTo(ul); } $(this).data("autocomplete")._resizeMenu = function() { var ul = this.menu.element; ul.outerWidth(this.element.outerWidth()); } }); } $.fn.objectPicker = function(url){ $(this).tokenInput(url + "&authenticity_token=" + escape(AUTH_TOKEN), { searchDelay : 600, hintText : strings.type_to_search, noResultsText : strings.no_results, searchingText : strings.searching, prePopulateFromInput : true }); }; $.fn.productPicker = function(){ $(this).objectPicker(ajax_urls.product_search_basic_json); } $.fn.userPicker = function(){ $(this).objectPicker(ajax_urls.user_search_basic_json); } // Possible defunct add_fields = function(target, association, content) { var new_id = new Date().getTime(); var regexp = new RegExp("new_" + association, "g"); $(target).append(content.replace(regexp, new_id)); } $('a.remove_fields').live('click', function() { $(this).prev("input[type=hidden]").val("1"); $(this).closest(".fields").hide(); return false; }); $(".observe_field").live('change', function() { target = $(this).attr("data-update"); ajax_indicator = $(this).attr("data-ajax-indicator") || '#busy_indicator'; $(target).hide(); $(ajax_indicator).show(); $.ajax({ dataType: 'html', url: $(this).attr("data-base-url")+encodeURIComponent($(this).val()), type: 'get', success: function(data){ $(target).html(data); $(ajax_indicator).hide(); $(target).show(); } }); }); handle_date_picker_fields = function(){ $('.datepicker').datepicker({ dateFormat: 'yy/mm/dd', showOn: "button", buttonImage: "<%= asset_path 'datepicker/cal.gif' %>", buttonImageOnly: true }); } $(document).ready(function(){ $('.tokeninput.products').productPicker(); $('.tokeninput.users').userPicker(); handle_date_picker_fields(); $(".select_properties_from_prototype").live("click", function(){ $("#busy_indicator").show(); var clicked_link = $(this); $.ajax({ dataType: 'script', url: clicked_link.attr("href"), type: 'get', success: function(data){ clicked_link.parent("td").parent("tr").hide(); $("#busy_indicator").hide(); } }); return false; }); $('table.sortable').ready(function(){ $('table.sortable tbody').sortable( { handle: '.handle', update: function(event, ui) { $("#progress").show(); positions = {}; $.each($('table.sortable tbody tr'), function(position, obj){ reg = /spree_(\w+_?)+_(\d+)/; parts = reg.exec($(obj).attr('id')); if (parts) { positions['positions['+parts[2]+']'] = position; } }); $.ajax({ type: 'POST', dataType: 'script', url: $(ui.item).closest("table.sortable").data("sortable-link"), data: positions, success: function(data){ $("#progress").hide(); } }); } }); }); }); jQuery(document).ready(function() { $('a.dismiss').click(function() { $(this).parent().fadeOut(); }); });