Skip to content

Commit 6268e39

Browse files
committed
auto-check-element only validates on blur
1 parent 6122d20 commit 6268e39

File tree

4 files changed

+26
-53
lines changed

4 files changed

+26
-53
lines changed

custom-elements.json

-8
Original file line numberDiff line numberDiff line change
@@ -214,14 +214,6 @@
214214
"type": {
215215
"text": "boolean"
216216
}
217-
},
218-
{
219-
"kind": "field",
220-
"name": "onlyValidateOnBlur",
221-
"type": {
222-
"text": "boolean"
223-
},
224-
"readonly": true
225217
}
226218
],
227219
"attributes": [

examples/index.html

-13
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,6 @@ <h2 tabindex="-1" id="success2" class="success" hidden>Your submission was succe
3737
</auto-check>
3838
<button value="2" name="form">submit</button>
3939
</form>
40-
41-
<h2>only-validate-on-blur with custom validity messages</h2>
42-
<h2 tabindex="-1" id="success3" class="success" hidden>Your submission was successful</h2>
43-
<form id="custom2">
44-
<p>All fields marked with * are required</p>
45-
46-
<label for="simple-field2">Desired username*:</label>
47-
<auto-check csrf="foo" src="/demo" required only-validate-on-blur>
48-
<input id="simple-field2" autofocus name="foo" required aria-describedby="state3" />
49-
<p id="state3" aria-atomic="true" aria-live="polite" class="state"></p>
50-
</auto-check>
51-
<button value="3" name="form">submit</button>
52-
</form>
5340
</main>
5441

5542
<script>

src/auto-check-element.ts

+4-17
Original file line numberDiff line numberDiff line change
@@ -208,11 +208,6 @@ export class AutoCheckElement extends HTMLElement {
208208
const value = this.getAttribute('validate-on-keystroke')
209209
return value === 'true' || value === ''
210210
}
211-
212-
get onlyValidateOnBlur(): boolean {
213-
const value = this.getAttribute('only-validate-on-blur')
214-
return value === 'true' || value === ''
215-
}
216211
}
217212

