Fix table system data loading and navigation isolation #17

Merged
gabogg merged 3 commits from fix/table-views-data-persistence-and-loading into dev 2026-08-21 16:42:26 +00:00
Owner

Summary

  • Fixes stale table data persisting across navigation between different entity pages.
  • Fixes users and roles table views showing blank by adding proper column mappings, render functions, and reactive loading.
  • Adds alias for locations to /api/states.
  • Adds public /api/test/version and /api/test/health diagnostic endpoints to backend.
  • Adds Playwright E2E test (desktop/e2e/table-navigation.spec.js) confirming data isolation and empty table state behavior.
## Summary - Fixes stale table data persisting across navigation between different entity pages. - Fixes users and roles table views showing blank by adding proper column mappings, render functions, and reactive loading. - Adds alias for `locations` to `/api/states`. - Adds public `/api/test/version` and `/api/test/health` diagnostic endpoints to backend. - Adds Playwright E2E test (`desktop/e2e/table-navigation.spec.js`) confirming data isolation and empty table state behavior.
Analysis covers architecture, security audit, code quality issues,
potential bug fixes, and recommendations for the entire system.

Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
- Correct entity count: 15 JPA entities + 3 enums
- Correct controller count: 16 total
- Add finding about inconsistent @Transactional across controllers
  (StateController, CategoryController, PermissionController missing it)

Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
- Fix line number reference for commitDelete dead code
- Add bug finding: globally unique item.name prevents cross-branch inventory
- Verified all findings against actual source code
- Confirmed 213/213 tests passing

Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
Security fixes:
- Require ADMIN_PASSWORD env var at startup (fail hard if not set)
- Replace JWT byte-repeat key derivation with SHA-256 hashing
- Align CORS default between code and config
- Add tokenVersion to User entity for JWT revocation (V5 migration)

Code quality fixes:
- Extract service layer: 12 domain services with @Transactional boundaries
- Move @Transactional from controllers to services
- Remove dead code in AuditService.commitDelete
- Move PageUtil from web/ to common/ package
- Inject app version from build properties instead of hardcoding

Bug fixes:
- Check ADMIN_PASSWORD on re-seed + increment tokenVersion on password change
- Keep item quantity at 0 instead of deleting on disincorporation/adjustment
- Add pre-validation of entry fields matching request type in executeRequest
- Change Item.name unique constraint to composite (name, branch_id) (V6 migration)
- Fix BagController audit: use long arithmetic, remove Optional wrapper
- Use configurable constant for default Inbound department name

Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
Flaw 11 - Repetitive @JsonIgnoreProperties:
Remove 'hibernateLazyInitializer' and 'handler' from all entity
@JsonIgnoreProperties annotations — Hibernate6Module handles
these globally via Jackson configuration.

Flaw 12 - Fragile bag barcode lookup:
Change endpoint from /api/bags/barcode/{barcode} (@PathVariable)
to /api/bags/by-barcode?barcode= (@RequestParam) for better
handling of special characters in barcodes.

Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
Each finding now shows whether it's been fixed (✅) and references
PR #8 (fix/codebase-flaws). Recommendations section updated to
show all items as completed. Barcode endpoint updated in flow doc.

Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
Remove the JavaFX desktop frontend and all associated files as it's
being rebuilt from scratch with a different technology stack.

Changes:
- Delete frontend/ directory (source, tests, i18n, pom.xml, README)
- Remove frontend module from root pom.xml
- Remove javafx.version property from root pom.xml
- Remove frontend version check from .github/workflows/ci.yml
- Remove frontend JAR build/upload from .github/workflows/release.yml
- Remove frontend JAR build from .forgejo/workflows/release.yml
- Remove frontend/pom.xml from release-please-config.json extra-files
- Remove frontend references from scripts/release.sh
- Remove frontend references from README.md, docs/, setup-server.sh
- Remove DEMO-GUIDE.md (frontend-specific), STYLE-GUIDE.md (JavaFX)
- Remove staged_diff patch files and pom.xml.versionsBackup
- Update copilot-instructions.md and test_mcp.js

Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
Reviewed-on: #9
Covers full architecture breakdown, technology rationale, development
standards, styling standards, testing/QA strategy, barcode vs QR
analysis, build optimization & tree-shaking, dependency manifest,
API contract compatibility, and phased implementation plan.

Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
Full implementation of the desktop inventory manager:
- Svelte 5 frontend with dark-mode-first UI, keyboard-driven design
- Rust backend with Tauri commands (login, API proxy, auth storage)
- 12 CRUD views: items, bags, branches, departments, categories,
  locations, users, roles, permissions, displacements, item requests
