Skip to content

Commit b3ac271

Browse files
authored
Merge pull request #6185 from alex-yi37/issue-5888-case-contact-details-ux
fix: case court report modal ui changes
2 parents ae0af55 + d08af7f commit b3ac271

File tree

4 files changed

+91
-10
lines changed

4 files changed

+91
-10
lines changed

app/assets/stylesheets/pages/casa_cases.scss

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,4 +169,25 @@ body.casa_cases-show {
169169
flex-direction: column;
170170
gap: .2rem;
171171
}
172-
}
172+
}
173+
174+
#case-selection:required, .select2.select2-container {
175+
background: transparent;
176+
border: 1px solid #e5e5e5;
177+
border-radius: 10px;
178+
padding: 8px;
179+
appearance: none;
180+
-webkit-appearance: none;
181+
-moz-appearance: none;
182+
}
183+
184+
.select-wrapper {
185+
display: flex;
186+
flex-direction: column;
187+
gap: 8px;
188+
}
189+
190+
span[role=combobox] {
191+
padding-top: 2px;
192+
}
193+

app/javascript/src/casa_case.js

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,25 @@ function showAlert (html) {
8585
flashContainer && flashContainer.replaceWith(alertEl)
8686
}
8787

88+
function validateForm (formEl, errorEl) {
89+
if (!formEl) {
90+
return
91+
}
92+
93+
// check html validations, checkValidity returns false if doesn't pass validation
94+
if (errorEl && !formEl.checkValidity()) {
95+
errorEl.classList.remove('d-none')
96+
}
97+
}
98+
8899
function handleGenerateReport (e) {
89100
e.preventDefault()
90101

91-
const formData = Object.fromEntries(new FormData(e.currentTarget.form))
102+
const form = e.currentTarget.form
92103

104+
const formData = Object.fromEntries(new FormData(form))
105+
const errorEl = document.querySelector('.select-required-error')
106+
validateForm(form, errorEl ?? null)
93107
if (formData.case_number.length === 0) return
94108

95109
const generateBtn = e.currentTarget
@@ -127,20 +141,43 @@ function handleGenerateReport (e) {
127141
})
128142
}
129143

144+
function clearSelectErrors () {
145+
const errorEl = document.querySelector('.select-required-error')
146+
147+
if (!errorEl) return
148+
149+
errorEl.classList.add('d-none')
150+
}
151+
152+
function handleModalClose () {
153+
const selectEl = document.querySelector('#case-selection')
154+
155+
if (!selectEl) return
156+
157+
clearSelectErrors()
158+
// this line taken from docs https://select2.org/programmatic-control/add-select-clear-items
159+
$('#case-selection').val(null).trigger('change')
160+
}
161+
130162
$(() => { // JQuery's callback for the DOM loading
131163
$('button.copy-court-button').on('click', copyOrdersFromCaseWithConfirmation)
132164

133165
if ($('button.copy-court-button').length) {
134166
disableBtn($('button.copy-court-button')[0])
135167
}
136168

169+
$('#case-selection').on('change', clearSelectErrors)
170+
137171
$('select.siblings-casa-cases').on('change', () => {
138172
if ($('select.siblings-casa-cases').find(':selected').text()) {
139173
enableBtn($('button.copy-court-button')[0])
140174
} else {
141175
disableBtn($('button.copy-court-button')[0])
142176
}
143177
})
178+
// modal id is defined in _generate_docx.html.erb so would like to be able to implement modal close logic in that file
179+
// but not sure how to
180+
$('#generate-docx-report-modal').on('hidden.bs.modal', () => handleModalClose())
144181

145182
$('#btnGenerateReport').on('click', handleGenerateReport)
146183

app/views/case_court_reports/_generate_docx.html.erb

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,17 @@
2727

2828
<% select_case_prompt = show_search ? "Search by volunteer name or case number" : "Select case number" %>
2929
<% select2_class = show_search ? " select2" : "" %>
30-
<%= select_tag :case_number,
31-
options_for_select(select_options),
32-
prompt: select_case_prompt,
33-
include_blank: false,
34-
id: "case-selection",
35-
class: "custom-select#{select2_class}",
36-
data: { dropdown_parent: "##{id}" } %>
37-
30+
<div class="select-wrapper">
31+
<%= select_tag :case_number,
32+
options_for_select(select_options),
33+
prompt: select_case_prompt,
34+
include_blank: false,
35+
id: "case-selection",
36+
class: "custom-select#{select2_class}",
37+
required: true,
38+
data: { dropdown_parent: "##{id}", width: "100%" } %>
39+
<p class="select-required-error text-danger d-none">Case selection is required.</p>
40+
</div>
3841
<%= form.hidden_field :time_zone, id: "user-time-zone" %>
3942
</div>
4043
<div class="dates-container">

spec/system/case_court_reports/index_spec.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,26 @@
7373
expect(page).to have_selector("#btnGenerateReport .lni-download", visible: true)
7474
expect(page).not_to have_selector("#btnGenerateReport[disabled]")
7575
expect(page).to have_selector("#spinner", visible: :hidden)
76+
77+
# when 'Generate Report' button is clicked without a selection, should display an error saying to make a selection
78+
expect(page).to have_selector(".select-required-error", visible: :visible)
79+
80+
test_case_number = casa_cases.find(&:in_transition_age?).case_number.to_s
81+
82+
# when we make a selection, the error is no longer visible
83+
page.select test_case_number, from: "case-selection"
84+
expect(page).not_to have_selector(".select-required-error", visible: :visible)
85+
86+
# test the flow for clearing case selection error message by closing modal
87+
click_button "Close"
88+
page.find(modal_selector).click
89+
click_button "Generate Report"
90+
# expect the error message to be visible because we tried to generate the doc without making a selection
91+
expect(page).to have_selector(".select-required-error", visible: :visible)
92+
# expect error message to be gone after we close and re-open the modal
93+
click_button "Close"
94+
page.find(modal_selector).click
95+
expect(page).not_to have_selector(".select-required-error", visible: :visible)
7696
end
7797
end
7898

0 commit comments

Comments
 (0)