Merge pull request #860 from MaiteHdezRivas/suggest_before_creating

Suggest before creating
This commit is contained in:
Raimond Garcia
2016-02-01 18:41:21 +01:00
18 changed files with 208 additions and 26 deletions

View File

@@ -39,6 +39,7 @@
//= require annotatable
//= require advanced_search
//= require registration_form
//= require suggest
var initialize_modules = function() {
App.Comments.initialize();
@@ -53,6 +54,7 @@ var initialize_modules = function() {
App.Annotatable.initialize();
App.AdvancedSearch.initialize();
App.RegistrationForm.initialize();
App.Suggest.initialize();
};
$(function(){

View File

@@ -0,0 +1,16 @@
App.Suggest =
initialize: ->
$('[data-js-suggest-result]').on('blur',(event) ->
js_suggest = $(this).data('js-suggest')
$.ajax
url: $(this).data('js-url')
data: {search: $(this).val()},
type: 'GET',
dataType: 'html'
success: (stHtml) ->
$(js_suggest).html(stHtml)
error: (xhr, status) ->
complete: (xhr, status) ->)

View File

@@ -29,6 +29,16 @@ module CommentableActions
set_resource_instance
end
def suggest
@resources = @search_terms.present? ? resource_model.search(@search_terms).sort_by_confidence_score: nil
set_resources_instance
if @resources then
@resources_count = @resources.count
@reg_show = 5
render layout: false
end
end
def create
@resource = resource_model.new(strong_params)
@resource.author = current_user

View File

@@ -3,7 +3,7 @@ class DebatesController < ApplicationController
include CommentableActions
include FlagActions
before_action :parse_search_terms, only: :index
before_action :parse_search_terms, only: [:index, :suggest]
before_action :parse_advanced_search_terms, only: :index
before_action :parse_tag_filter, only: :index
before_action :set_search_order, only: :index

View File

@@ -2,7 +2,7 @@ class ProposalsController < ApplicationController
include CommentableActions
include FlagActions
before_action :parse_search_terms, only: :index
before_action :parse_search_terms, only: [:index, :suggest]
before_action :parse_advanced_search_terms, only: :index
before_action :parse_tag_filter, only: :index
before_action :set_search_order, only: :index

View File

@@ -23,6 +23,9 @@ module Abilities
can :create, Debate
can :create, Proposal
can :suggest, Debate
can :suggest, Proposal
can [:flag, :unflag], Comment
cannot [:flag, :unflag], Comment, user_id: user.id

View File

@@ -1,12 +1,11 @@
<%= form_for(@debate) do |f| %>
<%= render 'shared/errors', resource: @debate %>
<div class="row">
<div class="small-12 column">
<%= f.label :title, t("debates.form.debate_title") %>
<%= f.text_field :title, maxlength: Debate.title_max_length, placeholder: t("debates.form.debate_title"), label: false %>
<%= f.text_field :title, maxlength: Debate.title_max_length, placeholder: t("debates.form.debate_title"), label: false, data: {js_suggest_result: "js_suggest_result", js_suggest: "#js-suggest", js_url: suggest_debates_path}%>
</div>
<div id="js-suggest"></div>
<div class="ckeditor small-12 column">
<%= f.label :description, t("debates.form.debate_text") %>
<%= f.cktext_area :description, maxlength: Debate.description_max_length, ckeditor: { language: I18n.locale }, label: false %>
@@ -41,4 +40,4 @@
<%= f.submit(class: "button radius", value: t("debates.#{action_name}.form.submit_button")) %>
</div>
</div>
<% end %>
<% end %>

View File

@@ -0,0 +1,22 @@
<div class="small-12 column" >
<% if @search_terms && @resources_count > 0 %>
<div class="alert-box radius warning">
<p class="note-marked">
<%= t("debates.new.suggestions.found", count: @resources_count, query: @search_terms)%>
</p>
<ul>
<% @debates.take(@reg_show).each do |debate| %>
<li> <%= link_to debate.title, debate %> </li>
<% end %>
</ul>
<% if @resources_count > @reg_show %>
<p class="note-marked">
<%= t("debates.new.suggestions.message", count: @resources_count,
query: @search_terms,
limit: @reg_show) %>
<%= link_to t("debates.new.suggestions.see_all"), debates_path(search: @search_terms)%>
</p>
<% end %>
</div>
<% end %>
</div>

View File

@@ -0,0 +1 @@
<%= render "suggest" %>

View File

@@ -4,8 +4,9 @@
<div class="row">
<div class="small-12 column">
<%= f.label :title, t("proposals.form.proposal_title") %>
<%= f.text_field :title, maxlength: Proposal.title_max_length, placeholder: t("proposals.form.proposal_title"), label: false %>
<%= f.text_field :title, maxlength: Proposal.title_max_length, placeholder: t("proposals.form.proposal_title"), label: false, data: {js_suggest_result: "js_suggest_result", js_suggest: "#js-suggest", js_url: suggest_proposals_path}%>
</div>
<div id="js-suggest"></div>
<div class="small-12 column">
<%= f.label :question, t("proposals.form.proposal_question") %>

View File

@@ -0,0 +1,22 @@
<div class="small-12 column" >
<% if @search_terms && @resources_count > 0 %>
<div class="alert-box radius warning">
<p class="note-marked">
<%= t("proposals.new.suggestions.found", count: @resources_count, query: @search_terms)%>
</p>
<ul>
<% @proposals.take(@reg_show).each do |proposal| %>
<li> <%= link_to proposal.title, proposal %> </li>
<% end %>
</ul>
<% if @resources_count > @reg_show %>
<p class="note-marked">
<%= t("proposals.new.suggestions.message", count: @resources_count,
query: @search_terms,
limit: @reg_show) %>
<%= link_to t("proposals.new.suggestions.see_all"), proposals_path(search: @search_terms)%>
</p>
<% end %>
</div>
<% end %>
</div>

View File

@@ -0,0 +1 @@
<%= render "suggest" %>

View File

@@ -121,6 +121,12 @@ en:
recommendation_two: Any debate or comment suggesting illegal action will be deleted, as well as those intending to sabotage the debate spaces. Anything else is allowed.
recommendations_title: Recommendations for creating a debate
start_new: Start a debate
suggestions:
found:
one: "There is a debate with the term '%{query}', you can participate in it instead of opening a new one."
other: "There are debates with the term '%{query}', you can participate in them instead of opening a new one."
message: "You are seeing %{limit} of %{count} debates containing the term '%{query}'"
see_all: "See all"
show:
author_deleted: User deleted
back_link: Go back
@@ -300,6 +306,12 @@ en:
recommendation_two: Any proposal or comment suggesting illegal action will be deleted, as well as those intending to sabotage the debate spaces. Anything else is allowed.
recommendations_title: Recommendations for creating a proposal
start_new: Create new proposal
suggestions:
found:
one: "There is a proposal with the term '%{query}', you can contribute to it instead of creating a new"
other: "There are proposals with the term '%{query}', you can contribute to them instead of creating a new"
message: "You are seeing %{limit} of %{count} proposals containing the term '%{query}'"
see_all: "See all"
proposal:
already_supported: You have already supported this proposal. Share it!
comments:

15
config/locales/es.yml Normal file → Executable file
View File

@@ -26,7 +26,8 @@ es:
user_permission_votes: Participar en las votaciones finales*
username_label: Nombre de usuario
verified_account: Cuenta verificada
verify_my_account: Verificar mi cuenta
verify_my_account: Verificar mi cuentaquer
application:
close: Cerrar
menu: Menú
@@ -121,6 +122,12 @@ es:
recommendation_two: Cualquier debate o comentario que implique una acción ilegal será eliminado, también los que tengan la intención de sabotear los espacios de debate, todo lo demás está permitido.
recommendations_title: Recomendaciones para crear un debate
start_new: Empezar un debate
suggestions:
found:
one: "Existe un debate con el término '%{query}', puedes participar en él en vez de abrir uno nuevo."
other: "Existen debates con el término '%{query}', puedes participar en ellos en vez de abrir uno nuevo."
message: "Estás viendo %{limit} de %{count} debates que contienen el término '%{query}'"
see_all: "Ver todos"
show:
author_deleted: Usuario eliminado
back_link: Volver
@@ -300,6 +307,12 @@ es:
recommendation_two: Cualquier propuesta o comentario que implique una acción ilegal será eliminada, también las que tengan la intención de sabotear los espacios de propuesta, todo lo demás está permitido.
recommendations_title: Recomendaciones para crear una propuesta
start_new: Crear una propuesta
suggestions:
found:
one: "Existe una propuesta con el término '%{query}', puedes contribuir en ella en vez de crear una nueva."
other: "Existen propuestas con el término '%{query}', puedes contribuir en ellas en vez de crear una nueva."
message: "Estás viendo %{limit} de %{count} propuestas que contienen el término '%{query}'"
see_all: "Ver todas"
proposal:
already_supported: "¡Ya has apoyado esta propuesta, compártela!"
comments:

View File

@@ -38,9 +38,9 @@ Rails.application.routes.draw do
put :flag
put :unflag
end
collection do
get :map
get :suggest
end
end
@@ -51,9 +51,9 @@ Rails.application.routes.draw do
put :flag
put :unflag
end
collection do
get :map
get :suggest
end
end
@@ -242,4 +242,4 @@ Rails.application.routes.draw do
# static pages
get '/blog' => redirect("http://diario.madrid.es/participa/")
resources :pages, path: '/', only: [:show]
end
end

View File

@@ -103,21 +103,22 @@ ActiveRecord::Schema.define(version: 20160126090634) do
t.string "title", limit: 80
t.text "description"
t.integer "author_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "visit_id"
t.datetime "hidden_at"
t.integer "flags_count", default: 0
t.integer "flags_count", default: 0
t.integer "cached_votes_total", default: 0
t.integer "cached_votes_up", default: 0
t.integer "cached_votes_down", default: 0
t.datetime "ignored_flag_at"
t.integer "cached_votes_total", default: 0
t.integer "cached_votes_up", default: 0
t.integer "cached_votes_down", default: 0
t.integer "comments_count", default: 0
t.integer "comments_count", default: 0
t.datetime "confirmed_hide_at"
t.integer "cached_anonymous_votes_total", default: 0
t.integer "cached_votes_score", default: 0
t.integer "hot_score", limit: 8, default: 0
t.integer "confidence_score", default: 0
t.integer "cached_anonymous_votes_total", default: 0
t.integer "cached_votes_score", default: 0
t.integer "hot_score", limit: 8, default: 0
t.integer "confidence_score", default: 0
t.string "external_link", limit: 100
t.integer "geozone_id"
end
@@ -128,6 +129,7 @@ ActiveRecord::Schema.define(version: 20160126090634) do
add_index "debates", ["cached_votes_total"], name: "index_debates_on_cached_votes_total", using: :btree
add_index "debates", ["cached_votes_up"], name: "index_debates_on_cached_votes_up", using: :btree
add_index "debates", ["confidence_score"], name: "index_debates_on_confidence_score", using: :btree
add_index "debates", ["description"], name: "index_debates_on_description", using: :btree
add_index "debates", ["geozone_id"], name: "index_debates_on_geozone_id", using: :btree
add_index "debates", ["hidden_at"], name: "index_debates_on_hidden_at", using: :btree
add_index "debates", ["hot_score"], name: "index_debates_on_hot_score", using: :btree
@@ -201,7 +203,7 @@ ActiveRecord::Schema.define(version: 20160126090634) do
create_table "locks", force: :cascade do |t|
t.integer "user_id"
t.integer "tries", default: 0
t.datetime "locked_until", default: '2000-01-01 07:01:01', null: false
t.datetime "locked_until", default: '2000-01-01 00:01:01', null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
@@ -261,6 +263,7 @@ ActiveRecord::Schema.define(version: 20160126090634) do
add_index "proposals", ["author_id"], name: "index_proposals_on_author_id", using: :btree
add_index "proposals", ["cached_votes_up"], name: "index_proposals_on_cached_votes_up", using: :btree
add_index "proposals", ["confidence_score"], name: "index_proposals_on_confidence_score", using: :btree
add_index "proposals", ["description"], name: "index_proposals_on_description", using: :btree
add_index "proposals", ["geozone_id"], name: "index_proposals_on_geozone_id", using: :btree
add_index "proposals", ["hidden_at"], name: "index_proposals_on_hidden_at", using: :btree
add_index "proposals", ["hot_score"], name: "index_proposals_on_hot_score", using: :btree
@@ -319,8 +322,8 @@ ActiveRecord::Schema.define(version: 20160126090634) do
t.boolean "featured", default: false
t.integer "debates_count", default: 0
t.integer "proposals_count", default: 0
t.string "kind"
t.integer "spending_proposals_count", default: 0
t.string "kind"
end
add_index "tags", ["debates_count"], name: "index_tags_on_debates_count", using: :btree
@@ -396,8 +399,8 @@ ActiveRecord::Schema.define(version: 20160126090634) do
t.boolean "public_activity", default: true
t.boolean "newsletter", default: false
t.integer "notifications_count", default: 0
t.string "locale"
t.boolean "registering_with_oauth", default: false
t.string "locale"
t.string "oauth_email"
end

View File

@@ -947,4 +947,43 @@ feature 'Debates' do
end
end
end
context 'Suggesting debates' do
scenario 'Shows up to 5 suggestions', :js do
author = create(:user)
login_as(author)
debate1 = create(:debate, title: "First debate has 1 vote", cached_votes_up: 1)
debate2 = create(:debate, title: "Second debate has 2 votes", cached_votes_up: 2)
debate3 = create(:debate, title: "Third debate has 3 votes", cached_votes_up: 3)
debate4 = create(:debate, title: "This one has 4 votes", description: "This is the fourth debate", cached_votes_up: 4)
debate5 = create(:debate, title: "Fifth debate has 5 votes", cached_votes_up: 5)
debate6 = create(:debate, title: "Sixth debate has 6 votes", description: 'This is the sixth debate', cached_votes_up: 6)
debate7 = create(:debate, title: "This has seven votes, and is not suggest", description: 'This is the seven', cached_votes_up: 7)
visit new_debate_path
fill_in 'debate_title', with: 'debate'
check "debate_terms_of_service"
within('div#js-suggest') do
expect(page).to have_content ("You are seeing 5 of 6 debates containing the term 'debate'")
end
end
scenario 'No found suggestions', :js do
author = create(:user)
login_as(author)
debate1 = create(:debate, title: "First debate has 10 vote", cached_votes_up: 10)
debate2 = create(:debate, title: "Second debate has 2 votes", cached_votes_up: 2)
visit new_debate_path
fill_in 'debate_title', with: 'proposal'
check "debate_terms_of_service"
within('div#js-suggest') do
expect(page).to_not have_content ('You are seeing')
end
end
end
end

View File

@@ -1105,4 +1105,42 @@ feature 'Proposals' do
end
end
context 'Suggesting proposals' do
scenario 'Show up to 5 suggestions', :js do
author = create(:user)
login_as(author)
create(:proposal, title: 'First proposal, has search term')
create(:proposal, title: 'Second title')
create(:proposal, title: 'Third proposal, has search term')
create(:proposal, title: 'Fourth proposal, has search term')
create(:proposal, title: 'Fifth proposal, has search term')
create(:proposal, title: 'Sixth proposal, has search term')
create(:proposal, title: 'Seventh proposal, has search term')
visit new_proposal_path
fill_in 'proposal_title', with: 'search'
check "proposal_terms_of_service"
within('div#js-suggest') do
expect(page).to have_content ("You are seeing 5 of 6 proposals containing the term 'search'")
end
end
scenario 'No found suggestions', :js do
author = create(:user)
login_as(author)
create(:proposal, title: 'First proposal').update_column(:confidence_score, 10)
create(:proposal, title: 'Second proposal').update_column(:confidence_score, 8)
visit new_proposal_path
fill_in 'proposal_title', with: 'debate'
check "proposal_terms_of_service"
within('div#js-suggest') do
expect(page).to_not have_content ('You are seeing')
end
end
end
end