- Barcode/QR scanner page (BarcodeDetector API + WASM fallback)
- Audit log viewer with entity/ID search
- Dashboard with entity counts
- ESBuild-minified bundle: 71 KB JS + 7 KB CSS

Test suites (13/13 passing, ~150ms):
- auth (4 tests): init, login, clear, error handling
- api client (4 tests): URL construction, error handling, CRUD paths
- router (3 tests): navigation, params, back
- components (2 tests): toast API, table filtering/sorting

E2E (Playwright):
- Login page rendering, empty-submit error, form visibility
- Tauri driver integration script (tauri-e2e.sh)

CI/CD:
- .github/workflows/desktop.yml: svelte-check + vitest +
  cargo clippy/test + Playwright E2E
- Svelte TS strict mode, Rust stable

Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
Rust (api.rs):
- Refactored HTTP logic into testable api module (no Tauri deps)
- 10 unit tests: URL building, base URL resolution, token extraction
- auth.rs tests: serialization, config defaults, roundtrip

JS integration tests (api.integration.test.js):
- 6 tests against real Spring backend with H2 test DB
- Auth flow: login (valid + invalid), GET /auth/me, CRUD endpoints
- Isolated from unit tests via vitest.integration.config.js

Test runner (test-helpers.sh):
- Starts Spring backend in test profile on port 14000
- Waits for health check, runs integration tests, stops gracefully
- Works as standalone script or sourced for modular use

CI (desktop.yml):
- Added backend-integration job: installs Java 21, starts backend,
  runs vitest integration + Playwright E2E against live backend
- Only runs on PRs (10min timeout)

Test results:
- Unit: 13/13 (~100ms)
- Integration: 6/6 against real backend (~650ms)
- Build: 71KB JS + 7KB CSS

Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
- Fix api.js BASE_URL: strip trailing /api from VITE_API_URL so
  paths like /api/items produce http://host/api/items (no double prefix)
- Fix api-invoke.js: add ReferenceError guard for process.env in browser
- Add httpFallback to api-invoke.js for browser/Tauri bridge commands
  (store_auth, get_stored_auth, clear_auth fall to localStorage)
