workarea-listrak 5.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.eslintrc.json +36 -0
- data/.esvmrc +5 -0
- data/.gitignore +32 -0
- data/CHANGELOG.md +322 -0
- data/Gemfile +14 -0
- data/README.md +130 -0
- data/Rakefile +53 -0
- data/app/assets/javascripts/workarea/admin/modules/listrak/list_events_select.js +83 -0
- data/app/assets/javascripts/workarea/storefront/listrak/adapters/listrak_adapter.js +110 -0
- data/app/assets/javascripts/workarea/storefront/listrak/listrak_config.js.erb +13 -0
- data/app/assets/javascripts/workarea/storefront/listrak/modules/listrak.js +64 -0
- data/app/controllers/workarea/admin/listrak/configurations_controller.rb +30 -0
- data/app/controllers/workarea/admin/listrak/events_controller.rb +17 -0
- data/app/helpers/workarea/listrak/analytics/helper.rb +44 -0
- data/app/models/workarea/listrak/configuration.rb +19 -0
- data/app/queries/workarea/categorization.decorator +7 -0
- data/app/services/workarea/listrak/data_api/customers.rb +26 -0
- data/app/services/workarea/listrak/data_api/orders.rb +26 -0
- data/app/services/workarea/listrak/data_api/products.rb +26 -0
- data/app/services/workarea/listrak/data_api.rb +63 -0
- data/app/services/workarea/listrak/email_api/contacts.rb +73 -0
- data/app/services/workarea/listrak/email_api/events.rb +44 -0
- data/app/services/workarea/listrak/email_api/lists.rb +21 -0
- data/app/services/workarea/listrak/email_api/messages.rb +50 -0
- data/app/services/workarea/listrak/email_api/transactional_messages.rb +32 -0
- data/app/services/workarea/listrak/email_api.rb +71 -0
- data/app/services/workarea/listrak/models/address.rb +83 -0
- data/app/services/workarea/listrak/models/contact.rb +67 -0
- data/app/services/workarea/listrak/models/contact_form.rb +24 -0
- data/app/services/workarea/listrak/models/customer_form.rb +209 -0
- data/app/services/workarea/listrak/models/event.rb +45 -0
- data/app/services/workarea/listrak/models/event_form.rb +25 -0
- data/app/services/workarea/listrak/models/list.rb +204 -0
- data/app/services/workarea/listrak/models/message_form.rb +147 -0
- data/app/services/workarea/listrak/models/order_form.rb +352 -0
- data/app/services/workarea/listrak/models/order_item.rb +197 -0
- data/app/services/workarea/listrak/models/product_form.rb +369 -0
- data/app/services/workarea/listrak/models/transactional_message_form.rb +21 -0
- data/app/services/workarea/listrak/oauth.rb +45 -0
- data/app/services/workarea/listrak/transactional_message.rb +83 -0
- data/app/view_models/workarea/admin/listrak_configuration_view_model.rb +17 -0
- data/app/views/workarea/admin/listrak/configurations/edit.html.haml +28 -0
- data/app/views/workarea/admin/listrak/events/index.json.jbuilder +4 -0
- data/app/views/workarea/admin/shared/_listrak_configuration_link.html.haml +1 -0
- data/app/views/workarea/storefront/checkouts/_listrak.html.haml +2 -0
- data/app/workers/workarea/listrak/customer_exporter.rb +22 -0
- data/app/workers/workarea/listrak/order_exporter.rb +22 -0
- data/app/workers/workarea/listrak/product_exporter.rb +50 -0
- data/app/workers/workarea/listrak/subscribe_email_signup.rb +34 -0
- data/app/workers/workarea/listrak/unsubscribe_email_signup.rb +27 -0
- data/bin/rails +18 -0
- data/bin/rake +16 -0
- data/bin/rspec +16 -0
- data/bin/rubocop +16 -0
- data/config/initializers/append_points.rb +28 -0
- data/config/initializers/configuration.rb +8 -0
- data/config/locales/en.yml +17 -0
- data/config/routes.rb +10 -0
- data/docs/Listrak Technical Integration Guide.docx +0 -0
- data/lib/generators/workarea/listrak/message/USAGE +9 -0
- data/lib/generators/workarea/listrak/message/message_generator.rb +15 -0
- data/lib/generators/workarea/listrak/message/templates/message.rb.erb +24 -0
- data/lib/workarea/listrak/analytics.rb +17 -0
- data/lib/workarea/listrak/bogus_data_api/customers.rb +9 -0
- data/lib/workarea/listrak/bogus_data_api/orders.rb +9 -0
- data/lib/workarea/listrak/bogus_data_api/products.rb +9 -0
- data/lib/workarea/listrak/bogus_data_api/proxy_client.rb +29 -0
- data/lib/workarea/listrak/bogus_data_api.rb +46 -0
- data/lib/workarea/listrak/bogus_email_api/contacts.rb +8 -0
- data/lib/workarea/listrak/bogus_email_api/events.rb +23 -0
- data/lib/workarea/listrak/bogus_email_api/lists.rb +63 -0
- data/lib/workarea/listrak/bogus_email_api/proxy_client.rb +29 -0
- data/lib/workarea/listrak/bogus_email_api/transactional_messages.rb +9 -0
- data/lib/workarea/listrak/bogus_email_api.rb +51 -0
- data/lib/workarea/listrak/engine.rb +12 -0
- data/lib/workarea/listrak/error.rb +39 -0
- data/lib/workarea/listrak/version.rb +5 -0
- data/lib/workarea/listrak.rb +57 -0
- data/readme/listrak-admin.png +0 -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/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 +18 -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 +86 -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/new_framework_defaults.rb +21 -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 +38 -0
- data/test/dummy/config/spring.rb +6 -0
- data/test/dummy/config.ru +5 -0
- data/test/dummy/db/seeds.rb +2 -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 +0 -0
- data/test/factories/workarea/factories/listrak.rb +15 -0
- data/test/helpers/workarea/listrak/analytics/helper_test.rb +38 -0
- data/test/integration/workarea/admin/listrak/configuration_integration_test.rb +26 -0
- data/test/integration/workarea/admin/listrak/events_integration_test.rb +21 -0
- data/test/lib/generators/workarea/listrak/message_generator_test.rb +26 -0
- data/test/queries/workarea/categorization_test.decorator +15 -0
- data/test/services/workarea/listrak/data_api/customers_test.rb +35 -0
- data/test/services/workarea/listrak/data_api/orders_test.rb +24 -0
- data/test/services/workarea/listrak/data_api/products_test.rb +27 -0
- data/test/services/workarea/listrak/email_api/contacts_test.rb +55 -0
- data/test/services/workarea/listrak/email_api/events_test.rb +51 -0
- data/test/services/workarea/listrak/email_api/lists_test.rb +45 -0
- data/test/services/workarea/listrak/email_api/messages_test.rb +28 -0
- data/test/services/workarea/listrak/email_api/transactional_messages_test.rb +50 -0
- data/test/services/workarea/listrak/oauth_test.rb +27 -0
- data/test/services/workarea/listrak/transactional_message_test.rb +48 -0
- data/test/support/workarea/listrak/test_order_confirmation_email.rb +116 -0
- data/test/support/workarea/listrak/vcr_config.rb +31 -0
- data/test/system/workarea/listrak_system_test.rb +75 -0
- data/test/test_helper.rb +16 -0
- data/test/vcr_cassettes/listrak/data_api/customers_import-successful.yml +88 -0
- data/test/vcr_cassettes/listrak/data_api/orders_import-successful.yml +90 -0
- data/test/vcr_cassettes/listrak/data_api/products_import-successful.yml +88 -0
- data/test/vcr_cassettes/listrak/email_api/contacts_get-successful.yml +87 -0
- data/test/vcr_cassettes/listrak/email_api/contacts_upsert-already_unsubscribed.yml +90 -0
- data/test/vcr_cassettes/listrak/email_api/contacts_upsert-successful.yml +87 -0
- data/test/vcr_cassettes/listrak/email_api/events_create-invalid_parameter.yml +90 -0
- data/test/vcr_cassettes/listrak/email_api/events_create-successful.yml +87 -0
- data/test/vcr_cassettes/listrak/email_api/events_get-successful.yml +88 -0
- data/test/vcr_cassettes/listrak/email_api/lists_all-successful.yml +88 -0
- data/test/vcr_cassettes/listrak/email_api/messages_create-successful.yml +88 -0
- data/test/vcr_cassettes/listrak/email_api/transactional_messages_create-successful.yml +89 -0
- data/test/vcr_cassettes/listrak/oauth-successful.yml +44 -0
- data/test/vcr_cassettes/listrak/oauth-unsuccessful.yml +46 -0
- data/test/vcr_cassettes/listrak/system_tests/footer_email_signup-successful.yml +171 -0
- data/test/vcr_cassettes/listrak/system_tests/footer_email_signup_overrides_unsubscribe.yml +255 -0
- data/test/vcr_cassettes/listrak/system_tests/unsubscribing.yml +593 -0
- data/test/workers/workarea/listrak/order_exporter_test.rb +31 -0
- data/test/workers/workarea/listrak/product_exporter_test.rb +62 -0
- data/workarea-listrak.gemspec +16 -0
- metadata +223 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Admin
|
3
|
+
class ListrakConfigurationViewModel < ApplicationViewModel
|
4
|
+
def all_lists
|
5
|
+
@all_lists ||= Workarea::Listrak.email.lists.all
|
6
|
+
end
|
7
|
+
|
8
|
+
def event_options
|
9
|
+
events.map { |event| [event.name, event.id] }
|
10
|
+
end
|
11
|
+
|
12
|
+
def events
|
13
|
+
@events ||= Workarea::Listrak.email.events.all default_list_id
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
- @page_title = t('workarea.admin.listrak_configuration.edit.title')
|
2
|
+
|
3
|
+
.view
|
4
|
+
.view__header
|
5
|
+
.view__heading
|
6
|
+
= link_to "↑ #{t('workarea.admin.dashboards.settings.settings_dashboard')}", settings_dashboards_path
|
7
|
+
%h1= t('workarea.admin.listrak_configuration.edit.title')
|
8
|
+
|
9
|
+
.view__container
|
10
|
+
= form_tag listrak_configuration_path, method: :patch, data: { unsaved_changes: '' } do
|
11
|
+
.property
|
12
|
+
= label_tag 'default_list_id', t('workarea.admin.listrak_configuration.edit.default_list'), class: 'property__name'
|
13
|
+
= select_tag 'default_list_id', options_from_collection_for_select(@configuration.all_lists, 'id', 'name', @configuration.default_list_id)
|
14
|
+
|
15
|
+
.property
|
16
|
+
= label_tag 'external_event_ids[]', class: 'property__name' do
|
17
|
+
%span= t('workarea.admin.listrak_configuration.edit.external_events')
|
18
|
+
|
19
|
+
= link_to "#event_ids", data: { tooltip: '' } do
|
20
|
+
= inline_svg('workarea/admin/icons/help.svg', class: 'svg-icon svg-icon--small svg-icon--blue', title: t('workarea.admin.content.form.tooltip.title'))
|
21
|
+
#event_ids.tooltip-content= t('workarea.admin.listrak_configuration.edit.event_itds_tooltip')
|
22
|
+
|
23
|
+
= select_tag "external_event_ids[]", options_for_select(@configuration.event_options, @configuration.external_event_ids), multiple: true, data: { listrak_events_select: "" }
|
24
|
+
|
25
|
+
|
26
|
+
.workflow-bar
|
27
|
+
.grid.grid--auto.grid--right.grid--middle
|
28
|
+
.grid__cell= button_tag t('workarea.admin.listrak_configuration.edit.button'), value: 'save_settings', class: 'workflow-bar__button workflow-bar__button--update'
|
@@ -0,0 +1 @@
|
|
1
|
+
%li{ class: "primary-nav__item" }= link_to t('workarea.admin.shared.primary_nav.listrak_configuration_title'), edit_listrak_configuration_path, class: navigation_link_classes(edit_listrak_configuration_path)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Listrak
|
3
|
+
class CustomerExporter
|
4
|
+
include Sidekiq::Worker
|
5
|
+
include Sidekiq::CallbacksWorker
|
6
|
+
|
7
|
+
sidekiq_options(
|
8
|
+
enqueue_on: {
|
9
|
+
Workarea::User => :save
|
10
|
+
}
|
11
|
+
)
|
12
|
+
|
13
|
+
def perform(user_id)
|
14
|
+
user = Workarea::User.find user_id
|
15
|
+
|
16
|
+
customer_form = Listrak::Models::CustomerForm.new user
|
17
|
+
|
18
|
+
Listrak.data.customers.import [customer_form]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Listrak
|
3
|
+
class OrderExporter
|
4
|
+
include Sidekiq::Worker
|
5
|
+
include Sidekiq::CallbacksWorker
|
6
|
+
|
7
|
+
sidekiq_options(
|
8
|
+
enqueue_on: {
|
9
|
+
Workarea::Order => :place
|
10
|
+
}
|
11
|
+
)
|
12
|
+
|
13
|
+
def perform(order_id)
|
14
|
+
order = Workarea::Order.find order_id
|
15
|
+
|
16
|
+
order_form = Listrak::Models::OrderForm.new order
|
17
|
+
|
18
|
+
Listrak.data.orders.import [order_form]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Listrak
|
3
|
+
class ProductExporter
|
4
|
+
include Sidekiq::Worker
|
5
|
+
include Sidekiq::CallbacksWorker
|
6
|
+
|
7
|
+
sidekiq_options(
|
8
|
+
enqueue_on: {
|
9
|
+
Catalog::Product => :save,
|
10
|
+
Shipping::Sku => :save,
|
11
|
+
Pricing::Sku => :save,
|
12
|
+
Pricing::Price => :save,
|
13
|
+
with: -> { ProductExporter.perform_with(self) }
|
14
|
+
}
|
15
|
+
)
|
16
|
+
|
17
|
+
def self.perform_with(model)
|
18
|
+
case model.class.name
|
19
|
+
when "Workarea::Pricing::Price"
|
20
|
+
[model.sku.class.name, model.sku.id]
|
21
|
+
else
|
22
|
+
[model.class.name, model.id]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def perform(class_name, id)
|
27
|
+
product, skus =
|
28
|
+
if class_name == "Workarea::Catalog::Product"
|
29
|
+
prod = Catalog::Product.find(id)
|
30
|
+
[prod, prod.skus]
|
31
|
+
else
|
32
|
+
[Catalog::Product.find_by_sku(id), [id]]
|
33
|
+
end
|
34
|
+
|
35
|
+
return unless product.present?
|
36
|
+
|
37
|
+
inventory = Inventory::Collection.new product.skus
|
38
|
+
pricing = Inventory::Collection.new product.skus
|
39
|
+
|
40
|
+
listrak_products = skus.map do |sku|
|
41
|
+
Listrak::Models::ProductForm.new product,
|
42
|
+
pricing_sku: pricing.for_sku(sku),
|
43
|
+
inventory_sku: inventory.for_sku(sku)
|
44
|
+
end
|
45
|
+
|
46
|
+
Workarea::Listrak.data.products.import(listrak_products)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Listrak
|
3
|
+
class SubscribeEmailSignup
|
4
|
+
include Sidekiq::Worker
|
5
|
+
include Sidekiq::CallbacksWorker
|
6
|
+
|
7
|
+
sidekiq_options(
|
8
|
+
enqueue_on: {
|
9
|
+
Email::Signup => :create
|
10
|
+
},
|
11
|
+
queue: "low",
|
12
|
+
retry: true
|
13
|
+
)
|
14
|
+
|
15
|
+
def perform(id)
|
16
|
+
signup = Email::Signup.find id
|
17
|
+
list_id = Listrak.configuration.default_list_id
|
18
|
+
event_ids = Array.wrap(Listrak.configuration.external_event_ids).to_csv(row_sep: nil).presence
|
19
|
+
|
20
|
+
contact = Listrak::Models::ContactForm.new(
|
21
|
+
email: signup.email,
|
22
|
+
subscription_state: 'Subscribed'
|
23
|
+
)
|
24
|
+
|
25
|
+
options = {
|
26
|
+
overrideUnsubscribe: true,
|
27
|
+
eventIds: event_ids
|
28
|
+
}.compact
|
29
|
+
|
30
|
+
Listrak.email.contacts.upsert list_id, contact, options
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Listrak
|
3
|
+
class UnsubscribeEmailSignup
|
4
|
+
include Sidekiq::Worker
|
5
|
+
include Sidekiq::CallbacksWorker
|
6
|
+
|
7
|
+
sidekiq_options(
|
8
|
+
enqueue_on: {
|
9
|
+
Email::Signup => :destroy,
|
10
|
+
with: -> { [email] }
|
11
|
+
},
|
12
|
+
queue: "low",
|
13
|
+
retry: true
|
14
|
+
)
|
15
|
+
|
16
|
+
def perform(email)
|
17
|
+
contact = Listrak::Models::ContactForm.new(
|
18
|
+
email: email,
|
19
|
+
subscription_state: 'Unsubscribed'
|
20
|
+
)
|
21
|
+
|
22
|
+
list_id = Listrak.configuration.default_list_id
|
23
|
+
Listrak.email.contacts.upsert list_id, contact, overrideUnsubscribe: true
|
24
|
+
end
|
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/workarea/listrak/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"
|
data/bin/rake
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rake' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("rake", "rake")
|
data/bin/rspec
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rspec' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("rspec-core", "rspec")
|
data/bin/rubocop
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rubocop' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("rubocop", "rubocop")
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Analytics adapter for Listrak tag management
|
2
|
+
Workarea::Plugin.append_javascripts(
|
3
|
+
"storefront.modules",
|
4
|
+
"workarea/storefront/listrak/adapters/listrak_adapter",
|
5
|
+
"workarea/storefront/listrak/modules/listrak"
|
6
|
+
)
|
7
|
+
|
8
|
+
# Pass configuration for the Listrak adapter to the client-side
|
9
|
+
Workarea::Plugin.append_javascripts(
|
10
|
+
"storefront.config",
|
11
|
+
"workarea/storefront/listrak/listrak_config"
|
12
|
+
)
|
13
|
+
|
14
|
+
Workarea::Plugin.append_javascripts(
|
15
|
+
"admin.modules",
|
16
|
+
"workarea/admin/modules/listrak/list_events_select"
|
17
|
+
)
|
18
|
+
|
19
|
+
# Tracking pixel for checkout conversion tracking
|
20
|
+
Workarea::Plugin.append_javascripts(
|
21
|
+
"storefront.checkout_confirmation",
|
22
|
+
"workarea/storefront/checkouts/listrak"
|
23
|
+
)
|
24
|
+
|
25
|
+
Workarea.append_partials(
|
26
|
+
"admin.settings_menu",
|
27
|
+
"workarea/admin/shared/listrak_configuration_link"
|
28
|
+
)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
en:
|
2
|
+
workarea:
|
3
|
+
admin:
|
4
|
+
listrak_configuration:
|
5
|
+
edit:
|
6
|
+
flash_messages:
|
7
|
+
updated: Listrak configuration has been updated
|
8
|
+
save_error: There was a problem updating the configuration
|
9
|
+
title: Listrak Configuration
|
10
|
+
default_list: Default List
|
11
|
+
external_events: External Events
|
12
|
+
events_select_placeholder: Choose external events
|
13
|
+
event_itds_tooltip: External event ids to trigger when subscribing the customer
|
14
|
+
button: Save Listrak Configuration
|
15
|
+
shared:
|
16
|
+
primary_nav:
|
17
|
+
listrak_configuration_title: Listrak Configuration
|
data/config/routes.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
Workarea::Admin::Engine.routes.draw do
|
2
|
+
scope '(:locale)', constraints: Workarea::I18n.routes_constraint do
|
3
|
+
namespace :listrak do
|
4
|
+
resource :configuration, only: [:edit, :update]
|
5
|
+
resources :lists, only: [] do
|
6
|
+
resources :events, only: :index
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
Binary file
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Listrak
|
3
|
+
# Generate new Message classes for your host app (or plugin).
|
4
|
+
class MessageGenerator < Rails::Generators::NamedBase
|
5
|
+
source_root File.expand_path("../templates", __FILE__)
|
6
|
+
|
7
|
+
def copy_agent
|
8
|
+
template(
|
9
|
+
"message.rb.erb",
|
10
|
+
"app/messages/workarea/#{file_name}_message.rb"
|
11
|
+
)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Workarea
|
2
|
+
class <%= class_name %>Message
|
3
|
+
include Listrak::TransactionalMessage
|
4
|
+
|
5
|
+
# message_id 45678
|
6
|
+
# message_attributes(
|
7
|
+
# name: 12345
|
8
|
+
# )
|
9
|
+
#
|
10
|
+
# def initialize(order)
|
11
|
+
# @order = order
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# def name
|
15
|
+
# "#{@order.first_name} #{@order.last_name}"
|
16
|
+
# end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def email_address
|
21
|
+
# TODO
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Listrak
|
3
|
+
module Analytics
|
4
|
+
# Shorthand for analytics module specific configuration.
|
5
|
+
def self.config
|
6
|
+
Workarea.config.listrak.analytics
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.javascript_config
|
10
|
+
{
|
11
|
+
merchantId: config[:merchant_id],
|
12
|
+
emailIds: config[:email_capture_ids]
|
13
|
+
}.compact.to_json
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Listrak
|
3
|
+
class BogusDataApi
|
4
|
+
class ProxyClient
|
5
|
+
attr_reader :client_name, :client
|
6
|
+
|
7
|
+
def initialize(client_name, client)
|
8
|
+
@client_name = client_name
|
9
|
+
@client = client
|
10
|
+
end
|
11
|
+
|
12
|
+
def method_missing(method, *args)
|
13
|
+
if client.respond_to?(method)
|
14
|
+
if BogusDataApi.store_requests
|
15
|
+
BogusDataApi.requests[client_name][method] << args
|
16
|
+
end
|
17
|
+
client.send(method, *args)
|
18
|
+
else
|
19
|
+
super
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def respond_to_missing?(method, include_all = false)
|
24
|
+
client.respond_to?(method) || super
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Listrak
|
3
|
+
# @!visibility private
|
4
|
+
class BogusDataApi
|
5
|
+
require 'workarea/listrak/bogus_data_api/proxy_client'
|
6
|
+
require 'workarea/listrak/bogus_data_api/products'
|
7
|
+
require 'workarea/listrak/bogus_data_api/customers'
|
8
|
+
require 'workarea/listrak/bogus_data_api/orders'
|
9
|
+
|
10
|
+
thread_cattr_accessor :requests, :store_requests
|
11
|
+
|
12
|
+
def self.reset_requests!
|
13
|
+
self.requests = Hash.new do |client_hash, client_class|
|
14
|
+
client_hash[client_class] = Hash.new do |method_hash, method_name|
|
15
|
+
method_hash[method_name] = []
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.total_request_count
|
21
|
+
self.requests.sum do |client, method_calls|
|
22
|
+
method_calls.sum { |_method, calls| calls.size }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
self.store_requests = false
|
27
|
+
self.reset_requests!
|
28
|
+
|
29
|
+
def method_missing(method)
|
30
|
+
client_class = client(method)
|
31
|
+
|
32
|
+
if client_class
|
33
|
+
ProxyClient.new(method, client_class.new)
|
34
|
+
else
|
35
|
+
super
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def client(client_name)
|
42
|
+
BogusDataApi.const_get(client_name.to_s.camelize) rescue nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Listrak
|
3
|
+
class BogusEmailApi::Events
|
4
|
+
def all(_list_id)
|
5
|
+
events = [
|
6
|
+
{
|
7
|
+
"eventId" => 12714,
|
8
|
+
"eventName" => "Test",
|
9
|
+
"eventGroupId" => 0,
|
10
|
+
"status" => "Active"
|
11
|
+
},
|
12
|
+
{
|
13
|
+
"eventId" => 12715,
|
14
|
+
"eventName" => "footer signup",
|
15
|
+
"eventGroupId" => 0,
|
16
|
+
"status" => "Active"
|
17
|
+
}
|
18
|
+
]
|
19
|
+
events.map { |event| Listrak::Models::Event.new event }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Listrak
|
3
|
+
class BogusEmailApi::Lists
|
4
|
+
def all
|
5
|
+
lists = [
|
6
|
+
{
|
7
|
+
"listId" => 349956,
|
8
|
+
"listName" => "My First List",
|
9
|
+
"folderId" => 0,
|
10
|
+
"ipPoolId" => 11,
|
11
|
+
"bounceDomainAlias" => "",
|
12
|
+
"bounceHandling" => "Standard",
|
13
|
+
"bounceUnsubscribeCount" => 5,
|
14
|
+
"createDate" => "2015-08-31T16:02:41.65",
|
15
|
+
"enableBrowserLink" => false,
|
16
|
+
"enableDoubleOptIn" => false,
|
17
|
+
"enableDynamicContent" => false,
|
18
|
+
"enableGoogleAnalytics" => false,
|
19
|
+
"enableInternationalization" => false,
|
20
|
+
"enableListHygiene" => true,
|
21
|
+
"enableListRemovalHeader" => true,
|
22
|
+
"enableListRemovalLink" => true,
|
23
|
+
"enableListrakAnalytics" => false,
|
24
|
+
"enableSpamScorePersonalization" => false,
|
25
|
+
"enableToNamePersonalization" => false,
|
26
|
+
"fromEmail" => "",
|
27
|
+
"fromName" => "",
|
28
|
+
"googleTrackingDomains" => [],
|
29
|
+
"linkDomainAlias" => "",
|
30
|
+
"mediaDomainAlias" => ""
|
31
|
+
},
|
32
|
+
{
|
33
|
+
"listId" => 349984,
|
34
|
+
"listName" => "gem-testing",
|
35
|
+
"folderId" => 0,
|
36
|
+
"ipPoolId" => 11,
|
37
|
+
"bounceDomainAlias" => "",
|
38
|
+
"bounceHandling" => "Standard",
|
39
|
+
"bounceUnsubscribeCount" => 5,
|
40
|
+
"createDate" => "2015-09-02T14:42:38.91",
|
41
|
+
"enableBrowserLink" => false,
|
42
|
+
"enableDoubleOptIn" => false,
|
43
|
+
"enableDynamicContent" => false,
|
44
|
+
"enableGoogleAnalytics" => false,
|
45
|
+
"enableInternationalization" => false,
|
46
|
+
"enableListHygiene" => true,
|
47
|
+
"enableListRemovalHeader" => true,
|
48
|
+
"enableListRemovalLink" => true,
|
49
|
+
"enableListrakAnalytics" => false,
|
50
|
+
"enableSpamScorePersonalization" => false,
|
51
|
+
"enableToNamePersonalization" => false,
|
52
|
+
"fromEmail" => "mac@weblinc.com",
|
53
|
+
"fromName" => "WebLinc Developer",
|
54
|
+
"googleTrackingDomains" => [],
|
55
|
+
"linkDomainAlias" => "",
|
56
|
+
"mediaDomainAlias" => ""
|
57
|
+
}
|
58
|
+
]
|
59
|
+
lists.map { |list| Listrak::Models::List.new list }
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Listrak
|
3
|
+
class BogusEmailApi
|
4
|
+
class ProxyClient
|
5
|
+
attr_reader :client_name, :client
|
6
|
+
|
7
|
+
def initialize(client_name, client)
|
8
|
+
@client_name = client_name
|
9
|
+
@client = client
|
10
|
+
end
|
11
|
+
|
12
|
+
def method_missing(method, *args)
|
13
|
+
if client.respond_to?(method)
|
14
|
+
if BogusEmailApi.store_requests
|
15
|
+
BogusEmailApi.requests[client_name][method] << args
|
16
|
+
end
|
17
|
+
client.send(method, *args)
|
18
|
+
else
|
19
|
+
super
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def respond_to_missing?(method, include_all = false)
|
24
|
+
client.respond_to?(method) || super
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|