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) ->
|
viewerExtension: (viewer) ->
|
||||||
viewer._onHighlightMouseover = (event) ->
|
viewer._onHighlightMouseover = (event) ->
|
||||||
App.LegislationAllegations.show_comments()
|
App.LegislationAllegations.show_comments()
|
||||||
|
$("#comments-box").show()
|
||||||
$.event.trigger
|
$.event.trigger
|
||||||
type: "renderLegislationAnnotation"
|
type: "renderLegislationAnnotation"
|
||||||
annotation_id: $(event.target).data("annotation-id")
|
annotation_id: $(event.target).data("annotation-id")
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ class Legislation::AnnotationsController < ApplicationController
|
|||||||
has_orders %w{most_voted newest oldest}, only: :show
|
has_orders %w{most_voted newest oldest}, only: :show
|
||||||
|
|
||||||
def index
|
def index
|
||||||
|
@annotations = @draft_version.annotations
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@@ -19,15 +20,22 @@ class Legislation::AnnotationsController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def create
|
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
|
@annotation.author = current_user
|
||||||
if @annotation.save
|
if @annotation.save
|
||||||
|
track_event
|
||||||
render json: @annotation.to_json
|
render json: @annotation.to_json
|
||||||
|
else
|
||||||
|
render json: {}, status: :unprocessable_entity
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def search
|
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 }
|
annotations_hash = { total: @annotations.size, rows: @annotations }
|
||||||
render json: annotations_hash.to_json
|
render json: annotations_hash.to_json
|
||||||
end
|
end
|
||||||
@@ -42,7 +50,12 @@ class Legislation::AnnotationsController < ApplicationController
|
|||||||
params
|
params
|
||||||
.require(:annotation)
|
.require(:annotation)
|
||||||
.permit(:quote, :text, ranges: [:start, :startOffset, :end, :endOffset])
|
.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
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ class Legislation::AnswersController < Legislation::BaseController
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
respond_to do |format|
|
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') }
|
format.html { redirect_to legislation_process_question_path(@process, @question), alert: t('legislation.questions.participation.phase_not_open') }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ class Legislation::DraftVersionsController < Legislation::BaseController
|
|||||||
|
|
||||||
if params[:redirect_action] == 'changes'
|
if params[:redirect_action] == 'changes'
|
||||||
redirect_to legislation_process_draft_version_changes_path(@process, version)
|
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
|
else
|
||||||
redirect_to legislation_process_draft_version_path(@process, version)
|
redirect_to legislation_process_draft_version_path(@process, version)
|
||||||
end
|
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 :draft_version, class_name: 'Legislation::DraftVersion', foreign_key: 'legislation_draft_version_id'
|
||||||
belongs_to :author, -> { with_hidden }, class_name: 'User', foreign_key: 'author_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 :text, presence: true
|
||||||
validates :quote, presence: true
|
validates :quote, presence: true
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ class Legislation::DraftVersion < ActiveRecord::Base
|
|||||||
include ActsAsParanoidAliases
|
include ActsAsParanoidAliases
|
||||||
|
|
||||||
belongs_to :process, class_name: 'Legislation::Process', foreign_key: 'legislation_process_id'
|
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 :title, presence: true
|
||||||
validates :body, presence: true
|
validates :body, presence: true
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ class Legislation::Process < ActiveRecord::Base
|
|||||||
acts_as_paranoid column: :hidden_at
|
acts_as_paranoid column: :hidden_at
|
||||||
include ActsAsParanoidAliases
|
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_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 :title, presence: true
|
||||||
validates :description, 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 :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 :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
|
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>
|
</div>
|
||||||
<span><%= t('.updated_at', date: format_date(@draft_version.updated_at)) %></span>
|
<span><%= t('.updated_at', date: format_date(@draft_version.updated_at)) %></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<% unless @draft_version.final_version? %>
|
||||||
<div class="small-12 medium-3 column">
|
<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" %>
|
<%= link_to t('.see_comments'), legislation_process_draft_version_annotations_path(@process, @draft_version), title: t('.see_comments'), class: "button strong" %>
|
||||||
</div>
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row draft-allegation medium-collapse">
|
<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 class="draft-panel">
|
||||||
<div>
|
<div>
|
||||||
<span class="icon-banner" aria-hidden="true"></span> <span class="panel-title"><%= t('.text_toc') %></span>
|
<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><span class="panel-title"><%= t('.text_body') %></span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="draft-text">
|
<div class="draft-text">
|
||||||
|
<% if @draft_version.final_version? %>
|
||||||
|
<section>
|
||||||
|
<% else %>
|
||||||
<section class="legislation-annotatable"
|
<section class="legislation-annotatable"
|
||||||
data-legislation-draft-version-id="<%= @draft_version.id %>"
|
data-legislation-draft-version-id="<%= @draft_version.id %>"
|
||||||
data-legislation-annotatable-base-url="<%= legislation_process_draft_version_path(@process, @draft_version) %>"
|
data-legislation-annotatable-base-url="<%= legislation_process_draft_version_path(@process, @draft_version) %>"
|
||||||
>
|
>
|
||||||
|
<% end %>
|
||||||
<%= @draft_version.body_html.html_safe %>
|
<%= @draft_version.body_html.html_safe %>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="small-12 calc-comments end column js-toggle-allegations">
|
<% if @draft_version.final_version? %>
|
||||||
<div class="draft-panel">
|
<div class="small-12 calc-comments end column"></div>
|
||||||
<div>
|
<% else %>
|
||||||
<span class="icon-comments" aria-hidden="true"></span> <span class="panel-title"><%= t('.text_comments') %></span>
|
<%= render 'comments_panel', draft_version: @draft_version %>
|
||||||
</div>
|
<% end %>
|
||||||
</div>
|
|
||||||
|
|
||||||
<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>
|
||||||
</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
|
describe 'POST create' do
|
||||||
before(:each) 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)
|
@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 = create(:legislation_question, process: @process, title: "Question 1")
|
||||||
@question_option = create(:legislation_question_option, question: @question, value: "Yes")
|
@question_option = create(:legislation_question_option, question: @question, value: "Yes")
|
||||||
@user = create(:user, :level_two)
|
@user = create(:user, :level_two)
|
||||||
end
|
end
|
||||||
|
|
||||||
after(:each) do
|
|
||||||
InvisibleCaptcha.timestamp_enabled = true
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should create an ahoy event' do
|
it 'should create an ahoy event' do
|
||||||
sign_in @user
|
sign_in @user
|
||||||
|
|
||||||
|
|||||||
@@ -499,6 +499,10 @@ FactoryGirl.define do
|
|||||||
trait :published do
|
trait :published do
|
||||||
status "published"
|
status "published"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
trait :final_version do
|
||||||
|
final_version true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
factory :legislation_annotation, class: 'Legislation::Annotation' do
|
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_not have_content("Body of the first version")
|
||||||
expect(page).to have_content("Body of the second version")
|
expect(page).to have_content("Body of the second version")
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
context "See changes page" do
|
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_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")
|
@annotation_2 = create(:legislation_annotation, draft_version: @draft_version, text: "my other annotation", quote: "second quote")
|
||||||
end
|
end
|
||||||
|
|
||||||
scenario "See all annotations for a draft version" do
|
scenario "See all annotations for a draft version" do
|
||||||
visit legislation_process_draft_version_annotations_path(@draft_version.process, @draft_version)
|
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"
|
expect(page).to have_content "second quote"
|
||||||
end
|
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
|
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)
|
visit legislation_process_draft_version_annotation_path(@draft_version.process, @draft_version, @annotation_2)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user