coalla-cms 0.5.1.9 → 0.6.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (157) hide show
  1. checksums.yaml +15 -0
  2. data/Gemfile +1 -1
  3. data/Rakefile +24 -24
  4. data/app/assets/javascripts/admin/admin.js +236 -33
  5. data/app/assets/stylesheets/admin/admin.scss +1 -2
  6. data/app/assets/stylesheets/admin/vendor/bootstrap.min.css +6242 -4
  7. data/app/assets/stylesheets/admin/vendor/token-input-bootstrap.scss +144 -0
  8. data/app/controllers/admin/autocomplete_controller.rb +3 -1
  9. data/app/controllers/admin/base_controller.rb +35 -0
  10. data/{lib/generators/coalla/cms/templates/controllers/admin/home_controller.rb.erb → app/controllers/admin/home_controller.rb} +0 -0
  11. data/app/controllers/concerns/admin/editable_columns.rb +55 -0
  12. data/app/controllers/concerns/admin/sortable_columns.rb +16 -0
  13. data/app/controllers/{admin/sortable_controller.rb → concerns/admin/sortable_models.rb} +1 -5
  14. data/app/helpers/admin/alerts_helper.rb +31 -0
  15. data/app/helpers/admin/content_helper.rb +29 -0
  16. data/app/helpers/admin/form_helper.rb +50 -0
  17. data/app/helpers/admin/resource_helpers.rb +102 -0
  18. data/app/helpers/admin/search_helper.rb +44 -40
  19. data/app/helpers/admin/table_helper.rb +40 -0
  20. data/app/helpers/common_helper.rb +2 -2
  21. data/app/models/file_upload.rb +1 -1
  22. data/app/models/lookup.rb +1 -1
  23. data/app/models/site_meta_tags.rb +2 -2
  24. data/app/views/admin/common/_menu_section.haml +1 -1
  25. data/app/views/admin/common/_nested_fields_for.html.haml +10 -4
  26. data/app/views/admin/common/_nested_fields_for_element.html.haml +21 -5
  27. data/app/views/admin/common/_table_template.html.haml +26 -7
  28. data/app/views/admin/common/_upload_form.html.haml +2 -1
  29. data/app/views/admin/editable_columns/edit/_boolean.haml +2 -0
  30. data/app/views/admin/editable_columns/edit/_date.haml +2 -0
  31. data/app/views/admin/editable_columns/edit/_datetime.haml +3 -0
  32. data/app/views/admin/editable_columns/edit/_enumerize.haml +2 -0
  33. data/app/views/admin/editable_columns/edit/_string.haml +2 -0
  34. data/app/views/admin/editable_columns/edit/_text.haml +2 -0
  35. data/app/views/admin/editable_columns/edit/_time.haml +3 -0
  36. data/app/views/admin/editable_columns/edit_column.haml +8 -0
  37. data/app/views/admin/editable_columns/result/_boolean.haml +2 -0
  38. data/app/views/admin/editable_columns/result/_date.haml +1 -0
  39. data/app/views/admin/editable_columns/result/_datetime.haml +1 -0
  40. data/app/views/admin/editable_columns/result/_enumerize.haml +1 -0
  41. data/app/views/admin/editable_columns/result/_string.haml +1 -0
  42. data/app/views/admin/editable_columns/result/_text.haml +1 -0
  43. data/app/views/admin/editable_columns/result/_time.haml +1 -0
  44. data/app/views/admin/site_meta_tags/index.html.haml +2 -2
  45. data/app/views/layouts/admin.html.haml +12 -0
  46. data/app/views/structure/_section.haml +2 -9
  47. data/coalla-cms.gemspec +10 -11
  48. data/lib/coalla/builders/actions_column_definition.rb +44 -0
  49. data/lib/coalla/builders/admin_structure.rb +86 -0
  50. data/lib/coalla/builders/column_definition.rb +9 -0
  51. data/lib/coalla/builders/form_builder.rb +291 -0
  52. data/lib/coalla/builders/link_renderer.rb +43 -0
  53. data/lib/coalla/builders/policy.rb +30 -0
  54. data/lib/coalla/builders/table_builder.rb +99 -0
  55. data/lib/coalla/builders/table_formatter.rb +133 -0
  56. data/lib/coalla/builders/text_formatter.rb +22 -0
  57. data/lib/coalla/cms/engine.rb +3 -2
  58. data/lib/coalla/cms/version.rb +2 -2
  59. data/lib/coalla/ext/mapper.rb +7 -0
  60. data/lib/coalla/orm/{relation.rb → multi_field.rb} +7 -8
  61. data/lib/coalla/orm/page_slider.rb +2 -28
  62. data/lib/coalla/orm/sanitized.rb +1 -5
  63. data/lib/coalla/orm/sortable_association.rb +30 -0
  64. data/lib/coalla/uploaders/file_uploader.rb +9 -0
  65. data/lib/coalla/uploaders/image_uploader.rb +62 -0
  66. data/lib/coalla/uploaders/meta_image_uploader.rb +7 -0
  67. data/lib/coalla-cms.rb +10 -0
  68. data/lib/generators/coalla/cms/create_admin_administrators_generator.rb +5 -7
  69. data/lib/generators/coalla/cms/create_admin_generator.rb +9 -7
  70. data/lib/generators/coalla/cms/create_admin_login_view_generator.rb +4 -6
  71. data/lib/generators/coalla/cms/create_markup_generator.rb +2 -2
  72. data/lib/generators/coalla/cms/file_uploads/install_generator.rb +0 -17
  73. data/lib/generators/coalla/cms/file_uploads/mount_generator.rb +4 -7
  74. data/lib/generators/coalla/cms/image/install_generator.rb +0 -3
  75. data/lib/generators/coalla/cms/image/mount_generator.rb +0 -3
  76. data/lib/generators/coalla/cms/image/templates/mount/uploader.rb.erb +1 -1
  77. data/lib/generators/coalla/cms/image/templates/uploader.rb.erb +1 -1
  78. data/lib/generators/coalla/cms/init_generator.rb +42 -49
  79. data/lib/generators/coalla/cms/lookups/install_generator.rb +0 -3
  80. data/lib/generators/coalla/cms/meta_tags/install_generator.rb +0 -2
  81. data/lib/generators/coalla/cms/scaffold_generator.rb +7 -7
  82. data/lib/generators/coalla/cms/setup_admin_generator.rb +9 -9
  83. data/lib/generators/coalla/cms/setup_routes_generator.rb +3 -3
  84. data/lib/generators/coalla/cms/slider/init_generator.rb +1 -3
  85. data/lib/generators/coalla/cms/slider/templates/slider_image.rb.erb +0 -1
  86. data/lib/generators/coalla/cms/slider/templates/slider_image_uploader.rb.erb +1 -1
  87. data/lib/generators/coalla/cms/templates/.gitignore +3 -3
  88. data/lib/generators/coalla/cms/templates/controllers/admin/administrators_controller.rb +2 -40
  89. data/lib/generators/coalla/cms/templates/controllers/admin/scaffold_controller_template.rb.erb +0 -39
  90. data/lib/generators/coalla/cms/templates/initializers/carrierwave.rb +0 -90
  91. data/lib/generators/coalla/cms/templates/locales/activerecord.en.yml +14 -1
  92. data/lib/generators/coalla/cms/templates/views/admin/administrators/_form.html.haml +1 -1
  93. data/lib/generators/coalla/cms/templates/views/admin/administrators/edit.html.haml +1 -1
  94. data/lib/generators/coalla/cms/templates/views/admin/administrators/index.html.haml +5 -5
  95. data/lib/generators/coalla/cms/templates/views/admin/administrators/new.html.haml +1 -1
  96. data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/_form.html.haml.erb +1 -1
  97. data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/edit.html.haml.erb +1 -1
  98. data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/index.html.haml.erb +5 -5
  99. data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/new.html.haml.erb +1 -1
  100. data/lib/generators/coalla/cms/templates/views/administrators/sessions/new.html.haml +1 -1
  101. data/lib/generators/coalla/cms/utils/orm.rb +29 -0
  102. data/lib/generators/coalla/cms/utils/scaffold.rb +11 -0
  103. metadata +60 -145
  104. data/Gemfile.lock +0 -198
  105. data/app/assets/stylesheets/admin/vendor/token-input-facebook.patched.css +0 -126
  106. data/app/assets/stylesheets/admin/vendor/token-input.patched.css +0 -116
  107. data/app/controllers/admin/notifier_controller.rb +0 -7
  108. data/app/helpers/admin_helper.rb +0 -29
  109. data/app/helpers/nested_fields_helper.rb +0 -12
  110. data/app/helpers/static_text_formatter.rb +0 -25
  111. data/app/helpers/twitter_builder_helper.rb +0 -253
  112. data/app/helpers/twitter_form_builder.rb +0 -202
  113. data/app/uploaders/file_uploader.rb +0 -10
  114. data/app/uploaders/generic_image_uploader.rb +0 -74
  115. data/app/uploaders/meta_tags_image_uploader.rb +0 -5
  116. data/app/utils/admin_structure.rb +0 -82
  117. data/app/utils/bootstrap_link_renderer.rb +0 -40
  118. data/app/utils/table_helpers.rb +0 -196
  119. data/lib/generators/coalla/cms/market/install_generator.rb +0 -71
  120. data/lib/generators/coalla/cms/market/templates/controllers/categories_controller.rb +0 -47
  121. data/lib/generators/coalla/cms/market/templates/controllers/products_controller.rb +0 -50
  122. data/lib/generators/coalla/cms/market/templates/controllers/properties_controller.rb +0 -59
  123. data/lib/generators/coalla/cms/market/templates/market.rb +0 -5
  124. data/lib/generators/coalla/cms/market/templates/market.ru.yml +0 -53
  125. data/lib/generators/coalla/cms/market/templates/migrations/create_categories.rb +0 -15
  126. data/lib/generators/coalla/cms/market/templates/migrations/create_product_properties.rb +0 -18
  127. data/lib/generators/coalla/cms/market/templates/migrations/create_products.rb +0 -18
  128. data/lib/generators/coalla/cms/market/templates/migrations/create_properties.rb +0 -11
  129. data/lib/generators/coalla/cms/market/templates/models/category.rb +0 -36
  130. data/lib/generators/coalla/cms/market/templates/models/product.rb +0 -16
  131. data/lib/generators/coalla/cms/market/templates/models/product_property.rb +0 -14
  132. data/lib/generators/coalla/cms/market/templates/models/property.rb +0 -7
  133. data/lib/generators/coalla/cms/market/templates/views/categories/_form.html.haml +0 -10
  134. data/lib/generators/coalla/cms/market/templates/views/categories/edit.html.haml +0 -5
  135. data/lib/generators/coalla/cms/market/templates/views/categories/index.html.haml +0 -17
  136. data/lib/generators/coalla/cms/market/templates/views/categories/new.html.haml +0 -4
  137. data/lib/generators/coalla/cms/market/templates/views/products/_form.html.haml +0 -17
  138. data/lib/generators/coalla/cms/market/templates/views/products/_product_property_fields.html.haml +0 -13
  139. data/lib/generators/coalla/cms/market/templates/views/products/edit.html.haml +0 -5
  140. data/lib/generators/coalla/cms/market/templates/views/products/index.html.haml +0 -17
  141. data/lib/generators/coalla/cms/market/templates/views/products/new.html.haml +0 -4
  142. data/lib/generators/coalla/cms/market/templates/views/properties/_form.html.haml +0 -9
  143. data/lib/generators/coalla/cms/market/templates/views/properties/edit.html.haml +0 -5
  144. data/lib/generators/coalla/cms/market/templates/views/properties/index.html.haml +0 -15
  145. data/lib/generators/coalla/cms/market/templates/views/properties/new.html.haml +0 -4
  146. data/lib/generators/coalla/cms/news/scaffold_generator.rb +0 -50
  147. data/lib/generators/coalla/cms/news/templates/entity.rb.erb +0 -10
  148. data/lib/generators/coalla/cms/news/templates/entity_controller_template.rb.erb +0 -47
  149. data/lib/generators/coalla/cms/news/templates/entity_image_uploader.rb.erb +0 -7
  150. data/lib/generators/coalla/cms/news/templates/migration.rb.erb +0 -15
  151. data/lib/generators/coalla/cms/news/templates/views/_form.haml.erb +0 -16
  152. data/lib/generators/coalla/cms/news/templates/views/edit.haml.erb +0 -5
  153. data/lib/generators/coalla/cms/news/templates/views/index.haml.erb +0 -18
  154. data/lib/generators/coalla/cms/news/templates/views/new.haml.erb +0 -5
  155. data/lib/generators/coalla/cms/orm_helpers.rb +0 -31
  156. data/lib/generators/coalla/cms/scaffold_helper.rb +0 -11
  157. data/lib/generators/coalla/cms/templates/controllers/admin/base_controller.rb.erb +0 -35
