Skip to content

UI Update; Editing mode Update; Bulk-Update-Page; Manual-Update-Page#103

Merged
dabreegster merged 38 commits into
a-b-street:mainfrom
tordans:tagging
Mar 9, 2026
Merged

UI Update; Editing mode Update; Bulk-Update-Page; Manual-Update-Page#103
dabreegster merged 38 commits into
a-b-street:mainfrom
tordans:tagging

Conversation

@tordans
Copy link
Copy Markdown
Contributor

@tordans tordans commented Feb 5, 2026

tordans and others added 30 commits February 2, 2026 17:44
This also moves some code into CenterlineTagActions that was used only there
Make it one wort so it fits with the others
Prominent UI to explain the current page
Streamline wording and make it more compact.
Less own color; makes it easier to work with many colors in the style

Packages: update svelte-utils
We should not generate sidewalks for highway=trunk etc.
We only wand sidewalks generated when they are mapped explicitly here.
Simplify a189e6b5441fec1f5bb59b6b09012497238cf2e7
But keep the arrow since this is kind of our "selected line" state
@tordans tordans changed the title Improve side path tagging UI UI Update; Editing mode Update; Bulk-Update-Page; Manual-Update-Page Mar 9, 2026
@tordans tordans marked this pull request as ready for review March 9, 2026 15:01
@tordans
Copy link
Copy Markdown
Contributor Author

tordans commented Mar 9, 2026

@dabreegster this PR got a bit big and I wanted to reach out to hear how you would want to handle this.
I ended up updating larger parts of the UI and the updates became a bit mixed up…

Like before, the Svelte code is something I can review well and which I optimized by hand. But the Rust code is generated and reviewed only by using/testing it in the app.

The question is, how to get this ready for Speedwalk main.
I could split this in separate PRs but some features are base on other changes, so that will be a bit hard.
We could review the code together…
I could also deploy a FMC version of the app to use for the time being.
Whatever works best for you.


Summary of the changes:

WayDetails & tag handling

  • WayDetails refactored by extracting sub-components; added actions for sidepath-like ways.
  • CurrentTagsTable: improved layout/UX; added highlighting for newly added tags.
  • SidepathTagActions improved; adding and removing tags split and reworked for centerline vs sidepath.

Jumbotron & UI copy

  • Jumbotron added to each page with updated wording.
  • Refresh button renamed to make “refresh” intent clearer.

New & reworked pages

  • Generator page added to consolidate actions.
  • Manual overwrite page added with support for adding manual connections and a loading state.
  • Rename Menu to Disconnections; change default view set to “Routable Network”. The idea is to have all primary menu items one work.
  • App modes introduced in the user Menu instead of the separate "show bulk mode" buttons. The app now has two modes and will show the 3 additional menu items only for the network mode.

Sidewalk features & UX

  • Sidewalk actions: “Show major roads” and “Show minor roads” split into separate controls.
  • Make sidewalk: crash fix and rework to use tangent method only.
    • This is one of those Rust changes that may or may not be a good idea. I hit this panic with my dataset before when using the Generator features. This is the XML I am using for testing.
  • UI: Edits collapsible closed by default until edits exist; trash button styled gray by default.

Legends & shared components

  • Legend helpers reworked and shared (e.g. crossing legend on bulk page); legend styles fixed.
  • Labels shared between export and sidewalk; styles and legend improved.

The app has its own legend helper now; not those from the utils repo. This was just easier for now…

Map & basemap

  • Basemap switched to Mapillary “data viz light”.
  • Editing: left/right shown on map only for centerline ways.

Highway classification

  • RoadWithoutSidewalksImplicit extended to highway=trunk, trunk_link, and additional high-level highway classes.

Editing UX & validation

  • Warning when crossing length > 30 m.
  • Button disabled when the action is already applied.
  • “Removes” tags section expanded in the editing UI.

Shared state & UI polish

  • Network filter shared between export and overwrite pages (persisted in localStorage).
  • More checkboxes persisted in localStorage.
  • Mapillary: style button and box improved.
  • ActionBar: background reworked so white is on the buttons, not the wrapper.

A few Screenshots but not of all new features…

