appoxy_rails 0.0.11 → 0.0.12

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.
data/README.markdown CHANGED
@@ -1 +1,110 @@
1
- Nada.
1
+ This is a bunch of tools and utilities to help developing Rails apps using
2
+ tools like SimpleRecord, jquery, OpenID, Oauth, HTML5, etc.
3
+
4
+ Everything is mix-ins and methods so you can pick and choose what you want to use.
5
+
6
+ ## Features
7
+
8
+ - Super easy OpenID and Facebook logins
9
+ - User authentication
10
+ - Timezone helpers
11
+ - Sharing things in an app (Shareable mix-in)
12
+ - Ready to go models (User)
13
+ - Geolocation
14
+ - API authentication to easily create secure API's
15
+
16
+ ## Installation and Configuration
17
+
18
+ Clone appoxy BASE project.
19
+
20
+ OR:
21
+
22
+ - gem 'appoxy_rails'
23
+ - Delete all prototype scripts in public/javascripts
24
+
25
+
26
+ ## Includes
27
+
28
+ ### User
29
+
30
+ Create a User model and extend `< Appoxy::Sessions::User`
31
+
32
+ ### ApplicationController
33
+
34
+ Add `include Appoxy::Sessions::ApplicationController` to your ApplicationController.
35
+
36
+ ### ApplicationHelper
37
+
38
+ Add `include Appoxy::UI::ApplicationHelper` to your ApplicationHelper.
39
+
40
+ Includes:
41
+
42
+ - Date formatting based on current user's timezone.
43
+ - flash_messages
44
+ - error_messages_for
45
+
46
+ ### UsersController
47
+
48
+ Add `include Appoxy::Sessions::UsersController` to your SessionsController.
49
+
50
+ Includes:
51
+
52
+ - User creation.
53
+ - Timezone setting.
54
+ - Geo location setting.
55
+
56
+ #### Callbacks
57
+
58
+ - before_create
59
+ - after_create
60
+
61
+ ### SessionsController
62
+
63
+ Add `include Appoxy::Sessions::SessionsController` to your SessionsController.
64
+
65
+ Includes:
66
+
67
+ - Authentication
68
+ - Password resetting
69
+ - Logout
70
+
71
+ #### Callbacks
72
+
73
+ - before_create
74
+ - after_create
75
+ - after_reset_password - good for sending out an email, eg: Mailer.deliver_reset_password(@user, @newpass)
76
+
77
+ ### appoxy_javascripts
78
+
79
+ Includes:
80
+
81
+ - jquery
82
+ - jquery ui
83
+
84
+ ### appoxy_header
85
+
86
+ Includes:
87
+
88
+ - appoxy_javascripts
89
+
90
+ ### appoxy_footer
91
+
92
+ Includes:
93
+
94
+ - Some debug stuff if in development environment.
95
+ - Timezone script to get user timezone.
96
+
97
+ ## Authentication
98
+
99
+ Any controllers that require authentication to view, use:
100
+
101
+ before_filter :authenticate
102
+
103
+ ### OpenID
104
+
105
+ ### Facebook
106
+
107
+ ### Oauth
108
+
109
+ ## Sharing
110
+
data/lib/appoxy_rails.rb CHANGED
@@ -1,5 +1,16 @@
1
+ require 'active_support/core_ext'
1
2
  require_relative 'appoxy_ui'
2
3
  require_relative 'appoxy_api'
3
4
  require_relative 'appoxy_sessions'
4
5
  require_relative 'ui/time_zoner'
5
6
 
7
+
8
+ if defined?(Rails)
9
+ # puts 'Rails=' + Rails.inspect
10
+ # puts 'vers=' + Rails::VERSION::MAJOR.inspect
11
+ if Rails::VERSION::MAJOR == 2
12
+ raise "appoxy_rails only supports Rails 3+"
13
+ else
14
+ require_relative 'railtie'
15
+ end
16
+ end
data/lib/railtie.rb ADDED
@@ -0,0 +1,15 @@
1
+ # see http://api.rubyonrails.org/classes/Rails/Railtie.html
2
+
3
+ require 'rails'
4
+
5
+ module SimpleWorker
6
+ class Railtie < Rails::Railtie
7
+
8
+ initializer "appoxy_rails.configure_rails_initialization" do |app|
9
+ puts 'Initializing appoxy_rails Railtie'
10
+
11
+ # routes = app.routes
12
+
13
+ end
14
+ end
15
+ end
@@ -5,14 +5,25 @@ module Appoxy
5
5
 
