solidus_pagy 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +39 -0
  3. data/.gem_release.yml +5 -0
  4. data/.github/stale.yml +17 -0
  5. data/.github_changelog_generator +2 -0
  6. data/.gitignore +20 -0
  7. data/.rspec +2 -0
  8. data/.rubocop.yml +37 -0
  9. data/CHANGELOG.md +1 -0
  10. data/Gemfile +52 -0
  11. data/LICENSE +26 -0
  12. data/README.md +142 -0
  13. data/Rakefile +6 -0
  14. data/app/assets/javascripts/spree/backend/solidus_pagy.js +1 -0
  15. data/app/assets/javascripts/spree/frontend/solidus_pagy.js +2 -0
  16. data/app/assets/stylesheets/spree/backend/solidus_pagy.css +7 -0
  17. data/app/assets/stylesheets/spree/frontend/solidus_pagy.css +4 -0
  18. data/app/decorators/controllers/solidus_pagy/admin/base_controller_decorator.rb +13 -0
  19. data/app/decorators/controllers/solidus_pagy/admin/orders_controller_decorator.rb +63 -0
  20. data/app/decorators/controllers/solidus_pagy/admin/prices_controller_decorator.rb +51 -0
  21. data/app/decorators/controllers/solidus_pagy/admin/products_controller_decorator.rb +32 -0
  22. data/app/decorators/controllers/solidus_pagy/admin/promotion_codes_controller_decorator.rb +37 -0
  23. data/app/decorators/controllers/solidus_pagy/admin/promotions_controller_decorator.rb +32 -0
  24. data/app/decorators/controllers/solidus_pagy/admin/properties_controller_decorator.rb +32 -0
  25. data/app/decorators/controllers/solidus_pagy/admin/stock_items_controller_decorator.rb +42 -0
  26. data/app/decorators/controllers/solidus_pagy/admin/stock_locations_controller_decorator.rb +25 -0
  27. data/app/decorators/controllers/solidus_pagy/admin/stock_movements_controller_decorator.rb +25 -0
  28. data/app/decorators/controllers/solidus_pagy/admin/tax_rates_controller_decorator.rb +27 -0
  29. data/app/decorators/controllers/solidus_pagy/admin/users_controller_decorator.rb +68 -0
  30. data/app/decorators/controllers/solidus_pagy/admin/variants_controller_decorator.rb +33 -0
  31. data/app/decorators/controllers/solidus_pagy/admin/zones_controller_decorator.rb +28 -0
  32. data/app/overrides/spree/admin/orders/index/insert_pagy_pagination.rb +9 -0
  33. data/app/overrides/spree/admin/prices/_master_variant_table/insert_pagy_pagination.rb +11 -0
  34. data/app/overrides/spree/admin/prices/_table/insert_pagy_pagination.rb +11 -0
  35. data/app/overrides/spree/admin/products/index/insert_pagy_pagination.rb +9 -0
  36. data/app/overrides/spree/admin/promotion_codes/index/insert_pagy_pagination.rb +19 -0
  37. data/app/overrides/spree/admin/promotions/index/insert_pagy_pagination.rb +9 -0
  38. data/app/overrides/spree/admin/properties/index/insert_pagy_pagination.rb +9 -0
  39. data/app/overrides/spree/admin/stock_items/_stock_management/insert_pagy_pagination.rb +11 -0
  40. data/app/overrides/spree/admin/stock_locations/index/insert_pagy_pagination.rb +11 -0
  41. data/app/overrides/spree/admin/stock_movements/index/insert_pagy_pagination.rb +11 -0
  42. data/app/overrides/spree/admin/tax_rates/index/insert_pagy_pagination.rb +9 -0
  43. data/app/overrides/spree/admin/users/index/insert_pagy_pagination.rb +9 -0
  44. data/app/overrides/spree/admin/users/items/insert_pagy_pagination.rb +9 -0
  45. data/app/overrides/spree/admin/users/orders/insert_pagy_pagination.rb +9 -0
  46. data/app/overrides/spree/admin/variants/_table/insert_pagy_pagination.rb +9 -0
  47. data/app/overrides/spree/admin/zones/index/insert_pagy_pagination.rb +9 -0
  48. data/bin/console +17 -0
  49. data/bin/rails +7 -0
  50. data/bin/rails-engine +13 -0
  51. data/bin/rails-sandbox +16 -0
  52. data/bin/rake +7 -0
  53. data/bin/sandbox +86 -0
  54. data/bin/setup +8 -0
  55. data/config/locales/en.yml +5 -0
  56. data/config/routes.rb +5 -0
  57. data/lib/generators/solidus_pagy/install/install_generator.rb +18 -0
  58. data/lib/generators/solidus_pagy/install/templates/initializer.rb +30 -0
  59. data/lib/generators/solidus_pagy/install/templates/pagy.rb +235 -0
  60. data/lib/solidus_pagy/configuration.rb +27 -0
  61. data/lib/solidus_pagy/engine.rb +16 -0
  62. data/lib/solidus_pagy/testing_support/factories.rb +4 -0
  63. data/lib/solidus_pagy/version.rb +5 -0
  64. data/lib/solidus_pagy.rb +11 -0
  65. data/solidus_pagy.gemspec +44 -0
  66. data/spec/controllers/spree/admin/orders_controller_spec.rb +100 -0
  67. data/spec/controllers/spree/admin/prices_controller_spec.rb +80 -0
  68. data/spec/controllers/spree/admin/products_controller_spec.rb +57 -0
  69. data/spec/controllers/spree/admin/promotion_codes_controller_spec.rb +38 -0
  70. data/spec/controllers/spree/admin/promotions_controller_spec.rb +90 -0
  71. data/spec/controllers/spree/admin/properties_controller_spec.rb +15 -0
  72. data/spec/controllers/spree/admin/stock_items_controller_spec.rb +35 -0
  73. data/spec/controllers/spree/admin/stock_locations_controller_spec.rb +26 -0
  74. data/spec/controllers/spree/admin/stock_movements_controller_spec.rb +81 -0
  75. data/spec/controllers/spree/admin/tax_rates_controller_spec.rb +15 -0
  76. data/spec/controllers/spree/admin/users_controller_spec.rb +117 -0
  77. data/spec/controllers/spree/admin/variants_controller_spec.rb +76 -0
  78. data/spec/controllers/spree/admin/zones_controller_spec.rb +15 -0
  79. data/spec/solidus_pagy/configuration_spec.rb +55 -0
  80. data/spec/spec_helper.rb +31 -0
  81. data/spec/support/devise.rb +8 -0
  82. data/spec/support/pagy.rb.rb +8 -0
  83. data/spec/support/solidus.rb +16 -0
  84. metadata +248 -0
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4
+ # | Option | Helper | Path |
5
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6
+ # | default | pagy_nav | |
7
+ # | bootstrap | pagy_bootstrap_nav | pagy/extras/bootstrap |
8
+ # | bulma | pagy_bulma_nav | pagy/extras/bulma |
9
+ # | foundation | pagy_foundation_nav | pagy/extras/foundation |
10
+ # | materialize| pagy_materialize_nav | pagy/extras/materialize |
11
+ # | semantic | pagy_semantic_nav | pagy/extras/semantic |
12
+ # | uikit | pagy_uikit_nav | pagy/extras/uikit |
13
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
14
+
15
+ SolidusPagy.configure do |config|
16
+ config.nav_helper = 'pagy_nav'
17
+ config.page = 1
18
+ config.items = 20
19
+ config.outset = 0
20
+ config.orders_per_page = 15
21
+ config.properties_per_page = 15
22
+ config.promotions_per_page = 15
23
+ config.admin_products_per_page = 10
24
+ config.admin_variants_per_page = 20
25
+ end
26
+
27
+ Pagy::DEFAULT[:page] = SolidusPagy.config.page
28
+ Pagy::DEFAULT[:items] = SolidusPagy.config.items
29
+ Pagy::DEFAULT[:outset] = SolidusPagy.config.outset
30
+ Pagy::DEFAULT.freeze
@@ -0,0 +1,235 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Pagy initializer file (5.10.1)
4
+ # Customize only what you really need and notice that the core Pagy works also without any of the following lines.
5
+ # Should you just cherry pick part of this file, please maintain the require-order of the extras
6
+
7
+ # Pagy DEFAULT Variables
8
+ # See https://ddnexus.github.io/pagy/api/pagy#variables
9
+ # All the Pagy::DEFAULT are set for all the Pagy instances but can be overridden per instance by just passing them to
10
+ # Pagy.new|Pagy::Countless.new|Pagy::Calendar::*.new or any of the #pagy* controller methods
11
+
12
+ # Instance variables
13
+ # See https://ddnexus.github.io/pagy/api/pagy#instance-variables
14
+ # Pagy::DEFAULT[:page] = 1 # default
15
+ # Pagy::DEFAULT[:items] = 20 # default
16
+ # Pagy::DEFAULT[:outset] = 0 # default
17
+
18
+ # Other Variables
19
+ # See https://ddnexus.github.io/pagy/api/pagy#other-variables
20
+ # Pagy::DEFAULT[:size] = [1,4,4,1] # default
21
+ # Pagy::DEFAULT[:page_param] = :page # default
22
+ # The :params can be also set as a lambda e.g ->(params){ params.exclude('useless').merge!('custom' => 'useful') }
23
+ # Pagy::DEFAULT[:params] = {} # default
24
+ # Pagy::DEFAULT[:fragment] = '#fragment' # example
25
+ # Pagy::DEFAULT[:link_extra] = 'data-remote="true"' # example
26
+ # Pagy::DEFAULT[:i18n_key] = 'pagy.item_name' # default
27
+ # Pagy::DEFAULT[:cycle] = true # example
28
+
29
+ # Extras
30
+ # See https://ddnexus.github.io/pagy/extras
31
+
32
+ # Backend Extras
33
+
34
+ # Array extra: Paginate arrays efficiently, avoiding expensive array-wrapping and without overriding
35
+ # See https://ddnexus.github.io/pagy/extras/array
36
+ # require 'pagy/extras/array'
37
+
38
+ # Calendar extra: Add pagination filtering by calendar time unit (year, quarter, month, week, day)
39
+ # See https://ddnexus.github.io/pagy/extras/calendar
40
+ # require 'pagy/extras/calendar'
41
+ # Default for each unit
42
+ # Pagy::Calendar::Year::DEFAULT[:order] = :asc # Time direction of pagination
43
+ # Pagy::Calendar::Year::DEFAULT[:format] = '%Y' # strftime format
44
+ #
45
+ # Pagy::Calendar::Quarter::DEFAULT[:order] = :asc # Time direction of pagination
46
+ # Pagy::Calendar::Quarter::DEFAULT[:format] = '%Y-Q%q' # strftime format
47
+ #
48
+ # Pagy::Calendar::Month::DEFAULT[:order] = :asc # Time direction of pagination
49
+ # Pagy::Calendar::Month::DEFAULT[:format] = '%Y-%m' # strftime format
50
+ #
51
+ # Pagy::Calendar::Week::DEFAULT[:order] = :asc # Time direction of pagination
52
+ # Pagy::Calendar::Week::DEFAULT[:format] = '%Y-%W' # strftime format
53
+ #
54
+ # Pagy::Calendar::Day::DEFAULT[:order] = :asc # Time direction of pagination
55
+ # Pagy::Calendar::Day::DEFAULT[:format] = '%Y-%m-%d' # strftime format
56
+ #
57
+ # Uncomment the following lines, if you need calendar localization without using the I18n extra
58
+ # module LocalizePagyCalendar
59
+ # def localize(time, opts)
60
+ # ::I18n.l(time, **opts)
61
+ # end
62
+ # end
63
+ # Pagy::Calendar.prepend LocalizePagyCalendar
64
+
65
+ # Countless extra: Paginate without any count, saving one query per rendering
66
+ # See https://ddnexus.github.io/pagy/extras/countless
67
+ # require 'pagy/extras/countless'
68
+ # Pagy::DEFAULT[:countless_minimal] = false # default (eager loading)
69
+
70
+ # Elasticsearch Rails extra: Paginate `ElasticsearchRails::Results` objects
71
+ # See https://ddnexus.github.io/pagy/extras/elasticsearch_rails
72
+ # Default :pagy_search method: change only if you use also
73
+ # the searchkick or meilisearch extra that defines the same
74
+ # Pagy::DEFAULT[:elasticsearch_rails_pagy_search] = :pagy_search
75
+ # Default original :search method called internally to do the actual search
76
+ # Pagy::DEFAULT[:elasticsearch_rails_search] = :search
77
+ # require 'pagy/extras/elasticsearch_rails'
78
+
79
+ # Headers extra: http response headers (and other helpers) useful for API pagination
80
+ # See http://ddnexus.github.io/pagy/extras/headers
81
+ # require 'pagy/extras/headers'
82
+ # Pagy::DEFAULT[:headers] = { page: 'Current-Page',
83
+ # items: 'Page-Items',
84
+ # count: 'Total-Count',
85
+ # pages: 'Total-Pages' } # default
86
+
87
+ # Meilisearch extra: Paginate `Meilisearch` result objects
88
+ # See https://ddnexus.github.io/pagy/extras/meilisearch
89
+ # Default :pagy_search method: change only if you use also
90
+ # the elasticsearch_rails or searchkick extra that define the same method
91
+ # Pagy::DEFAULT[:meilisearch_pagy_search] = :pagy_search
92
+ # Default original :search method called internally to do the actual search
93
+ # Pagy::DEFAULT[:meilisearch_search] = :ms_search
94
+ # require 'pagy/extras/meilisearch'
95
+
96
+ # Metadata extra: Provides the pagination metadata to Javascript frameworks like Vue.js, react.js, etc.
97
+ # See https://ddnexus.github.io/pagy/extras/metadata
98
+ # you must require the shared internal extra (BEFORE the metadata extra) ONLY if you need also the :sequels
99
+ # require 'pagy/extras/shared'
100
+ # require 'pagy/extras/metadata'
101
+ # For performance reasons, you should explicitly set ONLY the metadata you use in the frontend
102
+ # Pagy::DEFAULT[:metadata] = %i[scaffold_url page prev next last] # example
103
+
104
+ # Searchkick extra: Paginate `Searchkick::Results` objects
105
+ # See https://ddnexus.github.io/pagy/extras/searchkick
106
+ # Default :pagy_search method: change only if you use also
107
+ # the elasticsearch_rails or meilisearch extra that defines the same
108
+ # DEFAULT[:searchkick_pagy_search] = :pagy_search
109
+ # Default original :search method called internally to do the actual search
110
+ # Pagy::DEFAULT[:searchkick_search] = :search
111
+ # require 'pagy/extras/searchkick'
112
+ # uncomment if you are going to use Searchkick.pagy_search
113
+ # Searchkick.extend Pagy::Searchkick
114
+
115
+ # Frontend Extras
116
+
117
+ # Bootstrap extra: Add nav, nav_js and combo_nav_js helpers and templates for Bootstrap pagination
118
+ # See https://ddnexus.github.io/pagy/extras/bootstrap
119
+ # require 'pagy/extras/bootstrap'
120
+
121
+ # Bulma extra: Add nav, nav_js and combo_nav_js helpers and templates for Bulma pagination
122
+ # See https://ddnexus.github.io/pagy/extras/bulma
123
+ # require 'pagy/extras/bulma'
124
+
125
+ # Foundation extra: Add nav, nav_js and combo_nav_js helpers and templates for Foundation pagination
126
+ # See https://ddnexus.github.io/pagy/extras/foundation
127
+ # require 'pagy/extras/foundation'
128
+
129
+ # Materialize extra: Add nav, nav_js and combo_nav_js helpers for Materialize pagination
130
+ # See https://ddnexus.github.io/pagy/extras/materialize
131
+ # require 'pagy/extras/materialize'
132
+
133
+ # Navs extra: Add nav_js and combo_nav_js javascript helpers
134
+ # Notice: the other frontend extras add their own framework-styled versions,
135
+ # so require this extra only if you need the unstyled version
136
+ # See https://ddnexus.github.io/pagy/extras/navs
137
+ # require 'pagy/extras/navs'
138
+
139
+ # Semantic extra: Add nav, nav_js and combo_nav_js helpers for Semantic UI pagination
140
+ # See https://ddnexus.github.io/pagy/extras/semantic
141
+ # require 'pagy/extras/semantic'
142
+
143
+ # UIkit extra: Add nav helper and templates for UIkit pagination
144
+ # See https://ddnexus.github.io/pagy/extras/uikit
145
+ # require 'pagy/extras/uikit'
146
+
147
+ # Multi size var used by the *_nav_js helpers
148
+ # See https://ddnexus.github.io/pagy/extras/navs#steps
149
+ # Pagy::DEFAULT[:steps] = { 0 => [2,3,3,2], 540 => [3,5,5,3], 720 => [5,7,7,5] } # example
150
+
151
+ # Feature Extras
152
+
153
+ # Gearbox extra: Automatically change the number of items per page depending on the page number
154
+ # See https://ddnexus.github.io/pagy/extras/gearbox
155
+ # require 'pagy/extras/gearbox'
156
+ # set to false only if you want to make :gearbox_extra an opt-in variable
157
+ # Pagy::DEFAULT[:gearbox_extra] = false # default true
158
+ # Pagy::DEFAULT[:gearbox_items] = [15, 30, 60, 100] # default
159
+
160
+ # Items extra: Allow the client to request a custom number of items per page with an optional selector UI
161
+ # See https://ddnexus.github.io/pagy/extras/items
162
+ # require 'pagy/extras/items'
163
+ # set to false only if you want to make :items_extra an opt-in variable
164
+ # Pagy::DEFAULT[:items_extra] = false # default true
165
+ # Pagy::DEFAULT[:items_param] = :items # default
166
+ # Pagy::DEFAULT[:max_items] = 100 # default
167
+
168
+ # Overflow extra: Allow for easy handling of overflowing pages
169
+ # See https://ddnexus.github.io/pagy/extras/overflow
170
+ # require 'pagy/extras/overflow'
171
+ # Pagy::DEFAULT[:overflow] = :empty_page # default (other options: :last_page and :exception)
172
+
173
+ # Support extra: Extra support for features like: incremental, infinite, auto-scroll pagination
174
+ # See https://ddnexus.github.io/pagy/extras/support
175
+ # require 'pagy/extras/support'
176
+
177
+ # Trim extra: Remove the page=1 param from links
178
+ # See https://ddnexus.github.io/pagy/extras/trim
179
+ # require 'pagy/extras/trim'
180
+ # set to false only if you want to make :trim_extra an opt-in variable
181
+ # Pagy::DEFAULT[:trim_extra] = false # default true
182
+
183
+ # Standalone extra: Use pagy in non Rack environment/gem
184
+ # See https://ddnexus.github.io/pagy/extras/standalone
185
+ # require 'pagy/extras/standalone'
186
+ # Pagy::DEFAULT[:url] = 'http://www.example.com/subdir' # optional default
187
+
188
+ # Rails
189
+ # Enable the .js file required by the helpers that use javascript
190
+ # (pagy*_nav_js, pagy*_combo_nav_js, and pagy_items_selector_js)
191
+ # See https://ddnexus.github.io/pagy/extras#javascript
192
+
193
+ # With the asset pipeline
194
+ # Sprockets need to look into the pagy javascripts dir, so add it to the assets paths
195
+ # Rails.application.config.assets.paths << Pagy.root.join('javascripts')
196
+
197
+ # I18n
198
+
199
+ # Pagy internal I18n: ~18x faster using ~10x less memory than the i18n gem
200
+ # See https://ddnexus.github.io/pagy/api/frontend#i18n
201
+ # Notice: No need to configure anything in this section if your app uses only "en"
202
+ # or if you use the i18n extra below
203
+ #
204
+ # Examples:
205
+ # load the "de" built-in locale:
206
+ # Pagy::I18n.load(locale: 'de')
207
+ #
208
+ # load the "de" locale defined in the custom file at :filepath:
209
+ # Pagy::I18n.load(locale: 'de', filepath: 'path/to/pagy-de.yml')
210
+ #
211
+ # load the "de", "en" and "es" built-in locales:
212
+ # (the first passed :locale will be used also as the default_locale)
213
+ # Pagy::I18n.load({ locale: 'de' },
214
+ # { locale: 'en' },
215
+ # { locale: 'es' })
216
+ #
217
+ # load the "en" built-in locale, a custom "es" locale,
218
+ # and a totally custom locale complete with a custom :pluralize proc:
219
+ # (the first passed :locale will be used also as the default_locale)
220
+ # Pagy::I18n.load({ locale: 'en' },
221
+ # { locale: 'es', filepath: 'path/to/pagy-es.yml' },
222
+ # { locale: 'xyz', # not built-in
223
+ # filepath: 'path/to/pagy-xyz.yml',
224
+ # pluralize: lambda{ |count| ... } )
225
+
226
+ # I18n extra: uses the standard i18n gem which is ~18x slower using ~10x more memory
227
+ # than the default pagy internal i18n (see above)
228
+ # See https://ddnexus.github.io/pagy/extras/i18n
229
+ # require 'pagy/extras/i18n'
230
+
231
+ # Default i18n key
232
+ # Pagy::DEFAULT[:i18n_key] = 'pagy.item_name' # default
233
+
234
+ # When you are done setting your own default freeze it, so it will not get changed accidentally
235
+ # Pagy::DEFAULT.freeze
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusPagy
4
+ class Configuration
5
+ attr_accessor :nav_helper,
6
+ :page,
7
+ :items,
8
+ :outset,
9
+ :promotions_per_page,
10
+ :properties_per_page,
11
+ :orders_per_page,
12
+ :admin_products_per_page,
13
+ :admin_variants_per_page
14
+ end
15
+
16
+ class << self
17
+ def configuration
18
+ @configuration ||= Configuration.new
19
+ end
20
+
21
+ alias config configuration
22
+
23
+ def configure
24
+ yield configuration
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusPagy
4
+ class Engine < Rails::Engine
5
+ include SolidusSupport::EngineExtensions
6
+
7
+ isolate_namespace ::Spree
8
+
9
+ engine_name 'solidus_pagy'
10
+
11
+ # use rspec for tests
12
+ config.generators do |g|
13
+ g.test_framework :rspec
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusPagy
4
+ VERSION = '1.0.0'
5
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'solidus_core'
4
+ require 'solidus_backend'
5
+ require 'solidus_support'
6
+ require 'deface'
7
+
8
+ require 'solidus_pagy/configuration'
9
+ require 'solidus_pagy/version'
10
+ require 'solidus_pagy/engine'
11
+ require 'pagy'
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/solidus_pagy/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'solidus_pagy'
7
+ s.version = SolidusPagy::VERSION
8
+ s.authors = ['Jonathan Tapia']
9
+ s.email = 'jonathan.tapia@magmalabs.io'
10
+
11
+ s.summary = 'Solidus extension using Pagy pagination.'
12
+ s.description = 'Solidus extension using Pagy pagination.'
13
+ s.homepage = 'https://github.com/solidusio-contrib/solidus_pagy#readme'
14
+ s.license = 'BSD-3-Clause'
15
+
16
+ if s.respond_to?(:metadata)
17
+ s.metadata['homepage_uri'] = s.homepage
18
+ s.metadata['source_code_uri'] = 'https://github.com/jtapia/solidus_pagy'
19
+ s.metadata['rubygems_mfa_required'] = 'true'
20
+ s.metadata['changelog_uri'] = 'https://github.com/jtapia/solidus_pagy/blob/master/CHANGELOG.md'
21
+ end
22
+
23
+ s.required_ruby_version = Gem::Requirement.new('>= 2.5')
24
+
25
+ # Specify which files should be added to the gem when it is released.
26
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
27
+ files = Dir.chdir(__dir__) { `git ls-files -z`.split("\x0") }
28
+
29
+ s.files = files.grep_v(%r{^(test|spec|features)/})
30
+ s.test_files = files.grep(%r{^(test|spec|features)/})
31
+ s.bindir = 'exe'
32
+ s.executables = files.grep(%r{^exe/}) { |f| File.basename(f) }
33
+ s.require_paths = ['lib']
34
+
35
+ solidus_version = ['>= 2.5', '< 4']
36
+
37
+ s.add_dependency 'pagy', '~> 5.10'
38
+ s.add_dependency 'solidus_core', solidus_version
39
+ s.add_dependency 'solidus_support', '~> 0.5'
40
+
41
+ s.add_development_dependency 'solidus_backend', solidus_version
42
+ s.add_development_dependency 'solidus_dev_support', '~> 2.5'
43
+ s.add_development_dependency 'solidus_frontend', solidus_version
44
+ end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Spree::Admin::OrdersController, type: :controller do
6
+ let(:store) { create(:store) }
7
+
8
+ context 'with authorization' do
9
+ stub_authorization!
10
+
11
+ let(:order) do
12
+ mock_model(
13
+ Spree::Order,
14
+ completed?: true,
15
+ total: 100,
16
+ number: 'R123456789',
17
+ all_adjustments: adjustments,
18
+ ship_address: mock_model(Spree::Address)
19
+ )
20
+ end
21
+ let(:adjustments) do
22
+ instance_double('adjustments')
23
+ end
24
+
25
+ before do
26
+ request.env['HTTP_REFERER'] = 'http://localhost:3000'
27
+ allow(Spree::Order).to receive_message_chain(:includes, find_by!: order)
28
+ allow(order)
29
+ .to receive_messages(contents: Spree::OrderContents.new(order))
30
+ end
31
+
32
+ context 'with pagination' do
33
+ it 'can page through the orders' do
34
+ get :index, params: { page: 1, per_page: 10 }
35
+ expect(assigns[:pagy].page).to eq(1)
36
+ expect(assigns[:pagy].items).to eq(10)
37
+ end
38
+ end
39
+
40
+ # Test for https://github.com/spree/spree/issues/3919
41
+ context 'search' do
42
+ let(:user) { create(:user) }
43
+
44
+ before do
45
+ allow(controller).to receive(:try_spree_current_user) { user }
46
+ user.spree_roles << Spree::Role.find_or_create_by(name: 'admin')
47
+ create_list(:completed_order_with_totals, 2)
48
+ end
49
+
50
+ context 'by line_items_variant_id_in' do
51
+ it 'does not display duplicated results' do
52
+ get :index,
53
+ params: {
54
+ q: {
55
+ line_items_variant_id_in: Spree::Order.first.variants.map(&:id)
56
+ }
57
+ }
58
+ expect(assigns[:orders].size).to eq 1
59
+ end
60
+ end
61
+
62
+ context 'by email' do
63
+ it 'does not display duplicated results' do
64
+ get :index,
65
+ params: {
66
+ q: {
67
+ email_start: Spree::Order.first.email
68
+ }
69
+ }
70
+ expect(assigns[:orders].size).to eq 1
71
+ expect(assigns[:orders][0].email).to eq(Spree::Order.first.email)
72
+ end
73
+ end
74
+
75
+ context 'by created_at_gt' do
76
+ it 'does display item results' do
77
+ get :index,
78
+ params: {
79
+ q: {
80
+ created_at_gt: DateTime.now - 1.day
81
+ }
82
+ }
83
+ expect(assigns[:orders].size).to eq(2)
84
+ end
85
+ end
86
+
87
+ context 'by created_at_lt' do
88
+ it 'does display item results' do
89
+ get :index,
90
+ params: {
91
+ q: {
92
+ created_at_lt: DateTime.now
93
+ }
94
+ }
95
+ expect(assigns[:orders].size).to eq(2)
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Spree::Admin::PricesController, type: :controller do
6
+ stub_authorization!
7
+
8
+ let(:product) { create(:product) }
9
+
10
+ context 'with pagination' do
11
+ it 'can page through the product master prices' do
12
+ get :index, params: { product_id: product.slug, page: 1 }
13
+ expect(assigns[:pagy_master_prices].page).to eq(1)
14
+ expect(assigns[:pagy_master_prices].items).to eq(20)
15
+ end
16
+
17
+ it 'can page through the product variant prices' do
18
+ get :index, params: { product_id: product.slug, variants_page: 1 }
19
+ expect(assigns[:pagy_variant_prices].page).to eq(1)
20
+ expect(assigns[:pagy_variant_prices].items).to eq(20)
21
+ end
22
+ end
23
+
24
+ describe '#index' do
25
+ context 'when only given a product' do
26
+ let(:product) { create(:product) }
27
+
28
+ subject { get :index, params: { product_id: product.slug } }
29
+
30
+ it { is_expected.to be_successful }
31
+
32
+ it 'assigns usable instance variables' do
33
+ subject
34
+
35
+ expect(assigns(:search)).to be_a(Ransack::Search)
36
+ expect(assigns(:variant_prices)).to eq(product.prices.for_variant)
37
+ expect(assigns(:master_prices)).to eq(product.prices.for_master)
38
+ expect(assigns(:product)).to eq(product)
39
+ end
40
+ end
41
+
42
+ context 'when given a product and a variant' do
43
+ let(:variant) { create(:variant) }
44
+ let(:product) { variant.product }
45
+
46
+ subject do
47
+ get :index,
48
+ params: {
49
+ product_id: product.slug,
50
+ variant_id: variant.id
51
+ }
52
+ end
53
+
54
+ it { is_expected.to be_successful }
55
+
56
+ it 'assigns usable instance variables' do
57
+ subject
58
+
59
+ expect(assigns(:search)).to be_a(Ransack::Search)
60
+ expect(assigns(:variant_prices)).to eq(product.prices.for_variant)
61
+ expect(assigns(:master_prices)).to eq(product.prices.for_master)
62
+ expect(assigns(:variant_prices)).to include(variant.default_price)
63
+ expect(assigns(:product)).to eq(product)
64
+ end
65
+ end
66
+
67
+ context 'existent product id not given' do
68
+ subject do
69
+ get :index, params: { product_id: 'non-existent-product' }
70
+ end
71
+
72
+ it 'cannot find non-existent product' do
73
+ subject
74
+
75
+ expect(response).to redirect_to(spree.admin_products_path)
76
+ expect(flash[:error]).to eql('Product is not found')
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Spree::Admin::ProductsController, type: :controller do
6
+ stub_authorization!
7
+
8
+ let(:product) { create(:product) }
9
+
10
+ context 'with pagination' do
11
+ it 'can page through the products' do
12
+ get :index, params: { page: 1, per_page: 10 }
13
+ expect(assigns[:pagy].page).to eq(1)
14
+ expect(assigns[:pagy].items).to eq(10)
15
+ end
16
+ end
17
+
18
+ describe '#index' do
19
+ let(:ability_user) do
20
+ stub_model(Spree::LegacyUser, has_spree_role?: true)
21
+ end
22
+
23
+ # Regression test for https://github.com/spree/spree/issues/1259
24
+ it 'can find a product by SKU' do
25
+ product = create(:product, sku: 'ABC123')
26
+
27
+ get :index, params: { q: { sku_start: 'ABC123' } }
28
+ expect(assigns[:collection]).not_to be_empty
29
+ expect(assigns[:collection]).to include(product)
30
+ end
31
+
32
+ # Regression test for https://github.com/spree/spree/issues/1903
33
+ context 'when soft deleted products exist' do
34
+ let(:soft_deleted_product) { create(:product, sku: 'ABC123') }
35
+
36
+ before { soft_deleted_product.discard }
37
+
38
+ context 'when params[:q][:with_discarded] is not set' do
39
+ let(:params) { { q: {} } }
40
+
41
+ it 'filters out soft-deleted products by default' do
42
+ get :index, params: params
43
+ expect(assigns[:collection]).not_to include(soft_deleted_product)
44
+ end
45
+ end
46
+
47
+ context "when params[:q][:with_discarded] is set to 'true'" do
48
+ let(:params) { { q: { with_discarded: 'true' } } }
49
+
50
+ it 'includes soft-deleted products' do
51
+ get :index, params: params
52
+ expect(assigns[:collection]).to include(soft_deleted_product)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Spree::Admin::PromotionCodesController, type: :controller do
6
+ stub_authorization!
7
+
8
+ let(:promotion) { create(:promotion) }
9
+ let(:code1) { create(:promotion_code, promotion: promotion) }
10
+ let(:code2) { create(:promotion_code, promotion: promotion) }
11
+ let(:code3) { create(:promotion_code, promotion: promotion) }
12
+
13
+ context 'with pagination' do
14
+ it 'can page through the products' do
15
+ get :index,
16
+ params: {
17
+ promotion_id: promotion.id,
18
+ page: 1
19
+ }
20
+ expect(assigns[:pagy].page).to eq(1)
21
+ expect(assigns[:pagy].items).to eq(50)
22
+ end
23
+ end
24
+
25
+ describe '#index' do
26
+ it 'returns 200 as HTML' do
27
+ get :index, params: { promotion_id: promotion.id }
28
+
29
+ expect(response.status).to be(200)
30
+ end
31
+
32
+ it 'returns 200 as CSV' do
33
+ get :index, params: { promotion_id: promotion.id, format: :csv }
34
+
35
+ expect(response.status).to be(200)
36
+ end
37
+ end
38
+ end