@@ -386,6 +386,7 @@ <h2 id="workout-title" style="margin: 0;"></h2>
386386 }
387387
388388 function repOptions ( block ) {
389+ if ( block . amrap ) return [ ] ;
389390 const options = [ ] ;
390391 const min = Number ( block . repRange ?. min ) || 1 ;
391392 const max = Number ( block . repRange ?. max ) || min ;
@@ -413,6 +414,39 @@ <h2 id="workout-title" style="margin: 0;"></h2>
413414 return chip ;
414415 }
415416
417+ function createAmrapInput ( blockId , setIndex , initialValue ) {
418+ const input = document . createElement ( 'input' ) ;
419+ input . type = 'number' ;
420+ input . inputMode = 'numeric' ;
421+ input . min = '1' ;
422+ input . step = '1' ;
423+ input . placeholder = 'Reps (AMRAP)' ;
424+ input . dataset . blockId = blockId ;
425+ input . dataset . setIndex = setIndex ;
426+ input . dataset . field = 'reps' ;
427+
428+ if ( Number . isInteger ( initialValue ) ) {
429+ input . value = initialValue ;
430+ }
431+
432+ input . addEventListener ( 'input' , ( ) => {
433+ if ( input . value === '' ) {
434+ input . setCustomValidity ( '' ) ;
435+ return ;
436+ }
437+
438+ const parsed = Number . parseInt ( input . value , 10 ) ;
439+ if ( Number . isNaN ( parsed ) ) {
440+ input . setCustomValidity ( 'Enter a whole number' ) ;
441+ } else {
442+ input . value = parsed ;
443+ input . setCustomValidity ( '' ) ;
444+ }
445+ } ) ;
446+
447+ return input ;
448+ }
449+
416450 function createSetRow ( blockId , setIndex , block , draft ) {
417451 const row = document . createElement ( 'div' ) ;
418452 row . className = 'set-row' ;
@@ -426,21 +460,6 @@ <h2 id="workout-title" style="margin: 0;"></h2>
426460 weightInput . dataset . setIndex = setIndex ;
427461 weightInput . dataset . field = 'weight' ;
428462
429- const repsSelect = document . createElement ( 'select' ) ;
430- repsSelect . dataset . blockId = blockId ;
431- repsSelect . dataset . setIndex = setIndex ;
432- repsSelect . dataset . field = 'reps' ;
433- const placeholder = document . createElement ( 'option' ) ;
434- placeholder . value = '' ;
435- placeholder . textContent = 'Reps' ;
436- repsSelect . appendChild ( placeholder ) ;
437- repOptions ( block ) . forEach ( ( rep ) => {
438- const option = document . createElement ( 'option' ) ;
439- option . value = rep ;
440- option . textContent = rep ;
441- repsSelect . appendChild ( option ) ;
442- } ) ;
443-
444463 const rirSelect = document . createElement ( 'select' ) ;
445464 rirSelect . dataset . blockId = blockId ;
446465 rirSelect . dataset . setIndex = setIndex ;
@@ -461,18 +480,48 @@ <h2 id="workout-title" style="margin: 0;"></h2>
461480 const draftExercise = draft ?. exercises ?. find ( ( ex ) => ex . blockId === blockId ) ;
462481 const draftSet = draftExercise ?. sets ?. [ setIndex ] ;
463482
483+ let repsField = null ;
484+ if ( block . amrap ) {
485+ const initial = draftSet ?. reps ?? prevSet ?. reps ;
486+ repsField = createAmrapInput ( blockId , setIndex , initial ) ;
487+ } else {
488+ const repsSelect = document . createElement ( 'select' ) ;
489+ repsSelect . dataset . blockId = blockId ;
490+ repsSelect . dataset . setIndex = setIndex ;
491+ repsSelect . dataset . field = 'reps' ;
492+ const placeholder = document . createElement ( 'option' ) ;
493+ placeholder . value = '' ;
494+ placeholder . textContent = 'Reps' ;
495+ repsSelect . appendChild ( placeholder ) ;
496+ repOptions ( block ) . forEach ( ( rep ) => {
497+ const option = document . createElement ( 'option' ) ;
498+ option . value = rep ;
499+ option . textContent = rep ;
500+ repsSelect . appendChild ( option ) ;
501+ } ) ;
502+ repsField = repsSelect ;
503+ }
504+
464505 if ( draftSet ) {
465506 weightInput . value = draftSet . weight ?? '' ;
466- repsSelect . value = draftSet . reps ?? '' ;
507+ if ( ! block . amrap ) {
508+ repsField . value = draftSet . reps ?? '' ;
509+ } else if ( Number . isInteger ( draftSet . reps ) ) {
510+ repsField . value = draftSet . reps ;
511+ }
467512 rirSelect . value = draftSet . rir ?? '' ;
468513 } else if ( prevSet ) {
469514 weightInput . value = prevSet . weight ?? '' ;
470- repsSelect . value = prevSet . reps ?? '' ;
515+ if ( ! block . amrap ) {
516+ repsField . value = prevSet . reps ?? '' ;
517+ } else if ( Number . isInteger ( prevSet . reps ) ) {
518+ repsField . value = prevSet . reps ;
519+ }
471520 rirSelect . value = prevSet . rir ?? '' ;
472521 }
473522
474523 row . appendChild ( weightInput ) ;
475- row . appendChild ( repsSelect ) ;
524+ row . appendChild ( repsField ) ;
476525 row . appendChild ( rirSelect ) ;
477526 return row ;
478527 }
@@ -483,7 +532,8 @@ <h2 id="workout-title" style="margin: 0;"></h2>
483532 details . open = true ;
484533
485534 const summary = document . createElement ( 'summary' ) ;
486- summary . innerHTML = `<span>${ block . name } </span><span class="exercise-meta">${ block . sets } sets · ${ block . repRange . min } -${ block . repRange . max } reps</span>` ;
535+ const repLabel = block . amrap ? 'AMRAP' : `${ block . repRange ?. min ?? '—' } -${ block . repRange ?. max ?? '—' } reps` ;
536+ summary . innerHTML = `<span>${ block . name } </span><span class="exercise-meta">${ block . sets } sets · ${ repLabel } </span>` ;
487537
488538 const body = document . createElement ( 'div' ) ;
489539 body . className = 'exercise-body' ;
@@ -560,11 +610,11 @@ <h2 id="workout-title" style="margin: 0;"></h2>
560610 const sets = [ ] ;
561611 for ( let i = 0 ; i < block . sets ; i += 1 ) {
562612 const weight = document . querySelector ( `input[data-block-id="${ block . id } "][data-set-index="${ i } "][data-field="weight"]` ) ;
563- const reps = document . querySelector ( `select [data-block-id="${ block . id } "][data-set-index="${ i } "][data-field="reps"]` ) ;
613+ const reps = document . querySelector ( `[data-block-id="${ block . id } "][data-set-index="${ i } "][data-field="reps"]` ) ;
564614 const rir = document . querySelector ( `select[data-block-id="${ block . id } "][data-set-index="${ i } "][data-field="rir"]` ) ;
565615 sets . push ( {
566616 weight : weight ?. value ? Number ( weight . value ) : null ,
567- reps : reps ?. value ? Number ( reps . value ) : null ,
617+ reps : reps ?. value ? Number . parseInt ( reps . value , 10 ) : null ,
568618 rir : rir ?. value ? Number ( rir . value ) : null ,
569619 } ) ;
570620 }
0 commit comments