social_stream-base 0.9.5 → 0.9.6
Sign up to get free protection for your applications and to get access to all the features.
- 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"
|