Skip to content

Commit b391eb8

Browse files
committed
Manage required attribute on date range inputs
1 parent 341bfd8 commit b391eb8

File tree

3 files changed

+69
-0
lines changed

3 files changed

+69
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<%= form_tag search_action_path, method: :get, class: [@classes[:form], "range_#{@facet_field.key} d-flex justify-content-center"].join(' '), data: { controller: "range-limit" } do %>
2+
<%= render hidden_search_state %>
3+
4+
<div class="input-group input-group-sm mb-3 flex-nowrap range-limit-input-group">
5+
<%= render_range_input(:begin, begin_label) %>
6+
<%= render_range_input(:end, end_label) %>
7+
<div class="input-group-append visually-hidden">
8+
<%= submit_tag t('blacklight.range_limit.submit_limit'), class: @classes[:submit], name: nil %>
9+
</div>
10+
<%= submit_tag t('blacklight.range_limit.submit_limit'), class: @classes[:submit] + " sr-only", "aria-hidden": "true", name: nil, data: { range_limit_target: "submitButton" } %>
11+
</div>
12+
<% end %>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Controller } from "@hotwired/stimulus"
2+
3+
export default class extends Controller {
4+
connect() {
5+
this.beginInput = this.element.querySelector('input[name="range[date_range][begin]"]');
6+
this.endInput = this.element.querySelector('input[name="range[date_range][end]"]');
7+
this.beginInput.addEventListener('input', event => this.updateInputRequiredState(event));
8+
this.endInput.addEventListener('input', event => this.updateInputRequiredState(event));
9+
}
10+
11+
updateInputRequiredState(event) {
12+
const bothEmpty = this.beginInput.value === '' && this.endInput.value === ''
13+
14+
if (bothEmpty) {
15+
this.beginInput.removeAttribute('required');
16+
this.endInput.removeAttribute('required');
17+
} else {
18+
this.beginInput.setAttribute('required', '');
19+
this.endInput.setAttribute('required', '');
20+
}
21+
}
22+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# frozen_string_literal: true
2+
3+
require 'rails_helper'
4+
5+
RSpec.describe 'Range Limit Facet', :js do
6+
it 'does not accept an incomplete range' do
7+
visit search_catalog_path
8+
9+
click_on 'Show facets' if page.has_button?('Show facets')
10+
11+
expect(page).to have_button('Date range')
12+
click_on 'Date range'
13+
14+
# Both empty
15+
expect(page).to have_no_css('input#range_date_range_begin[required]')
16+
expect(page).to have_no_css('input#range_date_range_end[required]')
17+
18+
# Only begin has a value
19+
fill_in 'range_date_range_begin', with: '1986'
20+
expect(page).to have_css('input#range_date_range_begin[required]')
21+
expect(page).to have_css('input#range_date_range_end[required]')
22+
23+
# Only end has a value
24+
fill_in 'range_date_range_begin', with: ''
25+
fill_in 'range_date_range_end', with: '1991'
26+
expect(page).to have_css('input#range_date_range_begin[required]')
27+
expect(page).to have_css('input#range_date_range_end[required]')
28+
29+
# Both have values
30+
fill_in 'range_date_range_begin', with: '1986'
31+
fill_in 'range_date_range_end', with: '1991'
32+
expect(page).to have_css('input#range_date_range_begin[required]')
33+
expect(page).to have_css('input#range_date_range_end[required]')
34+
end
35+
end

0 commit comments

Comments
 (0)