Skip to content

feat: add fixed position coordinate picker #909

Merged
danditomaso merged 14 commits into
meshtastic:mainfrom
dzienisz:feat/fixed-position
Nov 27, 2025
Merged

feat: add fixed position coordinate picker #909
danditomaso merged 14 commits into
meshtastic:mainfrom
dzienisz:feat/fixed-position

Conversation

@dzienisz

@dzienisz dzienisz commented Oct 26, 2025

Copy link
Copy Markdown
Contributor

Description

Screenshot 2025-11-14 at 14 40 01 Screenshot 2025-11-14 at 14 40 05

Integrate Fixed Position Admin Messages into Global Save

Summary

Refactored the fixed position saving mechanism to integrate admin message queuing into the global save workflow. Previously, the setFixedPosition admin message was sent immediately when the form changed, causing a race condition where the admin message could arrive before or after the fixedPosition: true config was committed. Now, admin messages are queued alongside config changes and sent in the correct order during the global save operation.

Related Issues

Fixes: Fixed position coordinates were not reliably applied due to race conditions between immediate admin message sending and deferred config commits via the global save button.

Changes Made

New Infrastructure

  • changeRegistry.ts

    • Extended ConfigChangeKey type to include adminMessage variant with ValidAdminMessageType and unique ID.
    • Updated serializeKey and deserializeKey to handle admin message keys.
    • Added getAllAdminMessages() and getAdminMessageChangeCount() helper functions.
  • deviceStore/index.ts

    • Added queueAdminMessage(), getAllQueuedAdminMessages(), and getAdminMessageChangeCount() methods to the Device interface.
    • Implemented admin message queuing in deviceFactory using the unified change registry.

Updated Files

  • Position.tsx

    • Replaced sendAdminMessage with queueAdminMessage for setFixedPosition admin messages.
    • Admin messages are now queued during form submission instead of sent immediately.
    • Removed immediate position update request (no longer needed).
  • Settings/index.tsx

    • Added toBinary and Protobuf imports.
    • Integrated getAllQueuedAdminMessages() and getAdminMessageChangeCount() into the component.
    • Updated handleSave to process queued admin messages after configs are committed.
    • Admin message changes now count toward pending changes indicator.
    • Added null check for ActiveComponent to prevent TypeScript errors.

Key Points

  • Correct Sequencing: Admin messages are sent after commitEditSettings(), ensuring the device has the correct configuration before receiving position coordinates.
  • Unified Change Tracking: Admin messages use the same change registry system as configs, modules, and channels.
  • No Race Conditions: The fixedPosition: true config is guaranteed to be committed before the setFixedPosition admin message is sent.
  • Clean Integration: Admin messages are treated as first-class changes in the global save workflow.
  • Type Safety: Full TypeScript support with proper schemas and validation.

Technical Details

Admin Message Flow

  1. User edits position coordinates in the form
  2. onSubmit in Position.tsx is triggered (via onChange)
  3. Config changes are queued via setChange()
  4. Admin message is queued via queueAdminMessage()
  5. User clicks global Save button
  6. handleSave processes changes in order:
    • Sends channel changes
    • Sends config changes (including fixedPosition: true)
    • Sends module config changes
    • Commits settings (commitEditSettings())
    • Sends queued admin messages (setFixedPosition)
    • Updates local state
    • Clears all changes

Change Registry Schema

type ConfigChangeKey =
  | { type: "config"; variant: ValidConfigType }
  | { type: "moduleConfig"; variant: ValidModuleConfigType }
  | { type: "channel"; index: Types.ChannelNumber }
  | { type: "user" }
  | { type: "adminMessage"; variant: ValidAdminMessageType; id: string };

Testing

  • ✅ Lint: pnpm run lint (root) — passes.
  • ✅ Type checking: No TypeScript errors.
  • ✅ Manual verification:
    • Fixed position coordinates are correctly queued when form changes.
    • Global save button appears when admin messages are queued.
    • Admin messages are sent after config commit.
    • No race conditions observed.
    • Change count includes admin messages.

Checklist

  • Code follows project style/patterns.
  • Type safety maintained (proper schemas and interfaces).
  • Unified change tracking system extended.
  • Linting passes.
  • No console.log statements in production code.
  • Null safety checks added where needed.

@vercel

vercel Bot commented Oct 26, 2025

Copy link
Copy Markdown

@dzienisz is attempting to deploy a commit to the Meshtastic Team on Vercel.

A member of the Team first needs to authorize it.

@danditomaso danditomaso left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall really glad to see this has been added to the code base, it has been needed for a while.

I will need to see some changes reverted otherwise it will cause all kinds of type issues around the code base. Additionally, the Fixed Position component must be added to the DynamicFormField and referenced using the type field by its string value (known as a factory function). Once you look at the DynamicFormField component you'll see the pattern. I'm available to help answer any questions on will be required to get this merged

