shoppy 0.9.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.
Files changed (352) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +34 -0
  5. data/app/.DS_Store +0 -0
  6. data/app/api/apihelpers/api_auth.rb +50 -0
  7. data/app/api/base.rb +7 -0
  8. data/app/api/v1/auth.rb +57 -0
  9. data/app/api/v1/test.rb +15 -0
  10. data/app/api/v1/users.rb +50 -0
  11. data/app/api/v1/v1_api.rb +15 -0
  12. data/app/api/vo/user_vo.rb +7 -0
  13. data/app/assets/fonts/.DS_Store +0 -0
  14. data/app/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  15. data/app/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  16. data/app/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  17. data/app/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  18. data/app/assets/images/.DS_Store +0 -0
  19. data/app/assets/images/Sorting icons.psd +0 -0
  20. data/app/assets/images/back_disabled.png +0 -0
  21. data/app/assets/images/back_enabled.png +0 -0
  22. data/app/assets/images/back_enabled_hover.png +0 -0
  23. data/app/assets/images/favicon.ico +0 -0
  24. data/app/assets/images/forward_disabled.png +0 -0
  25. data/app/assets/images/forward_enabled.png +0 -0
  26. data/app/assets/images/forward_enabled_hover.png +0 -0
  27. data/app/assets/images/shoppy.svg +34 -0
  28. data/app/assets/images/sort_asc.png +0 -0
  29. data/app/assets/images/sort_asc_disabled.png +0 -0
  30. data/app/assets/images/sort_both.png +0 -0
  31. data/app/assets/images/sort_desc.png +0 -0
  32. data/app/assets/images/sort_desc_disabled.png +0 -0
  33. data/app/assets/images/spritemap.png +0 -0
  34. data/app/assets/images/spritemap@2x.png +0 -0
  35. data/app/assets/javascripts/.DS_Store +0 -0
  36. data/app/assets/javascripts/bootstrap.js +2114 -0
  37. data/app/assets/javascripts/bootstrap.min.js +6 -0
  38. data/app/assets/javascripts/jasny-bootstrap.min.js +6 -0
  39. data/app/assets/javascripts/jquery.dataTables.min.js +155 -0
  40. data/app/assets/javascripts/main.js +29 -0
  41. data/app/assets/javascripts/shoppy.js +31 -0
  42. data/app/assets/stylesheets/.DS_Store +0 -0
  43. data/app/assets/stylesheets/bootstrap.css +6203 -0
  44. data/app/assets/stylesheets/jasny-bootstrap.css +621 -0
  45. data/app/assets/stylesheets/jquery.dataTables.min.css +1 -0
  46. data/app/assets/stylesheets/jquery.dataTables_themeroller.css +330 -0
  47. data/app/assets/stylesheets/shoppy.css +23 -0
  48. data/app/assets/stylesheets/style.sass +79 -0
  49. data/app/controllers/.DS_Store +0 -0
  50. data/app/controllers/shoppy/accounts_controller.rb +102 -0
  51. data/app/controllers/shoppy/application_controller.rb +23 -0
  52. data/app/controllers/shoppy/brands_controller.rb +60 -0
  53. data/app/controllers/shoppy/cart_controller.rb +46 -0
  54. data/app/controllers/shoppy/categories_controller.rb +72 -0
  55. data/app/controllers/shoppy/concerns/.keep +0 -0
  56. data/app/controllers/shoppy/customer_addresses_controller.rb +90 -0
  57. data/app/controllers/shoppy/home_controller.rb +9 -0
  58. data/app/controllers/shoppy/inventories_controller.rb +62 -0
  59. data/app/controllers/shoppy/locations_controller.rb +80 -0
  60. data/app/controllers/shoppy/logs_controller.rb +9 -0
  61. data/app/controllers/shoppy/manufacturers_controller.rb +77 -0
  62. data/app/controllers/shoppy/options_controller.rb +63 -0
  63. data/app/controllers/shoppy/orders_controller.rb +130 -0
  64. data/app/controllers/shoppy/products_controller.rb +98 -0
  65. data/app/controllers/shoppy/reviews_controller.rb +70 -0
  66. data/app/controllers/shoppy/sessions_controller.rb +5 -0
  67. data/app/controllers/shoppy/settings_controller.rb +26 -0
  68. data/app/controllers/shoppy/shipments_controller.rb +125 -0
  69. data/app/controllers/shoppy/variants_controller.rb +104 -0
  70. data/app/helpers/shoppy/accounts_helper.rb +5 -0
  71. data/app/helpers/shoppy/application_helper.rb +19 -0
  72. data/app/helpers/shoppy/brands_helper.rb +4 -0
  73. data/app/helpers/shoppy/cart_helper.rb +66 -0
  74. data/app/helpers/shoppy/categories_helper.rb +4 -0
  75. data/app/helpers/shoppy/customer_addresses_helper.rb +4 -0
  76. data/app/helpers/shoppy/home_helper.rb +5 -0
  77. data/app/helpers/shoppy/inventories_helper.rb +53 -0
  78. data/app/helpers/shoppy/locations_helper.rb +4 -0
  79. data/app/helpers/shoppy/logs_helper.rb +4 -0
  80. data/app/helpers/shoppy/manufacturers_helper.rb +4 -0
  81. data/app/helpers/shoppy/options_helper.rb +43 -0
  82. data/app/helpers/shoppy/orders_helper.rb +61 -0
  83. data/app/helpers/shoppy/products_helper.rb +65 -0
  84. data/app/helpers/shoppy/reviews_helper.rb +4 -0
  85. data/app/helpers/shoppy/settings_helper.rb +5 -0
  86. data/app/helpers/shoppy/shipments_helper.rb +43 -0
  87. data/app/helpers/shoppy/variants_helper.rb +4 -0
  88. data/app/models/shoppy/.DS_Store +0 -0
  89. data/app/models/shoppy/admin.rb +5 -0
  90. data/app/models/shoppy/brand.rb +23 -0
  91. data/app/models/shoppy/cart_item.rb +13 -0
  92. data/app/models/shoppy/category.rb +50 -0
  93. data/app/models/shoppy/concerns/.DS_Store +0 -0
  94. data/app/models/shoppy/concerns/models/api_token_authenticatable.rb +36 -0
  95. data/app/models/shoppy/concerns/models/hashable.rb +60 -0
  96. data/app/models/shoppy/concerns/models/optionable.rb +60 -0
  97. data/app/models/shoppy/concerns/models/promotional.rb +36 -0
  98. data/app/models/shoppy/concerns/models/taggable.rb +44 -0
  99. data/app/models/shoppy/customer.rb +10 -0
  100. data/app/models/shoppy/customer_address.rb +44 -0
  101. data/app/models/shoppy/inventory.rb +18 -0
  102. data/app/models/shoppy/log.rb +8 -0
  103. data/app/models/shoppy/manufacturer.rb +35 -0
  104. data/app/models/shoppy/options_group.rb +57 -0
  105. data/app/models/shoppy/options_item.rb +18 -0
  106. data/app/models/shoppy/order.rb +15 -0
  107. data/app/models/shoppy/order_line.rb +16 -0
  108. data/app/models/shoppy/payment_method.rb +19 -0
  109. data/app/models/shoppy/product.rb +43 -0
  110. data/app/models/shoppy/review.rb +12 -0
  111. data/app/models/shoppy/setting.rb +11 -0
  112. data/app/models/shoppy/shipment.rb +11 -0
  113. data/app/models/shoppy/stock_location.rb +47 -0
  114. data/app/models/shoppy/user.rb +37 -0
  115. data/app/models/shoppy/variant.rb +48 -0
  116. data/app/views/.DS_Store +0 -0
  117. data/app/views/accounts/admins.html.erb +104 -0
  118. data/app/views/accounts/customers.html.erb +106 -0
  119. data/app/views/accounts/show.html.erb +50 -0
  120. data/app/views/brands/index.html.erb +85 -0
  121. data/app/views/brands/show.html.erb +31 -0
  122. data/app/views/cart/index.html.erb +52 -0
  123. data/app/views/categories/index.html.erb +84 -0
  124. data/app/views/categories/show.html.erb +29 -0
  125. data/app/views/customer_addresses/index.html.erb +112 -0
  126. data/app/views/customer_addresses/show.html.erb +50 -0
  127. data/app/views/devise/confirmations/new.html.erb +12 -0
  128. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  129. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  130. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  131. data/app/views/devise/passwords/edit.html.erb +16 -0
  132. data/app/views/devise/passwords/new.html.erb +12 -0
  133. data/app/views/devise/registrations/edit.html.erb +29 -0
  134. data/app/views/devise/registrations/new.html.erb +23 -0
  135. data/app/views/devise/sessions/new.html.erb +33 -0
  136. data/app/views/devise/shared/_links.erb +25 -0
  137. data/app/views/devise/unlocks/new.html.erb +12 -0
  138. data/app/views/home/index.html.erb +4 -0
  139. data/app/views/inventories/.DS_Store +0 -0
  140. data/app/views/inventories/index.html.erb +119 -0
  141. data/app/views/layouts/.DS_Store +0 -0
  142. data/app/views/layouts/shoppy.html.erb +27 -0
  143. data/app/views/locations/index.html.erb +120 -0
  144. data/app/views/locations/show.html.erb +58 -0
  145. data/app/views/logs/index.html.erb +49 -0
  146. data/app/views/manufacturers/index.html.erb +119 -0
  147. data/app/views/manufacturers/show.html.erb +62 -0
  148. data/app/views/options/index.html.erb +90 -0
  149. data/app/views/options/show.html.erb +32 -0
  150. data/app/views/orders/index.html.erb +174 -0
  151. data/app/views/orders/show.html.erb +74 -0
  152. data/app/views/products/index.html.erb +102 -0
  153. data/app/views/products/show.html.erb +112 -0
  154. data/app/views/reviews/index.html.erb +58 -0
  155. data/app/views/reviews/show.html.erb +46 -0
  156. data/app/views/settings/show.html.erb +50 -0
  157. data/app/views/shared/_custom_file_input.html.erb +12 -0
  158. data/app/views/shared/_flashes.html.erb +21 -0
  159. data/app/views/shared/_navigation.html.erb +66 -0
  160. data/app/views/shipments/index.html.erb +97 -0
  161. data/app/views/shipments/show.html.erb +84 -0
  162. data/app/views/variants/index.html.erb +119 -0
  163. data/app/views/variants/show.html.erb +114 -0
  164. data/bin/shoppy +183 -0
  165. data/config/routes.rb +124 -0
  166. data/db/.DS_Store +0 -0
  167. data/db/migrate/001__setup_hstore.rb +9 -0
  168. data/db/migrate/002__create_logs.rb +11 -0
  169. data/db/migrate/003__devise_create_users.rb +49 -0
  170. data/db/migrate/004__add_personal_info_to_user.rb +8 -0
  171. data/db/migrate/005__create_user_addresses.rb +16 -0
  172. data/db/migrate/006__create_categories.rb +11 -0
  173. data/db/migrate/007__create_brands.rb +10 -0
  174. data/db/migrate/008__create_manufacturers.rb +19 -0
  175. data/db/migrate/009__create_options_groups.rb +10 -0
  176. data/db/migrate/010__create_options_items.rb +10 -0
  177. data/db/migrate/011__create_products.rb +14 -0
  178. data/db/migrate/012__create_product_options_joint_table.rb +9 -0
  179. data/db/migrate/013__create_stock_locations.rb +18 -0
  180. data/db/migrate/014__create_variants.rb +12 -0
  181. data/db/migrate/015__add_promotional_to_variant.rb +8 -0
  182. data/db/migrate/016__create_inventories.rb +12 -0
  183. data/db/migrate/017__create_payment_methods.rb +9 -0
  184. data/db/migrate/018__create_cart_items.rb +12 -0
  185. data/db/migrate/019__create_orders.rb +11 -0
  186. data/db/migrate/020__create_order_lines.rb +14 -0
  187. data/db/migrate/021__add_type_to_user.rb +5 -0
  188. data/db/migrate/022__rename_user_address_to_customer_address.rb +5 -0
  189. data/db/migrate/023__create_shipments.rb +12 -0
  190. data/db/migrate/024__add_shipment_id_to_order_line.rb +5 -0
  191. data/db/migrate/025__change_user_gender_to_not_nullable.rb +5 -0
  192. data/db/migrate/026__add_category_id_to_product.rb +5 -0
  193. data/db/migrate/027__add_attachment_brand_image_to_brands.rb +11 -0
  194. data/db/migrate/028__add_delivery_date_to_shipment.rb +5 -0
  195. data/db/migrate/029__add_customer_info_to_order.rb +13 -0
  196. data/db/migrate/030__add_status_to_order.rb +5 -0
  197. data/db/migrate/031__add_default_address_to_user.rb +5 -0
  198. data/db/migrate/032__add_options_to_variant.rb +5 -0
  199. data/db/migrate/033__add_display_to_options_groups.rb +5 -0
  200. data/db/migrate/034__add_points_to_variant.rb +5 -0
  201. data/db/migrate/035__add_points_to_user.rb +5 -0
  202. data/db/migrate/036__define_ids.rb +25 -0
  203. data/db/migrate/037__create_seed_users.rb +13 -0
  204. data/db/migrate/038__add_name_to_customer_address.rb +5 -0
  205. data/db/migrate/039__create_reviews.rb +14 -0
  206. data/db/migrate/040__alter_table_customer_address.rb +5 -0
  207. data/db/migrate/041__create_settings.rb +23 -0
  208. data/lib/.DS_Store +0 -0
  209. data/lib/shoppy.rb +13 -0
  210. data/lib/shoppy/client.rb +53 -0
  211. data/lib/shoppy/engine.rb +4 -0
  212. data/lib/shoppy/version.rb +3 -0
  213. data/lib/tasks/shoppy_tasks.rake +4 -0
  214. data/lib/template/.gitignore +20 -0
  215. data/lib/template/Gemfile +46 -0
  216. data/lib/template/Gemfile.lock +218 -0
  217. data/lib/template/Rakefile +6 -0
  218. data/lib/template/app/assets/images/.keep +0 -0
  219. data/lib/template/app/assets/javascripts/application.js +13 -0
  220. data/lib/template/app/assets/stylesheets/application.css +15 -0
  221. data/lib/template/app/controllers/accounts_controller.rb +3 -0
  222. data/lib/template/app/controllers/application_controller.rb +3 -0
  223. data/lib/template/app/controllers/brands_controller.rb +3 -0
  224. data/lib/template/app/controllers/cart_controller.rb +3 -0
  225. data/lib/template/app/controllers/categories_controller.rb +3 -0
  226. data/lib/template/app/controllers/concerns/.keep +0 -0
  227. data/lib/template/app/controllers/customer_addresses_controller.rb +3 -0
  228. data/lib/template/app/controllers/home_controller.rb +3 -0
  229. data/lib/template/app/controllers/inventories_controller.rb +3 -0
  230. data/lib/template/app/controllers/locations_controller.rb +3 -0
  231. data/lib/template/app/controllers/logs_controller.rb +3 -0
  232. data/lib/template/app/controllers/manufacturers_controller.rb +3 -0
  233. data/lib/template/app/controllers/options_controller.rb +3 -0
  234. data/lib/template/app/controllers/orders_controller.rb +3 -0
  235. data/lib/template/app/controllers/products_controller.rb +3 -0
  236. data/lib/template/app/controllers/reviews_controller.rb +3 -0
  237. data/lib/template/app/controllers/sessions_controller.rb +3 -0
  238. data/lib/template/app/controllers/settings_controller.rb +3 -0
  239. data/lib/template/app/controllers/shipments_controller.rb +3 -0
  240. data/lib/template/app/controllers/variants_controller.rb +3 -0
  241. data/lib/template/app/helpers/.keep +0 -0
  242. data/lib/template/app/helpers/orders_helper.rb +4 -0
  243. data/lib/template/app/mailers/.keep +0 -0
  244. data/lib/template/app/models/.keep +0 -0
  245. data/lib/template/app/models/account.rb +4 -0
  246. data/lib/template/app/models/admin.rb +4 -0
  247. data/lib/template/app/models/brand.rb +3 -0
  248. data/lib/template/app/models/cart_item.rb +3 -0
  249. data/lib/template/app/models/category.rb +3 -0
  250. data/lib/template/app/models/concerns/.keep +0 -0
  251. data/lib/template/app/models/concerns/hashable.rb +4 -0
  252. data/lib/template/app/models/customer.rb +4 -0
  253. data/lib/template/app/models/customer_address.rb +3 -0
  254. data/lib/template/app/models/inventory.rb +3 -0
  255. data/lib/template/app/models/log.rb +3 -0
  256. data/lib/template/app/models/manufacturer.rb +3 -0
  257. data/lib/template/app/models/option_item.rb +3 -0
  258. data/lib/template/app/models/options_group.rb +3 -0
  259. data/lib/template/app/models/order.rb +3 -0
  260. data/lib/template/app/models/order_line.rb +3 -0
  261. data/lib/template/app/models/payment_method.rb +3 -0
  262. data/lib/template/app/models/product.rb +3 -0
  263. data/lib/template/app/models/review.rb +3 -0
  264. data/lib/template/app/models/setting.rb +3 -0
  265. data/lib/template/app/models/shipment.rb +3 -0
  266. data/lib/template/app/models/stock_location.rb +3 -0
  267. data/lib/template/app/models/variant.rb +3 -0
  268. data/lib/template/app/views/layouts/.keep +0 -0
  269. data/lib/template/bin/bundle +3 -0
  270. data/lib/template/bin/rails +8 -0
  271. data/lib/template/bin/rake +8 -0
  272. data/lib/template/bin/spring +18 -0
  273. data/lib/template/config.ru +4 -0
  274. data/lib/template/config/application.rb +23 -0
  275. data/lib/template/config/boot.rb +4 -0
  276. data/lib/template/config/database.yml +86 -0
  277. data/lib/template/config/environment.rb +5 -0
  278. data/lib/template/config/environments/development.rb +37 -0
  279. data/lib/template/config/environments/production.rb +78 -0
  280. data/lib/template/config/environments/test.rb +39 -0
  281. data/lib/template/config/initializers/assets.rb +8 -0
  282. data/lib/template/config/initializers/backtrace_silencers.rb +7 -0
  283. data/lib/template/config/initializers/cookies_serializer.rb +3 -0
  284. data/lib/template/config/initializers/devise.rb +256 -0
  285. data/lib/template/config/initializers/filter_parameter_logging.rb +4 -0
  286. data/lib/template/config/initializers/inflections.rb +16 -0
  287. data/lib/template/config/initializers/mime_types.rb +4 -0
  288. data/lib/template/config/initializers/session_store.rb +3 -0
  289. data/lib/template/config/initializers/wrap_parameters.rb +14 -0
  290. data/lib/template/config/locales/devise.en.yml +59 -0
  291. data/lib/template/config/locales/en.yml +23 -0
  292. data/lib/template/config/routes.rb +3 -0
  293. data/lib/template/config/secrets.yml +22 -0
  294. data/lib/template/db/migrate/.keep +0 -0
  295. data/lib/template/db/seeds.rb +7 -0
  296. data/lib/template/lib/assets/.keep +0 -0
  297. data/lib/template/lib/tasks/.keep +0 -0
  298. data/lib/template/log/.keep +0 -0
  299. data/lib/template/public/404.html +67 -0
  300. data/lib/template/public/422.html +67 -0
  301. data/lib/template/public/500.html +66 -0
  302. data/lib/template/public/favicon.ico +0 -0
  303. data/lib/template/public/robots.txt +5 -0
  304. data/lib/template/test/controllers/.keep +0 -0
  305. data/lib/template/test/fixtures/.keep +0 -0
  306. data/lib/template/test/helpers/.keep +0 -0
  307. data/lib/template/test/integration/.keep +0 -0
  308. data/lib/template/test/mailers/.keep +0 -0
  309. data/lib/template/test/models/.keep +0 -0
  310. data/lib/template/test/test_helper.rb +10 -0
  311. data/lib/template/vendor/assets/javascripts/.keep +0 -0
  312. data/lib/template/vendor/assets/stylesheets/.keep +0 -0
  313. data/test/dummy/README.rdoc +28 -0
  314. data/test/dummy/Rakefile +6 -0
  315. data/test/dummy/app/assets/javascripts/application.js +13 -0
  316. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  317. data/test/dummy/app/controllers/application_controller.rb +5 -0
  318. data/test/dummy/app/helpers/application_helper.rb +2 -0
  319. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  320. data/test/dummy/bin/bundle +3 -0
  321. data/test/dummy/bin/rails +4 -0
  322. data/test/dummy/bin/rake +4 -0
  323. data/test/dummy/config.ru +4 -0
  324. data/test/dummy/config/application.rb +23 -0
  325. data/test/dummy/config/boot.rb +5 -0
  326. data/test/dummy/config/database.yml +25 -0
  327. data/test/dummy/config/environment.rb +5 -0
  328. data/test/dummy/config/environments/development.rb +37 -0
  329. data/test/dummy/config/environments/production.rb +78 -0
  330. data/test/dummy/config/environments/test.rb +39 -0
  331. data/test/dummy/config/initializers/assets.rb +8 -0
  332. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  333. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  334. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  335. data/test/dummy/config/initializers/inflections.rb +16 -0
  336. data/test/dummy/config/initializers/mime_types.rb +4 -0
  337. data/test/dummy/config/initializers/session_store.rb +3 -0
  338. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  339. data/test/dummy/config/locales/en.yml +23 -0
  340. data/test/dummy/config/routes.rb +56 -0
  341. data/test/dummy/config/secrets.yml +22 -0
  342. data/test/dummy/public/404.html +67 -0
  343. data/test/dummy/public/422.html +67 -0
  344. data/test/dummy/public/500.html +66 -0
  345. data/test/dummy/public/favicon.ico +0 -0
  346. data/test/integration/navigation_test.rb +10 -0
  347. data/test/shoppy/Users/alybadawy/exp/shoppy/lib/template/Gemfile.lock +217 -0
  348. data/test/shoppy/Users/alybadawy/exp/shoppy/lib/template/README.rdoc +28 -0
  349. data/test/shoppy/Users/alybadawy/exp/shoppy/lib/template/config.ru +4 -0
  350. data/test/shoppy_test.rb +7 -0
  351. data/test/test_helper.rb +15 -0
  352. metadata +495 -0