6
6
  def self.included(base)
7
7
  # Initialize module.
8
- # helper_method :logged_in?
9
- # helper_method :current_user
10
- # helper_method :base_url
8
+ base.helper_method :logged_in?
9
+ base.helper_method :current_user
10
+ base.helper_method :base_url
11
+
12
+ base.after_filter :close_sdb_connection
13
+ base.before_filter :clear_sdb_stats
11
14
  end
12
15
 
13
16
 
14
17
  protected
15
18
 
19
+ def clear_sdb_stats
20
+ SimpleRecord.stats.clear
21
+ end
22
+
23
+ def close_sdb_connection
24
+ SimpleRecord.close_connection
25
+ end
26
+
16
27
 
17
28
  def logout_keeping_session!
18
29
  @current_user = nil # not logged in, and don't do it for me
@@ -48,6 +59,10 @@ module Appoxy
48
59
  ::User.find_by_id(session[:user_id]) if session[:user_id]
49
60
  end
50
61
 
62
+ def current_url
63
+ request.url
64
+ end
65
+
51
66
 
52
67
  def base_url
53
68
  r = "#{request.protocol}#{request.host}"
@@ -91,6 +106,22 @@ module Appoxy
91
106
 
92
107
  end
93
108
 
109
+ MOBILE_USER_AGENTS = 'palm|blackberry|nokia|phone|midp|mobi|symbian|chtml|ericsson|minimo|' +
110
+ 'audiovox|motorola|samsung|telit|upg1|windows ce|ucweb|astel|plucker|' +
111
+ 'x320|x240|j2me|sgh|portable|sprint|docomo|kddi|softbank|android|mmp|' +
112
+ 'pdxgw|netfront|xiino|vodafone|portalmmm|sagem|mot-|sie-|ipod|up\\.b|' +
113
+ 'webos|amoi|novarra|cdm|alcatel|pocket|ipad|iphone|mobileexplorer|' +
114
+ 'mobile'
115
+
116
+ # SOME MOBILE STUFF FROM MOBILE_FU
117
+ def is_mobile_device?
118
+ request.user_agent.to_s.downcase =~ Regexp.new(MOBILE_USER_AGENTS)
119
+ end
120
+
121
+ def is_device?(type)
122
+ request.user_agent.to_s.downcase.include?(type.to_s.downcase)
123
+ end
124
+
94
125
 
95
126
  end
96
127
 
@@ -1,121 +1,121 @@
1
1
  module Appoxy
2
2
 
3
- module Sessions
3
+ module Sessions
4
4
 
5
- module SessionsController
5
+ module SessionsController
6
6
 
7
- # Todo: have a configuration block for this so user can set things like facebook_api_key and facebook_secret
7
+ # Todo: have a configuration block for this so user can set things like facebook_api_key and facebook_secret
8
8
 
9
- def new
9
+ def new
10
10
 
11
- end
11
+ end
12
12
 
13
- def create
14
- before_create
13
+ def create
14
+ before_create
15
15
 
16
- # recaptchas should be optional
16
+ # recaptchas should be optional
17
17
  # unless verify_recaptcha
18
18
  # flash[:error] = "You are not human! Please try again."
19
19
  # render :action=>"forgot_password"
20
20
  # return
21
21
  # end
22
22
 
23
- logout_keeping_session!
23
+ logout_keeping_session!
24
24
 
25
- @email = params[:email]
26
- @has_password = params[:has_password]
27
- #puts 'has_pass? ' + @has_password.inspect
25
+ @email = params[:email]
26
+ @has_password = params[:has_password]
27
+ #puts 'has_pass? ' + @has_password.inspect
28
28
 
29
- if params[:has_password].blank?
30
- flash[:error] = "Please click the radio button to let us know if you have a password or not."
31
- render :action=>"new"
32
- return
33
- end
29
+ if params[:has_password].blank?
30
+ flash[:error] = "Please click the radio button to let us know if you have a password or not."
31
+ render :action=>"new"
32
+ return
33
+ end
34
34
 
35
- if @has_password == "true"
36
- user = ::User.find_by_email(@email)
35
+ if @has_password == "true"
36
+ user = ::User.find_by_email(@email)
37
37
  # user = User.authenticate(@email, params[:password])