Comment thread packages/core/src/utils/transform/decodePacket.ts Outdated
Comment thread packages/web/public/i18n/locales/en/config.json Outdated
Comment thread packages/web/src/components/Form/DynamicForm.tsx Outdated
Comment thread packages/web/src/components/Form/FormWrapper.tsx Outdated
Comment thread packages/web/src/components/PageComponents/Settings/FixedPositionPicker.tsx Outdated
Comment thread packages/web/src/components/PageComponents/Settings/Position.tsx Outdated
@dzienisz

Copy link
Copy Markdown
Contributor Author

I am open to all suggestions. This is my first big PR. I can improve it next week.

@dzienisz dzienisz force-pushed the feat/fixed-position branch 2 times, most recently from d3777e6 to 9b80d5e Compare October 29, 2025 13:48
@danditomaso

Copy link
Copy Markdown
Collaborator

@dzienisz Wanted to follow up and see if the fixes were going to be added to this PR?

@dzienisz

Copy link
Copy Markdown
Contributor Author

@dzienisz Wanted to follow up and see if the fixes were going to be added to this PR?

today, sorry for delay

@dzienisz dzienisz force-pushed the feat/fixed-position branch 2 times, most recently from 72dff84 to c62c2d3 Compare November 12, 2025 11:37
@dzienisz dzienisz requested a review from danditomaso November 12, 2025 11:44
Comment thread packages/web/src/components/Form/FormToggle.tsx Outdated
@danditomaso

Copy link
Copy Markdown
Collaborator

Can you remove the large white border and the padding around this new component, and with the exception of one other comment about using standards such as {...rest} in the component it looks good to go.

@danditomaso

Copy link
Copy Markdown
Collaborator

Also, how does this feature interact with the GPS Mode dropdown above? Can both be used at the same time?

@danditomaso

Copy link
Copy Markdown
Collaborator

Also, since. you mentioned some "recommended notes"

GPS Mode recommendation: Set to "DISABLED" or "NOT_PRESENT" when using fixed position for best results

This can be enforced at the field level, look for disabledBy: in the codebase, as its important users dont need a manual to use a new feature and that it "just works"

@dzienisz dzienisz requested a review from danditomaso November 13, 2025 15:04
@vercel

vercel Bot commented Nov 13, 2025

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Preview Comments Updated (UTC)
web-test Ready Ready Preview Comment Nov 26, 2025 4:26pm

@danditomaso

danditomaso commented Nov 13, 2025

Copy link
Copy Markdown
Collaborator

So I played with it a bit, and if I enter a lat or long greater than -90 - 90 it throws an error, or if you enter 3 digits at all, and click "set fixed position" the thrown error is caught by the top level error handler. This should really validate the input and display an error if the input isn't valid instead of throwing an error.
image
image

@dzienisz dzienisz force-pushed the feat/fixed-position branch 4 times, most recently from 57612fa to 0d252aa Compare November 14, 2025 13:59
@dzienisz

Copy link
Copy Markdown
Contributor Author

@danditomaso Setting position does not work, and I'm not sure why.

@dzienisz

Copy link
Copy Markdown
Contributor Author

Hey @danditomaso ! 👋

I went with Option 2 (integrate admin messages into the global save system) after evaluating both approaches.

Why Option 2?

The main advantage is that it maintains consistency with the existing architecture. All configuration changes in the app already flow through the global save mechanism, so integrating admin messages into this same workflow makes the codebase more predictable and easier to maintain. Users also get a unified experience - one save button for everything.

What about Option 1?

Option 1 (restoring the dedicated "Set Fixed Position" button) would have worked and been simpler to implement, but it would have created an inconsistency in the UX - users would need to understand that position coordinates require a separate save action from other settings. While this is more explicit, it breaks the pattern established by the rest of the settings interface.

Implementation Details

The solution extends the existing change registry system to support admin messages as first-class changes:

  • Admin messages are queued alongside config/module/channel changes
  • They're sent after commitEditSettings() to ensure proper sequencing
  • The pending changes indicator includes queued admin messages
  • Everything clears atomically on save

This eliminates the race condition while keeping the architecture clean and extensible for future admin message types.

Let me know if you have any questions about the implementation! 🚀

Kamil Dzieniszewski added 2 commits November 21, 2025 09:27
- Created new FixedPositionPicker component with clickable map for setting device coordinates
- Added form field type for fixed position picker that appears when fixedPosition toggle is enabled
- Implemented position request functionality to retrieve current device location
Kamil Dzieniszewski added 11 commits November 21, 2025 09:27
- Added dynamic altitude unit (Meters/Feet) that respects the user's imperial/metric display preference
- Updated altitude field description to show the appropriate unit instead of hardcoded "Meters"
- Replace hardcoded IDs with useId() hook for proper accessibility
- Use Number.isNaN() instead of isNaN() for more reliable type checking
- Add radix parameter to parseInt() and remove unnecessary fragment wrapper
- Removed dedicated FixedPositionPicker form field type in favor of toggle's additionalContent prop
- Moved FixedPositionPicker to render conditionally within toggle field instead of as separate dynamic field
- Streamlined form field types by eliminating FixedPositionPickerFieldProps
…s for fixed position