@@ -0,0 +1,37 @@
1
+ module Shoppy
2
+ class User < ActiveRecord::Base
3
+ # Include default devise modules. Others available are:
4
+ # :confirmable, :lockable, :timeoutable and :omniauthable
5
+ devise :database_authenticatable,
6
+ :registerable,
7
+ :recoverable,
8
+ :rememberable,
9
+ :trackable,
10
+ :validatable
11
+
12
+
13
+ ## STI
14
+ self.inheritance_column = :type
15
+
16
+ ## Concerns
17
+ include Shoppy::Concerns::Models::ApiTokenAuthenticatable
18
+
19
+ ## Filters
20
+ before_create :generate_api_token
21
+ before_save :caps
22
+
23
+ ## Validators
24
+ validates :name, presence: true
25
+ validates :name, length: { in: 2..100, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }
26
+ validates :phone, length: { in: 2..25, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: true
27
+ validates :gender, inclusion: {:in => ["Male", "Female", ""], message: "Must be 'Male', 'Female' or ''"}
28
+
29
+
30
+
31
+ private
32
+ def caps
33
+ self.name = self.name.downcase.titleize
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,48 @@
1
+ module Shoppy
2
+ class Variant < ActiveRecord::Base
3
+ ## Relationships
4
+ belongs_to :product
5
+ has_many :inventories, dependent: :destroy
6
+ has_many :stock_locations, :through => :inventories
7
+ has_many :cart_items, dependent: :destroy
8
+ has_many :order_lines, dependent: :nullify
9
+
10
+ ## Concerns
11
+ include Shoppy::Concerns::Models::Hashable
12
+ include Shoppy::Concerns::Models::Optionable
13
+ include Shoppy::Concerns::Models::Promotional
14
+
15
+ ## Filters
16
+ before_create :update_options_groups
17
+ before_save :caps
18
+
19
+ ## Validators
20
+ validates :name, presence: true
21
+ validates :name, length: { in: 2..100, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }
22
+ validates :name, uniqueness: true
23
+
24
+
25
+ def variant_details
26
+ "#{self.name} - #{self.price}"
27
+ end
28
+
29
+ private
30
+ def update_options_groups
31
+ if self.product == nil
32
+ errors.add(:product, "is blank!")
33
+ return false
34
+ else
35
+ if self.options.count == 0
36
+ ogs = self.product.options_groups
37
+ ogs.each do |og|
38
+ self.put_option(og.name, "")
39
+ end
40
+ end
41
+ end
42
+ end
43
+ def caps
44
+ self.name = self.name.downcase.titleize
45
+ end
46
+
47
+ end
48
+ end
Binary file
@@ -0,0 +1,104 @@
1
+ <div class="row">
2
+
3
+ <%= render 'shared/flashes' %>
4
+
5
+ <div class="panel panel-default">
6
+ <div class="panel-heading clearfix">
7
+ <h3 class="panel-title pull-left">Manage Admin Accounts</h3>
8
+ <button type="button" class="btn btn-primary pull-right" data-toggle="modal" data-target="#newAdminModal">
9
+ <span class="glyphicon glyphicon-plus"></span> New Admin
10
+ </button>
11
+ </div>
12
+ <div class="panel-body">
13
+
14
+ <% if @admins.count > 0 %>
15
+ <div class="clearfix">
16
+ <div class="form-group col-xs-2 table-show">
17
+ <label class="form-label">Show Rows:</label>
18
+ </div>
19
+ <div class="form-group col-xs-5 table-search pull-right">
20
+ <label class="form-label">Search Admins </label>
21
+ </div>
22
+ </div>
23
+
24
+ <hr>
25
+ <table class="table filterTable ">
26
+ <thead>
27
+ <tr>
28
+ <th>#</th>
29
+ <th>Name</th>
30
+ <th>Email Address</th>
31
+ <th>Phone Number</th>
32
+ <th class="text-right">Actions</th>
33
+ </tr>
34
+ </thead>
35
+ <tbody>
36
+ <% @admins.each do |a| %>
37
+ <tr>
38
+ <td><%= a.id %></td>
39
+ <td><%= a.name %></td>
40
+ <td><%= a.email %></td>
41
+ <td><%= a.phone %></td>
42
+ <td class="text-right">
43
+ <%= link_to "<span class='glyphicon glyphicon-trash'></span>".html_safe, "/accounts/#{a.id}", method: :delete, data: { confirm: "Are you Sure you want to delete this user?" }, class: "btn btn-sm btn-danger", title: "Delete" %>
44
+ <%= link_to "<span class='glyphicon glyphicon-edit'></span>".html_safe, "/accounts/#{a.id}", class: "btn btn-sm btn-info", title: "Show/Edit" %>
45
+ </td>
46
+ </tr>
47
+ <% end -%>
48
+ </tbody>
49
+ </table>
50
+ <% else %>
51
+ <h4 class="text-center light-color">No Admins Yet</h4>
52
+ <% end -%>
53
+ </div>
54
+ </div>
55
+ </div>
56
+
57
+ <!-- Modal -->
58
+ <div class="modal fade" id="newAdminModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
59
+ <div class="modal-dialog">
60
+ <div class="modal-content">
61
+ <div class="modal-header">
62
+ <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
63
+ <h4 class="modal-title" id="myModalLabel">Add a New Admin</h4>
64
+ </div>
65
+
66
+ <%= form_tag("/accounts/admins", method: "post", role: "form", autocomplete: "off") do %>
67
+ <div class="modal-body">
68
+ <div class="form-group">
69
+ <label class="control-label">Admin Name *</label> <br>
70
+ <%= text_field_tag(:name, nil, class: "form-control") %>
71
+ </div>
72
+ <div class="row">
73
+ <div class="form-group col-xs-6">
74
+ <label class="control-label">Admin Email *</label> <br>
75
+ <%= email_field_tag(:email, nil, class: "form-control") %>
76
+ </div>
77
+ <div class="form-group col-xs-6">
78
+ <label class="control-label">Admin Phone</label> <br>
79
+ <%= text_field_tag(:phone, nil, class: "form-control") %>
80
+ </div>
81
+ </div>
82
+ <div class="row">
83
+ <div class="form-group col-xs-6">
84
+ <label class="control-label">Admin Password *</label> <br>
85
+ <%= password_field_tag(:password, nil, class: "form-control") %>
86
+ </div>
87
+ <div class="form-group col-xs-6">
88
+ <label class="control-label">Password Confirmation *</label> <br>
89
+ <%= password_field_tag(:password_confirmation, nil, class: "form-control") %>
90
+ </div>
91
+ </div>
92
+ <div class="form-group">
93
+ <label class="control-label">Admin Gender</label> <br>
94
+ <%= select_tag :gender, options_for_select(["", "Male", "Female"], ""), { :class => 'form-control' } %>
95
+ </div>
96
+ </div>
97
+ <div class="modal-footer">
98
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
99
+ <%= submit_tag("Add New Admin", class: "btn btn-info") %>
100
+ </div>
101
+ <% end %>
102
+ </div>
103
+ </div>
104
+ </div>
@@ -0,0 +1,106 @@
1
+ <div class="row">
2
+
3
+ <%= render 'shared/flashes' %>
4
+
5
+ <div class="panel panel-default">
6
+ <div class="panel-heading clearfix">
7
+ <h3 class="panel-title pull-left">Manage Customer Accounts</h3>
8
+ <button type="button" class="btn btn-primary pull-right" data-toggle="modal" data-target="#newCustomerModal">
9
+ <span class="glyphicon glyphicon-plus"></span> New Customer
10
+ </button>
11
+ </div>
12
+ <div class="panel-body">
13
+
14
+ <% if @customers.count > 0 %>
15
+ <div class="clearfix">
16
+ <div class="form-group col-xs-2 table-show">
17
+ <label class="form-label">Show Rows:</label>
18
+ </div>
19
+ <div class="form-group col-xs-5 table-search pull-right">
20
+ <label class="form-label">Search Customers </label>
21
+ </div>
22
+ </div>
23
+ <hr>
24
+ <table class="table filterTable ">
25
+ <thead>
26
+ <tr>
27
+ <th>#</th>
28
+ <th>Name</th>
29
+ <th>Email Address</th>
30
+ <th>Phone Number</th>
31
+ <th class="text-right">Actions</th>
32
+ </tr>
33
+ </thead>
34
+ <tbody>
35
+ <% @customers.each do |c| %>
36
+ <tr>
37
+ <td><%= c.id %></td>
38
+ <td><%= c.name %></td>
39
+ <td><%= c.email %></td>
40
+ <td><%= c.phone %></td>
41
+ <td class="text-right">
42
+ <%= link_to "<span class='glyphicon glyphicon-trash'></span>".html_safe, "/accounts/#{c.id}", method: :delete, data: { confirm: "Are you Sure you want to delete this user?" }, class: "btn btn-sm btn-danger", title: "Delete" %>
43
+ <%= link_to "<span class='glyphicon glyphicon-edit'></span>".html_safe, "/accounts/#{c.id}", class: "btn btn-sm btn-info", title: "Show/Edit" %>
44
+ <%= link_to "<span class='glyphicon glyphicon-map-marker'></span>".html_safe, "/accounts/#{c.id}/addresses", class: "btn btn-sm btn-success", title: "Addresses" %>
45
+ <%= link_to "<span class='glyphicon glyphicon-usd'></span>".html_safe, "/accounts/#{c.id}/orders", class: "btn btn-sm btn-success", title: "Orders" %>
46
+ <%= link_to "<span class='glyphicon glyphicon-shopping-cart'></span>".html_safe, "/accounts/#{c.id}/cart", class: "btn btn-sm btn-success", title: "Cart" %>
47
+ </td>
48
+ </tr>
49
+ <% end -%>
50
+ </tbody>
51
+ </table>
52
+ <% else %>
53
+ <h4 class="text-center light-color">No Customers Yet</h4>
54
+ <% end -%>
55
+ </div>
56
+ </div>
57
+ </div>
58
+
59
+ <!-- Modal -->
60
+ <div class="modal fade" id="newCustomerModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
61
+ <div class="modal-dialog">
62
+ <div class="modal-content">
63
+ <div class="modal-header">
64
+ <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
65
+ <h4 class="modal-title" id="myModalLabel">Add a New Customer</h4>
66
+ </div>
67
+
68
+ <%= form_tag("/accounts/customers", method: "post", role: "form", autocomplete: "off") do %>
69
+ <div class="modal-body">
70
+ <div class="form-group">
71
+ <label class="control-label">Customer Name *</label> <br>
72
+ <%= text_field_tag(:name, nil, class: "form-control") %>
73
+ </div>
74
+ <div class="row">
75
+ <div class="form-group col-xs-6">
76
+ <label class="control-label">Customer Email *</label> <br>
77
+ <%= email_field_tag(:email, nil, class: "form-control") %>
78
+ </div>
79
+ <div class="form-group col-xs-6">
80
+ <label class="control-label">Customer Phone</label> <br>
81
+ <%= text_field_tag(:phone, nil, class: "form-control") %>
82
+ </div>
83
+ </div>
84
+ <div class="row">
85
+ <div class="form-group col-xs-6">
86
+ <label class="control-label">Customer Password *</label> <br>
87
+ <%= password_field_tag(:password, nil, class: "form-control") %>
88
+ </div>
89
+ <div class="form-group col-xs-6">
90
+ <label class="control-label">Password Confirmation *</label> <br>
91
+ <%= password_field_tag(:password_confirmation, nil, class: "form-control") %>
92
+ </div>
93
+ </div>
94
+ <div class="form-group">
95
+ <label class="control-label">Customer Gender</label> <br>
96
+ <%= select_tag :gender, options_for_select(["", "Male", "Female"], ""), { :class => 'form-control' } %>
97
+ </div>
98
+ </div>
99
+ <div class="modal-footer">
100
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
101
+ <%= submit_tag("Add New Customer", class: "btn btn-info") %>
102
+ </div>
103
+ <% end %>
104
+ </div>
105
+ </div>
106
+ </div>
@@ -0,0 +1,50 @@
1
+ <div class="row">
2
+ <%= render 'shared/flashes' %>
3
+ <div class="panel panel-default">
4
+ <div class="panel-heading">
5
+ <h3 class="panel-title"><%= @user.name %> details</h3>
6
+ </div>
7
+ <%= form_for @user, method: :put, url: {action: "edit"}, class: "form-horizontal" do |f| %>
8
+ <div class="panel-body">
9
+ <div class="form-group">
10
+ <%= f.label :name, "Name *", class: "control-label" %>
11
+ <%= f.text_field :name, class: "form-control" %>
12
+ </div>
13
+ <div class="form-group">
14
+ <%= f.label :email, "Email *", class: "control-label" %>
15
+ <%= f.email_field :email, :required => true, class: "form-control" %>
16
+ </div>
17
+ <div class="form-group">
18
+ <%= f.label :phone, "Phone Number", class: "control-label" %>
19
+ <%= f.telephone_field :phone, class: "form-control" %>
20
+ </div>
21
+ <div class="form-group">
22
+ <%= f.label :phone, "Gender", class: "control-label" %>
23
+ <%= f.select :gender, options_for_select(["", "Male", "Female"], f.object.gender), { :include_blank=> false }, { :class => 'form-control' } %>
24
+ </div>
25
+ <hr>
26
+ <div class="form-group">
27
+ <%= f.label :password, "Password", class: "control-label" %>
28
+ <%= f.text_field :password, class: 'form-control' %>
29
+ </div>
30
+ <div class="form-group">
31
+ <%= f.label :password_confirmation, "Password confirmation", class: "control-label" %>
32
+ <%= f.text_field :password_confirmation, class: 'form-control' %>
33
+ </div>
34
+ <h5>Leave blank to keep current password</h5>
35
+ </div>
36
+ <div class="panel-footer clearfix">
37
+ <div class="pull-right">
38
+ <%= link_to "<span class='glyphicon glyphicon-trash'></span> Delete".html_safe, "/accounts/#{@user.id}?view=show", method: :delete, data: { confirm: "Are you Sure you want to delete this user?" }, class: "btn btn-danger", title: "Delete" %>
39
+ <%= f.submit "Update", class: "btn btn-success" %>
40
+ </div>
41
+ <% if @user.type == "Admin" %>
42
+ <a class="btn btn-default pull-left" href="/accounts/admins" role="button">Back to admins</a>
43
+ <% else %>
44
+ <a class="btn btn-default pull-left" href="/accounts/customers" role="button">Back to Customers</a>
45
+ <% end %>
46
+ </div>
47
+ <% end %>
48
+
49
+ </div>
50
+ </div>
@@ -0,0 +1,85 @@
1
+ <div class="row">
2
+
3
+ <%= render 'shared/flashes' %>
4
+
5
+ <div class="panel panel-default">
6
+ <div class="panel-heading clearfix">
7
+ <h3 class="panel-title pull-left">Manage Brands</h3>
8
+ <button type="button" class="btn btn-primary pull-right" data-toggle="modal" data-target="#newBrandModal">
9
+ <span class="glyphicon glyphicon-plus"></span> New Brand
10
+ </button>
11
+ </div>
12
+
13
+ <div class="panel-body">
14
+ <% if @brands.count > 0 %>
15
+
16
+ <div class="clearfix">
17
+ <div class="form-group col-xs-2 table-show">
18
+ <label class="form-label">Show Rows:</label>
19
+ </div>
20
+ <div class="form-group col-xs-5 table-search pull-right">
21
+ <label class="form-label">Search Brands </label>
22
+ </div>
23
+ </div>
24
+
25
+ <hr>
26
+
27
+ <table class="table filterTable">
28
+ <thead>
29
+ <tr>
30
+ <th>#</th>
31
+ <th>Brand Name</th>
32
+ <th>Brand Logo</th>
33
+ <th class="text-right">Actions</th>
34
+ </tr>
35
+ </thead>
36
+ <tbody>
37
+ <% @brands.each do |b| %>
38
+ <tr>
39
+ <td><%= b.id %></td>
40
+ <td><%= b.name %></td>
41
+ <td><%= image_tag(b.brand_image.url, height: "50") %></td>
42
+ <td class="text-right">
43
+ <%= link_to "<span class='glyphicon glyphicon-trash'></span>".html_safe, "/products/brands/#{b.id}", method: :delete, data: { confirm: "Are you Sure you want to delete this brand?" }, class: "btn btn-sm btn-danger", title: "Delete" %>
44
+ <%= link_to "<span class='glyphicon glyphicon-edit'></span>".html_safe, "/products/brands/#{b.id}", class: "btn btn-sm btn-info", title: "Show/Edit" %>
45
+ </td>
46
+ </tr>
47
+ <% end -%>
48
+ </tbody>
49
+ </table>
50
+ <% else %>
51
+ <h4 class="text-center light-color">No Brands Yet</h4>
52
+ <% end -%>
53
+ </div>
54
+ </div>
55
+ </div>
56
+
57
+ <!-- Modal -->
58
+ <div class="modal fade" id="newBrandModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
59
+ <div class="modal-dialog">
60
+ <div class="modal-content">
61
+ <div class="modal-header">
62
+ <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
63
+ <h4 class="modal-title" id="myModalLabel">Add a New Brand</h4>
64
+ </div>
65
+ <%= form_for @brand, method: :post, url: {action: "new"} do |f| %>
66
+ <div class="modal-body">
67
+ <div class="form-group">
68
+ <label class="control-label">Brand Name *</label> <br>
69
+ <%= f.text_field :name, class: "form-control" %>
70
+ </div>
71
+ <div class="form-group">
72
+ <label class="control-label">Brand Logo *</label> <br>
73
+ <%= render partial: "shared/custom_file_input", locals: {file: f, name: :brand_image} %>
74
+ </div>
75
+ </div>
76
+ <div class="modal-footer">
77
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
78
+ <%= f.submit "Create Brand", class: "btn btn-info" %>
79
+ </div>
80
+ <% end %>
81
+ </div>
82
+ </div>
83
+ </div>
84
+ </div>
85
+
@@ -0,0 +1,31 @@
1
+ <div class="row">
2
+ <%= render 'shared/flashes' %>
3
+ <div class="panel panel-default">
4
+ <div class="panel-heading">
5
+ <h3 class="panel-title"><%= @brand.name %> details</h3>
6
+ </div>
7
+ <%= form_for @brand, method: :put, url: {action: "edit"}, class: "form-horizontal" do |f| %>
8
+ <div class="panel-body">
9
+ <div class="form-group">
10
+ <%= f.label :name, "Name *", class: "control-label" %>
11
+ <%= f.text_field :name, class: "form-control" %>
12
+ </div>
13
+ <div class="form-group">
14
+ <%= f.label :brand_image, "Logo *", class: "control-label" %><br>
15
+ <%= render partial: "shared/custom_file_input", locals: {file: f, name: :brand_image} %>
16
+ <br>
17
+ <%= image_tag(@brand.brand_image.url, height: "100") %>
18
+ </div>
19
+
20
+ </div>
21
+ <div class="panel-footer clearfix">
22
+ <div class="pull-right">
23
+ <%= link_to "<span class='glyphicon glyphicon-trash'></span> Delete".html_safe, "/products/brands/#{@brand.id}?view=show", method: :delete, data: { confirm: "Are you Sure you want to delete this brand?" }, class: "btn btn-danger", title: "Delete" %>
24
+ <%= f.submit "Update", class: "btn btn-success" %>
25
+ </div>
26
+ <a class="btn btn-default pull-left" href="/products/brands" role="button">Back to Brands</a>
27
+ </div>
28
+ <% end %>
29
+
30
+ </div>
31
+ </div>