38
- if user && user.authenticate(params[:password])
39
- self.current_user = user
40
- flash[:info] = "Logged in successfully."
41
- orig_url = session[:return_to]
42
- puts 'orig_url = ' + orig_url.to_s
43
- session[:return_to] = nil
44
- if !orig_url.nil?
45
- redirect_to orig_url # if entered via a different url
46
- else
47
- after_create
48
- end
49
- user.last_login = Time.now
50
- user.save(:dirty=>true)
51
- else
52
- flash[:info] = "Invalid email or password. Please try again."
53
- render :action => 'new'
54
- end
55
- else
56
- # new user
57
- redirect_to (new_user_path + "?email=#{@email}")
58
- end
38
+ if user && user.authenticate(params[:password])
39
+ self.current_user = user
40
+ flash[:info] = "Logged in successfully."
41
+ orig_url = session[:return_to]
42
+ puts 'orig_url = ' + orig_url.to_s
43
+ session[:return_to] = nil
44
+ if !orig_url.nil?
45
+ redirect_to orig_url # if entered via a different url
46
+ else
47
+ after_create
59
48
  end
49
+ user.last_login = Time.now
50
+ user.save(:dirty=>true)
51
+ else
52
+ flash[:info] = "Invalid email or password. Please try again."
53
+ render :action => 'new'
54
+ end
55
+ else
56
+ # new user
57
+ redirect_to (new_user_path + "?email=#{@email}")
58
+ end
59
+ end
60
60
 
61
- def before_create
61
+ def before_create
62
62
 
63
- end
63
+ end
64
64
 
65
- def after_create
65
+ def after_create
66
66
 
67
- end
67
+ end
68
68
 
69
- def reset_password
70
- before_reset_password
69
+ def reset_password
70
+ before_reset_password
71
71
 
72
72
 
73
- @email = params[:email]
74
- unless User.email_is_valid? @email
75
- flash[:error] = "You must enter a valid email."
76
- render :action=>"forgot_password"
77
- return
78
- end
73
+ @email = params[:email]
74
+ unless User.email_is_valid? @email
75
+ flash[:error] = "You must enter a valid email."
76
+ render :action=>"forgot_password"
77
+ return
78
+ end
79
79
 
80
- @user = ::User.find_by_email(@email)
81
- unless @user
82
- flash[:error] = "Email not found."
83
- render :action=>"forgot_password"
84
- return
85
- end
80
+ @user = ::User.find_by_email(@email)
81
+ unless @user
82
+ flash[:error] = "Email not found."
83
+ render :action=>"forgot_password"
84
+ return
85
+ end
86
86
 
87
- @newpass = random_string(8)
87
+ @newpass = random_string(8)
88
88
 
89
- @user.password = @newpass
90
- @user.save(:dirty=>true)
89
+ @user.password = @newpass
90
+ @user.save(:dirty=>true)
91
91
 
92
- flash[:success] = "Password reset. You should receive an email shortly with a new password."
93
- redirect_to :action=>"new"
92
+ flash[:success] = "Password reset. You should receive an email shortly with a new password."
93
+ redirect_to :action=>"new"
94
94
 
95
- after_reset_password
96
- end
95
+ after_reset_password
96
+ end
97
97
 
98
- def before_reset_password
98
+ def before_reset_password
99
99
 
100
- end
100
+ end
101
101
 
102
- # This is a great spot to send an email with the new password (the only spot actually).
103
- def after_reset_password
102
+ # This is a great spot to send an email with the new password (the only spot actually).
103
+ def after_reset_password
104
104
 
105
- end
105
+ end
106
106
 
107
- def destroy
108
- logout
109
- end
107
+ def destroy
108
+ logout
109
+ end
110
110
 
111
- def logout
112
- @current_user = nil
113
- reset_session
114
- flash[:info] = "You have been logged out."
115
- redirect_to('/')
116
- end
111
+ def logout
112
+ @current_user = nil
113
+ reset_session
114
+ flash[:info] = "You have been logged out."
115
+ redirect_to('/')
116
+ end
117
117
 
118
118
 
119
- end
120
119
  end
120
+ end
121
121
  end
data/lib/sessions/user.rb CHANGED
@@ -1,80 +1,82 @@
1
1
  module Appoxy
2
2
 