- Add test:e2e:headed npm script for visual Playwright testing
- Fix CORS: test-helpers.sh now passes --app.cors-origin=$CORS_ORIGIN
  (defaults to http://localhost:1420 for Vite dev server)
- Update Playwright E2E to test full login + navigate all pages + logout

E2E verified: headed browser session completes login, visits all 9
CRUD pages, scanner, audit log, and returns to login screen.

Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
Test suite (23.3s headed, 12/12 passing):

Login + Dashboard:
- Login form accepts credentials, dashboard shows stat cards
- All 7 entity pages render data tables with seed data
  (Branches, Departments, Categories, Items, Users, Bags)

Categories CRUD (only entity where generic inline form works):
- Create via UI modal, verify in table and via API
- Edit name, verify update in table and API
- Delete, verify removed from table and API

Scanner + Audit pages:
- Scanner page renders camera button and help text
- Audit log page renders entity selector and search

Bug fixes discovered during testing:
- getToken() was async causing "Bearer [object Promise]" header
- ListPage response parsing lacked `data` field support
- DashboardPage lacked `total` field support
- api-invoke.js lacked browser/http fallback for Tauri commands
- CORS needed explicit --app.cors-origin for dev server
- BASE_URL double-/api prefix stripping

Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
Complete E2E test suite covering every functional area:

1. Login flow + Dashboard stat cards
2. All 7 entity page renderings (Branches, Categories, Items, Bags,
   Roles, Users, Departments)
3. Permissions table
4. Locations page
5. Categories full CRUD: create, edit, delete
6. Filter/search within data tables (match + empty state)
7. Pagination button visibility
8. Item inline form modal (name, description, quantity fields)
9. Scanner page (camera button, help text)
10. Audit log search controls
11. All 12 sidebar nav items present + navigable without errors
12. API CRUD verification for all 5 entity types (categories,
    departments, items, branches, bags)

27/27 tests passing, 42.4s headed, real backend + H2 test DB + seed data.

Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
- SettingsPage component for configuring backend server URL
- Reactive baseUrl store in api.js (supports localStorage persistence)
- LoginPage settings panel with URL test/save functionality
- Wire SettingsPage into App.svelte navigation
- Fix api.js to use svelte store get() for dynamic base URL
feat: merge desktop settings panel and E2E coverage confirmation
- TESTING_BEST_PRACTICES_RESEARCH.md: 1,877-line research covering
  Spring Boot, Vitest/Svelte, Tauri, Playwright, Rust, and CI/CD
  best practices with concrete config snippets and code examples
- TESTING_IMPROVEMENTS.md: actionable 5-phase plan with effort/impact
  matrix, addressing current issues (H2 vs PG, DirtiesContext,
  stale E2E, no CI, missing system deps)
test(phase 3 & 4): fix E2E login and Svelte pagination bugs, run all tests in parallel CI
Some checks failed
CI / backend-test (pull_request) Successful in 1m33s
CI / frontend-test (pull_request) Failing after 7s
CI / rust-test (pull_request) Failing after 14s
5006859879
ci: trigger workflow on push to test/infra-issues and pull requests to dev
Some checks failed
CI / backend-test (push) Successful in 1m21s
CI / frontend-test (push) Successful in 40s
CI / rust-test (push) Failing after 35s
CI / backend-test (pull_request) Successful in 1m19s
CI / frontend-test (pull_request) Successful in 16s
CI / rust-test (pull_request) Failing after 9s
8c5e751d12
ci: prevent duplicate workflow runs by removing feature branch push trigger
Some checks failed
CI / backend-test (pull_request) Successful in 1m21s
CI / frontend-test (pull_request) Successful in 16s
CI / rust-test (pull_request) Failing after 9s
08bd3c7d37
ci: use local target-dir in rust container to avoid permission issues
Some checks failed
CI / backend-test (pull_request) Successful in 1m15s
CI / frontend-test (pull_request) Successful in 16s
CI / rust-test (pull_request) Failing after 8s
fcd7f13d4b
ci: set CARGO_HOME to writable tmp directory in rust container
Some checks failed
CI / backend-test (pull_request) Successful in 1m16s
CI / frontend-test (pull_request) Successful in 16s
CI / rust-test (pull_request) Failing after 9s
11648a7bb6
ci: use latest rust image to ensure compile compatibility with newer crates
All checks were successful
CI / backend-test (pull_request) Successful in 1m15s
CI / frontend-test (pull_request) Successful in 15s
CI / rust-test (pull_request) Successful in 58s
86b61973a0
fix: address PR review comments including @Transactional removal and actions/checkout integration
Some checks failed
CI / backend-test (pull_request) Failing after 4s
CI / frontend-test (pull_request) Successful in 17s
CI / rust-test (pull_request) Failing after 2s
c1dee9e031
ci: use manual checkout with git http.extraheader to fix containers lacking Node.js
All checks were successful
CI / backend-test (pull_request) Successful in 2m8s
CI / frontend-test (pull_request) Successful in 17s
CI / rust-test (pull_request) Successful in 26s
1299513cf1
fix: refactor backend and frontend pagination to use standard 0-indexed page and size
All checks were successful
CI / backend-test (pull_request) Successful in 2m9s
CI / frontend-test (pull_request) Successful in 19s
CI / rust-test (pull_request) Successful in 27s
82a240ffa5
test: update extract_token_field test in pure-logic to use ***
All checks were successful
CI / backend-test (pull_request) Successful in 2m7s
CI / frontend-test (pull_request) Successful in 18s
CI / rust-test (pull_request) Successful in 26s
2578c1d4a7
Merge pull request 'test(infra): implement TESTING_IMPROVEMENTS.md testing roadmap' (#15) from test/infra-issues into dev
All checks were successful
CI / backend-test (push) Successful in 2m1s
CI / frontend-test (push) Successful in 18s
CI / rust-test (push) Successful in 27s
59f414bc76
Reviewed-on: #15
fix: support multiple allowed CORS origins to prevent local dev UI CORS blocks
Some checks failed
CI / frontend-test (push) Waiting to run
CI / rust-test (push) Waiting to run
CI / backend-test (push) Has been cancelled
43d2d7a643
feat: add start-app.sh script
All checks were successful
CI / backend-test (push) Successful in 2m9s
CI / frontend-test (push) Successful in 18s
CI / rust-test (push) Successful in 26s
00d5dfdf79
docs: i18n roadmap for Svelte 5 desktop frontend — typesafe-i18n, 5-phase plan
All checks were successful
CI / backend-test (pull_request) Successful in 2m9s
CI / frontend-test (pull_request) Successful in 18s
CI / rust-test (pull_request) Successful in 26s
a8491f40a0
feat(i18n): Phase 3 - fix relative import path in DashboardPage.svelte and update E2E assertions
All checks were successful
CI / backend-test (pull_request) Successful in 2m8s
CI / frontend-test (pull_request) Successful in 18s
CI / rust-test (pull_request) Successful in 27s
da209147e2
fix(desktop): resolve table view data persistence across entity navigation
All checks were successful
CI / backend-test (pull_request) Successful in 2m39s
CI / frontend-test (pull_request) Successful in 50s
CI / rust-test (pull_request) Successful in 1m6s
4c72f2fada
- Add reactive entity reloading and key-based component isolation for ListPage
- Update column definitions and renderers for users, roles, permissions, items, bags, and departments
- Add alias for locations to states endpoint in API client
- Add Playwright E2E test verifying entity data isolation and empty-state handling
- Add public connectivity/version endpoint to backend SecurityConfig and TestController
chore: ignore build targets, test results, and add demo script
All checks were successful
CI / backend-test (pull_request) Successful in 2m11s
CI / frontend-test (pull_request) Successful in 20s
CI / rust-test (pull_request) Successful in 30s
5f5a0e40cd
Added matt's Agent still collection.
All checks were successful
CI / backend-test (pull_request) Successful in 2m10s
CI / frontend-test (pull_request) Successful in 22s
CI / rust-test (pull_request) Successful in 29s
c031f06006
Author
Owner

Review — PR #17

Thanks for this. The core {#key currentPage} fix is correct and directly addresses the stale-data bug. A few things need attention before merge.

Critical — retarget the base branch from master to dev

This PR targets master, but the branch is based on dev. master is ~44 commits behind dev, which is why the diff shows 1309 files / 51 commits while the PR body describes a ~7-commit change. As written, merging this into master would pull all of dev's unmerged work into master under a misleading title.

Please change the target branch to dev (or rebase the branch onto master if that's genuinely the intended merge target). Even though this is a fix PR, it shouldn't skip normal procedures — the base/target branch needs to match where the work actually belongs, and unrelated work shouldn't ride along in the diff.

Scope creep — three unrelated workstreams in one PR

Even on the corrected base, the 7 commits bundle three independent changes:

  1. Table data isolation fix (4c72f2f) — the actual issue.
  2. i18n Phase 1-3 (a8491f4, 80cb529, 0046ac3, da20914) — 800+ lines of generated typesafe-i18n output and page rewrites.
  3. Agent skill collection (c031f06), skills-lock.json, scripts/demo-espanol.sh, .gitignore changes.

Issue #17's body only covers #1 (plus the diagnostic endpoints). #2 and #3 should be split into separate PRs so the table fix can be reviewed and merged independently.

c031f06 commits .claude/skills/* as symlinks pointing to ../../.agents/skills/*. But .agents/ is gitignored (.gitignore:39) and none of .agents/skills/ is tracked. On a fresh clone these 37 symlinks are dangling — the targets don't exist. Either commit the .agents/skills content too, or drop these from the PR.

Machine-specific values committed

desktop/e2e/ui.spec.js and desktop/e2e/table-navigation.spec.js fall back to http://192.168.1.21:4002/api — a private LAN IP that will break in CI and on other machines. The previous default (127.0.0.1:14000) was at least portable. Use an env var with a localhost default, not a hardcoded host IP. Also hardcoding admin/password credentials in the E2E login helper is fragile; prefer test-seeded credentials via env.

Stale/wrong version default in TestController

@Value("${app.version:2.0.0}")
private String appVersion = "2.0.0";

application.yml resolves app.version to @project.version@ = 1.12.1-SNAPSHOT, so the 2.0.0 fallback is stale and misleading. The versionReturnsVersionInfo test only passes because standaloneSetup skips @Value wiring and falls back to the field default — it's effectively asserting the hardcoded literal, not the real version. Align the default with the actual project version and make the test assert the injected value.

/api/test/version duplicates /api/test/info

version() returns {application_name, version, status} — byte-for-byte identical to the existing info() endpoint (which is auth-gated). The only difference is one is public and one isn't. If a public version endpoint is needed, make version() distinct (or make info() public and delete the duplicate). Right now there are two endpoints serving the same payload with different auth rules — that's a maintenance trap.

displacements column definition is unreachable

ListPage.svelte adds a displacements columnDef, but App.svelte's navItems has no displacements entry, so the page can never render. Dead code — either add the nav entry or remove the columnDef.

Minor — duplicated endpoint resolution

The expression

api[entity] || api[entity + 'es'] || (entity === 'locations' ? api.states : api.items)

is repeated verbatim in load(), handleSave(), and handleDelete(). Extract a single getEndpoint(entity) helper. Note the api.items catch-all silently serves item data for any unknown entity, which would mask a routing bug (e.g. a typo'd entity would show items instead of failing loudly).

Positive

  • {#key currentPage} + onMount(load) correctly resets component state on navigation — this is the right fix for the stale-data bug.
  • Reordering to res.data ?? res.content matches the backend PageResponse (which serializes as data, not content).
  • The locations → api.states alias and the users/roles render functions look correct against the domain models (User.roles, Role.name, Branch.name).
  • Adding an E2E test specifically for entity isolation is the right call.
## Review — PR #17 Thanks for this. The core `{#key currentPage}` fix is correct and directly addresses the stale-data bug. A few things need attention before merge. ### Critical — retarget the base branch from `master` to `dev` This PR targets `master`, but the branch is based on `dev`. `master` is ~44 commits behind `dev`, which is why the diff shows **1309 files / 51 commits** while the PR body describes a ~7-commit change. As written, merging this into `master` would pull all of `dev`'s unmerged work into `master` under a misleading title. Please change the target branch to `dev` (or rebase the branch onto `master` if that's genuinely the intended merge target). Even though this is a fix PR, it shouldn't skip normal procedures — the base/target branch needs to match where the work actually belongs, and unrelated work shouldn't ride along in the diff. ### Scope creep — three unrelated workstreams in one PR Even on the corrected base, the 7 commits bundle three independent changes: 1. Table data isolation fix (`4c72f2f`) — the actual issue. 2. i18n Phase 1-3 (`a8491f4`, `80cb529`, `0046ac3`, `da20914`) — 800+ lines of generated typesafe-i18n output and page rewrites. 3. Agent skill collection (`c031f06`), `skills-lock.json`, `scripts/demo-espanol.sh`, `.gitignore` changes. Issue #17's body only covers #1 (plus the diagnostic endpoints). #2 and #3 should be split into separate PRs so the table fix can be reviewed and merged independently. ### Broken symlinks on clean checkout `c031f06` commits `.claude/skills/*` as symlinks pointing to `../../.agents/skills/*`. But `.agents/` is gitignored (`.gitignore:39`) and none of `.agents/skills/` is tracked. On a fresh clone these 37 symlinks are **dangling** — the targets don't exist. Either commit the `.agents/skills` content too, or drop these from the PR. ### Machine-specific values committed `desktop/e2e/ui.spec.js` and `desktop/e2e/table-navigation.spec.js` fall back to `http://192.168.1.21:4002/api` — a private LAN IP that will break in CI and on other machines. The previous default (`127.0.0.1:14000`) was at least portable. Use an env var with a localhost default, not a hardcoded host IP. Also hardcoding `admin`/`password` credentials in the E2E login helper is fragile; prefer test-seeded credentials via env. ### Stale/wrong version default in `TestController` ```java @Value("${app.version:2.0.0}") private String appVersion = "2.0.0"; ``` `application.yml` resolves `app.version` to `@project.version@` = `1.12.1-SNAPSHOT`, so the `2.0.0` fallback is stale and misleading. The `versionReturnsVersionInfo` test only passes because `standaloneSetup` skips `@Value` wiring and falls back to the field default — it's effectively asserting the hardcoded literal, not the real version. Align the default with the actual project version and make the test assert the injected value. ### `/api/test/version` duplicates `/api/test/info` `version()` returns `{application_name, version, status}` — byte-for-byte identical to the existing `info()` endpoint (which is auth-gated). The only difference is one is public and one isn't. If a public version endpoint is needed, make `version()` distinct (or make `info()` public and delete the duplicate). Right now there are two endpoints serving the same payload with different auth rules — that's a maintenance trap. ### `displacements` column definition is unreachable `ListPage.svelte` adds a `displacements` columnDef, but `App.svelte`'s `navItems` has no `displacements` entry, so the page can never render. Dead code — either add the nav entry or remove the columnDef. ### Minor — duplicated endpoint resolution The expression ```js api[entity] || api[entity + 'es'] || (entity === 'locations' ? api.states : api.items) ``` is repeated verbatim in `load()`, `handleSave()`, and `handleDelete()`. Extract a single `getEndpoint(entity)` helper. Note the `api.items` catch-all silently serves item data for any unknown entity, which would mask a routing bug (e.g. a typo'd entity would show items instead of failing loudly). ### Positive - `{#key currentPage}` + `onMount(load)` correctly resets component state on navigation — this is the right fix for the stale-data bug. - Reordering to `res.data ?? res.content` matches the backend `PageResponse` (which serializes as `data`, not `content`). - The `locations` → `api.states` alias and the `users`/`roles` render functions look correct against the domain models (`User.roles`, `Role.name`, `Branch.name`). - Adding an E2E test specifically for entity isolation is the right call.
gabogg changed target branch from master to dev 2026-08-21 16:26:47 +00:00
gabogg force-pushed fix/table-views-data-persistence-and-loading from c031f06006
All checks were successful
CI / backend-test (pull_request) Successful in 2m10s
CI / frontend-test (pull_request) Successful in 22s
CI / rust-test (pull_request) Successful in 29s
to 9876dcec7b
All checks were successful
CI / backend-test (pull_request) Successful in 2m12s
CI / frontend-test (pull_request) Successful in 20s
CI / rust-test (pull_request) Successful in 29s
2026-08-21 16:32:57 +00:00
Compare
Author
Owner

Updates addressed per review:

  1. Retargeted PR base to dev: Cleaned up the 1300+ file diff caused by comparing against master. PR diff now cleanly isolates the 16 relevant files.
  2. Cleaned PR scope: Removed dangling .claude/skills/* symlinks, skills-lock.json, and scripts/demo-espanol.sh.
  3. De-hardcoded E2E test values: table-navigation.spec.js and ui.spec.js now use process.env.INVENTORY_API_URL (default 127.0.0.1:14000/api) and env-overridable credentials (E2E_USERNAME / E2E_PASSWORD).
  4. Fixed TestController version & diagnostics: Aligned app.version default with 1.12.1-SNAPSHOT and enriched authenticated /api/test/info with java_version and os_name diagnostics while keeping /api/test/version lightweight and public.
  5. Cleaned ListPage.svelte: Removed unreachable displacements columnDef and extracted getEndpoint(targetEntity) helper with unknown entity checking.
  6. All tests verified: Vitest (17/17) and Playwright E2E tests pass.
## Updates addressed per review: 1. **Retargeted PR base to `dev`**: Cleaned up the 1300+ file diff caused by comparing against `master`. PR diff now cleanly isolates the 16 relevant files. 2. **Cleaned PR scope**: Removed dangling `.claude/skills/*` symlinks, `skills-lock.json`, and `scripts/demo-espanol.sh`. 3. **De-hardcoded E2E test values**: `table-navigation.spec.js` and `ui.spec.js` now use `process.env.INVENTORY_API_URL` (default `127.0.0.1:14000/api`) and env-overridable credentials (`E2E_USERNAME` / `E2E_PASSWORD`). 4. **Fixed `TestController` version & diagnostics**: Aligned `app.version` default with `1.12.1-SNAPSHOT` and enriched authenticated `/api/test/info` with `java_version` and `os_name` diagnostics while keeping `/api/test/version` lightweight and public. 5. **Cleaned `ListPage.svelte`**: Removed unreachable `displacements` columnDef and extracted `getEndpoint(targetEntity)` helper with unknown entity checking. 6. **All tests verified**: Vitest (17/17) and Playwright E2E tests pass.
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
PCivil/inventory-system!17
No description provided.