diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 3c6feb6b3..756f86698 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -52,6 +52,7 @@ //= require markdown-it //= require markdown_editor //= require cocoon +//= require legislation_admin //= require legislation //= require legislation_allegations //= require legislation_annotatable @@ -83,6 +84,7 @@ var initialize_modules = function() { App.Banners.initialize(); App.SocialShare.initialize(); App.MarkdownEditor.initialize(); + App.LegislationAdmin.initialize(); App.LegislationAllegations.initialize(); App.Legislation.initialize(); if ( $(".legislation-annotatable").length ) diff --git a/app/assets/javascripts/legislation_admin.js.coffee b/app/assets/javascripts/legislation_admin.js.coffee new file mode 100644 index 000000000..c61d9cea1 --- /dev/null +++ b/app/assets/javascripts/legislation_admin.js.coffee @@ -0,0 +1,14 @@ +App.LegislationAdmin = + + initialize: -> + $("input[type='checkbox'][data-disable-date]").on + change: -> + checkbox = $(this) + parent = $(this).parents('.row:eq(0)') + date_selector = $(this).data('disable-date') + parent.find("input[type='text'][id^='"+date_selector+"']").each -> + if checkbox.is(':checked') + $(this).removeAttr("disabled") + else + $(this).val("") + diff --git a/app/controllers/legislation/processes_controller.rb b/app/controllers/legislation/processes_controller.rb index 1b51cec07..7aff709d0 100644 --- a/app/controllers/legislation/processes_controller.rb +++ b/app/controllers/legislation/processes_controller.rb @@ -8,8 +8,20 @@ class Legislation::ProcessesController < Legislation::BaseController end def show + if @process.active_phase?(:allegations) && @process.show_phase?(:allegations) && draft_version = @process.draft_versions.published.last + redirect_to legislation_process_draft_version_path(@process, draft_version) + elsif @process.active_phase?(:debate) + redirect_to legislation_process_debate_path(@process) + else + redirect_to legislation_process_allegations_path(@process) + end + end + + def debate + phase :debate + if @process.show_phase?(:debate) - render :show + render :debate else render :phase_not_open end diff --git a/app/models/abilities/everyone.rb b/app/models/abilities/everyone.rb index 4d44f14eb..c86305862 100644 --- a/app/models/abilities/everyone.rb +++ b/app/models/abilities/everyone.rb @@ -16,7 +16,7 @@ module Abilities can [:read], Budget::Group can [:read, :print], Budget::Investment can :new, DirectMessage - can [:read, :draft_publication, :allegations, :final_version_publication], Legislation::Process + can [:read, :debate, :draft_publication, :allegations, :final_version_publication], Legislation::Process can [:read, :changes, :go_to_version], Legislation::DraftVersion can [:read], Legislation::Question can [:create], Legislation::Answer diff --git a/app/models/legislation/process.rb b/app/models/legislation/process.rb index 489dccffb..a68e667e3 100644 --- a/app/models/legislation/process.rb +++ b/app/models/legislation/process.rb @@ -9,12 +9,10 @@ class Legislation::Process < ActiveRecord::Base validates :title, presence: true validates :start_date, presence: true validates :end_date, presence: true - validates :debate_start_date, presence: true - validates :debate_end_date, presence: true - validates :draft_publication_date, presence: true - validates :allegations_start_date, presence: true - validates :allegations_end_date, presence: true - validates :final_publication_date, presence: true + validates :debate_start_date, presence: true, if: :debate_end_date? + validates :debate_end_date, presence: true, if: :debate_start_date? + validates :allegations_start_date, presence: true, if: :allegations_end_date? + validates :allegations_end_date, presence: true, if: :allegations_start_date? validate :valid_date_ranges scope :open, -> { where("start_date <= ? and end_date >= ?", Date.current, Date.current).order('id DESC') } @@ -26,13 +24,13 @@ class Legislation::Process < ActiveRecord::Base case phase when :debate - today >= debate_start_date && today <= debate_end_date + active_phase?(:debate) && today >= debate_start_date && today <= debate_end_date when :draft_publication - today >= draft_publication_date + active_phase?(:draft_publication) && today >= draft_publication_date when :allegations - today >= allegations_start_date && today <= allegations_end_date + active_phase?(:allegations) && today >= allegations_start_date && today <= allegations_end_date when :final_version_publication - today >= final_publication_date + active_phase?(:final_version_publication) && today >= final_publication_date end end @@ -42,13 +40,26 @@ class Legislation::Process < ActiveRecord::Base case phase when :debate - today >= debate_start_date + active_phase?(:debate) && today >= debate_start_date when :draft_publication - today >= draft_publication_date + active_phase?(:draft_publication) && today >= draft_publication_date when :allegations - today >= allegations_start_date + active_phase?(:allegations) && today >= allegations_start_date when :final_version_publication - today >= final_publication_date + active_phase?(:final_version_publication) && today >= final_publication_date + end + end + + def active_phase?(phase) + case phase + when :debate + debate_start_date.present? && debate_end_date.present? + when :draft_publication + draft_publication_date.present? + when :allegations + allegations_start_date.present? && allegations_end_date.present? + when :final_version_publication + final_publication_date.present? end end diff --git a/app/views/admin/legislation/processes/_form.html.erb b/app/views/admin/legislation/processes/_form.html.erb index b796049e1..d78675890 100644 --- a/app/views/admin/legislation/processes/_form.html.erb +++ b/app/views/admin/legislation/processes/_form.html.erb @@ -63,6 +63,10 @@ class: "js-calendar-full", id: "debate_end_date" %> +
+ <%= check_box_tag :debate_phase_active, @process.active_phase?(:debate), @process.new_record? || @process.active_phase?(:debate), data: {disable_date: "debate"} %> + <%= label_tag :debate_phase_active, t('admin.legislation.processes.form.active') %> +
@@ -87,7 +91,13 @@ class: "js-calendar-full", id: "allegations_end_date" %>
+
+ <%= check_box_tag :allegations_phase_active, @process.active_phase?(:allegations), @process.new_record? || @process.active_phase?(:allegations), data: {disable_date: "allegations"} %> + <%= label_tag :allegations_phase_active, t('admin.legislation.processes.form.active') %> +
+ +
<%= f.label :draft_publication_date %>
@@ -98,6 +108,10 @@ class: "js-calendar-full", id: "draft_publication_date" %>
+
+ <%= check_box_tag :draft_publication_phase_active, @process.active_phase?(:draft_publication), @process.new_record? || @process.active_phase?(:draft_publication), data: {disable_date: "draft_publication"} %> + <%= label_tag :draft_publication_phase_active, t('admin.legislation.processes.form.active') %> +
@@ -111,6 +125,10 @@ class: "js-calendar-full", id: "final_publication_date" %>
+
+ <%= check_box_tag :final_version_publication_phase_active, @process.active_phase?(:final_version_publication), @process.new_record? || @process.active_phase?(:final_version_publication), data: {disable_date: "final_publication"} %> + <%= label_tag :final_version_publication_phase_active, t('admin.legislation.processes.form.active') %> +
diff --git a/app/views/legislation/processes/_key_dates.html.erb b/app/views/legislation/processes/_key_dates.html.erb index e64d99f08..3e5823ae2 100644 --- a/app/views/legislation/processes/_key_dates.html.erb +++ b/app/views/legislation/processes/_key_dates.html.erb @@ -1,32 +1,43 @@ -
diff --git a/app/views/legislation/processes/show.html.erb b/app/views/legislation/processes/show.html.erb deleted file mode 100644 index 5b29dc292..000000000 --- a/app/views/legislation/processes/show.html.erb +++ /dev/null @@ -1,13 +0,0 @@ -<% provide :title do %><%= @process.title %><% end %> - -<%= render 'legislation/processes/header', process: @process, header: :full %> - -<%= render 'key_dates', process: @process, phase: :debate %> - -
-
-
- <%= render 'debate', process: @process %> -
-
-
diff --git a/config/locales/admin.en.yml b/config/locales/admin.en.yml index 4d00955da..c229561bc 100755 --- a/config/locales/admin.en.yml +++ b/config/locales/admin.en.yml @@ -193,6 +193,7 @@ en: form: error: Error form: + active: Active process: Process debate_phase: Debate phase allegations_phase: Allegations phase diff --git a/config/locales/admin.es.yml b/config/locales/admin.es.yml index 79bf53187..e30df44c2 100644 --- a/config/locales/admin.es.yml +++ b/config/locales/admin.es.yml @@ -193,6 +193,7 @@ es: form: error: Error form: + active: Activa process: Proceso debate_phase: Fase previa allegations_phase: Fase de alegaciones diff --git a/config/routes.rb b/config/routes.rb index f5b65420e..c2639389f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -102,6 +102,7 @@ Rails.application.routes.draw do namespace :legislation do resources :processes, only: [:index, :show] do + get :debate get :draft_publication get :allegations get :final_version_publication diff --git a/spec/features/admin/legislation/processes_spec.rb b/spec/features/admin/legislation/processes_spec.rb index 0f1114f51..2218ae8d5 100644 --- a/spec/features/admin/legislation/processes_spec.rb +++ b/spec/features/admin/legislation/processes_spec.rb @@ -59,4 +59,27 @@ feature 'Admin legislation processes' do expect(page).to have_content 'An example legislation process' end end + + context 'Update' do + scenario 'Deactivate debate phase', js: true do + process = create(:legislation_process, title: 'An example legislation process') + visit admin_root_path + + within('#side_menu') do + click_link "Collaborative Legislation" + end + + click_link "An example legislation process" + + expect(page).to have_selector("h1", text: "An example legislation process") + expect(find("#debate_phase_active")).to be_checked + + uncheck "debate_phase_active" + click_button "Save changes" + + expect(page).to have_content "Process updated successfully" + expect(find("#debate_start_date").value).to be_blank + expect(find("#debate_end_date").value).to be_blank + end + end end diff --git a/spec/models/legislation/process_spec.rb b/spec/models/legislation/process_spec.rb index fd83d8989..f89a4bfcf 100644 --- a/spec/models/legislation/process_spec.rb +++ b/spec/models/legislation/process_spec.rb @@ -7,6 +7,32 @@ RSpec.describe Legislation::Process, type: :model do expect(process).to be_valid end + describe "dates validations" do + it "is invalid if debate_start_date is present but debate_end_date is not" do + process = build(:legislation_process, debate_start_date: Date.current, debate_end_date: "") + expect(process).to be_invalid + expect(process.errors.messages[:debate_end_date]).to include("can't be blank") + end + + it "is invalid if debate_end_date is present but debate_start_date is not" do + process = build(:legislation_process, debate_start_date: nil, debate_end_date: Date.current) + expect(process).to be_invalid + expect(process.errors.messages[:debate_start_date]).to include("can't be blank") + end + + it "is invalid if allegations_start_date is present but debate_end_date is not" do + process = build(:legislation_process, allegations_start_date: Date.current, allegations_end_date: "") + expect(process).to be_invalid + expect(process.errors.messages[:allegations_end_date]).to include("can't be blank") + end + + it "is invalid if debate_end_date is present but allegations_start_date is not" do + process = build(:legislation_process, allegations_start_date: nil, allegations_end_date: Date.current) + expect(process).to be_invalid + expect(process.errors.messages[:allegations_start_date]).to include("can't be blank") + end + end + describe "date ranges validations" do it "is invalid if end_date is before start_date" do process = build(:legislation_process, start_date: Date.current, end_date: Date.current - 1.day)