tienda 2.0.1 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 869f733fb0cbb73c7cb3bbbc89f0b5b3d9434937
4
- data.tar.gz: 42789f8109b671efb78b8dea797aff4d31158386
3
+ metadata.gz: 75f31e72ee89918573cb2806723fc533734645a9
4
+ data.tar.gz: 76d33082565183722512ea4cbfdac5d63243410e
5
5
  SHA512:
6
- metadata.gz: 68386024a0cbd7e311b75bbac5ff6242cb1b99193e9a00aef5180f7ed34a837f78f2ea9d3b44f5e0ee38f7f7a37a55f533373c1e20648bc691ecb5b074daf2ec
7
- data.tar.gz: eea936572ee550b284c7540dc12ad71c6d3a37d0809dbc2099f98116b8cbc7088013fc63a3782b737e02b93cd977bab2a168e5d1a6e7a9522b2d86d322d91630
6
+ metadata.gz: 4e37424a4dbce21b3484ebaf1899d709ff4f14b3c9bd8e4444a2b9a3fb0fb47243a77eb8bbd2eb553936e4d0c9696939fba981eef11ba17190fd8ce65bb4185a
7
+ data.tar.gz: 04c0e881b1f0e3a417a0d56433802dd51af397f4b5253de5131579962768816ac5bf0a9a13a9c2606d42191a1d859f4ca622cc6588e070d57dcba564045610c1
@@ -12,7 +12,7 @@ $ ->
12
12
  $('.tienda_products_index, .tienda_variants_index').on('ajax:success', '#new_stock_level_adjustment', (e, data, status, xhr) ->
13
13
  quantity = parseInt($(this).find('#stock_level_adjustment_adjustment').val())
14
14
  product = $(this).find('#item_id').val()
15
- stock_label = $('a.btn-sm[href*=' + product + ']').closest('td').find('b');
15
+ stock_label = $('a.btn-sm[href*=' + product + ']').closest('td').find('b')
16
16
  old_quantity = parseInt(stock_label.text())
17
17
  $('#stockModal').modal('hide')
18
18
  if isNaN(old_quantity)
@@ -80,21 +80,6 @@ $ ->
80
80
  # window.open($(this).attr('href'), 'despatchnote', 'width=700,height=800')
81
81
  # false
82
82
  #
83
- # # Close dialog
84
- # $('body').on 'click', 'a[rel=closeDialog]', Nifty.Dialog.closeTopDialog
85
- #
86
- # # Open AJAX dialogs
87
- # $('a[rel=dialog]').on 'click', ->
88
- # element = $(this)
89
- # options = {}
90
- # options.width = element.data('dialog-width') if element.data('dialog-width')
91
- # options.offset = element.data('dialog-offset') if element.data('dialog-offset')
92
- # options.behavior = element.data('dialog-behavior') if element.data('dialog-behavior')
93
- # options.id = 'ajax'
94
- # options.url = element.attr('href')
95
- # Nifty.Dialog.open(options)
96
- # false
97
- #
98
83
  # # Format money values to 2 decimal places
99
84
  # $('div.moneyInput input').each formatMoneyField
100
85
  # $('body').on('blur', 'div.moneyInput input', formatMoneyField)
@@ -106,44 +91,3 @@ $ ->
106
91
  # value = $(this).val().replace /,/, ""
107
92
  # $(this).val(parseFloat(value).toFixed(2)) if value.length
108
93
  #
109
- # #
110
- # # Stock Level Adjustment dialog beavior
111
- # #
112
- # Nifty.Dialog.addBehavior
113
- # name: 'stockLevelAdjustments'
114
- # onLoad: (dialog,options)->
115
- # $('input[type=text]:first', dialog).focus()
116
- # $(dialog).on 'submit', 'form', ->
117
- # form = $(this)
118
- # $.ajax
119
- # url: form.attr('action')
120
- # method: 'POST'
121
- # data: form.serialize()
122
- # dataType: 'text'
123
- # success: (data)->
124
- # $('div.table', dialog).replaceWith(data)
125
- # $('input[type=text]:first', dialog).focus()
126
- # error: (xhr)->
127
- # if xhr.status == 422
128
- # alert xhr.responseText
129
- # else
130
- # alert 'An error occurred while saving the stock level.'
131
- # false
132
- # $(dialog).on 'click', 'nav.pagination a', ->
133
- # $.ajax
134
- # url: $(this).attr('href')
135
- # success: (data)->
136
- # $('div.table', dialog).replaceWith(data)
137
- # false
138
- #
139
- # #
140
- # # Always fire keyboard shortcuts when focused on fields
141
- # #
142
- # Mousetrap.stopCallback = -> false
143
- #
144
- # #
145
- # # Close dialogs on escape
146
- # #
147
- # Mousetrap.bind 'escape', ->
148
- # Nifty.Dialog.closeTopDialog()
149
- # false
@@ -7,11 +7,11 @@ module Tienda
7
7
  @last_30_days_orders = {}
8
8
  end_date = Date.today
9
9
  start_date = end_date - 30.days
10
- last_30_days_orders = Tienda::Order.group('DATE(created_at)').where(created_at: start_date..end_date).count
10
+ last_30_days_orders = Tienda::Order.received.group('DATE(created_at)').where(created_at: start_date..end_date).count
11
11
  (start_date..end_date).each do |day|
12
12
  @last_30_days_orders[day] = last_30_days_orders[day] || 0
13
13
  end
14
- @sales_by_category = Tienda::Order.joins(products: [:product_category]).where(created_at: start_date..end_date).group('tienda_product_categories.name').count
14
+ @sales_by_category = Tienda::Order.received.joins(products: [:product_category]).where(created_at: start_date..end_date).group('tienda_product_categories.name').count
15
15
  @users_count = Tienda::User.count
16
16
  end
17
17
 
@@ -5,10 +5,11 @@ module Tienda
5
5
  before_filter { params[:id] && @product_category = Tienda::ProductCategory.find(params[:id]) }
6
6
 
7
7
  def index
8
- @product_categories = Tienda::ProductCategory.ordered.all
8
+ @product_categories = Tienda::ProductCategory.root.ordered.includes(:children)
9
9
  end
10
10
 
11
11
  def new
12
+ @parents = Tienda::ProductCategory.all
12
13
  @product_category = Tienda::ProductCategory.new
13
14
  end
14
15
 
@@ -22,6 +23,7 @@ module Tienda
22
23
  end
23
24
 
24
25
  def edit
26
+ @parents = Tienda::ProductCategory.all
25
27
  end
26
28
 
27
29
  def update
@@ -40,7 +42,7 @@ module Tienda
40
42
  private
41
43
 
42
44
  def safe_params
43
- params[:product_category].permit(:name, :permalink, :description, :image_file)
45
+ params[:product_category].permit(:name, :permalink, :description, :image_file, :parent_id)
44
46
  end
45
47
 
46
48
  end
@@ -0,0 +1,56 @@
1
+ module Tienda
2
+ module ProductCategoriesHelper
3
+
4
+ def product_category_spacing(category, relative_depth)
5
+ ("<span style='display:inline-block;width:#{relative_depth}em;'></span>").html_safe
6
+ end
7
+
8
+ def product_category_rows(category, current_category = nil, link_to_current = true, relative_depth = 0)
9
+ if category.present? && category.children.any?
10
+ relative_depth += 1
11
+ String.new.tap do |s|
12
+ category.children.ordered.each do |child|
13
+ s << '<tr><td>'
14
+ if child == current_category
15
+ if link_to_current == false
16
+ s << "#{product_category_spacing child, relative_depth} &#8627; #{child.name} (#{t('shoppe.product_category.nesting.current_category')})"
17
+ else
18
+ s << "#{product_category_spacing child, relative_depth} &#8627; #{link_to(child.name, [:edit, child]).html_safe} (#{t('shoppe.product_category.nesting.current_category')})"
19
+ end
20
+ else
21
+ s << "#{product_category_spacing child, relative_depth} &#8627; #{link_to(child.name, [:edit, child]).html_safe}"
22
+ end
23
+ s << '</td></tr>'
24
+ s << product_category_rows(child, current_category, link_to_current, relative_depth)
25
+ end
26
+ end.html_safe
27
+ else
28
+ ''
29
+ end
30
+ end
31
+
32
+ def product_categories_options_for_select(selected = nil, disable = nil)
33
+ String.new.tap do |s|
34
+ Tienda::ProductCategory.root.ordered.includes(:children).each do |category|
35
+ s << product_categories_options_for_select_recursive(category, 0, selected, disable)
36
+ end
37
+ end.html_safe
38
+ end
39
+
40
+ def product_categories_options_for_select_recursive(category, depth, selected, disable)
41
+ if category.present?
42
+ String.new.tap do |s|
43
+ s << "<option value='#{category.id}'#{' selected' if selected == category.id}#{' disabled' if disable == category.id}>#{' &#8627; ' * depth}#{category.name}</option>"
44
+ if category.children.any?
45
+ depth += 1
46
+ category.children.ordered.each do |child|
47
+ s << product_categories_options_for_select_recursive(child, depth, selected, disable)
48
+ end
49
+ end
50
+ end.html_safe
51
+ else
52
+ ''
53
+ end
54
+ end
55
+ end
56
+ end
@@ -21,18 +21,18 @@ module Tienda
21
21
  # The product's category
22
22
  #
23
23
  # @return [Tienda::ProductCategory]
24
- belongs_to :product_category, class_name: 'Tienda::ProductCategory'
24
+ belongs_to :product_category
25
25
 
26
26
  # The product's tax rate
27
27
  #
28
28
  # @return [Tienda::TaxRate]
29
- belongs_to :tax_rate, class_name: "Tienda::TaxRate"
29
+ belongs_to :tax_rate
30
30
 
31
31
  # Ordered items which are associated with this product
32
- has_many :order_items, dependent: :restrict_with_exception, class_name: 'Tienda::OrderItem', as: :ordered_item
32
+ has_many :order_items, dependent: :restrict_with_exception, as: :ordered_item
33
33
 
34
34
  # Orders which have ordered this product
35
- has_many :orders, through: :order_items, class_name: 'Tienda::Order'
35
+ has_many :orders, through: :order_items
36
36
 
37
37
  # Stock level adjustments for this product
38
38
  has_many :stock_level_adjustments, dependent: :destroy
@@ -108,6 +108,20 @@ module Tienda
108
108
  nifty_attachments.select { |attachment| attachment.role != "data_sheet" }
109
109
  end
110
110
 
111
+ # Return all product categories
112
+ #
113
+ # @return [Array]
114
+ def categories
115
+ parent_category_id = product_category.id
116
+ cats = []
117
+ while parent_category_id != nil
118
+ c = Tienda::ProductCategory.find(parent_category_id)
119
+ cats << c
120
+ parent_category_id = c.parent_id
121
+ end
122
+ cats
123
+ end
124
+
111
125
  # Search for products which include the given attributes and return an active record
112
126
  # scope of these products. Chainable with other scopes and with_attributes methods.
113
127
  # For example:
@@ -1,20 +1,23 @@
1
1
  module Tienda
2
2
  class ProductCategory < ActiveRecord::Base
3
3
 
4
- self.table_name = 'tienda_product_categories'
5
-
6
4
  # Categories have an image attachment
7
5
  attachment :image
8
6
 
9
7
  # All products within this category
10
- has_many :products, :dependent => :restrict_with_exception, :class_name => 'Tienda::Product'
8
+ has_many :products, dependent: :restrict_with_exception
9
+ # Sub Categories relationships
10
+ has_many :children, class_name: 'Tienda::ProductCategory', foreign_key: :parent_id
11
+ belongs_to :parent, class_name: 'Tienda::ProductCategory'
11
12
 
12
13
  # Validations
13
- validates :name, :presence => true
14
- validates :permalink, :presence => true, :uniqueness => true, :permalink => true
14
+ validates :name, presence: true
15
+ validates :permalink, presence: true, uniqueness: true, permalink: true
15
16
 
16
17
  # All categories ordered by their name ascending
17
18
  scope :ordered, -> { order(:name) }
19
+ scope :root, -> { where(parent_id: nil) }
20
+ scope :sub_categories, -> { where.not(parent_id: nil) }
18
21
 
19
22
  # Set the permalink on callback
20
23
  before_validation { self.permalink = self.name.parameterize if self.permalink.blank? && self.name.is_a?(String) }
@@ -7,14 +7,12 @@
7
7
  %title #{@page_title} - Tienda
8
8
  %meta{content: "http://gonzalo.robaina.me", name: "author"}/
9
9
  =# stylesheet_link_tag 'tienda/application'
10
- / Bootstrap Styles
11
10
  %link{href: '//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css', rel: 'stylesheet'}
12
- / FontAwesome Styles
13
11
  %link{href: '//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css', rel: 'stylesheet'}
14
- / Morris Chart and Custom Styles
15
- = stylesheet_link_tag 'tienda/morris-0.4.3.min', 'tienda/custom-styles'
16
- / Google Fonts
17
- %link{:href => "http://fonts.googleapis.com/css?family=Open+Sans", :rel => "stylesheet", :type => "text/css"}/
12
+ = stylesheet_link_tag 'tienda/custom-styles'
13
+
14
+ %link{href: '//cdnjs.cloudflare.com/ajax/libs/morris.js/0.5.1/morris.css', rel: 'stylesheet'}
15
+ %link{href: 'http://fonts.googleapis.com/css?family=Open+Sans', rel: 'stylesheet', type: 'text/css'}/
18
16
  = javascript_include_tag 'tienda/application'
19
17
  = csrf_meta_tags
20
18
  :javascript
@@ -38,4 +36,6 @@
38
36
  %a{:href => "http://webthemez.com"} WebThemez
39
37
 
40
38
  %script{src: "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"}
41
- = javascript_include_tag 'tienda/jquery.metisMenu', 'tienda/raphael-2.1.0.min', 'tienda/morris'
39
+ %script{src: "//cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js"}
40
+ %script{src: "//cdnjs.cloudflare.com/ajax/libs/morris.js/0.5.1/morris.min.js"}
41
+ = javascript_include_tag 'tienda/jquery.metisMenu'
@@ -5,11 +5,15 @@
5
5
  = t('tienda.product_category.category_details')
6
6
  .panel-body
7
7
  .row
8
- .col-md-6
8
+ .col-md-4
9
+ .form-group
10
+ = f.label :name, t('tienda.product_category.parent')
11
+ = f.select :parent_id, product_categories_options_for_select(@product_category.parent_id, @product_category.id), {prompt: true}, {class: 'form-control'}
12
+ .col-md-4
9
13
  .form-group
10
14
  = f.label :name, t('tienda.product_category.name')
11
15
  = f.text_field :name, class: 'focus form-control'
12
- .col-md-6
16
+ .col-md-4
13
17
  .form-group
14
18
  = f.label :permalink, t('tienda.product_category.permalink')
15
19
  = f.text_field :permalink, class: 'form-control'
@@ -24,6 +24,7 @@
24
24
  %tr.empty
25
25
  %td= t('tienda.product_category.no_categories')
26
26
  - else
27
- - for cat in @product_categories
27
+ - @product_categories.each do |cat|
28
28
  %tr
29
29
  %td= link_to cat.name, [:edit, cat]
30
+ = product_category_rows(cat)
@@ -5,5 +5,5 @@ Rails.application.config.assets.version = '1.0'
5
5
 
6
6
  # Precompile additional assets.
7
7
  # application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
8
- Rails.application.config.assets.precompile += %w( tienda/morris-0.4.3.min.css tienda/custom-styles.css )
9
- Rails.application.config.assets.precompile += %w( tienda/jquery.metisMenu.js tienda/raphael-2.1.0.min.js tienda/morris.js tienda/custom-scripts.js )
8
+ Rails.application.config.assets.precompile += %w( tienda/custom-styles.css )
9
+ Rails.application.config.assets.precompile += %w( tienda/jquery.metisMenu.js )
@@ -0,0 +1,5 @@
1
+ class AddParentIdToCategories < ActiveRecord::Migration
2
+ def change
3
+ add_column :tienda_product_categories, :parent_id, :int, index: true
4
+ end
5
+ end
@@ -1,3 +1,3 @@
1
1
  module Tienda
2
- VERSION = '2.0.1'
2
+ VERSION = '2.0.2'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tienda
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gonzalo Robaina
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-04 00:00:00.000000000 Z
11
+ date: 2015-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -400,21 +400,14 @@ files:
400
400
  - app/assets/images/tienda/statuses/shipped.svg
401
401
  - app/assets/images/tienda/table-tear-off.png
402
402
  - app/assets/javascripts/tienda/application.coffee
403
- - app/assets/javascripts/tienda/chosen.jquery.js
404
- - app/assets/javascripts/tienda/custom-scripts.js
405
- - app/assets/javascripts/tienda/custom.js
406
403
  - app/assets/javascripts/tienda/jquery.metisMenu.js
407
404
  - app/assets/javascripts/tienda/jquery_ui.js
408
- - app/assets/javascripts/tienda/morris.js
409
- - app/assets/javascripts/tienda/mousetrap.js
410
405
  - app/assets/javascripts/tienda/order_form.coffee
411
- - app/assets/javascripts/tienda/raphael-2.1.0.min.js
412
406
  - app/assets/stylesheets/tienda/application.scss
413
407
  - app/assets/stylesheets/tienda/chosen.scss
414
408
  - app/assets/stylesheets/tienda/custom-styles.scss
415
409
  - app/assets/stylesheets/tienda/dialog.scss
416
410
  - app/assets/stylesheets/tienda/elements.scss
417
- - app/assets/stylesheets/tienda/morris-0.4.3.min.css
418
411
  - app/assets/stylesheets/tienda/printable.scss
419
412
  - app/assets/stylesheets/tienda/reset.scss
420
413
  - app/assets/stylesheets/tienda/sub.scss
@@ -436,6 +429,7 @@ files:
436
429
  - app/controllers/tienda/users_controller.rb
437
430
  - app/controllers/tienda/variants_controller.rb
438
431
  - app/helpers/tienda/application_helper.rb
432
+ - app/helpers/tienda/product_categories_helper.rb
439
433
  - app/mailers/tienda/order_mailer.rb
440
434
  - app/mailers/tienda/user_mailer.rb
441
435
  - app/models/tienda/country.rb
@@ -530,6 +524,7 @@ files:
530
524
  - db/migrate/20150517195800_remove_stock_level_item_polymorphism.rb
531
525
  - db/migrate/20150517212100_update_stock_counter_cache.rb
532
526
  - db/migrate/20150603235417_add_document_to_orders.rb
527
+ - db/migrate/20150605232554_add_parent_id_to_categories.rb
533
528
  - db/seeds.rb
534
529
  - db/seeds_data/poe400.jpg
535
530
  - db/seeds_data/snom-870-blk.jpg