@@ -116,7 +116,7 @@ <h1 id="titel">Training</h1>
116116
117117< script >
118118const LS = localStorage ;
119- const state = { schema :null , oef :null , voeding :null , trends :null , log :{ entries :[ ] } , dagIdx :0 , view :'training' } ;
119+ const state = { schema :null , oef :null , voeding :null , trends :null , params : null , log :{ entries :[ ] } , dagIdx :0 , view :'training' } ;
120120
121121/* ---------- config ---------- */
122122function cfg ( ) { try { return JSON . parse ( LS . getItem ( 'cfg' ) ) || null } catch ( e ) { return null } }
@@ -168,6 +168,8 @@ <h1 id="titel">Training</h1>
168168 catch ( e ) { state . voeding = JSON . parse ( LS . getItem ( 'cache.voeding' ) || 'null' ) ; }
169169 try { state . trends = await getJson ( 'trends.json' ) ; LS . setItem ( 'cache.trends' , JSON . stringify ( state . trends ) ) ; }
170170 catch ( e ) { state . trends = JSON . parse ( LS . getItem ( 'cache.trends' ) || 'null' ) ; }
171+ try { state . params = await getJson ( 'parameters.json' ) ; LS . setItem ( 'cache.params' , JSON . stringify ( state . params ) ) ; }
172+ catch ( e ) { state . params = JSON . parse ( LS . getItem ( 'cache.params' ) || 'null' ) ; }
171173 try { state . log = await getJson ( 'logs/' + schema . id + '.json' ) }
172174 catch ( e ) { state . log = { schema :schema . id , entries :[ ] } }
173175 LS . setItem ( 'cache.log' , JSON . stringify ( state . log ) ) ;
@@ -179,6 +181,7 @@ <h1 id="titel">Training</h1>
179181 if ( s ) { state . schema = JSON . parse ( s ) ; state . oef = JSON . parse ( LS . getItem ( 'cache.oef' ) || '{}' ) ;
180182 state . voeding = JSON . parse ( LS . getItem ( 'cache.voeding' ) || 'null' ) ;
181183 state . trends = JSON . parse ( LS . getItem ( 'cache.trends' ) || 'null' ) ;
184+ state . params = JSON . parse ( LS . getItem ( 'cache.params' ) || 'null' ) ;
182185 state . log = JSON . parse ( LS . getItem ( 'cache.log' ) || '{"entries":[]}' ) ;
183186 render ( ) ; toast ( 'Offline — cache gebruikt' ) ; }
184187 else if ( String ( e ) . includes ( '401' ) || String ( e ) . includes ( '404' ) ) {
@@ -393,19 +396,24 @@ <h1 id="titel">Training</h1>
393396function dl ( d ) { return d . slice ( 8 ) + '/' + d . slice ( 5 , 7 ) ; }
394397function renderTrends ( ) {
395398 const tr = state . trends || { } ; const ann = annulled ( ) ;
396- // lichaamsgewicht
397- const histKg = ( tr . gewicht && tr . gewicht . punten ) || [ ] ;
398- const kseen = new Set ( histKg . map ( p => p . d ) ) ;
399- const liveKg = state . log . entries . filter ( x => x . type === 'lichaamsgewicht' && ! ann . has ( x . ts ) && ! kseen . has ( x . datum ) ) . map ( x => ( { d :x . datum , kg :x . kg } ) ) ;
400- const kg = histKg . concat ( liveKg ) . sort ( ( a , b ) => a . d < b . d ?- 1 :1 ) ;
401- const doelKg = ( tr . gewicht && tr . gewicht . doel ) || 90 ;
402- let h = `<div class="card"><p class="focus">Lichaamsgewicht</p>
403- <div class="meta">${ kg . length ? 'laatste: ' + kg [ kg . length - 1 ] . kg + ' kg' :'nog geen meting' } · doel ${ doelKg } kg</div>
404- ${ spark ( kg . map ( p => ( { y :p . kg , l :dl ( p . d ) } ) ) , { doel :doelKg } ) }
405- <div class="sec">Nieuw weegmoment</div>
406- <div class="logrow"><input id="kgIn" type="number" inputmode="decimal" step="0.1" placeholder="kg">
407- <button class="ghost" onclick="logKg()">Opslaan</button></div>
408- <div class="hist">Weeg 1×/week, zaterdagochtend, zelfde moment — kijk naar de trend, niet de dagschommeling.</div></div>` ;
399+ // parameters (gewicht, VO2max, ...)
400+ const plist = ( ( state . params && state . params . parameters ) || [ { id :'gewicht' , naam :'Gewicht' , eenheid :'kg' , doel :90 , beter :'lager' } ] ) ;
401+ let h = '' ;
402+ plist . forEach ( pa => {
403+ const hist = ( ( ( tr . parameters || { } ) [ pa . id ] ) || { } ) . punten || [ ] ;
404+ let extra = [ ] ;
405+ if ( pa . id === 'gewicht' ) extra = ( ( tr . gewicht && tr . gewicht . punten ) || [ ] ) . map ( p => ( { d :p . d , v :p . kg } ) ) ;
406+ const seen = new Set ( hist . concat ( extra ) . map ( p => p . d ) ) ;
407+ const live = state . log . entries . filter ( x => ! ann . has ( x . ts ) && ! seen . has ( x . datum ) && ( ( x . type === 'parameter' && x . param === pa . id ) || ( pa . id === 'gewicht' && x . type === 'lichaamsgewicht' ) ) )
408+ . map ( x => ( { d :x . datum , v :x . waarde != null ?x . waarde :x . kg } ) ) ;
409+ const reeks = hist . concat ( extra , live ) . sort ( ( a , b ) => a . d < b . d ?- 1 :1 ) ;
410+ h += `<div class="card"><p class="focus">${ pa . naam } </p>
411+ <div class="meta">${ reeks . length ? 'laatste: ' + reeks [ reeks . length - 1 ] . v + ' ' + pa . eenheid :'nog geen meting' } ${ pa . doel != null ? ' · doel ' + pa . doel + ' ' + pa . eenheid :'' } </div>
412+ ${ spark ( reeks . map ( p => ( { y :p . v , l :dl ( p . d ) } ) ) , { doel :pa . doel } ) }
413+ <div class="logrow"><input id="pIn-${ pa . id } " type="number" inputmode="decimal" step="0.1" placeholder="${ pa . eenheid } ">
414+ <button class="ghost" onclick="logParam('${ pa . id } ')">Opslaan</button></div>
415+ ${ pa . tip ? '<div class="hist">' + pa . tip + '</div>' :'' } </div>` ;
416+ } ) ;
409417 // eiwit per dag
410418 const histE = ( tr . eiwit && tr . eiwit . punten ) || [ ] ;
411419 const eseen = new Set ( histE . map ( p => p . d ) ) ;
@@ -442,10 +450,10 @@ <h1 id="titel">Training</h1>
442450 h += '</div>' ;
443451 main . innerHTML = h ;
444452}
445- function logKg ( ) {
446- const v = parseFloat ( document . getElementById ( 'kgIn' ) . value ) ;
447- if ( ! v || v < 50 || v > 150 ) { toast ( 'Geef een realistisch gewicht in kg ' ) ; return }
448- addEntry ( { type :'lichaamsgewicht ' , datum :localDate ( ) , kg :v } ) ;
453+ function logParam ( id ) {
454+ const v = parseFloat ( document . getElementById ( 'pIn-' + id ) . value ) ;
455+ if ( isNaN ( v ) ) { toast ( 'Geef een waarde in ' ) ; return }
456+ addEntry ( { type :'parameter ' , param : id , datum :localDate ( ) , waarde :v } ) ;
449457 render ( ) ;
450458}
451459
0 commit comments