# Responsive, bilingual device workspace

Implemented 23 September 2026 and maintained through 26 September 2026 in the .NET 8 MVC portal. NEXGO N82 and NEWPOS NEW9810 are now physically connected; responsive bilingual device, deployment, location and user-management views have been exercised in the current portal.

## Presentation

- Bank workspace with customer selection, registered-device counts, recent-report counts and device cards.
- Device detail with Overview, Applications, Operations and Diagnostics tabs. The device UUID remains the route identity; manufacturer serial is its display identity.
- Overview presents battery/charging, network, free storage, available memory, hardware and software versions, and uptime. Missing fields have explicit empty states.
- Applications presents package, version and build in responsive rows. The current agent only inventories up to 40 launcher-visible applications; this is clearly explained.
- Operations preserves authorized command queuing and credential rotation. The current home agent does not execute commands yet; the portal makes that limitation visible.
- Diagnostics separates internal Android serial, reported model/product, agent package, assignment epoch and original telemetry JSON. Values and machine field names are preserved.
- Location and group/tag cards explicitly describe capabilities that are not yet implemented. No invented locations or live-connection claims.
- Recent report means a server receipt within two minutes. Values are snapshots, not proof of a current MQTT connection. Refresh is manual.
- Device detail currently searches the existing customer-scoped list of up to 500 devices. Pagination and a dedicated scoped get-device RPC are needed before supporting larger fleets in this UI.

## Theme and accessibility

CSS design tokens define the navy navigation, blue actions, pale workspace, white cards, borders, spacing and typography. Desktop sidebar becomes compact horizontal navigation on phones. Metrics and property rows reflow; phone tabs use two columns. Long identifiers wrap; tables confine scrolling to their own region. Visible labels, keyboard focus outlines, a skip link, semantic headings, active-page navigation and minimum-height touch controls are included.

## Localization standard

All existing portal screens use shared English/Spanish resources: dashboard, device tabs, model catalog, enrollment, sign-in, errors and notices. ASP.NET request localization selects en/es with English fallback. The language control persists a cookie and safely returns to a local page. Numbers and UTC timestamps use the chosen culture; dates explicitly say UTC.

New components must add both resource entries, localize visible labels, validation, empty states and accessibility text, and be reviewed in both languages at phone and desktop widths. Brand names, package IDs, serials, protocol identifiers, OS names and raw diagnostic JSON remain original data. Browser form constraints use messages in the selected portal language; gRPC failures map to localized operator messages rather than exposing service text.

The active Android launcher's own UI localization is outside this portal change.

## Serial correction

BANPAIS device 96a5ce4f-65b2-4ca6-bc97-d5fbde526c17 now displays manufacturer label serial H3R000700069081. The prior value 9810260815431507 came from Android ro.serialno. Both are now distinct in telemetry; the Android system value was captured during lab provisioning, not read dynamically on every report. The corrected record retains assignment and credentials. Audit action: LabelSerialCorrected. The ignored enrollment file was renamed to use the corrected serial.

## Map recommendation and next integration

Recommended renderer: [MapLibre GL JS](https://maplibre.org/projects/gl-js/). Initial vector map provider: [OpenFreeMap](https://openfreemap.org/), whose public service currently advertises no registration, API key or request/view limit. These are separate from coordinate acquisition. Keep the tile/style provider configurable and preserve required attribution; production availability requirements may justify self-hosting or a contracted provider. Self-hosting has infrastructure and maintenance costs.

The launcher must first collect authorized device location with latitude, longitude, accuracy, source and captured-at timestamp. The portal should show the last known point, its age and accuracy, never silently substitute the operator browser's position or an IP-derived estimate. No location collection, map requests, external assets or CSP relaxation were added in this change. This recommendation is not yet an implemented map feature.

## Verification

- Release solution build: zero warnings/errors.
- 42 real integration checks pass, including customer isolation, CSRF, structured telemetry, Spanish views and empty states, language-cookie persistence, external return-URL rejection and CSS delivery.
- English and Spanish resource key parity: 143 entries.
- NEWPOS/NEXGO Android debug builds and existing two passcode unit tests pass.
- Updated NEWPOS APK installed preserving application data; SQL receipt verified corrected manufacturer serial and separate Android serial.
- Browser review: desktop (1335 px), tablet (768 px), and phones (390/360 px); dashboard, all four device tabs and catalog fit without document-wide horizontal scrolling. Spanish required-field message verified in the browser; English restored after testing. No browser warnings/errors observed.
- Visual evidence: [desktop device page](images/portal-device-desktop.png) and [phone device page](images/portal-device-phone.png).
