@@ -295,6 +295,126 @@ describe('basicField', () => {
295295 expect ( store . updater . updated ) . toEqual ( true )
296296 } )
297297
298+ it ( 'defers date change while focused' , ( ) => {
299+ const container = document . createElement ( 'div' )
300+ document . body . appendChild ( container )
301+ const already = { }
302+ const subject = namedNode ( 'http://example.com/#this' )
303+ const form = namedNode ( 'http://example.com/#form' )
304+ const formType = ns . ui ( 'DateField' )
305+ const property = namedNode ( 'http://example.com/#some-property' )
306+ const doc = namedNode ( 'http://example.com/' )
307+ const callbackFunction = jest . fn ( ) // TODO: https://github.com/solidos/solid-ui/issues/263
308+ store . add ( form , ns . ui ( 'property' ) , property , doc )
309+ store . add ( form , ns . rdf ( 'type' ) , formType , doc )
310+ store . add ( subject , property , '2026-03-15' , doc )
311+
312+ const originalUpdate = store . updater . update
313+ const updateSpy = jest . fn ( ( _deletes , _inserts , onDone ) => {
314+ onDone ( 'uri' , true , 'body' )
315+ return Promise . resolve ( )
316+ } )
317+ store . updater . update = updateSpy as any
318+
319+ try {
320+ const result = basicField (
321+ document ,
322+ container ,
323+ already ,
324+ subject ,
325+ form ,
326+ doc ,
327+ callbackFunction
328+ )
329+ const inputElement = result . childNodes [ 1 ] . childNodes [ 0 ] as HTMLInputElement
330+ inputElement . focus ( )
331+ inputElement . value = '2026-03-16'
332+ inputElement . dispatchEvent ( new Event ( 'change' ) )
333+ expect ( updateSpy ) . not . toHaveBeenCalled ( )
334+ } finally {
335+ store . updater . update = originalUpdate
336+ container . remove ( )
337+ }
338+ } )
339+
340+ it ( 'does not disable DateField during save' , ( ) => {
341+ const container = document . createElement ( 'div' )
342+ const already = { }
343+ const subject = namedNode ( 'http://example.com/#this' )
344+ const form = namedNode ( 'http://example.com/#form' )
345+ const formType = ns . ui ( 'DateField' )
346+ const property = namedNode ( 'http://example.com/#some-property' )
347+ const doc = namedNode ( 'http://example.com/' )
348+ const callbackFunction = jest . fn ( ) // TODO: https://github.com/solidos/solid-ui/issues/263
349+ store . add ( form , ns . ui ( 'property' ) , property , doc )
350+ store . add ( form , ns . rdf ( 'type' ) , formType , doc )
351+ store . add ( subject , property , '2026-03-15' , doc )
352+
353+ const result = basicField (
354+ document ,
355+ container ,
356+ already ,
357+ subject ,
358+ form ,
359+ doc ,
360+ callbackFunction
361+ )
362+ const inputElement = result . childNodes [ 1 ] . childNodes [ 0 ] as HTMLInputElement
363+
364+ const originalUpdate = store . updater . update
365+ store . updater . update = ( ( _deletes , _inserts , onDone ) => {
366+ expect ( inputElement . disabled ) . toEqual ( false )
367+ onDone ( 'uri' , true , 'body' )
368+ return Promise . resolve ( )
369+ } ) as any
370+
371+ try {
372+ inputElement . value = '2026-03-16'
373+ inputElement . dispatchEvent ( new Event ( 'change' ) )
374+ expect ( inputElement . disabled ) . toEqual ( false )
375+ } finally {
376+ store . updater . update = originalUpdate
377+ }
378+ } )
379+
380+ it ( 'disables non-date input during save and reenables on success' , ( ) => {
381+ const container = document . createElement ( 'div' )
382+ const already = { }
383+ const subject = namedNode ( 'http://example.com/#this' )
384+ const form = namedNode ( 'http://example.com/#form' )
385+ const property = namedNode ( 'http://example.com/#some-property' )
386+ const doc = namedNode ( 'http://example.com/' )
387+ const callbackFunction = jest . fn ( ) // TODO: https://github.com/solidos/solid-ui/issues/263
388+ store . add ( form , ns . ui ( 'property' ) , property , doc )
389+ store . add ( subject , property , namedNode ( 'http://example.com/#initial-value' ) , doc )
390+
391+ const result = basicField (
392+ document ,
393+ container ,
394+ already ,
395+ subject ,
396+ form ,
397+ doc ,
398+ callbackFunction
399+ )
400+ const inputElement = result . childNodes [ 1 ] . childNodes [ 0 ] as HTMLInputElement
401+
402+ const originalUpdate = store . updater . update
403+ store . updater . update = ( ( _deletes , _inserts , onDone ) => {
404+ expect ( inputElement . disabled ) . toEqual ( true )
405+ onDone ( 'uri' , true , 'body' )
406+ return Promise . resolve ( )
407+ } ) as any
408+
409+ try {
410+ inputElement . value = 'changed value'
411+ inputElement . dispatchEvent ( new Event ( 'change' ) )
412+ expect ( inputElement . disabled ) . toEqual ( false )
413+ } finally {
414+ store . updater . update = originalUpdate
415+ }
416+ } )
417+
298418 it ( 'calls updater on change for a NamedNodeUriField' , ( ) => {
299419 const container = document . createElement ( 'div' )
300420 const already = { }
0 commit comments