Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 75 additions & 0 deletions app/controllers/forms/make_language_live_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
module Forms
class MakeLanguageLiveController < FormsController
def new
authorize current_form, :can_make_language_live?
return redirect_to form_path(form_id: current_form.id) unless current_form.can_make_language_live?(language: params[:language])

@make_language_live_input = MakeLiveInput.new(form: current_form)

render_new
end

def create
authorize current_form, :can_make_language_live?

@make_language_live_input = MakeLiveInput.new(**make_language_live_input_params)

return redirect_to form_path(@make_language_live_input.form.id) unless @make_language_live_input.confirmed?
return render_new(status: :unprocessable_content) unless @make_language_live_input.valid?

return redirect_to form_path(form_id: current_form.id) unless current_form.can_make_language_live?(language: params[:language])

@make_form_live_service = MakeFormLiveService.call(current_form:, current_user:, language: params[:language])
@make_form_live_service.make_language_live

if current_form.state_previously_changed?
OrgAdminAlertsService.new(form: current_form, current_user:).form_made_live
end

@go_to_make_welsh_live_input = GoToMakeWelshLiveInput.new

redirect_to make_language_live_show_confirmation_path
end

def show_confirmation
authorize current_form, :can_make_language_live?

@make_form_live_service = MakeFormLiveService.call(current_form:, current_user:, language: params[:language])

@go_to_make_welsh_live_input = GoToMakeWelshLiveInput.new

render "confirmation", locals: {
current_form:,
confirmation_page_title: @make_form_live_service.page_title,
confirmation_page_body: @make_form_live_service.confirmation_page_body,
language: params[:language],
}
end

def submit_confirmation
authorize current_form, :can_make_language_live?

@go_to_make_welsh_live_input = GoToMakeWelshLiveInput.new(**go_to_make_welsh_live_input_params)

if @go_to_make_welsh_live_input.confirmed?
redirect_to make_language_live_path(language: "cy")
else
redirect_to form_path
end
end

private

def make_language_live_input_params
params.require(:forms_make_live_input).permit(:confirm).merge(form: current_form)
end

def render_new(status: :ok)
render "new", status:, locals: { current_form:, language: params[:language] }
end

def go_to_make_welsh_live_input_params
params.require(:forms_go_to_make_welsh_live_input).permit(:confirm)
end
end
end
2 changes: 2 additions & 0 deletions app/input_objects/forms/go_to_make_welsh_live_input.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class Forms::GoToMakeWelshLiveInput < ConfirmActionInput
end
30 changes: 30 additions & 0 deletions app/models/form.rb
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,12 @@ def draft_created?(previous_state)
(previous_state.to_sym == :archived && archived_with_draft?)
end

def can_make_language_live?(language:)
return can_make_english_version_live? if language == "en"

can_make_welsh_version_live? if language == "cy"
end

private

def set_external_id
Expand Down Expand Up @@ -268,6 +274,30 @@ def after_make_live
FormDocumentSyncService.new(self).synchronize_live_form
end

def before_make_english_live
before_make_live
end

def after_make_english_live
FormDocumentSyncService.new(self).synchronize_live_english_form
end

def before_make_welsh_live
before_make_live
end

def after_make_welsh_live
FormDocumentSyncService.new(self).synchronize_live_welsh_form
end

def can_make_english_version_live?
draft? && ready_for_live && live_form_document.blank? && live_welsh_form_document.blank?
end

def can_make_welsh_version_live?
has_live_version && ready_for_live && live_form_document.present? && live_welsh_form_document.blank?
end

def after_archive
FormDocumentSyncService.new(self).synchronize_archived_form
end
Expand Down
6 changes: 6 additions & 0 deletions app/policies/form_policy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@ def can_make_form_live?
false
end

def can_make_language_live?
return can_view_form? if form.group&.active? && can_administer_group?

false
end

def can_administer_group?
user.super_admin? || user.is_organisations_admin?(form.group&.organisation) || user.is_group_admin?(form.group)
end
Expand Down
39 changes: 39 additions & 0 deletions app/services/form_document_sync_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,44 @@ def synchronize_archived_welsh_form
end
end