@@ -1,196 +0,0 @@
1
- class TableHelpers
2
-
3
- class SimpleFormatter
4
- def format_value(item, format)
5
- case format
6
- when Proc
7
- format.call(item)
8
- else
9
- item
10
- end
11
- end
12
- end
13
-
14
- class BooleanFormatter < SimpleFormatter
15
-
16
- def format_value(item, format)
17
- case format
18
- when Proc
19
- format.call(item)
20
- when String
21
- item ? format : ''
22
- when Hash
23
- case item
24
- when true
25
- format[:true].presence || format[:yes].presence || ''
26
- else
27
- format[:false].presence || format[:no].presence || ''
28
- end
29
- else
30
- item ? '<i class="glyphicon glyphicon-check"></i>'.html_safe : ''
31
- end
32
- end
33
-
34
- def align
35
- :center
36
- end
37
-
38
- end
39
-
40
- class DateFormatter < SimpleFormatter
41
-
42
- DATE = '%d.%m.%Y'
43
-
44
- def initialize(default_format)
45
- @default_format = default_format
46
- end
47
-
48
- def format_value(item, format)
49
- if item
50
- item = item.localtime if item.respond_to?(:localtime)
51
- case format
52
- when String
53
- Russian::strftime(item, format)
54
- when Proc
55
- format.call(item)
56
- when :date
57
- Russian::strftime(item, DATE)
58
- else
59
- Russian::strftime(item, @default_format)
60
- end
61
- else
62
- ''
63
- end
64
- end
65
-
66
- end
67
-
68
- class EnumerizeFormatter < SimpleFormatter
69
-
70
- def format_value(item, format)
71
- case format
72
- when Proc
73
- format.call(item)
74
- else
75
- item.try(:text)
76
- end
77
- end
78
-
79
- end
80
-
81
- class SelfHelper
82
-
83
- def format_value(item, format)
84
- raise "Format should be lambda" unless format.is_a? Proc
85
- format.call(item)
86
- end
87
-
88
- end
89
-
90
- class MethodHelper
91
-
92
- FORMATS = {
93
- boolean: BooleanFormatter.new,
94
- date: DateFormatter.new(DateFormatter::DATE),
95
- datetime: DateFormatter.new('%d.%m.%Y %H:%M'),
96
- enumerize: EnumerizeFormatter.new
97
- }
98
- FORMATS.default = SimpleFormatter.new
99
-
100
- def initialize(method, type)
101
- @method = method
102
- @formatter = FORMATS[type]
103
- end
104
-
105
- def format_value(item, format)
106
- @formatter.format_value(item.send(@method), format)
107
- end
108
-
109
- def align
110
- @align || @formatter.respond_to?(:align) && @formatter.align || :left
111
- end
112
-
113
- def align=(value)
114
- @align = value
115
- end
116
-
117
- def respond_to?(method)
118
- return (@align.present? || @formatter.respond_to?(method)) if method == :align
119
- super
120
- end
121
-
122
- end
123
-
124
- class ReflectionHelper
125
-
126
- def initialize(method, template)
127
- @method = method
128
- @template = template
129
- end
130
-
131
- def format_value(item, format)
132
- target = item.send(@method)
133
- case format
134
- when Proc
135
- format.call(target)
136
- when Hash, nil
137
- if target
138
- options = {label_attr: :id, type: :link, target: :_blank}.merge(format || {})
139
- v = target.send(options[:label_attr])
140
- case options[:type]
141
- when :link
142
- @template.link_to(v, target, target: options[:target])
143
- else
144
- v.to_s
145
- end
146
- else
147
- ''
148
- end
149
- else
150
- target.to_s
151
- end
152
- end
153
-
154
- end
155
-
156
- def initialize(model_class, template)
157
- @model_class = model_class
158
- @columns = model_class.columns.index_by(&:name).with_indifferent_access
159
- @reflections = model_class.reflections.dup.with_indifferent_access
160
- @template = template
161
- @helpers = {}
162
- end
163
-
164
- def self.for(model_class, template)
165
- TableHelpers.new(model_class, template)
166
- end
167
-
168
- def [](method)
169
- helper = @helpers[method]
170
- unless helper
171
- helper = case method
172
- when :self
173
- SelfHelper.new
174
- else
175
- r = @reflections[method]
176
- if r
177
- if r.macro == :belongs_to
178
- ReflectionHelper.new(method, @template)
179
- end
180
- else
181
- if @model_class.respond_to?(:enumerized_attributes) && @model_class.enumerized_attributes[method]
182
- type = :enumerize
183
- else
184
- type = @columns[method] && @columns[method].type || :default
185
- end
186
- h = MethodHelper.new(method, type)
187
- h.align = :right if [:integer, :decimal].include?(type.to_sym)
188
- h
189
- end
190
- end
191
- @helpers[method] = helper
192
- end
193
- helper
194
- end
195
-
196
- end
@@ -1,71 +0,0 @@
1
- #encoding: utf-8
2
- require 'rails'
3
- require 'rails/generators/active_record'
4
-
5
- module Coalla
6
- module Cms
7
- module Market
8
-
9
- class InstallGenerator < ::ActiveRecord::Generators::Base
10
- argument :name, type: :string, default: ''
11
- source_root File.expand_path('../templates', __FILE__)
12
-
13
- def copy_root_module
14
- copy_file 'market.rb', 'app/models/market.rb'
15
- end
16
-
17
- def copy_models
18
- directory 'models', 'app/models/market'
19
- end
20
-
21
- def create_migrations
22
- migration_template "migrations/create_categories.rb", "db/migrate/create_categories.rb"
23
- migration_template "migrations/create_properties.rb", "db/migrate/create_properties.rb"
24
- migration_template "migrations/create_products.rb", "db/migrate/create_products.rb"
25
- migration_template "migrations/create_product_properties.rb", "db/migrate/create_product_properties.rb"
26
- end
27
-
28
- def setup_routes
29
- sentinel = /namespace :admin do\s*$/
30
-
31
- routing_code = <<-INSERT
32
- namespace :market do
33
- resources :categories
34
- resources :properties
35
- resources :products
36
- end
37
- INSERT
38
- in_root do
39
- inject_into_file 'config/routes.rb', "\n #{routing_code}", {after: sentinel, verbose: false}
40
- end
41
- end
42
-
43
- def setup_dashboard
44
- append_to_file 'config/structure.rb', <<-INSERT
45
- separator I18n.t('dashboard.market')
46
- section Market::Category, description: I18n.t('dashboard.category.description'), icon: 'glyphicon glyphicon-folder-open'
47
- section Market::Property, description: I18n.t('dashboard.property.description'), icon: 'glyphicon glyphicon-th-list'
48
- section Market::Product, description: I18n.t('dashboard.product.description'), icon: 'glyphicon glyphicon-shopping-cart'
49
- INSERT
50
- end
51
-
52
- def copy_views
53
- directory 'views', 'app/views/admin/market'
54
- end
55
-
56
- def copy_controllers
57
- directory 'controllers', 'app/controllers/admin/market'
58
- end
59
-
60
- def copy_localization
61
- copy_file 'market.ru.yml', 'config/locales/market.ru.yml'
62
- end
63
-
64
- def install_slider
65
- generate 'coalla:cms:slider:init'
66
- end
67
-
68
- end
69
- end
70
- end
71
- end
@@ -1,47 +0,0 @@
1
- module Admin
2
-
3
- class Market::CategoriesController < BaseController
4
-
5
- handle_return_path
6
-
7
- PER_PAGE = 20
8
-
9
- def index
10
- @categories = ::Market::Category.order('category_id DESC, position').paginate(page: params[:page], per_page: PER_PAGE)
11
- end
12
-
13
- def new
14
- @category = ::Market::Category.new
15
- end
16
-
17
- def create
18
- @category = ::Market::Category.new(params[:market_category].permit!)
19
- if @category.save
20
- redirect_to_back
21
- else
22
- render :new
23
- end
24
- end
25
-
26
- def edit
27
- @category = ::Market::Category.find(params[:id])
28
- end
29
-
30
- def update
31
- @category = ::Market::Category.find(params[:id])
32
- if @category.update_attributes(params[:market_category].permit!)
33
- redirect_to_back
34
- else
35
- render :edit
36
- end
37
- end
38
-
39
- def destroy
40
- @category = ::Market::Category.find(params[:id])
41
- @category.destroy
42
- redirect_to_back
43
- end
44
-
45
- end
46
-
47
- end
@@ -1,50 +0,0 @@
1
- module Admin
2
-
3
- class Market::ProductsController < BaseController
4
-
5
- handle_return_path
6
-
7
- PER_PAGE = 20
8
-
9
- def index
10
- @products = ::Market::Product.order(created_at: :desc).paginate(page: params[:page], per_page: PER_PAGE)
11
- end
12
-
13
- def new
14
- @product = ::Market::Product.new
15
- end
16
-
17
- def create
18
- @product = ::Market::Product.new(params[:market_product].permit!)
19
- if @product.save
20
- redirect_to_back
21
- else
22
- render :new
23
- end
24
- end
25
-
26
- def edit
27
- @product = ::Market::Product.find(params[:id])
28
- end
29
-
30
- def update
31
- @product = ::Market::Product.find(params[:id])
32
- if @product.update_attributes(params[:market_product].permit!)
33
- redirect_to_back
34
- else
35
- render :edit
36
- end
37
- end
38
-
39
- def destroy
40
- @product = ::Market::Product.find(params[:id])
41
- @product.destroy
42
- redirect_to_back
43
- end
44
-
45
- private
46
-
47
-
48
- end
49
-
50
- end
@@ -1,59 +0,0 @@
1
- module Admin
2
-
3
- class Market::PropertiesController < BaseController
4
-
5
- handle_return_path
6
-
7
- PER_PAGE = 20
8
-
9
- def index
10
- if params[:term].present?
11
- # autocomplete
12
- render json: ::Market::Property.where('name ILIKE ?', "#{params[:term]}%").order(:name).map { |property| {id: property.id, label: property.name} }
13
- else
14
- @properties = ::Market::Property.order(:name).paginate(page: params[:page], per_page: PER_PAGE)
15
- end
16
- end
17
-
18
- def new
19
- @property = ::Market::Property.new
20
- end
21
-
22
- def create
23
- property_params
24
- @property = ::Market::Property.new(property_params)
25
- if @property.save
26
- redirect_to_back
27
- else
28
- render :new
29
- end
30
- end
31
-
32
- def edit
33
- @property = ::Market::Property.find(params[:id])
34
- end
35
-
36
- def update
37
- @property = ::Market::Property.find(params[:id])
38
- if @property.update_attributes(property_params)
39
- redirect_to_back
40
- else
41
- render :edit
42
- end
43
- end
44
-
45
- def destroy
46
- @property = ::Market::Property.find(params[:id])
47
- @property.destroy
48
- redirect_to_back
49
- end
50
-
51
- private
52
-
53
- def property_params
54
- params[:market_property].permit(:name)
55
- end
56
-
57
- end
58
-
59
- end
@@ -1,5 +0,0 @@
1
- module Market
2
- def self.table_name_prefix
3
- 'market_'
4
- end
5
- end
@@ -1,53 +0,0 @@
1
- ru:
2
- dashboard:
3
- market: Магазин
4
- category:
5
- description: Управление категориями товаров
6
- property:
7
- description: Раздел управления свойствами товаров
8
- product:
9
- description: Раздел управления товарами
10
-
11
- activerecord:
12
- models:
13
- market/category: Категории
14
- market/property: Свойства
15
- market/product: Товары
16
-
17
- attributes:
18
- market_category:
19
- name: Название
20
- position: Позиция
21
- category: Родительская категория
22
- category_id: Родительская категория
23
- market/category:
24
- name: Название
25
- position: Позиция
26
- category: Родительская категория
27
- category_id: Родительская категория
28
- market_property:
29
- name: Название
30
- market/property:
31
- name: Название
32
- market_product:
33
- name: Название
34
- sku: Артикул
35
- price: Цена
36
- category: Категория
37
- category_id: Категория
38
- description: Описание
39
- market/product:
40
- name: Название
41
- sku: Артикул
42
- price: Цена
43
- category: Категория
44
- category_id: Категория
45
- description: Описание
46
- market/product_property:
47
- property: Свойство
48
- property_name: Свойство
49
- value: Значение
50
- market/product/product_properties:
51
- property: Свойство
52
- property_name: Свойство
53
- value: Значение
@@ -1,15 +0,0 @@
1
- class CreateCategories < ActiveRecord::Migration
2
-
3
- def change
4
- create_table(:market_categories) do |t|
5
- t.text :name, null: false
6
- t.integer :position, default: 0
7
- t.index :position
8
- t.references :category
9
- t.foreign_key :market_categories, column: :category_id
10
- t.index :category_id
11
- t.timestamps
12
- end
13
- end
14
-
15
- end
@@ -1,18 +0,0 @@
1
- class CreateProductProperties < ActiveRecord::Migration
2
-
3
- def change
4
- create_table :market_product_properties do |t|
5
- t.text :value
6
- t.references :product
7
- t.index :product_id
8
- t.foreign_key :market_products, column: :product_id
9
-
10
- t.references :property
11
- t.index :property_id
12
- t.foreign_key :market_properties, column: :property_id
13
-
14
- t.timestamps
15
- end
16
- end
17
-
18
- end
@@ -1,18 +0,0 @@
1
- class CreateProducts < ActiveRecord::Migration
2
-
3
- def change
4
- create_table :market_products do |t|
5
- t.text :name, null: false
6
- t.index :name
7
- t.decimal :price, null: false
8
- t.index :price
9
- t.text :sku, null: false
10
- t.references :category
11
- t.index :category_id
12
- t.foreign_key :market_categories, column: :category_id
13
- t.timestamps
14
- t.text :description
15
- end
16
- end
17
-
18
- end
@@ -1,11 +0,0 @@
1
- class CreateProperties < ActiveRecord::Migration
2
-
3
- def change
4
- create_table :market_properties do |t|
5
- t.text :name
6
- t.index :name
7
- t.timestamps
8
- end
9
- end
10
-
11
- end
@@ -1,36 +0,0 @@
1
- class Market::Category < ActiveRecord::Base
2
-
3
- has_many :subcategories, inverse_of: :category, dependent: :destroy, class_name: '::Market::Category'
4
- belongs_to :category, inverse_of: :subcategories, class_name: '::Market::Category'
5
-
6
- validates :name, presence: true
7
-
8
- scope :ordered, -> { order(:position) }
9
- scope :top_level, -> { ordered.where(category_id: nil) }
10
-
11
- def full_name
12
- categories = [self]
13
- category = self
14
- while category.category
15
- category = category.category
16
- categories << category
17
- end
18
- categories.reverse.map(&:name).join(' -> ')
19
- end
20
-
21
- def self.for_combo(category)
22
- parents = top_level
23
- parents = parents.where.not(id: category.id) if category
24
- result = []
25
- parents.each do |top_level|
26
- result << top_level
27
- result << top_level.ordered_subcategories.order(:position).reject { |sub_category| sub_category == category }
28
- end
29
- result.flatten
30
- end
31
-
32
- def ordered_subcategories
33
- subcategories.ordered
34
- end
35
-
36
- end
@@ -1,16 +0,0 @@
1
- class Market::Product < ActiveRecord::Base
2
-
3
- has_many :product_properties, dependent: :destroy, inverse_of: :product
4
- has_many :properties, through: :product_properties
5
-
6
- slider :images
7
-
8
- belongs_to :category
9
-
10
- accepts_nested_attributes_for :product_properties, allow_destroy: true
11
-
12
- validates :name, presence: true
13
- validates :price, presence: true
14
- validates :sku, presence: true
15
-
16
- end
@@ -1,14 +0,0 @@
1
- class Market::ProductProperty < ActiveRecord::Base
2
-
3
- belongs_to :product, class_name: '::Market::Product', inverse_of: :product_properties
4
- belongs_to :property, class_name: '::Market::Property', inverse_of: :product_properties
5
-
6
- def property_name
7
- property.try(:name)
8
- end
9
-
10
- def property_name=(name)
11
- # no-op
12
- end
13
-
14
- end
@@ -1,7 +0,0 @@
1
- class Market::Property < ActiveRecord::Base
2
-
3
- has_many :product_properties, dependent: :destroy, inverse_of: :property, class_name: '::Market::ProductProperty'
4
- has_many :products, through: :product_properties
5
-
6
- validates :name, presence: true
7
- end
@@ -1,10 +0,0 @@
1
- = twitter_form_for [:admin, @category] do |f|
2
- = field_set do
3
- = f.errors
4
- = flash_messages
5
-
6
- = f.string :name
7
- = f.string :position, div_class: 'col-md-2'
8
- = f.combobox :category_id, Market::Category.for_combo(@category).map{|r| [r.full_name, r.id]}, include_blank: true
9
-
10
- = standard_actions(f)
@@ -1,5 +0,0 @@
1
- %h1= Market::Category.model_name.human
2
- .page-header
3
- %h3 Редактирование
4
-
5
- = render 'form'
@@ -1,17 +0,0 @@
1
- .page-header
2
- %h1= Market::Category.model_name.human
3
-
4
- = actions do
5
- = create_link(new_admin_market_category_path)
6
-
7
- = table_for(Market::Category).content(@categories) do |t|
8
- - t.column :name
9
- - t.column :category, format: ->(category) { category.try(:name) }
10
- - t.column :position
11
- - t.edit
12
- - t.delete
13
-
14
- = admin_paginate @categories
15
-
16
- = actions do
17
- = create_link(new_admin_market_category_path)
@@ -1,4 +0,0 @@
1
- %h1= Market::Category.model_name.human
2
- .page-header
3
- %h3 Добавление
4
- = render 'form'
@@ -1,17 +0,0 @@
1
- = twitter_form_for [:admin, @product] do |f|
2
- = field_set do
3
- = f.errors
4
- = flash_messages
5
-
6
- = f.string :name
7
- = f.string :sku, div_class: 'col-md-2'
8
- = f.string :price, div_class: 'col-md-2'
9
- = f.combobox :category_id, Market::Category.for_combo(nil).map{|r| [r.full_name, r.id]}, include_blank: true
10
- = f.textarea :description, rows: 3
11
- = render_slides(f, 'Слайдер', :images)
12
-
13
- = render 'admin/common/nested_fields_for', f: f, section_name: 'Свойства', collection: :product_properties
14
-
15
- = standard_actions(f)
16
-
17
-