workarea-inventory_notifications 2.1.2
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.
- checksums.yaml +7 -0
- data/.editorconfig +15 -0
- data/.eslintrc +24 -0
- data/.gitignore +12 -0
- data/.jshintrc +31 -0
- data/.rubocop.yml +2 -0
- data/CHANGELOG.md +99 -0
- data/Gemfile +17 -0
- data/README.md +65 -0
- data/Rakefile +43 -0
- data/app/assets/stylesheets/workarea/storefront/inventory_notifications/components/_inventory_notifications.scss +14 -0
- data/app/controllers/workarea/storefront/inventory_notifications_controller.rb +30 -0
- data/app/mailers/workarea/storefront/inventory_update_mailer.rb +17 -0
- data/app/models/workarea/inventory/policies/allow_notify.rb +11 -0
- data/app/models/workarea/inventory_notification.rb +23 -0
- data/app/view_models/product_view_model.decorator +45 -0
- data/app/views/workarea/storefront/inventory_notifications/new.html.haml +19 -0
- data/app/views/workarea/storefront/inventory_update_mailer/notify.html.haml +32 -0
- data/app/views/workarea/storefront/inventory_update_mailer/notify.text.haml +14 -0
- data/app/views/workarea/storefront/products/_inventory_notifications.html.haml +8 -0
- data/app/workers/workarea/restock_notifier.rb +27 -0
- data/bin/rails +18 -0
- data/config/initializers/appends.rb +11 -0
- data/config/initializers/inventory_policies.rb +3 -0
- data/config/locales/en.yml +22 -0
- data/config/routes.rb +10 -0
- data/lib/workarea/inventory_notifications/engine.rb +8 -0
- data/lib/workarea/inventory_notifications/version.rb +5 -0
- data/lib/workarea/inventory_notifications.rb +11 -0
- data/lib/workarea/mailer_previews/inventory_update_mailer_preview.rb +12 -0
- data/script/admin_ci +9 -0
- data/script/ci +11 -0
- data/script/core_ci +9 -0
- data/script/plugins_ci +9 -0
- data/script/storefront_ci +9 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/config/manifest.js +4 -0
- data/test/dummy/app/assets/images/.keep +0 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/controllers/concerns/.keep +0 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/jobs/application_job.rb +2 -0
- data/test/dummy/app/mailers/application_mailer.rb +4 -0
- data/test/dummy/app/models/concerns/.keep +0 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
- data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +34 -0
- data/test/dummy/bin/update +29 -0
- data/test/dummy/config/application.rb +24 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/cable.yml +9 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +54 -0
- data/test/dummy/config/environments/production.rb +83 -0
- data/test/dummy/config/environments/test.rb +43 -0
- data/test/dummy/config/initializers/application_controller_renderer.rb +6 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/workarea.rb +5 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/puma.rb +47 -0
- data/test/dummy/config/routes.rb +5 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/config.ru +5 -0
- data/test/dummy/lib/assets/.keep +0 -0
- data/test/dummy/log/.keep +0 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
- data/test/dummy/public/apple-touch-icon.png +0 -0
- data/test/dummy/public/favicon.ico +1 -0
- data/test/mailers/workarea/storefront/inventory_update_mailer_test.rb +55 -0
- data/test/models/workarea/inventory_notification_test.rb +16 -0
- data/test/system/workarea/storefront/inventory_notifications_system_test.rb +89 -0
- data/test/test_helper.rb +10 -0
- data/test/view_models/workarea/storefront/product_view_model_test.decorator +28 -0
- data/test/workers/workarea/restock_notifier_test.rb +32 -0
- data/workarea-inventory_notifications.gemspec +18 -0
- metadata +153 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 6ba4d6ca31b9f2266d0c3c0631bd42f697a3fb42985178f069a0384b2c0f4a02
|
|
4
|
+
data.tar.gz: e836462072d65e2343d22b34b44dfefe4a9b57f83a16521e311d3a092221166a
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: ea57e300a4e529f958e7105826555e5055a4debd215cfb45935299c52184206bb7279c709fec1e0a006ed305479128a5e01e4baefa808333780f767c4ac7c038
|
|
7
|
+
data.tar.gz: a0d89f8e017a97f9ad5d91a24c39ebe7a77ea574a0f0fd5595cc674eab08a2663b0c8ce94637dc09c954af776803a559ccbfdd44b506c5085bb570e74928aa46
|
data/.editorconfig
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# editorconfig.org
|
|
2
|
+
root = true
|
|
3
|
+
|
|
4
|
+
[*]
|
|
5
|
+
charset = utf-8
|
|
6
|
+
indent_style = space
|
|
7
|
+
end_of_line = lf
|
|
8
|
+
trim_trailing_whitespace = true
|
|
9
|
+
insert_final_newline = true
|
|
10
|
+
|
|
11
|
+
[{*.rb,*.haml,*.scss}]
|
|
12
|
+
indent_size = 2
|
|
13
|
+
|
|
14
|
+
[{*.js,*.jst,*.ejs}]
|
|
15
|
+
indent_size = 4
|
data/.eslintrc
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "eslint:recommended",
|
|
3
|
+
"rules": {
|
|
4
|
+
"semi": [1, "always"]
|
|
5
|
+
},
|
|
6
|
+
"globals": {
|
|
7
|
+
"window": true,
|
|
8
|
+
"document": true,
|
|
9
|
+
"WORKAREA": true,
|
|
10
|
+
"$": true,
|
|
11
|
+
"jQuery": true,
|
|
12
|
+
"_": true,
|
|
13
|
+
"feature": true,
|
|
14
|
+
"JST": true,
|
|
15
|
+
"Turbolinks": true,
|
|
16
|
+
"I18n": true,
|
|
17
|
+
"Chart": true,
|
|
18
|
+
"Dropzone": true,
|
|
19
|
+
"strftime": true,
|
|
20
|
+
"Waypoint": true,
|
|
21
|
+
"wysihtml": true,
|
|
22
|
+
"LocalTime": true,
|
|
23
|
+
}
|
|
24
|
+
}
|
data/.gitignore
ADDED
data/.jshintrc
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"bitwise": true,
|
|
3
|
+
"camelcase": false,
|
|
4
|
+
"curly": true,
|
|
5
|
+
"eqeqeq": true,
|
|
6
|
+
"forin": true,
|
|
7
|
+
"immed": true,
|
|
8
|
+
"indent": 4,
|
|
9
|
+
"latedef": true,
|
|
10
|
+
"newcap": true,
|
|
11
|
+
"noarg": true,
|
|
12
|
+
"noempty": true,
|
|
13
|
+
"nonew": true,
|
|
14
|
+
"plusplus": true,
|
|
15
|
+
"quotmark": true,
|
|
16
|
+
"undef": true,
|
|
17
|
+
"unused": true,
|
|
18
|
+
"strict": true,
|
|
19
|
+
"trailing": true,
|
|
20
|
+
"browser": true,
|
|
21
|
+
"jquery": true,
|
|
22
|
+
"onevar": true,
|
|
23
|
+
"white": true,
|
|
24
|
+
"globals": {
|
|
25
|
+
"_": false,
|
|
26
|
+
"_gaq": false,
|
|
27
|
+
"JST": false,
|
|
28
|
+
"Modernizr": false,
|
|
29
|
+
"WEBLINC": false
|
|
30
|
+
}
|
|
31
|
+
}
|
data/.rubocop.yml
ADDED
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
Workarea Inventory Notifications 2.1.2 (2019-08-21)
|
|
2
|
+
--------------------------------------------------------------------------------
|
|
3
|
+
|
|
4
|
+
* Open Source!
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Workarea Inventory Notifications 2.1.1 (2019-03-05)
|
|
9
|
+
--------------------------------------------------------------------------------
|
|
10
|
+
|
|
11
|
+
* INVENNOTIF-19: Remove unused view
|
|
12
|
+
|
|
13
|
+
Andy Sides
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
Workarea Inventory Notifications 2.1.0 (2019-02-05)
|
|
18
|
+
--------------------------------------------------------------------------------
|
|
19
|
+
|
|
20
|
+
* Update test to be decorated
|
|
21
|
+
|
|
22
|
+
Update Storefront::ProductViewModelTest and require Workarea >= 3.3.0
|
|
23
|
+
|
|
24
|
+
INVENNOTIF-18
|
|
25
|
+
Andy Sides
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
Workarea Inventory Notifications 2.0.2 (2019-02-05)
|
|
30
|
+
--------------------------------------------------------------------------------
|
|
31
|
+
|
|
32
|
+
* INVENNOTIF-17: Fix system test file name and location
|
|
33
|
+
|
|
34
|
+
Andy Sides
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
Workarea Inventory Notifications 2.0.1 (2019-01-08)
|
|
39
|
+
--------------------------------------------------------------------------------
|
|
40
|
+
|
|
41
|
+
* Fix displaying notification on option set product templates
|
|
42
|
+
|
|
43
|
+
Fixes a bug around the notification link on the option selects or option
|
|
44
|
+
thumbnails product templates
|
|
45
|
+
|
|
46
|
+
INVENNOTIF-15
|
|
47
|
+
Andy Sides
|
|
48
|
+
|
|
49
|
+
* Fix failing tests
|
|
50
|
+
|
|
51
|
+
Update tests to use correct syntax for specifying inventory
|
|
52
|
+
policy and to temporarily adjust Workarea.config.send_email
|
|
53
|
+
when testing email sends.
|
|
54
|
+
|
|
55
|
+
INVENNOTIF-14
|
|
56
|
+
gharnly
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
Workarea Inventory Notifications 2.0.0 (2017-05-26)
|
|
61
|
+
--------------------------------------------------------------------------------
|
|
62
|
+
|
|
63
|
+
* Fix bug where inventory notification is displayed before sku is selected
|
|
64
|
+
|
|
65
|
+
Have to use sku from options, rather than current_sku to determine
|
|
66
|
+
whether the current_sku_available? This is because current_sku will
|
|
67
|
+
default to the first sku if no sku is selected.
|
|
68
|
+
|
|
69
|
+
INVENNOTIF-10
|
|
70
|
+
Beresford, Jake
|
|
71
|
+
|
|
72
|
+
* Upgrade for v3
|
|
73
|
+
|
|
74
|
+
* Added new inventory policy AllowNotify for notifications
|
|
75
|
+
* Change logic for unavailable skus in the view model to be specific to current_sku
|
|
76
|
+
* Update UI to show inventory notification link if sku is unavailable
|
|
77
|
+
* rename everything
|
|
78
|
+
* Update decorators to .decorator files
|
|
79
|
+
* Update dependencies
|
|
80
|
+
* Remove JS module that was specific to clothing template
|
|
81
|
+
* Remove add_form controller action, this is now redundant as JS module for clothing was removed
|
|
82
|
+
* storefront translations
|
|
83
|
+
* Update appends and move to initializer
|
|
84
|
+
* Combine listener and worker
|
|
85
|
+
* use ApplicationDocument in model and add index to sku
|
|
86
|
+
* remove unused view models
|
|
87
|
+
* Convert mailer templates to haml and add translations
|
|
88
|
+
* Convert Rspec to minitest
|
|
89
|
+
* Update .gitignore for minitest
|
|
90
|
+
* Install rubocop and clean up code styles
|
|
91
|
+
|
|
92
|
+
INVENNOTIF-9
|
|
93
|
+
Beresford, Jake
|
|
94
|
+
|
|
95
|
+
* INVENNOTIF-7: Add product image to inventory mailer view
|
|
96
|
+
Beresford, Jake
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
|
data/Gemfile
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
source 'https://rubygems.org'
|
|
2
|
+
source 'https://gems.weblinc.com'
|
|
3
|
+
|
|
4
|
+
# Declare your gem's dependencies in api.gemspec.
|
|
5
|
+
# Bundler will treat runtime dependencies like base dependencies, and
|
|
6
|
+
# development dependencies will be added by default to the :development group.
|
|
7
|
+
gemspec
|
|
8
|
+
|
|
9
|
+
# Declare any dependencies that are still in development here instead of in
|
|
10
|
+
# your gemspec. These might include edge Rails or gems from your path or
|
|
11
|
+
# Git. Remember to move these dependencies to your gemspec before releasing
|
|
12
|
+
# your gem to rubygems.org.
|
|
13
|
+
|
|
14
|
+
# To use debugger
|
|
15
|
+
# gem 'debugger'
|
|
16
|
+
|
|
17
|
+
gem "workarea", source: 'https://gems.weblinc.com'
|
data/README.md
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
Workarea Inventory Notifications
|
|
2
|
+
================================================================================
|
|
3
|
+
|
|
4
|
+
Plugin to add back in stock notifications to the storefront.
|
|
5
|
+
|
|
6
|
+
If a product is out of stock, and has the 'allow notify' inventory policy, consumers will see a link
|
|
7
|
+
to request a back in stock notification.
|
|
8
|
+
|
|
9
|
+
When the Inventory::Sku save method is called the restock_notifier checks if the sku is
|
|
10
|
+
now purchasable, checks for unsent inventory notifications on that sku, and sends the mailer.
|
|
11
|
+
|
|
12
|
+
The notify inventory policy behaves the same ways as Inventory::Policy::Standard except
|
|
13
|
+
it will always display a product, even when it is out of stock.
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
Compatibility with workarea-clothing
|
|
17
|
+
--------------------------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
Due to changes in how Clothing works, as of workarea v3, the inventory notifications gem
|
|
20
|
+
is only compatible with Clothing >= v2.1.0.
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
Getting Started
|
|
24
|
+
--------------------------------------------------------------------------------
|
|
25
|
+
|
|
26
|
+
This gem contains a rails engine that must be mounted onto a host Rails application.
|
|
27
|
+
|
|
28
|
+
You must have access to a WebLinc gems server to use this gem. Add your gems server credentials to Bundler:
|
|
29
|
+
|
|
30
|
+
bundle config gems.weblinc.com my_username:my_password
|
|
31
|
+
|
|
32
|
+
Or set the appropriate environment variable in a shell startup file:
|
|
33
|
+
|
|
34
|
+
export BUNDLE_GEMS__WEBLINC__COM='my_username:my_password'
|
|
35
|
+
|
|
36
|
+
Then add the gem to your application's Gemfile specifying the source:
|
|
37
|
+
|
|
38
|
+
# ...
|
|
39
|
+
gem 'workarea-inventory_notifications', source: 'https://gems.weblinc.com'
|
|
40
|
+
# ...
|
|
41
|
+
|
|
42
|
+
Or use a source block:
|
|
43
|
+
|
|
44
|
+
# ...
|
|
45
|
+
source 'https://gems.weblinc.com' do
|
|
46
|
+
gem 'workarea-inventory_notifications'
|
|
47
|
+
end
|
|
48
|
+
# ...
|
|
49
|
+
|
|
50
|
+
Update your application's bundle.
|
|
51
|
+
|
|
52
|
+
cd path/to/application
|
|
53
|
+
bundle
|
|
54
|
+
|
|
55
|
+
Workarea Platform Documentation
|
|
56
|
+
--------------------------------------------------------------------------------
|
|
57
|
+
|
|
58
|
+
See [http://developer.weblinc.com](http://developer.weblinc.com) for Workarea platform documentation.
|
|
59
|
+
|
|
60
|
+
Copyright & Licensing
|
|
61
|
+
--------------------------------------------------------------------------------
|
|
62
|
+
|
|
63
|
+
Copyright WebLinc 2017. All rights reserved.
|
|
64
|
+
|
|
65
|
+
For licensing, contact sales@workarea.com.
|
data/Rakefile
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#!/usr/bin/env rake
|
|
2
|
+
begin
|
|
3
|
+
require 'bundler/setup'
|
|
4
|
+
rescue LoadError
|
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
APP_RAKEFILE = File.expand_path('../test/dummy/Rakefile', __FILE__)
|
|
9
|
+
load 'rails/tasks/engine.rake'
|
|
10
|
+
load 'rails/tasks/statistics.rake'
|
|
11
|
+
load 'workarea/changelog.rake'
|
|
12
|
+
|
|
13
|
+
require 'rake/testtask'
|
|
14
|
+
|
|
15
|
+
Rake::TestTask.new(:test) do |t|
|
|
16
|
+
t.libs << 'lib'
|
|
17
|
+
t.libs << 'test'
|
|
18
|
+
t.pattern = 'test/**/*_test.rb'
|
|
19
|
+
t.verbose = false
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
task default: :test
|
|
23
|
+
|
|
24
|
+
$LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
|
|
25
|
+
require 'workarea/inventory_notifications/version'
|
|
26
|
+
|
|
27
|
+
desc "Release version #{Workarea::InventoryNotifications::VERSION} of the gem"
|
|
28
|
+
task :release do
|
|
29
|
+
host = "https://#{ENV['BUNDLE_GEMS__WEBLINC__COM']}@gems.weblinc.com"
|
|
30
|
+
|
|
31
|
+
#Rake::Task['workarea:changelog'].execute
|
|
32
|
+
#system 'git add CHANGELOG.md'
|
|
33
|
+
#system 'git commit -m "Update CHANGELOG"'
|
|
34
|
+
#system 'git push origin HEAD'
|
|
35
|
+
|
|
36
|
+
system "git tag -a v#{Workarea::InventoryNotifications::VERSION} -m 'Tagging #{Workarea::InventoryNotifications::VERSION}'"
|
|
37
|
+
system 'git push --tags'
|
|
38
|
+
|
|
39
|
+
system 'gem build workarea-inventory_notifications.gemspec'
|
|
40
|
+
system "gem push workarea-inventory_notifications-#{Workarea::InventoryNotifications::VERSION}.gem"
|
|
41
|
+
system "gem push workarea-inventory_notifications-#{Workarea::InventoryNotifications::VERSION}.gem --host #{host}"
|
|
42
|
+
system "rm workarea-inventory_notifications-#{Workarea::InventoryNotifications::VERSION}.gem"
|
|
43
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module Workarea
|
|
2
|
+
class Storefront::InventoryNotificationsController < Storefront::ApplicationController
|
|
3
|
+
before_action :set_product
|
|
4
|
+
|
|
5
|
+
def new; end
|
|
6
|
+
|
|
7
|
+
def create
|
|
8
|
+
@notification = InventoryNotification.new(notification_params)
|
|
9
|
+
|
|
10
|
+
if @notification.save
|
|
11
|
+
flash[:success] = t('workarea.storefront.inventory_notifications.flash_messages.saved')
|
|
12
|
+
redirect_to storefront.product_path(@product)
|
|
13
|
+
else
|
|
14
|
+
flash[:error] = t('workarea.storefront.inventory_notifications.flash_messages.error')
|
|
15
|
+
render :new
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def set_product
|
|
22
|
+
model = Catalog::Product.find_by(slug: params[:product_id])
|
|
23
|
+
@product = Storefront::ProductViewModel.wrap(model, view_model_options)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def notification_params
|
|
27
|
+
params[:notification].permit(:product_id, :sku, :email)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Workarea
|
|
2
|
+
class Storefront::InventoryUpdateMailer < Storefront::ApplicationMailer
|
|
3
|
+
def notify(product_id, sku, email)
|
|
4
|
+
product = Catalog::Product.find(product_id)
|
|
5
|
+
@product = Storefront::ProductViewModel.wrap(product, sku: sku)
|
|
6
|
+
@variant = product.variants.where(sku: sku).first
|
|
7
|
+
|
|
8
|
+
mail(to: email, from: Workarea.config.email_from, subject: subject)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
def subject
|
|
14
|
+
I18n.t('workarea.storefront.restock_mailer.subject')
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Workarea
|
|
2
|
+
class InventoryNotification
|
|
3
|
+
include ApplicationDocument
|
|
4
|
+
|
|
5
|
+
field :product_id, type: String
|
|
6
|
+
field :sku, type: String
|
|
7
|
+
field :email, type: String
|
|
8
|
+
field :sent_at, type: DateTime
|
|
9
|
+
|
|
10
|
+
validates :product_id, presence: true
|
|
11
|
+
validates :sku, presence: true
|
|
12
|
+
validates :email, presence: true,
|
|
13
|
+
email: true
|
|
14
|
+
|
|
15
|
+
index(sku: 1)
|
|
16
|
+
|
|
17
|
+
scope :unsent, -> { where(sent_at: nil) }
|
|
18
|
+
|
|
19
|
+
def mark_as_sent!
|
|
20
|
+
update_attributes(sent_at: Time.now)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module Workarea
|
|
2
|
+
decorate(Storefront::ProductViewModel, with: :inventory_notifications) do
|
|
3
|
+
|
|
4
|
+
def unavailable_sku_options
|
|
5
|
+
@unavailable_sku_options ||= format_variant_options(unavailable_skus)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def unavailable_skus
|
|
9
|
+
@unavailable_skus ||= variants.select do |variant|
|
|
10
|
+
!inventory.for_sku(variant.sku).purchasable?
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def current_sku_unavailable?
|
|
15
|
+
unavailable_skus.any? { |sku| sku.sku == current_sku }
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def purchasable?
|
|
19
|
+
super && !current_sku_unavailable?
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def format_variant_options variants
|
|
25
|
+
variant_options = variants.map do |variant|
|
|
26
|
+
text = if variant.details.blank?
|
|
27
|
+
variant.sku
|
|
28
|
+
else
|
|
29
|
+
sku = variant.sku
|
|
30
|
+
details = variant.details.map do |k, v|
|
|
31
|
+
"#{k.titleize}: #{[v].flatten.join(', ')}"
|
|
32
|
+
end.join(", ")
|
|
33
|
+
"#{sku} - #{details}"
|
|
34
|
+
end
|
|
35
|
+
[ text, variant.sku ]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
if variant_options.one?
|
|
39
|
+
variant_options
|
|
40
|
+
else
|
|
41
|
+
[['Please select options', nil ]] + variant_options
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
- @title = t('workarea.storefront.inventory_notifications.new.title', product: @product.browser_title)
|
|
2
|
+
|
|
3
|
+
.signup-notification.view
|
|
4
|
+
|
|
5
|
+
%h1= t('workarea.storefront.inventory_notifications.new.title', product: @product.browser_title)
|
|
6
|
+
|
|
7
|
+
= form_tag create_product_inventory_notification_path(@product), method: 'post', id: 'inventory_notification_form' do
|
|
8
|
+
|
|
9
|
+
%p= t('workarea.storefront.inventory_notifications.new.instruction')
|
|
10
|
+
|
|
11
|
+
= hidden_field_tag "notification[product_id]", @product.id
|
|
12
|
+
.property
|
|
13
|
+
= label_tag "notification_sku", t('workarea.storefront.inventory_notifications.new.select_options'), class: 'property__name'
|
|
14
|
+
.value= select_tag "notification[sku]", options_for_select(@product.unavailable_sku_options, params.fetch(:notification, {})[:sku]), required: true
|
|
15
|
+
.property
|
|
16
|
+
= label_tag "notification_email", t('workarea.admin.fields.email'), class: 'property__name'
|
|
17
|
+
.value= email_field_tag "notification[email]", current_user.try(:email), class: 'text-box', required: true, placeholder: t('workarea.storefront.forms.email_placeholder')
|
|
18
|
+
|
|
19
|
+
%p.add-to-notify-action= button_tag t('workarea.storefront.inventory_notifications.notify_me'), value: 'add_notification', class: 'button button--large'
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
%tr
|
|
2
|
+
%td{ :colspan => "3", :valign => "top" }
|
|
3
|
+
%table{ :border => "0", :cellpadding => "10", :cellspacing => "0", :width => "100%" }
|
|
4
|
+
%tr
|
|
5
|
+
%td{ :valign => "top" }
|
|
6
|
+
%h1{ :style => "margin: 0 0 6px; font: bold 20px arial; color: #{@config.heading_color};" }
|
|
7
|
+
= t('workarea.storefront.restock_mailer.heading', product_name: @product.name)
|
|
8
|
+
%p{ :style => "margin: 0 0 6px; font: 13px/1.5 arial; color: #{@config.text_color};" }
|
|
9
|
+
= t('workarea.storefront.restock_mailer.message')
|
|
10
|
+
%tr
|
|
11
|
+
%td{ :colspan => "3" }
|
|
12
|
+
%table{ :border => "0", :cellpadding => "10", :cellspacing => "0", :style => "color: #{@config.text_color}; font: 13px/1.5 arial; text-align: left; border-collapse: collapse;", :width => "600" }
|
|
13
|
+
%tbody
|
|
14
|
+
%tr
|
|
15
|
+
%td{ :style => "border: 1px solid #{@config.table_border_color};", :width => "150" }
|
|
16
|
+
%table{ :border => "0", :cellpadding => "10", :cellspacing => "0", :style => "color: #{@config.text_color}; font: 13px/1.5 arial; text-align: left; border-collapse: collapse;", :width => "200" }
|
|
17
|
+
%tr
|
|
18
|
+
%td
|
|
19
|
+
= link_to product_url(@product) do
|
|
20
|
+
= image_tag(product_image_url(@product.primary_image, :medium_thumb), alt: @product.name)
|
|
21
|
+
%td{ :style => "border: 1px solid #{@config.table_border_color};", :width => "450" }
|
|
22
|
+
%p{ :style => "margin: 0 0 6px; font: 13px/1.5 arial; color: #{@config.text_color};" }
|
|
23
|
+
%a{ :href => "#{storefront.product_url(@product, sku: @variant.sku)}", :style => "color: #{@link_color};", :target => "_blank" }
|
|
24
|
+
= @product.name
|
|
25
|
+
%p{ :style => "margin: 0 0 6px; font: 13px/1.5 arial; color: #{@config.text_color};" }
|
|
26
|
+
= @variant.name
|
|
27
|
+
- @variant.details.each do |name, value|
|
|
28
|
+
%p{ :style => "margin: 0 0 6px; font: 13px/1.5 arial; color: #{@config.text_color};" }
|
|
29
|
+
%strong
|
|
30
|
+
= name.titleize
|
|
31
|
+
\:
|
|
32
|
+
= value.first
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
= t('workarea.storefront.restock_mailer.heading', product_name: @product.name)
|
|
2
|
+
\===========================================
|
|
3
|
+
|
|
4
|
+
= "\r\n"
|
|
5
|
+
|
|
6
|
+
= t('workarea.storefront.restock_mailer.message')
|
|
7
|
+
= product_url(@product)
|
|
8
|
+
|
|
9
|
+
= "\r\n"
|
|
10
|
+
|
|
11
|
+
= t('workarea.storefront.restock_mailer.product')
|
|
12
|
+
\=======
|
|
13
|
+
= @product.name
|
|
14
|
+
\- #{@variant.sku}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
- if product.current_sku_unavailable?
|
|
2
|
+
#inventory_notifications.inventory-notifications
|
|
3
|
+
.inventory-notifications__signup
|
|
4
|
+
%p
|
|
5
|
+
%strong= t('workarea.storefront.products.this_item_is_out_of_stock')
|
|
6
|
+
%p
|
|
7
|
+
= t('workarea.storefront.products.inventory_notification_prompt')
|
|
8
|
+
= link_to t('workarea.storefront.products.sign_up_for_email_notification'), storefront.new_product_inventory_notification_path(product), data: { dialog_button: '' }
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Workarea
|
|
2
|
+
class RestockNotifier
|
|
3
|
+
include Sidekiq::Worker
|
|
4
|
+
include Sidekiq::CallbacksWorker
|
|
5
|
+
|
|
6
|
+
sidekiq_options(
|
|
7
|
+
enqueue_on: { Inventory::Sku => :save },
|
|
8
|
+
queue: 'low',
|
|
9
|
+
retry: false
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
def perform(id)
|
|
13
|
+
sku = Inventory::Sku.find(id)
|
|
14
|
+
|
|
15
|
+
return unless sku.purchasable?
|
|
16
|
+
|
|
17
|
+
InventoryNotification.unsent.where(sku: sku.id).each do |notification|
|
|
18
|
+
send_notification(notification);
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def send_notification(notification)
|
|
23
|
+
attrs = notification.attributes.values_at('product_id', 'sku', 'email')
|
|
24
|
+
notification.mark_as_sent! if Storefront::InventoryUpdateMailer.notify(*attrs).deliver
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
data/bin/rails
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# This command will automatically be run when you run 'rails' with Rails gems
|
|
3
|
+
# installed from the root of your application.
|
|
4
|
+
|
|
5
|
+
ENGINE_ROOT = File.expand_path('../..', __FILE__)
|
|
6
|
+
ENGINE_PATH = File.expand_path('../../lib/inventory_notifications/engine', __FILE__)
|
|
7
|
+
|
|
8
|
+
# Set up gems listed in the Gemfile.
|
|
9
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
|
|
10
|
+
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
|
|
11
|
+
|
|
12
|
+
require 'action_controller/railtie'
|
|
13
|
+
require 'action_view/railtie'
|
|
14
|
+
require 'action_mailer/railtie'
|
|
15
|
+
require 'rails/test_unit/railtie'
|
|
16
|
+
require 'sprockets/railtie'
|
|
17
|
+
|
|
18
|
+
require 'rails/engine/commands'
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
module Workarea
|
|
2
|
+
Plugin.append_partials(
|
|
3
|
+
'storefront.product_details',
|
|
4
|
+
'workarea/storefront/products/inventory_notifications'
|
|
5
|
+
)
|
|
6
|
+
|
|
7
|
+
Plugin.append_stylesheets(
|
|
8
|
+
'storefront.components',
|
|
9
|
+
'workarea/storefront/inventory_notifications/components/inventory_notifications'
|
|
10
|
+
)
|
|
11
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
en:
|
|
2
|
+
workarea:
|
|
3
|
+
storefront:
|
|
4
|
+
inventory_notifications:
|
|
5
|
+
flash_messages:
|
|
6
|
+
saved: You will be notified when this item becomes available.
|
|
7
|
+
error: Notification sign up failed. Please try again.
|
|
8
|
+
new:
|
|
9
|
+
instruction: To receive a notification of when the item comes back in stock, select an option and enter your email address below
|
|
10
|
+
select_options: Select options
|
|
11
|
+
title: "Sign up to be notified when %{product} comes back in stock"
|
|
12
|
+
notify_me: Notify Me
|
|
13
|
+
products:
|
|
14
|
+
this_item_is_out_of_stock: This item is out of stock.
|
|
15
|
+
inventory_notification_prompt: To receive a notification of when the item comes back in stock
|
|
16
|
+
enter_email_address_below: enter your email address below.
|
|
17
|
+
sign_up_for_email_notification: sign up for an email notification
|
|
18
|
+
restock_mailer:
|
|
19
|
+
heading: "%{product_name} is back in stock."
|
|
20
|
+
message: Get yours today!
|
|
21
|
+
product: Product
|
|
22
|
+
subject: Product back in stock
|
data/config/routes.rb
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Add routes for your plugin, like so:
|
|
2
|
+
#
|
|
3
|
+
# Workarea::Admin::Engine.routes.draw do
|
|
4
|
+
# resources :inventory_notifications
|
|
5
|
+
# end
|
|
6
|
+
#
|
|
7
|
+
Workarea::Storefront::Engine.routes.draw do
|
|
8
|
+
get 'inventory_notifications/:product_id/new' => 'inventory_notifications#new', as: :new_product_inventory_notification
|
|
9
|
+
post 'inventory_notifications/:product_id' => 'inventory_notifications#create', as: :create_product_inventory_notification
|
|
10
|
+
end
|