- Removed FixedPositionPicker component with map interface
- Added latitude, longitude, and altitude fields directly to position form
- Moved coordinate validation into PositionValidationSchema with proper min/max bounds
- Updated translation strings to include coordinate ranges and improved altitude description
- Coordinates now sent via setFixedPosition admin message on form submit when fixedPosition is enabled
…d unused field spreading

- Removed additionalContent prop and its JSDoc documentation from ToggleFieldProps
- Removed rendering of additionalContent below toggle switch
- Cleaned up Controller render function by removing unused rest spread operator
- Renamed field destructuring to controllerField for clarity
…request

- Restructure onSubmit to save config before sending admin message
- Add position broadcast request after setting fixed position to immediately update display
- Add comprehensive debug logging throughout submission flow
- Extract coordinate exclusion logic earlier in submission process for clarity
- Add 1 second delay before requesting position broadcast to allow fixed position processing
@danditomaso

danditomaso commented Nov 22, 2025

Copy link
Copy Markdown
Collaborator

Overall its nearly finished just couple more things to fix:

  • All fixed position inputs accept a nearly unlimited length of number. It should be constrained to no more than 9 digits (excluding decimal places) which matches what other platforms use.
  • The placeholder for each field should 0.0 (long & lat). The altitude field should use an empty placeholder (like it does already)
image

@danditomaso danditomaso changed the title feat: add fixed position coordinate picker with map interface feat: add fixed position coordinate picker Nov 23, 2025

@danditomaso danditomaso left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See the latest comment from me in this PR.

- Set fieldLength.max to 10 for both latitude and longitude inputs
- Prevents excessive decimal precision while maintaining 7 decimal places (±1.1cm accuracy)
@dzienisz dzienisz requested a review from danditomaso November 25, 2025 13:33
@dzienisz

Copy link
Copy Markdown
Contributor Author

@danditomaso Please run this change on localhost and test if you can set the position.

@danditomaso

Copy link
Copy Markdown
Collaborator

I tried the version hosted on vercel (link above) and it looks like there are problems showing the fixed position fields.
image

@dzienisz

Copy link
Copy Markdown
Contributor Author

I can't access this vercel link.