3
- module Sessions
4
-
5
- class User < SimpleRecord::Base
6
-
7
- def self.included(base)
8
- puts self.name + " included in " + base.name
9
- end
10
-
11
-
12
- has_strings :email,
13
- :open_id,
14
- {:name => :password, :hashed=>true},
15
- :first_name,
16
- :last_name,
17
- :remember_me,
18
- :activation_code,
19
- :status, # invited, active
20
- :oauth_access_key,
21
- :oauth_secret_key
22
-
23
- has_dates :last_login,
24
- :remember_me_expires
25
-
26
-
27
- def validate
28
- errors.add("email", "is not valid") unless User.email_is_valid?(email)
29
-
30
- if status == "invited"
31
- # doesn't need password
32
- elsif open_id
33
- # doesn't need password
34
- else
35
- errors.add("password", "must be at least 6 characters long.") if password.blank?
36
- end
37
- end
38
-
3
+ module Sessions
4
+
5
+ class User < SimpleRecord::Base
6
+
7
+ def self.included(base)
8
+ puts self.name + " included in " + base.name
9
+ end
10
+
11
+ has_strings :email,
12
+ :open_id,
13
+ :fb_id, :fb_access_token,
14
+ {:name => :password, :hashed=>true},
15
+ :first_name,
16
+ :last_name,
17
+ :remember_me,
18
+ :activation_code,
19
+ :status, # invited, active
20
+ :oauth_access_key,
21
+ :oauth_secret_key,
22
+ :time_zone,
23
+ :lat, :lng
24
+
25
+ has_dates :last_login,
26
+ :remember_me_expires
27
+
28
+
29
+ def validate
30
+ errors.add("email", "is not valid") unless User.email_is_valid?(email)
31
+
32
+ if status == "invited"
33
+ # doesn't need password
34
+ elsif open_id
35
+ # doesn't need password
36
+ else
37
+ errors.add("password", "must be at least 6 characters long.") if password.blank?
38
+ end
39
+ end
39
40
 
40
- def self.email_is_valid?(email)
41
- return email.present? && email =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
42
- end
43
41
 
42
+ def self.email_is_valid?(email)
43
+ return email.present? && email =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
44
+ end
44
45
 
45
- def is_active?
46
- status == "active"
47
- end
48
46
 
47
+ def is_active?
48
+ status == "active"
49
+ end
49
50
 
50
- def set_activation_code
51
- self.activation_code=Digest::SHA1.hexdigest(email.to_s+Time.now.to_s)
52
- end
53
51
 
52
+ def set_activation_code
53
+ self.activation_code=Digest::SHA1.hexdigest(email.to_s+Time.now.to_s)
54
+ end
54
55
 
55
- def activate!
56
- self.activation_code=nil
57
- self.status = "active"
58
- end
59
56
 
57
+ def activate!
58
+ self.activation_code=nil
59
+ self.status = "active"
60
+ end
60
61
 
61
- def authenticate(password)
62
62
 
63
- return nil if attributes["password"].blank? # if the user has no password (will this happen? maybe for invites...)
63
+ def authenticate(password)
64
64
 
65
- # This is a normal unencrypted password, temporary
66
- if attributes["password"][0].length < 100
67
- self.password = attributes["password"][0]
68
- self.save
69
- end
65
+ return nil if attributes["password"].blank? # if the user has no password (will this happen? maybe for invites...)
70
66
 
71
- (self.password == password) ? self : nil
72
- end
67
+ # This is a normal unencrypted password, temporary
68
+ if attributes["password"][0].length < 100
69
+ self.password = attributes["password"][0]
70
+ self.save
71
+ end
73
72
 
73
+ (self.password == password) ? self : nil
74
+ end
74
75
 
75
- end
76
76
 
77
77
  end
78
78
 
79
+ end
80
+
79
81
  end
80
82
 
@@ -1,122 +1,159 @@
1
1
  module Appoxy
2
2
 
3
- module Sessions
4
- module UsersController
5
-
6
-
7
- def new
8
- before_new
9
- if params[:id]
10
- @user = ::User.find params[:id]
11
- else
12
- @user = ::User.new
13
- @user.email = params[:email] if params[:email]
14
- end
15
- @user.activation_code = params[:ac] if params[:ac]
16
- after_new
17
- end
3
+ module Sessions
4
+ module UsersController
5
+
6
+ def self.included(base)
7
+ puts 'UsersController included'
8
+ # Initialize module.
9
+ base.protect_from_forgery :except => [:location, :timezone]
10
+
11
+ end
12
+
13
+ def new
14
+ before_new
15
+ if params[:id]
16
+ @user = ::User.find params[:id]
17
+ else
18
+ @user = ::User.new
19
+ @user.email = params[:email] if params[:email]
20
+ end
21
+ @user.activation_code = params[:ac] if params[:ac]
22
+ after_new
23
+ end
18
24
 
