Merge pull request #61 from medialab-prado/50-draft-final-version

Drafts final version
This commit is contained in:
Fernando Blat
2017-01-14 16:35:15 +01:00
committed by GitHub
14 changed files with 186 additions and 36 deletions

View File

@@ -12,6 +12,7 @@ App.LegislationAnnotatable =
viewerExtension: (viewer) ->
viewer._onHighlightMouseover = (event) ->
App.LegislationAllegations.show_comments()
$("#comments-box").show()
$.event.trigger
type: "renderLegislationAnnotation"
annotation_id: $(event.target).data("annotation-id")

View File

@@ -10,6 +10,7 @@ class Legislation::AnnotationsController < ApplicationController
has_orders %w{most_voted newest oldest}, only: :show
def index
@annotations = @draft_version.annotations
end
def show
@@ -19,15 +20,22 @@ class Legislation::AnnotationsController < ApplicationController
end
def create
@annotation = Legislation::Annotation.new(annotation_params)
if !@process.open_phase?(:allegations) || @draft_version.final_version?
render json: {}, status: :not_found and return
end
@annotation = @draft_version.annotations.new(annotation_params)
@annotation.author = current_user
if @annotation.save
track_event
render json: @annotation.to_json
else
render json: {}, status: :unprocessable_entity
end
end
def search
@annotations = Legislation::Annotation.where(legislation_draft_version_id: params[:legislation_draft_version_id])
@annotations = @draft_version.annotations
annotations_hash = { total: @annotations.size, rows: @annotations }
render json: annotations_hash.to_json
end
@@ -42,7 +50,12 @@ class Legislation::AnnotationsController < ApplicationController
params
.require(:annotation)
.permit(:quote, :text, ranges: [:start, :startOffset, :end, :endOffset])
.merge(legislation_draft_version_id: params[:legislation_draft_version_id])
end
def track_event
ahoy.track "legislation_annotation_created".to_sym,
"legislation_annotation_id": @annotation.id,
"legislation_draft_version_id": @draft_version.id
end
end

View File

@@ -19,7 +19,7 @@ class Legislation::AnswersController < Legislation::BaseController
end
else
respond_to do |format|
format.js
format.js { render json: {} , status: :not_found }
format.html { redirect_to legislation_process_question_path(@process, @question), alert: t('legislation.questions.participation.phase_not_open') }
end
end

View File

@@ -20,6 +20,8 @@ class Legislation::DraftVersionsController < Legislation::BaseController
if params[:redirect_action] == 'changes'
redirect_to legislation_process_draft_version_changes_path(@process, version)
elsif params[:redirect_action] == 'annotations'
redirect_to legislation_process_draft_version_annotations_path(@process, version)
else
redirect_to legislation_process_draft_version_path(@process, version)
end

View File

@@ -6,7 +6,7 @@ class Legislation::Annotation < ActiveRecord::Base
belongs_to :draft_version, class_name: 'Legislation::DraftVersion', foreign_key: 'legislation_draft_version_id'
belongs_to :author, -> { with_hidden }, class_name: 'User', foreign_key: 'author_id'
has_many :comments, as: :commentable
has_many :comments, as: :commentable, dependent: :destroy
validates :text, presence: true
validates :quote, presence: true

View File

@@ -5,7 +5,7 @@ class Legislation::DraftVersion < ActiveRecord::Base
include ActsAsParanoidAliases
belongs_to :process, class_name: 'Legislation::Process', foreign_key: 'legislation_process_id'
has_many :annotations, class_name: 'Legislation::Annotation', foreign_key: 'legislation_draft_version_id'
has_many :annotations, class_name: 'Legislation::Annotation', foreign_key: 'legislation_draft_version_id', dependent: :destroy
validates :title, presence: true
validates :body, presence: true

View File

@@ -2,9 +2,9 @@ class Legislation::Process < ActiveRecord::Base
acts_as_paranoid column: :hidden_at
include ActsAsParanoidAliases
has_many :draft_versions, -> { order(:id) }, class_name: 'Legislation::DraftVersion', foreign_key: 'legislation_process_id'
has_many :draft_versions, -> { order(:id) }, class_name: 'Legislation::DraftVersion', foreign_key: 'legislation_process_id', dependent: :destroy
has_one :final_draft_version, -> { where final_version: true, status: 'published' }, class_name: 'Legislation::DraftVersion', foreign_key: 'legislation_process_id'
has_many :questions, -> { order(:id) }, class_name: 'Legislation::Question', foreign_key: 'legislation_process_id'
has_many :questions, -> { order(:id) }, class_name: 'Legislation::Question', foreign_key: 'legislation_process_id', dependent: :destroy
validates :title, presence: true
validates :description, presence: true

View File