def synchronize_live_english_form
FormDocument.transaction do
# Ensure we only make English version live if there is no existing live Welsh version
raise ActiveRecord::RecordNotFound, "Cannot make English version live if there is already a live Welsh version." if FormDocument.where(form:, tag: LIVE_TAG, language: "cy").exists?

content = form_content("en", live_at: form.updated_at)
update_or_create_form_document(LIVE_TAG, content, "en")

# Update the content of the live English version to to not include Welsh in available_languages
FormDocument.where(form:, tag: [LIVE_TAG], language: "en").find_each do |live_document|
live_document.content["available_languages"] = %w[en]
live_document.save!
end

# A new live version replaces any previous archived version
delete_form_documents_by_tag(ARCHIVED_TAG)
end
end

def synchronize_live_welsh_form
FormDocument.transaction do
# Ensure we only make Welsh version live if there is already an existing live English version
raise ActiveRecord::RecordNotFound, "Cannot make Welsh version live unless there is already a live English version." unless FormDocument.where(form:, tag: LIVE_TAG, language: "en").exists?

content = form_content("cy", live_at: form.updated_at)
update_or_create_form_document(LIVE_TAG, content, "cy")

# Update the content of the live English version to show that it now supports Welsh
FormDocument.where(form:, tag: [LIVE_TAG], language: "en").find_each do |live_document|
live_document.content["available_languages"] = %w[en cy]
live_document.save!
end

# A new live version replaces any previous archived version
delete_form_documents_by_tag(ARCHIVED_TAG)
end
end

def update_draft_form_document
synchronize_documents_for_tag(DRAFT_TAG)
end
Expand Down Expand Up @@ -79,6 +117,7 @@ def update_or_create_form_document(tag, content, language)
language:,
)
form_document.content = content

form_document.save!
end

Expand Down
22 changes: 21 additions & 1 deletion app/services/make_form_live_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@ def call(**args)
end
end

def initialize(current_form:, current_user:)
def initialize(current_form:, current_user:, language: nil)
@current_form = current_form
@current_form_was_live = current_form.is_live?
@current_form_was_archived = current_form.is_archived?
@current_live_form = FormDocument::Content.from_form_document(current_form.live_form_document) if current_form.is_live?
@current_user = current_user
@language = language
end

def make_live
Expand All @@ -26,9 +27,19 @@ def make_live
end
end

def make_language_live
if @language == "en"
make_english_live
else
make_welsh_live
end
end

def page_title
return I18n.t("page_titles.your_form_is_live") if @current_form_was_archived
return I18n.t("page_titles.your_changes_are_live") if @current_form_was_live
return I18n.t("page_titles.your_english_form_is_live") if @language == "en"
return I18n.t("page_titles.your_welsh_form_is_live") if @language == "cy"

I18n.t("page_titles.your_form_is_live")
end
Expand All @@ -37,13 +48,22 @@ def confirmation_page_body
return I18n.t("make_changes_live.confirmation.body_html_cy").html_safe if @current_form_was_live && @current_form.has_welsh_translation?
return I18n.t("make_changes_live.confirmation.body_html").html_safe if @current_form_was_live

return I18n.t("make_live.confirmation.body_individual_language_html").html_safe if @language.present?
return I18n.t("make_live.confirmation.body_html_cy").html_safe if @current_form.has_welsh_translation?

I18n.t("make_live.confirmation.body_html").html_safe
end

private

def make_english_live
@current_form.make_english_version_live!
end

def make_welsh_live
@current_form.make_welsh_version_live!
end

def live_form_submission_email_has_changed
@current_form_was_live && @current_live_form.submission_email != @current_form.submission_email
end
Expand Down
14 changes: 14 additions & 0 deletions app/state_machines/form_state_machine.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,20 @@ module FormStateMachine
transitions from: %i[draft live_with_draft archived archived_with_draft], to: :live, guard: :ready_for_live
end