19
- def before_new
25
+ def before_new
20
26
 
21
- end
27
+ end
22
28
 
23
- def after_new
29
+ def after_new
24
30
 
25
- end
31
+ end
26
32
 
27
- def create
28
-
29
- before_create
30
-
31
- @user = ::User.new(params[:user])
32
-
33
- if @user.password != params[:password_confirmation]
34
- flash[:error] = "Confirmation password does not match. Please try again."
35
- render :action=>"new"
36
- return
37
- end
38
-
39
- if params[:user][:password].length < 6
40
- flash[:error] = "Password can not be less than 6 characters."
41
- render :action=>"new"
42
- return
43
- end
44
-
45
- existing_user = ::User.find_by_email(@user.email)
46
-
47
- if existing_user
48
- if params[:ac]
49
-
50
- end
51
- # todo: remove activation_code on user
52
- if @user.activation_code.present?
53
- # hasn't logged in yet, probably invited, need to check access key
54
- if existing_user.activation_code == @user.activation_code
55
- existing_user.activate!
56
- existing_user.password = @user.password
57
- @user = existing_user
58
- end
59
- else
60
- flash[:error] = "The email you entered already exists in our system. You might want to try logging in if you already have an account."
61
- render :action=>"new"
62
- return
63
- end
64
- else
65
- @user.status = "active"
66
- end
67
-
68
- before_save_in_create
69
- if @user.save
70
- self.current_user = @user
71
- flash[:success] = "Your account was created successfully."
72
- after_save_in_create
73
- after_create
74
- else
75
- render :action => "new"
76
- end
33
+ def create
77
34
 
78
- end
35
+ before_create
79
36
 
80
- def before_create
37
+ @user = ::User.new(params[:user])
81
38
 
82
- end
39
+ if @user.password != params[:password_confirmation]
40
+ flash[:error] = "Confirmation password does not match. Please try again."
41
+ render :action=>"new"
42
+ return
43
+ end
83
44
 
84
- def before_save_in_create
45
+ if params[:user][:password].length < 6
46
+ flash[:error] = "Password can not be less than 6 characters."
47
+ render :action=>"new"
48
+ return
49
+ end
85
50
 
86
- end
51
+ existing_user = ::User.find_by_email(@user.email)
87
52
 
88
- def after_save_in_create
53
+ if existing_user
54
+ if params[:ac]
89
55
 
56
+ end
57
+ # todo: remove activation_code on user
58
+ if @user.activation_code.present?
59
+ # hasn't logged in yet, probably invited, need to check access key
60
+ if existing_user.activation_code == @user.activation_code
61
+ existing_user.activate!
62
+ existing_user.password = @user.password
63
+ @user = existing_user
90
64
  end
65
+ else
66
+ flash[:error] = "The email you entered already exists in our system. You might want to try logging in if you already have an account."
67
+ render :action=>"new"
68
+ return
69
+ end
70
+ else
71
+ @user.status = "active"
72
+ end
91
73
 
92
- def after_create
74
+ before_save_in_create
75
+ if @user.save
76
+ self.current_user = @user
77
+ flash[:success] = "Your account was created successfully."
78
+ after_save_in_create
79
+ after_create
80
+ else
81
+ render :action => "new"
82
+ end
93
83
 
94
- end
84
+ end
95
85
 
86
+ def before_create
96
87
 
97
- # Usually a user gets here via an activation link in email.
98
- def activate
99
- logout_keeping_session!
100
- @user = ::User.find_by_activation_code(params[:ac]) unless params[:ac].blank?
101
- case
102
- when (!params[:ac].blank?) && @user && !@user.is_active?
103
- flash[:info] = "Account activated. please login."
104
- @user.activate!
105
- redirect_to login_url
106
- when params[:ac].blank?
107
- flash[:error] = "The activation code was missing. Please follow the URL from your email."
108
- redirect_to(root_url)
109
- else
110
- flash[:error] = "We couldn't find a user with that activation code -- check your email? Or maybe you've already activated -- try signing in."
111
- redirect_to(root_url)
112
- end
113
- end
88
+ end
114
89
 
115
- end
90
+ def before_save_in_create
91
+
92
+ end
93
+
94
+ def after_save_in_create
95
+
96
+ end
97
+
98
+ def after_create
99
+
100
+ end
116
101
 
117
102
 
