Merge pull request #61 from medialab-prado/50-draft-final-version
Drafts final version
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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>
|
||||
@@ -18,13 +18,17 @@
|
||||
</div>
|
||||
<span><%= t('.updated_at', date: format_date(@draft_version.updated_at)) %></span>
|
||||
</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>
|
||||
|
||||
|
||||
70
spec/controllers/legislation/annotations_controller_spec.rb
Normal file
70
spec/controllers/legislation/annotations_controller_spec.rb
Normal 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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user