event :make_english_version_live do
before :before_make_english_live
after :after_make_english_live

transitions from: %i[draft live live_with_draft], to: :live, guard: :can_make_english_version_live?
end

event :make_welsh_version_live do
before :before_make_welsh_live
after :after_make_welsh_live

transitions from: %i[live live_with_draft], to: :live, guard: :can_make_welsh_version_live?
end

event :create_draft_from_live_form do
after :after_create_draft

Expand Down
54 changes: 54 additions & 0 deletions app/views/forms/make_language_live/confirmation.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<% set_page_title(confirmation_page_title) %>

<div class="govuk-grid-row">
<div class="govuk-grid-column-two-thirds">
<%= govuk_panel(title_text: confirmation_page_title) %>

<%= confirmation_page_body %>

<% if language == "en" %>
<h2 class="govuk-heading-m"><%= t('make_live.confirmation.form_name_en') %></h2>

<p><%= current_form.name %></p>
<% end %>

<% if language == "cy" %>
<h2 class="govuk-heading-m"><%= t('make_live.confirmation.form_name_cy') %></h2>

<p><%= current_form.name_cy %></p>
<% end %>

<% if language == "en" %>
<%= render FormUrlComponent::View.new(
runner_link: link_to_runner(Settings.forms_runner.url, current_form.id, current_form.form_slug, mode: :live),
heading_text: t('make_live.confirmation.english_form_url'),
button_text: t('make_live.confirmation.copy_english_url_to_clipboard')
) %>
<% end %>

<% if language == "cy" %>
<%= render FormUrlComponent::View.new(
runner_link: link_to_runner(Settings.forms_runner.url, current_form.id, current_form.form_slug, mode: :live, locale: "cy"),
heading_text: t('make_live.confirmation.welsh_form_url'),
button_text: t('make_live.confirmation.copy_welsh_url_to_clipboard')
) %>
<% end %>

<p>
<%= govuk_link_to t("make_live.confirmation.continue_link"), live_form_path(current_form.id) %>
</p>

<% if language == "en" %>
<% if current_form.welsh_completed %>
<%= form_with model: @go_to_make_welsh_live_input, url: make_language_live_submit_confirmation_path(form_id: current_form.id, language:) do |f| %>
<%= f.govuk_collection_radio_buttons :confirm, @go_to_make_welsh_live_input.values, :itself, legend: { size: 'm', tag: 'h2' }, bold_labels: false %>
<%= f.govuk_submit t("save_and_continue") %>
<% end %>
<% else %>
<p>
<%= t("make_live.confirmation.back_to_draft_link_html", url: form_path(current_form.id)) %>
</p>
<% end %>
<% end %>
</div>
</div>
25 changes: 25 additions & 0 deletions app/views/forms/make_language_live/new.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<% set_page_title(title_with_error_prefix(t("page_titles.make_language_live.#{language}"), @make_language_live_input.errors.any?)) %>
<% content_for :back_link, govuk_back_link_to(form_path, t("back_link.form_create")) %>

<div class="govuk-grid-row">
<div class="govuk-grid-column-two-thirds">
<%= form_with(model: @make_language_live_input, url: make_language_live_create_path) do |f| %>
<% if @make_language_live_input&.errors&.any? %>
<%= f.govuk_error_summary %>
<% end %>

<h1 class="govuk-heading-l">
<span class="govuk-caption-l"><%= @make_language_live_input.form.name %></span>
<%= t("page_titles.make_language_live.#{language}") %>
</h1>

<%= t("make_language_live.#{language}.new.body_html", submission_email: @make_language_live_input.form.submission_email) %>

<%= f.govuk_collection_radio_buttons :confirm,
@make_language_live_input.values, ->(option) { option }, ->(option) { t("helpers.label.confirm_action_input.options.#{option}") },
legend: { text: t("helpers.label.forms_make_language_live_input.#{language}.confirm"),
size: 'm'}, inline: true %>
<%= f.govuk_submit t("save_and_continue") %>
<% end %>
</div>
</div>
Loading