spree_core 4.2.7 → 4.3.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (249) hide show
  1. checksums.yaml +4 -4
  2. data/app/finders/concerns/spree/product_filterable.rb +9 -0
  3. data/app/finders/spree/cms_pages/find.rb +41 -0
  4. data/app/finders/spree/menus/find.rb +11 -0
  5. data/app/finders/spree/option_values/find_available.rb +20 -0
  6. data/app/finders/spree/orders/find_complete.rb +14 -2
  7. data/app/finders/spree/orders/find_current.rb +1 -13
  8. data/app/finders/spree/product_properties/find_available.rb +20 -0
  9. data/app/finders/spree/products/find.rb +55 -20
  10. data/app/finders/spree/stores/find_current.rb +24 -0
  11. data/app/helpers/spree/base_helper.rb +62 -2
  12. data/app/helpers/spree/locale_helper.rb +5 -1
  13. data/app/helpers/spree/products_helper.rb +7 -3
  14. data/app/models/concerns/spree/display_link.rb +42 -0
  15. data/app/models/concerns/spree/filter_param.rb +21 -0
  16. data/app/models/concerns/spree/memoized_data.rb +24 -0
  17. data/app/models/concerns/spree/multi_store_resource.rb +24 -0
  18. data/app/models/concerns/spree/product_scopes.rb +59 -8
  19. data/app/models/concerns/spree/single_store_resource.rb +9 -0
  20. data/app/models/concerns/spree/user_address.rb +19 -0
  21. data/app/models/concerns/spree/user_methods.rb +5 -4
  22. data/app/models/concerns/spree/user_payment_source.rb +1 -1
  23. data/app/models/spree/ability.rb +3 -1
  24. data/app/models/spree/address.rb +27 -6
  25. data/app/models/spree/app_configuration.rb +8 -0
  26. data/app/models/spree/app_dependencies.rb +18 -6
  27. data/app/models/spree/base.rb +18 -0
  28. data/app/models/spree/classification.rb +3 -0
  29. data/app/models/spree/cms/pages/feature_page.rb +7 -0
  30. data/app/models/spree/cms/pages/homepage.rb +20 -0
  31. data/app/models/spree/cms/pages/standard_page.rb +4 -0
  32. data/app/models/spree/cms/sections/featured_article.rb +29 -0
  33. data/app/models/spree/cms/sections/hero_image.rb +47 -0
  34. data/app/models/spree/cms/sections/image_gallery.rb +103 -0
  35. data/app/models/spree/cms/sections/product_carousel.rb +14 -0
  36. data/app/models/spree/cms/sections/rich_text_content.rb +13 -0
  37. data/app/models/spree/cms/sections/side_by_side_images.rb +74 -0
  38. data/app/models/spree/cms_page.rb +66 -0
  39. data/app/models/spree/cms_section.rb +57 -0
  40. data/app/models/spree/country.rb +14 -6
  41. data/app/models/spree/credit_card.rb +2 -8
  42. data/app/models/spree/customer_return.rb +8 -2
  43. data/app/models/spree/icon.rb +9 -0
  44. data/app/models/spree/image/configuration/active_storage.rb +2 -0
  45. data/app/models/spree/inventory_unit.rb +1 -1
  46. data/app/models/spree/line_item.rb +1 -1
  47. data/app/models/spree/menu.rb +63 -0
  48. data/app/models/spree/menu_item.rb +76 -0
  49. data/app/models/spree/option_type.rb +1 -1
  50. data/app/models/spree/option_value.rb +11 -0
  51. data/app/models/spree/option_value_variant.rb +1 -1
  52. data/app/models/spree/order/address_book.rb +3 -5
  53. data/app/models/spree/order/currency_updater.rb +1 -1
  54. data/app/models/spree/order/emails.rb +32 -0
  55. data/app/models/spree/order/payments.rb +1 -1
  56. data/app/models/spree/order/store_credit.rb +1 -9
  57. data/app/models/spree/order.rb +46 -45
  58. data/app/models/spree/payment.rb +7 -0
  59. data/app/models/spree/payment_method.rb +4 -0
  60. data/app/models/spree/preferences/preferable.rb +12 -0
  61. data/app/models/spree/preferences/preferable_class_methods.rb +10 -1
  62. data/app/models/spree/product.rb +27 -22
  63. data/app/models/spree/product_property.rb +19 -4
  64. data/app/models/spree/promotion/rules/country.rb +1 -1
  65. data/app/models/spree/promotion/rules/first_order.rb +4 -3
  66. data/app/models/spree/promotion/rules/taxon.rb +10 -7
  67. data/app/models/spree/promotion.rb +6 -15
  68. data/app/models/spree/promotion_handler/cart.rb +7 -2
  69. data/app/models/spree/promotion_handler/coupon.rb +5 -4
  70. data/app/models/spree/promotion_handler/free_shipping.rb +5 -6
  71. data/app/models/spree/promotion_handler/page.rb +3 -2
  72. data/app/models/spree/promotion_handler/promotion_duplicator.rb +1 -0
  73. data/app/models/spree/promotion_rule.rb +2 -0
  74. data/app/models/spree/property.rb +27 -0
  75. data/app/models/spree/reimbursement.rb +3 -1
  76. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +2 -1
  77. data/app/models/spree/shipment_handler.rb +4 -2
  78. data/app/models/spree/stock/quantifier.rb +6 -6
  79. data/app/models/spree/store.rb +90 -7
  80. data/app/models/spree/store_credit.rb +7 -3
  81. data/app/models/spree/store_credit_event.rb +2 -2
  82. data/app/models/spree/store_payment_method.rb +11 -0
  83. data/app/models/spree/store_product.rb +11 -0
  84. data/app/models/spree/store_promotion.rb +11 -0
  85. data/app/models/spree/taxon.rb +21 -1
  86. data/app/models/spree/taxon_image/configuration/active_storage.rb +2 -0
  87. data/app/models/spree/taxonomy.rb +3 -1
  88. data/app/models/spree/variant.rb +13 -4
  89. data/app/presenters/spree/filters/options_presenter.rb +27 -0
  90. data/app/presenters/spree/filters/price_presenter.rb +22 -0
  91. data/app/presenters/spree/filters/price_range_presenter.rb +29 -0
  92. data/app/presenters/spree/filters/properties_presenter.rb +23 -0
  93. data/app/presenters/spree/filters/property_presenter.rb +22 -0
  94. data/app/presenters/spree/filters/quantified_price_range_presenter.rb +44 -0
  95. data/app/services/spree/account/addresses/create.rb +1 -0
  96. data/app/services/spree/account/addresses/helper.rb +6 -0
  97. data/app/services/spree/account/addresses/update.rb +9 -3
  98. data/app/services/spree/account/create.rb +17 -0
  99. data/app/services/spree/account/update.rb +15 -0
  100. data/app/services/spree/build_localized_redirect_url.rb +1 -1
  101. data/app/services/spree/cart/create.rb +5 -3
  102. data/app/services/spree/cart/destroy.rb +40 -0
  103. data/app/services/spree/cart/empty.rb +36 -0
  104. data/app/services/spree/cart/estimate_shipping_rates.rb +3 -3
  105. data/app/services/spree/checkout/add_store_credit.rb +1 -1
  106. data/app/services/spree/classifications/reposition.rb +18 -0
  107. data/app/services/spree/credit_cards/destroy.rb +41 -0
  108. data/app/validators/db_maximum_length_validator.rb +5 -0
  109. data/app/validators/email_validator.rb +3 -1
  110. data/app/views/spree/shared/_purchased_items_table.text.erb +25 -0
  111. data/config/initializers/active_storage.rb +2 -0
  112. data/config/locales/en.yml +166 -2
  113. data/config/routes.rb +0 -5
  114. data/db/migrate/20201023152810_add_filterable_to_spree_properties.rb +8 -0
  115. data/db/migrate/20210407200948_create_spree_menus.rb +16 -0
  116. data/db/migrate/20210408092939_create_spree_menu_items.rb +31 -0
  117. data/db/migrate/20210504163720_add_filter_param_to_spree_product_properties.rb +8 -0
  118. data/db/migrate/20210505114659_add_filter_param_to_spree_properties.rb +8 -0
  119. data/db/migrate/20210512191732_create_spree_cms_pages.rb +24 -0
  120. data/db/migrate/20210514204251_create_spree_cms_sections.rb +22 -0
  121. data/db/migrate/20210527094055_create_spree_products_stores.rb +29 -0
  122. data/db/migrate/20210608045519_ensure_store_default_country_is_set.rb +5 -0
  123. data/db/migrate/20210702112334_add_missing_timestamp_columns.rb +46 -0
  124. data/db/migrate/20210713131614_add_unique_index_on_property_id_and_product_id_to_product_properties.rb +29 -0
  125. data/db/migrate/20210715091956_add_store_id_to_spree_store_credits.rb +10 -0
  126. data/db/migrate/20210716093151_add_store_id_to_spree_taxonomies.rb +11 -0
  127. data/db/migrate/20210716104141_add_index_on_name_parent_id_and_taxonomy_id_on_spree_taxons.rb +31 -0
  128. data/db/migrate/20210721120857_add_index_on_permalink_parent_id_and_taxonomy_id_on_spree_taxons.rb +31 -0
  129. data/db/migrate/20210721125657_create_spree_promotions_stores.rb +29 -0
  130. data/db/migrate/20210722090705_add_store_id_to_spree_customer_returns.rb +11 -0
  131. data/db/migrate/20210726065456_change_integer_id_columns_into_bigint.rb +305 -0
  132. data/db/migrate/20210730154425_fix_promotion_code_and_path_unique_indexes.rb +9 -0
  133. data/lib/generators/spree/dummy/dummy_generator.rb +11 -6
  134. data/lib/generators/spree/dummy_model/templates/model.rb.tt +1 -1
  135. data/lib/generators/spree/install/install_generator.rb +12 -24
  136. data/lib/spree/core/components.rb +8 -0
  137. data/lib/spree/core/controller_helpers/auth.rb +7 -1
  138. data/lib/spree/core/controller_helpers/common.rb +1 -1
  139. data/lib/spree/core/controller_helpers/order.rb +4 -4
  140. data/lib/spree/core/controller_helpers/search.rb +1 -0
  141. data/lib/spree/core/controller_helpers/store.rb +10 -1
  142. data/lib/spree/core/engine.rb +6 -0
  143. data/lib/spree/core/importer/product.rb +3 -1
  144. data/lib/spree/core/product_duplicator.rb +1 -0
  145. data/lib/spree/core/search/base.rb +17 -22
  146. data/lib/spree/core/version.rb +1 -1
  147. data/lib/spree/core.rb +8 -4
  148. data/lib/spree/i18n.rb +1 -1
  149. data/lib/spree/money.rb +2 -1
  150. data/lib/spree/permitted_attributes.rb +14 -3
  151. data/lib/spree/testing_support/authorization_helpers.rb +6 -3
  152. data/lib/spree/testing_support/capybara_config.rb +3 -1
  153. data/lib/spree/testing_support/common_rake.rb +17 -4
  154. data/lib/spree/testing_support/extension_rake.rb +2 -2
  155. data/lib/spree/testing_support/factories/address_factory.rb +1 -1
  156. data/lib/spree/testing_support/factories/classification_factory.rb +8 -0
  157. data/lib/spree/testing_support/factories/cms_page_factory.rb +20 -0
  158. data/lib/spree/testing_support/factories/cms_section_factory.rb +31 -0
  159. data/lib/spree/testing_support/factories/customer_return_factory.rb +24 -17
  160. data/lib/spree/testing_support/factories/icon_factory.rb +7 -0
  161. data/lib/spree/testing_support/factories/line_item_factory.rb +6 -2
  162. data/lib/spree/testing_support/factories/menu_factory.rb +16 -0
  163. data/lib/spree/testing_support/factories/menu_item_factory.rb +10 -0
  164. data/lib/spree/testing_support/factories/options_factory.rb +5 -0
  165. data/lib/spree/testing_support/factories/order_factory.rb +11 -2
  166. data/lib/spree/testing_support/factories/payment_method_factory.rb +6 -2
  167. data/lib/spree/testing_support/factories/product_factory.rb +11 -1
  168. data/lib/spree/testing_support/factories/product_property_factory.rb +1 -1
  169. data/lib/spree/testing_support/factories/promotion_factory.rb +18 -9
  170. data/lib/spree/testing_support/factories/property_factory.rb +22 -0
  171. data/lib/spree/testing_support/factories/stock_location_factory.rb +5 -4
  172. data/lib/spree/testing_support/factories/store_credit_factory.rb +1 -0
  173. data/lib/spree/testing_support/factories/store_factory.rb +11 -0
  174. data/lib/spree/testing_support/factories/taxon_factory.rb +3 -1
  175. data/lib/spree/testing_support/factories/taxon_image_factory.rb +7 -0
  176. data/lib/spree/testing_support/factories/taxonomy_factory.rb +1 -0
  177. data/lib/spree/testing_support/factories/user_factory.rb +7 -2
  178. data/lib/spree/testing_support/factories/variant_factory.rb +2 -2
  179. data/lib/spree/testing_support/flatpickr_capybara.rb +58 -35
  180. data/lib/spree/testing_support/order_walkthrough.rb +9 -9
  181. data/lib/tasks/core.rake +1 -1
  182. data/spec/fixtures/favicon.ico +0 -0
  183. data/spec/fixtures/files/icon_256x256.gif +0 -0
  184. data/spec/fixtures/files/icon_256x256.png +0 -0
  185. data/spec/fixtures/files/icon_512x512.png +0 -0
  186. data/spec/fixtures/files/img_256x128.png +0 -0
  187. data/spree_core.gemspec +11 -10
  188. metadata +207 -159
  189. data/app/assets/images/logo/spree_50.png +0 -0
  190. data/app/assets/images/noimage/large.png +0 -0
  191. data/app/assets/images/noimage/mini.png +0 -0
  192. data/app/assets/images/noimage/product.png +0 -0
  193. data/app/assets/images/noimage/small.png +0 -0
  194. data/app/assets/javascripts/spree.js +0 -78
  195. data/app/controllers/spree/errors_controller.rb +0 -11
  196. data/app/helpers/spree/mail_helper.rb +0 -29
  197. data/app/mailers/spree/base_mailer.rb +0 -46
  198. data/app/mailers/spree/order_mailer.rb +0 -26
  199. data/app/mailers/spree/reimbursement_mailer.rb +0 -12
  200. data/app/mailers/spree/shipment_mailer.rb +0 -12
  201. data/app/mailers/spree/test_mailer.rb +0 -8
  202. data/app/models/spree/order_contents.rb +0 -31
  203. data/app/models/spree/validations/db_maximum_length_validator.rb +0 -22
  204. data/app/views/layouts/spree/base_mailer.html.erb +0 -46
  205. data/app/views/spree/errors/forbidden.html.erb +0 -0
  206. data/app/views/spree/errors/unauthorized.html.erb +0 -0
  207. data/app/views/spree/order_mailer/cancel_email.html.erb +0 -24
  208. data/app/views/spree/order_mailer/cancel_email.text.erb +0 -38
  209. data/app/views/spree/order_mailer/confirm_email.html.erb +0 -23
  210. data/app/views/spree/order_mailer/confirm_email.text.erb +0 -39
  211. data/app/views/spree/order_mailer/store_owner_notification_email.html.erb +0 -23
  212. data/app/views/spree/order_mailer/store_owner_notification_email.text.erb +0 -38
  213. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +0 -56
  214. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +0 -24
  215. data/app/views/spree/shared/_base_mailer_footer.html.erb +0 -12
  216. data/app/views/spree/shared/_base_mailer_header.html.erb +0 -13
  217. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +0 -456
  218. data/app/views/spree/shared/_error_messages.html.erb +0 -11
  219. data/app/views/spree/shared/_mailer_line_item.html.erb +0 -16
  220. data/app/views/spree/shared/_paths.html.erb +0 -8
  221. data/app/views/spree/shared/_purchased_items_table.html.erb +0 -69
  222. data/app/views/spree/shared/purchased_items_table/_adjustment.html.erb +0 -13
  223. data/app/views/spree/shared/purchased_items_table/_line_item.html.erb +0 -27
  224. data/app/views/spree/shared/purchased_items_table/_subtotal.html.erb +0 -13
  225. data/app/views/spree/shared/purchased_items_table/_total.html.erb +0 -13
  226. data/app/views/spree/shipment_mailer/shipped_email.html.erb +0 -36
  227. data/app/views/spree/shipment_mailer/shipped_email.text.erb +0 -17
  228. data/app/views/spree/test_mailer/test_email.html.erb +0 -40
  229. data/app/views/spree/test_mailer/test_email.text.erb +0 -4
  230. data/config/initializers/assets.rb +0 -2
  231. data/config/initializers/premailer_assets.rb +0 -1
  232. data/config/initializers/premailer_rails.rb +0 -3
  233. data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +0 -10
  234. data/lib/generators/spree/dummy/templates/initializers/bullet.rb +0 -5
  235. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/backend/all.js +0 -15
  236. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -16
  237. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/backend/all.css +0 -16
  238. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -16
  239. data/lib/generators/spree/mailers_preview/mailers_preview_generator.rb +0 -23
  240. data/lib/generators/spree/mailers_preview/templates/mailers/previews/order_preview.rb +0 -13
  241. data/lib/generators/spree/mailers_preview/templates/mailers/previews/reimbursement_preview.rb +0 -5
  242. data/lib/generators/spree/mailers_preview/templates/mailers/previews/shipment_preview.rb +0 -5
  243. data/lib/generators/spree/mailers_preview/templates/mailers/previews/user_preview.rb +0 -11
  244. data/lib/tasks/email.rake +0 -10
  245. data/vendor/assets/javascripts/cleave.js +0 -1669
  246. data/vendor/assets/javascripts/fetch.umd.js +0 -531
  247. data/vendor/assets/javascripts/jquery.payment.js +0 -652
  248. data/vendor/assets/javascripts/jsuri.js +0 -458
  249. data/vendor/assets/javascripts/polyfill.min.js +0 -1