103
+ # Usually a user gets here via an activation link in email.
104
+ def activate
105
+ logout_keeping_session!
106
+ @user = ::User.find_by_activation_code(params[:ac]) unless params[:ac].blank?
107
+ case
108
+ when (!params[:ac].blank?) && @user && !@user.is_active?
109
+ flash[:info] = "Account activated. please login."
110
+ @user.activate!
111
+ redirect_to login_url
112
+ when params[:ac].blank?
113
+ flash[:error] = "The activation code was missing. Please follow the URL from your email."
114
+ redirect_to(root_url)
115
+ else
116
+ flash[:error] = "We couldn't find a user with that activation code -- check your email? Or maybe you've already activated -- try signing in."
117
+ redirect_to(root_url)
118
+ end
119
+ end
120
+
121
+ # To use this, add "post 'timezone'" to a member resources :users in routes.rb
122
+ # Also, be sure you have <%= appoxy_footer in view %>
123
+ def timezone
124
+ ret = {}
125
+ if logged_in?
126
+ puts 'SET TIMEZONE ' + params.inspect
127
+ tz = ActiveSupport::TimeZone[params[:offset].to_i]
128
+ if tz
129
+ puts 'tz=' + tz.name
130
+ current_user.time_zone = tz.name
131
+ current_user.save(:dirty=>true)
132
+ ret[:timezone] = tz.name
133
+ end
134
+ end
135
+ render :json=>ret
136
+ end
137
+
138
+ def geo_location
139
+ puts 'updating users location'
140
+ ret = {}
141
+ if current_user
142
+ current_user.update_position(params[:lat], params[:lng])
143
+ ret[:status]="success"
144
+ else
145
+ logger.info("Could not update user location because no current_user")
146
+ ret[:status]="failed"
147
+ ret[:msg] = "No user"
148
+ end
149
+ render :json=>ret
150
+ end
151
+
118
152
  end
119
153
 
120
154
 
155
+ end
156
+
157
+
121
158
  end
122
159
 
@@ -0,0 +1,56 @@
1
+ <script type="text/javascript">
2
+ function map_success(position) {
3
+
4
+ <% if @options[:show_map] %>
5
+ var mapcanvas = document.createElement('div');
6
+ mapcanvas.id = 'mapcanvas';
7
+ mapcanvas.style.width = '100%';
8
+ mapcanvas.style.height = '100px';
9
+
10
+ document.querySelector('<%=@options[:show_map]%>').appendChild(mapcanvas);
11
+
12
+ var latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
13
+ var myOptions = {
14
+ zoom: 15,
15
+ center: latlng,
16
+ mapTypeControl: false,
17
+ navigationControlOptions: {style: google.maps.NavigationControlStyle.SMALL},
18
+ mapTypeId: google.maps.MapTypeId.ROADMAP
19
+ };
20
+ var map = new google.maps.Map(document.getElementById("mapcanvas"), myOptions);
21
+
22
+ var marker = new google.maps.Marker({
23
+ position: latlng,
24
+ map: map,
25
+ title:"You are here!"
26
+ });
27
+ <% end %>
28
+
29
+ <% if @options[:current_user] %>
30
+ $.post('/users/<%=@options[:current_user].id%>/geo_location', { lat: position.coords.latitude, lng: position.coords.longitude }, function(data) {
31
+ data = jQuery.parseJSON(data);
32
+ $("#status").html("updated.");
33
+ });
34
+ <% end %>
35
+
36
+ }
37
+
38
+ function map_error(msg) {
39
+ var s = document.querySelector('#status');
40
+ s.innerHTML = typeof msg == 'string' ? msg : "failed";
41
+ s.className = 'find_fail';
42
+
43
+ // console.log(arguments);
44
+ }
45
+
46
+ $(document).ready(function() {
47
+ if (navigator.geolocation) {
48
+ navigator.geolocation.getCurrentPosition(map_success, map_error, {maximumAge:60000 * 5}); // 1 minute
49
+ } else {
50
+ // error('not supported');
51
+ }
52
+
53
+ });
54
+
55
+ </script>
56
+
@@ -1,23 +1,92 @@
1
+ require_relative 'binding_hack'
2
+
1
3
  module Appoxy
2
4
 
3
5
  module UI
4
6
 
7
+ # To use, include in your ApplicationHelper.
8
+ # include Appoxy::UI::ApplicationHelper
5
9
  module ApplicationHelper
6
10
 
7
11
  def self.included(base)
8
12
  # puts self.class.name + " included in " + base.class.name
9
13
  end
10
14
 
11
-
12
15
  def current_url
13
16
  request.url
14
17
  end
15
18
 
