Commit graph

15 commits

Author SHA1 Message Date
62cdd7740f Fix back navigation after modal fullscreen, fix SQL operator precedence
Navigation:
- Stale {modal:true}/{chartFull:true} history entries after app restart
  caused back gesture to do nothing (no screen to render, no modal open).
  Now global popstate handler skips these stale entries with history.back().

Rust seed import:
- Fixed SQL operator precedence in nutrients_guessed UPDATE:
  WHERE (guessed IS NULL OR guessed = 0) AND name_lower IN (...)
  was previously parsed as: guessed IS NULL OR (guessed = 0 AND ...)
  which matched ALL products with NULL guessed regardless of name.
2026-05-23 18:39:28 +03:00
18738dc0aa Clean up nutrients_guessed: removed 222 false positives
Removed guessed flag + micronutrients from:
- Pet food, cosmetics, cleaning products (25)
- Chips, crackers, snacks (44)
- Chocolate, candy, cakes, waffles, bars (42)
- Cookies/biscuits (23, kept liver "печень")
- Pelmeni, sausages, kolbasa, kotlety (43)
- Baby food purees, ready meals, baked goods (45)

Kept: dairy (yogurt, kefir, tvorog, milk, smetana, slivki),
eggs, grains, vegetables, fruits, raw meats, fish, oils.
1398 legitimately guessed products remain. Seed version 5.
2026-05-23 18:10:00 +03:00
e4f3d3e3ca Alternative units, analytics charts, elevation smoothing, batch GPS update
Alternative food units (Phase 3a):
- serving_units table: шт, ст.л., ч.л., стакан, мл
- product_units junction: eggs linked to шт (60g)
- Unit selector chips in food modal after product selection
- Display "2 шт" instead of "120г" in food log when unit is set
- amount_g stays canonical, unit info is display metadata

Analytics (Phase 4):
- Stats section on Today screen with period selector (30d/90d)
- Weight trend chart (line, purple)
- Macros donut (protein/fat/carbs with kcal center text)
- Kcal balance bar chart (intake green vs expenditure red, includes BMR)
- Chart fullscreen + zoom support (reuses GPS chart patterns)

GPS improvements:
- Elevation smoothing: 5-point moving average + 1m dead zone
- Fixes inflated elevation gain (440m → ~70m for a real 70m route)
- Batch polyline update: poll loop suppresses per-point addLatLng,
  calls onBatchUpdate to rebuild polyline from sorted points at once
- Eliminates visual jumps when app returns from background

Boot screen: removed verbose migration/GPS status labels,
shows "Загрузка..." only, updates text only during actual seed import
2026-05-23 17:12:19 +03:00
c5bf6da79e Android: always refresh seed DB from assets when size differs
Old logic: copy only if file doesn't exist. App updates with
newer seed DB were ignored because the old file was already there.
Now compares file size with asset size and overwrites on mismatch.
2026-05-21 01:10:15 +03:00
049f4d6546 Unified product search dropdown, UI fixes
- Reusable createProductSearch() component used in food and ingredient modals
- Search dropdown: position:absolute, z-index:100, shadow, scrollable
- Products tab: list scrolls independently (max-height: calc(100vh - 209px - safe areas))
- prod-card flex-shrink:0 prevents collapse in scroll container
- Products tab reverted to normal list (not dropdown) with expanded cards
- Search limit raised to 200, sorted by starts-with-query first
- Ingredient modal: uses createProductSearch instead of manual wiring
- Food modal: uses createProductSearch instead of manual wiring
2026-05-21 00:48:27 +03:00
3e5333cec6 Recipes, nutrients_guessed, seed import fixes, search improvements
Recipes:
- Cooking methods table + 6 presets (boiling, frying, steaming etc.)
- Recipe editor with live KBJU calculation including cooking loss
- Recipe detail view, log-to-diary, ingredient search
- Split food log into "Products" and "Dishes" sections
- Products screen sub-tabs: Продукты / Рецепты

Nutrient enrichment:
- 1620 store products enriched with ION micronutrients (guessed flag)
- Purple tint on guessed food entries, * on daily kcal total
- Seed DB v4 with nutrients_guessed column

Seed import fixes:
- Rust: always refresh seed DB from bundled assets on launch
- Rust: check app_config_dir for main DB (plugin-sql stores there on desktop)
- Rust: ATTACH-based UPDATE to sync nutrients_guessed for existing products
- Rust: read all 27 columns including micronutrients
- Rust: emit seed_progress events + indeterminate progress bar animation
- JS: boot screen with status labels during migrations/import
- JS: nutrients_guessed column created in JS migration as safety net

Search:
- Results sorted by starts-with-query first, then by name length
- Default limit raised to 200
- Modal search results scroll without max-height cap

Bug fixes:
- product_id=0 for custom recipe ingredients (NOT NULL constraint)
- getRecipe JOIN for cooking_method_name
- calcTotals applies cooking loss from selected method
- Ingredient modal targets last overlay (not parent)
- select elements dark theme (color-scheme: dark)
- renderToday wrapped in try/catch
2026-05-21 00:06:50 +03:00
0032c309b7 Seed DB: +5ka (3103) +ION (1078) with micronutrients, GPS fixes, UI improvements
Products:
- 5ka scraper: recursive category BFS, 3103 products imported
- ION scraper (web.ion.ru): fetch-based, 1111 products with full vitamins/minerals
- Seed DB now 13480 products (magnit 8627, 5ka 3103, ion 1078, kdv 672)
- 13 micronutrient columns added: Na, K, Ca, Mg, P, Fe, vit A/B1/B2/B3/C/E, carotene

