social_stream-base 0.9.4 → 0.9.5
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/app/assets/stylesheets/0_devise_sign.css +8 -0
- data/app/assets/stylesheets/activities.css +1 -1
- data/app/assets/stylesheets/base.css +2 -2
- data/app/assets/stylesheets/frontpage.css +14 -4
- data/app/assets/stylesheets/search.css +47 -9
- data/app/controllers/groups_controller.rb +2 -2
- data/app/controllers/search_controller.rb +62 -16
- data/app/helpers/activities_helper.rb +4 -4
- data/app/helpers/search_helper.rb +5 -0
- data/app/models/activity.rb +12 -18
- data/app/models/actor.rb +5 -0
- data/app/models/group.rb +20 -21
- data/app/views/activities/_new.html.erb +7 -1
- data/app/views/devise/passwords/new.html.erb +6 -3
- data/app/views/devise/registrations/new.html.erb +14 -9
- data/app/views/devise/sessions/new.html.erb +5 -6
- data/app/views/groups/_new.html.erb +3 -3
- data/app/views/groups/_new_activity.html.erb +1 -0
- data/app/views/groups/_new_activity_fields.html.erb +7 -0
- data/app/views/layouts/_search.html.erb +3 -0
- data/app/views/layouts/application.html.erb +0 -1
- data/app/views/objects/_new_activity.html.erb +0 -6
- data/app/views/search/_focus_search.html.erb +21 -0
- data/app/views/search/_form.html.erb +22 -0
- data/app/views/search/_global_search.html.erb +19 -0
- data/app/views/search/_header_search.html.erb +14 -13
- data/app/views/search/_index.html.erb +10 -30
- data/app/views/search/index.html.erb +2 -1
- data/config/locales/en.yml +14 -4
- data/config/routes.rb +1 -1
- data/lib/social_stream/ability.rb +1 -1
- data/lib/social_stream/base/version.rb +1 -1
- data/lib/social_stream/models/object.rb +19 -1
- data/lib/social_stream/toolbar_config.rb +0 -8
- data/lib/social_stream-base.rb +1 -1
- data/lib/tasks/db/populate.rake +10 -4
- data/spec/controllers/groups_controller_spec.rb +3 -3
- data/spec/controllers/posts_controller_spec.rb +1 -1
- data/spec/factories/group.rb +1 -1
- data/spec/models/activity_spec.rb +0 -21
- data/spec/models/group_spec.rb +1 -1
- data/spec/models/post_spec.rb +26 -0
- metadata +9 -4
data/Rakefile
CHANGED
@@ -1,8 +1,16 @@
|
|
1
|
+
/* This stylesheet overwrites some of the parameters fixed by other stylesheets found in
|
2
|
+
* assets/stylesheets. Since they are compiled all together in alphabetic order, it should be
|
3
|
+
* start by zero to make sure it is the first one to be executed.
|
4
|
+
*/
|
5
|
+
|
1
6
|
#center_body{
|
2
7
|
border: none;
|
3
8
|
width:100%;
|
4
9
|
}
|
5
10
|
|
11
|
+
#footer ul{
|
12
|
+
padding-left: 59px;
|
13
|
+
}
|
6
14
|
#sidebar{
|
7
15
|
display:none;
|
8
16
|
}
|
@@ -13,7 +13,7 @@
|
|
13
13
|
#wrapper_activities_header { padding-top: 5px; padding-bottom: 5px; background-color: #deeff8;}
|
14
14
|
#activities_title { vertical-align: top; margin-left: 10px; font-weight: bold;}
|
15
15
|
#activities_header { width: 100%; margin-bottom: 5px; text-align: center; padding-top: 5px;}
|
16
|
-
#
|
16
|
+
#activities_header input[type="text"] { border-color: #0656a4; color: #2A3890; padding: 5px 5px 5px 5px;
|
17
17
|
border:1px solid #BDC7D8; width:95%;}
|
18
18
|
#activities_share_btn { text-align: right; padding: 5px 16px 0px 10px; vertical-align: middle;}
|
19
19
|
#securities{ display:inline-block; text-align:left; float: left; padding-left:5px;}
|
@@ -18,7 +18,7 @@ h2{padding-left:10px;}
|
|
18
18
|
body{font-size:1.0em; color:#2A3890; background-color:#ffffff; overflow-y: scroll;}
|
19
19
|
#wrapper { background-color: #f5f5f5; width: 100%; margin: 0px auto; }
|
20
20
|
#wrapper_body{min-height: 552px; width: 960px; margin:0px auto; margin-left: auto; margin-right: auto;
|
21
|
-
margin-top: auto; margin-bottom:auto; background-image:none;}
|
21
|
+
margin-top: auto; margin-bottom:auto; background-image:none; padding-bottom: 9px;}
|
22
22
|
|
23
23
|
|
24
24
|
/*********** Notices SECTION *********************/
|
@@ -208,7 +208,7 @@ textarea.new_contact_text_area{ height: 100px; color: #2A3890;}
|
|
208
208
|
}
|
209
209
|
|
210
210
|
.activity_form_selector{
|
211
|
-
padding:
|
211
|
+
padding: 5px;
|
212
212
|
margin-bottom: 5px;
|
213
213
|
float: left;
|
214
214
|
border: 2px solid transparent;
|
@@ -14,13 +14,23 @@
|
|
14
14
|
span.find{ padding-right:5px;}
|
15
15
|
|
16
16
|
/************** sub structure Frontpage **************/
|
17
|
-
#devise_links {padding:
|
18
|
-
#devise_links a{font-weight: bold;line-height: 15px; }
|
17
|
+
#devise_links {padding: 20px 0 5px 5px; margin-left: 20%;}
|
18
|
+
#devise_links a{font-weight: bold;line-height: 15px; color: #777;}
|
19
19
|
#login{ padding-top: 5px;}
|
20
20
|
.instructions{text-align: left; padding-bottom: 5px;}
|
21
|
-
#
|
22
|
-
|
21
|
+
#remember{padding-left:22%; text-align: left;}
|
22
|
+
#user_password_confirmation{vertical-align: 30%;}
|
23
|
+
#user_password_confirmation_label {padding-top: 0;}
|
24
|
+
#welcome{ margin: 50px auto 50px auto; width:330px; padding:20px; border: 4px solid #BDC7D8;
|
25
|
+
background-color: white;-moz-border-radius: 20px;
|
23
26
|
-webkit-border-radius: 20px; border-radius: 20px;}
|
27
|
+
#welcome .form_field{ width: 75%;}
|
28
|
+
#welcome .btn_login { text-align: right; padding-right: 10px;}
|
29
|
+
#welcome .form_label{ width: 20%;}
|
30
|
+
#welcome .form_row{ padding-left: 5px;}
|
31
|
+
#welcome .form_tag{ width: 98%;}
|
32
|
+
#welcome h2{ font-variant: small-caps; text-transform: capitalize; padding: 0; font-size: 20px;
|
33
|
+
text-align: center; }
|
24
34
|
#wrapper_left{ vertical-align:top; width:49%; display:inline-block; padding-left: 20px;}
|
25
35
|
#wrapper_right{ vertical-align:top; width:48%; display:inline-block;}
|
26
36
|
|
@@ -51,6 +51,7 @@
|
|
51
51
|
height: 35px;
|
52
52
|
background: whiteSmoke;
|
53
53
|
overflow: hidden;
|
54
|
+
text-align: center;
|
54
55
|
}
|
55
56
|
#header_search_display li:hover {
|
56
57
|
background: #CFDEFF;
|
@@ -77,6 +78,7 @@
|
|
77
78
|
#header_search_display li.subject_result {
|
78
79
|
padding: 0px;
|
79
80
|
height: 45px;
|
81
|
+
text-align: left;
|
80
82
|
}
|
81
83
|
#header_search_display li.title {
|
82
84
|
overflow: hidden;
|
@@ -86,12 +88,12 @@
|
|
86
88
|
color: whiteSmoke;
|
87
89
|
font-weight: bold;
|
88
90
|
}
|
89
|
-
#header_search_display li.loading {
|
91
|
+
#header_search_display li.loading, #header_search_display li.more, #header_search_display li.none {
|
90
92
|
text-align: center;
|
91
93
|
}
|
92
|
-
#header_search_display li.more
|
93
|
-
|
94
|
-
|
94
|
+
#header_search_display li.more {
|
95
|
+
padding-top: 10px;
|
96
|
+
height: 30px;
|
95
97
|
}
|
96
98
|
#header_search_display li.title:hover, #header_search_display li.more:hover, #header_search_display li.none:hover {
|
97
99
|
}
|
@@ -106,16 +108,52 @@
|
|
106
108
|
padding: 5px;
|
107
109
|
}
|
108
110
|
.subject_search_results {
|
109
|
-
width:
|
110
|
-
float: left;
|
111
|
+
width: 280px;
|
111
112
|
text-align: center;
|
112
|
-
margin: 3px;
|
113
113
|
}
|
114
|
-
|
115
|
-
|
114
|
+
#search_results {
|
115
|
+
text-align: center;
|
116
|
+
}
|
117
|
+
#search_results .left {
|
118
|
+
float: left;
|
119
|
+
padding: 0;
|
120
|
+
}
|
121
|
+
#search_results .right {
|
122
|
+
float: right;
|
123
|
+
padding: 0;
|
124
|
+
}
|
125
|
+
#search_results .title {
|
126
|
+
width: 540px;
|
116
127
|
margin: auto;
|
117
128
|
background-color: #E1EEF5;
|
118
129
|
padding: 5px;
|
119
130
|
font-weight: bold;
|
131
|
+
text-align: center;
|
132
|
+
}
|
133
|
+
#search_results .subject_search_results .title {
|
134
|
+
width: 260px;
|
135
|
+
}
|
136
|
+
/********************************* Focus options ***********/
|
137
|
+
#focus_options ul {
|
138
|
+
list-style: none;
|
139
|
+
}
|
140
|
+
#focus_options ul li {
|
141
|
+
line-height: 27px;
|
142
|
+
vertical-align: top;
|
143
|
+
display: inline;
|
144
|
+
}
|
145
|
+
#focus_options li span:hover {
|
146
|
+
background: #CFDEFF;
|
147
|
+
color: #2A3890;
|
148
|
+
}
|
149
|
+
#focus_options ul li a:hover{
|
150
|
+
text-decoration: none;
|
151
|
+
}
|
152
|
+
#focus_options ul li span{
|
153
|
+
padding: 5px 10px;
|
154
|
+
background-color: #E1EEF5;
|
155
|
+
}
|
156
|
+
#focus_options ul li span.selected{
|
157
|
+
border: solid 1px #2A3890;
|
120
158
|
}
|
121
159
|
/******************** Search css END ***********************/
|
@@ -48,7 +48,7 @@ class GroupsController < InheritedResources::Base
|
|
48
48
|
def set_founder
|
49
49
|
return unless user_signed_in?
|
50
50
|
|
51
|
-
params[:group]
|
52
|
-
params[:group][:
|
51
|
+
params[:group] ||= {}
|
52
|
+
params[:group][:_contact_id] ||= current_subject.ego_contact.id
|
53
53
|
end
|
54
54
|
end
|
@@ -1,35 +1,81 @@
|
|
1
1
|
class SearchController < ApplicationController
|
2
|
-
|
2
|
+
include ActionView::Helpers::SanitizeHelper
|
3
|
+
|
3
4
|
#before_filter :authenticate_user! #??
|
4
|
-
|
5
|
+
|
6
|
+
FOCUS_SEARCH_PER_PAGE = 10
|
5
7
|
def index
|
6
|
-
if params[:
|
7
|
-
@search_result =
|
8
|
-
|
9
|
-
return
|
8
|
+
if params[:search_query].blank?
|
9
|
+
@search_result = nil_search
|
10
|
+
@search_class_sym = params[:focus].singularize.to_sym unless params[:focus].blank?
|
10
11
|
else
|
11
|
-
|
12
|
+
search_query = get_search_query params[:search_query]
|
13
|
+
if params[:mode].eql? "header_search"
|
14
|
+
@search_result = header_search search_query
|
15
|
+
render :partial => "header_search", :locals => {:search_result => @search_result}
|
16
|
+
return
|
17
|
+
else
|
18
|
+
if params[:focus].present?
|
19
|
+
@search_result = focus_search params[:focus], search_query, params[:page].present? ? params[:page].to_i : 1
|
20
|
+
@search_class_sym = params[:focus].singularize.to_sym
|
21
|
+
else
|
22
|
+
@search_result = global_search search_query
|
23
|
+
end
|
24
|
+
end
|
12
25
|
end
|
13
26
|
end
|
14
27
|
|
28
|
+
private
|
15
29
|
|
30
|
+
def get_search_query bare_query
|
31
|
+
search_query = ""
|
32
|
+
bare_query = strip_tags(bare_query) unless bare_query.html_safe?
|
33
|
+
search_query_words = bare_query.strip.split
|
34
|
+
search_query_words.each_index do |i|
|
35
|
+
search_query+= search_query_words[i] + " " if i < (search_query_words.size - 1)
|
36
|
+
search_query+= "*" + search_query_words[i] + "* " if i == (search_query_words.size - 1)
|
37
|
+
end
|
38
|
+
return search_query.strip
|
39
|
+
end
|
16
40
|
|
17
|
-
private
|
18
41
|
def global_search query
|
19
|
-
return search query,
|
42
|
+
return search query, 10
|
20
43
|
end
|
21
|
-
|
44
|
+
|
22
45
|
def header_search query
|
23
|
-
return search query,
|
46
|
+
return search query, 3
|
47
|
+
end
|
48
|
+
|
49
|
+
def search query, max_results
|
50
|
+
result = Hash.new
|
51
|
+
total = 0
|
52
|
+
total_shown = 0
|
53
|
+
SocialStream.subjects.each do |subject_sym|
|
54
|
+
result.update({subject_sym => ThinkingSphinx.search(query, :page => 1, :per_page => max_results, :classes => [subject_sym.to_s.classify.constantize])})
|
55
|
+
result.update({(subject_sym.to_s+"_total").to_sym => ThinkingSphinx.count(query, :classes => [subject_sym.to_s.classify.constantize])})
|
56
|
+
total+=ThinkingSphinx.count(query, :classes => [subject_sym.to_s.classify.constantize])
|
57
|
+
end
|
58
|
+
result.update({:total => total})
|
59
|
+
result.update({:total_shown => total_shown})
|
60
|
+
return result
|
24
61
|
end
|
25
|
-
|
26
|
-
def
|
62
|
+
|
63
|
+
def focus_search string_class, query, page
|
64
|
+
string_class = string_class.singularize
|
65
|
+
search_class = string_class.classify.constantize
|
66
|
+
result = Hash.new
|
67
|
+
result.update({string_class.to_sym => ThinkingSphinx.search(query, :page => page, :per_page => FOCUS_SEARCH_PER_PAGE, :classes => [search_class])})
|
68
|
+
result.update({(string_class+"_total").to_sym => ThinkingSphinx.count(query, :classes => [search_class])})
|
69
|
+
return result
|
70
|
+
end
|
71
|
+
|
72
|
+
def nil_search
|
27
73
|
result = Hash.new
|
28
74
|
SocialStream.subjects.each do |subject_sym|
|
29
|
-
result.update({subject_sym =>
|
30
|
-
result.update({(subject_sym.to_s+"_total").to_sym =>
|
75
|
+
result.update({subject_sym => []})
|
76
|
+
result.update({(subject_sym.to_s+"_total").to_sym => 0})
|
31
77
|
end
|
78
|
+
result.update({:total => 0})
|
32
79
|
return result
|
33
|
-
|
34
80
|
end
|
35
81
|
end
|
@@ -27,10 +27,10 @@ module ActivitiesHelper
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
# Build a new
|
31
|
-
def
|
32
|
-
return
|
30
|
+
# Build a new post based on the current_subject. Useful for authorization queries
|
31
|
+
def new_post(receiver)
|
32
|
+
return Post.new unless user_signed_in?
|
33
33
|
|
34
|
-
|
34
|
+
Post.new :_contact_id => current_subject.contact_to!(receiver).id
|
35
35
|
end
|
36
36
|
end
|
@@ -4,4 +4,9 @@ module SearchHelper
|
|
4
4
|
render :partial => subject.class.to_s.pluralize.downcase + '/' + subject.class.to_s.downcase + '_with_details',
|
5
5
|
:locals => {subject.class.to_s.downcase.to_sym => subject}
|
6
6
|
end
|
7
|
+
|
8
|
+
def focus_search_link text, search_class, query
|
9
|
+
search_class = search_class.to_s if search_class.is_a? Class or search_class.is_a? Symbol
|
10
|
+
link_to text, search_path(:focus => search_class.downcase.pluralize, :search_query => query )
|
11
|
+
end
|
7
12
|
end
|
data/app/models/activity.rb
CHANGED
@@ -222,24 +222,18 @@ class Activity < ActiveRecord::Base
|
|
222
222
|
when 'create'
|
223
223
|
return false if contact.sender_id != Actor.normalize_id(subject)
|
224
224
|
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
receiver.
|
238
|
-
relation_customs.allow(sender, 'create', 'activity').
|
239
|
-
present?
|
240
|
-
end
|
241
|
-
|
242
|
-
return val
|
225
|
+
rels = Relation.normalize(relation_ids)
|
226
|
+
|
227
|
+
own_rels = rels.select{ |r| r.actor_id == contact.sender_id }
|
228
|
+
foreign_rels = rels - own_rels
|
229
|
+
|
230
|
+
# Only posting to own relations or allowed to post to foreign relations
|
231
|
+
return foreign_rels.blank? && own_rels.present? ||
|
232
|
+
foreign_rels.present? && Relation.allow(subject,
|
233
|
+
action,
|
234
|
+
'activity',
|
235
|
+
:in => foreign_rels).
|
236
|
+
all.size == foreign_rels.size
|
243
237
|
|
244
238
|
when 'read'
|
245
239
|
return true if relations.select{ |r| r.is_a?(Relation::Public) }.any?
|
data/app/models/actor.rb
CHANGED
@@ -259,6 +259,11 @@ class Actor < ActiveRecord::Base
|
|
259
259
|
sent_contacts.create!(:receiver => Actor.normalize(subject))
|
260
260
|
end
|
261
261
|
|
262
|
+
# The {Contact} of this {Actor} to self (totally close!)
|
263
|
+
def ego_contact
|
264
|
+
contact_to!(self)
|
265
|
+
end
|
266
|
+
|
262
267
|
def sent_active_contact_ids
|
263
268
|
@sent_active_contact_ids ||=
|
264
269
|
load_sent_active_contact_ids
|
data/app/models/group.rb
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
class Group < ActiveRecord::Base
|
2
2
|
include SocialStream::Models::Subject
|
3
3
|
|
4
|
-
attr_accessor :_founder
|
5
4
|
attr_accessor :_participants
|
6
5
|
|
7
6
|
delegate :description, :description=, :to => :profile!
|
8
7
|
|
9
|
-
after_create :
|
10
|
-
after_create :create_participants
|
8
|
+
after_create :create_ties
|
11
9
|
|
12
10
|
def profile!
|
13
11
|
actor!.profile || actor!.build_profile
|
@@ -23,26 +21,27 @@ class Group < ActiveRecord::Base
|
|
23
21
|
merge(Contact.recent)
|
24
22
|
end
|
25
23
|
end
|
26
|
-
|
27
|
-
# Creates the ties between the group and the founder
|
28
|
-
def create_founder
|
29
|
-
founder =
|
30
|
-
Actor.find_by_slug(_founder) || raise("Cannot create group without founder")
|
31
24
|
|
32
|
-
|
33
|
-
|
25
|
+
private
|
26
|
+
|
27
|
+
# Creates ties from founder to the group, based on _relation_ids,
|
28
|
+
# and ties from the group to founder and participants.
|
29
|
+
def create_ties
|
30
|
+
create_ties_from_founder
|
31
|
+
create_ties_to_participants
|
32
|
+
end
|
33
|
+
|
34
|
+
# Creates the ties from the founder to the group
|
35
|
+
def create_ties_from_founder
|
36
|
+
_contact.sender.sent_contacts.create! :receiver_id => actor_id,
|
37
|
+
:relation_ids => _relation_ids
|
34
38
|
end
|
35
39
|
|
36
|
-
# Creates the ties
|
37
|
-
def
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
participant_actor = Actor.find(participant)
|
43
|
-
|
44
|
-
sent_contacts.create! :receiver => participant_actor,
|
45
|
-
:relation_ids => Array(relation_customs.sort.first.id)
|
46
|
-
end
|
40
|
+
# Creates the ties from the group to the participants
|
41
|
+
def create_ties_to_participants
|
42
|
+
([ _contact.sender_id, _contact.receiver_id ] | Array.wrap(@_participants)).uniq.each do |a|
|
43
|
+
sent_contacts.create! :receiver_id => a,
|
44
|
+
:relation_ids => Array(relation_customs.sort.first.id)
|
45
|
+
end
|
47
46
|
end
|
48
47
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<% if can? :create,
|
1
|
+
<% if can? :create, new_post(receiver) %>
|
2
2
|
<div id="activities_header" class="content_size">
|
3
3
|
<% SocialStream.activity_forms.each do |element| %>
|
4
4
|
<%= render :partial => element.to_s.pluralize+'/new_activity',
|
@@ -6,6 +6,12 @@
|
|
6
6
|
:receiver => receiver
|
7
7
|
} %>
|
8
8
|
<% end %>
|
9
|
+
|
10
|
+
<%= javascript_tag do %>
|
11
|
+
$(function(){
|
12
|
+
activate_anti_rebounds();
|
13
|
+
});
|
14
|
+
<% end %>
|
9
15
|
</div>
|
10
16
|
|
11
17
|
<div id="activity_form_select">
|
@@ -1,11 +1,14 @@
|
|
1
|
+
<% content_for :headers do%>
|
2
|
+
<%= stylesheet_link_tag "0_devise_sign", :media => "screen, projection" %>
|
3
|
+
<%end%>
|
1
4
|
<div id="welcome">
|
2
5
|
<div id="login" class="block">
|
3
|
-
<h2><%= t('
|
6
|
+
<h2><%= t('devise.passwords.forgot') %></h2>
|
4
7
|
<div class="space_center"></div>
|
5
8
|
<div class="space_center"></div>
|
6
9
|
<%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :post }) do |f| %>
|
7
10
|
<%= devise_error_messages! %>
|
8
|
-
<div class="instructions"><%= t('devise.passwords.
|
11
|
+
<div class="instructions"><%= t('devise.passwords.instructions') %></div>
|
9
12
|
<div class="form_row">
|
10
13
|
<div class="form_label"<%= f.label :email %></div>
|
11
14
|
<div class="form_field"><%= f.text_field :email, :class => "form_tag" %></div>
|
@@ -17,7 +20,7 @@
|
|
17
20
|
|
18
21
|
<div class="space_center"></div>
|
19
22
|
<div class="btn_login">
|
20
|
-
<%= f.submit t('action.send'), :class =>"
|
23
|
+
<%= f.submit t('action.send'), :class =>"button" %>
|
21
24
|
</div>
|
22
25
|
<% end %>
|
23
26
|
</div>
|
@@ -1,3 +1,7 @@
|
|
1
|
+
<% content_for :headers do%>
|
2
|
+
<%= stylesheet_link_tag "0_devise_sign", :media => "screen, projection" %>
|
3
|
+
<%end%>
|
4
|
+
|
1
5
|
<div id="welcome">
|
2
6
|
<div id="login" class="block">
|
3
7
|
<h2><%= t('sign_up').capitalize %></h2>
|
@@ -18,22 +22,23 @@
|
|
18
22
|
<div class="form_field"><%= f.password_field :password, :class =>"form_tag", :id => "password" %></div>
|
19
23
|
</div>
|
20
24
|
<div class="form_row">
|
21
|
-
<div class="form_label"
|
25
|
+
<div class="form_label" id="user_password_confirmation_label">
|
26
|
+
<%= f.label t('devise.passwords.confirm') %>
|
27
|
+
</div>
|
22
28
|
<div class="form_field"><%= f.password_field :password_confirmation, :class =>"form_tag" %></div>
|
23
29
|
</div>
|
24
30
|
<div class="form_row center">
|
25
|
-
|
31
|
+
<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
|
32
|
+
<%= link_to t('confirmation.not_received.long'), new_confirmation_path(resource_name) %><br />
|
33
|
+
<% end -%>
|
26
34
|
</div>
|
27
|
-
<% end %>
|
28
|
-
<div class="form_row center">
|
29
|
-
<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
|
30
|
-
<%= link_to t('confirmation.not_received.long'), new_confirmation_path(resource_name) %><br />
|
31
|
-
<% end -%>
|
32
|
-
</div>
|
33
35
|
<div id="devise_links">
|
34
36
|
<%= render :partial => "devise/shared/links" %>
|
35
37
|
</div>
|
36
|
-
|
38
|
+
<div class="form_row center">
|
39
|
+
<div class="btn_login"><%= f.submit t('action.accept').capitalize,:class=>"button" %></div>
|
40
|
+
</div>
|
41
|
+
<% end %>
|
37
42
|
</div>
|
38
43
|
|
39
44
|
|
@@ -17,13 +17,12 @@
|
|
17
17
|
<div class="form_label"><%= f.label :password %></div>
|
18
18
|
<div class="form_field"><%= f.password_field :password, :class => "form_tag" %></div>
|
19
19
|
</div>
|
20
|
-
|
21
|
-
|
20
|
+
<% if devise_mapping.rememberable? -%>
|
21
|
+
<div id="remember">
|
22
|
+
<%= f.check_box :remember_me %> <%= f.label :remember_me %></div>
|
23
|
+
</div>
|
24
|
+
<% end -%>
|
22
25
|
<div id="devise_links">
|
23
|
-
<% if devise_mapping.rememberable? -%>
|
24
|
-
<%= f.check_box :remember_me %> <%= f.label :remember_me %>
|
25
|
-
<% end -%>
|
26
|
-
<div class="space_center"></div>
|
27
26
|
<%= render :partial => "devise/shared/links" %>
|
28
27
|
</div>
|
29
28
|
|
@@ -13,14 +13,14 @@
|
|
13
13
|
|
14
14
|
<%= location(
|
15
15
|
link_to(image_tag("btn/btn_group.png", :class => "menu_icon")+t('group.other'), groups_path),
|
16
|
-
link_to(image_tag("btn/btn_group.png", :class => "menu_icon")+t('group.new.action'), new_group_path
|
16
|
+
link_to(image_tag("btn/btn_group.png", :class => "menu_icon")+t('group.new.action'), new_group_path)
|
17
17
|
) %>
|
18
18
|
|
19
19
|
<div class="space_center"></div>
|
20
20
|
|
21
21
|
<%= form_for @group do |f| %>
|
22
|
-
<% f.object.
|
23
|
-
<%= f.hidden_field :
|
22
|
+
<% f.object._contact_id ||= current_subject.ego_contact.id %>
|
23
|
+
<%= f.hidden_field :_contact_id %>
|
24
24
|
|
25
25
|
<% if @group.errors.any? %>
|
26
26
|
<div id="notice">
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render :partial => 'objects/new_activity', :locals => {:receiver => receiver, :object => Group.new, :remote => false} %>
|
@@ -15,6 +15,9 @@ $(document).ready(function() {
|
|
15
15
|
});
|
16
16
|
$('#header_search_input').click(function(e) {
|
17
17
|
e.stopPropagation();
|
18
|
+
if($("#header_search_input").val()!=""){
|
19
|
+
$("#header_search_display").show();
|
20
|
+
}
|
18
21
|
});
|
19
22
|
$('#header_search_display').click(function(e) {
|
20
23
|
e.stopPropagation();
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<div class="title">
|
2
|
+
<%= @search_class_sym.to_s.capitalize.pluralize %>
|
3
|
+
</div>
|
4
|
+
<br class="clearfloat" />
|
5
|
+
<% if @search_result[@search_class_sym].empty? %>
|
6
|
+
<div class="subject_with_details">
|
7
|
+
<%= I18n.t('search.no_subject_found', :subject => @search_class_sym.to_s) %>
|
8
|
+
</div>
|
9
|
+
<% else %>
|
10
|
+
<% total = 0 %>
|
11
|
+
<div class="subject_search_results block left">
|
12
|
+
<% @search_result[@search_class_sym].each do |subject|%>
|
13
|
+
<%= subject_with_details subject %>
|
14
|
+
<% total+=1 %>
|
15
|
+
<% if (total%(SearchController::FOCUS_SEARCH_PER_PAGE/2)==0) %>
|
16
|
+
</div>
|
17
|
+
<div class="subject_search_results block left">
|
18
|
+
<% end %>
|
19
|
+
<% end %>
|
20
|
+
</div>
|
21
|
+
<% end %>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<div id="search_form">
|
2
|
+
<form action="<%= search_path %>" method="get">
|
3
|
+
<div class="block">
|
4
|
+
<%= hidden_field_tag :focus, params[:focus] %>
|
5
|
+
<div class="form_row search_row">
|
6
|
+
<%= text_field_tag :search_query, params[:search_query].present? ? params[:search_query] : nil ,:autocomplete => :off, :id => :global_search_input %>
|
7
|
+
</div>
|
8
|
+
<div id="focus_options" class="form_row search_row">
|
9
|
+
<ul>
|
10
|
+
<li><%= link_to content_tag(:span,t('search.show_all'),:class => params[:focus].blank? ? 'selected' : ''), search_path, :search_query => params[:search_query] %></li>
|
11
|
+
<% SocialStream.subjects.each do |subject| %>
|
12
|
+
<% selected_class = (params[:focus].present? and params[:focus].pluralize.downcase.eql?(subject.to_s.pluralize.downcase)) ? 'selected' : ''%>
|
13
|
+
<li><%= focus_search_link content_tag(:span, subject.to_s.pluralize.capitalize,
|
14
|
+
:class => selected_class),
|
15
|
+
subject.to_s.classify.constantize,
|
16
|
+
params[:search_query] %></li>
|
17
|
+
<% end %>
|
18
|
+
</ul>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
</form>
|
22
|
+
</div>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<% SocialStream.subjects.each do |subject_type| %>
|
2
|
+
<div class="subject_search_results block <%= cycle "left", "right" %>">
|
3
|
+
<div class="title">
|
4
|
+
<%= subject_type.to_s.capitalize.pluralize %>
|
5
|
+
</div>
|
6
|
+
<% if @search_result[subject_type].empty? %>
|
7
|
+
<div class="subject_with_details">
|
8
|
+
<%= I18n.t('search.no_subject_found', :subject => subject_type.to_s) %>
|
9
|
+
</div>
|
10
|
+
<% else %>
|
11
|
+
<% @search_result[subject_type].each do |subject|%>
|
12
|
+
<%= subject_with_details subject %>
|
13
|
+
<% end %>
|
14
|
+
<div class="subject_with_details">
|
15
|
+
<%= focus_search_link(I18n.t('search.all_subject_results', :subject => subject_type.to_s.pluralize, :count => @search_result[(subject_type.to_s+"_total").to_sym].to_s),subject_type.to_s,params[:search_query]) %>
|
16
|
+
</div>
|
17
|
+
<% end %>
|
18
|
+
</div>
|
19
|
+
<% end %>
|
@@ -1,21 +1,22 @@
|
|
1
|
+
<% total = 0 %>
|
1
2
|
<ul>
|
2
|
-
<% SocialStream.subjects.each do |subject_type| %>
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
</li>
|
7
|
-
<% if @search_result[subject_type].empty? %>
|
8
|
-
<li class="none">
|
9
|
-
<%= I18n.t('search.no_subject_found', :subject => subject_type.to_s) %>
|
3
|
+
<% SocialStream.subjects.each do |subject_type| %>
|
4
|
+
<% unless @search_result[subject_type].empty? %>
|
5
|
+
<li class="title">
|
6
|
+
<%= subject_type.to_s.capitalize.pluralize %>
|
10
7
|
</li>
|
11
|
-
<% else %>
|
12
8
|
<% @search_result[subject_type].each do |subject|%>
|
9
|
+
<% total+=1 %>
|
13
10
|
<li class="subject_result"><%= subject_with_details subject %></li>
|
14
11
|
<% end %>
|
15
|
-
<li class="more">
|
16
|
-
<%= I18n.t('search.all_subject_results', :subject => subject_type.to_s.pluralize, :count => @search_result[(subject_type.to_s+"_total").to_sym].to_s) %>
|
17
|
-
</li>
|
18
12
|
<% end %>
|
19
13
|
</li>
|
20
|
-
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
<%= link_to raw('<li class="more">' +
|
17
|
+
t('search.global.query', :query => truncate(params[:search_query],:length => 20)) +
|
18
|
+
'<br>' +
|
19
|
+
t('search.global.first_result.' + (total==1 ? 'one' : 'more'),
|
20
|
+
:count => total.to_s) + '</li>'),
|
21
|
+
search_path(:search_query => params[:search_query]) %>
|
21
22
|
</ul>
|
@@ -1,35 +1,15 @@
|
|
1
|
-
<%= location(link_to(t('search.name')))%>
|
1
|
+
<%= location(link_to(t('search.global.name')))%>
|
2
2
|
<br class="clearfloat" />
|
3
3
|
<div class="space_center"></div>
|
4
|
-
<h2><%= t('search.
|
4
|
+
<h2><%= t('search.searching', :query => truncate(params[:search_query],:length => 45)) %></h2>
|
5
5
|
<div class="space_center"></div>
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
</div>
|
15
|
-
<div id="search_results" class="block">
|
16
|
-
<% SocialStream.subjects.each do |subject_type| %>
|
17
|
-
<div class="subject_search_results" class="block">
|
18
|
-
<div class="title">
|
19
|
-
<%= subject_type.to_s.capitalize.pluralize %>
|
20
|
-
</div>
|
21
|
-
<% if @search_result[subject_type].empty? %>
|
22
|
-
<div class="subject_with_details">
|
23
|
-
<%= I18n.t('search.no_subject_found', :subject => subject_type.to_s) %>
|
24
|
-
</div>
|
25
|
-
<% else %>
|
26
|
-
<% @search_result[subject_type].each do |subject|%>
|
27
|
-
<%= subject_with_details subject %>
|
28
|
-
<% end %>
|
29
|
-
<div class="subject_with_details">
|
30
|
-
<%= I18n.t('search.all_subject_results', :subject => subject_type.to_s.pluralize, :count => @search_result[(subject_type.to_s+"_total").to_sym].to_s) %>
|
31
|
-
</div>
|
32
|
-
<% end %>
|
33
|
-
</div>
|
6
|
+
<%= render :partial => 'form' %>
|
7
|
+
<div class="space_center"></div>
|
8
|
+
<div class="space_center"></div>
|
9
|
+
<div id="search_results" class="block">
|
10
|
+
<% unless params[:focus].present? %>
|
11
|
+
<%= render :partial => 'global_search' %>
|
12
|
+
<% else %>
|
13
|
+
<%= render :partial => 'focus_search' %>
|
34
14
|
<% end %>
|
35
15
|
</div>
|
data/config/locales/en.yml
CHANGED
@@ -127,8 +127,9 @@ en:
|
|
127
127
|
confirm: Delete %{element}}?
|
128
128
|
devise:
|
129
129
|
passwords:
|
130
|
-
acquire: "Type the email address bound to your account and we will sent you a new one:"
|
131
130
|
confirm: "Confirm password"
|
131
|
+
forgot: "Forgot your password?"
|
132
|
+
instructions: "Type the email address bound to your account and we will sent you instructions to change it:"
|
132
133
|
update: "Change your password"
|
133
134
|
follower:
|
134
135
|
n:
|
@@ -163,6 +164,9 @@ en:
|
|
163
164
|
all: "All groups"
|
164
165
|
all_n: "All groups (%{count})"
|
165
166
|
by: "By groups"
|
167
|
+
form:
|
168
|
+
title: "Group"
|
169
|
+
input: "What is the name of the group?"
|
166
170
|
last: "Last groups"
|
167
171
|
my: "My groups"
|
168
172
|
new:
|
@@ -233,8 +237,6 @@ en:
|
|
233
237
|
read: "Mark as read"
|
234
238
|
read_all: "Mark all as read"
|
235
239
|
unread: "Mark as unread"
|
236
|
-
password:
|
237
|
-
forgot: "Acquire a new password"
|
238
240
|
post:
|
239
241
|
confirm_delete: "Delete post?"
|
240
242
|
form:
|
@@ -327,10 +329,18 @@ en:
|
|
327
329
|
search:
|
328
330
|
actor:
|
329
331
|
none: "Nothing found"
|
332
|
+
all_subject_results: "Search all %{subject} (%{count})"
|
330
333
|
at_least: "Write at least two characters"
|
334
|
+
global:
|
335
|
+
name: "Global search"
|
336
|
+
first_result:
|
337
|
+
more: "Showing the first %{count} results."
|
338
|
+
one: "Showing the first result."
|
339
|
+
query: "See more results for %{query} >"
|
331
340
|
name: "Search"
|
332
341
|
no_subject_found: "No %{subject} was found."
|
333
|
-
|
342
|
+
searching: "Searching: %{query}"
|
343
|
+
show_all: "Show all results"
|
334
344
|
write: "Write your query ..."
|
335
345
|
wrong: "There seems to be a problem with the search engine"
|
336
346
|
settings:
|
data/config/routes.rb
CHANGED
@@ -7,7 +7,8 @@ module SocialStream
|
|
7
7
|
extend ActiveSupport::Concern
|
8
8
|
|
9
9
|
included do
|
10
|
-
attr_accessor :_contact_id
|
10
|
+
attr_accessor :_contact_id
|
11
|
+
attr_writer :_relation_ids
|
11
12
|
attr_accessor :_activity_parent_id
|
12
13
|
|
13
14
|
belongs_to :activity_object, :dependent => :destroy, :autosave => true
|
@@ -61,6 +62,23 @@ module SocialStream
|
|
61
62
|
@_contact ||= Contact.find(_contact_id)
|
62
63
|
end
|
63
64
|
|
65
|
+
def _relation_ids
|
66
|
+
@_relation_ids ||=
|
67
|
+
if _contact_id.nil?
|
68
|
+
nil
|
69
|
+
else
|
70
|
+
if _contact.reflexive?
|
71
|
+
Array.wrap(_contact.sender.relation_public.id)
|
72
|
+
else
|
73
|
+
_contact.
|
74
|
+
receiver.
|
75
|
+
relation_customs.
|
76
|
+
allow(_contact.sender, 'create', 'activity').
|
77
|
+
map(&:id)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
64
82
|
def _activity_parent
|
65
83
|
@_activity_parent ||= Activity.find(_activity_parent_id)
|
66
84
|
end
|
@@ -43,14 +43,6 @@ module SocialStream
|
|
43
43
|
{:key => :invitations, :name => image_tag("btn/btn_invitation.png")+t('invitation.toolbar'), :url => new_invitation_path}
|
44
44
|
]}
|
45
45
|
|
46
|
-
#Subjects
|
47
|
-
items << {:key => :groups,
|
48
|
-
:name => image_tag("btn/btn_group.png")+t('group.other'),
|
49
|
-
:url => "#",
|
50
|
-
:options => {:link => {:id => "groups_menu"}},
|
51
|
-
:items => [{:key => :new_group ,:name => image_tag("btn/btn_group.png")+t('group.new.action'),:url => new_group_path('group' => { '_founder' => current_subject.slug })}]
|
52
|
-
}
|
53
|
-
|
54
46
|
render_items items
|
55
47
|
end
|
56
48
|
|
data/lib/social_stream-base.rb
CHANGED
data/lib/tasks/db/populate.rake
CHANGED
@@ -11,6 +11,12 @@ namespace :db do
|
|
11
11
|
task :create => :environment do
|
12
12
|
|
13
13
|
LOGOS_PATH = File.join(Rails.root, 'lib', 'logos')
|
14
|
+
USERS = ENV["USERS"].to_i || 9
|
15
|
+
GROUPS = ENV["GROUPS"].to_i || 10
|
16
|
+
if ENV["HARDCORE"].present?
|
17
|
+
USERS = 999
|
18
|
+
GROUPS = 1000
|
19
|
+
end
|
14
20
|
|
15
21
|
Mailboxer.setup do |config|
|
16
22
|
config.uses_emails = false
|
@@ -40,7 +46,7 @@ namespace :db do
|
|
40
46
|
end
|
41
47
|
end
|
42
48
|
|
43
|
-
puts 'User population'
|
49
|
+
puts 'User population (Demo and ' + USERS.to_s + ' users more)'
|
44
50
|
users_start = Time.now
|
45
51
|
|
46
52
|
# = Users
|
@@ -55,7 +61,7 @@ namespace :db do
|
|
55
61
|
|
56
62
|
require 'forgery'
|
57
63
|
|
58
|
-
|
64
|
+
USERS.times do
|
59
65
|
User.create! :name => Forgery::Name.full_name,
|
60
66
|
:email => Forgery::Internet.email_address,
|
61
67
|
:password => 'demonstration',
|
@@ -66,13 +72,13 @@ namespace :db do
|
|
66
72
|
users_end = Time.now
|
67
73
|
puts ' -> ' + (users_end - users_start).round(4).to_s + 's'
|
68
74
|
|
69
|
-
puts 'Groups population'
|
75
|
+
puts 'Groups population (' + GROUPS.to_s + ' groups)'
|
70
76
|
groups_start = Time.now
|
71
77
|
|
72
78
|
# = Groups
|
73
79
|
available_actors = Actor.all
|
74
80
|
|
75
|
-
|
81
|
+
GROUPS.times do
|
76
82
|
founder = available_actors[rand(available_actors.size)]
|
77
83
|
|
78
84
|
Group.create! :name => Forgery::Name.company_name,
|
@@ -30,7 +30,7 @@ describe GroupsController do
|
|
30
30
|
|
31
31
|
context "faking a new group" do
|
32
32
|
before do
|
33
|
-
model_attributes[:
|
33
|
+
model_attributes[:_contact_id] = Factory(:user).ego_contact.id
|
34
34
|
end
|
35
35
|
|
36
36
|
it_should_behave_like "Deny Creating"
|
@@ -81,7 +81,7 @@ describe GroupsController do
|
|
81
81
|
|
82
82
|
context "a new own group" do
|
83
83
|
before do
|
84
|
-
model_attributes[:
|
84
|
+
model_attributes[:_contact_id] = @user.ego_contact.id
|
85
85
|
end
|
86
86
|
|
87
87
|
it "should allow creating" do
|
@@ -127,7 +127,7 @@ describe GroupsController do
|
|
127
127
|
|
128
128
|
context "a new fake group" do
|
129
129
|
before do
|
130
|
-
model_attributes[:
|
130
|
+
model_attributes[:_contact_id] = Factory(:user).ego_contact.id
|
131
131
|
end
|
132
132
|
|
133
133
|
it_should_behave_like "Deny Creating"
|
data/spec/factories/group.rb
CHANGED
@@ -128,25 +128,4 @@ describe Activity do
|
|
128
128
|
end
|
129
129
|
end
|
130
130
|
end
|
131
|
-
|
132
|
-
context "without relations" do
|
133
|
-
it "should allow create to friend" do
|
134
|
-
tie = Factory(:friend)
|
135
|
-
|
136
|
-
activity = Activity.new :contact_id => tie.contact.inverse!.id
|
137
|
-
|
138
|
-
assert activity.allow?(tie.receiver, 'create')
|
139
|
-
end
|
140
|
-
|
141
|
-
it "should fill relation" do
|
142
|
-
tie = Factory(:friend)
|
143
|
-
|
144
|
-
post = Post.new :text => "testing",
|
145
|
-
:_contact_id => tie.contact.inverse!.id
|
146
|
-
|
147
|
-
post.save!
|
148
|
-
|
149
|
-
post.post_activity.relations.should include(tie.relation)
|
150
|
-
end
|
151
|
-
end
|
152
131
|
end
|
data/spec/models/group_spec.rb
CHANGED
data/spec/models/post_spec.rb
CHANGED
@@ -30,4 +30,30 @@ describe Post do
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
33
|
+
|
34
|
+
context "without relations" do
|
35
|
+
it "should allow create to friend" do
|
36
|
+
tie = Factory(:friend)
|
37
|
+
|
38
|
+
post = Post.new :text => "testing",
|
39
|
+
:_contact_id => tie.contact.inverse!.id
|
40
|
+
|
41
|
+
assert post.build_post_activity.allow? tie.receiver_subject, 'create'
|
42
|
+
|
43
|
+
ability = Ability.new(tie.receiver_subject)
|
44
|
+
|
45
|
+
ability.should be_able_to(:create, post)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should fill relation" do
|
49
|
+
tie = Factory(:friend)
|
50
|
+
|
51
|
+
post = Post.new :text => "testing",
|
52
|
+
:_contact_id => tie.contact.inverse!.id
|
53
|
+
|
54
|
+
post.save!
|
55
|
+
|
56
|
+
post.post_activity.relations.should include(tie.relation)
|
57
|
+
end
|
58
|
+
end
|
33
59
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: social_stream-base
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 49
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 9
|
9
|
-
-
|
10
|
-
version: 0.9.
|
9
|
+
- 5
|
10
|
+
version: 0.9.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- GING - DIT - UPM
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-09-
|
19
|
+
date: 2011-09-20 00:00:00 +02:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -775,6 +775,8 @@ files:
|
|
775
775
|
- app/views/groups/_group_with_details.html.erb
|
776
776
|
- app/views/groups/_index.html.erb
|
777
777
|
- app/views/groups/_new.html.erb
|
778
|
+
- app/views/groups/_new_activity.html.erb
|
779
|
+
- app/views/groups/_new_activity_fields.html.erb
|
778
780
|
- app/views/groups/_sidebar_index.html.erb
|
779
781
|
- app/views/groups/_sidebar_show.html.erb
|
780
782
|
- app/views/groups/index.html.erb
|
@@ -853,6 +855,9 @@ files:
|
|
853
855
|
- app/views/relation/customs/create.js.erb
|
854
856
|
- app/views/relation/customs/index.html.erb
|
855
857
|
- app/views/relation/customs/update.js.erb
|
858
|
+
- app/views/search/_focus_search.html.erb
|
859
|
+
- app/views/search/_form.html.erb
|
860
|
+
- app/views/search/_global_search.html.erb
|
856
861
|
- app/views/search/_header_search.html.erb
|
857
862
|
- app/views/search/_index.html.erb
|
858
863
|
- app/views/search/index.html.erb
|