19
+ def base_url
20
+ r = "#{request.protocol}#{request.host}"
21
+ if request.port != 80
22
+ r << ":#{request.port}"
23
+ end
24
+ @base_url = r
25
+ r
26
+ end
27
+
28
+ def appoxy_javascripts
29
+ ' <script type="text/javascript" src="http://www.google.com/jsapi?key=ABQIAAAAhes0f80sBcwL-h5xCNkkgxQBmiBpQeSpIciQPfZ5Ss-a60KXIRQOVvqzsNpqzhmG9tjky_5rOuaeow"></script>
30
+ <script type="text/javascript">
31
+ google.load("jquery", "1");
32
+ google.load("jqueryui", "1");
33
+
34
+ </script>
35
+ '.html_safe
36
+ end
37
+
38
+ # Place in application.html.erb in head to get default Appoxy style elements and javascripts.
39
+ def appoxy_header
40
+ # stylesheets and what not could either be included in this gem or links to s3
41
+
42
+ # include google javascript for jquery and jquery-ui and perhaps jquery tools
43
+ ret = appoxy_javascripts
44
+ ret.html_safe
45
+ end
46
+
47
+ def appoxy_footer
48
+ ret = ''
49
+
50
+ if current_user # && current_user.time_zone.blank?
51
+ ret += '
52
+ <script type="text/javascript">
53
+ $(document).ready(function() {
54
+ var myDate = new Date();
55
+ var tz_offset = -(myDate.getTimezoneOffset() / 60);
56
+ // document.write(tz_offset);
57
+ $.post("/users/' + current_user.id + '/timezone", { offset: tz_offset })
58
+ });
59
+ </script>'
60
+ end
61
+
62
+ if defined?(RELEASE_INFO)
63
+ ret += '<div style="clear:both; margin-top:15px;" class="instance_info_div"><%= INSTANCE_INFO["instance_id"] %>: Revision <%= RELEASE_INFO["scm"]["revision"][0..5] %> built on <%= RELEASE_INFO["deploy_date"] %></div>'
64
+ end
65
+ if Rails.env == "development"
66
+ ret += '<div style="margin-top: 10px;">' + ERB::Util.html_escape(SimpleRecord.stats.inspect) + '</div>'
67
+ end
68
+ ret.html_safe
69
+ end
70
+
71
+ # options:
72
+ # :format=>:long, default = :long
73
+ # :user=> a User object, if not specified will use @current_user
74
+ def date_format(date, options={})
75
+ format = options[:format] || :long
76
+ # puts 'date_format on ' + date.class.name + " --- " + date.inspect
77
+ user ||= @current_user
78
+ return '' if date.nil?
79
+ date = Time.parse(date) if date.is_a?(String)
80
+ if date.is_a?(Date) && !date.is_a?(DateTime) && !date.is_a?(Time)
81
+ return date.to_formatted_s(format)
82
+ end
83
+ return date.to_local_s(user, :format=>format)
84
+ end
16
85
 
17
86
  def flash_messages
18
87
  puts 'FLASH MESSAGE!'
19
88
  if flash.size > 0
20
- s = "<div class=\"flash_messages_container\">"
89
+ s = "<div class=\"flash_messages_container\">"
21
90
  s2 = ""
22
91
  flash.each_pair do |type, msg|
23
92
  if msg.is_a?(Array)
@@ -35,7 +104,7 @@ module Appoxy
35
104
  end
36
105
 
37
106
  def error_messages_for(ob)
38
-
107
+ return '' if ob.nil?
39
108
  if ob.errors.size > 0
40
109
  s = "<div class=\"error_message_for_container\">"
41
110
  s2 = ""
@@ -48,6 +117,19 @@ module Appoxy
48
117
  end
49
118
  end
50
119
 
120
+ # Helper for getting user's geo location and storing it on User object.
121
+ # options:
122
+ # :show_map=>"#div_to_show_on" - This will display a tiny map of location
123
+ #
124
+ def appoxy_geo_finder(options={})
125
+ # ret = File.read('_geo_location_finder.html.erb')
126
+ options.merge!({:current_user=>current_user})
127
+ options = Appoxy::UI::BindingHack.new(options)
128
+ template = ERB.new(File.read(File.join(File.dirname(__FILE__), '_geo_location_finder.html.erb')))
129
+ ret = template.result(options.get_binding)
130
+ ret.html_safe
131
+ end
132
+
51
133
 
52
134
  end
53
135
 