Bildschirmfoto 2026-03-09 um 15 39 50 Bildschirmfoto 2026-03-06 um 16 12 12 Bildschirmfoto 2026-03-06 um 16 10 06 Bildschirmfoto 2026-03-06 um 16 09 57

Copy link
Copy Markdown
Collaborator

@dabreegster dabreegster left a comment

Choose a reason for hiding this comment

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

Wow, this is an incredible 10 steps forward on the app! I'm a massive fan of the UX changes (separating the app usage into pure OSM auditing and more advanced network generation, the jumbotron, reorganizing bulk actions into one clean place, using indexed DB instead of local storage, etc). I've given everything a try locally and it all seems to be working great.

I'm happy to merge this now. Realistically I don't have any time to review this in more detail for at least the next month, and I trust what you've done. I gave a quick skim to all the code and had a few notes, but mostly just nitpicks. By and large everything is totally understandable and well-structured from what I can tell. The comments I left could be notes for me to go back in a month and tweak things a bit.

Seriously awesome, thank you so much for pushing this forward

Comment thread backend/src/classify.rs
// the sidewalk generator.
if tags.is_any(
"highway",
vec![
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.

Refactor with is_severance, except the service road case?

Comment thread backend/src/edits.rs
#[derive(Clone, Serialize)]
pub enum UserCmd {
SetTags(WayID, Vec<(String, String)>),
SetTags(WayID, Vec<String>, Vec<(String, String)>),
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.

Would be useful to add a `/// Doc comment saying what these are; the Vec<(String, String)> was key/value pairs, and I'm guessing the new thing is keys to delete. Or switch to a struct for this case with named fields

Comment thread backend/src/edits.rs
UserCmd::SetTags(way, replace) => {
UserCmd::SetTags(way, remove_keys, add_tags) => {
let cmds = self.change_way_tags.entry(way).or_insert_with(Vec::new);
// Clear old sidewalk tags first
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.

Ah good, the responsibility for this moves to the frontend then

import { bbox } from "svelte-utils/map";

const DB_NAME = "speedwalk-overrides";
const STORE_NAME = "regionOverrides";
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.

What does "region" mean in context here?

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.

Two bits of UX feedback here:

  1. It'd be cool if the two points were draggable <Marker>s
  2. A primary button to confirm instead of just a keybinding could be useful for discoverability (though I agree the keyboard is faster to do once you're used to it)

@dabreegster dabreegster merged commit 47a3fa7 into a-b-street:main Mar 9, 2026
@tordans tordans deleted the tagging branch March 10, 2026 08:01
tordans added a commit to tordans/speedwalk that referenced this pull request Mar 14, 2026
(PR a-b-street#103)

Keep SetTags(WayID, Vec<String>, Vec<(String, String)>) with explicit
fields. Add doc comment and inline comments (remove_keys, add_tags) so
the two vecs are clearly defined.
tordans added a commit to tordans/speedwalk that referenced this pull request Mar 14, 2026
(PR a-b-street#103)

- Add SEVERANCE_HIGHWAY_TYPES in lib.rs as single source of truth for
  motorway through tertiary_link (no service).
- Add is_severance_highway(tags) and is_road_without_sidewalks_implicit(tags);
  the latter is severance types OR highway=service for RoadWithoutSidewalksImplicit.
- Way::is_severance() now uses is_severance_highway(); classify uses
  is_road_without_sidewalks_implicit() so service stays explicit and the
  rest reuse the same definition.
@tordans tordans mentioned this pull request Mar 14, 2026
dabreegster pushed a commit that referenced this pull request Mar 14, 2026
(PR #103)

Keep SetTags(WayID, Vec<String>, Vec<(String, String)>) with explicit
fields. Add doc comment and inline comments (remove_keys, add_tags) so
the two vecs are clearly defined.
dabreegster pushed a commit that referenced this pull request Mar 14, 2026
(PR #103)

- Add SEVERANCE_HIGHWAY_TYPES in lib.rs as single source of truth for
  motorway through tertiary_link (no service).
- Add is_severance_highway(tags) and is_road_without_sidewalks_implicit(tags);
  the latter is severance types OR highway=service for RoadWithoutSidewalksImplicit.
- Way::is_severance() now uses is_severance_highway(); classify uses
  is_road_without_sidewalks_implicit() so service stays explicit and the
  rest reuse the same definition.
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