Repository navigation
Workout: plate loading per set row — the plates for each row's weight, from the plates you own (No bar for Smith machines, #138) - #194
Conversation
… the plates you own
Under each set of a plate-loaded exercise, a line with the plates that make THAT
row's weight: per side beyond the bar ("45 · 5 per side"), one stack for a belt,
a landmine, a plate-loaded machine, a sled or a body-weight exercise with added
weight ("Load 25"), "Bar only" at or below the bar, "2.5 lb short" when the
inventory cannot make it. Shown where the stack changes from the loaded row
before it — warm-up ramps and drop-sets included — so a run of equal weights
shows its plates once; what to strip and what to add rides along, except in
the compact view. Replaces the one-line "Bar 45 lb · 50 lb per side" chip,
which only ever showed one set and never said which plates.
lib/plates.js: the inventory (S.plates, pairs per size, per unit like the bar
weight — absent = the standard set, six pairs each), the stack (heaviest-first
greedy when that lands exactly; else the fewest plates that hit the weight, so
a home gym with one pair of each size gets 45 · 35 · 15 · 5 for 100 per side
and is never told to use two 45s), the strip/add delta, the loading kind per
exercise (S.loadKind override; bars → pairs, body weight / weighted / sled →
single, the rest → none) and the base weight. An explicit S.barWeights[id] = 0
is now "No bar" (issue DuarteSantos8#138: a counterbalanced Smith machine) — deleting the
key stays the way back to the default.
Settings → Equipment → Plates counts the pairs you own. The ⋯ menu's "Plate
loading" sheet (also in the exercise detail and routine config sheets) picks
per side / single stack / off, the bar or base weight, and No bar. The editor
derives its default from the same session config the rows use.
fmtPlate keeps the quarter (1.25, 21.25) that fmtNum rounds away. Tests: lib,
the rendered rows (ramp, bar only, short, no bar, single stack, dumbbell, drop
set, compact) and both sheets. 20 locale keys in 14 packs, 2 dead ones out;
pt-BR guard re-pinned (655 / 654).
(cherry picked from commit f725668)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…r, not 20.5 kg
convertStateUnit converted S.barWeights like any other weight, so a kg profile
that had been lb ended up with a 20.5 kg bar (45 lb / 2.2046, rounded to the
quarter) and, with a kg plate set, every plate line read "1 kg short". A bar is
a stamped object, not a number: an override equal to the old unit's default for
its bar type drops out and the new unit's default takes over (45 lb → 20 kg,
25 lb EZ → 10 kg, and back). An explicit 0 ("no bar") stays 0. A custom bar
still converts (a 33 lb women's bar → 15 kg) and drops out too when it lands
on the new default. Junk in the map is dropped. The "keep the numbers, change
the label" path is untouched — that is the user asking for exactly that.
(cherry picked from commit 2d9dff9)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ates, bands never load Three holes found by training on the first cut: 1. A per-side (unilateral) barbell exercise — a barbell lunge — showed nothing under its work sets: the rows are side sets, which the first cut skipped outright. A bar is the same bar for both legs, so the line now uses the sides' weight while they agree (or only one side has a number yet) and stays away once they differ. 2. "45 · 5 per side" did not read as a sum. Plates are joined with "+" now. 3. A band's "weight" is its tension, not plates — bands never get a line, even though the app counts them as body-weight equipment. Rendered tests: the lunge (agreeing sides, differing sides), a band with a weight logged, plus the existing suite with the new separator. (cherry picked from commit ac49dc0, frontend half — the fork's coach sidecar changes stay there) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
8782b30 to
5da80be
Compare
…vice survive a sync with the other, and so does going back to the standard set or the equipment's own loading S.plates and S.loadKind were a plain key union, newer copy first. A phone that had since logged a set was the newer copy, so its older plate list or load kind undid the one just set on the desktop, and "Back to the standard set" or picking what the equipment implies (both a deleted key) came back from the other device. They now merge like the Structural Balance overrides (mergeStampedMap): each entry carries the time it was set, and the way back is written as a stamped entry, a plate list with no sizes or a load kind of null, so it wins like any other change. A unit's plate list stays one list, kept whole as last counted. Bare kinds and unstamped lists from the first builds still read as before. lib/plates.js owns the stored shape (ownsPlates, withPlatePairs, withStandardPlates, loadKindOf, withLoadKind); the editor, the inventory sheet and the Settings row use it.
…ls the workout screen while the plate line works out what cannot be loaded When the plates you own cannot make a row's weight, plateStack searched for the closest load below it with a table as long as the weight in quarter units. Beyond everything in the inventory the answer is simply every plate and the rest missing, which the greedy pass already has, but the search ran anyway: about half a second per row per render for 999999, and gigabytes for a longer typo, on every keystroke. It now stops there.
…h unit's plate list, so the rows load from the new unit's plates and switching back finds the old list as it was Pins what convertStateUnit does with the plate inventory: it carries S.plates over untouched rather than converting it, since a 45 lb plate does not become a 20.4 kg one. After the switch the rows read the new unit's own list, or the standard set until one is counted; a list counted there is kept beside the old one. A sled's or machine's base weight in S.barWeights is a weight and converts, and the load kinds hold none.
… rows' plate line, the Plate loading sheet and the plate list in Settings — and drop the two bar-weight strings the app no longer has The pull request predates both packs. Its "No bar" also went into thirteen packs a second time, next to the one v1.3.8 added; the copy it added is gone, so the word on screen stays the one it was (in Hindi and Chinese the two differed).
…der a set start at the right edge, under the set's number, with the plates to strip and add at the far left, and on a 320 px screen the plate line lines up with the drops
… a plate-loaded machine set to per side with its own weight reads Per side, not Bar 50 lb
|
Thanks @kurktchiev, plate loading per row is in, together with the 45 lb -> 20.5 kg bar fix you found along the way. One change you should know about because your fork writes the old shape: Follow-ups on top: a typo like 99999 no longer stalls the screen while the plate line works out what can't be loaded, converting kg <-> lb keeps each unit's own plate list, the ⋯ menu only names a bar for bar exercises, and the plate line mirrors in Arabic. Released in v1.3.9: https://github.com/DuarteSantos8/openGym/releases/tag/v1.3.9 |
What
A plate line under each set row of a plate-loaded exercise: the plates that make that row's weight, from the plates the user owns.
45 + 5 per side. The empty bar readsBar only.Load 25.… · 2.5 lb short.−10 +25); the compact workout view keeps the stack and drops the moves.It replaces the one-line "Bar 45 lb · 50 lb per side" chip, which only ever described one set and never said which plates.
Settings and per-exercise choices
barWeights, which is what Being able to set Smith bar to 0 kg/lb. #138 asked for (a counterbalanced Smith machine). Deleting the key stays the way back to the default, so no existing profile changes meaning.Unit switch
convertStateUnitused to convert bar weights like any other number, so a 45 lb bar became a 20.5 kg one and, with a kg plate set, every row read "1 kg short". A bar is a stamped object: an override equal to the old unit's default drops out so the new default applies (45 lb → the 20 kg bar, 25 lb EZ → 10 kg, and back); an explicit 0 stays 0; a custom bar still converts (33 lb → 15 kg). "Keep the numbers, change the label" is untouched.State
S.plates({ lb: { 45: 1, 35: 1, … }, kg: { … } }, per unit like the bar weight — no conversion on a unit switch) andS.loadKind({ exId: 'pairs' | 'single' | 'none' }), both key-union merged insync-merge.jslikebarWeightsandexNotes. Logged weights stay totals; everything here is display.Tests
lib/plates.test.js(inventory, stack search incl. the non-greedy case, delta, kind, base weight, row load), rendered rows inviews/Workout.plates.test.jsx(ramp, bar only, short, no bar, single stack, dumbbell, drop-set, per-side lunge, band, compact), both sheets insheets.plates.test.jsx,units.test.jsfor the bar rule. 20 new strings in all 14 packs, 2 dead ones removed,check-localesin sync, pt-BR guard re-pinned (655 overrides / 666 inherited).fmtPlatekeeps the quarter (1.25, 21.25) thatfmtNumrounds away.Three commits, each standalone: the feature, the unit-switch rule, and a second round after training on it (per-side rows,
+between plates, bands).Closes #138.
🤖 Generated with Claude Code