tkh_mailing_list 0.10 → 0.10.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/app/assets/javascripts/profiles.js.coffee +24 -0
- data/app/controllers/members_controller.rb +1 -1
- data/app/controllers/profiles_controller.rb +6 -2
- data/app/models/profile.rb +11 -0
- data/app/uploaders/portrait_uploader.rb +60 -0
- data/app/views/members/_form.html.erb +11 -2
- data/app/views/members/show.html.erb +7 -0
- data/app/views/profiles/crop.html.erb +21 -0
- data/app/views/profiles/edit.html.erb +9 -0
- data/app/views/profiles/show.html.erb +17 -0
- data/lib/generators/tkh_mailing_list/create_or_update_migrations/create_or_update_migrations_generator.rb +1 -0
- data/lib/generators/tkh_mailing_list/create_or_update_migrations/templates/add_profile_fields_to_users.rb +12 -0
- data/lib/tkh_mailing_list/version.rb +1 -1
- data/lib/tkh_mailing_list.rb +1 -0
- data/tkh_mailing_list.gemspec +2 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 104c30052016f291682421644430d9fee2494c6e
|
4
|
+
data.tar.gz: f6274f06be8db3e74ecbeda8c9a895bafb4821f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 36c0f9beca6534bd765b8aeff82b82ceffb26a1b00bb4800cd3e64287fd82d5f87082ea46fba91561d068f265bfb29ee69b7766911999b2a08ed6a1d812c264a
|
7
|
+
data.tar.gz: 31b1ccf7b3cefb0c4545f2e6a13f45a7e5f15c6596f8fffb501a51c60fc2f5dca687d55412ebc1e4b08813e8f33ed812447618cbe15d3e0285018d06fc314c77
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,13 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
+
## 0.10.1
|
6
|
+
|
7
|
+
* Private profile viewing and editing
|
8
|
+
* Public profile view
|
9
|
+
* User can add portrait photo to their profile and crop it on the fly
|
10
|
+
|
11
|
+
|
5
12
|
## 0.10
|
6
13
|
|
7
14
|
* Added a member resource for admins to update user records. Users are scoped as members.
|
@@ -0,0 +1,24 @@
|
|
1
|
+
jQuery ->
|
2
|
+
new PortraitCropper()
|
3
|
+
|
4
|
+
class PortraitCropper
|
5
|
+
constructor: ->
|
6
|
+
$('#cropbox').Jcrop
|
7
|
+
aspectRatio: 1
|
8
|
+
setSelect: [50, 50, 300, 300]
|
9
|
+
onSelect: @update
|
10
|
+
onChange: @update
|
11
|
+
|
12
|
+
update: (coords) =>
|
13
|
+
$('#profile_crop_x').val(coords.x)
|
14
|
+
$('#profile_crop_y').val(coords.y)
|
15
|
+
$('#profile_crop_w').val(coords.w)
|
16
|
+
$('#profile_crop_h').val(coords.h)
|
17
|
+
@updatePreview(coords)
|
18
|
+
|
19
|
+
updatePreview: (coords) =>
|
20
|
+
$('#preview').css
|
21
|
+
width: Math.round(100/coords.w * $('#cropbox').width()) + 'px'
|
22
|
+
height: Math.round(100/coords.h * $('#cropbox').height()) + 'px'
|
23
|
+
marginLeft: '-' + Math.round(100/coords.w * coords.x) + 'px'
|
24
|
+
marginTop: '-' + Math.round(100/coords.h * coords.y) + 'px'
|
@@ -56,7 +56,7 @@ class MembersController < ApplicationController
|
|
56
56
|
|
57
57
|
# Never trust parameters from the scary internet, only allow the white list through.
|
58
58
|
def member_params
|
59
|
-
params.require(:member).permit
|
59
|
+
params.require(:member).permit :email, :first_name, :last_name, :other_name, :teacher_status, :portrait, :website_url, :facebook_url, :twitter_handle, :google_plus_url, :allow_newsletter, :allow_daily_digests
|
60
60
|
end
|
61
61
|
|
62
62
|
end
|
@@ -12,7 +12,11 @@ class ProfilesController < ApplicationController
|
|
12
12
|
|
13
13
|
def update
|
14
14
|
if @profile.update_attributes(profile_params)
|
15
|
-
|
15
|
+
if params[:profile][:portrait].present?
|
16
|
+
render :crop ## Render the view for cropping
|
17
|
+
else
|
18
|
+
redirect_to profile_path, notice: "<strong><span class=\"glyphicon glyphicon-ok-sign\"></span> Success!</strong> Your profile was updated.".html_safe
|
19
|
+
end
|
16
20
|
else
|
17
21
|
render action: "edit", warning: "<strong>Attention!</strong> A problem occurred while trying to update your profile. Plese try again".html_safe
|
18
22
|
end
|
@@ -31,7 +35,7 @@ class ProfilesController < ApplicationController
|
|
31
35
|
|
32
36
|
# Never trust parameters from the scary internet, only allow the white list through.
|
33
37
|
def profile_params
|
34
|
-
params.require(:profile).permit
|
38
|
+
params.require(:profile).permit :email, :first_name, :last_name, :other_name, :teacher_status, :portrait, :website_url, :facebook_url, :twitter_handle, :google_plus_url, :allow_newsletter, :allow_daily_digests, :crop_x, :crop_y, :crop_w, :crop_h
|
35
39
|
end
|
36
40
|
|
37
41
|
end
|
data/app/models/profile.rb
CHANGED
@@ -1,3 +1,14 @@
|
|
1
1
|
class Profile < User
|
2
2
|
|
3
|
+
mount_uploader :portrait, PortraitUploader
|
4
|
+
# crop_uploaded :portrait
|
5
|
+
|
6
|
+
attr_accessor :crop_x, :crop_y, :crop_w, :crop_h
|
7
|
+
|
8
|
+
after_update :crop_portrait
|
9
|
+
|
10
|
+
def crop_portrait
|
11
|
+
portrait.recreate_versions! if crop_x.present?
|
12
|
+
end
|
13
|
+
|
3
14
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
class PortraitUploader < CarrierWave::Uploader::Base
|
2
|
+
|
3
|
+
include CarrierWave::RMagick
|
4
|
+
storage :file
|
5
|
+
def store_dir
|
6
|
+
# "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" --- that was the suggested one
|
7
|
+
"system/portraits/#{model.class.to_s.underscore}/#{model.id}"
|
8
|
+
end
|
9
|
+
|
10
|
+
# this is used by jcrop as a source photo
|
11
|
+
# better not modify this code.
|
12
|
+
version :xl do
|
13
|
+
process resize_to_limit: [550, 550]
|
14
|
+
end
|
15
|
+
# these 4 vorsions are cropped square by the user
|
16
|
+
version :thumbnail do
|
17
|
+
process :crop
|
18
|
+
resize_to_fill(125,125)
|
19
|
+
end
|
20
|
+
version :small do
|
21
|
+
process :crop
|
22
|
+
resize_to_fill(225, 225)
|
23
|
+
end
|
24
|
+
version :medium do
|
25
|
+
process :crop
|
26
|
+
resize_to_fill(350, 350)
|
27
|
+
end
|
28
|
+
version :large do
|
29
|
+
process :crop
|
30
|
+
resize_to_fill(450, 450)
|
31
|
+
end
|
32
|
+
# version(:xxl) { process :resize_to_limit => [900, 900] }
|
33
|
+
|
34
|
+
def crop
|
35
|
+
if model.crop_x.present?
|
36
|
+
resize_to_limit(550, 550)
|
37
|
+
manipulate! do |img|
|
38
|
+
x = model.crop_x.to_i
|
39
|
+
y = model.crop_y.to_i
|
40
|
+
w = model.crop_w.to_i
|
41
|
+
h = model.crop_h.to_i
|
42
|
+
img.crop!(x, y, w, h)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Add a white list of extensions which are allowed to be uploaded.
|
48
|
+
# For images you might use something like this:
|
49
|
+
def extension_white_list
|
50
|
+
%w(jpg jpeg png)
|
51
|
+
end
|
52
|
+
|
53
|
+
# got this from http://stackoverflow.com/questions/9561641/carrierwave-temp-directory-set-to-uploads-tmp-folder
|
54
|
+
# without this all tmp files would go to /public/uploads/tmp which is not cool at all.
|
55
|
+
def cache_dir
|
56
|
+
# should return path to cache dir
|
57
|
+
Rails.root.join 'tmp/uploads'
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
@@ -1,10 +1,19 @@
|
|
1
|
-
<%= simple_form_for @member do |f| %>
|
1
|
+
<%= simple_form_for @member, :html => { multipart: true } do |f| %>
|
2
2
|
<%= f.error_notification %>
|
3
3
|
|
4
|
+
<h2>Private Fields</h2>
|
5
|
+
<%= f.input :email, label: t('activerecord.attributes.users.email'), hint: 'change with caution!!!! the email is used to login.' %>
|
6
|
+
<%= f.input :allow_newsletter %>
|
7
|
+
<%= f.input :allow_daily_digests %>
|
8
|
+
|
9
|
+
<h2>Public Fields</h2>
|
4
10
|
<%= f.input :first_name, label: t('activerecord.attributes.users.first_name') %>
|
5
11
|
<%= f.input :last_name, label: t('activerecord.attributes.users.last_name') %>
|
6
12
|
<%= f.input :other_name, label: t('activerecord.attributes.users.other_name'), hint: 'nickname, spiritual name, etc.' %>
|
7
|
-
<%= f.input :
|
13
|
+
<%= f.input :website_url %>
|
14
|
+
<%= f.input :facebook_url %>
|
15
|
+
<%= f.input :twitter_handle %>
|
16
|
+
<%= f.input :google_plus_url, label: "Google+ url" %>
|
8
17
|
|
9
18
|
<%= f.button :submit, :class => 'btn btn-primary' %>
|
10
19
|
<% end %>
|
@@ -10,10 +10,17 @@
|
|
10
10
|
<% else %>
|
11
11
|
<h1><%= student.name %></h1>
|
12
12
|
<% end %>
|
13
|
+
<% if Profile.find(@member.id).portrait.present? %>
|
14
|
+
<p id="profile-portrait"><%= image_tag Profile.find(@member.id).portrait_url(:small), title: student.name, alt: student.name, id: 'profile-portrait' %></p>
|
15
|
+
<% end %>
|
13
16
|
</div>
|
14
17
|
|
15
18
|
<table id="profile-attributes">
|
16
19
|
<tbody>
|
20
|
+
<tr><td class="key">website</td><td class="value"><%= link_to student.website_url, student.website_url %></td></tr>
|
21
|
+
<tr><td class="key">facebook</td><td class="value"><%= link_to student.facebook_url, student.facebook_url %></td></tr>
|
22
|
+
<tr><td class="key">twitter</td><td class="value"><%= link_to student.twitter_handle, "https://twitter.com/#{student.twitter_handle}" %></td></tr>
|
23
|
+
<tr><td class="key">google+</td><td class="value"><%= link_to student.google_plus_url, student.google_plus_url %></td></tr>
|
17
24
|
<%= render 'profiles/custom_public_profile_attributes' %>
|
18
25
|
</tbody>
|
19
26
|
</table>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<% content_for :meta_title, "Crop your profile portrait" %>
|
2
|
+
<% content_for :meta_description, "Exact cropping of the profile portrait picture." %>
|
3
|
+
|
4
|
+
<h1>Crop Portrait Photo</h1>
|
5
|
+
|
6
|
+
<%= form_for @profile, url: profile_path, method: :patch do |f| %>
|
7
|
+
<% %w[x y w h].each do |attribute| %>
|
8
|
+
<%= f.hidden_field "crop_#{attribute}" %>
|
9
|
+
<% end %>
|
10
|
+
<%= f.submit "Crop" %>
|
11
|
+
<% end %>
|
12
|
+
|
13
|
+
<div style="width:100px; height:100px; overflow:hidden; display: inline-block; margin-bottom: -8px;">
|
14
|
+
<%= image_tag @profile.portrait.url(:xl), id: "preview" %>
|
15
|
+
</div>
|
16
|
+
|
17
|
+
<br /><br />
|
18
|
+
|
19
|
+
<%= image_tag @profile.portrait_url(:xl), id: "cropbox" %>
|
20
|
+
|
21
|
+
|
@@ -6,11 +6,20 @@
|
|
6
6
|
<%= simple_form_for @profile, url: profile_path do |f| %>
|
7
7
|
<%= f.error_notification %>
|
8
8
|
|
9
|
+
<h1>Private Information</h1>
|
9
10
|
<p>Email: <strong><%= @profile.email %></strong>. Unfortunately, you cannot yet change your email address. This feature is coming soon.</p>
|
11
|
+
<%= f.input :allow_newsletter, label: "Allow rare newsletter? ".html_safe, hint: 'never more than once a month' %>
|
12
|
+
<%= f.input :allow_daily_digests, label: "Allow daily activity digests? ".html_safe, hint: "replies to your comments, etc." %>
|
10
13
|
|
14
|
+
<h1>Public Information</h1>
|
11
15
|
<%= f.input :first_name, label: t('activerecord.attributes.users.first_name') %>
|
12
16
|
<%= f.input :last_name, label: t('activerecord.attributes.users.last_name') %>
|
13
17
|
<%= f.input :other_name, label: render( 'shared/other_name_label') %>
|
18
|
+
<%= f.input :portrait %>
|
19
|
+
<%= f.input :website_url %>
|
20
|
+
<%= f.input :facebook_url %>
|
21
|
+
<%= f.input :twitter_handle %>
|
22
|
+
<%= f.input :google_plus_url, label: "Google+ url" %>
|
14
23
|
|
15
24
|
<%= f.button :submit, :class => 'btn btn-primary' %>
|
16
25
|
<% end %>
|
@@ -12,18 +12,35 @@
|
|
12
12
|
<% else %>
|
13
13
|
<h1><%= @profile.name %></h1>
|
14
14
|
<% end %>
|
15
|
+
<% if @profile.portrait.present? %>
|
16
|
+
<p id="profile-portrait"><%= image_tag @profile.portrait_url(:small), title: @profile.name, alt: @profile.name, id: 'profile-portrait' %></p>
|
17
|
+
<% end %>
|
15
18
|
</div>
|
16
19
|
|
17
20
|
<table id="profile-attributes">
|
18
21
|
<tbody>
|
22
|
+
|
19
23
|
<tr><td class="section" colspan="2"><span class="label label-danger">private information</span></td></tr>
|
20
24
|
<tr><td class="key"><span class="glyphicon glyphicon-envelope"></span> email address</td><td class="value"><%= @profile.email %></td></tr>
|
25
|
+
<tr><td class="key">get rare newsletter</td>
|
26
|
+
<td class="value"><%= @profile.allow_newsletter == true ? "<span class=\"glyphicon glyphicon-ok\"".html_safe : "<span class=\"glyphicon glyphicon-remove\"".html_safe %></td>
|
27
|
+
</tr>
|
28
|
+
<tr>
|
29
|
+
<td class="key">get your daily activity digests</td>
|
30
|
+
<td class="value"><%= @profile.allow_daily_digests == true ? "<span class=\"glyphicon glyphicon-ok\"".html_safe : "<span class=\"glyphicon glyphicon-remove\"".html_safe %></td>
|
31
|
+
</tr>
|
21
32
|
<%= render 'custom_private_profile_attributes' %>
|
33
|
+
|
22
34
|
<tr><td class="section" colspan="2"><span class="label label-success">public information</span></td></tr>
|
23
35
|
<tr><td class="key">first name</td><td class="value"><%= @profile.first_name %></td></tr>
|
24
36
|
<tr><td class="key">last name</td><td class="value"><%= @profile.last_name %></td></tr>
|
25
37
|
<tr><td class="key"><%= render 'shared/other_name_label' %></td><td class="value"><%= @profile.other_name %></td></tr>
|
38
|
+
<tr><td class="key">website</td><td class="value"><%= link_to student.website_url, student.website_url %></td></tr>
|
39
|
+
<tr><td class="key">facebook</td><td class="value"><%= link_to student.facebook_url, student.facebook_url %></td></tr>
|
40
|
+
<tr><td class="key">twitter</td><td class="value"><%= link_to student.twitter_handle, "https://twitter.com/#{student.twitter_handle}" %></td></tr>
|
41
|
+
<tr><td class="key">google+</td><td class="value"><%= link_to student.google_plus_url, student.google_plus_url %></td></tr>
|
26
42
|
<%= render 'custom_public_profile_attributes' %>
|
43
|
+
|
27
44
|
</tbody>
|
28
45
|
</table>
|
29
46
|
|
@@ -18,6 +18,7 @@ module TkhMailingList
|
|
18
18
|
def copy_migrations
|
19
19
|
puts 'creating user migration'
|
20
20
|
migration_template "add_teacher_status_to_users.rb", "db/migrate/add_teacher_status_to_users.rb"
|
21
|
+
migration_template "add_profile_fields_to_users.rb", "db/migrate/add_profile_fields_to_users.rb"
|
21
22
|
end
|
22
23
|
|
23
24
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class AddProfileFieldsToUsers < ActiveRecord::Migration
|
2
|
+
# profile attributes
|
3
|
+
def change
|
4
|
+
add_column :users, :portrait, :string
|
5
|
+
add_column :users, :allow_newsletter, :boolean, default: true
|
6
|
+
add_column :users, :allow_daily_digests, :boolean, default: true
|
7
|
+
add_column :users, :website_url, :string
|
8
|
+
add_column :users, :facebook_url, :string
|
9
|
+
add_column :users, :twitter_handle, :string
|
10
|
+
add_column :users, :google_plus_url, :string
|
11
|
+
end
|
12
|
+
end
|
data/lib/tkh_mailing_list.rb
CHANGED
data/tkh_mailing_list.gemspec
CHANGED
@@ -18,6 +18,8 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
+
# spec.add_dependency 'jcrop-rails-v2'
|
22
|
+
|
21
23
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
24
|
spec.add_development_dependency "rake"
|
23
25
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tkh_mailing_list
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 0.10.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Swami Atma
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,12 +52,14 @@ files:
|
|
52
52
|
- LICENSE.txt
|
53
53
|
- README.md
|
54
54
|
- Rakefile
|
55
|
+
- app/assets/javascripts/profiles.js.coffee
|
55
56
|
- app/controllers/details_controller.rb
|
56
57
|
- app/controllers/members_controller.rb
|
57
58
|
- app/controllers/profiles_controller.rb
|
58
59
|
- app/models/detail.rb
|
59
60
|
- app/models/member.rb
|
60
61
|
- app/models/profile.rb
|
62
|
+
- app/uploaders/portrait_uploader.rb
|
61
63
|
- app/views/details/_form.html.erb
|
62
64
|
- app/views/details/_tab_admin_menu.html.erb
|
63
65
|
- app/views/details/edit.html.erb
|
@@ -74,6 +76,7 @@ files:
|
|
74
76
|
- app/views/profiles/_custom_private_profile_attributes.html.erb
|
75
77
|
- app/views/profiles/_custom_public_profile_attributes.html.erb
|
76
78
|
- app/views/profiles/_tab_menu.html.erb
|
79
|
+
- app/views/profiles/crop.html.erb
|
77
80
|
- app/views/profiles/edit.html.erb
|
78
81
|
- app/views/profiles/history.html.erb
|
79
82
|
- app/views/profiles/show.html.erb
|
@@ -85,6 +88,7 @@ files:
|
|
85
88
|
- lib/generators/tkh_mailing_list/create_or_update_locales/templates/fr.yml
|
86
89
|
- lib/generators/tkh_mailing_list/create_or_update_locales/templates/it.yml
|
87
90
|
- lib/generators/tkh_mailing_list/create_or_update_migrations/create_or_update_migrations_generator.rb
|
91
|
+
- lib/generators/tkh_mailing_list/create_or_update_migrations/templates/add_profile_fields_to_users.rb
|
88
92
|
- lib/generators/tkh_mailing_list/create_or_update_migrations/templates/add_teacher_status_to_users.rb
|
89
93
|
- lib/tasks/tkh_mailing_list_tasks.rake
|
90
94
|
- lib/tkh_mailing_list.rb
|