spree_multi_share 1.3.1 → 1.3.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 +4 -4
- data/.gitignore +20 -0
- data/.rspec +1 -0
- data/Gemfile +7 -0
- data/LICENSE +26 -0
- data/README.md +4 -0
- data/Rakefile +15 -0
- data/Versionfile +11 -0
- data/app/assets/images/spree/aol_logo.jpg +0 -0
- data/app/assets/images/spree/cs_logo.gif +0 -0
- data/app/assets/images/spree/cs_signup.png +0 -0
- data/app/assets/images/spree/gmail_logo.jpg +0 -0
- data/app/assets/images/spree/msn_logo.jpg +0 -0
- data/app/assets/images/spree/osx_logo.jpg +0 -0
- data/app/assets/images/spree/outlook_logo.png +0 -0
- data/app/assets/images/spree/windows_logo.png +0 -0
- data/app/assets/javascripts/admin/spree_multi_share.js +1 -0
- data/app/assets/javascripts/spree/cloud_sender.js +2 -0
- data/app/assets/javascripts/store/spree_multi_share.js +1 -0
- data/app/assets/stylesheets/admin/spree_multi_share.css +3 -0
- data/app/assets/stylesheets/spree/cloud_sender.css +4 -0
- data/app/assets/stylesheets/store/spree_multi_share.css +3 -0
- data/app/controllers/spree/admin/cloudsponge_settings_controller.rb +15 -0
- data/app/controllers/spree/cloud_sender_controller.rb +175 -0
- data/app/helpers/spree/cloud_sender_helper.rb +2 -0
- data/app/mailers/spree/cloud_mailer.rb +21 -0
- data/app/models/spree/cloudsponge_configuration.rb +5 -0
- data/app/models/spree/mail_to_cloud.rb +42 -0
- data/app/overrides/add_cloudsponge_settings_to_admin_configurations_menu.rb +5 -0
- data/app/overrides/add_email_to_cloud_link_to_products.rb +7 -0
- data/app/views/spree/admin/cloudsponge_settings/edit.html.erb +39 -0
- data/app/views/spree/cloud_mailer/mail_to_cloud.text.erb +3 -0
- data/app/views/spree/cloud_sender/importAOL.html.erb +56 -0
- data/app/views/spree/cloud_sender/importCheck.html.erb +1 -0
- data/app/views/spree/cloud_sender/importContacts.html.erb +104 -0
- data/app/views/spree/cloud_sender/importGmail.html.erb +62 -0
- data/app/views/spree/cloud_sender/importOSX.html.erb +95 -0
- data/app/views/spree/cloud_sender/importOutlook.html.erb +95 -0
- data/app/views/spree/cloud_sender/send_mail.html.erb +150 -0
- data/app/views/spree/products/_mail_to_cloud.text.erb +14 -0
- data/config/locales/en.yml +18 -0
- data/config/routes.rb +18 -0
- data/db/migrate/20130125181027_create_spree_mail_to_clouds.rb +8 -0
- data/lib/generators/spree_multi_share/install/install_generator.rb +29 -0
- data/lib/spree_multi_share/engine.rb +29 -0
- data/lib/spree_multi_share.rb +2 -0
- data/script/rails +7 -0
- data/spec/controllers/spree/cloud_sender_controller_spec.rb +5 -0
- data/spec/helpers/spree/cloud_sender_helper_spec.rb +15 -0
- data/spec/mailers/spree/cloud_mailer_spec.rb +5 -0
- data/spec/models/spree/mail_to_cloud_spec.rb +5 -0
- data/spec/spec_helper.rb +46 -0
- data/spree_multi_share.gemspec +30 -0
- metadata +61 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 212c006497ba0fc8a3e87a33c004649d856eca2e
|
4
|
+
data.tar.gz: a4d6401a397228036ac898a3b63db6deb82fb947
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 997b1ea58cf48310d7a5661ca585d69757bb664e4a2d7863bd642b88a3f1d45567905d9b4eaa05664ebeaaebea4ebbb3d9d82d3afb67166e49cfc0954139bb52
|
7
|
+
data.tar.gz: aa9205fea095fa7f9c02dcc4096a6f36369855319cc20186660532f05ab704574c22010fbddd54056b9becb2cccb521c421a776be1c9e47ffd4a1387c98495b8
|
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
Copyright (c) 2013 [name of plugin creator]
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without modification,
|
5
|
+
are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
* Redistributions of source code must retain the above copyright notice,
|
8
|
+
this list of conditions and the following disclaimer.
|
9
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
this list of conditions and the following disclaimer in the documentation
|
11
|
+
and/or other materials provided with the distribution.
|
12
|
+
* Neither the name Spree nor the names of its contributors may be used to
|
13
|
+
endorse or promote products derived from this software without specific
|
14
|
+
prior written permission.
|
15
|
+
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
17
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
18
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
19
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
20
|
+
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
21
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
22
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
23
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
24
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
25
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
26
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
require 'spree/core/testing_support/common_rake'
|
6
|
+
|
7
|
+
RSpec::Core::RakeTask.new
|
8
|
+
|
9
|
+
task :default => [:spec]
|
10
|
+
|
11
|
+
desc 'Generates a dummy app for testing'
|
12
|
+
task :test_app do
|
13
|
+
ENV['LIB_NAME'] = 'spree_multi_share'
|
14
|
+
Rake::Task['common:test_app'].invoke
|
15
|
+
end
|
data/Versionfile
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# This file is used to designate compatibilty with different versions of Spree
|
2
|
+
# Please see http://spreecommerce.com/documentation/extensions.html#versionfile for details
|
3
|
+
|
4
|
+
# Examples
|
5
|
+
#
|
6
|
+
# '1.2.x' => { :branch => 'master' }
|
7
|
+
# '1.1.x' => { :branch => '1-1-stable' }
|
8
|
+
# '1.0.x' => { :branch => '1-0-stable' }
|
9
|
+
# '0.70.x' => { :branch => '0-70-stable' }
|
10
|
+
# '0.40.x' => { :tag => 'v1.0.0', :version => '1.0.0' }
|
11
|
+
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
//= require admin/spree_core
|
@@ -0,0 +1 @@
|
|
1
|
+
//= require store/spree_core
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Spree
|
2
|
+
module Admin
|
3
|
+
class CloudspongeSettingsController < BaseController
|
4
|
+
def update
|
5
|
+
Spree::Cloudsponge::Config.set(params[:preferences])
|
6
|
+
|
7
|
+
respond_to do |format|
|
8
|
+
format.html {
|
9
|
+
redirect_to edit_admin_cloudsponge_settings_path
|
10
|
+
}
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,175 @@
|
|
1
|
+
class Spree::CloudSenderController < Spree::BaseController
|
2
|
+
require 'rubygems'
|
3
|
+
|
4
|
+
include Spree::Core::ControllerHelpers::Order
|
5
|
+
|
6
|
+
before_filter :find_object, :only => [:send_mail, :mail_to_cloud, :send_message]
|
7
|
+
|
8
|
+
def send_mail
|
9
|
+
if request.get?
|
10
|
+
@mail_to_cloud = Spree::MailToCloud.new(:sender_email => current_user.try(:email))
|
11
|
+
else
|
12
|
+
mail_to_cloud
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def importGmail
|
17
|
+
client = HTTPClient.new
|
18
|
+
body = { 'service' => params[:service], 'domain_key' => Spree::Cloudsponge::Config[:domain_key], 'domain_password' => Spree::Cloudsponge::Config[:domain_password], 'referrer' => 'sweet_spree' }
|
19
|
+
response = client.post('https://api.cloudsponge.com/begin_import/user_consent.json', body)
|
20
|
+
data = ActiveSupport::JSON.decode(response.body)
|
21
|
+
@authURL = data["url"]
|
22
|
+
@importID = data["import_id"]
|
23
|
+
|
24
|
+
respond_to do | format |
|
25
|
+
format.html {render :layout => false}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def importAOL
|
30
|
+
client = HTTPClient.new
|
31
|
+
body = { 'service' => params[:service], 'username' => params[:username], 'password' => params[:password], 'domain_key' => Spree::Cloudsponge::Config[:domain_key], 'domain_password' => Spree::Cloudsponge::Config[:domain_password], 'referrer' => 'sweet_spree' }
|
32
|
+
response = client.post('https://api.cloudsponge.com/begin_import/import.json', body)
|
33
|
+
data = ActiveSupport::JSON.decode(response.body)
|
34
|
+
@importID = data["import_id"]
|
35
|
+
|
36
|
+
respond_to do | format |
|
37
|
+
format.html {render :layout => false}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def importOutlook
|
42
|
+
client = HTTPClient.new
|
43
|
+
body = { 'service' => 'OUTLOOK', 'domain_key' => Spree::Cloudsponge::Config[:domain_key], 'domain_password' => Spree::Cloudsponge::Config[:domain_password], 'referrer' => 'sweet_spree' }
|
44
|
+
response = client.post('https://api.cloudsponge.com/begin_import/desktop_applet.json', body)
|
45
|
+
data = ActiveSupport::JSON.decode(response.body)
|
46
|
+
@authURL = data["url"]
|
47
|
+
@importID = data["import_id"]
|
48
|
+
|
49
|
+
respond_to do | format |
|
50
|
+
format.html {render :layout => false}
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def importOSX
|
55
|
+
client = HTTPClient.new
|
56
|
+
body = { 'service' => 'ADDRESSBOOK', 'domain_key' => Spree::Cloudsponge::Config[:domain_key], 'domain_password' => Spree::Cloudsponge::Config[:domain_password], 'referrer' => 'sweet_spree' }
|
57
|
+
response = client.post('https://api.cloudsponge.com/begin_import/desktop_applet.json', body)
|
58
|
+
data = ActiveSupport::JSON.decode(response.body)
|
59
|
+
@authURL = data["url"]
|
60
|
+
@importID = data["import_id"]
|
61
|
+
|
62
|
+
respond_to do | format |
|
63
|
+
format.html {render :layout => false}
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def importCheck
|
68
|
+
@success = false;
|
69
|
+
|
70
|
+
client = HTTPClient.new
|
71
|
+
body = { 'import_id' => params[:id], 'domain_key' => Spree::Cloudsponge::Config[:domain_key], 'domain_password' => Spree::Cloudsponge::Config[:domain_password] }
|
72
|
+
response = client.get('https://api.cloudsponge.com/events/' + params[:id], body)
|
73
|
+
@data = ActiveSupport::JSON.decode(response.body)
|
74
|
+
if (@data["events"].count > 0)
|
75
|
+
if ((@data["events"][0]["event_type"] == "COMPLETE") && (@data["events"][0]["status"] == "COMPLETED"))
|
76
|
+
@success = "true"
|
77
|
+
elsif ((@data["events"][0]["event_type"] == "COMPLETE") && (@data["events"][0]["status"] == "ERROR"))
|
78
|
+
@success = "error"
|
79
|
+
else
|
80
|
+
@success = "false"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
respond_to do | format |
|
85
|
+
format.html {render :layout => false}
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def importContacts
|
90
|
+
client = HTTPClient.new
|
91
|
+
body = { 'import_id' => params[:id], 'domain_key' => Spree::Cloudsponge::Config[:domain_key], 'domain_password' => Spree::Cloudsponge::Config[:domain_password] }
|
92
|
+
response = client.get('https://api.cloudsponge.com/contacts/' + params[:id], body)
|
93
|
+
@data = ActiveSupport::JSON.decode(response.body)
|
94
|
+
@contacts_with_dups = @data["contacts"].sort {|x,y| x["first_name"].capitalize <=> y["first_name"].capitalize}
|
95
|
+
@contacts = Array.new
|
96
|
+
emailList = Array.new
|
97
|
+
@contacts_with_dups.each do |contact|
|
98
|
+
if !(contact["email"].nil?) && !(contact["email"][0].nil?) && !(contact["email"][0]["address"].nil?) && (contact["email"][0]["address"] != "")
|
99
|
+
if !(emailList.include?(contact["email"][0]["address"]))
|
100
|
+
emailList << contact["email"][0]["address"]
|
101
|
+
@contacts << contact
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
respond_to do | format |
|
107
|
+
format.html {render :layout => false}
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def cloudsponge_proxy
|
112
|
+
importer = Cloudsponge::ContactImporter.new(Spree::Cloudsponge::Config[:domain_key], Spree::Cloudsponge::Config[:domain_password])
|
113
|
+
url = Cloudsponge::URL_BASE + 'auth?' + request.query_string
|
114
|
+
|
115
|
+
response = if request.post?
|
116
|
+
Cloudsponge::Utility::post_url(url, request.parameters)
|
117
|
+
elsif request.get?
|
118
|
+
Cloudsponge::Utility::get_url(url)
|
119
|
+
else
|
120
|
+
nil
|
121
|
+
end
|
122
|
+
|
123
|
+
if response.is_a?(Net::HTTPRedirection)
|
124
|
+
redirect_to response["location"]
|
125
|
+
else
|
126
|
+
render :text => response.try(:body)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
private
|
131
|
+
|
132
|
+
def mail_to_cloud
|
133
|
+
@mail_to_cloud = Spree::MailToCloud.new(params[:mail_to_cloud])
|
134
|
+
@mail_to_cloud.host = request.env['HTTP_HOST']
|
135
|
+
respond_to do |format|
|
136
|
+
format.html do
|
137
|
+
if @mail_to_cloud.valid?
|
138
|
+
flash[:notice] = I18n.t('cloudsponge.mail_sent_to', :email => @mail_to_cloud.recipient_email).html_safe
|
139
|
+
flash[:notice] << ActionController::Base.helpers.link_to(I18n.t('cloudsponge.send_to_other'), email_to_cloud_path(@object.class.name.split("::").last.downcase, @object)).html_safe
|
140
|
+
|
141
|
+
send_message(@object, @mail_to_cloud)
|
142
|
+
|
143
|
+
#method_name = "after_delivering_#{@object.class.name.downcase}_mail"
|
144
|
+
#send(method_name) if respond_to?(method_name, true)
|
145
|
+
|
146
|
+
redirect_to @object
|
147
|
+
else
|
148
|
+
render :action => :send_mail
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def send_message(object, mail_to_cloud)
|
155
|
+
@mail_to_cloud.recipients.each do |email_address|
|
156
|
+
@temp_mail_to_cloud = mail_to_cloud
|
157
|
+
@temp_mail_to_cloud.recipient_email = email_address
|
158
|
+
Spree::CloudMailer.mail_to_cloud(object,@temp_mail_to_cloud).deliver
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def find_object
|
163
|
+
class_name = "Spree::#{(params[:type].titleize)}".constantize
|
164
|
+
return false if params[:id].blank?
|
165
|
+
@object = class_name.find_by_id(params[:id])
|
166
|
+
if class_name.respond_to?('find_by_permalink')
|
167
|
+
@object ||= class_name.find_by_permalink(params[:id])
|
168
|
+
end
|
169
|
+
if class_name.respond_to?('get_by_param')
|
170
|
+
@object ||= class_name.get_by_param(params[:id])
|
171
|
+
end
|
172
|
+
# Display 404 page if object is not found.
|
173
|
+
raise ActiveRecord::RecordNotFound if @object.nil?
|
174
|
+
end
|
175
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Spree::CloudMailer < ActionMailer::Base
|
2
|
+
default :from => Spree::MailMethod.current.try(:preferred_mails_from) || ''
|
3
|
+
|
4
|
+
def mail_to_cloud(object, mail)
|
5
|
+
@object = object
|
6
|
+
@mail = mail
|
7
|
+
opts = {}
|
8
|
+
|
9
|
+
if mail.hide_recipients && Spree::Config[:hidden_recipients_to_address]
|
10
|
+
opts[:to] = Spree::Config[:hidden_recipients_to_address]
|
11
|
+
opts[:bcc] = mail.recipient_email
|
12
|
+
else
|
13
|
+
opts[:to] = mail.recipient_email
|
14
|
+
end
|
15
|
+
default_url_options[:host] = mail.host
|
16
|
+
opts[:subject] = mail.subject
|
17
|
+
opts[:reply_to] = mail.sender_email
|
18
|
+
|
19
|
+
mail(opts)
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
class Spree::MailToCloud
|
2
|
+
include ActiveModel::Validations
|
3
|
+
include ActiveModel::Conversion
|
4
|
+
attr_accessor :host, :subject, :sender_name, :sender_email, :recipient_name, :recipient_email, :message, :recipients, :invalid_recipients, :hide_recipients
|
5
|
+
|
6
|
+
EMAILREGEX = /^[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,8}$/i
|
7
|
+
|
8
|
+
validates :subject, :presence => true
|
9
|
+
validates :sender_name, :presence => true
|
10
|
+
validates :sender_email, :format => { :with => EMAILREGEX }
|
11
|
+
validates :recipients, :length => {:minimum => 1, :message => "must contain at least one valid email address"}
|
12
|
+
validates :invalid_recipients, :length => {:maximum => 0, :message => "must be removed"}
|
13
|
+
|
14
|
+
def initialize(opts = {})
|
15
|
+
@sender_email = opts[:sender_email] || ' '
|
16
|
+
@sender_name = opts[:sender_name] || @sender_email.split('@', 2)[0].titleize
|
17
|
+
@subject = opts[:subject] || I18n.t('email_to_friend.you_would_like_this', :sender_name => @sender_name, :site => Spree::Config[:site_url])
|
18
|
+
|
19
|
+
@recipients = []
|
20
|
+
@invalid_recipients = []
|
21
|
+
|
22
|
+
@recipient_email = (opts[:recipient_email] || '').gsub(';', ',').gsub(/\s/ , '')
|
23
|
+
@recipient_email.split(',').each do |address|
|
24
|
+
if address =~ EMAILREGEX
|
25
|
+
@recipients << address
|
26
|
+
else
|
27
|
+
@invalid_recipients << address
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
@hide_recipients = opts[:hide_recipients] || false
|
32
|
+
@message = opts[:message]
|
33
|
+
end
|
34
|
+
|
35
|
+
def persisted?
|
36
|
+
false
|
37
|
+
end
|
38
|
+
|
39
|
+
def is_multi
|
40
|
+
(@recipients.size + @invalid_recipients.size) > 1
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,5 @@
|
|
1
|
+
Deface::Override.new(:virtual_path => "spree/admin/shared/_configuration_menu",
|
2
|
+
:name => "add_cloudsponge_admin_option",
|
3
|
+
:insert_bottom => "[data-hook='admin_configurations_sidebar_menu']",
|
4
|
+
:text => "<%= configurations_sidebar_menu_item t('cloudsponge.cloudsponge_settings'), edit_admin_cloudsponge_settings_path %>",
|
5
|
+
:disabled => false)
|
@@ -0,0 +1,7 @@
|
|
1
|
+
Deface::Override.new(:virtual_path => "spree/products/show",
|
2
|
+
:name => "converted_product_description_678329210",
|
3
|
+
:insert_bottom => "[data-hook='product_description'], #product_description[data-hook]",
|
4
|
+
:text => "<p class=\"email_to_cloud\">
|
5
|
+
<%= link_to t('cloudsponge.send_to_cloud'), email_to_cloud_url('product', @product) %> <small>(<i>powered by</i> <a target='new' href='http://www.cloudsponge.com'>Cloudsponge</a>)</small>
|
6
|
+
</p>",
|
7
|
+
:disabled => false)
|
@@ -0,0 +1,39 @@
|
|
1
|
+
<%= render :partial => 'spree/admin/shared/configuration_menu' %>
|
2
|
+
|
3
|
+
<% content_for :page_title do %>
|
4
|
+
<%= t('cloudsponge.cloudsponge_settings') %>
|
5
|
+
<% end %>
|
6
|
+
<br/>
|
7
|
+
<a href='http://www.cloudsponge.com/?utm_source=sweet_spree&utm_medium=partner&utm_campaign=integrator' target='_blank'>CloudSponge</a> is the driving engine behind the spree_multi_share gem.
|
8
|
+
<br/><br/>
|
9
|
+
<h1>What is CloudSponge?</h1>
|
10
|
+
<br/>
|
11
|
+
CloudSponge provides software that enables your users to send links for products on your website to their contacts from a variety of the most popular webmail services including Yahoo, Hotmail and Gmail and desktop address books such as Outlook and Mac Address Book.<br/>
|
12
|
+
<br/>
|
13
|
+
<a href='https://www.cloudsponge.com/sign-up?utm_source=sweet_spree&utm_medium=partner&utm_campaign=integrator' target='_blank'><img src='/assets/spree/cs_signup.png'></a><br/>
|
14
|
+
<br/>
|
15
|
+
Once you've signed up just enter in your domain key and domain password below and "Tell Your Friends!" links should appear next to all your products!<br/>
|
16
|
+
|
17
|
+
<%= form_tag(admin_cloudsponge_settings_path, :method => :put) do |f| -%>
|
18
|
+
|
19
|
+
<fieldset class="no-border-top">
|
20
|
+
<div data-hook="admin_cloudsponge_settings" class="row">
|
21
|
+
|
22
|
+
<div data-hook="domain_key" class="field">
|
23
|
+
<label><%= t('cloudsponge.domain_key') %></label><br>
|
24
|
+
<%= text_field_tag('preferences[domain_key]', Spree::Cloudsponge::Config[:domain_key], :size => 40) %>
|
25
|
+
</div>
|
26
|
+
|
27
|
+
<div data-hook="domain_password" class="field">
|
28
|
+
<label><%= t('cloudsponge.domain_password') %></label><br>
|
29
|
+
<%= text_field_tag('preferences[domain_password]', Spree::Cloudsponge::Config[:domain_password], :size => 40) %>
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
|
33
|
+
<div class="form-buttons filter-actions actions" data-hook="buttons">
|
34
|
+
<%= button t(:update), 'icon-refresh' %>
|
35
|
+
</div>
|
36
|
+
|
37
|
+
</fieldset>
|
38
|
+
|
39
|
+
<% end -%>
|
@@ -0,0 +1,56 @@
|
|
1
|
+
<div id="waitingDiv"><b>Loading Your Address Book...</b><br/><i>(Larger contact lists may take longer to load)</i></div>
|
2
|
+
<div id="contentDiv">
|
3
|
+
<input type="button" value="Cancel" onclick="closeWindow()">
|
4
|
+
</div>
|
5
|
+
|
6
|
+
<script>
|
7
|
+
var i = 0;
|
8
|
+
var authReceived = false;
|
9
|
+
var loginError = false;
|
10
|
+
var intervalID = setInterval(checkAuth, 1000);
|
11
|
+
|
12
|
+
function checkAuth(){
|
13
|
+
i = i + 1;
|
14
|
+
tempString = "Loading Your Address Book"
|
15
|
+
for (j=0; j<(i%6); j++)
|
16
|
+
tempString = tempString + ".";
|
17
|
+
jQuery("#waitingDiv").html("<b>" + tempString + "</b><br/><i>(Larger contact lists may take longer to load)</i>");
|
18
|
+
|
19
|
+
jQuery.ajax("/importCheck/<%= @importID %>", {
|
20
|
+
complete:function(jqXHR, textStatus) {
|
21
|
+
if (jqXHR.responseText == "true")
|
22
|
+
authReceived = true;
|
23
|
+
else if (jqXHR.responseText == "error")
|
24
|
+
loginError = true;
|
25
|
+
}
|
26
|
+
});
|
27
|
+
|
28
|
+
if (loginError){
|
29
|
+
clearInterval(intervalID);
|
30
|
+
alert("There was a problem with your username or password. Please try again!");
|
31
|
+
showAOLLogin();
|
32
|
+
}
|
33
|
+
|
34
|
+
if (authReceived){
|
35
|
+
clearInterval(intervalID);
|
36
|
+
jQuery("#waitingDiv").html("<b>Authorization Received!</b>");
|
37
|
+
jQuery("#importText").html("<b>Loading Contacts. Please wait...</b>");
|
38
|
+
jQuery.ajax("/importContacts/<%= @importID %>?service=<%= params[:service] %><% if !(params[:new_client_waiting_list_id].nil?) %>&new_client_waiting_list_id=<%= params[:new_client_waiting_list_id] %><% end %>", {
|
39
|
+
complete:function(jqXHR, textStatus) {
|
40
|
+
document.getElementById("waitingDiv").style.display = 'none';
|
41
|
+
jQuery("#contentDiv").html(jqXHR.responseText);
|
42
|
+
}
|
43
|
+
});
|
44
|
+
}
|
45
|
+
}
|
46
|
+
</script>
|
47
|
+
|
48
|
+
<script>
|
49
|
+
function closeWindow(){
|
50
|
+
document.getElementById("importAOLLogo").style.display = 'none';
|
51
|
+
document.getElementById("importText").style.display = 'none';
|
52
|
+
document.getElementById("importDiv").style.display = 'none';
|
53
|
+
document.getElementById("addressSelectionDiv").style.display = 'block';
|
54
|
+
clearInterval(intervalID);
|
55
|
+
}
|
56
|
+
</script>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= @success %>
|
@@ -0,0 +1,104 @@
|
|
1
|
+
<script>
|
2
|
+
contactCount = 0;
|
3
|
+
inviteeCount = 0;
|
4
|
+
emailList = new Array();
|
5
|
+
|
6
|
+
function addContact(div, full_name, email){
|
7
|
+
div.style.display='none';
|
8
|
+
inviteeDiv = document.getElementById("inviteeDiv");
|
9
|
+
contactCount = contactCount - 1;
|
10
|
+
document.getElementById("contactCountSpan").innerHTML = contactCount;
|
11
|
+
inviteeCount = inviteeCount + 1;
|
12
|
+
document.getElementById("inviteeCountSpan").innerHTML = inviteeCount;
|
13
|
+
inviteeDiv.innerHTML = inviteeDiv.innerHTML + "<div style='cursor:pointer;overflow:auto' onmouseover='this.style.background=\"lightgray\"' onmouseout='this.style.background=\"white\"' onclick='removeContact(this,\"" + email + "\")'><span style='float:left'> <b>-</b> " + full_name + "</span> <span style='float:right'>(" + email + ")</span>";
|
14
|
+
emailList.push(email);
|
15
|
+
}
|
16
|
+
|
17
|
+
function removeContact(div, email){
|
18
|
+
div.style.display='none';
|
19
|
+
contactDiv = document.getElementById("contactDiv");
|
20
|
+
contactCount = contactCount + 1;
|
21
|
+
document.getElementById("contactCountSpan").innerHTML = contactCount;
|
22
|
+
inviteeCount = inviteeCount - 1;
|
23
|
+
document.getElementById("inviteeCountSpan").innerHTML = inviteeCount;
|
24
|
+
document.getElementById(email).style.display = 'block';
|
25
|
+
emailList.splice(emailList.indexOf(email), 1);
|
26
|
+
}
|
27
|
+
|
28
|
+
function addAllContacts(){
|
29
|
+
contactDiv = document.getElementById("contactDiv");
|
30
|
+
subDivs = contactDiv.getElementsByTagName("div");
|
31
|
+
for (i=0; i < subDivs.length; i++){
|
32
|
+
displayValue = window.getComputedStyle(subDivs[i], null).getPropertyValue("display");
|
33
|
+
if (displayValue != 'none')
|
34
|
+
subDivs[i].onclick();
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
function removeAllInvitees(){
|
39
|
+
inviteeDiv = document.getElementById("inviteeDiv");
|
40
|
+
subDivs = inviteeDiv.getElementsByTagName("div");
|
41
|
+
for (i=0; i < subDivs.length; i++){
|
42
|
+
displayValue = window.getComputedStyle(subDivs[i], null).getPropertyValue("display");
|
43
|
+
if (displayValue != 'none')
|
44
|
+
subDivs[i].onclick();
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
jQuery("#importText").html("<b>Please select the contacts you'd like to tell about this product below:</b><br><small><i>powered by</i> <a target='new' href='http://www.cloudsponge.com'>Cloudsponge</a></small>");
|
49
|
+
</script>
|
50
|
+
|
51
|
+
<div style="border:1px solid black; width:300px; height:206px; float:left;">
|
52
|
+
<div style="background-color:lightgray;font-size:15px"><b>Contacts (<span id="contactCountSpan">0</span>)</b></div>
|
53
|
+
<div style="background-color:lightgray;font-size:12px;cursor: pointer" onclick="addAllContacts();">+ Add All</div>
|
54
|
+
<div id="contactDiv" style="overflow:auto;height:173px;font-size:11px;">
|
55
|
+
<% contactCount = 0 %>
|
56
|
+
<% @contacts.each do |contact| %>
|
57
|
+
<% if !(contact["email"][0].nil?) && !(contact["first_name"].nil?) %>
|
58
|
+
<% contactCount = contactCount + 1 %>
|
59
|
+
<% full_name = contact["first_name"] + " " + contact["last_name"] %>
|
60
|
+
<% email = contact["email"][0]["address"] %>
|
61
|
+
<div id="<%= email %>" style="cursor:pointer;overflow:auto" onmouseover="this.style.background='lightgray'" onmouseout="this.style.background='white'" onclick="addContact(this, '<%= full_name %>','<%= contact["email"][0]["address"] %>');">
|
62
|
+
<span style="float:left;"> <b>+</b> <%= full_name %></span> <span style="float:right;">(<%= email %>)</span>
|
63
|
+
</div>
|
64
|
+
<% end %>
|
65
|
+
<% end %>
|
66
|
+
</div>
|
67
|
+
</div>
|
68
|
+
<div style="width:50px; float:left"> </div>
|
69
|
+
<div style="border:1px solid black; width:300px; height:206px; float:left; overflow:auto">
|
70
|
+
<div style="background-color:lightgray;font-size:15px"><b>Invitees (<span id="inviteeCountSpan">0</span>)</b></div>
|
71
|
+
<div style="background-color:lightgray;font-size:12px;cursor: pointer" onclick="removeAllInvitees();">+ Remove All</div>
|
72
|
+
<div id="inviteeDiv" style="overflow:auto;height:173px;font-size:11px;"></div>
|
73
|
+
</div>
|
74
|
+
<div style="clear:both"> </div>
|
75
|
+
<br/>
|
76
|
+
<form action="/invite/" method="post">
|
77
|
+
<input type="hidden" id="client_email_list" name="client_email_list" value="">
|
78
|
+
<% if !(params[:new_client_waiting_list_id].nil?) %>
|
79
|
+
<input type="hidden" name="new_client_waiting_list_id" id="new_client_waiting_list_id" value="<%= params[:new_client_waiting_list_id] %>">
|
80
|
+
<% end %>
|
81
|
+
<input type="button" value="Tell Your Friends!" onclick="inviteContacts(this.form)">
|
82
|
+
<input type="button" value="Cancel" onclick="closeWindow()">
|
83
|
+
</form>
|
84
|
+
|
85
|
+
<script>
|
86
|
+
contactCount = <%= contactCount %>;
|
87
|
+
document.getElementById("contactCountSpan").innerHTML = contactCount;
|
88
|
+
</script>
|
89
|
+
|
90
|
+
<script>
|
91
|
+
function inviteContacts(frm){
|
92
|
+
//client_email_list = document.getElementById("client_email_list");
|
93
|
+
//client_email_list.value = emailList.join();
|
94
|
+
recipient_email_list = emailList.join()
|
95
|
+
|
96
|
+
if (recipient_email_list == "")
|
97
|
+
alert("You must select at least one contact!");
|
98
|
+
else{
|
99
|
+
document.getElementById("mail_to_cloud_recipient_email").value = recipient_email_list;
|
100
|
+
document.getElementById("new_mail_to_cloud").submit();
|
101
|
+
}
|
102
|
+
//frm.submit();
|
103
|
+
}
|
104
|
+
</script>
|