@@ -7,7 +7,7 @@ class Legislation::Question < ActiveRecord::Base
has_many :question_options, -> { order(:id) }, class_name: 'Legislation::QuestionOption', foreign_key: 'legislation_question_id', dependent: :destroy, inverse_of: :question
has_many :answers, class_name: 'Legislation::Answer', foreign_key: 'legislation_question_id', dependent: :destroy, inverse_of: :question
has_many :comments, as: :commentable
has_many :comments, as: :commentable, dependent: :destroy
accepts_nested_attributes_for :question_options, :reject_if => proc { |attributes| attributes[:value].blank? }, allow_destroy: true

View File

@@ -0,0 +1,18 @@
<div class="small-12 calc-comments end column js-toggle-allegations">
<div class="draft-panel">
<div>
<span class="icon-comments" aria-hidden="true"></span> <span class="panel-title"><%= t('legislation.draft_versions.show.text_comments') %></span>
</div>
</div>
<div class="draft-comments-rotated center">
<span class="panel-title"><%= t('legislation.draft_versions.show.text_comments') %></span>
</div>
<div class="comment-box" id="comments-box" style="display: none;">
<div class="comment-header">
<span class="icon-comment" aria-hidden="true"></span>
<div class="comment-number"><%= t('legislation.draft_versions.show.loading_comments') %></div>
</div>
</div>
</div>

View File

@@ -18,13 +18,17 @@
</div>
<span><%= t('.updated_at', date: format_date(@draft_version.updated_at)) %></span>
</div>
<div class="small-12 medium-3 column">
<%= link_to t('.see_comments'), legislation_process_draft_version_annotations_path(@process, @draft_version), title: t('.see_comments'), class: "button strong" %>
</div>
<% unless @draft_version.final_version? %>
<div class="small-12 medium-3 column">
<%= link_to t('.see_comments'), legislation_process_draft_version_annotations_path(@process, @draft_version), title: t('.see_comments'), class: "button strong" %>
</div>
<% end %>
</div>
<div class="row draft-allegation medium-collapse">
<div class="small-12 calc-index column border-right js-toggle-allegations">
<div class="small-12 calc-index column border-right <%= "js-toggle-allegations" unless @draft_version.final_version? %>">
<div class="draft-panel">
<div>
<span class="icon-banner" aria-hidden="true"></span> <span class="panel-title"><%= t('.text_toc') %></span>
@@ -44,34 +48,25 @@
<div><span class="panel-title"><%= t('.text_body') %></span></div>
</div>
<div class="draft-text">
<% if @draft_version.final_version? %>
<section>
<% else %>
<section class="legislation-annotatable"
data-legislation-draft-version-id="<%= @draft_version.id %>"
data-legislation-annotatable-base-url="<%= legislation_process_draft_version_path(@process, @draft_version) %>"
>
<% end %>
<%= @draft_version.body_html.html_safe %>
</section>
</div>
</div>
<div class="small-12 calc-comments end column js-toggle-allegations">
<div class="draft-panel">
<div>
<span class="icon-comments" aria-hidden="true"></span> <span class="panel-title"><%= t('.text_comments') %></span>
</div>
</div>
<% if @draft_version.final_version? %>
<div class="small-12 calc-comments end column"></div>
<% else %>
<%= render 'comments_panel', draft_version: @draft_version %>
<% end %>
<div class="draft-comments-rotated center">
<span class="panel-title"><%= t('.text_comments') %></span>
</div>
<div class="comment-box" id="comments-box">
<div class="comment-header">
<span class="icon-comment" aria-hidden="true"></span>
<div class="comment-number"><%= t('.loading_comments') %></div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,70 @@
require 'rails_helper'
describe Legislation::AnnotationsController do
describe 'POST create' do
before(:each) do
@process = create(:legislation_process, allegations_start_date: Date.current - 3.day, allegations_end_date: Date.current + 2.days)
@draft_version = create(:legislation_draft_version, :published, process: @process, title: "Version 1")
@final_version = create(:legislation_draft_version, :published, :final_version, process: @process, title: "Final version")
@user = create(:user, :level_two)
end
it 'should create an ahoy event' do
sign_in @user
post :create, process_id: @process.id,
draft_version_id: @draft_version.id,
annotation: {
"quote"=>"Ordenación Territorial",
"ranges"=>[{"start"=>"/p[1]", "startOffset"=>1, "end"=>"/p[1]", "endOffset"=>3}],
"text": "una anotacion"
}
expect(Ahoy::Event.where(name: :legislation_annotation_created).count).to eq 1
expect(Ahoy::Event.last.properties['legislation_annotation_id']).to eq Legislation::Annotation.last.id
end
it 'should not create an annotation if the draft version is a final version' do
sign_in @user
post :create, process_id: @process.id,
draft_version_id: @final_version.id,
annotation: {
"quote"=>"Ordenación Territorial",
"ranges"=>[{"start"=>"/p[1]", "startOffset"=>1, "end"=>"/p[1]", "endOffset"=>3}],
"text": "una anotacion"
}
expect(response).to have_http_status(:not_found)
end
it 'should create an annotation if the process allegations phase is open' do
sign_in @user
expect do
xhr :post, :create, process_id: @process.id,
draft_version_id: @draft_version.id,
annotation: {
"quote"=>"Ordenación Territorial",
"ranges"=>[{"start"=>"/p[1]", "startOffset"=>1, "end"=>"/p[1]", "endOffset"=>3}],
"text": "una anotacion"
}
end.to change { @draft_version.annotations.count }.by(1)
end
it 'should not create an annotation if the process allegations phase is not open' do
sign_in @user
@process.update_attribute(:allegations_end_date, Date.current - 1.day)
expect do
xhr :post, :create, process_id: @process.id,
draft_version_id: @draft_version.id,
annotation: {
"quote"=>"Ordenación Territorial",
"ranges"=>[{"start"=>"/p[1]", "startOffset"=>1, "end"=>"/p[1]", "endOffset"=>3}],
"text": "una anotacion"
}
end.to_not change { @draft_version.annotations.count }
end
end
end