GPS fixes:
- computeStats sorts points by seq/ts before calculating (fixes wrong elevation/kcal)
- Trail restore on recording screen sorts points
- Old tracks with NULL seq repaired via migration (db.js)
- Activity type saved to localStorage, restored on GPS screen

UI:
- Track points invisible but tappable (popup with time/alt/speed)
- Charts: pointer-events:none on canvas when minimized (page scrolls)
- Navigation history stack (20 entries), back gesture doesn't close app
- Session list sort: added id DESC tiebreaker
2026-05-19 23:53:49 +03:00
1ad4cd5d1f Chart pinch zoom: only in fullscreen, blocked in normal view via onZoomStart callback 2026-05-16 22:10:02 +03:00
b26264538b GPS point ordering + GPX export + chart zoom fixes
GPS background recording:
- Batched writes (10s flush) in native service
- Polling lock prevents parallel processing
- Track by timestamp instead of line count
- Recovery idempotent via max DB timestamp
- Seq numbers on live recorded points

GPX export:
- Button in session detail
- SAF file picker on Android (ACTION_CREATE_DOCUMENT)
- GPS config in metadata (accuracy, minSpeed, minDist)

Charts:
- Pinch zoom enabled at creation (Hammer.js registers handlers)
- touch-action: pan-y blocks pinch in normal view (page scrolls)
- Fullscreen: CSS-only expand (no canvas manipulation)
- Downsampled to 500 points for smooth rendering
- Back gesture collapses fullscreen before closing modal

Build: --real flag finds first non-emulator device
2026-05-16 21:21:13 +03:00
daf71333ff GPX export + GPS background recording fixes
GPX export: button in session detail, standard GPX 1.1 format.

Background GPS fixes:
- Native service: batched writes (10s flush) instead of per-point
  appendText — eliminates race condition with reader
- JS reader: skip corrupt lines, sort by timestamp, track by ts
  instead of line count — handles partial writes and reordering
- Recovery: idempotent import using max DB timestamp
- Live recording: seq numbers on every point
- FileObserver watches correct path (app root, not files/dev.baldav.app)
- Removed ACCESS_BACKGROUND_LOCATION (causes throttling)

Nav: "Трекинг" button on GPS screen when recording active.
2026-05-16 10:49:55 +03:00
f717204ac8 Seed products DB + Settings screen + build fixes
GPS recording overhaul: inline screen (not modal), floating bar
on other screens, manual pause/resume, crash recovery via
localStorage + JSONL file, _processIncomingPoint extracted.

Settings: profile as button, GPS config, permissions, app info.
Products seed DB: 9299 products bundled, imported on first launch.
Build: version/hash in build.rs, signing, install command.
2026-05-15 14:36:22 +03:00
2ca2181e09 Seed products DB + Settings screen + build fixes
Products seed: 9299 products bundled in products_seed.db, Kotlin
copies from assets to filesDir on Android, Rust imports into main
DB on first launch with version check for future updates.

Settings: profile button, offline toggle, GPS permission, app info
with git hash and build date from build.rs.

Build: version synced to Cargo.toml, unified import (GPX/FTB by
extension), chart zoom Ctrl+scroll only, scroll wheel zoom disabled
on detail map.
2026-05-14 17:35:29 +03:00
d238af55da Android support + Settings screen + Mobile UX fixes
Settings: profile button, offline maps toggle, GPS permission toggle.
Import: unified GPX/FTB, detect by extension.
Mobile UX: bigger nav, no native alerts, safe area insets.
Track: seq for GPX, stored session stats in detail view.
2026-05-14 14:17:57 +03:00
ff12646844 GPS track rendering + offline maps + UI improvements
Track rendering: seq-based ordering matching FitoTrack v15.6
(insertion order, not relativeTime sort which scatters AGPS points).
Colored time-gradient points with dark contour on track map.

Offline maps: tile cache with online/offline toggle in settings,
download script (tools/download_tiles.js) with parallel curl.

UI: removed useless map from GPS screen, click-to-zoom on detail map,
locate-me button, zoom level display, desktop layout improvements.
2026-05-13 17:53:19 +03:00
1affadb05d Initial commit: BalDav health tracker
Tauri 2 + pure JS + SQLite personal health tracking app.

Nutrition module:
- 9299 products in DB (Magnit SSR scraping + KDV)
- Product search with case-insensitive Cyrillic (name_lower column)
- Food logging from product DB or manual entry
- Supplement tracking with per-pill micronutrients
- Micronutrient % strip on Today screen

Fitness/GPS module:
- FitoTrack .ftb and GPX import with seq-based ordering
- Session detail view: map, speed/elevation charts (Chart.js)
- Offline tile caching (IndexedDB) with region download
- Track rendering with colored time-gradient points

UI:
- Fullscreen modals with back-button (history API)
- Dark theme, desktop-responsive layout
- 5 tabs: Today, Products, Track, Supplements, Profile

Tools:
- Magnit/KDV HTML parsers
- Dedup import with discrepancy detection
- FitoTrack backup analysis
2026-05-13 10:21:24 +03:00