spree_sort_products 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 2013 Surya Tripathi
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification,
5
+ are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+ * Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+ * Neither the name Spree nor the names of its contributors may be used to
13
+ endorse or promote products derived from this software without specific
14
+ prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # Welcome to Spree Sort Products
2
+
3
+ Spree Sort Products extends the ability of a taxon on its products to be sorted from the web interface using the drag and drop behavior.
4
+
5
+ ## Installation
6
+
7
+ ### Inside your rails application with Spree installed include the following line in your Gemfile:
8
+ * Get the latest greatest from github:
9
+
10
+ ```ruby
11
+ gem 'spree_sort_products' , :git => 'git://github.com/suryart/spree_sort_products.git'
12
+ ```
13
+
14
+ * Get the 1-3-stable branch for Spree 1.3.x from github:
15
+
16
+ ```ruby
17
+ gem 'spree_sort_products' , :git => 'git://github.com/suryart/spree_sort_products.git', :branch => '1-3-stable'
18
+ ```
19
+
20
+ * Or get it from rubygems.org by mentioning the following line in your Gemfile:
21
+
22
+ ```ruby
23
+ gem 'spree_sort_products', '1.3.2'
24
+ ```
25
+
26
+ ## Caution
27
+
28
+ Just make sure that you have **admin/taxonomy_overrides** and **admin/sort_products** files precompiled. If it's not happening by default then please add/edit this in your **config/environments/production.rb** file:
29
+
30
+ Rails.application.config.assets.precompile += %w(admin/taxonomy_overrides admin/sort_products)
31
+
32
+ ### Then run the following commands:
33
+
34
+ $ bundle install
35
+ $ rails g spree_sort_products:install
36
+ $ rake db:migrate
37
+ $ rails s
38
+
39
+ ## Testing
40
+
41
+ Be sure to bundle your dependencies and then create a dummy test app for the specs to run against.
42
+
43
+ $ bundle
44
+ $ bundle exec rake test_app
45
+ $ bundle exec rspec spec
46
+
47
+ ## Contributing
48
+
49
+ 1. [Fork](https://help.github.com/articles/fork-a-repo) the project
50
+ 2. Make one or more well commented and clean commits to the repository. You can make a new branch here if you are modifying more than one part or feature.
51
+ 3. Add tests for it. This is important so I don’t break it in a future version unintentionally.
52
+ 4. Perform a [pull request](https://help.github.com/articles/using-pull-requests) in github's web interface.
53
+
54
+ ## NOTE
55
+
56
+ The current version supports Spree 1.3.0 or above. Older versions of Spree are unlikely to work, so attempt at your own risk. Just send pull requests of patches for different versions, I will be happy to release your patch.
57
+
58
+ ## License
59
+ Copyright (c) 2013 Surya Tripathi, released under the New BSD License
@@ -0,0 +1,12 @@
1
+ saveOrder = ->
2
+ data = $("#products li").map ->
3
+ $(this).children().attr("value")
4
+ .get()
5
+ $("input[name=product_positions]").val data.join(",")
6
+ $("#save_order").html '<button class="button btn-primary"><i class="icon-ok icon-white"></i> <%= I18n.t(:save_sorted_order) %></button>'
7
+
8
+ $("#products, #list2").dragsort
9
+ dragSelector: "div"
10
+ dragBetween: true
11
+ dragEnd: saveOrder
12
+ placeHolderTemplate: "<li class='placeHolder'><div></div></li>"
@@ -0,0 +1,2 @@
1
+ //= require admin/spree_core
2
+ //= require jquery-dragsort
@@ -0,0 +1,137 @@
1
+ var taxonomy_id;
2
+
3
+ $(document).ready(function(){
4
+ if(taxonomy_id!=undefined){
5
+
6
+ base_url = $("#taxonomy_tree").data("url").split("?")[0] + "/" ;
7
+ child_url = base_url.replace("/taxons", "/get_children.json");
8
+
9
+ is_cut = false;
10
+ last_rollback = null;
11
+
12
+ var conf = {
13
+ json_data : {
14
+ "data" : initial,
15
+ "ajax" : {
16
+ "url" : child_url,
17
+ "data" : function (n) {
18
+ return { parent_id : n.attr ? n.attr("id") : 0 };
19
+ }
20
+ }
21
+ },
22
+ "themes" : {
23
+ "theme" : "apple",
24
+ "url" : "/assets/jquery.jstree/themes/apple/style.css"
25
+ },
26
+ "strings" : {
27
+ "new_node" : new_taxon,
28
+ "loading" : Spree.translations.loading + "..."
29
+ },
30
+ "crrm" : {
31
+ "move" : {
32
+ "check_move" : function (m) {
33
+ var position = m.cp;
34
+ var node = m.o;
35
+ var new_parent = m.np;
36
+
37
+ if(!new_parent) return false; //no parent
38
+
39
+ if(node.attr("rel")=="root") return false; //can't drag root
40
+
41
+ if(new_parent.attr("id")=="taxonomy_tree" && position==0) return false; // can't drop before root
42
+
43
+ return true;
44
+
45
+ }
46
+ }
47
+ },
48
+ "contextmenu" : {
49
+ "items" : function(obj) {
50
+ var id_of_node = obj.attr("id");
51
+ var type_of_node = obj.attr("rel");
52
+ var menu = {};
53
+ if(type_of_node == "root") {
54
+ menu = {
55
+ "create" : {
56
+ "label" : "<i class='icon-plus'></i> " + Spree.translations.add,
57
+ "action" : function (obj) { this.create(obj); }
58
+ },
59
+ "paste" : {
60
+ "separator_before" : true,
61
+ "label" : "<i class='icon-paste'></i> " + Spree.translations.paste,
62
+ "action" : function (obj) { is_cut = false; this.paste(obj); },
63
+ "_disabled" : is_cut == false
64
+ },
65
+ "edit" : {
66
+ "separator_before" : true,
67
+ "label" : "<i class='icon-edit'></i> " + Spree.translations.edit,
68
+ "action" : function (obj) { window.location = base_url + obj.attr("id") + "/edit/"; }
69
+ },
70
+ "sort" : {
71
+ "separator_before" : true,
72
+ "label" : "<i class='icon-th'></i> " + Spree.taxonomy_translations.sort_products,
73
+ "action" : function (obj) { window.location = base_url + obj.attr("id") + "/sort_products/"; }
74
+ }
75
+ }
76
+ } else {
77
+ menu = {
78
+ "create" : {
79
+ "label" : "<i class='icon-plus'></i> " + Spree.translations.add,
80
+ "action" : function (obj) { this.create(obj); }
81
+ },
82
+ "rename" : {
83
+ "label" : "<i class='icon-pencil'></i> " + Spree.translations.rename,
84
+ "action" : function (obj) { this.rename(obj); }
85
+ },
86
+ "remove" : {
87
+ "label" : "<i class='icon-trash'></i> " + Spree.translations.remove,
88
+ "action" : function (obj) { this.remove(obj); }
89
+ },
90
+ "cut" : {
91
+ "separator_before" : true,
92
+ "label" : "<i class='icon-cut'></i> " + Spree.translations.cut,
93
+ "action" : function (obj) { is_cut = true; this.cut(obj); }
94
+ },
95
+ "paste" : {
96
+ "label" : "<i class='icon-paste'></i> " + Spree.translations.paste,
97
+ "action" : function (obj) { is_cut = false; this.paste(obj); },
98
+ "_disabled" : is_cut == false
99
+ },
100
+ "edit" : {
101
+ "separator_before" : true,
102
+ "label" : "<i class='icon-edit'></i> " + Spree.translations.edit,
103
+ "action" : function (obj) { window.location = base_url + obj.attr("id") + "/edit/"; }
104
+ },
105
+ "sort" : {
106
+ "separator_before" : true,
107
+ "label" : "<i class='icon-th'></i> " + Spree.taxonomy_translations.sort_products,
108
+ "action" : function (obj) { window.location = base_url + obj.attr("id") + "/sort_products/"; }
109
+ }
110
+ }
111
+ }
112
+ return menu;
113
+ }
114
+ },
115
+
116
+ "plugins" : [ "themes", "json_data", "dnd", "crrm", "contextmenu"]
117
+ }
118
+
119
+ $("#taxonomy_tree").jstree(conf)
120
+ .bind("move_node.jstree", handle_move)
121
+ .bind("remove.jstree", handle_delete)
122
+ .bind("create.jstree", handle_create)
123
+ .bind("rename.jstree", handle_rename);
124
+
125
+ $("#taxonomy_tree a").on("dblclick", function (e) {
126
+ $("#taxonomy_tree").jstree("rename", this)
127
+ });
128
+
129
+
130
+ $(document).keypress(function(e){
131
+ //surpress form submit on enter/return
132
+ if (e.keyCode == 13){
133
+ e.preventDefault();
134
+ }
135
+ });
136
+ }
137
+ });
@@ -0,0 +1,3 @@
1
+ /*
2
+ *= require admin/spree_core
3
+ */
@@ -0,0 +1,26 @@
1
+ module Spree
2
+ module Admin
3
+ TaxonsController.class_eval do
4
+ before_filter :load_taxon, :only => [:sort_products, :update_products]
5
+
6
+ def sort_products
7
+ @products = @taxon.products
8
+ end
9
+
10
+ def update_products
11
+ products = @taxon.products_taxons
12
+ product_ids_positions = params[:product_positions].split(",").map(&:to_i)
13
+ product_ids_positions.each_with_index do |id, index|
14
+ product = products.detect{|p| p.product_id == id }
15
+ product.update_attributes(:position => index) unless product.nil?
16
+ end
17
+ redirect_to sort_products_taxons_path(@taxonomy, @taxon), :notice => t(:sort_products_taxons_update_message)
18
+ end
19
+
20
+ def load_taxon
21
+ @taxonomy = Taxonomy.find(params[:taxonomy_id])
22
+ @taxon = Taxon.find(params[:id])
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,6 @@
1
+ module Spree
2
+ Product.class_eval do
3
+ has_many :products_taxons, :dependent => :destroy
4
+ has_many :taxons, :through => :products_taxons
5
+ end
6
+ end
@@ -0,0 +1,8 @@
1
+ module Spree
2
+ class ProductsTaxon < ActiveRecord::Base
3
+ attr_accessible :position
4
+
5
+ belongs_to :product
6
+ belongs_to :taxon
7
+ end
8
+ end
@@ -0,0 +1,6 @@
1
+ module Spree
2
+ Taxon.class_eval do
3
+ has_many :products_taxons, :dependent => :destroy
4
+ has_many :products, :through => :products_taxons, :order => 'spree_products_taxons.position'
5
+ end
6
+ end
data/app/spree.rb ADDED
@@ -0,0 +1,5 @@
1
+ module Spree
2
+ def self.table_name_prefix
3
+ 'spree_'
4
+ end
5
+ end
@@ -0,0 +1,8 @@
1
+ <script>
2
+ Spree.taxonomy_translations = <%==
3
+ {
4
+ :sort_products => I18n.t(:sort_products),
5
+ :save_sorted_order => I18n.t(:save_sorted_order)
6
+ }.to_json
7
+ %>
8
+ </script>
@@ -0,0 +1,65 @@
1
+ <%= render :partial => 'spree/admin/shared/configuration_menu' %>
2
+
3
+ <%= render :partial => 'js_head' %>
4
+
5
+ <% content_for :page_title do %>
6
+ <%= t(:taxonomy_edit) %>
7
+ <% end %>
8
+
9
+ <% content_for :page_actions do %>
10
+ <li>
11
+ <%= button_link_to t(:back_to_taxonomies_list), spree.admin_taxonomies_path, :icon => 'icon-arrow-left' %>
12
+ </li>
13
+ <% end %>
14
+
15
+ <div id="ajax_error" class="errorExplanation" style="display:none;"></div>
16
+
17
+ <%= form_for [:admin, @taxonomy] do |f| %>
18
+ <fieldset class="no-border-top">
19
+ <%= render :partial => 'form', :locals => { :f => f } %>
20
+ <div>
21
+ <%= label_tag nil, t(:tree) %><br />
22
+ <div id="taxonomy_tree" class="tree" data-url="<%= admin_taxonomy_taxons_path @taxonomy %>"></div>
23
+ </div>
24
+ <div id="progress" style="display:none;">
25
+ <%= image_tag 'spinner.gif', :title => 'Spinner', :style => "vertical-align:bottom;" %> <%= t(:updating) %>..
26
+ </div>
27
+
28
+ <div class="info"><%= t(:taxonomy_tree_instruction) %></div>
29
+
30
+ <br>
31
+
32
+ <div class="filter-actions actions">
33
+ <%= button t(:update), 'icon-refresh' %>
34
+ <span class="or"><%= t(:or) %></span>
35
+ <%= button_link_to t(:cancel), admin_taxonomies_path, :icon => 'icon-remove' %>
36
+ </div>
37
+ </fieldset>
38
+ <% end %>
39
+
40
+ <% content_for :head do %>
41
+ <%= javascript_include_tag 'admin/taxonomy_overrides' %>
42
+ <%= render :partial => 'spree/admin/shared/taxonomy_translations' %>
43
+
44
+ <%= javascript_tag do -%>
45
+ var initial = [
46
+ { "attr" :
47
+ { "id" : "<%= @taxonomy.root.id %>", "rel" : "root" },
48
+ "data" : "<%= escape_javascript(raw(@taxonomy.root.name)) %>",
49
+ "state" : "open",
50
+ "children" : [
51
+ <% @taxonomy.root.children.each_with_index do |taxon,i| %>
52
+ {
53
+ "attr" :
54
+ { "id" : "<%= taxon.id %>"},
55
+ "data" : "<%= escape_javascript(raw(taxon.name)) %>"
56
+ <% unless taxon.children.empty? %>
57
+ ,"state" : "closed"
58
+ <% end %>
59
+ }<%= ',' if i < (@taxonomy.root.children.size - 1) %>
60
+ <% end %>
61
+ ]
62
+ }
63
+ ];
64
+ <% end -%>
65
+ <% end %>
@@ -0,0 +1,37 @@
1
+ <%= render :partial => 'spree/admin/shared/configuration_menu' %>
2
+
3
+ <% content_for :page_title do %>
4
+ <%= t(:sort_taxon_products) %> "<%= @taxon.name %>"
5
+ <% end %>
6
+
7
+ <%= t(:sort_products_hint_message) %>
8
+
9
+ <div id="ajax_error" class="errorExplanation" style="display:none;"></div>
10
+ <% content_for :page_actions do %>
11
+ <%= form_for [:update_products, :admin, @taxonomy, @taxon], :method => :post do |f| %>
12
+ <%= hidden_field_tag :taxon_id, @taxon_id %>
13
+ <%= hidden_field_tag :product_positions, 0 %>
14
+
15
+ <li id="save_order">
16
+ <%= button_link_to t(:back_to_taxonomies_list), spree.admin_taxonomies_path, :icon => 'icon-arrow-left' %>
17
+ </li>
18
+ <% end %>
19
+ <% end %>
20
+
21
+ <ul id="products" class="thumbnails">
22
+ <% @products.each do |product| %>
23
+ <%= content_tag_for :li, product, :class=> "three columns", :style => 'list-style-type: none' do %>
24
+ <div class="two columns thumbnail" style = "cursor: pointer;" value="<%= product.id %>">
25
+ <%= product_image(product, :width => "145", :height => "190", :id=>"image-map") %>
26
+ <div class="caption">
27
+ <% product_name = product.name.split(" ") %>
28
+ <% product_name.delete(product_name.last) %>
29
+ <h5><%= product_name.join(" ") %></h5>
30
+ <p><%= truncate(product.description, :length => 45, :separator => ' ') %></p>
31
+ </div>
32
+ </div>
33
+ <% end %>
34
+ <% end %>
35
+ </ul>
36
+
37
+ <%= javascript_include_tag 'admin/sort_products' %>
@@ -0,0 +1,9 @@
1
+ # You can add more files in this directory for other locales.
2
+ # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ en:
5
+ save_sorted_order: "Save the sorted position"
6
+ sort_products: "Sort products"
7
+ sort_products_hint_message: "Drag and Drop products to sort their position and then click on Save button to save their position."
8
+ sort_products_taxons_update_message: "Products have been re-positioned successfully!"
9
+ sort_taxon_products: "Sort products in taxon:"
data/config/routes.rb ADDED
@@ -0,0 +1,7 @@
1
+ Spree::Core::Engine.routes.draw do
2
+ # Add extension routes here
3
+
4
+ match 'admin/taxonomies/:taxonomy_id/taxons/:id/sort_products/' => 'admin/taxons#sort_products', :as => :sort_products_taxons
5
+ match 'admin/taxonomies/:taxonomy_id/taxons/:id/update_products/' => 'admin/taxons#update_products', :as => :update_products_admin_taxonomy_taxon, :method => :post
6
+
7
+ end
@@ -0,0 +1,6 @@
1
+ class CreateProductsTaxons < ActiveRecord::Migration
2
+ def change
3
+ add_column :spree_products_taxons, :id, :primary_key
4
+ add_column :spree_products_taxons, :position, :integer, :default => 0
5
+ end
6
+ end
@@ -0,0 +1,27 @@
1
+ module SpreeSortProducts
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+
5
+ def add_javascripts
6
+ append_file 'app/assets/javascripts/admin/all.js', "//= require admin/spree_sort_products\n"
7
+ end
8
+
9
+ def add_stylesheets
10
+ inject_into_file 'app/assets/stylesheets/admin/all.css', " *= require admin/spree_sort_products\n", :before => /\*\//, :verbose => true
11
+ end
12
+
13
+ def add_migrations
14
+ run 'bundle exec rake railties:install:migrations FROM=spree_sort_products'
15
+ end
16
+
17
+ def run_migrations
18
+ res = ask 'Would you like to run the migrations now? [Y/n]'
19
+ if res == '' || res.downcase == 'y'
20
+ run 'bundle exec rake db:migrate'
21
+ else
22
+ puts 'Skipping rake db:migrate, don\'t forget to run it!'
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ module SpreeSortProducts
2
+ class Engine < Rails::Engine
3
+ require 'spree/core'
4
+ isolate_namespace Spree
5
+ engine_name 'spree_sort_products'
6
+
7
+ config.autoload_paths += %W(#{config.root}/lib)
8
+
9
+ # use rspec for tests
10
+ config.generators do |g|
11
+ g.test_framework :rspec
12
+ end
13
+
14
+ initializer :assets do |config|
15
+ Rails.application.config.assets.precompile += %w(admin/taxonomy_overrides admin/sort_products)
16
+ end
17
+
18
+ def self.activate
19
+ Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
20
+ Rails.configuration.cache_classes ? require(c) : load(c)
21
+ end
22
+ end
23
+
24
+ config.to_prepare &method(:activate).to_proc
25
+ end
26
+ end
@@ -0,0 +1,2 @@
1
+ require 'spree_core'
2
+ require 'spree_sort_products/engine'
metadata ADDED
@@ -0,0 +1,214 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spree_sort_products
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Surya Tripathi
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-17 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: spree_core
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 1.3.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 1.3.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: capybara
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 2.0.2
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 2.0.2
46
+ - !ruby/object:Gem::Dependency
47
+ name: coffee-rails
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: factory_girl_rails
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 4.2.0
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 4.2.0
78
+ - !ruby/object:Gem::Dependency
79
+ name: ffaker
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: rspec-rails
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: '2.9'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: '2.9'
110
+ - !ruby/object:Gem::Dependency
111
+ name: guard-rspec
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: '2.3'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: '2.3'
126
+ - !ruby/object:Gem::Dependency
127
+ name: sass-rails
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: sqlite3
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ description: Spree Sort Products extends the ability of a taxon on its products to
159
+ be sorted from the web interface using the drag and drop behavior.
160
+ email: raj.surya19@gmail.com
161
+ executables: []
162
+ extensions: []
163
+ extra_rdoc_files: []
164
+ files:
165
+ - LICENSE
166
+ - README.md
167
+ - app/models/spree/product_decorator.rb
168
+ - app/models/spree/taxon_decorator.rb
169
+ - app/models/spree/products_taxon.rb
170
+ - app/assets/stylesheets/admin/spree_sort_products.css
171
+ - app/assets/javascripts/admin/taxonomy_overrides.js
172
+ - app/assets/javascripts/admin/spree_sort_products.js
173
+ - app/assets/javascripts/admin/sort_products.js.coffee.erb
174
+ - app/spree.rb
175
+ - app/views/spree/admin/shared/_taxonomy_translations.html.erb
176
+ - app/views/spree/admin/taxons/sort_products.html.erb
177
+ - app/views/spree/admin/taxonomies/edit.erb
178
+ - app/controllers/spree/admin/taxons_controller_decorator.rb
179
+ - config/routes.rb
180
+ - config/locales/en.yml
181
+ - lib/spree_sort_products/engine.rb
182
+ - lib/generators/spree_sort_products/install/install_generator.rb
183
+ - lib/spree_sort_products.rb
184
+ - db/migrate/20130417071146_create_products_taxons.rb
185
+ homepage: https://github.com/suryart/spree_sort_products
186
+ licenses: []
187
+ post_install_message:
188
+ rdoc_options: []
189
+ require_paths:
190
+ - lib
191
+ required_ruby_version: !ruby/object:Gem::Requirement
192
+ none: false
193
+ requirements:
194
+ - - ! '>='
195
+ - !ruby/object:Gem::Version
196
+ version: 1.9.2
197
+ required_rubygems_version: !ruby/object:Gem::Requirement
198
+ none: false
199
+ requirements:
200
+ - - ! '>='
201
+ - !ruby/object:Gem::Version
202
+ version: '0'
203
+ segments:
204
+ - 0
205
+ hash: 547993373614995130
206
+ requirements:
207
+ - none
208
+ rubyforge_project:
209
+ rubygems_version: 1.8.24
210
+ signing_key:
211
+ specification_version: 3
212
+ summary: Spree Sort Products gives you ability to sort products with in a taxon for
213
+ spree.
214
+ test_files: []