Skip to content

Commit cb98cee

Browse files
committed
Plain SimpleForm Date/Time WIP
1 parent e700e92 commit cb98cee

10 files changed

Lines changed: 348 additions & 34 deletions

dist/simple-form.bootstrap4.esm.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ ClientSideValidations.formBuilders['SimpleForm::FormBuilder'] = {
2323
wrappers: {
2424
"default": {
2525
add: function add(element, settings, message) {
26+
alert('bla');
2627
var wrapperElement = element.parent();
2728
var errorElement = wrapperElement.find(settings.error_tag + '.invalid-feedback');
2829

dist/simple-form.bootstrap4.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
wrappers: {
3030
"default": {
3131
add: function add(element, settings, message) {
32+
alert('bla');
3233
var wrapperElement = element.parent();
3334
var errorElement = wrapperElement.find(settings.error_tag + '.invalid-feedback');
3435

dist/simple-form.esm.js

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ ClientSideValidations.formBuilders['SimpleForm::FormBuilder'] = {
2323
wrappers: {
2424
"default": {
2525
add: function add(element, settings, message) {
26+
console.log(this);
27+
28+
if (element.is('select') && (element.hasClass('date') || element.hasClass('time'))) {
29+
console.log(this);
30+
}
31+
2632
var wrapper = element.closest(settings.wrapper_tag + '.' + settings.wrapper_class.replace(/ /g, '.'));
2733
var errorElement = wrapper.find(settings.error_tag + '.' + settings.error_class.replace(/ /g, '.'));
2834

@@ -44,15 +50,6 @@ ClientSideValidations.formBuilders['SimpleForm::FormBuilder'] = {
4450
return errorElement.remove();
4551
}
4652
},
47-
48-
get horizontal_multi_select() {
49-
return this.multi_select;
50-
},
51-
52-
get vertical_multi_select() {
53-
return this.multi_select;
54-
},
55-
5653
multi_select: {
5754
add: function add(element, settings, message) {
5855
var wrapperElement = element.closest(settings.wrapper_tag + '.' + settings.wrapper_class.replace(/ /g, '.'));

dist/simple-form.js

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@
2929
wrappers: {
3030
"default": {
3131
add: function add(element, settings, message) {
32+
console.log(this);
33+
34+
if (element.is('select') && (element.hasClass('date') || element.hasClass('time'))) {
35+
console.log(this);
36+
}
37+
3238
var wrapper = element.closest(settings.wrapper_tag + '.' + settings.wrapper_class.replace(/ /g, '.'));
3339
var errorElement = wrapper.find(settings.error_tag + '.' + settings.error_class.replace(/ /g, '.'));
3440

@@ -50,15 +56,6 @@
5056
return errorElement.remove();
5157
}
5258
},
53-
54-
get horizontal_multi_select() {
55-
return this.multi_select;
56-
},
57-
58-
get vertical_multi_select() {
59-
return this.multi_select;
60-
},
61-
6259
multi_select: {
6360
add: function add(element, settings, message) {
6461
var wrapperElement = element.closest(settings.wrapper_tag + '.' + settings.wrapper_class.replace(/ /g, '.'));

src/main.js

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ ClientSideValidations.formBuilders['SimpleForm::FormBuilder'] = {
1818
wrappers: {
1919
default: {
2020
add (element, settings, message) {
21+
if (element.is('select') && (element.hasClass('date') || element.hasClass('time'))) {
22+
console.log(this.wrappers.multi_select.add(element, settings, message))
23+
}
24+
2125
const wrapper = element.closest(settings.wrapper_tag + '.' + settings.wrapper_class.replace(/ /g, '.'))
2226
let errorElement = wrapper.find(settings.error_tag + '.' + settings.error_class.replace(/ /g, '.'))
2327

@@ -38,12 +42,6 @@ ClientSideValidations.formBuilders['SimpleForm::FormBuilder'] = {
3842
return errorElement.remove()
3943
}
4044
},
41-
get horizontal_multi_select () {
42-
return this.multi_select
43-
},
44-
get vertical_multi_select () {
45-
return this.multi_select
46-
},
4745
multi_select: {
4846
add (element, settings, message) {
4947
const wrapperElement = element.closest(settings.wrapper_tag + '.' + settings.wrapper_class.replace(/ /g, '.'))

test/javascript/public/test/form_builders/validateSimpleForm.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ QUnit.module('Validate SimpleForm', {
1212
dataCsv = {
1313
html_settings: {
1414
type: 'SimpleForm::FormBuilder',
15-
error_class: 'error small',
15+
error_class: 'error',
1616
error_tag: 'span',
1717
wrapper_error_class: 'field_with_errors',
1818
wrapper_tag: 'div',
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
QUnit.module('Validate SimpleForm Bootstrap 4 Datetime Fields/Wrappers', {
2+
before: function () {
3+
currentFormBuilder = window.ClientSideValidations.formBuilders['SimpleForm::FormBuilder']
4+
window.ClientSideValidations.formBuilders['SimpleForm::FormBuilder'] = BS4_FORM_BUILDER
5+
},
6+
7+
after: function () {
8+
window.ClientSideValidations.formBuilders['SimpleForm::FormBuilder'] = currentFormBuilder
9+
},
10+
11+
beforeEach: function () {
12+
dataCsv = {
13+
html_settings: {
14+
type: 'SimpleForm::FormBuilder',
15+
error_class: null,
16+
error_tag: 'div',
17+
wrapper_error_class: 'form-group-invalid',
18+
wrapper_tag: 'div',
19+
wrapper_class: 'form-group'
20+
},
21+
validators: {
22+
'user[date_of_birth]': { presence: [{ message: 'must be present' }] },
23+
'user[time_of_birth]': { presence: [{ message: 'must be present' }] }
24+
}
25+
}
26+
27+
$('#qunit-fixture')
28+
.append(
29+
$('<form>', {
30+
action: '/users',
31+
'data-client-side-validations': JSON.stringify(dataCsv),
32+
method: 'post',
33+
id: 'new_user'
34+
})
35+
.append($('<div>', {
36+
class:'form-group date required user_date_of_birth'
37+
})
38+
.append($('<label class="form-control-label date required" for="user_date_of_birth_1i">Date of birth <abbr title="required">*</abbr></label>'))
39+
.append($('<div>', {
40+
class: 'd-flex flex-row justify-content-between align-items-center'
41+
})
42+
.append($('<select>', {
43+
id: 'user_date_of_birth_1i',
44+
name: 'user[date_of_birth(1i)]',
45+
class: 'form-control mx-1 date required',
46+
'data-client-side-validations-wrapper': 'vertical_multi_select'
47+
})
48+
.append($('<option value=""></option>'))
49+
.append($('<option value="2015">2015</option>'))
50+
.append($('<option value="2025">2025</option>')))
51+
.append($('<select>', {
52+
id: 'user_date_of_birth_2i',
53+
name: 'user[date_of_birth(2i)]',
54+
class: 'form-control mx-1 date required',
55+
'data-client-side-validations-wrapper': 'vertical_multi_select'
56+
})
57+
.append($('<option value=""></option>'))
58+
.append($('<option value="1">January</option>'))
59+
.append($('<option value="2">February</option>')))
60+
.append($('<select>', {
61+
id: 'user_date_of_birth_3i',
62+
name: 'user[date_of_birth(3i)]',
63+
class: 'form-control mx-1 date required',
64+
'data-client-side-validations-wrapper': 'vertical_multi_select'
65+
})
66+
.append($('<option value=""></option>'))
67+
.append($('<option value="1">1</option>'))
68+
.append($('<option value="2">2</option>'))
69+
.append($('<option value="3">3</option>')))
70+
)
71+
.append('<small class="form-text text-muted">hint text</small>')
72+
)
73+
.append($('<div>', {
74+
class:'form-group time required user_time_of_birth form-group-invalid'
75+
})
76+
.append($('<label class="form-control-label time required" for="user_time_of_birth_4i">Time of birth <abbr title="required">*</abbr></label>'))
77+
.append($('<div>', {
78+
class: 'd-flex flex-row justify-content-between align-items-center'
79+
})
80+
.append('<input type="hidden" id="user_time_of_birth_1i" name="user[time_of_birth(1i)]" value="1">')
81+
.append('<input type="hidden" id="user_time_of_birth_2i" name="user[time_of_birth(2i)]" value="1">')
82+
.append('<input type="hidden" id="user_time_of_birth_3i" name="user[time_of_birth(3i)]" value="1">')
83+
.append($('<select>', {
84+
id: 'user_time_of_birth_4i',
85+
name: 'user[time_of_birth(4i)]',
86+
class: 'form-control mx-1 is-invalid time required',
87+
'data-client-side-validations-wrapper': 'vertical_multi_select'
88+
})
89+
.append($('<option value=""></option>'))
90+
.append($('<option value="00">00</option>'))
91+
.append($('<option value="23">23</option>'))
92+
)
93+
.append(':')
94+
.append($('<select>', {
95+
id: 'user_time_of_birth_5i',
96+
name: 'user[time_of_birth(5i)]',
97+
class: 'form-control mx-1 is-invalid time required',
98+
'data-client-side-validations-wrapper': 'vertical_multi_select'
99+
})
100+
.append($('<option value=""></option>'))
101+
.append($('<option value="00">00</option>'))
102+
.append($('<option value="55">55</option>'))
103+
)
104+
)
105+
.append('<div class="invalid-feedback d-block">Time of birth must be present.</div>')
106+
.append('<small class="form-text text-muted">Hint: At what time you were born?</small>')
107+
)
108+
)
109+
110+
$('form#new_user').validate()
111+
}
112+
})
113+
114+
//I don think this multiple wrapper names makes sense here, because in SimpleForm different wrapper would have different DOM
115+
//but here DOM ($('#qunit-fixture')) is same for all tests.
116+
var wrappers = ['vertical_form']
117+
118+
for (var i = 0; i < wrappers.length; i++) {
119+
var wrapper = wrappers[i]
120+
121+
QUnit.test(wrapper + ' - Validate date input', function (assert) {
122+
const form = $('form#new_user');
123+
const select_year = form.find('select#user_date_of_birth_1i')
124+
const select_month = form.find('select#user_date_of_birth_2i')
125+
const select_day = form.find('select#user_date_of_birth_3i')
126+
127+
form[0].ClientSideValidations.settings.html_settings.wrapper = wrapper
128+
129+
select_year.trigger('focusout')
130+
select_day.trigger('focusout')
131+
132+
assert.ok(select_year.closest('.form-group').hasClass('form-group-invalid'))
133+
assert.ok(select_month.closest('.form-group').hasClass('form-group-invalid'))
134+
assert.ok(select_year.closest('.form-group').find('div.invalid-feedback').length === 1)
135+
136+
select_year.val(2025).trigger('change').trigger('focusout')
137+
138+
assert.ok(select_year.closest('.form-group').hasClass('form-group-invalid'))
139+
assert.ok(select_year.closest('.form-group').find('div.invalid-feedback').length === 1)
140+
141+
select_month.val(1).trigger('change').trigger('focusout')
142+
select_day.val(1).trigger('change').trigger('focusout')
143+
144+
assert.notOk(select_year.closest('.form-group').hasClass('form-group-invalid'))
145+
assert.ok(select_year.closest('.form-group').find('div.invalid-feedback').length === 0)
146+
})
147+
148+
QUnit.test(wrapper + ' - Validate time input reusing server message', function (assert) {
149+
const form = $('form#new_user');
150+
const select_hour = form.find('select#user_time_of_birth_4i')
151+
const select_minute = form.find('select#user_time_of_birth_5i')
152+
153+
form[0].ClientSideValidations.settings.html_settings.wrapper = wrapper
154+
155+
assert.ok(select_hour.closest('.form-group').hasClass('form-group-invalid'))
156+
assert.ok(select_minute.closest('.form-group').hasClass('form-group-invalid'))
157+
assert.ok(select_hour.closest('.form-group').find('div.invalid-feedback').length === 1)
158+
159+
select_hour.val(23).trigger('change').trigger('focusout')
160+
161+
assert.ok(select_hour.closest('.form-group').hasClass('form-group-invalid'))
162+
assert.ok(select_minute.closest('.form-group').hasClass('form-group-invalid'))
163+
assert.ok(select_hour.closest('.form-group').find('div.invalid-feedback').length === 1)
164+
165+
select_minute.val(55).trigger('change').trigger('focusout')
166+
167+
assert.notOk(select_hour.closest('.form-group').hasClass('form-group-invalid'))
168+
assert.ok(select_hour.closest('.form-group').find('div.invalid-feedback').length === 0)
169+
})
170+
}

0 commit comments

Comments
 (0)