-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathwelsh_translation_input.rb
More file actions
173 lines (130 loc) · 6.16 KB
/
welsh_translation_input.rb
File metadata and controls
173 lines (130 loc) · 6.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
class Forms::WelshTranslationInput < Forms::MarkCompleteInput
include TextInputHelper
include ActiveModel::Attributes
attr_accessor :form, :page_translations
attribute :mark_complete
attribute :name_cy
attribute :privacy_policy_url_cy
attribute :support_email_cy
attribute :support_phone_cy
attribute :support_url_cy
attribute :support_url_text_cy
attribute :declaration_markdown_cy
attribute :what_happens_next_markdown_cy
attribute :payment_url_cy
validates :name_cy, presence: true, if: -> { marked_complete? }
validates :name_cy, length: { maximum: 500 }, if: -> { name_cy.present? }
validates :privacy_policy_url_cy, presence: true, if: -> { marked_complete? && form.privacy_policy_url.present? }
validates :privacy_policy_url_cy, url: true, if: -> { privacy_policy_url_cy.present? }
validates :privacy_policy_url_cy, exclusion: { in: %w[https://www.gov.uk/help/privacy-notice] }, if: -> { privacy_policy_url_cy.present? }
validates :support_email_cy, presence: true, if: -> { marked_complete? && form_has_support_email? }
validates :support_email_cy, email_address: true, allowed_email_domain: true, if: -> { support_email_cy.present? }
validates :support_phone_cy, presence: true, if: -> { marked_complete? && form_has_support_phone? }
validates :support_phone_cy, length: { maximum: 500 }, if: -> { support_phone_cy.present? }
validates :support_url_cy, presence: true, if: -> { marked_complete? && form_has_support_url? }
validates :support_url_cy, url: true, length: { maximum: 120 }, if: -> { support_url_cy.present? }
validates :support_url_text_cy, presence: true, if: -> { marked_complete? && form_has_support_url? }
validates :support_url_text_cy, length: { maximum: 120 }, if: -> { support_url_text_cy.present? }
validates :declaration_markdown_cy, presence: true, if: -> { marked_complete? && form_has_declaration? }
validates :declaration_markdown_cy, length: { maximum: 2000 }, if: -> { declaration_markdown_cy.present? }
validates :what_happens_next_markdown_cy, presence: true, if: -> { marked_complete? && form.what_happens_next_markdown.present? }
validates :what_happens_next_markdown_cy, markdown: { allow_headings: false }, if: -> { what_happens_next_markdown_cy.present? }
validates :payment_url_cy, presence: true, if: -> { marked_complete? && form_has_payment_url? }
validates :payment_url_cy, payment_link: true, if: -> { payment_url_cy.present? }
validate :page_translations_valid
def initialize(attributes = {})
@form = attributes.delete(:form)
super
@page_translations ||= []
end
def page_translations_attributes=(attributes)
# Get all submitted page IDs from the params hash.
submitted_page_ids = attributes.values.map { |attrs| attrs["id"] }.compact
# lookup hash for efficiency
pages_by_id = form.pages.where(id: submitted_page_ids).includes(:routing_conditions).index_by(&:id)
self.page_translations = attributes.values.map { |page_attrs|
page_id = page_attrs["id"].to_i
page_object = pages_by_id[page_id]
# skip the page if it doesn't belong to the form
next unless page_object
Forms::WelshPageTranslationInput.new(page_attrs.symbolize_keys.merge(page: page_object))
}.compact
end
def submit
return false if invalid?
form.name_cy = name_cy
form.declaration_markdown_cy = form_has_declaration? ? declaration_markdown_cy : nil
form.payment_url_cy = form_has_payment_url? ? payment_url_cy : nil
form.privacy_policy_url_cy = privacy_policy_url_cy
form.support_email_cy = form_has_support_email? ? support_email_cy : nil
form.support_phone_cy = form_has_support_phone? ? support_phone_cy : nil
if form_has_support_url?
form.support_url_cy = support_url_cy
form.support_url_text_cy = support_url_text_cy
else
form.support_url_cy = nil
form.support_url_text_cy = nil
end
form.what_happens_next_markdown_cy = what_happens_next_markdown_cy
page_translations.presence&.each(&:submit)
form.welsh_completed = mark_complete
# We add :cy to the available languages so that the welsh form can be
# previewed. This means that if mark_complete is false, welsh form docs
# will be generated.
# TODO: Add a button for removing the Welsh form
form.available_languages = %w[en cy]
form.save_draft!
end
def assign_form_values
self.name_cy = form.name_cy
self.privacy_policy_url_cy = form.privacy_policy_url_cy
self.support_email_cy = form.support_email_cy
self.support_phone_cy = form.support_phone_cy
self.support_url_cy = form.support_url_cy
self.support_url_text_cy = form.support_url_text_cy
self.declaration_markdown_cy = form.declaration_markdown_cy
self.what_happens_next_markdown_cy = form.what_happens_next_markdown_cy
self.payment_url_cy = form.payment_url_cy
self.mark_complete = form.try(:welsh_completed)
self.page_translations = form.pages.map do |page|
Forms::WelshPageTranslationInput.new(page:).assign_page_values
end
self
end
def form_has_declaration?
form.declaration_markdown.present?
end
def form_has_payment_url?
form.payment_url.present?
end
def form_has_support_url?
form.support_url.present?
end
def form_has_support_phone?
form.support_phone.present?
end
def form_has_support_email?
form.support_email.present?
end
def form_has_support_information?
form_has_support_email? || form_has_support_phone? || form_has_support_url?
end
def form_has_what_happens_next?
form.what_happens_next_markdown.present?
end
def form_has_privacy_information?
form.privacy_policy_url.present?
end
def page_translations_valid
return if page_translations.nil?
# We pass :mark_complete as the validation context so the page_translations
# can validate differently depending on whether the form is marked complete
validation_context = marked_complete? ? :mark_complete : nil
page_translations.each do |page_translation|
page_translation.validate(validation_context)
page_translation.errors.each do |error|
errors.import(error, { attribute: "page_#{page_translation.page.position}_#{error.attribute}".to_sym })
end
end
end
end