Skip to content

Commit 5fd93d5

Browse files
committed
v1.10.28 — Tags/Balises (+ filter & search), grid-view sorting, TigerTag+ chip backup list, dedicated Firebase Explorer, non-blocking notifications panel
1 parent 2beebce commit 5fd93d5

22 files changed

Lines changed: 1386 additions & 225 deletions

‎CHANGELOG.md‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,28 @@ Versions follow [Semantic Versioning](https://semver.org/).
55

66
---
77

8+
## v1.10.28 — 2026-06-29
9+
10+
### Added
11+
12+
- **Tags.** Label your spools with free-form tags. Add or remove them from a spool's detail panel (with autocomplete from tags you already use), filter the inventory with the new **All tags** dropdown, and find them from the search bar. A spool's tags stay in sync across both chips of a twin pair.
13+
- **Grid view sorting.** The grid now has its own sort menu (brand, material, name, type, weight, capacity, updated) with an ascending/descending toggle — previously only the table view could sort.
14+
- **Your chip history, kept safe.** The app now keeps a private list of every physical chip you've programmed — to count your unique chips — and backs up the repairable signature of each TigerTag+ the first time it's read.
15+
16+
### Changed
17+
18+
- **The notifications panel no longer blocks the rest of the app** — you can keep clicking around while it's open, it has a chevron to close it, and opening it tidies away any other open side panel.
19+
- **Cleaner grouped spools in the grid** — a group now looks like a normal card with its ×N count badge, without the stacked-paper effect.
20+
- **Clearer wording when pairing chips** — "Link a second RFID chip" instead of "Link to a twin spool", since you're linking two chips of one spool.
21+
- **New Firebase Explorer (admin).** For debug-enabled accounts, a dedicated dark tool to browse your own Firestore data — breadcrumb navigation, clickable drill-down, readable values and a raw-JSON view.
22+
23+
### Fixed
24+
25+
- **"Show in Storage" now just highlights the spool's slot** instead of filling the search bar; clicking anywhere clears the highlight.
26+
- **The chip list builds for everyone now**, including accounts whose inventory loads from cache (it previously skipped them).
27+
28+
---
29+
830
## v1.10.27 — 2026-06-28
931

1032
### Added

‎CLAUDE.md‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,8 @@ When a feature needs a new cross-user write or field, edit + deploy that file; m
260260
### Firestore data structure
261261
The full collection/field map (publicKeys, userProfiles, users/{uid} + telemetry/inventory/friends/friendRequests/blacklist/prefs) **and** a third-party connect example live in **`docs/firestore-schema.md`** — read it on demand when changing the data model; do not reproduce it here. Security rules live in the backend repo (see *Firestore Security Rules* above).
262262

263+
> **Keep the two data-model docs in sync.** Whenever you change `docs/firestore-schema.md` (add/rename/remove a collection or field, change its shape or a write convention), also update the **public backend repo** doc so third-party integrators + the mobile app stay aligned: `/Users/benglut/Documents/TigerTag_Firebase_Backend/README.md` → section **🧠 Firestore Data Structure** (the `users/{uid}` tree + any per-field subsection). This README is the public integration reference. Doc-only change — no deploy needed; commit it on `main` in the backend repo when the user asks (same as `firestore.rules`). Mention the cross-app impact (mobile/third-party) when relevant.
264+
263265
---
264266

265267
## Debug mode
@@ -423,6 +425,7 @@ The full per-category key list (App/status, Settings, Account, Login, Credential
423425
- **Brand voice (all user-facing copy)**: every string a user reads — UI labels, buttons, empty states, prompts, nudges, error messages, modals, AND the "What's New" notes (`data/whatsnew.json`) — uses a **playful, deadpan, second-degree voice, Discord-style** (witty, self-aware, talks to you like a mate) — **NOT** Burger-King-style (no aggressive/provocative/troll edge). Lead with the **user benefit** in plain words; **no technical jargon** (avoid "modal", "toggle", "side panel", "header", class names, "TestFlight"…); **never describe what doesn't exist** or our process ("no emoji", "we removed X", "fixed bug Y"). Keep the tone natural in **every locale**. The CHANGELOG stays factual; this voice is for in-app copy + What's New. *(Same rule applies to the mobile app — see its CLAUDE.md.)*
424426
- **i18n**: always add all **9** translations (en/fr/de/es/it/zh/pt/pt-pt/pl) in the same edit batch. **Use `npm run i18n:add` — do NOT hand-edit the locale JSON files.** See the *Adding new keys* section above for syntax.
425427
- **Commits**: no `Co-Authored-By` line. **Never commit without explicit user instruction** — make the change, then stop and wait for the order to commit.
428+
- **Naming — clear human semantics first**: every name you introduce (Firestore collection/field, function, variable, CSS class, IPC channel, config key) must read plainly to a human and say what it *is*, so the meaning is obvious without chasing the code. Prefer a self-describing name over a clever/encoded one — e.g. a collection `rfidList` over `rfidChips`, a boolean `rfidListed`/`rfidBackup` over a multi-state `rfidChip: 1|2`. **Avoid encoding several states into one cryptic value** (magic numbers, packed flags): split into separate, well-named booleans/fields. **Don't store what you can derive** — drop redundant fields when an existing one already implies the answer (e.g. no `startState`/type field when the presence of a `backup` already means "TigerTag+"). When a name turns out unclear, rename it (and its doc/schema) rather than letting it stand. Clear semantics now prevent compounding complexity later.
426429
- **JS**: all logic lives in `inventory.js`. Do not inline JS in `inventory.html`.
427430
- **CSS**: split across `renderer/css/00-base.css … 70-detail-misc.css` (loaded in numeric order). Add new rules in the section file that matches the feature — e.g. Snapmaker tweaks go in `50-snapmaker.css`, modal tweaks in `60-modals.css`. Asset URLs use `url('../../assets/svg/icons/…')` (two `..` because we're in `renderer/css/`). Scoped IDs (`#editAccountModalOverlay`, `#addAccountModalOverlay`, etc.) still apply where needed.
428431
- **displayName**: always read from Firestore `users/{uid}.displayName` (pseudo). Never use Firebase Auth `user.displayName` for UI display — it contains the Google real name.

‎ROADMAP.md‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ Sizes: **S** = a few hours · **M** = a day · **L** = several days · **XL** =
1515
Grouped by domain. Versions in parentheses are the release that landed the feature; the changelog has the detail.
1616

1717
### Inventory & spools
18+
- 🚧 **Tags / Balises** (Shopify-style free-form labels per spool, `tags` string[] on the inventory doc; twin-mirrored; pure Studio metadata, no re-burn; searchable).
19+
- ✅ **Phase 1** — editor in the detail panel (chips + autocomplete add), normalise/dedup/cap, search integration.
20+
- 🔜 **Phase 2** — tag chips shown on grid/table cards + a multi-tag filter (AND/OR), bulk-tag a multi-selection.
21+
- 🔜 **Phase 3** — **Smart groups** = named saved filters by condition (tags + brand/material/…), the "automated collection" payoff. Stored in `prefs`.
1822
- ✅ **Hard delete + anti-resurrection (cloudSync)** — spools deleted from Tiger Studio are hard-deleted from Firestore (no tombstone). Flutter's `cloudSync` flag prevents resurrection on reconnect. Legacy `deleted: true` tombstones auto-purged on first live snapshot. ISO with the printer pattern. (v1.7.4)
1923
- ✅ **`updatedAt` rename** — `last_update` → `updatedAt` (ISO with printer model). All writes use `FieldValue.serverTimestamp()`. Legacy docs handled via `normalizeRow` fallback. (v1.7.4)
2024
- ✅ **Container auto-assignment** — `resolveContainerForBrand` + `autoAssignMissingContainers`: every spool without a `container_id` gets one automatically on the next live snapshot, matched to its brand. (v1.7.4)

0 commit comments

Comments
 (0)