@@ -0,0 +1,14 @@
1
+ module Appoxy
2
+ module UI
3
+ class BindingHack
4
+
5
+ def initialize(hash)
6
+ @options = hash
7
+ end
8
+
9
+ def get_binding
10
+ binding
11
+ end
12
+ end
13
+ end
14
+ end
data/lib/ui/test.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'erb'
2
+ require_relative 'binding_hack'
3
+
4
+ options = Appoxy::UI::BindingHack.new(:x=>"hi")
5
+ template = ERB.new(File.read(File.join(File.dirname(__FILE__), '_geo_location_finder.html.erb')))
6
+ ret = template.result(options.get_binding)
7
+ p ret
data/lib/ui/time_zoner.rb CHANGED
@@ -1,47 +1,52 @@
1
- # adds a to_pst method to Time
2
- module TimePluginizer # ActiveSupport::CoreExtensions::Time::Conversions
3
1
 
4
- def self.included(base) #:nodoc:
2
+ module Appoxy
3
+ module TimeStuff # avoid naming conflicts. ;)
4
+ module Zones
5
+
6
+ def self.included(base) #:nodoc:
5
7
  base.class_eval do
6
- #puts 'TP mixing'
7
- # If we want to_s to ALWAYS be local, uncomment the below line
8
- #alias_method :to_s, :to_local_s #
8
+ #puts 'TP mixing'
9
+ # If we want to_s to ALWAYS be local, uncomment the below line
10
+ #alias_method :to_s, :to_local_s #
9
11
  end
10
- end
12
+ end
11
13
 
12
- def to_pst
14
+ def to_pst
13
15
  return in_time_zone('Pacific Time (US & Canada)')
14
- end
16
+ end
15
17
 
16
- def to_user_time(user = nil)
18
+ def to_user_time(user = nil)
17
19
  local = nil
18
20
  if user && user.time_zone
19
- local = in_time_zone(user.time_zone)
21
+ local = in_time_zone(user.time_zone)
20
22
  else
21
- local = to_pst
23
+ local = to_pst
22
24
  end
23
25
  local
24
- end
26
+ end
25
27
 
26
- def to_local_s(format = :default, user = nil)
28
+ def to_local_s(user = nil, options={})
29
+ format = options[:format] || :long
27
30
  #puts 'calling to_local_s on ' + self.class.name
28
31
  zone = to_user_time(user)
29
32
  return zone.to_formatted_s(format)
30
- end
33
+ end
31
34
 
32
- end
33
35
 
34
- module StringTimezoner
35
- def to_user_time(user)
36
+ end
37
+
38
+ module StringTimezoner
39
+ def to_user_time(user)
36
40
  tz = ActiveSupport::TimeZone.new(user.time_zone || 'Pacific Time (US & Canada)')
37
41
  # puts 'tz=' + tz.inspect
38
- t = tz.parse(self)
42
+ t = tz.parse(self)
39
43
  return t
44
+ end
40
45
  end
46
+ end
41
47
  end
42
48
 
43
- Time.send :include, TimePluginizer
44
- DateTime.send :include, TimePluginizer
45
- #Date.send :include, TimePluginizer
49
+ Time.send :include, Appoxy::TimeStuff::Zones
50
+ DateTime.send :include, Appoxy::TimeStuff::Zones
51
+ String.send :include, Appoxy::TimeStuff::StringTimezoner
46
52
 
47
- String.send :include, StringTimezoner
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 11
9
- version: 0.0.11
8
+ - 12
9
+ version: 0.0.12
10
10
  platform: ruby
11
11
  authors:
12
12
  - Travis Reeder
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-01-15 00:00:00 -08:00
17
+ date: 2011-01-27 00:00:00 -08:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -47,12 +47,16 @@ files:
47
47
  - lib/appoxy_rails.rb
48
48
  - lib/appoxy_sessions.rb
49
49
  - lib/appoxy_ui.rb
50
+ - lib/railtie.rb
50
51
  - lib/sessions/application_controller.rb
51
52
  - lib/sessions/sessions_controller.rb
52
53
  - lib/sessions/shareable.rb
53
54
  - lib/sessions/user.rb
54
55
  - lib/sessions/users_controller.rb
56
+ - lib/ui/_geo_location_finder.html.erb
55
57
  - lib/ui/application_helper.rb
58
+ - lib/ui/binding_hack.rb
59
+ - lib/ui/test.rb
56
60
  - lib/ui/time_zoner.rb
57
61
  - README.markdown
58
62
  has_rdoc: true