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,12 @@
1
+ <div class="fileinput fileinput-new input-group" data-provides="fileinput">
2
+ <div class="form-control" data-trigger="fileinput">
3
+ <i class="glyphicon glyphicon-file fileinput-exists"></i>
4
+ <span class="fileinput-filename"></span>
5
+ </div>
6
+ <span class="input-group-addon btn btn-default btn-file">
7
+ <span class="fileinput-new">Select file</span>
8
+ <span class="fileinput-exists">Change</span>
9
+ <%= file.file_field name %><br>
10
+ </span>
11
+ <a href="#" class="input-group-addon btn btn-default fileinput-exists" data-dismiss="fileinput">Remove</a>
12
+ </div>
@@ -0,0 +1,21 @@
1
+ <% if flash.notice %>
2
+ <div class="alert alert-success" role="alert">
3
+ <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
4
+ <strong>Success: </strong><%= flash.notice %></div>
5
+ <% end -%>
6
+ <% if flash[:warning] %>
7
+ <div class="alert alert-warning" role="alert">
8
+ <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
9
+ <strong>Warning: </strong><%= flash[:warning] %>
10
+ </div>
11
+ <% end -%>
12
+ <% if flash[:error] %>
13
+ <div class="alert alert-danger" role="alert">
14
+ <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
15
+ <% flash[:error].each do |key, value| %>
16
+ <% value.each do |v| %>
17
+ <strong>Error: </strong><%= key.to_s + " " + v.to_s %> <br>
18
+ <% end -%>
19
+ <% end -%>
20
+ </div>
21
+ <% end -%>
@@ -0,0 +1,66 @@
1
+ <nav class="navbar navbar-default" role="navigation">
2
+ <div class="container-fluid">
3
+
4
+ <div class="navbar-header">
5
+ <a class="navbar-brand" href="#">Shoppy Backstore</a>
6
+ </div>
7
+
8
+ <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
9
+
10
+ <ul class="nav navbar-nav">
11
+ <li class="<%= params[:controller] == 'home' ? 'active' : '' %>"><a href="/">Dashboard</a></li>
12
+ <li class="dropdown <%= params[:controller] == 'accounts' ? 'active' : '' %>">
13
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">Accounts <span class="caret"></span></a>
14
+ <ul class="dropdown-menu" role="menu">
15
+ <li><a href="/accounts/admins">Admins</a></li>
16
+ <li><a href="/accounts/customers">Customers</a></li>
17
+ </ul>
18
+ </li>
19
+
20
+ <li class="dropdown <%= (params[:controller] == 'locations' || params[:controller] == 'inventories') ? 'active' : '' %>">
21
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">Inventory <span class="caret"></span></a>
22
+ <ul class="dropdown-menu" role="menu">
23
+ <li><a href="/locations/">Stock Locations</a></li>
24
+ </ul>
25
+ </li>
26
+
27
+ <li class="dropdown <%= Shoppy::ApplicationHelper.is_product_page(params[:controller]) == true ? 'active' : '' %>">
28
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">Products <span class="caret"></span></a>
29
+ <ul class="dropdown-menu" role="menu">
30
+ <li><a href="/products/items">Product Items</a></li>
31
+ <li class="divider"></li>
32
+ <li><a href="/products/manufacturers">Manufacturers</a></li>
33
+ <li><a href="/products/brands">Brands</a></li>
34
+ <li class="divider"></li>
35
+ <li><a href="/products/categories">Categories</a></li>
36
+ <li><a href="/products/options">Product Options</a></li>
37
+ <li class="divider"></li>
38
+ <li><a href="/reviews">Product Reviews</a></li>
39
+ </ul>
40
+ </li>
41
+
42
+ <li class="dropdown <%= params[:controller] == 'orders' ? 'active' : '' %>">
43
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">Orders <span class="caret"></span></a>
44
+ <ul class="dropdown-menu" role="menu">
45
+ <li><a href="/orders">List orders</a></li>
46
+ <li class="divider"></li>
47
+ <li><a href="/shipments">Shipments</a></li>
48
+ </ul>
49
+ </li>
50
+
51
+ </ul>
52
+ <ul class="nav navbar-nav navbar-right">
53
+ <li class="dropdown">
54
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown"><%= current_admin.name %> <span class="caret"></span></a>
55
+ <ul class="dropdown-menu" role="menu">
56
+ <li><a href="/accounts/<%= current_admin.id %>">Change Password</a></li>
57
+ <li><a href="/logs">Logs</a></li>
58
+ <li class="divider"></li>
59
+ <li><%= link_to "Sign out", destroy_admin_session_path, method: :delete %></li>
60
+ </ul>
61
+ </li>
62
+
63
+ </ul>
64
+ </div>
65
+ </div>
66
+ </nav>
@@ -0,0 +1,97 @@
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 shipments <%= @order ? "for order # #{@order.id}" : "for ALL orders" %></h3>
8
+ <button type="button" class="btn btn-primary pull-right" data-toggle="modal" data-target="#newShipmentModal">
9
+ <span class="glyphicon glyphicon-plus"></span> New Shipment
10
+ </button>
11
+ </div>
12
+ <div class="panel-body">
13
+ <% if @shipments.count > 0 %>
14
+ <div class="clearfix">
15
+ <div class="form-group col-xs-2 table-show">
16
+ <label class="form-label">Show Rows:</label>
17
+ </div>
18
+ <div class="form-group col-xs-5 table-search pull-right">
19
+ <label class="form-label">Search shipments </label>
20
+ </div>
21
+ </div>
22
+ <hr>
23
+ <table class="table filterTable ">
24
+ <thead>
25
+ <tr>
26
+ <th>#</th>
27
+ <th>Date</th>
28
+ <th>Tracking number</th>
29
+ <th>Status</th>
30
+ <th>Order No.</th>
31
+ <th class="text-right">Actions</th>
32
+ </tr>
33
+ </thead>
34
+ <tbody>
35
+ <% @shipments.each do |s| %>
36
+ <tr>
37
+ <td><%= s.id %></td>
38
+ <td><%= s.shipment_date.strftime("%d/%m/%Y") %></td>
39
+ <td><%= s.tracking_number %></td>
40
+ <td><%= s.status %></td>
41
+ <td><%= s.order_id %></td>
42
+ <td class="text-right">
43
+ <%= link_to "<span class='glyphicon glyphicon-trash'></span>".html_safe, @order ? "/shipments/#{s.id}?order_id=#{@order.id}" : "/shipments/#{s.id}", method: :delete, data: { confirm: "Are you Sure you want to delete this shipment?" }, class: "btn btn-sm btn-danger", title: "Delete" %>
44
+ <%= link_to "<span class='glyphicon glyphicon-edit'></span>".html_safe, "/shipments/#{s.id}", class: "btn btn-sm btn-info", title: "Show/Edit" %>
45
+ <%= link_to "<span class='glyphicon glyphicon-ok'></span>".html_safe, @order ? "/shipments/#{s.id}?order_id=#{@order.id}&status=processing" : "/shipments/#{s.id}?status=processing", method: "put", data: { confirm: "Are you Sure you want to mark this shipment as processing?" }, class: "btn btn-sm btn-primary", title: "Process" %>
46
+ <%= link_to "<span class='glyphicon glyphicon-remove'></span>".html_safe, @order ? "/shipments/#{s.id}?order_id=#{@order.id}&status=cancelled" : "/shipments/#{s.id}?status=cancelled", method: "put", data: { confirm: "Are you Sure you want to mark this shipment as cancelled?" }, class: "btn btn-sm btn-primary", title: "Cancel" %>
47
+ <%= link_to "<span class='glyphicon glyphicon-export'></span>".html_safe, @order ? "/shipments/#{s.id}?order_id=#{@order.id}&status=shipped" : "/shipments/#{s.id}?status=shipped", method: "put", data: { confirm: "Are you Sure you want to mark this shipment as shipped?" }, class: "btn btn-sm btn-primary", title: "Ship" %>
48
+ <%= link_to "<span class='glyphicon glyphicon-import'></span>".html_safe, @order ? "/shipments/#{s.id}?order_id=#{@order.id}&status=delivered" : "/shipments/#{s.id}?status=delivered", method: "put", data: { confirm: "Are you Sure you want to mark this shipment as Delivered?" }, class: "btn btn-sm btn-primary", title: "Delivered" %>
49
+ </td>
50
+ </tr>
51
+ <% end -%>
52
+ </tbody>
53
+ </table>
54
+ <% else %>
55
+ <h4 class="text-center light-color">No Shipments Yet</h4>
56
+ <% end -%>
57
+ </div>
58
+ </div>
59
+ </div>
60
+
61
+ <!-- Modal -->
62
+ <div class="modal fade" id="newShipmentModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
63
+ <div class="modal-dialog">
64
+ <div class="modal-content">
65
+
66
+ <div class="modal-header">
67
+ <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
68
+ <h4 class="modal-title" id="myModalLabel">Add a New shipment <%= @order ? "for order no. #{@order.id}" : "" %></h4>
69
+ </div>
70
+
71
+ <%= form_tag("/shipments", method: "post", role: "form", autocomplete: "off") do %>
72
+
73
+ <div class="modal-body">
74
+
75
+ <h4>A form should go here</h4>
76
+ <p>
77
+ The form should first start with selecting a customer, if not selected <br>
78
+ Then select an order (that is not shipped), for that selected customer (AJAX) <br>
79
+ Then select the stock location to ship from. <br>
80
+ Once all these elements are selected, an table should be displayed (AJAX) <br>
81
+ that displays the UNSHIPPED items in the selected order, that are ALSO available <br>
82
+ in the seletced stock location.
83
+ </p>
84
+ <p>
85
+ The form should also include a field to enter the tracking number (string)
86
+ </p>
87
+ </div>
88
+
89
+ <div class="modal-footer">
90
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
91
+ <%= submit_tag("Add New Shipment", class: "btn btn-info") %>
92
+ </div>
93
+ <% end -%>
94
+ </div>
95
+ </div>
96
+ </div>
97
+
@@ -0,0 +1,84 @@
1
+ <div class="row">
2
+ <%= render 'shared/flashes' %>
3
+ <div class="panel panel-default">
4
+ <div class="panel-heading clearfix">
5
+ <div class="pull-right">
6
+ <%= link_to "<span class='glyphicon glyphicon-ok'></span> Process".html_safe, "/shipments/#{@shipment.id}?status=processing&view=show", method: :put, data: { confirm: "Are you Sure you want to mark this shipment as processing?" }, class: "btn btn-sm btn-primary", title: "Process" %>
7
+ <%= link_to "<span class='glyphicon glyphicon-remove'></span> Cancel".html_safe, "/shipments/#{@shipment.id}?status=cancelled&view=show", method: :put, data: { confirm: "Are you Sure you want to mark this shipment as cancelled?" }, class: "btn btn-sm btn-primary", title: "Cancel" %>
8
+ <%= link_to "<span class='glyphicon glyphicon-export'></span> Ship".html_safe, "/shipments/#{@shipment.id}?status=shipped&view=show", method: :put, data: { confirm: "Are you Sure you want to mark this shipment as Shipped?" }, class: "btn btn-sm btn-primary", title: "Ship" %>
9
+ <%= link_to "<span class='glyphicon glyphicon-import'></span> Delivered".html_safe, "/shipments/#{@shipment.id}?status=delivered&view=show", method: :put, data: { confirm: "Are you Sure you want to mark this shipment as Delivered?" }, class: "btn btn-sm btn-primary", title: "Delivered" %>
10
+ </div>
11
+ <h3 class="panel-title">Shipment details</h3>
12
+ </div>
13
+ <div class="panel-body">
14
+ <div>
15
+ <h4>Shipment information:</h4>
16
+ <p>
17
+ <strong>Status: </strong><%= @shipment.status %><br>
18
+ <strong>Tracking number: </strong><%= @shipment.tracking_number %><br>
19
+ <strong>Shipment Date: </strong><%= @shipment.shipment_date ? @shipment.shipment_date.strftime("%d/%m/%Y") : "N/A" %><br>
20
+ <strong>Delivery Date: </strong><%= @shipment.delivery_date ? @shipment.delivery_date.strftime("%d/%m/%Y") : "N/A" %><br>
21
+ </p>
22
+ </div>
23
+ <hr>
24
+ <div class="row">
25
+ <div class="col-xs-6">
26
+ <h4>Customer information:</h4>
27
+ <p>
28
+ <strong>Name: </strong><%= @shipment.order.customer.name %><br>
29
+ <strong>Email: </strong><%= @shipment.order.customer.email %><br>
30
+ <strong>Phone: </strong><%= @shipment.order.customer.phone %><br>
31
+ <strong>Address:</strong><br>
32
+ <%= @shipment.order.customer_add_line1 %><br>
33
+ <%= @shipment.order.customer_add_line2 %><br>
34
+ <%= "#{@shipment.order.customer_city}, #{@shipment.order.customer_state} - #{@shipment.order.customer_zip}" %><br>
35
+ <%= @shipment.order.customer_country %><br>
36
+ </p>
37
+ </div>
38
+ <div class="col-xs-6">
39
+ <h4>Stock Location:</h4>
40
+ <p>
41
+ <strong>Name: </strong><%= @shipment.stock_location.name %><br>
42
+ <strong>Email: </strong><%= @shipment.stock_location.email %><br>
43
+ <strong>Phone: </strong><%= @shipment.stock_location.phone %><br>
44
+ <strong>Address:</strong><br>
45
+ <%= @shipment.stock_location.add_line1 %><br>
46
+ <%= @shipment.stock_location.add_line2 %><br>
47
+ <%= "#{@shipment.stock_location.city}, #{@shipment.stock_location.state} - #{@shipment.stock_location.zip}" %><br>
48
+ <%= @shipment.order.customer_country %><br>
49
+ </p>
50
+ </div>
51
+ </div>
52
+ <hr>
53
+ <div>
54
+ <h4>Items in shipment:</h4>
55
+ <table class="table ">
56
+ <thead>
57
+ <tr>
58
+ <th>#</th>
59
+ <th>Variant</th>
60
+ <th>Quantity</th>
61
+ <th>Shipped</th>
62
+ </tr>
63
+ </thead>
64
+ <tbody>
65
+ <% @shipment.order_lines.each do |ol| %>
66
+ <tr>
67
+ <td><%= ol.id %></td>
68
+ <td><%= ol.variant.name %></td>
69
+ <td><%= ol.quantity %></td>
70
+ <td><%= ol.shipped ? "Yes" : "No" %></td>
71
+ </tr>
72
+ <% end -%>
73
+ </tbody>
74
+ </table>
75
+ </div>
76
+ </div>
77
+ <div class="panel-footer clearfix">
78
+ <div class="pull-right">
79
+ <%= link_to "<span class='glyphicon glyphicon-trash'></span> Delete".html_safe, "/shipments/#{@shipment.id}?view=show", method: :delete, data: { confirm: "Are you Sure you want to delete this shipment?" }, class: "btn btn-danger", title: "Delete" %>
80
+ </div>
81
+ <a class="btn btn-default pull-left" href="/shipments" role="button">Back to shipments</a>
82
+ </div>
83
+ </div>
84
+ </div>
@@ -0,0 +1,119 @@
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 <%= @product.name %>'s Variants</h3>
8
+ <button type="button" class="btn btn-primary pull-right" data-toggle="modal" data-target="#newVariantModal">
9
+ <span class="glyphicon glyphicon-plus"></span> New Variant
10
+ </button>
11
+ </div>
12
+ <div class="panel-body">
13
+ <% if @variants.count > 0 %>
14
+ <div class="clearfix">
15
+ <div class="form-group col-xs-2 table-show">
16
+ <label class="form-label">Show Rows:</label>
17
+ </div>
18
+ <div class="form-group col-xs-5 table-search pull-right">
19
+ <label class="form-label">Search Variants </label>
20
+ </div>
21
+ </div>
22
+ <hr>
23
+ <table class="table filterTable ">
24
+ <thead>
25
+ <tr>
26
+ <th>#</th>
27
+ <th>Name</th>
28
+ <th>Regular Price</th>
29
+ <th>Promotional Price</th>
30
+ <th>Promotion starts on</th>
31
+ <th>Promotion ends on</th>
32
+ <th class="text-right">Actions</th>
33
+ </tr>
34
+ </thead>
35
+ <tbody>
36
+ <% @variants.each do |v| %>
37
+ <tr>
38
+ <td><%= v.id %></td>
39
+ <td><%= v.name %></td>
40
+ <td><%= number_to_currency(v.reg_price, unit: CURRENCY_UNIT) %></td>
41
+ <td><%= v.promo_price ? number_to_currency(v.promo_price, unit: CURRENCY_UNIT) : "N/A" %></td>
42
+ <td><%= v.promo_price_starts_on ? v.promo_price_starts_on.strftime("%d/%m/%Y") : "N/A" %></td>
43
+ <td><%= v.promo_price_ends_on ? v.promo_price_ends_on.strftime("%d/%m/%Y") : "N/A" %></td>
44
+ <td class="text-right">
45
+ <%= link_to "<span class='glyphicon glyphicon-trash'></span>".html_safe, "/products/items/#{@product.id}/variants/#{v.id}", method: :delete, data: { confirm: "Are you Sure you want to delete this variant?" }, class: "btn btn-sm btn-danger", title: "Delete" %>
46
+ <%= link_to "<span class='glyphicon glyphicon-edit'></span>".html_safe, "/products/items/#{@product.id}/variants/#{v.id}", class: "btn btn-sm btn-info", title: "Show/Edit" %>
47
+ </td>
48
+ </tr>
49
+ <% end -%>
50
+ </tbody>
51
+ </table>
52
+ <% else %>
53
+ <h4 class="text-center light-color">No Variants Yet</h4>
54
+ <% end -%>
55
+ </div>
56
+ </div>
57
+ </div>
58
+
59
+ <!-- Modal -->
60
+ <div class="modal fade" id="newVariantModal" 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 variant to <%= @product.name %></h4>
66
+ </div>
67
+
68
+ <%= form_tag("/products/items/#{@product.id}/variants", method: "post", class: "form-horizontal", role: "form", autocomplete: "off") do %>
69
+ <div class="modal-body">
70
+ <div class="form-group form-group-modal">
71
+ <label class="control-label">Variant Name *</label> <br>
72
+ <%= text_field_tag(:name, nil, class: "form-control") %>
73
+ </div>
74
+ <div class="form-group form-group-modal">
75
+ <label class="control-label">Regular Price *</label> <br>
76
+ <%= text_field_tag(:reg_price, nil, class: "form-control") %>
77
+ </div>
78
+ <div class="form-group form-group-modal">
79
+ <label class="control-label">Promotional Price</label> <br>
80
+ <%= text_field_tag(:promo_price, nil, class: "form-control") %>
81
+ </div>
82
+ <div class="form-group form-group-modal">
83
+ <label class="control-label">Promotion starts on</label> <br>
84
+ <%= text_field_tag(:promo_price_starts_on, nil, class: "form-control datePickers", placeholder: "dd/mm/yyyy") %>
85
+ </div>
86
+ <div class="form-group form-group-modal">
87
+ <label class="control-label">Promotion end on</label> <br>
88
+ <%= text_field_tag(:promo_price_ends_on, nil, class: "form-control datePickers", placeholder: "dd/mm/yyyy") %>
89
+ </div>
90
+ <div class="form-group form-group-modal">
91
+ <label class="control-label">Points *</label> <br>
92
+ <%= text_field_tag(:points, 0, class: "form-control") %>
93
+ </div>
94
+ <hr>
95
+ <div class="form-group form-group-modal">
96
+ <h4>Options</h4>
97
+ <% if @product.options_groups.count > 0 %>
98
+ <% @product.options_groups.each do |o| %>
99
+ <label class="control-label" ><%= o.name %></label>
100
+ <%= collection_select :options, o.name, o.options_items, :id, :name, {include_blank: false}, class: "form-control" %>
101
+ <br>
102
+ <% end -%>
103
+ <% else %>
104
+ No options to be selected.
105
+ <% end %>
106
+ </div>
107
+ </div>
108
+ <div class="modal-footer">
109
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
110
+ <%= submit_tag("Add Variant", class: "btn btn-info") %>
111
+ </div>
112
+ <% end %>
113
+ </div>
114
+ </div>
115
+ </div>
116
+
117
+ <script>
118
+
119
+ </script>
@@ -0,0 +1,114 @@
1
+ <div class="row">
2
+ <%= render 'shared/flashes' %>
3
+
4
+ <div class="panel panel-default">
5
+ <div class="panel-heading">
6
+ <h3 class="panel-title"><%= @variant.name %> details</h3>
7
+ </div>
8
+
9
+ <%= form_tag("/products/items/#{@variant.product.id}/variants/#{@variant.id}", method: "put", autocomplete: "off") do %>
10
+ <div class="panel-body">
11
+ <div class="row">
12
+
13
+ <div class="form-group col-xs-6">
14
+ <label class="control-label">Variant Name *</label> <br>
15
+ <%= text_field_tag(:name, @variant.name, class: "form-control") %>
16
+ </div>
17
+
18
+ <div class="form-group col-xs-6">
19
+ <label class="control-label">Points *</label> <br>
20
+ <%= number_field_tag(:points, (@variant.points), class: "form-control") %>
21
+ </div>
22
+
23
+ <div class="form-group col-xs-2">
24
+ <label class="control-label">Regular Price *</label> <br>
25
+ <%= text_field_tag(:reg_price, @variant.reg_price, class: "form-control") %>
26
+ </div>
27
+ <div class="form-group col-xs-4">
28
+ <label class="control-label">Promotion starts on</label> <br>
29
+ <%= text_field_tag(:promo_price_starts_on, (@variant.promo_price_starts_on ? @variant.promo_price_starts_on.strftime("%d/%m/%Y") : ""), class: "form-control datePickers", placeholder: "DD-MM-YYYY") %>
30
+ </div>
31
+ <div class="form-group col-xs-2">
32
+ <label class="control-label">Promotional Price</label> <br>
33
+ <%= text_field_tag(:promo_price, @variant.promo_price, class: "form-control") %>
34
+ </div>
35
+
36
+ <div class="form-group col-xs-4">
37
+ <label class="control-label">Promotion end on</label> <br>
38
+ <%= text_field_tag(:promo_price_ends_on, (@variant.promo_price_ends_on ? @variant.promo_price_ends_on.strftime("%d/%m/%Y") : ""), class: "form-control datePickers", placeholder: "DD-MM-YYYY") %>
39
+ </div>
40
+ </div>
41
+
42
+ <div class="form-group">
43
+ <h4>Options</h4>
44
+ <% if @variant.options.count > 0 %>
45
+ <% @variant.options.each do |ok, ov| %>
46
+ <label class="control-label" ><%= "#{ok} - (#{OptionsGroup.find_by(name: ok).display})" %></label>
47
+ <%= collection_select :options, ok , OptionsGroup.find_by(name: ok).options_items, :id, :name, {include_blank: false, selected: OptionsItem.find_by(name: ov) ? OptionsItem.find_by(name: ov).id : nil}, class: "form-control" %>
48
+ <br>
49
+ <% end -%>
50
+ <% else %>
51
+ No options to be selected.
52
+ <% end %>
53
+ </div>
54
+
55
+ <h4>Other Properties</h4>
56
+
57
+ <div class="row" id="hashForm">
58
+ <% @index = 0 %>
59
+
60
+ <div class="form-group col-xs-4">Property Name</div>
61
+ <div class="form-group col-xs-8">Property Value</div>
62
+
63
+ <% if @variant.hash_data.count > 0 %>
64
+ <% @variant.hash_data.each_with_index do |h, i| %>
65
+ <% @index = i %>
66
+ <div class="form-group col-xs-4">
67
+ <%= text_field_tag("hash[#{@index}][k]", h[0], class: "form-control") %>
68
+ </div>
69
+ <div class="form-group col-xs-8">
70
+ <%= text_field_tag("hash[#{@index}][v]", h[1], class: "form-control") %>
71
+ </div>
72
+ <% end -%>
73
+ <% else %>
74
+ <div class="form-group col-xs-4">
75
+ <%= text_field_tag("hash[#{@index}][k]", nil, class: "form-control") %>
76
+ </div>
77
+ <div class="form-group col-xs-8">
78
+ <%= text_field_tag("hash[#{@index}][v]", nil, class: "form-control") %>
79
+ </div>
80
+ <% end -%>
81
+ </div>
82
+
83
+ <a href="#" id="addRowButton" class="btn btn-primary"><span class="glyphicon glyphicon-plus"></span> Add Row</a>
84
+
85
+ </div>
86
+ <div class="panel-footer clearfix">
87
+ <div class="pull-right">
88
+ <%= link_to "<span class='glyphicon glyphicon-trash'></span> Delete".html_safe, "/products/items/#{@variant.product.id}/variants/#{@variant.id}?view=show", method: :delete, data: { confirm: "Are you Sure you want to delete this variant?" }, class: "btn btn-danger", title: "Delete" %>
89
+ <%= submit_tag("Update", class: "btn btn-success") %>
90
+ </div>
91
+ <a class="btn btn-default pull-left" href="/products/items/<%= @variant.product.id %>/variants" role="button">Back to Variants</a>
92
+ </div>
93
+ <% end %>
94
+ </div>
95
+ </div>
96
+
97
+ <script>
98
+ var hashIndex = <%= @index %> + 1;
99
+
100
+ $('#addRowButton').click(function(event) {
101
+ event.preventDefault();
102
+
103
+ var formItem = '<div class="form-group col-xs-4">';
104
+ formItem += '<input type="text" name="hash[' + hashIndex + '][k]" id="hash_' + hashIndex + '_k" class="form-control">';
105
+ formItem += '</div>'
106
+
107
+ formItem += '<div class="form-group col-xs-8">';
108
+ formItem += '<input type="text" name="hash[' + hashIndex + '][v]" id="hash_' + hashIndex + '_v" class="form-control">';
109
+ formItem += '</div>';
110
+
111
+ $('#hashForm').append(formItem)
112
+ hashIndex += 1;
113
+ });
114
+ </script>