@danditomaso danditomaso merged commit 6a7be99 into meshtastic:main Nov 27, 2025
4 checks passed
@dzienisz dzienisz deleted the feat/fixed-position branch November 28, 2025 09:17
danditomaso added a commit that referenced this pull request Feb 10, 2026
* Add badge indicator on layers icon. (#894)

* feat: indicate number of layers enabled.

* Update packages/web/src/components/PageComponents/Map/Tools/MapLayerTool.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix: reduced code duplication in layers component

* fixed unread message bubble

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix(actions): improve main to stable release workflow (#895)

* fix(actions): improve main to stable release workflow

* Update .github/workflows/update-stable-from-master.yml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update .github/workflows/update-stable-from-master.yml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix(ui): logic on waypoint layer component caused 0 to be shown in UI (#896)

* fix(ui): logic on waypoint layer component caused 0 to be shown in UI

* Update packages/web/src/components/PageComponents/Map/Popups/WaypointDetail.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* chore(i18n): New Crowdin Translations by GitHub Action (#899)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>

* Update readme with new widgets (#901)

* chore: add new widgets to readme

* add docs url

* Update README.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* feat(i18n): add fr localization support (#902)

* feat: add fr support

* fix(i18n): ensure langs are sorted before being displayed.

* feat(ci): add CI workflow to automatically close issue after 60 days (#897)

* feat(ci): add CI workflow to automatically close issue after 60 days

* run once pe github issue to run once per day

* chore(deps): bump vite from 7.1.9 to 7.1.11 (#903)

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.9 to 7.1.11.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.11/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.11
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Update inactive issue workflow schedule and settings (#905)

* Update inactive issue workflow schedule and settings

* Update .github/workflows/inactive-issue.yml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Persists device and app stores across sessions (#860)

* Persistence for device and app data

* esphemeral -> ephemeral

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* devices -> app

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Additional waypoint methods, update mock, update tests

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fix description for historyReturnWindow (#907)

It's not number of records but the time window...

* Feat(config): Align settings menu to match android/ios (#906)

* feat: aligned settings menu to match android/ios

* updated sidebar text size.

* Update packages/web/public/i18n/locales/en/config.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/public/i18n/locales/en/config.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/PageComponents/Settings/User.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/PageComponents/ModuleConfig/Telemetry.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* linting/formatting fixes

* fixed formatting issue

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* chore: add new folders to biome config (#910)

* chore(i18n): New Crowdin Translations by GitHub Action (#908)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>

* fix: use correct deprecated GPS coordinate format enum (#917)

The Config_DisplayConfig_GpsCoordinateFormat export doesn't exist in the protobufs package. The correct export is Config_DisplayConfig_DeprecatedGpsCoordinateFormat, which matches what's used in the validation schema.

Added TODO comment explaining that this field is deprecated since protobufs 2.7.4 and should be migrated to DeviceUIConfig.gps_format when DeviceUI settings are implemented.

* style: fix line wrapping for GPS coordinate format enum (#918)

- Split long enum reference across multiple lines to improve code readability
- Maintains consistent code formatting standards without changing functionality

* feat(state): enable deviceStore persistance (#922)

* fix(core): ensure core package works in browser (#923)

* fix(core): ensure core package works in browser

* style(core): revert new line removal

* fix: add @serialport/bindings-cpp to onlyBuiltDependencies (#914)

* feat(ui): Add UI library (#900)

* feat: scaffold UI library

* Update packages/ui/src/components/theme-provider.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* add lock file

* lint/formatting fixes

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix: added skelton loader for message items (#927)

* feat(connections): Add connections page (replaces new device dialog) (#919)

* feat(conn): add connection screen and logic

* fixes from code review

* force https

* code review fixes

* add http for self testing

* enable deviceStore persistance

* added translations

* disabled feature flag

* i18n updates

* chore: add new folders to biome config (#910)

* chore(i18n): New Crowdin Translations by GitHub Action (#908)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>

* fix: use correct deprecated GPS coordinate format enum (#917)

The Config_DisplayConfig_GpsCoordinateFormat export doesn't exist in the protobufs package. The correct export is Config_DisplayConfig_DeprecatedGpsCoordinateFormat, which matches what's used in the validation schema.

Added TODO comment explaining that this field is deprecated since protobufs 2.7.4 and should be migrated to DeviceUIConfig.gps_format when DeviceUI settings are implemented.

* style: fix line wrapping for GPS coordinate format enum (#918)

- Split long enum reference across multiple lines to improve code readability
- Maintains consistent code formatting standards without changing functionality

* fix(core): ensure core package works in browser (#923)

* fix(core): ensure core package works in browser

* style(core): revert new line removal

* fix: add @serialport/bindings-cpp to onlyBuiltDependencies (#914)

* feat(ui): Add UI library (#900)

* feat: scaffold UI library

* Update packages/ui/src/components/theme-provider.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* add lock file

* lint/formatting fixes

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* formatting/linting fixes

* fixed some paring logic

* fixed connection issue with serial

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
Co-authored-by: Kamil Dzieniszewski <kamil.dzieniszewski@gmail.com>
Co-authored-by: Azarattum <43073346+Azarattum@users.noreply.github.com>
Co-authored-by: Ben Allfree <ben@benallfree.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix(ci): add ui library to excluded list (#928)

* fix(config): update change registry channel value (#929)

* fix(config): update change registry channel value

* format/linting

* chore(i18n): New Crowdin Translations by GitHub Action (#924)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>

* fix(connections): ensure connections reflect actual status. (#930)

* fix(connection): support port on HTTP connection (#935)

* feat(docker): add arm v7 support (#934)

* feat(ui): match avatar color other platforms (#933)

* feat(ui): match avatar color other platforms

* Update packages/web/src/components/UI/Avatar.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/DeviceInfoPanel.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix(ui): fix add connection dialog typo (#938)

* fix(i18n): Correct 'disconnected' typo in connections.json (#943)

* fix(i18n): Correct 'disconnected' typo in connections.json

* fix(i18n): Correct typo 'checkConnetion' to 'checkConnection'

* Fix(i18n): Correct typo in connection test description

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>

* chore(i18n): New Crowdin Translations by GitHub Action (#941)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>

* Add 'packages/web' to excluded directories (#947)

* refactor: device connection logic, added nonce to get config only (#946)

* refactor: device connection logic, added nonce to get config only on connect.

* Update packages/web/src/core/services/MeshService.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/pages/Connections/useConnections.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* code review fixes

* fixes from code review

* ui fixes

* refactored meshService, moved code into deviceStore. Fixed some connnection issues

* formatting fixes

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix: removed duplicate images (#951)

* feat: add devcontainer (#953)

* fix(ui): add language switcher to connections page (#954)

* fix(ui): add language switcher to connections page

* desciption length fix

* Update packages/web/src/pages/Connections/index.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* add new language picker key

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* chore(i18n): New Crowdin Translations by GitHub Action (#958)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>

* fix: interpolate longName and shortName in PKI backup download (#959)

This caused {{shortName}} and {{longName}} to appear unformatted in the
exported key files:

``` === MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===

Private Key: <censored>

Public Key: <censored>

=== END OF KEYS === ```

The fix simply replicates the behaviour used elsewhere in
PKIIBackupDialog.

* fix(ui): removed internet hosted fonts from app (#955)

* fix(ui): removed internet hosted fonts from app

* Update packages/web/src/components/generic/Mono.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/UI/Typography/Code.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* removed unsupported font extention

* formatter fix

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* chore(i18n): New Crowdin Translations by GitHub Action (#962)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>

* fix(ui): correct typo in languagePicker key and adjust description width (#961)

Fixed typo 'languagePickeer' to 'languagePicker' in DeviceInfoPanel and corrected responsive width class from 'md:w-6' to 'md:w-5/6' in Connections page description.

* chore(deps-dev): bump happy-dom from 20.0.0 to 20.0.2 (#968)

Bumps [happy-dom](https://github.com/capricorn86/happy-dom) from 20.0.0 to 20.0.2.
- [Release notes](https://github.com/capricorn86/happy-dom/releases)
- [Commits](capricorn86/happy-dom@v20.0.0...v20.0.2)

---
updated-dependencies:
- dependency-name: happy-dom
  dependency-version: 20.0.2
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(ui): add "never" i18n string, fix "Favorite" tooltip (#965)

* fix(ui): add "never" i18n string, fix "Favorite" tooltip

* format

* format

---------

Co-authored-by: Pmmlabs <meshtastic@pmmlabs.ru>

* feat: add fixed position coordinate picker  (#909)

* chore: remove unused logo SVG files

* feat: add interactive fixed position picker with map interface

- Created new FixedPositionPicker component with clickable map for setting device coordinates
- Added form field type for fixed position picker that appears when fixedPosition toggle is enabled
- Implemented position request functionality to retrieve current device location

* feat: display altitude unit based on user's display settings

- Added dynamic altitude unit (Meters/Feet) that respects the user's imperial/metric display preference
- Updated altitude field description to show the appropriate unit instead of hardcoded "Meters"

* refactor: replace any type with MapLayerMouseEvent in map click handler

* refactor: improve accessibility and code quality in FixedPositionPicker

- Replace hardcoded IDs with useId() hook for proper accessibility
- Use Number.isNaN() instead of isNaN() for more reliable type checking
- Add radix parameter to parseInt() and remove unnecessary fragment wrapper

* refactor: simplify fixed position picker integration

- Removed dedicated FixedPositionPicker form field type in favor of toggle's additionalContent prop
- Moved FixedPositionPicker to render conditionally within toggle field instead of as separate dynamic field
- Streamlined form field types by eliminating FixedPositionPickerFieldProps

* style: format code with consistent line breaks and import ordering

* refactor: simplify fixed position picker container styling

* feat: disable fixed position toggle when GPS is enabled

* refactor: use ComponentRef instead of ElementRef in Switch component

* refactor: replace interactive map picker with inline coordinate fields for fixed position

- Removed FixedPositionPicker component with map interface
- Added latitude, longitude, and altitude fields directly to position form
- Moved coordinate validation into PositionValidationSchema with proper min/max bounds
- Updated translation strings to include coordinate ranges and improved altitude description
- Coordinates now sent via setFixedPosition admin message on form submit when fixedPosition is enabled

* refactor: simplify toggle field by removing additionalContent prop and unused field spreading

- Removed additionalContent prop and its JSDoc documentation from ToggleFieldProps
- Removed rendering of additionalContent below toggle switch
- Cleaned up Controller render function by removing unused rest spread operator
- Renamed field destructuring to controllerField for clarity

* refactor: improve fixed position handling and add position broadcast request

- Restructure onSubmit to save config before sending admin message
- Add position broadcast request after setting fixed position to immediately update display
- Add comprehensive debug logging throughout submission flow
- Extract coordinate exclusion logic earlier in submission process for clarity
- Add 1 second delay before requesting position broadcast to allow fixed position processing

* feat: add max length constraint to latitude and longitude fields

- Set fieldLength.max to 10 for both latitude and longitude inputs
- Prevents excessive decimal precision while maintaining 7 decimal places (±1.1cm accuracy)

* feat(ui): add SNR, RSSI, hops info for messages (#963)

* feat(ui): add SNR, RSSI, hops, MQTT info for messages

* review fixes

* zeros for new fields

* Move label under the message

---------

Co-authored-by: Pmmlabs <meshtastic@pmmlabs.ru>

* feat(map): add heatmap layer (#969)

* feat: add heatmap layer

* Update packages/web/src/components/PageComponents/Map/Layers/HeatmapLayer.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/PageComponents/Map/Tools/MapLayerTool.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/pages/Map/index.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/pages/Map/index.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/PageComponents/Map/Layers/HeatmapLayer.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* lint/formatting fixes

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Revert "feat(ui): add SNR, RSSI, hops info for messages (#963)" (#974)

This reverts commit 020e9d6.

* Update README with Buf CLI installation instructions (#981)

Added instructions for installing the Buf CLI.

* Channel bandwidth is kHz, not MHz (#983)

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jeremy Gallant <8975765+philon-@users.noreply.github.com>
Co-authored-by: philon- <philon-@users.noreply.github.com>
Co-authored-by: Wessel <wessel@weebl.me>
Co-authored-by: Kamil Dzieniszewski <kamil.dzieniszewski@gmail.com>
Co-authored-by: Azarattum <43073346+Azarattum@users.noreply.github.com>
Co-authored-by: Ben Allfree <ben@benallfree.com>
Co-authored-by: jsacrist <jsacrist@users.noreply.github.com>
Co-authored-by: zeo <goonox35@proton.me>
Co-authored-by: Kamil Dzieniszewski <kamil.d@playsmart.io>
Co-authored-by: Alexey Stepanov <Pmmlabs@users.noreply.github.com>
Co-authored-by: Pmmlabs <meshtastic@pmmlabs.ru>
Co-authored-by: rj-xy <2442596+rj-xy@users.noreply.github.com>
danditomaso added a commit that referenced this pull request Feb 11, 2026
* Add badge indicator on layers icon. (#894)

* feat: indicate number of layers enabled.

* Update packages/web/src/components/PageComponents/Map/Tools/MapLayerTool.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix: reduced code duplication in layers component

* fixed unread message bubble

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix(actions): improve main to stable release workflow (#895)

* fix(actions): improve main to stable release workflow

* Update .github/workflows/update-stable-from-master.yml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update .github/workflows/update-stable-from-master.yml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix(ui): logic on waypoint layer component caused 0 to be shown in UI (#896)

* fix(ui): logic on waypoint layer component caused 0 to be shown in UI

* Update packages/web/src/components/PageComponents/Map/Popups/WaypointDetail.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* chore(i18n): New Crowdin Translations by GitHub Action (#899)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>

* Update readme with new widgets (#901)

* chore: add new widgets to readme

* add docs url

* Update README.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* feat(i18n): add fr localization support (#902)

* feat: add fr support

* fix(i18n): ensure langs are sorted before being displayed.

* feat(ci): add CI workflow to automatically close issue after 60 days (#897)

* feat(ci): add CI workflow to automatically close issue after 60 days

* run once pe github issue to run once per day

* chore(deps): bump vite from 7.1.9 to 7.1.11 (#903)

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.9 to 7.1.11.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.11/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.11
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Update inactive issue workflow schedule and settings (#905)

* Update inactive issue workflow schedule and settings

* Update .github/workflows/inactive-issue.yml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Persists device and app stores across sessions (#860)

* Persistence for device and app data

* esphemeral -> ephemeral

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* devices -> app

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Additional waypoint methods, update mock, update tests

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fix description for historyReturnWindow (#907)

It's not number of records but the time window...

* Feat(config): Align settings menu to match android/ios (#906)

* feat: aligned settings menu to match android/ios

* updated sidebar text size.

* Update packages/web/public/i18n/locales/en/config.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/public/i18n/locales/en/config.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/PageComponents/Settings/User.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/PageComponents/ModuleConfig/Telemetry.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* linting/formatting fixes

* fixed formatting issue

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* chore: add new folders to biome config (#910)

* chore(i18n): New Crowdin Translations by GitHub Action (#908)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>

* fix: use correct deprecated GPS coordinate format enum (#917)

The Config_DisplayConfig_GpsCoordinateFormat export doesn't exist in the protobufs package. The correct export is Config_DisplayConfig_DeprecatedGpsCoordinateFormat, which matches what's used in the validation schema.

Added TODO comment explaining that this field is deprecated since protobufs 2.7.4 and should be migrated to DeviceUIConfig.gps_format when DeviceUI settings are implemented.

* style: fix line wrapping for GPS coordinate format enum (#918)

- Split long enum reference across multiple lines to improve code readability
- Maintains consistent code formatting standards without changing functionality

* feat(state): enable deviceStore persistance (#922)

* fix(core): ensure core package works in browser (#923)

* fix(core): ensure core package works in browser

* style(core): revert new line removal

* fix: add @serialport/bindings-cpp to onlyBuiltDependencies (#914)

* feat(ui): Add UI library (#900)

* feat: scaffold UI library

* Update packages/ui/src/components/theme-provider.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* add lock file

* lint/formatting fixes

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix: added skelton loader for message items (#927)

* feat(connections): Add connections page (replaces new device dialog) (#919)

* feat(conn): add connection screen and logic

* fixes from code review

* force https

* code review fixes

* add http for self testing

* enable deviceStore persistance

* added translations

* disabled feature flag

* i18n updates

* chore: add new folders to biome config (#910)

* chore(i18n): New Crowdin Translations by GitHub Action (#908)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>

* fix: use correct deprecated GPS coordinate format enum (#917)

The Config_DisplayConfig_GpsCoordinateFormat export doesn't exist in the protobufs package. The correct export is Config_DisplayConfig_DeprecatedGpsCoordinateFormat, which matches what's used in the validation schema.

Added TODO comment explaining that this field is deprecated since protobufs 2.7.4 and should be migrated to DeviceUIConfig.gps_format when DeviceUI settings are implemented.

* style: fix line wrapping for GPS coordinate format enum (#918)

- Split long enum reference across multiple lines to improve code readability
- Maintains consistent code formatting standards without changing functionality

* fix(core): ensure core package works in browser (#923)

* fix(core): ensure core package works in browser

* style(core): revert new line removal

* fix: add @serialport/bindings-cpp to onlyBuiltDependencies (#914)

* feat(ui): Add UI library (#900)

* feat: scaffold UI library

* Update packages/ui/src/components/theme-provider.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* add lock file

* lint/formatting fixes

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* formatting/linting fixes

* fixed some paring logic

* fixed connection issue with serial

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
Co-authored-by: Kamil Dzieniszewski <kamil.dzieniszewski@gmail.com>
Co-authored-by: Azarattum <43073346+Azarattum@users.noreply.github.com>
Co-authored-by: Ben Allfree <ben@benallfree.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix(ci): add ui library to excluded list (#928)

* fix(config): update change registry channel value (#929)

* fix(config): update change registry channel value

* format/linting

* chore(i18n): New Crowdin Translations by GitHub Action (#924)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>

* fix(connections): ensure connections reflect actual status. (#930)

* fix(connection): support port on HTTP connection (#935)

* feat(docker): add arm v7 support (#934)

* feat(ui): match avatar color other platforms (#933)

* feat(ui): match avatar color other platforms

* Update packages/web/src/components/UI/Avatar.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/DeviceInfoPanel.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix(ui): fix add connection dialog typo (#938)

* fix(i18n): Correct 'disconnected' typo in connections.json (#943)

* fix(i18n): Correct 'disconnected' typo in connections.json

* fix(i18n): Correct typo 'checkConnetion' to 'checkConnection'

* Fix(i18n): Correct typo in connection test description

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>

* chore(i18n): New Crowdin Translations by GitHub Action (#941)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>

* Add 'packages/web' to excluded directories (#947)

* refactor: device connection logic, added nonce to get config only (#946)

* refactor: device connection logic, added nonce to get config only on connect.

* Update packages/web/src/core/services/MeshService.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/pages/Connections/useConnections.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* code review fixes

* fixes from code review

* ui fixes

* refactored meshService, moved code into deviceStore. Fixed some connnection issues

* formatting fixes

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix: removed duplicate images (#951)

* feat: add devcontainer (#953)

* fix(ui): add language switcher to connections page (#954)

* fix(ui): add language switcher to connections page

* desciption length fix

* Update packages/web/src/pages/Connections/index.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* add new language picker key

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* chore(i18n): New Crowdin Translations by GitHub Action (#958)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>

* fix: interpolate longName and shortName in PKI backup download (#959)

This caused {{shortName}} and {{longName}} to appear unformatted in the
exported key files:

``` === MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===

Private Key: <censored>

Public Key: <censored>

=== END OF KEYS === ```

The fix simply replicates the behaviour used elsewhere in
PKIIBackupDialog.

* fix(ui): removed internet hosted fonts from app (#955)

* fix(ui): removed internet hosted fonts from app

* Update packages/web/src/components/generic/Mono.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/UI/Typography/Code.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* removed unsupported font extention

* formatter fix

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* chore(i18n): New Crowdin Translations by GitHub Action (#962)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>

* fix(ui): correct typo in languagePicker key and adjust description width (#961)

Fixed typo 'languagePickeer' to 'languagePicker' in DeviceInfoPanel and corrected responsive width class from 'md:w-6' to 'md:w-5/6' in Connections page description.

* chore(deps-dev): bump happy-dom from 20.0.0 to 20.0.2 (#968)

Bumps [happy-dom](https://github.com/capricorn86/happy-dom) from 20.0.0 to 20.0.2.
- [Release notes](https://github.com/capricorn86/happy-dom/releases)
- [Commits](capricorn86/happy-dom@v20.0.0...v20.0.2)

---
updated-dependencies:
- dependency-name: happy-dom
  dependency-version: 20.0.2
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(ui): add "never" i18n string, fix "Favorite" tooltip (#965)

* fix(ui): add "never" i18n string, fix "Favorite" tooltip

* format

* format

---------

Co-authored-by: Pmmlabs <meshtastic@pmmlabs.ru>

* feat: add fixed position coordinate picker  (#909)

* chore: remove unused logo SVG files

* feat: add interactive fixed position picker with map interface

- Created new FixedPositionPicker component with clickable map for setting device coordinates
- Added form field type for fixed position picker that appears when fixedPosition toggle is enabled
- Implemented position request functionality to retrieve current device location

* feat: display altitude unit based on user's display settings

- Added dynamic altitude unit (Meters/Feet) that respects the user's imperial/metric display preference
- Updated altitude field description to show the appropriate unit instead of hardcoded "Meters"

* refactor: replace any type with MapLayerMouseEvent in map click handler

* refactor: improve accessibility and code quality in FixedPositionPicker

- Replace hardcoded IDs with useId() hook for proper accessibility
- Use Number.isNaN() instead of isNaN() for more reliable type checking
- Add radix parameter to parseInt() and remove unnecessary fragment wrapper

* refactor: simplify fixed position picker integration

- Removed dedicated FixedPositionPicker form field type in favor of toggle's additionalContent prop
- Moved FixedPositionPicker to render conditionally within toggle field instead of as separate dynamic field
- Streamlined form field types by eliminating FixedPositionPickerFieldProps

* style: format code with consistent line breaks and import ordering

* refactor: simplify fixed position picker container styling

* feat: disable fixed position toggle when GPS is enabled

* refactor: use ComponentRef instead of ElementRef in Switch component

* refactor: replace interactive map picker with inline coordinate fields for fixed position

- Removed FixedPositionPicker component with map interface
- Added latitude, longitude, and altitude fields directly to position form
- Moved coordinate validation into PositionValidationSchema with proper min/max bounds
- Updated translation strings to include coordinate ranges and improved altitude description
- Coordinates now sent via setFixedPosition admin message on form submit when fixedPosition is enabled

* refactor: simplify toggle field by removing additionalContent prop and unused field spreading

- Removed additionalContent prop and its JSDoc documentation from ToggleFieldProps
- Removed rendering of additionalContent below toggle switch
- Cleaned up Controller render function by removing unused rest spread operator
- Renamed field destructuring to controllerField for clarity

* refactor: improve fixed position handling and add position broadcast request

- Restructure onSubmit to save config before sending admin message
- Add position broadcast request after setting fixed position to immediately update display
- Add comprehensive debug logging throughout submission flow
- Extract coordinate exclusion logic earlier in submission process for clarity
- Add 1 second delay before requesting position broadcast to allow fixed position processing

* feat: add max length constraint to latitude and longitude fields

- Set fieldLength.max to 10 for both latitude and longitude inputs
- Prevents excessive decimal precision while maintaining 7 decimal places (±1.1cm accuracy)

* feat(ui): add SNR, RSSI, hops info for messages (#963)

* feat(ui): add SNR, RSSI, hops, MQTT info for messages

* review fixes

* zeros for new fields

* Move label under the message

---------

Co-authored-by: Pmmlabs <meshtastic@pmmlabs.ru>

* feat(map): add heatmap layer (#969)

* feat: add heatmap layer

* Update packages/web/src/components/PageComponents/Map/Layers/HeatmapLayer.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/PageComponents/Map/Tools/MapLayerTool.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/pages/Map/index.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/pages/Map/index.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/PageComponents/Map/Layers/HeatmapLayer.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* lint/formatting fixes

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Revert "feat(ui): add SNR, RSSI, hops info for messages (#963)" (#974)

This reverts commit 020e9d6.

* Update README with Buf CLI installation instructions (#981)

Added instructions for installing the Buf CLI.

* Channel bandwidth is kHz, not MHz (#983)

* fix channel importing bug (#1005)

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jeremy Gallant <8975765+philon-@users.noreply.github.com>
Co-authored-by: philon- <philon-@users.noreply.github.com>
Co-authored-by: Wessel <wessel@weebl.me>
Co-authored-by: Kamil Dzieniszewski <kamil.dzieniszewski@gmail.com>
Co-authored-by: Azarattum <43073346+Azarattum@users.noreply.github.com>
Co-authored-by: Ben Allfree <ben@benallfree.com>
Co-authored-by: jsacrist <jsacrist@users.noreply.github.com>
Co-authored-by: zeo <goonox35@proton.me>
Co-authored-by: Kamil Dzieniszewski <kamil.d@playsmart.io>
Co-authored-by: Alexey Stepanov <Pmmlabs@users.noreply.github.com>
Co-authored-by: Pmmlabs <meshtastic@pmmlabs.ru>
Co-authored-by: rj-xy <2442596+rj-xy@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants