social_stream-base 0.9.5 → 0.9.6
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/app/assets/images/mini-loading.gif +0 -0
- data/app/assets/javascripts/preloader.js +6 -0
- data/app/assets/javascripts/search.js.erb +1 -0
- data/app/assets/stylesheets/search.css +10 -3
- data/app/controllers/contacts_controller.rb +17 -9
- data/app/controllers/search_controller.rb +33 -33
- data/app/helpers/contacts_helper.rb +7 -3
- data/app/helpers/search_helper.rb +7 -1
- data/app/models/contact.rb +7 -4
- data/app/models/relation/single.rb +1 -1
- data/app/views/avatars/index.html.erb +1 -1
- data/app/views/search/_focus_search.html.erb +3 -2
- data/app/views/search/_form.html.erb +27 -5
- data/app/views/search/_index.html.erb +1 -1
- data/app/views/search/index.js.erb +25 -0
- data/config/locales/en.yml +7 -1
- data/lib/generators/social_stream/base/templates/sphinx.yml +3 -3
- data/lib/social_stream/base/version.rb +1 -1
- data/lib/social_stream/migrations/components.rb +19 -0
- data/lib/tasks/db/populate.rake +13 -5
- data/spec/controllers/comments_controller_spec.rb +1 -1
- data/spec/controllers/contacts_controller_spec.rb +24 -1
- data/spec/controllers/frontpage_controller_spec.rb +1 -1
- data/spec/controllers/groups_controller_spec.rb +1 -1
- data/spec/controllers/home_controller_spec.rb +1 -1
- data/spec/controllers/likes_controller_spec.rb +1 -1
- data/spec/controllers/notifications_controller_spec.rb +2 -2
- data/spec/controllers/permissions_controller_spec.rb +1 -1
- data/spec/controllers/posts_controller_spec.rb +1 -1
- data/spec/controllers/profiles_controller_spec.rb +1 -1
- data/spec/controllers/relation_customs_controller_spec.rb +1 -1
- data/spec/controllers/representations_spec.rb +1 -1
- data/spec/controllers/settings_controller_spec.rb +2 -2
- data/spec/controllers/subjects_controller.rb +1 -1
- data/spec/controllers/users_controller_spec.rb +1 -1
- data/spec/integration/navigation_spec.rb +1 -1
- data/spec/models/activity_authorization_spec.rb +1 -1
- data/spec/models/activity_spec.rb +1 -1
- data/spec/models/actor_spec.rb +1 -1
- data/spec/models/contact_spec.rb +1 -1
- data/spec/models/group_spec.rb +1 -1
- data/spec/models/like_spec.rb +1 -1
- data/spec/models/post_spec.rb +1 -1
- data/spec/models/profile_spec.rb +1 -1
- data/spec/models/relation_spec.rb +1 -1
- data/spec/models/tie_spec.rb +1 -1
- data/spec/models/user_spec.rb +1 -1
- data/vendor/assets/javascripts/jquery.validate.js +1112 -1078
- data/vendor/assets/javascripts/jquery.validate.old.js +1132 -0
- metadata +9 -5
- data/.travis.yml +0 -4
Binary file
|
@@ -101,6 +101,9 @@
|
|
101
101
|
width: 100%;
|
102
102
|
}
|
103
103
|
/********************************* Global ******************/
|
104
|
+
#global_search_input.searching {
|
105
|
+
background: url('mini-loading.gif') 5px 50% no-repeat white;
|
106
|
+
}
|
104
107
|
.search_row {
|
105
108
|
text-align: center;
|
106
109
|
}
|
@@ -133,6 +136,10 @@
|
|
133
136
|
#search_results .subject_search_results .title {
|
134
137
|
width: 260px;
|
135
138
|
}
|
139
|
+
/********************************* Form and errors *********/
|
140
|
+
#search_form .error {
|
141
|
+
display: none;
|
142
|
+
}
|
136
143
|
/********************************* Focus options ***********/
|
137
144
|
#focus_options ul {
|
138
145
|
list-style: none;
|
@@ -146,14 +153,14 @@
|
|
146
153
|
background: #CFDEFF;
|
147
154
|
color: #2A3890;
|
148
155
|
}
|
149
|
-
#focus_options ul li a:hover{
|
156
|
+
#focus_options ul li a:hover {
|
150
157
|
text-decoration: none;
|
151
158
|
}
|
152
|
-
#focus_options ul li span{
|
159
|
+
#focus_options ul li span {
|
153
160
|
padding: 5px 10px;
|
154
161
|
background-color: #E1EEF5;
|
155
162
|
}
|
156
|
-
#focus_options ul li span.selected{
|
163
|
+
#focus_options ul li span.selected {
|
157
164
|
border: solid 1px #2A3890;
|
158
165
|
}
|
159
166
|
/******************** Search css END ***********************/
|
@@ -1,5 +1,7 @@
|
|
1
1
|
class ContactsController < ApplicationController
|
2
2
|
before_filter :authenticate_user!
|
3
|
+
before_filter :exclude_reflexive, :except => [ :index, :pending ]
|
4
|
+
|
3
5
|
def index
|
4
6
|
if params[:pending].present?
|
5
7
|
pending
|
@@ -20,15 +22,14 @@ class ContactsController < ApplicationController
|
|
20
22
|
end
|
21
23
|
|
22
24
|
def edit
|
23
|
-
@contact = current_subject.sent_contacts.find params[:id]
|
24
25
|
end
|
25
26
|
|
26
27
|
def update
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
params[:contact][:relation_ids].
|
28
|
+
# FIXME: This should be in the model
|
29
|
+
if params[:contact][:relation_ids].present? &&
|
30
|
+
params[:contact][:relation_ids].delete("gotcha") &&
|
31
|
+
params[:contact][:relation_ids].blank?
|
32
|
+
params[:contact][:relation_ids] << @contact.sender.relation_public.id
|
32
33
|
end
|
33
34
|
|
34
35
|
if @contact.update_attributes(params[:contact])
|
@@ -39,8 +40,6 @@ class ContactsController < ApplicationController
|
|
39
40
|
end
|
40
41
|
|
41
42
|
def destroy
|
42
|
-
@contact = current_subject.sent_contacts.find params[:id]
|
43
|
-
|
44
43
|
@contact.relation_ids = [current_subject.relation_reject.id]
|
45
44
|
|
46
45
|
respond_to do |format|
|
@@ -49,7 +48,6 @@ class ContactsController < ApplicationController
|
|
49
48
|
end
|
50
49
|
|
51
50
|
def pending
|
52
|
-
|
53
51
|
@contacts = current_subject.pending_contacts
|
54
52
|
|
55
53
|
respond_to do |format|
|
@@ -58,4 +56,14 @@ class ContactsController < ApplicationController
|
|
58
56
|
format.json { render :text => @contacts.map{ |c| { 'key' => c.receiver_id.to_s, 'value' => self.class.helpers.truncate_name(c.receiver.name) } }.to_json }
|
59
57
|
end
|
60
58
|
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def exclude_reflexive
|
63
|
+
@contact = current_subject.sent_contacts.find params[:id]
|
64
|
+
|
65
|
+
if @contact.reflexive?
|
66
|
+
redirect_to home_path
|
67
|
+
end
|
68
|
+
end
|
61
69
|
end
|
@@ -3,23 +3,22 @@ class SearchController < ApplicationController
|
|
3
3
|
|
4
4
|
#before_filter :authenticate_user! #??
|
5
5
|
|
6
|
-
FOCUS_SEARCH_PER_PAGE
|
6
|
+
FOCUS_SEARCH_PER_PAGE=16
|
7
|
+
MIN_QUERY=2
|
7
8
|
def index
|
8
|
-
|
9
|
+
@search_class_sym = params[:focus].singularize.to_sym unless params[:focus].blank?
|
10
|
+
if params[:search_query].blank? or too_short_query
|
9
11
|
@search_result = nil_search
|
10
|
-
@search_class_sym = params[:focus].singularize.to_sym unless params[:focus].blank?
|
11
12
|
else
|
12
|
-
search_query = get_search_query params[:search_query]
|
13
13
|
if params[:mode].eql? "header_search"
|
14
|
-
@search_result = header_search
|
14
|
+
@search_result = header_search
|
15
15
|
render :partial => "header_search", :locals => {:search_result => @search_result}
|
16
16
|
return
|
17
17
|
else
|
18
18
|
if params[:focus].present?
|
19
|
-
@search_result = focus_search
|
20
|
-
@search_class_sym = params[:focus].singularize.to_sym
|
19
|
+
@search_result = focus_search
|
21
20
|
else
|
22
|
-
@search_result = global_search
|
21
|
+
@search_result = global_search
|
23
22
|
end
|
24
23
|
end
|
25
24
|
end
|
@@ -27,55 +26,56 @@ class SearchController < ApplicationController
|
|
27
26
|
|
28
27
|
private
|
29
28
|
|
30
|
-
def
|
29
|
+
def too_short_query
|
30
|
+
bare_query = strip_tags(params[:search_query]) unless bare_query.html_safe?
|
31
|
+
return bare_query.strip.size < MIN_QUERY
|
32
|
+
end
|
33
|
+
|
34
|
+
def get_search_query
|
31
35
|
search_query = ""
|
32
|
-
bare_query = strip_tags(
|
36
|
+
bare_query = strip_tags(params[:search_query]) unless bare_query.html_safe?
|
33
37
|
search_query_words = bare_query.strip.split
|
34
38
|
search_query_words.each_index do |i|
|
35
39
|
search_query+= search_query_words[i] + " " if i < (search_query_words.size - 1)
|
36
40
|
search_query+= "*" + search_query_words[i] + "* " if i == (search_query_words.size - 1)
|
37
41
|
end
|
38
|
-
return search_query.strip
|
42
|
+
return search_query.strip
|
39
43
|
end
|
40
44
|
|
41
|
-
def global_search
|
42
|
-
return search
|
45
|
+
def global_search
|
46
|
+
return search 6
|
43
47
|
end
|
44
48
|
|
45
|
-
def header_search
|
46
|
-
return search
|
49
|
+
def header_search
|
50
|
+
return search 3
|
47
51
|
end
|
48
52
|
|
49
|
-
def search
|
53
|
+
def search max_results
|
50
54
|
result = Hash.new
|
51
|
-
total = 0
|
52
55
|
total_shown = 0
|
53
56
|
SocialStream.subjects.each do |subject_sym|
|
54
|
-
result.update({subject_sym => ThinkingSphinx.search(
|
55
|
-
result.update({(subject_sym.to_s+"_total").to_sym => ThinkingSphinx.count(
|
56
|
-
total+=ThinkingSphinx.count(query, :classes => [subject_sym.to_s.classify.constantize])
|
57
|
+
result.update({subject_sym => ThinkingSphinx.search(get_search_query, :classes => [subject_sym.to_s.classify.constantize]).page(1).per(max_results)})
|
58
|
+
result.update({(subject_sym.to_s+"_total").to_sym => ThinkingSphinx.count(get_search_query, :classes => [subject_sym.to_s.classify.constantize])})
|
57
59
|
end
|
58
|
-
result.update({:total => total})
|
59
|
-
result.update({:total_shown => total_shown})
|
60
60
|
return result
|
61
61
|
end
|
62
62
|
|
63
|
-
def focus_search
|
64
|
-
string_class =
|
63
|
+
def focus_search
|
64
|
+
string_class = params[:focus].singularize
|
65
65
|
search_class = string_class.classify.constantize
|
66
|
-
|
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
|
66
|
+
return ThinkingSphinx.search(get_search_query, :classes => [search_class]).page(params[:page]).per(FOCUS_SEARCH_PER_PAGE)
|
70
67
|
end
|
71
68
|
|
72
69
|
def nil_search
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
result
|
70
|
+
if params[:focus].present?
|
71
|
+
result = []
|
72
|
+
else
|
73
|
+
result = Hash.new
|
74
|
+
SocialStream.subjects.each do |subject_sym|
|
75
|
+
result.update({subject_sym => []})
|
76
|
+
result.update({(subject_sym.to_s+"_total").to_sym => 0})
|
77
|
+
end
|
77
78
|
end
|
78
|
-
result.update({:total => 0})
|
79
79
|
return result
|
80
80
|
end
|
81
81
|
end
|
@@ -4,9 +4,13 @@ module ContactsHelper
|
|
4
4
|
end
|
5
5
|
|
6
6
|
def contact_link(c)
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
if c.reflexive?
|
8
|
+
t('subject.this_is_you')
|
9
|
+
else
|
10
|
+
link_to c.status,
|
11
|
+
edit_contact_path(c),
|
12
|
+
:title => t("contact.#{ c.action }.title", :name => c.receiver.name)
|
13
|
+
end
|
10
14
|
|
11
15
|
end
|
12
16
|
|
@@ -7,6 +7,12 @@ module SearchHelper
|
|
7
7
|
|
8
8
|
def focus_search_link text, search_class, query
|
9
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 )
|
10
|
+
link_to text, search_path(:focus => search_class.downcase.pluralize, :search_query => query ), :remote => true
|
11
|
+
end
|
12
|
+
|
13
|
+
def too_short_query?
|
14
|
+
return true if params[:search_query].blank?
|
15
|
+
bare_query = strip_tags(params[:search_query]) unless bare_query.html_safe?
|
16
|
+
return bare_query.strip.size < SearchController::MIN_QUERY
|
11
17
|
end
|
12
18
|
end
|
data/app/models/contact.rb
CHANGED
@@ -125,14 +125,17 @@ class Contact < ActiveRecord::Base
|
|
125
125
|
if ties_count > 0 && relations.where(:type => ['Relation::Custom', 'Relation::Public']).any?
|
126
126
|
'edit'
|
127
127
|
else
|
128
|
-
'new'
|
128
|
+
replied? ? 'reply' : 'new'
|
129
129
|
end
|
130
130
|
end
|
131
131
|
|
132
132
|
def status
|
133
|
-
|
134
|
-
|
135
|
-
|
133
|
+
case action
|
134
|
+
when 'edit'
|
135
|
+
ties.includes(:relation).map(&:relation_name).join(", ")
|
136
|
+
else
|
137
|
+
I18n.t("contact.#{ action }.link")
|
138
|
+
end
|
136
139
|
end
|
137
140
|
|
138
141
|
private
|
@@ -9,7 +9,7 @@
|
|
9
9
|
<%= javascript_include_tag 'avatars.js' %>
|
10
10
|
|
11
11
|
<%= stylesheet_link_tag "jquery.Jcrop", :media => "screen, projection" %>
|
12
|
-
<%= stylesheet_link_tag "avatars", :media => "screen, projection"
|
12
|
+
<%= stylesheet_link_tag "avatars", :media => "screen, projection" %>
|
13
13
|
<%= stylesheet_link_tag "jquery.fileupload-ui", :media => "screen, projection" %>
|
14
14
|
<% end %>
|
15
15
|
|
@@ -2,14 +2,14 @@
|
|
2
2
|
<%= @search_class_sym.to_s.capitalize.pluralize %>
|
3
3
|
</div>
|
4
4
|
<br class="clearfloat" />
|
5
|
-
<% if @search_result
|
5
|
+
<% if @search_result.empty? %>
|
6
6
|
<div class="subject_with_details">
|
7
7
|
<%= I18n.t('search.no_subject_found', :subject => @search_class_sym.to_s) %>
|
8
8
|
</div>
|
9
9
|
<% else %>
|
10
10
|
<% total = 0 %>
|
11
11
|
<div class="subject_search_results block left">
|
12
|
-
<% @search_result
|
12
|
+
<% @search_result.each do |subject|%>
|
13
13
|
<%= subject_with_details subject %>
|
14
14
|
<% total+=1 %>
|
15
15
|
<% if (total%(SearchController::FOCUS_SEARCH_PER_PAGE/2)==0) %>
|
@@ -18,4 +18,5 @@
|
|
18
18
|
<% end %>
|
19
19
|
<% end %>
|
20
20
|
</div>
|
21
|
+
<%= paginate @search_result %>
|
21
22
|
<% end %>
|
@@ -1,17 +1,18 @@
|
|
1
|
-
<div
|
2
|
-
<form action="<%= search_path %>" method="get">
|
1
|
+
<div>
|
2
|
+
<form action="<%= search_path %>" method="get" data-remote="true" id="search_form">
|
3
3
|
<div class="block">
|
4
|
+
<div class="error" id="too_short_error" <%= too_short_query? ? 'style=display:block;' : '' %>><%= t('search.at_least') %></div>
|
4
5
|
<%= hidden_field_tag :focus, params[:focus] %>
|
5
6
|
<div class="form_row search_row">
|
6
7
|
<%= text_field_tag :search_query, params[:search_query].present? ? params[:search_query] : nil ,:autocomplete => :off, :id => :global_search_input %>
|
7
8
|
</div>
|
8
9
|
<div id="focus_options" class="form_row search_row">
|
9
10
|
<ul>
|
10
|
-
<li><%= link_to content_tag(:span,t('search.show_all'),:class => params[:focus].blank? ? 'selected' : ''), search_path
|
11
|
+
<li><%= link_to content_tag(:span,t('search.show_all'),:class => params[:focus].blank? ? 'global selected' : 'global'), search_path(:search_query => params[:search_query]), :remote => true %></li>
|
11
12
|
<% SocialStream.subjects.each do |subject| %>
|
12
13
|
<% selected_class = (params[:focus].present? and params[:focus].pluralize.downcase.eql?(subject.to_s.pluralize.downcase)) ? 'selected' : ''%>
|
13
14
|
<li><%= focus_search_link content_tag(:span, subject.to_s.pluralize.capitalize,
|
14
|
-
:class => selected_class),
|
15
|
+
:class => selected_class + " " + subject.to_s.pluralize.downcase),
|
15
16
|
subject.to_s.classify.constantize,
|
16
17
|
params[:search_query] %></li>
|
17
18
|
<% end %>
|
@@ -19,4 +20,25 @@
|
|
19
20
|
</div>
|
20
21
|
</div>
|
21
22
|
</form>
|
22
|
-
</div>
|
23
|
+
</div>
|
24
|
+
|
25
|
+
<%= javascript_tag do %>
|
26
|
+
$(document).ready(function() {
|
27
|
+
$.preloadImages ("assets/mini-loading.gif");
|
28
|
+
|
29
|
+
$('#search_form').submit(function() {
|
30
|
+
query = $('#global_search_input').val();
|
31
|
+
if((query=="")||(query.length < 2)||(query=="<%= t('search.write') %>")){
|
32
|
+
$('#too_short_error').show();
|
33
|
+
$('#global_search_input').removeClass("searching");
|
34
|
+
$('#global_search_input').blur();
|
35
|
+
$('#global_search_input').focus();
|
36
|
+
return false;
|
37
|
+
}else{
|
38
|
+
$('#global_search_input').addClass("searching");
|
39
|
+
$('#global_search_input').blur();
|
40
|
+
}
|
41
|
+
return true;
|
42
|
+
});
|
43
|
+
});
|
44
|
+
<% end %>
|
@@ -1,7 +1,7 @@
|
|
1
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.name') %></h2>
|
5
5
|
<div class="space_center"></div>
|
6
6
|
<%= render :partial => 'form' %>
|
7
7
|
<div class="space_center"></div>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
//if ($('#global_search_input').val()=="<%= params[:search_query]%>"){
|
2
|
+
|
3
|
+
$('#search_results').html("<% unless params[:focus].present? %><%= escape_javascript render :partial => 'global_search' %><% else %><%= escape_javascript render :partial => 'focus_search' %><% end %>");
|
4
|
+
|
5
|
+
$('#focus_options ul li a span').removeClass('selected');
|
6
|
+
|
7
|
+
<% if params[:focus].present? %>
|
8
|
+
$('#focus_options ul li a span.<%= params[:focus].pluralize.downcase %>').addClass('selected');
|
9
|
+
<% else %>
|
10
|
+
$('#focus_options ul li a span.global').addClass('selected');
|
11
|
+
<% end %>
|
12
|
+
|
13
|
+
$('title').text('<%= t('search.name')%> <%= escape_javascript(params[:search_query].present? ? ": #{params[:search_query]}" : "")%>');
|
14
|
+
|
15
|
+
<% if too_short_query? %>
|
16
|
+
$('#too_short_error').show();
|
17
|
+
<% else %>
|
18
|
+
$('#too_short_error').hide();
|
19
|
+
<% end %>
|
20
|
+
|
21
|
+
$('#global_search_input').removeClass("searching");
|
22
|
+
|
23
|
+
/*}else{
|
24
|
+
alert("ignored <%= params[:search_query]%>");
|
25
|
+
}*/
|
data/config/locales/en.yml
CHANGED
@@ -94,7 +94,7 @@ en:
|
|
94
94
|
current: "Current"
|
95
95
|
edit:
|
96
96
|
title: "Edit contact to %{name}"
|
97
|
-
submit: "Edit
|
97
|
+
submit: "Edit contact"
|
98
98
|
graph:
|
99
99
|
one: "Graph"
|
100
100
|
empty: "We're sorry but you don't have any contacts yet. You can try the search box to look for somebody!"
|
@@ -115,6 +115,10 @@ en:
|
|
115
115
|
relation:
|
116
116
|
one: "Contact type"
|
117
117
|
new: "New type"
|
118
|
+
reply:
|
119
|
+
link: "+ Reply contact"
|
120
|
+
title: "Reply contact request to %{name}"
|
121
|
+
submit: "Reply contact"
|
118
122
|
suggestion:
|
119
123
|
one: "Suggestion"
|
120
124
|
other: "Suggestions"
|
@@ -368,6 +372,8 @@ en:
|
|
368
372
|
sign_out: "Sign out"
|
369
373
|
sign_up: "Sign up"
|
370
374
|
socialstream: "SocialStream"
|
375
|
+
subject:
|
376
|
+
this_is_you: "This is you!"
|
371
377
|
sure: "Are you sure?"
|
372
378
|
time:
|
373
379
|
ago: "%{time} ago"
|