218213
function handleChange(checker: () => void, event: Event) {
@@ -229,12 +224,8 @@ function handleChange(checker: () => void, event: Event) {
229224
if (input.value.length === 0) return
230225

231226
if (
232-
(event.type !== 'blur' && !autoCheckElement.onlyValidateOnBlur) || // Existing default behavior
233-
(event.type === 'blur' &&
234-
autoCheckElement.onlyValidateOnBlur &&
235-
!autoCheckElement.validateOnKeystroke &&
236-
autoCheckElement.hasAttribute('dirty')) || // Only validate on blur if only-validate-on-blur is set, input is dirty, and input is not current validating on keystroke
237-
(event.type === 'input' && autoCheckElement.onlyValidateOnBlur && autoCheckElement.validateOnKeystroke) || // Only validate on key inputs in only-validate-on-blur mode if validate-on-keystroke is set (when input is invalid)
227+
(event.type === 'blur' && !autoCheckElement.validateOnKeystroke && autoCheckElement.hasAttribute('dirty')) || // Only validate on blur if input is dirty and input is not current validating on keystroke
228+
(event.type === 'input' && autoCheckElement.validateOnKeystroke) || // Only validate on key inputs if validate-on-keystroke is set (when input is invalid)
238229
event.type === 'triggervalidation' // Trigger validation manually
239230
) {
240231
setLoadingState(event)
@@ -359,14 +350,10 @@ async function check(autoCheckElement: AutoCheckElement) {
359350
// To test, ensure that the input only validates on blur
360351
// once it has been "healed" by a valid input after
361352
// previously being in an invalid state.
362-
if (autoCheckElement.onlyValidateOnBlur) {
363-
autoCheckElement.validateOnKeystroke = false
364-
}
353+
autoCheckElement.validateOnKeystroke = false
365354
input.dispatchEvent(new AutoCheckSuccessEvent(response.clone()))
366355
} else {
367-
if (autoCheckElement.onlyValidateOnBlur) {
368-
autoCheckElement.validateOnKeystroke = true
369-
}
356+
autoCheckElement.validateOnKeystroke = true
370357
const event = new AutoCheckErrorEvent(response.clone())
371358
input.dispatchEvent(event)
372359
if (autoCheckElement.required) {

test/auto-check.js

+22-15
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ describe('auto-check element', function () {
2222
})
2323
})
2424

25-
describe('when only-validate-on-blur is true', function () {
25+
describe('blur event functionality', function () {
2626
let checker
2727
let input
2828

2929
beforeEach(function () {
3030
const container = document.createElement('div')
3131
container.innerHTML = `
32-
<auto-check csrf="foo" src="/success" only-validate-on-blur>
32+
<auto-check csrf="foo" src="/success">
3333
<input>
3434
</auto-check>`
3535
document.body.append(container)
@@ -137,28 +137,32 @@ describe('auto-check element', function () {
137137
assert.isFalse(input.checkValidity())
138138
})
139139

140-
it('invalidates the input element on keypress', async function () {
140+
it('invalidates the input element on blur', async function () {
141141
const inputEvent = once(input, 'input')
142142
triggerInput(input, 'hub')
143+
triggerBlur(input)
143144
await inputEvent
144145
assert.isFalse(input.checkValidity())
145146
})
146147

147148
it('invalidates input request is in-flight', async function () {
148149
triggerInput(input, 'hub')
150+
triggerBlur(input)
149151
await once(checker, 'loadstart')
150152
assert.isFalse(input.checkValidity())
151153
})
152154

153155
it('invalidates input with failed server response', async function () {
154156
checker.src = '/fail'
155157
triggerInput(input, 'hub')
158+
triggerBlur(input)
156159
await once(input, 'auto-check-complete')
157160
assert.isFalse(input.checkValidity())
158161
})
159162

160163
it('validates input with successful server response', async function () {
161164
triggerInput(input, 'hub')
165+
triggerBlur(input)
162166
await once(input, 'auto-check-complete')
163167
assert.isTrue(input.checkValidity())
164168
})
@@ -171,6 +175,7 @@ describe('auto-check element', function () {
171175
resolve()
172176
})
173177
triggerInput(input, 'hub')
178+
triggerBlur(input)
174179
})
175180
await send
176181
assert(!input.validity.valid)
@@ -185,6 +190,7 @@ describe('auto-check element', function () {
185190
resolve()
186191
})
187192
triggerInput(input, 'hub')
193+
triggerBlur(input)
188194
})
189195
await error
190196
assert(!input.validity.valid)
@@ -197,6 +203,7 @@ describe('auto-check element', function () {
197203
input.value = 'hub'
198204
assert.isTrue(input.checkValidity())
199205
input.dispatchEvent(new InputEvent('input'))
206+
triggerBlur(input)
200207
await once(input, 'auto-check-complete')
201208
assert.isTrue(input.checkValidity())
202209
})
@@ -268,6 +275,7 @@ describe('auto-check element', function () {
268275

269276
it('validates input with successful server response with GET', async function () {
270277
triggerInput(input, 'hub')
278+
triggerBlur(input)
271279
await once(input, 'auto-check-complete')
272280
assert.isTrue(input.checkValidity())
273281
})
@@ -306,6 +314,7 @@ describe('auto-check element', function () {
306314

307315
const completed = Promise.all([once(checker, 'loadstart'), once(checker, 'load'), once(checker, 'loadend')])
308316
triggerInput(input, 'hub')
317+
triggerBlur(input)
309318
await completed
310319

311320
assert.deepEqual(['loadstart', 'load', 'loadend'], events)
@@ -322,6 +331,7 @@ describe('auto-check element', function () {
322331

323332
const completed = Promise.all([once(checker, 'loadstart'), once(checker, 'load'), once(checker, 'loadend')])
324333
triggerInput(input, 'hub')
334+
triggerBlur(input)
325335
await completed
326336

327337
assert.deepEqual(['loadstart', 'load', 'loadend'], events)
@@ -350,36 +360,30 @@ describe('auto-check element', function () {
350360
input = null
351361
})
352362

353-
it('emits auto-check-send on input', function (done) {
363+
it('emits auto-check-send on blur', function (done) {
354364
input.addEventListener('auto-check-send', () => done())
355365
input.value = 'hub'
356366
input.dispatchEvent(new InputEvent('input'))
357-
})
358-
359-
it('emits auto-check-send on change', function (done) {
360-
input.addEventListener('auto-check-send', () => done())
361-
triggerInput(input, 'hub')
367+
triggerBlur(input)
362368
})
363369

364370
it('emits auto-check-start on input', function (done) {
365371
input.addEventListener('auto-check-start', () => done())
366372
input.value = 'hub'
367373
input.dispatchEvent(new InputEvent('input'))
374+
triggerBlur(input)
368375
})
369376

370-
it('emits auto-check-start on change', function (done) {
371-
input.addEventListener('auto-check-start', () => done())
372-
triggerInput(input, 'hub')
373-
})
374-
375-
it('emits auto-check-send 300 milliseconds after keypress', function (done) {
377+
it('emits auto-check-send 300 milliseconds after blur', function (done) {
376378
input.addEventListener('auto-check-send', () => done())
377379
input.value = 'hub'
378380
input.dispatchEvent(new InputEvent('input'))
381+
triggerBlur(input)
379382
})
380383

381384
it('emits auto-check-success when server responds with 200 OK', async function () {
382385
triggerInput(input, 'hub')
386+
triggerBlur(input)
383387
const event = await once(input, 'auto-check-success')
384388
const result = await event.detail.response.text()
385389
assert.equal('This is a warning', result)
@@ -388,6 +392,7 @@ describe('auto-check element', function () {
388392
it('emits auto-check-error event when server returns an error response', async function () {
389393
checker.src = '/fail'
390394
triggerInput(input, 'hub')
395+
triggerBlur(input)
391396
const event = await once(input, 'auto-check-error')
392397
const result = await event.detail.response.text()
393398
assert.equal('This is an error', result)
@@ -396,6 +401,7 @@ describe('auto-check element', function () {
396401
it('emits auto-check-complete event at the end of the lifecycle', function (done) {
397402
input.addEventListener('auto-check-complete', () => done())
398403
triggerInput(input, 'hub')
404+
triggerBlur(input)
399405
})
400406

401407
it('emits auto-check-send event before checking if there is a duplicate request', function (done) {
@@ -410,6 +416,7 @@ describe('auto-check element', function () {
410416

411417
input.value = 'hub'
412418
input.dispatchEvent(new InputEvent('input'))
419+
triggerBlur(input)
413420
})
414421

415422
it('do not emit if essential attributes are missing', async function () {

0 commit comments

Comments
 (0)