@@ -1,652 +0,0 @@
1
- // Generated by CoffeeScript 1.7.1
2
- (function() {
3
- var $, cardFromNumber, cardFromType, cards, defaultFormat, formatBackCardNumber, formatBackExpiry, formatCardNumber, formatExpiry, formatForwardExpiry, formatForwardSlashAndSpace, hasTextSelected, luhnCheck, reFormatCVC, reFormatCardNumber, reFormatExpiry, reFormatNumeric, replaceFullWidthChars, restrictCVC, restrictCardNumber, restrictExpiry, restrictNumeric, safeVal, setCardType,
4
- __slice = [].slice,
5
- __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
6
-
7
- $ = window.jQuery || window.Zepto || window.$;
8
-
9
- $.payment = {};
10
-
11
- $.payment.fn = {};
12
-
13
- $.fn.payment = function() {
14
- var args, method;
15
- method = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
16
- return $.payment.fn[method].apply(this, args);
17
- };
18
-
19
- defaultFormat = /(\d{1,4})/g;
20
-
21
- $.payment.cards = cards = [
22
- {
23
- type: 'maestro',
24
- patterns: [5018, 502, 503, 506, 56, 58, 639, 6220, 67],
25
- format: defaultFormat,
26
- length: [12, 13, 14, 15, 16, 17, 18, 19],
27
- cvcLength: [3],
28
- luhn: true
29
- }, {
30
- type: 'forbrugsforeningen',
31
- patterns: [600],
32
- format: defaultFormat,
33
- length: [16],
34
- cvcLength: [3],
35
- luhn: true
36
- }, {
37
- type: 'dankort',
38
- patterns: [5019],
39
- format: defaultFormat,
40
- length: [16],
41
- cvcLength: [3],
42
- luhn: true
43
- }, {
44
- type: 'visa',
45
- patterns: [4],
46
- format: defaultFormat,
47
- length: [13, 16],
48
- cvcLength: [3],
49
- luhn: true
50
- }, {
51
- type: 'mastercard',
52
- patterns: [51, 52, 53, 54, 55, 22, 23, 24, 25, 26, 27],
53
- format: defaultFormat,
54
- length: [16],
55
- cvcLength: [3],
56
- luhn: true
57
- }, {
58
- type: 'amex',
59
- patterns: [34, 37],
60
- format: /(\d{1,4})(\d{1,6})?(\d{1,5})?/,
61
- length: [15],
62
- cvcLength: [3, 4],
63
- luhn: true
64
- }, {
65
- type: 'dinersclub',
66
- patterns: [30, 36, 38, 39],
67
- format: /(\d{1,4})(\d{1,6})?(\d{1,4})?/,
68
- length: [14],
69
- cvcLength: [3],
70
- luhn: true
71
- }, {
72
- type: 'discover',
73
- patterns: [60, 64, 65, 622],
74
- format: defaultFormat,
75
- length: [16],
76
- cvcLength: [3],
77
- luhn: true
78
- }, {
79
- type: 'unionpay',
80
- patterns: [62, 88],
81
- format: defaultFormat,
82
- length: [16, 17, 18, 19],
83
- cvcLength: [3],
84
- luhn: false
85
- }, {
86
- type: 'jcb',
87
- patterns: [35],
88
- format: defaultFormat,
89
- length: [16],
90
- cvcLength: [3],
91
- luhn: true
92
- }
93
- ];
94
-
95
- cardFromNumber = function(num) {
96
- var card, p, pattern, _i, _j, _len, _len1, _ref;
97
- num = (num + '').replace(/\D/g, '');
98
- for (_i = 0, _len = cards.length; _i < _len; _i++) {
99
- card = cards[_i];
100
- _ref = card.patterns;
101
- for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
102
- pattern = _ref[_j];
103
- p = pattern + '';
104
- if (num.substr(0, p.length) === p) {
105
- return card;
106
- }
107
- }
108
- }
109
- };
110
-
111
- cardFromType = function(type) {
112
- var card, _i, _len;
113
- for (_i = 0, _len = cards.length; _i < _len; _i++) {
114
- card = cards[_i];
115
- if (card.type === type) {
116
- return card;
117
- }
118
- }
119
- };
120
-
121
- luhnCheck = function(num) {
122
- var digit, digits, odd, sum, _i, _len;
123
- odd = true;
124
- sum = 0;
125
- digits = (num + '').split('').reverse();
126
- for (_i = 0, _len = digits.length; _i < _len; _i++) {
127
- digit = digits[_i];
128
- digit = parseInt(digit, 10);
129
- if ((odd = !odd)) {
130
- digit *= 2;
131
- }
132
- if (digit > 9) {
133
- digit -= 9;
134
- }
135
- sum += digit;
136
- }
137
- return sum % 10 === 0;
138
- };
139
-
140
- hasTextSelected = function($target) {
141
- var _ref;
142
- if (($target.prop('selectionStart') != null) && $target.prop('selectionStart') !== $target.prop('selectionEnd')) {
143
- return true;
144
- }
145
- if ((typeof document !== "undefined" && document !== null ? (_ref = document.selection) != null ? _ref.createRange : void 0 : void 0) != null) {
146
- if (document.selection.createRange().text) {
147
- return true;
148
- }
149
- }
150
- return false;
151
- };
152
-
153
- safeVal = function(value, $target) {
154
- var currPair, cursor, digit, error, last, prevPair;
155
- try {
156
- cursor = $target.prop('selectionStart');
157
- } catch (_error) {
158
- error = _error;
159
- cursor = null;
160
- }
161
- last = $target.val();
162
- $target.val(value);
163
- if (cursor !== null && $target.is(":focus")) {
164
- if (cursor === last.length) {
165
- cursor = value.length;
166
- }
167
- if (last !== value) {
168
- prevPair = last.slice(cursor - 1, +cursor + 1 || 9e9);
169
- currPair = value.slice(cursor - 1, +cursor + 1 || 9e9);
170
- digit = value[cursor];
171
- if (/\d/.test(digit) && prevPair === ("" + digit + " ") && currPair === (" " + digit)) {
172
- cursor = cursor + 1;
173
- }
174
- }
175
- $target.prop('selectionStart', cursor);
176
- return $target.prop('selectionEnd', cursor);
177
- }
178
- };
179
-
180
- replaceFullWidthChars = function(str) {
181
- var chars, chr, fullWidth, halfWidth, idx, value, _i, _len;
182
- if (str == null) {
183
- str = '';
184
- }
185
- fullWidth = '\uff10\uff11\uff12\uff13\uff14\uff15\uff16\uff17\uff18\uff19';
186
- halfWidth = '0123456789';
187
- value = '';
188
- chars = str.split('');
189
- for (_i = 0, _len = chars.length; _i < _len; _i++) {
190
- chr = chars[_i];
191
- idx = fullWidth.indexOf(chr);
192
- if (idx > -1) {
193
- chr = halfWidth[idx];
194
- }
195
- value += chr;
196
- }
197
- return value;
198
- };
199
-
200
- reFormatNumeric = function(e) {
201
- var $target;
202
- $target = $(e.currentTarget);
203
- return setTimeout(function() {
204
- var value;
205
- value = $target.val();
206
- value = replaceFullWidthChars(value);
207
- value = value.replace(/\D/g, '');
208
- return safeVal(value, $target);
209
- });
210
- };
211
-
212
- reFormatCardNumber = function(e) {
213
- var $target;
214
- $target = $(e.currentTarget);
215
- return setTimeout(function() {
216
- var value;
217
- value = $target.val();
218
- value = replaceFullWidthChars(value);
219
- value = $.payment.formatCardNumber(value);
220
- return safeVal(value, $target);
221
- });
222
- };
223
-
224
- formatCardNumber = function(e) {
225
- var $target, card, digit, length, re, upperLength, value;
226
- digit = String.fromCharCode(e.which);
227
- if (!/^\d+$/.test(digit)) {
228
- return;
229
- }
230
- $target = $(e.currentTarget);
231
- value = $target.val();
232
- card = cardFromNumber(value + digit);
233
- length = (value.replace(/\D/g, '') + digit).length;
234
- upperLength = 16;
235
- if (card) {
236
- upperLength = card.length[card.length.length - 1];
237
- }
238
- if (length >= upperLength) {
239
- return;
240
- }
241
- if (($target.prop('selectionStart') != null) && $target.prop('selectionStart') !== value.length) {
242
- return;
243
- }
244
- if (card && card.type === 'amex') {
245
- re = /^(\d{4}|\d{4}\s\d{6})$/;
246
- } else {
247
- re = /(?:^|\s)(\d{4})$/;
248
- }
249
- if (re.test(value)) {
250
- e.preventDefault();
251
- return setTimeout(function() {
252
- return $target.val(value + ' ' + digit);
253
- });
254
- } else if (re.test(value + digit)) {
255
- e.preventDefault();
256
- return setTimeout(function() {
257
- return $target.val(value + digit + ' ');
258
- });
259
- }
260
- };
261
-
262
- formatBackCardNumber = function(e) {
263
- var $target, value;
264
- $target = $(e.currentTarget);
265
- value = $target.val();
266
- if (e.which !== 8) {
267
- return;
268
- }
269
- if (($target.prop('selectionStart') != null) && $target.prop('selectionStart') !== value.length) {
270
- return;
271
- }
272
- if (/\d\s$/.test(value)) {
273
- e.preventDefault();
274
- return setTimeout(function() {
275
- return $target.val(value.replace(/\d\s$/, ''));
276
- });
277
- } else if (/\s\d?$/.test(value)) {
278
- e.preventDefault();
279
- return setTimeout(function() {
280
- return $target.val(value.replace(/\d$/, ''));
281
- });
282
- }
283
- };
284
-
285
- reFormatExpiry = function(e) {
286
- var $target;
287
- $target = $(e.currentTarget);
288
- return setTimeout(function() {
289
- var value;
290
- value = $target.val();
291
- value = replaceFullWidthChars(value);
292
- value = $.payment.formatExpiry(value);
293
- return safeVal(value, $target);
294
- });
295
- };
296
-
297
- formatExpiry = function(e) {
298
- var $target, digit, val;
299
- digit = String.fromCharCode(e.which);
300
- if (!/^\d+$/.test(digit)) {
301
- return;
302
- }
303
- $target = $(e.currentTarget);
304
- val = $target.val() + digit;
305
- if (/^\d$/.test(val) && (val !== '0' && val !== '1')) {
306
- e.preventDefault();
307
- return setTimeout(function() {
308
- return $target.val("0" + val + " / ");
309
- });
310
- } else if (/^\d\d$/.test(val)) {
311
- e.preventDefault();
312
- return setTimeout(function() {
313
- var m1, m2;
314
- m1 = parseInt(val[0], 10);
315
- m2 = parseInt(val[1], 10);
316
- if (m2 > 2 && m1 !== 0) {
317
- return $target.val("0" + m1 + " / " + m2);
318
- } else {
319
- return $target.val("" + val + " / ");
320
- }
321
- });
322
- }
323
- };
324
-
325
- formatForwardExpiry = function(e) {
326
- var $target, digit, val;
327
- digit = String.fromCharCode(e.which);
328
- if (!/^\d+$/.test(digit)) {
329
- return;
330
- }
331
- $target = $(e.currentTarget);
332
- val = $target.val();
333
- if (/^\d\d$/.test(val)) {
334
- return $target.val("" + val + " / ");
335
- }
336
- };
337
-
338
- formatForwardSlashAndSpace = function(e) {
339
- var $target, val, which;
340
- which = String.fromCharCode(e.which);
341
- if (!(which === '/' || which === ' ')) {
342
- return;
343
- }
344
- $target = $(e.currentTarget);
345
- val = $target.val();
346
- if (/^\d$/.test(val) && val !== '0') {
347
- return $target.val("0" + val + " / ");
348
- }
349
- };
350
-
351
- formatBackExpiry = function(e) {
352
- var $target, value;
353
- $target = $(e.currentTarget);
354
- value = $target.val();
355
- if (e.which !== 8) {
356
- return;
357
- }
358
- if (($target.prop('selectionStart') != null) && $target.prop('selectionStart') !== value.length) {
359
- return;
360
- }
361
- if (/\d\s\/\s$/.test(value)) {
362
- e.preventDefault();
363
- return setTimeout(function() {
364
- return $target.val(value.replace(/\d\s\/\s$/, ''));
365
- });
366
- }
367
- };
368
-
369
- reFormatCVC = function(e) {
370
- var $target;
371
- $target = $(e.currentTarget);
372
- return setTimeout(function() {
373
- var value;
374
- value = $target.val();
375
- value = replaceFullWidthChars(value);
376
- value = value.replace(/\D/g, '').slice(0, 4);
377
- return safeVal(value, $target);
378
- });
379
- };
380
-
381
- restrictNumeric = function(e) {
382
- var input;
383
- if (e.metaKey || e.ctrlKey) {
384
- return true;
385
- }
386
- if (e.which === 32) {
387
- return false;
388
- }
389
- if (e.which === 0) {
390
- return true;
391
- }
392
- if (e.which < 33) {
393
- return true;
394
- }
395
- input = String.fromCharCode(e.which);
396
- return !!/[\d\s]/.test(input);
397
- };
398
-
399
- restrictCardNumber = function(e) {
400
- var $target, card, digit, value;
401
- $target = $(e.currentTarget);
402
- digit = String.fromCharCode(e.which);
403
- if (!/^\d+$/.test(digit)) {
404
- return;
405
- }
406
- if (hasTextSelected($target)) {
407
- return;
408
- }
409
- value = ($target.val() + digit).replace(/\D/g, '');
410
- card = cardFromNumber(value);
411
- if (card) {
412
- return value.length <= card.length[card.length.length - 1];
413
- } else {
414
- return value.length <= 16;
415
- }
416
- };
417
-
418
- restrictExpiry = function(e) {
419
- var $target, digit, value;
420
- $target = $(e.currentTarget);
421
- digit = String.fromCharCode(e.which);
422
- if (!/^\d+$/.test(digit)) {
423
- return;
424
- }
425
- if (hasTextSelected($target)) {
426
- return;
427
- }
428
- value = $target.val() + digit;
429
- value = value.replace(/\D/g, '');
430
- if (value.length > 6) {
431
- return false;
432
- }
433
- };
434
-
435
- restrictCVC = function(e) {
436
- var $target, digit, val;
437
- $target = $(e.currentTarget);
438
- digit = String.fromCharCode(e.which);
439
- if (!/^\d+$/.test(digit)) {
440
- return;
441
- }
442
- if (hasTextSelected($target)) {
443
- return;
444
- }
445
- val = $target.val() + digit;
446
- return val.length <= 4;
447
- };
448
-
449
- setCardType = function(e) {
450
- var $target, allTypes, card, cardType, val;
451
- $target = $(e.currentTarget);
452
- val = $target.val();
453
- cardType = $.payment.cardType(val) || 'unknown';
454
- if (!$target.hasClass(cardType)) {
455
- allTypes = (function() {
456
- var _i, _len, _results;
457
- _results = [];
458
- for (_i = 0, _len = cards.length; _i < _len; _i++) {
459
- card = cards[_i];
460
- _results.push(card.type);
461
- }
462
- return _results;
463
- })();
464
- $target.removeClass('unknown');
465
- $target.removeClass(allTypes.join(' '));
466
- $target.addClass(cardType);
467
- $target.toggleClass('identified', cardType !== 'unknown');
468
- return $target.trigger('payment.cardType', cardType);
469
- }
470
- };
471
-
472
- $.payment.fn.formatCardCVC = function() {
473
- this.on('keypress', restrictNumeric);
474
- this.on('keypress', restrictCVC);
475
- this.on('paste', reFormatCVC);
476
- this.on('change', reFormatCVC);
477
- this.on('input', reFormatCVC);
478
- return this;
479
- };
480
-
481
- $.payment.fn.formatCardExpiry = function() {
482
- this.on('keypress', restrictNumeric);
483
- this.on('keypress', restrictExpiry);
484
- this.on('keypress', formatExpiry);
485
- this.on('keypress', formatForwardSlashAndSpace);
486
- this.on('keypress', formatForwardExpiry);
487
- this.on('keydown', formatBackExpiry);
488
- this.on('change', reFormatExpiry);
489
- this.on('input', reFormatExpiry);
490
- return this;
491
- };
492
-
493
- $.payment.fn.formatCardNumber = function() {
494
- this.on('keypress', restrictNumeric);
495
- this.on('keypress', restrictCardNumber);
496
- this.on('keypress', formatCardNumber);
497
- this.on('keydown', formatBackCardNumber);
498
- this.on('keyup', setCardType);
499
- this.on('paste', reFormatCardNumber);
500
- this.on('change', reFormatCardNumber);
501
- this.on('input', reFormatCardNumber);
502
- this.on('input', setCardType);
503
- return this;
504
- };
505
-
506
- $.payment.fn.restrictNumeric = function() {
507
- this.on('keypress', restrictNumeric);
508
- this.on('paste', reFormatNumeric);
509
- this.on('change', reFormatNumeric);
510
- this.on('input', reFormatNumeric);
511
- return this;
512
- };
513
-
514
- $.payment.fn.cardExpiryVal = function() {
515
- return $.payment.cardExpiryVal($(this).val());
516
- };
517
-
518
- $.payment.cardExpiryVal = function(value) {
519
- var month, prefix, year, _ref;
520
- _ref = value.split(/[\s\/]+/, 2), month = _ref[0], year = _ref[1];
521
- if ((year != null ? year.length : void 0) === 2 && /^\d+$/.test(year)) {
522
- prefix = (new Date).getFullYear();
523
- prefix = prefix.toString().slice(0, 2);
524
- year = prefix + year;
525
- }
526
- month = parseInt(month, 10);
527
- year = parseInt(year, 10);
528
- return {
529
- month: month,
530
- year: year
531
- };
532
- };
533
-
534
- $.payment.validateCardNumber = function(num) {
535
- var card, _ref;
536
- num = (num + '').replace(/\s+|-/g, '');
537
- if (!/^\d+$/.test(num)) {
538
- return false;
539
- }
540
- card = cardFromNumber(num);
541
- if (!card) {
542
- return false;
543
- }
544
- return (_ref = num.length, __indexOf.call(card.length, _ref) >= 0) && (card.luhn === false || luhnCheck(num));
545
- };
546
-
547
- $.payment.validateCardExpiry = function(month, year) {
548
- var currentTime, expiry, _ref;
549
- if (typeof month === 'object' && 'month' in month) {
550
- _ref = month, month = _ref.month, year = _ref.year;
551
- }
552
- if (!(month && year)) {
553
- return false;
554
- }
555
- month = $.trim(month);
556
- year = $.trim(year);
557
- if (!/^\d+$/.test(month)) {
558
- return false;
559
- }
560
- if (!/^\d+$/.test(year)) {
561
- return false;
562
- }
563
- if (!((1 <= month && month <= 12))) {
564
- return false;
565
- }
566
- if (year.length === 2) {
567
- if (year < 70) {
568
- year = "20" + year;
569
- } else {
570
- year = "19" + year;
571
- }
572
- }
573
- if (year.length !== 4) {
574
- return false;
575
- }
576
- expiry = new Date(year, month);
577
- currentTime = new Date;
578
- expiry.setMonth(expiry.getMonth() - 1);
579
- expiry.setMonth(expiry.getMonth() + 1, 1);
580
- return expiry > currentTime;
581
- };
582
-
583
- $.payment.validateCardCVC = function(cvc, type) {
584
- var card, _ref;
585
- cvc = $.trim(cvc);
586
- if (!/^\d+$/.test(cvc)) {
587
- return false;
588
- }
589
- card = cardFromType(type);
590
- if (card != null) {
591
- return _ref = cvc.length, __indexOf.call(card.cvcLength, _ref) >= 0;
592
- } else {
593
- return cvc.length >= 3 && cvc.length <= 4;
594
- }
595
- };
596
-
597
- $.payment.cardType = function(num) {
598
- var _ref;
599
- if (!num) {
600
- return null;
601
- }
602
- return ((_ref = cardFromNumber(num)) != null ? _ref.type : void 0) || null;
603
- };
604
-
605
- $.payment.formatCardNumber = function(num) {
606
- var card, groups, upperLength, _ref;
607
- num = num.replace(/\D/g, '');
608
- card = cardFromNumber(num);
609
- if (!card) {
610
- return num;
611
- }
612
- upperLength = card.length[card.length.length - 1];
613
- num = num.slice(0, upperLength);
614
- if (card.format.global) {
615
- return (_ref = num.match(card.format)) != null ? _ref.join(' ') : void 0;
616
- } else {
617
- groups = card.format.exec(num);
618
- if (groups == null) {
619
- return;
620
- }
621
- groups.shift();
622
- groups = $.grep(groups, function(n) {
623
- return n;
624
- });
625
- return groups.join(' ');
626
- }
627
- };
628
-
629
- $.payment.formatExpiry = function(expiry) {
630
- var mon, parts, sep, year;
631
- parts = expiry.match(/^\D*(\d{1,2})(\D+)?(\d{1,4})?/);
632
- if (!parts) {
633
- return '';
634
- }
635
- mon = parts[1] || '';
636
- sep = parts[2] || '';
637
- year = parts[3] || '';
638
- if (year.length > 0) {
639
- sep = ' / ';
640
- } else if (sep === ' /') {
641
- mon = mon.substring(0, 1);
642
- sep = '';
643
- } else if (mon.length === 2 || sep.length > 0) {
644
- sep = ' / ';
645
- } else if (mon.length === 1 && (mon !== '0' && mon !== '1')) {
646
- mon = "0" + mon;
647
- sep = ' / ';
648
- }
649
- return mon + sep + year;
650
- };
651
-
652
- }).call(this);