rshop 0.1.0
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 +7 -0
- data/.gitignore +10 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +41 -0
- data/Rakefile +1 -0
- data/app/controllers/ajax/rshop/products_controller.rb +12 -0
- data/app/controllers/rshop/.keep +0 -0
- data/app/controllers/rshop/auto_products_controller.rb +38 -0
- data/app/controllers/rshop/brands_controller.rb +9 -0
- data/app/controllers/rshop/cart_controller.rb +61 -0
- data/app/controllers/rshop/checkout_controller.rb +69 -0
- data/app/controllers/rshop/products_controller.rb +13 -0
- data/app/controllers/rshop/stock_requests_controller.rb +17 -0
- data/app/mailers/order_mailer.rb +13 -0
- data/app/views/order_mailer/feedback.html.slim +3 -0
- data/app/views/order_mailer/new_order.html.slim +33 -0
- data/app/views/rshop/address/_address_form.html.slim +27 -0
- data/app/views/rshop/admin/order/_address.html.slim +13 -0
- data/app/views/rshop/admin/order/_order_items.html.slim +7 -0
- data/app/views/rshop/brands/index.html.slim +6 -0
- data/app/views/rshop/brands/show.html.slim +4 -0
- data/app/views/rshop/cart/show.html.slim +74 -0
- data/app/views/rshop/checkout/form.html.slim +65 -0
- data/app/views/rshop/checkout/ty.html.slim +22 -0
- data/app/views/rshop/products/_list.html.slim +27 -0
- data/app/views/rshop/products/all.html.slim +1 -0
- data/app/views/rshop/products/index.html.slim +0 -0
- data/app/views/rshop/products/show.html.slim +67 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/config/locales/rshop.ru.yml +141 -0
- data/config/locales/rshop_autozap.ru.yml +88 -0
- data/config/routes.rb +2 -0
- data/lib/generators/rshop_autozap_generator.rb +30 -0
- data/lib/generators/rshop_generator.rb +38 -0
- data/lib/generators/rshop_price_log_generator.rb +30 -0
- data/lib/generators/rshop_views_generator.rb +17 -0
- data/lib/generators/templates/app/admin/dashboard.rb +37 -0
- data/lib/generators/templates/app/admin/rshop/brand.rb +24 -0
- data/lib/generators/templates/app/admin/rshop/delivery.rb +4 -0
- data/lib/generators/templates/app/admin/rshop/order.rb +55 -0
- data/lib/generators/templates/app/admin/rshop/payment.rb +4 -0
- data/lib/generators/templates/app/admin/rshop/product.rb +61 -0
- data/lib/generators/templates/app/controllers/rshop/.keep +0 -0
- data/lib/generators/templates/app/models/rshop/address.rb +11 -0
- data/lib/generators/templates/app/models/rshop/album.rb +11 -0
- data/lib/generators/templates/app/models/rshop/album_image.rb +7 -0
- data/lib/generators/templates/app/models/rshop/brand.rb +24 -0
- data/lib/generators/templates/app/models/rshop/delivery.rb +3 -0
- data/lib/generators/templates/app/models/rshop/order.rb +65 -0
- data/lib/generators/templates/app/models/rshop/order_item.rb +9 -0
- data/lib/generators/templates/app/models/rshop/payment.rb +3 -0
- data/lib/generators/templates/app/models/rshop/product.rb +88 -0
- data/lib/generators/templates/app/uploaders/rshop_album_image_uploader.rb +49 -0
- data/lib/generators/templates/app/uploaders/rshop_base_image_uploader.rb +63 -0
- data/lib/generators/templates/app/uploaders/rshop_brand_uploader.rb +7 -0
- data/lib/generators/templates/migration.rb +95 -0
- data/lib/generators/templates_autozap/app/admin/rshop/auto_category.rb +16 -0
- data/lib/generators/templates_autozap/app/admin/rshop/auto_mark.rb +15 -0
- data/lib/generators/templates_autozap/app/admin/rshop/auto_model.rb +16 -0
- data/lib/generators/templates_autozap/app/admin/rshop/auto_subcategory.rb +14 -0
- data/lib/generators/templates_autozap/app/admin/rshop/product.rb +66 -0
- data/lib/generators/templates_autozap/app/controllers/rshop/.keep +0 -0
- data/lib/generators/templates_autozap/app/models/rshop/auto_category.rb +15 -0
- data/lib/generators/templates_autozap/app/models/rshop/auto_mark.rb +11 -0
- data/lib/generators/templates_autozap/app/models/rshop/auto_model.rb +13 -0
- data/lib/generators/templates_autozap/app/models/rshop/auto_subcategory.rb +12 -0
- data/lib/generators/templates_autozap/app/models/rshop/product.rb +94 -0
- data/lib/generators/templates_autozap/app/views/rshop/auto/_filters.html.slim +18 -0
- data/lib/generators/templates_autozap/migration.rb +51 -0
- data/lib/generators/templates_price_log/app/models/rshop/price_log.rb +5 -0
- data/lib/generators/templates_price_log/migration.rb +11 -0
- data/lib/rshop.rb +47 -0
- data/lib/rshop/application_controller.rb +51 -0
- data/lib/rshop/auto_application_controller.rb +43 -0
- data/lib/rshop/price_adjustable_product.rb +30 -0
- data/lib/rshop/price_loggable_product.rb +19 -0
- data/lib/rshop/version.rb +3 -0
- data/rshop.gemspec +32 -0
- metadata +156 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
class Rshop::OrderItem < ActiveRecord::Base
|
|
2
|
+
self.table_name = 'rshop_order_items'
|
|
3
|
+
belongs_to :product, touch: true, class_name: Rshop::Product, foreign_key: :rshop_product_id
|
|
4
|
+
belongs_to :order, touch: true, class_name: Rshop::Order, foreign_key: :rshop_order_id
|
|
5
|
+
|
|
6
|
+
def cost
|
|
7
|
+
self.product.price * self.qty
|
|
8
|
+
end
|
|
9
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
class Rshop::Product < ActiveRecord::Base
|
|
2
|
+
self.table_name = 'rshop_products'
|
|
3
|
+
# ctb - cart to buy
|
|
4
|
+
# ctc - click to cart
|
|
5
|
+
extend FriendlyId
|
|
6
|
+
friendly_id :name, use: [:slugged, :finders]
|
|
7
|
+
|
|
8
|
+
has_one :album, as: :albumizable, dependent: :destroy, class_name: Rshop::Album
|
|
9
|
+
belongs_to :brand, touch: true, class_name: Rshop::Brand, foreign_key: :rshop_brand_id
|
|
10
|
+
|
|
11
|
+
accepts_nested_attributes_for :album, allow_destroy: true
|
|
12
|
+
after_initialize :init
|
|
13
|
+
before_save :calc_ctb, :calc_ctc
|
|
14
|
+
|
|
15
|
+
validates :name, :price, presence: true
|
|
16
|
+
|
|
17
|
+
default_scope -> { where(is_published: true).order("cart_count desc").order('is_promotion desc') }
|
|
18
|
+
|
|
19
|
+
scope :order_by_smth, -> order_by do
|
|
20
|
+
order(order_by)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def get_name_font
|
|
24
|
+
case name.length
|
|
25
|
+
when 0..24
|
|
26
|
+
'name-xs'
|
|
27
|
+
when 25..45
|
|
28
|
+
'name-sm'
|
|
29
|
+
when 46..60
|
|
30
|
+
'name-md'
|
|
31
|
+
else
|
|
32
|
+
'name-lg'
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def image_url variant = nil
|
|
37
|
+
image = self.album.images.first
|
|
38
|
+
path = image.try(:url, variant)
|
|
39
|
+
path ? path : Rshop::AlbumImage.new.url(variant)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
protected
|
|
43
|
+
|
|
44
|
+
def calc_ctb
|
|
45
|
+
if cart_count + sold_count <= 0
|
|
46
|
+
self.ctb = 0
|
|
47
|
+
return
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
if sold_count == 0
|
|
51
|
+
self.sold_count = 1
|
|
52
|
+
end
|
|
53
|
+
self.ctb = sold_count / cart_count
|
|
54
|
+
|
|
55
|
+
rescue StandardError => e
|
|
56
|
+
p e.to_s
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def calc_ctc
|
|
60
|
+
if views_count + cart_count <= 0
|
|
61
|
+
self.ctc = 0
|
|
62
|
+
return
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
if views_count == 0
|
|
66
|
+
self.views_count = 1
|
|
67
|
+
end
|
|
68
|
+
self.ctc = cart_count / views_count
|
|
69
|
+
|
|
70
|
+
rescue StandardError => e
|
|
71
|
+
p e.to_s
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def remove_from_category category
|
|
75
|
+
category.products.delete self
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def should_generate_new_friendly_id?
|
|
79
|
+
!slug.present?
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def init
|
|
83
|
+
unless self.persisted?
|
|
84
|
+
self.in_stock = true
|
|
85
|
+
self.album = Rshop::Album.new if self.album.nil?
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
class ::RshopAlbumImageUploader < RshopBaseImageUploader
|
|
4
|
+
version :list do
|
|
5
|
+
process :resize_to_fill => [345, 345]
|
|
6
|
+
process :watermark_bottom
|
|
7
|
+
end
|
|
8
|
+
version :show do
|
|
9
|
+
process :resize_to_limit => [345, 700]
|
|
10
|
+
process :watermark_bottom
|
|
11
|
+
end
|
|
12
|
+
version :gallery do
|
|
13
|
+
process :resize_to_fill => [78, 78]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
version :origin do
|
|
17
|
+
process :resize_to_limit => [2000, 1000]
|
|
18
|
+
process :watermark_bottom
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def watermark_text
|
|
22
|
+
# pr = model.album ? model.album.albumizable : nil
|
|
23
|
+
# pr.respond_to?(:name2) ? "#{pr.name}\nwww.korma.in.ua " : 'www.korma.in.ua'
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def watermark_center
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def watermark_bottom
|
|
30
|
+
return unless watermark_text
|
|
31
|
+
manipulate! do |img|
|
|
32
|
+
# logo = Magick::Image.read("#{Rails.root}/app/assets/images/logo.png").first
|
|
33
|
+
# img = img.composite(logo, Magick::SouthEastGravity, Magick::OverCompositeOp)
|
|
34
|
+
|
|
35
|
+
mark = Magick::Image.new(img.rows, img.columns) {self.background_color = "none"}
|
|
36
|
+
|
|
37
|
+
draw = Magick::Draw.new
|
|
38
|
+
draw.font = 'Helvetica'
|
|
39
|
+
draw.pointsize = 32
|
|
40
|
+
draw.font_weight = Magick::BoldWeight
|
|
41
|
+
draw.fill = '#CCCCCC'
|
|
42
|
+
draw.gravity = Magick::SouthGravity
|
|
43
|
+
draw.annotate(mark, 0, 0, 0, 15, self.watermark_text)
|
|
44
|
+
|
|
45
|
+
img = img.dissolve(mark, 0.15, 0.2, Magick::CenterGravity)
|
|
46
|
+
img
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
class RshopBaseImageUploader < CarrierWave::Uploader::Base
|
|
4
|
+
|
|
5
|
+
# Include RMagick or MiniMagick support:
|
|
6
|
+
include CarrierWave::RMagick
|
|
7
|
+
# include CarrierWave::MiniMagick
|
|
8
|
+
|
|
9
|
+
# Choose what kind of storage to use for this uploader:
|
|
10
|
+
storage :file
|
|
11
|
+
# storage :fog
|
|
12
|
+
|
|
13
|
+
# Override the directory where uploaded files will be stored.
|
|
14
|
+
# This is a sensible default for uploaders that are meant to be mounted:
|
|
15
|
+
def store_dir
|
|
16
|
+
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Provide a default URL as a default if there hasn't been a file uploaded:
|
|
20
|
+
def default_url
|
|
21
|
+
# For Rails 3.1+ asset pipeline compatibility:
|
|
22
|
+
# ActionController::Base.helpers.asset_path("images/#{fallback_dir}/" + [version_name, "default.png"].compact.join('_'))
|
|
23
|
+
ActionController::Base.helpers.asset_path("default.jpg")
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def set_filename(name)
|
|
27
|
+
@filename = name
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Process files as they are uploaded:
|
|
31
|
+
# process :scale => [200, 300]
|
|
32
|
+
#
|
|
33
|
+
# def scale(width, height)
|
|
34
|
+
# # do something
|
|
35
|
+
# end
|
|
36
|
+
|
|
37
|
+
# Create different versions of your uploaded files:
|
|
38
|
+
# version :thumb do
|
|
39
|
+
# process :resize_to_fill => [150, 150]
|
|
40
|
+
# end
|
|
41
|
+
|
|
42
|
+
# Add a white list of extensions which are allowed to be uploaded.
|
|
43
|
+
# For images you might use something like this:
|
|
44
|
+
def extension_white_list
|
|
45
|
+
%w(jpg jpeg png bmp)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Override the filename of the uploaded files:
|
|
49
|
+
# Avoid using model.id or version_name here, see uploader/store.rb for details.
|
|
50
|
+
# def filename
|
|
51
|
+
# "something.jpg" if original_filename
|
|
52
|
+
# end
|
|
53
|
+
|
|
54
|
+
def default?
|
|
55
|
+
url == default_url
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
protected
|
|
59
|
+
|
|
60
|
+
def fallback_dir
|
|
61
|
+
model.class.to_s.underscore
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
class CreateRshopTables < ActiveRecord::Migration
|
|
2
|
+
def change
|
|
3
|
+
create_table :rshop_products do |t|
|
|
4
|
+
t.belongs_to :rshop_album, index: true
|
|
5
|
+
t.belongs_to :rshop_brand, index: true
|
|
6
|
+
|
|
7
|
+
t.string :name
|
|
8
|
+
t.string :admin_comment
|
|
9
|
+
t.string :xls_code
|
|
10
|
+
t.string :slug, index: true
|
|
11
|
+
t.string :code
|
|
12
|
+
t.decimal :price, :precision => 6, :scale => 2
|
|
13
|
+
|
|
14
|
+
t.text :description
|
|
15
|
+
t.text :description_short
|
|
16
|
+
|
|
17
|
+
t.boolean :is_promotion
|
|
18
|
+
t.boolean :is_published
|
|
19
|
+
t.boolean :in_stock
|
|
20
|
+
|
|
21
|
+
t.integer :views_count, default: 0
|
|
22
|
+
t.integer :sold_count, default: 0
|
|
23
|
+
t.integer :cart_count, default: 0
|
|
24
|
+
t.decimal :ctb, :precision => 6, :scale => 2, default: 0
|
|
25
|
+
t.decimal :ctc, :precision => 6, :scale => 2, default: 0
|
|
26
|
+
|
|
27
|
+
t.timestamps
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
create_table :rshop_brands do |t|
|
|
31
|
+
t.string :name
|
|
32
|
+
t.string :slug
|
|
33
|
+
t.string :image
|
|
34
|
+
t.text :description
|
|
35
|
+
t.decimal :n, :precision => 6, :scale => 2
|
|
36
|
+
|
|
37
|
+
t.timestamps
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
create_table :rshop_albums do |t|
|
|
41
|
+
t.string :name
|
|
42
|
+
t.references :albumizable, polymorphic: true
|
|
43
|
+
|
|
44
|
+
t.timestamps
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
create_table :rshop_album_images do |t|
|
|
48
|
+
t.string :name
|
|
49
|
+
t.string :image
|
|
50
|
+
t.belongs_to :rshop_album, index: true
|
|
51
|
+
|
|
52
|
+
t.timestamps
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
create_table :rshop_orders do |t|
|
|
56
|
+
t.belongs_to :user, index: true
|
|
57
|
+
t.belongs_to :rshop_payment, index: true
|
|
58
|
+
t.belongs_to :rshop_delivery, index: true
|
|
59
|
+
t.integer :status
|
|
60
|
+
t.text :comments
|
|
61
|
+
|
|
62
|
+
t.timestamps
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
create_table :rshop_order_items do |t|
|
|
66
|
+
t.belongs_to :rshop_product, index: true
|
|
67
|
+
t.belongs_to :rshop_order, index: true
|
|
68
|
+
t.integer :qty
|
|
69
|
+
|
|
70
|
+
t.timestamps
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
create_table :rshop_addresses do |t|
|
|
74
|
+
t.string :phone
|
|
75
|
+
t.string :address
|
|
76
|
+
t.string :username
|
|
77
|
+
t.string :email
|
|
78
|
+
t.references :addressable, polymorphic: true
|
|
79
|
+
|
|
80
|
+
t.timestamps
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
create_table :rshop_payments do |t|
|
|
84
|
+
t.string :name
|
|
85
|
+
|
|
86
|
+
t.timestamps
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
create_table :rshop_deliveries do |t|
|
|
90
|
+
t.string :name
|
|
91
|
+
|
|
92
|
+
t.timestamps
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
ActiveAdmin.register Rshop::AutoCategory do
|
|
2
|
+
permit_params :name, :slug, :image, :image_cache, :remote_image_url, :remove_image,
|
|
3
|
+
subcategory_ids: [], model_ids: []
|
|
4
|
+
|
|
5
|
+
form do |f|
|
|
6
|
+
f.inputs do
|
|
7
|
+
f.input :name
|
|
8
|
+
f.input :slug
|
|
9
|
+
f.input :models, hint: 'одна марка может иметь много моделей'
|
|
10
|
+
f.input :subcategories, hint: 'много категорий могут относится ко многим подкатегориям'
|
|
11
|
+
|
|
12
|
+
end
|
|
13
|
+
f.actions
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
ActiveAdmin.register Rshop::AutoMark do
|
|
2
|
+
permit_params :name, :slug, :image, :image_cache, :remote_image_url, :remove_image,
|
|
3
|
+
model_ids: []
|
|
4
|
+
|
|
5
|
+
form do |f|
|
|
6
|
+
f.inputs do
|
|
7
|
+
f.input :name
|
|
8
|
+
f.input :slug
|
|
9
|
+
f.input :models, hint: 'одна марка может иметь много моделей'
|
|
10
|
+
|
|
11
|
+
end
|
|
12
|
+
f.actions
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
ActiveAdmin.register Rshop::AutoModel do
|
|
2
|
+
permit_params :name, :slug, :rshop_auto_mark_id,
|
|
3
|
+
:image, :image_cache, :remote_image_url, :remove_image,
|
|
4
|
+
category_ids: []
|
|
5
|
+
|
|
6
|
+
form do |f|
|
|
7
|
+
f.inputs do
|
|
8
|
+
f.input :name
|
|
9
|
+
f.input :mark, hint: 'одна модель относится к одной марке'
|
|
10
|
+
f.input :slug
|
|
11
|
+
f.input :categories, hint: 'много моделей относятся ко многим категориям'
|
|
12
|
+
end
|
|
13
|
+
f.actions
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
ActiveAdmin.register Rshop::AutoSubcategory do
|
|
2
|
+
permit_params :name, :slug, :image, :image_cache, :remote_image_url, :remove_image,
|
|
3
|
+
category_ids: []
|
|
4
|
+
|
|
5
|
+
form do |f|
|
|
6
|
+
f.inputs do
|
|
7
|
+
f.input :name
|
|
8
|
+
f.input :slug
|
|
9
|
+
f.input :categories, hint: 'много подкатегорий относятся ко многим категориям'
|
|
10
|
+
end
|
|
11
|
+
f.actions
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
ActiveAdmin.register Rshop::Product do
|
|
2
|
+
permit_params :name, :price, :description, :code, :is_promotion, :slug, :is_published, :in_stock,
|
|
3
|
+
:rshop_auro_mark_id, :rshop_auto_model_id, :rshop_auto_category_id, :rshop_auto_subcategory_id,
|
|
4
|
+
:category_id, :rshop_brand_id, :description_short,
|
|
5
|
+
album_attributes: [:id, :name, images_attributes: [:id, :image, :image_cache, :_destroy]],
|
|
6
|
+
category_ids: [], tag_ids: []
|
|
7
|
+
|
|
8
|
+
filter :brand
|
|
9
|
+
# filter :categories
|
|
10
|
+
filter :name
|
|
11
|
+
filter :code
|
|
12
|
+
filter :product
|
|
13
|
+
|
|
14
|
+
form do |f|
|
|
15
|
+
f.inputs do
|
|
16
|
+
f.input :name
|
|
17
|
+
f.input :price, as: :string, hint: I18n.t("activerecord.attributes.rshop/product.price_hint")
|
|
18
|
+
f.input :code
|
|
19
|
+
f.input :slug
|
|
20
|
+
f.input :is_promotion
|
|
21
|
+
f.input :is_published
|
|
22
|
+
f.input :in_stock
|
|
23
|
+
|
|
24
|
+
f.inputs I18n.t("activerecord.attributes.rshop/product.categories") do
|
|
25
|
+
# f.input :category, collection: Category.for_products.map{|u| [u.to_s_admin_selection, u.id]}, :prompt => false
|
|
26
|
+
f.input :brand
|
|
27
|
+
f.input :mark
|
|
28
|
+
f.input :model
|
|
29
|
+
f.input :category
|
|
30
|
+
f.input :subcategory
|
|
31
|
+
# f.input :categories, as: :select, multiple: true, collection: Category.for_products.map{|u| [u.to_s_admin_selection, u.id]}
|
|
32
|
+
# f.input :tags, as: :select, multiple: true
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
f.inputs I18n.t("activerecord.attributes.rshop/product.description") do
|
|
36
|
+
f.cktext_area :description, :ckeditor => {:language => 'ru'}
|
|
37
|
+
end
|
|
38
|
+
f.input :description_short, input_html: {rows: 3}
|
|
39
|
+
|
|
40
|
+
f.inputs I18n.t("activerecord.attributes.rshop/product.album"), :for => [:album, f.object.album ], label: false do |af|
|
|
41
|
+
af.has_many :images, allow_destroy: true, label: false, new_record: true do |imgf|
|
|
42
|
+
imgf.input :image, as: :file, label: false, :hint => imgf.object.image.default? ? '' : imgf.template.image_tag(imgf.object.image.url(:list))
|
|
43
|
+
imgf.input :image_cache, as: :hidden
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
f.actions
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
index do
|
|
51
|
+
selectable_column
|
|
52
|
+
column :name, sortable: :name do |o|
|
|
53
|
+
"#{o.name}"
|
|
54
|
+
end
|
|
55
|
+
# column :ctb
|
|
56
|
+
column :code
|
|
57
|
+
column :price
|
|
58
|
+
column :is_promotion
|
|
59
|
+
column :is_published
|
|
60
|
+
column :created_at
|
|
61
|
+
column :updated_at
|
|
62
|
+
|
|
63
|
+
actions
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
end
|