social_stream-base 0.9.4 → 0.9.5
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/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
|