Skip to content

Improve routes on map#1420

Merged
patricvincit merged 11 commits into
mainfrom
79192/79678/routes-on-map
May 18, 2026
Merged

Improve routes on map#1420
patricvincit merged 11 commits into
mainfrom
79192/79678/routes-on-map

Conversation

@patricvincit

@patricvincit patricvincit commented May 4, 2026

Copy link
Copy Markdown
Contributor

This change is Reviewable

@github-actions

github-actions Bot commented May 4, 2026

Copy link
Copy Markdown

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Scanned Files

None

@patricvincit patricvincit marked this pull request as draft May 4, 2026 07:34
@patricvincit patricvincit marked this pull request as ready for review May 6, 2026 06:41

@Huulivoide Huulivoide left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@Huulivoide reviewed 4 files and all commit messages, and made 7 comments.
Reviewable status: all files reviewed, 7 unresolved discussions (waiting on patricvincit).


ui/src/components/map/routes/RouteEditor.tsx line 60 at r1 (raw file):

};

const SNAPPING_LINE_LAYER_ID = 'snapping-line';

Tän vois laittaa silleen, että tää on vaan yhdessä paikassa määriteltynä ja sit importataan täällä sisään


ui/src/components/map/routes/RouteEditor.tsx line 204 at r1 (raw file):

      if (!creatingNewRoute) {
        onDeleteDrawnRoute();
        removeRoute(map?.getMap(), SNAPPING_LINE_LAYER_ID);

Ylempi onDeleteDrawnRoute kutsuu jo removeRoute:a


ui/src/components/map/routes/RouteEditor.tsx line 270 at r1 (raw file):

    if (!creatingNewRoute && drawingMode === Mode.Edit) {
      onDeleteDrawnRoute();
      removeRoute(map?.getMap(), SNAPPING_LINE_LAYER_ID);

onDelete tekee jo tän


ui/src/components/map/routes/RouteEditor.tsx line 272 at r1 (raw file):

      removeRoute(map?.getMap(), SNAPPING_LINE_LAYER_ID);
      dispatch(stopRouteEditingAction());
      return;

Tässä vois olla luonnollisempi ihan vaan if-else; return void:in sijaan


ui/src/components/map/routes/RouteEditor.tsx line 275 at r1 (raw file):

    }

    onDeleteDrawnRoute();

Tää on nyt eka kutsu seä if lauseen sisällä että sen ulkopuolella. Varmaan nosto funktion ekaks riviks ja sit sopivat if-else osiot


ui/src/components/map/routes/RouteEditor.tsx line 278 at r1 (raw file):

    // Remove lingering map layer/source and clear draft geometry after cancel
    removeRoute(map?.getMap(), SNAPPING_LINE_LAYER_ID);

Tääl kansa, ondelete kutsuu jo tätä itsessään


ui/src/components/map/routes/RouteEditor.tsx line 279 at r1 (raw file):

    // Remove lingering map layer/source and clear draft geometry after cancel
    removeRoute(map?.getMap(), SNAPPING_LINE_LAYER_ID);
    dispatch(resetDraftRouteGeometryAction());

Tääkin on jo ods onDelete kutsua

@patricvincit patricvincit force-pushed the 79192/79678/routes-on-map branch from 740c94f to b285426 Compare May 8, 2026 11:30

@patricvincit patricvincit left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@patricvincit made 7 comments.
Reviewable status: 0 of 12 files reviewed, 7 unresolved discussions (waiting on Huulivoide).


ui/src/components/map/routes/RouteEditor.tsx line 60 at r1 (raw file):

Previously, Huulivoide (Jesse Jaara) wrote…

Tän vois laittaa silleen, että tää on vaan yhdessä paikassa määriteltynä ja sit importataan täällä sisään

Done.


ui/src/components/map/routes/RouteEditor.tsx line 204 at r1 (raw file):

Previously, Huulivoide (Jesse Jaara) wrote…

Ylempi onDeleteDrawnRoute kutsuu jo removeRoute:a

Done.


ui/src/components/map/routes/RouteEditor.tsx line 270 at r1 (raw file):

Previously, Huulivoide (Jesse Jaara) wrote…

onDelete tekee jo tän

Done.


ui/src/components/map/routes/RouteEditor.tsx line 272 at r1 (raw file):

Previously, Huulivoide (Jesse Jaara) wrote…

Tässä vois olla luonnollisempi ihan vaan if-else; return void:in sijaan

Done.


ui/src/components/map/routes/RouteEditor.tsx line 275 at r1 (raw file):

Previously, Huulivoide (Jesse Jaara) wrote…

Tää on nyt eka kutsu seä if lauseen sisällä että sen ulkopuolella. Varmaan nosto funktion ekaks riviks ja sit sopivat if-else osiot

Done.


ui/src/components/map/routes/RouteEditor.tsx line 278 at r1 (raw file):

Previously, Huulivoide (Jesse Jaara) wrote…

Tääl kansa, ondelete kutsuu jo tätä itsessään

Tässä ei ylempi komponentti enää saanutkaan reffiä, joten uuden reitin luonnissa ondelete ei toimi. Täytyy manuaalisesti poistaa


ui/src/components/map/routes/RouteEditor.tsx line 279 at r1 (raw file):

Previously, Huulivoide (Jesse Jaara) wrote…

Tääkin on jo ods onDelete kutsua

tämä samaa kuin tuo ylempi kommentti

@Huulivoide Huulivoide left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@Huulivoide reviewed 10 files, made 1 comment, and resolved 5 discussions.
Reviewable status: 10 of 12 files reviewed, 2 unresolved discussions (waiting on patricvincit).


ui/src/components/map/routes/RouteEditor.tsx line 278 at r1 (raw file):

Previously, patricvincit (Patric Kangasmäki) wrote…

Tässä ei ylempi komponentti enää saanutkaan reffiä, joten uuden reitin luonnissa ondelete ei toimi. Täytyy manuaalisesti poistaa

Pikasesti ku luen koodia, niin arvuuttelisin äkkiseltään että uuden reitin piirrossa sen reffin pitäs illa ihan samaan tapaan paikoillaan 🤔. Mutta osaaks sanoo, että onks se ihan lopogisesti oikein että se ei ole siellä paikoillaan uuden piirtossa?

Edit/stop editing button:
- Add ability to edit route after initial sketch when adding new route
- When editing an existing route, leaving edit mode will discard draft changes
- Bug fix: Now the edit button is also enabled after getting an error on map. Previously user would be stuck in limbo after errors.

Cancel button:
- Also discards draft changes, similar to stopping edit
You can now add id to toasts to avoid showing the same toast multiple times.
Previously the same error could be visible multiple times
Previously this caused error:
- A non-serializable value was detected in the state
@patricvincit patricvincit force-pushed the 79192/79678/routes-on-map branch from b285426 to 221cd61 Compare May 10, 2026 11:23

@Huulivoide Huulivoide left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@Huulivoide reviewed 5 files and all commit messages, and made 1 comment.
Reviewable status: 15 of 16 files reviewed, 3 unresolved discussions (waiting on patricvincit).


ui/src/components/map/routes/Routes.tsx line 33 at r3 (raw file):

  const renderedRouteIds = selectedRouteId
    ? Array.from(new Set([...displayedRouteIds, selectedRouteId]))

uniq([...displayedRouteIds, selectedRouteId])

Always display the selected route if it's not in the displayedRouteIds
Previously this would lead to newly created route not being visible until the user starts editing the route
Now the newly created route will be added to the state correctly.
Previously there were desync in state which resulted in several bugs:
- Refreshing the view would cause the route to get lost
- Clicking the map would cause state to lose the route id, resulting in user not being able to do changes to the route
Now the stops that are on the route will not be visible if the route is not visible.
Previously the stops would be visible on map even when user filtered out the route and stops.
When editing an existing route, user should use "Cancel" or "Save" buttons for actions.
Prevent selected existing route from losing highlight during edit mode when draft geometry exists, so route color remains consistently selected instead of mixed selected/default colors.
@patricvincit patricvincit force-pushed the 79192/79678/routes-on-map branch from 98abd81 to c35afc2 Compare May 11, 2026 11:29

@patricvincit patricvincit left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@patricvincit made 1 comment.
Reviewable status: 13 of 16 files reviewed, 3 unresolved discussions (waiting on Huulivoide).


ui/src/components/map/routes/Routes.tsx line 33 at r3 (raw file):

Previously, Huulivoide (Jesse Jaara) wrote…

uniq([...displayedRouteIds, selectedRouteId])

Done.

@patricvincit patricvincit left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@patricvincit made 1 comment.
Reviewable status: 13 of 16 files reviewed, 3 unresolved discussions (waiting on Huulivoide).


ui/src/components/map/routes/RouteEditor.tsx line 278 at r1 (raw file):

Previously, Huulivoide (Jesse Jaara) wrote…

Pikasesti ku luen koodia, niin arvuuttelisin äkkiseltään että uuden reitin piirrossa sen reffin pitäs illa ihan samaan tapaan paikoillaan 🤔. Mutta osaaks sanoo, että onks se ihan lopogisesti oikein että se ei ole siellä paikoillaan uuden piirtossa?

Tuo reffi on riippuvainen DrawRouteLayeristä jossa se alustetaan se useImperativeHandlella. Mutta uutta reittiä luodessa voit painaa peruuta (onCancel) kun ei ole muokkaus käynnissä (eli drawingMode = null), jolloin DrawRouteLayeriä ei renderätä ja sit se reffi ei alustu. Kun se sen ympärillä on tosiaan <Visible visible={drawingMode !== undefined}<

Ja se on kuitenkin OK, että tota peruuta voi painaa ilman, että on se muokkaus käynnissä, niin suoriltaan ei voi tota renderöinnin logiikkaa tai peruuta-painikkeen toiminnallisuuttakaan vaihtaa.

Tässähän toki vois laittaa ton DrawRouteLayerin mounttaamaan uutta reittiä luodessa, mutta sitten ei returnaisi sitä piirroslayeriä vaan tyhjää jos drawingMode on undefined. Olisko sellasessa ratkasussa tolkkua, vai onko enemmän haittaa kuin hyötyä sun mielestä? Siellä kuitenkin sitten ajetaan parit useEffectit

@Huulivoide Huulivoide left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@Huulivoide reviewed 2 files and all commit messages, made 1 comment, and resolved 1 discussion.
Reviewable status: 15 of 16 files reviewed, 2 unresolved discussions (waiting on patricvincit).


ui/src/components/map/routes/RouteEditor.tsx line 278 at r1 (raw file):

Previously, patricvincit (Patric Kangasmäki) wrote…

Tuo reffi on riippuvainen DrawRouteLayeristä jossa se alustetaan se useImperativeHandlella. Mutta uutta reittiä luodessa voit painaa peruuta (onCancel) kun ei ole muokkaus käynnissä (eli drawingMode = null), jolloin DrawRouteLayeriä ei renderätä ja sit se reffi ei alustu. Kun se sen ympärillä on tosiaan <Visible visible={drawingMode !== undefined}<

Ja se on kuitenkin OK, että tota peruuta voi painaa ilman, että on se muokkaus käynnissä, niin suoriltaan ei voi tota renderöinnin logiikkaa tai peruuta-painikkeen toiminnallisuuttakaan vaihtaa.

Tässähän toki vois laittaa ton DrawRouteLayerin mounttaamaan uutta reittiä luodessa, mutta sitten ei returnaisi sitä piirroslayeriä vaan tyhjää jos drawingMode on undefined. Olisko sellasessa ratkasussa tolkkua, vai onko enemmän haittaa kuin hyötyä sun mielestä? Siellä kuitenkin sitten ajetaan parit useEffectit

Kävin myös itse lukemassa tuolta tota koodia ja tosiaan noinhan se siellä on.
Yks muutos tonne pitäs tehdä: DrawRouteLayer komponentin pitäs itse siivota omat tila muutoksensa pois, ku se unmountataan. Toi nyt ikävästi tekee vähän montaa asiaa ja koskee sekä kartaan että redux storeen. Redux storen osalta en osaa ottaa kantaa, koska en tätä koko sekvensointia tässä tunne. Mutta tuolla // Initializing snapping line useEffectissä pitäs palauttaa lopuks cleanup funktio, joka poistaa sen piirto layerin sieltä kartalta eli kutsuu ui/src/utils/map/mapUtils.ts tiedoston removeRoute funktiota siellä SNAPPING_LINE_LAYER_ID id:llä.

Siitä sitten varmaan valuu tänne puolen jotakin muutoksia, että esim tässä nyt ei sit enää tarvi täällä puolen siivota kartalta asioita pois.

@patricvincit patricvincit force-pushed the 79192/79678/routes-on-map branch from d346e52 to dbdca5d Compare May 18, 2026 07:23

@patricvincit patricvincit left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@patricvincit made 1 comment.
Reviewable status: 11 of 19 files reviewed, 2 unresolved discussions (waiting on Huulivoide).


ui/src/components/map/routes/RouteEditor.tsx line 278 at r1 (raw file):

Previously, Huulivoide (Jesse Jaara) wrote…

Kävin myös itse lukemassa tuolta tota koodia ja tosiaan noinhan se siellä on.
Yks muutos tonne pitäs tehdä: DrawRouteLayer komponentin pitäs itse siivota omat tila muutoksensa pois, ku se unmountataan. Toi nyt ikävästi tekee vähän montaa asiaa ja koskee sekä kartaan että redux storeen. Redux storen osalta en osaa ottaa kantaa, koska en tätä koko sekvensointia tässä tunne. Mutta tuolla // Initializing snapping line useEffectissä pitäs palauttaa lopuks cleanup funktio, joka poistaa sen piirto layerin sieltä kartalta eli kutsuu ui/src/utils/map/mapUtils.ts tiedoston removeRoute funktiota siellä SNAPPING_LINE_LAYER_ID id:llä.

Siitä sitten varmaan valuu tänne puolen jotakin muutoksia, että esim tässä nyt ei sit enää tarvi täällä puolen siivota kartalta asioita pois.

Pistän vielä tänne samat asiat mitä tonne kanavalle laitoin tästä. Eli lisäilin

  • Cleanupit DrawRouteLayeriin kartan piirolle
  • Fallbackina vielä onCanceliin kartan poistaminen, jos se paukahtaa cleanupin jälkeen jostakin vielä näkyviin, esim onko siellä jotain async kutsuja mitä odotellaan ja se tapahtuu cleanupin jälkeen tms.
  • Erotellaan editRoutesta tuo editin aloitus ja lopetus omiin funktioihin

@Huulivoide Huulivoide left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@Huulivoide reviewed 6 files, made 1 comment, and resolved 2 discussions.
Reviewable status: 17 of 19 files reviewed, 1 unresolved discussion (waiting on patricvincit).


ui/src/components/map/routes/DrawRouteLayer.tsx line 136 at r7 (raw file):

        // to ensure that any pending geometry updates are applied before removing the snapping line from the map
        if (!snappingLine) {
          await debouncedOnAddRoute.flush();

Tänne pitäs pistää isot varotukset että joo, tiedetään että tää on tehty päin perseitä, rikkoo kaikki React koodauksen sääntäjä, hajooa ja paskoo reitin, jos karttaa kluksuttelee liian nopeesti tai jos verkkoyhteys on liian hidas ja todennäköisesti kaataa koko paskan ja jotenkin tulee ja syö lemmikki marsunkin.

This caused the route drawing to stay to the map when canceling the route creation process
Previously they were in the same editRoute function which was confusing
@patricvincit patricvincit force-pushed the 79192/79678/routes-on-map branch from dbdca5d to 1c7b3d9 Compare May 18, 2026 10:40

@patricvincit patricvincit left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@patricvincit made 1 comment.
Reviewable status: 17 of 19 files reviewed, 1 unresolved discussion (waiting on Huulivoide).


ui/src/components/map/routes/DrawRouteLayer.tsx line 136 at r7 (raw file):

Previously, Huulivoide (Jesse Jaara) wrote…

Tänne pitäs pistää isot varotukset että joo, tiedetään että tää on tehty päin perseitä, rikkoo kaikki React koodauksen sääntäjä, hajooa ja paskoo reitin, jos karttaa kluksuttelee liian nopeesti tai jos verkkoyhteys on liian hidas ja todennäköisesti kaataa koko paskan ja jotenkin tulee ja syö lemmikki marsunkin.

Tän oikeestaan pystyy jättämään kokonaan pois, jos käyttää tuolla onCancelissa tuota useMapin kautta poistoa suoraan. Toki sekin on sellainen, mihin jossakin vaiheessa olisi hyvä puuttua. Jätin siihen TODO kommentin ettei unohdu

@Huulivoide Huulivoide left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@Huulivoide reviewed 2 files and all commit messages, and resolved 1 discussion.
Reviewable status: :shipit: complete! all files reviewed, all discussions resolved (waiting on patricvincit).

@patricvincit patricvincit merged commit 74ea02c into main May 18, 2026
24 checks passed
@patricvincit patricvincit deleted the 79192/79678/routes-on-map branch May 18, 2026 11:50
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