View File

@@ -4,17 +4,12 @@ describe Legislation::AnswersController do
describe 'POST create' do
before(:each) do
InvisibleCaptcha.timestamp_enabled = false
@process = create(:legislation_process, debate_start_date: Date.current - 3.day, debate_end_date: Date.current + 2.days)
@question = create(:legislation_question, process: @process, title: "Question 1")
@question_option = create(:legislation_question_option, question: @question, value: "Yes")
@user = create(:user, :level_two)
end
after(:each) do
InvisibleCaptcha.timestamp_enabled = true
end
it 'should create an ahoy event' do
sign_in @user

View File

@@ -499,6 +499,10 @@ FactoryGirl.define do
trait :published do
status "published"
end
trait :final_version do
final_version true
end
end
factory :legislation_annotation, class: 'Legislation::Annotation' do

View File

@@ -61,6 +61,18 @@ feature 'Legislation Draft Versions' do
expect(page).to_not have_content("Body of the first version")
expect(page).to have_content("Body of the second version")
end
context "for final versions" do
it "does not show the comments panel" do
final_version = create(:legislation_draft_version, process: @process, title: "Final version", body: "Final body", status: "published", final_version: true)
visit legislation_process_draft_version_path(@process, final_version)
expect(page).to have_content("Final body")
expect(page).to_not have_content("See all comments")
expect(page).to_not have_content("Comments")
end
end
end
context "See changes page" do
@@ -166,6 +178,7 @@ feature 'Legislation Draft Versions' do
@annotation_1 = create(:legislation_annotation, draft_version: @draft_version, text: "my annotation", quote: "first quote")
@annotation_2 = create(:legislation_annotation, draft_version: @draft_version, text: "my other annotation", quote: "second quote")
end
scenario "See all annotations for a draft version" do
visit legislation_process_draft_version_annotations_path(@draft_version.process, @draft_version)
@@ -173,6 +186,45 @@ feature 'Legislation Draft Versions' do
expect(page).to have_content "second quote"
end
context "switching versions" do
background do
@process = create(:legislation_process)
@draft_version_1 = create(:legislation_draft_version, :published, process: @process, title: "Version 1", body: Faker::Lorem.paragraph)
@annotation_1 = create(:legislation_annotation, draft_version: @draft_version_1, text: "annotation for version 1", quote: "quote for version 1")
@draft_version_2 = create(:legislation_draft_version, :published, process: @process, title: "Version 2", body: Faker::Lorem.paragraph)
@annotation_1 = create(:legislation_annotation, draft_version: @draft_version_2, text: "annotation for version 2", quote: "quote for version 2")
end
scenario "without js" do
visit legislation_process_draft_version_annotations_path(@process, @draft_version_1)
expect(page).to have_content("quote for version 1")
select("Version 2")
click_button "see"
expect(page).to_not have_content("quote for version 1")
expect(page).to have_content("quote for version 2")
end
scenario "with js", :js do
visit legislation_process_draft_version_annotations_path(@process, @draft_version_1)
expect(page).to have_content("quote for version 1")
select("Version 2")
expect(page).to_not have_content("quote for version 1")
expect(page).to have_content("quote for version 2")
end
end
end
context "Annotation comments page" do
background do
@draft_version = create(:legislation_draft_version, :published, body: Faker::Lorem.paragraph)
@annotation_1 = create(:legislation_annotation, draft_version: @draft_version, text: "my annotation", quote: "first quote")
@annotation_2 = create(:legislation_annotation, draft_version: @draft_version, text: "my other annotation", quote: "second quote")
end
scenario "See one annotation with replies for a draft version" do
visit legislation_process_draft_version_annotation_path(@draft_version.process, @draft_version, @annotation_2)