diff --git a/client/scripts/eslint-baseline.json b/client/scripts/eslint-baseline.json index 35b00256b..43f6cc3d7 100644 --- a/client/scripts/eslint-baseline.json +++ b/client/scripts/eslint-baseline.json @@ -3,7 +3,7 @@ "@typescript-eslint/no-non-null-assertion": 404, "@typescript-eslint/no-misused-promises": 876, "no-console": 88, - "complexity": 231, + "complexity": 230, "@typescript-eslint/no-explicit-any": 148, "trek/no-swallowed-catch": 133, "max-params": 35, diff --git a/client/src/components/Tours/planner/useTourPlanner.test.tsx b/client/src/components/Tours/planner/useTourPlanner.test.tsx index 0621c773c..5ecf42f03 100644 --- a/client/src/components/Tours/planner/useTourPlanner.test.tsx +++ b/client/src/components/Tours/planner/useTourPlanner.test.tsx @@ -31,8 +31,10 @@ const routed = { } const enriched = [[48, 11, 500], [48.01, 11.02, 550]] as [number, number, number][] // With the heights in, the walking time is the hiking rule over the enriched line, not the router's. -const enrichedAnalysis = analyzeRouteGeometry(JSON.stringify(enriched))! -const enrichedWalkingSeconds = hikingTimeMinutes(enrichedAnalysis.distanceKm, enrichedAnalysis.gain!, enrichedAnalysis.loss!) * 60 +const enrichedAnalysis = analyzeRouteGeometry(JSON.stringify(enriched)) +if (!enrichedAnalysis) throw new Error('the enriched line has no analysis') +const enrichedWalkingSeconds = + hikingTimeMinutes(enrichedAnalysis.distanceKm, enrichedAnalysis.gain ?? 0, enrichedAnalysis.loss ?? 0) * 60 const savedTour = { place_id: 42, name: 'Saved ridge', diff --git a/client/src/pages/tripPlanner/usePlacedPointHint.test.ts b/client/src/pages/tripPlanner/usePlacedPointHint.test.ts index f649aca0c..d84e0e814 100644 --- a/client/src/pages/tripPlanner/usePlacedPointHint.test.ts +++ b/client/src/pages/tripPlanner/usePlacedPointHint.test.ts @@ -48,12 +48,18 @@ describe('usePlacedPointHint', () => { const { result, place } = setup(); place([A, B]); act(() => result.current.hold(true)); - act(() => vi.advanceTimersByTime(PLACED_HINT_MS * 2)); + act(() => { + vi.advanceTimersByTime(PLACED_HINT_MS * 2); + }); expect(result.current.shown).toBe(true); act(() => result.current.hold(false)); - act(() => vi.advanceTimersByTime(PLACED_HINT_MS - 1)); + act(() => { + vi.advanceTimersByTime(PLACED_HINT_MS - 1); + }); expect(result.current.shown).toBe(true); - act(() => vi.advanceTimersByTime(1)); + act(() => { + vi.advanceTimersByTime(1); + }); expect(result.current.shown).toBe(false); }); diff --git a/server/src/nest/ferratas/ferratas.service.ts b/server/src/nest/ferratas/ferratas.service.ts index ab9a99d04..fa0f83143 100644 --- a/server/src/nest/ferratas/ferratas.service.ts +++ b/server/src/nest/ferratas/ferratas.service.ts @@ -186,6 +186,9 @@ export class FerratasService { * One Overpass query for `keys`, shared with every request that needs one of * them until it settles. It runs in a request context of its own: it can * outlive the request that started it. + * + * @txStandalone a cache fill: each block is stored whole in its own + * transaction after its own Overpass answer, and a lost one is asked again. */ private batch(keys: readonly string[], now: number): TileBatch { const run = withRequestContext(this.orm, () => this.fetchAndStore(keys, now)); diff --git a/shared/src/i18n/az/tours.ts b/shared/src/i18n/az/tours.ts index 0cb689ee0..93a6f1947 100644 --- a/shared/src/i18n/az/tours.ts +++ b/shared/src/i18n/az/tours.ts @@ -172,8 +172,8 @@ const tours: TranslationStrings = { 'tours.terrain.placeOff': 'Relyefə klikləyib nöqtə qoymaq üçün «Nöqtə qoy» alətini aç.', 'tours.terrain.clickToPlan': 'Nöqtə qoymaq üçün əraziyə klikləyin. Marşrut yarandıqdan sonra onun üzərindən uçmaq və meyilə görə rəngləmək olar.', - 'tours.ferrata.badge': 'Via ferrata {grade}', - 'tours.ferrata.badgeNoGrade': 'Via ferrata', + 'tours.ferrata.badge': 'Via ferrata marşrutu {grade}', + 'tours.ferrata.badgeNoGrade': 'Via ferrata marşrutu', 'tours.ferrata.crossingInfo': 'Marşrut {length} boyunca “{name}” üzərindən keçir. Bunun üçün via ferrata ləvazimatı və təcrübə lazımdır.', 'tours.ferrata.crossingShort': 'Marşrut via ferrata üzərindən keçir', diff --git a/shared/src/i18n/br/tours.ts b/shared/src/i18n/br/tours.ts index 1b8f8e0e3..1ea40e0f1 100644 --- a/shared/src/i18n/br/tours.ts +++ b/shared/src/i18n/br/tours.ts @@ -173,8 +173,8 @@ const tours: TranslationStrings = { 'tours.terrain.placeOff': 'Ative Marcar pontos para clicar pontos no terreno.', 'tours.terrain.clickToPlan': 'Clique no terreno para adicionar pontos. Assim que houver uma rota, ela pode ser sobrevoada e colorida pela inclinação.', - 'tours.ferrata.badge': 'Via ferrata {grade}', - 'tours.ferrata.badgeNoGrade': 'Via ferrata', + 'tours.ferrata.badge': 'Trilha via ferrata {grade}', + 'tours.ferrata.badgeNoGrade': 'Trilha via ferrata', 'tours.ferrata.crossingInfo': 'A rota passa {length} pela “{name}”. Isso exige equipamento de via ferrata e experiência.', 'tours.ferrata.crossingShort': 'A rota passa por uma via ferrata', diff --git a/shared/src/i18n/de/tours.ts b/shared/src/i18n/de/tours.ts index 10c3f7f60..486ba4f05 100644 --- a/shared/src/i18n/de/tours.ts +++ b/shared/src/i18n/de/tours.ts @@ -63,7 +63,7 @@ const tours: TranslationStrings = { 'tours.planner.mapSearch': 'Ort oder Adresse suchen', 'tours.planner.placePoints': 'Punkte setzen', 'tours.planner.pointPlaced': 'Punkt gesetzt', - 'tours.planner.details': 'Details', + 'tours.planner.details': 'Details', // same-as-en 'tours.planner.expandDetails': 'Details einblenden', 'tours.planner.collapseDetails': 'Details ausblenden', 'tours.planner.safetyInfoLabel': 'Hinweis zur Sicherheit', diff --git a/shared/src/i18n/et/tours.ts b/shared/src/i18n/et/tours.ts index 6641d3b15..e275f5815 100644 --- a/shared/src/i18n/et/tours.ts +++ b/shared/src/i18n/et/tours.ts @@ -171,8 +171,8 @@ const tours: TranslationStrings = { 'tours.terrain.placeOff': 'Lülita sisse Lisa punkte, et maastikule klõpsates punkte lisada.', 'tours.terrain.clickToPlan': 'Klõpsa maastikul, et punkte lisada. Kui marsruut on olemas, saab selle üle lennata ja kalde järgi värvida.', - 'tours.ferrata.badge': 'Via ferrata {grade}', - 'tours.ferrata.badgeNoGrade': 'Via ferrata', + 'tours.ferrata.badge': 'Via ferrata rada {grade}', + 'tours.ferrata.badgeNoGrade': 'Via ferrata rada', 'tours.ferrata.crossingInfo': 'Marsruut läbib {length} rajal „{name}“. Selleks on vaja via ferrata varustust ja kogemust.', 'tours.ferrata.crossingShort': 'Marsruut läbib via ferrata raja', diff --git a/shared/src/i18n/fr/tours.ts b/shared/src/i18n/fr/tours.ts index cfa3468ab..7b46a5ffd 100644 --- a/shared/src/i18n/fr/tours.ts +++ b/shared/src/i18n/fr/tours.ts @@ -176,8 +176,8 @@ const tours: TranslationStrings = { 'tours.terrain.placeOff': 'Activez Placer des points pour cliquer des points sur le terrain.', 'tours.terrain.clickToPlan': "Cliquez sur le relief pour placer des points. Dès qu'un itinéraire existe, il peut être survolé et coloré selon la pente.", - 'tours.ferrata.badge': 'Via ferrata {grade}', - 'tours.ferrata.badgeNoGrade': 'Via ferrata', + 'tours.ferrata.badge': 'Parcours via ferrata {grade}', + 'tours.ferrata.badgeNoGrade': 'Parcours via ferrata', 'tours.ferrata.crossingInfo': 'L’itinéraire passe {length} sur « {name} ». Il faut l’équipement de via ferrata et de l’expérience.', 'tours.ferrata.crossingShort': 'L’itinéraire passe par une via ferrata', diff --git a/shared/src/i18n/gr/tours.ts b/shared/src/i18n/gr/tours.ts index ecb2ee1b4..b930f6423 100644 --- a/shared/src/i18n/gr/tours.ts +++ b/shared/src/i18n/gr/tours.ts @@ -180,8 +180,8 @@ const tours: TranslationStrings = { 'tours.terrain.placeOff': 'Ενεργοποίησε την Τοποθέτηση σημείων για να βάζεις σημεία στο έδαφος με κλικ.', 'tours.terrain.clickToPlan': 'Κάνε κλικ στο έδαφος για να ορίσεις σημεία. Μόλις υπάρξει διαδρομή, μπορείς να την πετάξεις και να τη χρωματίσεις κατά κλίση.', - 'tours.ferrata.badge': 'Via ferrata {grade}', - 'tours.ferrata.badgeNoGrade': 'Via ferrata', + 'tours.ferrata.badge': 'Διαδρομή via ferrata {grade}', + 'tours.ferrata.badgeNoGrade': 'Διαδρομή via ferrata', 'tours.ferrata.crossingInfo': 'Η διαδρομή περνά {length} από το «{name}». Χρειάζεσαι εξοπλισμό via ferrata και εμπειρία.', 'tours.ferrata.crossingShort': 'Η διαδρομή περνά από via ferrata', diff --git a/shared/src/i18n/hu/tours.ts b/shared/src/i18n/hu/tours.ts index 2288c123b..d3334db3b 100644 --- a/shared/src/i18n/hu/tours.ts +++ b/shared/src/i18n/hu/tours.ts @@ -174,8 +174,8 @@ const tours: TranslationStrings = { 'tours.terrain.placeOff': 'Kapcsold be a Pontok elhelyezése eszközt, hogy kattintással pontokat tegyél a terepre.', 'tours.terrain.clickToPlan': 'Kattints a terepre pontok elhelyezéséhez. Ha már van útvonal, átrepülheted és meredekség szerint színezheted.', - 'tours.ferrata.badge': 'Via ferrata {grade}', - 'tours.ferrata.badgeNoGrade': 'Via ferrata', + 'tours.ferrata.badge': 'Vasalt út {grade}', + 'tours.ferrata.badgeNoGrade': 'Vasalt út', 'tours.ferrata.crossingInfo': 'Az útvonal {length} hosszan a(z) „{name}” vasalt úton halad. Ehhez via ferrata felszerelés és gyakorlat kell.', 'tours.ferrata.crossingShort': 'Az útvonal vasalt úton halad', diff --git a/shared/src/i18n/id/tours.ts b/shared/src/i18n/id/tours.ts index ea8715985..c3b1073ca 100644 --- a/shared/src/i18n/id/tours.ts +++ b/shared/src/i18n/id/tours.ts @@ -170,8 +170,8 @@ const tours: TranslationStrings = { 'tours.terrain.placeOff': 'Aktifkan Tempatkan titik untuk menaruh titik di medan dengan klik.', 'tours.terrain.clickToPlan': 'Klik medan untuk menambahkan titik. Setelah ada rute, rute itu bisa diterbangi dan diwarnai menurut kemiringan.', - 'tours.ferrata.badge': 'Via ferrata {grade}', - 'tours.ferrata.badgeNoGrade': 'Via ferrata', + 'tours.ferrata.badge': 'Jalur via ferrata {grade}', + 'tours.ferrata.badgeNoGrade': 'Jalur via ferrata', 'tours.ferrata.crossingInfo': 'Rute melewati {length} di “{name}”. Ini butuh perlengkapan via ferrata dan pengalaman.', 'tours.ferrata.crossingShort': 'Rute melewati via ferrata', diff --git a/shared/src/i18n/it/tours.ts b/shared/src/i18n/it/tours.ts index 7e6c2a772..e12ef60fe 100644 --- a/shared/src/i18n/it/tours.ts +++ b/shared/src/i18n/it/tours.ts @@ -173,8 +173,8 @@ const tours: TranslationStrings = { 'tours.terrain.placeOff': 'Attiva Posiziona punti per aggiungere punti sul terreno con un clic.', 'tours.terrain.clickToPlan': "Fai clic sul terreno per aggiungere punti. Appena c'è un percorso, puoi sorvolarlo e colorarlo in base alla pendenza.", - 'tours.ferrata.badge': 'Via ferrata {grade}', - 'tours.ferrata.badgeNoGrade': 'Via ferrata', + 'tours.ferrata.badge': 'Ferrata {grade}', + 'tours.ferrata.badgeNoGrade': 'Ferrata', 'tours.ferrata.crossingInfo': 'Il percorso sale per {length} sulla «{name}». Servono attrezzatura da ferrata ed esperienza.', 'tours.ferrata.crossingShort': 'Il percorso passa per una via ferrata', diff --git a/shared/src/i18n/nl/tours.ts b/shared/src/i18n/nl/tours.ts index 1445700b8..ba416663e 100644 --- a/shared/src/i18n/nl/tours.ts +++ b/shared/src/i18n/nl/tours.ts @@ -63,7 +63,7 @@ const tours: TranslationStrings = { 'tours.planner.mapSearch': 'Zoek plaats of adres', 'tours.planner.placePoints': 'Punten plaatsen', 'tours.planner.pointPlaced': 'Punt geplaatst', - 'tours.planner.details': 'Details', + 'tours.planner.details': 'Details', // same-as-en 'tours.planner.expandDetails': 'Details tonen', 'tours.planner.collapseDetails': 'Details verbergen', 'tours.planner.safetyInfoLabel': 'Over veiligheid', @@ -171,8 +171,8 @@ const tours: TranslationStrings = { 'tours.terrain.placeOff': 'Zet Punten plaatsen aan om punten op het terrein te klikken.', 'tours.terrain.clickToPlan': 'Klik in het terrein om punten te zetten. Zodra er een route is, kun je eroverheen vliegen en hem op helling kleuren.', - 'tours.ferrata.badge': 'Via ferrata {grade}', - 'tours.ferrata.badgeNoGrade': 'Via ferrata', + 'tours.ferrata.badge': 'Klettersteig {grade}', + 'tours.ferrata.badgeNoGrade': 'Klettersteig', 'tours.ferrata.crossingInfo': 'De route loopt {length} over „{name}”. Daarvoor heb je via-ferratamateriaal en ervaring nodig.', 'tours.ferrata.crossingShort': 'De route loopt over een via ferrata', diff --git a/shared/src/i18n/pl/tours.ts b/shared/src/i18n/pl/tours.ts index a4dee442c..f61379854 100644 --- a/shared/src/i18n/pl/tours.ts +++ b/shared/src/i18n/pl/tours.ts @@ -175,8 +175,8 @@ const tours: TranslationStrings = { 'tours.terrain.placeOff': 'Włącz Ustawiaj punkty, aby klikaniem dodawać punkty w terenie.', 'tours.terrain.clickToPlan': 'Kliknij teren, aby dodać punkty. Gdy powstanie trasa, można nad nią przelecieć i pokolorować ją według nachylenia.', - 'tours.ferrata.badge': 'Via ferrata {grade}', - 'tours.ferrata.badgeNoGrade': 'Via ferrata', + 'tours.ferrata.badge': 'Ferrata {grade}', + 'tours.ferrata.badgeNoGrade': 'Ferrata', 'tours.ferrata.crossingInfo': 'Trasa prowadzi {length} przez „{name}”. Potrzebny jest sprzęt do via ferraty i doświadczenie.', 'tours.ferrata.crossingShort': 'Trasa prowadzi przez via ferratę', diff --git a/shared/src/i18n/sv/tours.ts b/shared/src/i18n/sv/tours.ts index 1d6d3d43f..07656f8dc 100644 --- a/shared/src/i18n/sv/tours.ts +++ b/shared/src/i18n/sv/tours.ts @@ -169,8 +169,8 @@ const tours: TranslationStrings = { 'tours.terrain.placeOff': 'Slå på Sätt punkter för att klicka ut punkter i terrängen.', 'tours.terrain.clickToPlan': 'Klicka i terrängen för att sätta ut punkter. När det finns en rutt kan du flyga över den och färga den efter lutning.', - 'tours.ferrata.badge': 'Via ferrata {grade}', - 'tours.ferrata.badgeNoGrade': 'Via ferrata', + 'tours.ferrata.badge': 'Via ferrata-led {grade}', + 'tours.ferrata.badgeNoGrade': 'Via ferrata-led', 'tours.ferrata.crossingInfo': 'Rutten går {length} längs ”{name}”. Det kräver via ferrata-utrustning och erfarenhet.', 'tours.ferrata.crossingShort': 'Rutten går längs en via ferrata', 'tours.ferrata.waypointAtEnd': 'Början eller slutet av ”{name}”', diff --git a/shared/src/i18n/tr/tours.ts b/shared/src/i18n/tr/tours.ts index 4f539c8a8..74d175cb9 100644 --- a/shared/src/i18n/tr/tours.ts +++ b/shared/src/i18n/tr/tours.ts @@ -170,8 +170,8 @@ const tours: TranslationStrings = { 'tours.terrain.placeOff': 'Araziye tıklayarak nokta koymak için Nokta koy aracını aç.', 'tours.terrain.clickToPlan': 'Nokta eklemek için araziye tıklayın. Bir rota oluştuğunda üzerinden uçabilir ve eğime göre renklendirebilirsiniz.', - 'tours.ferrata.badge': 'Via ferrata {grade}', - 'tours.ferrata.badgeNoGrade': 'Via ferrata', + 'tours.ferrata.badge': 'Via ferrata rotası {grade}', + 'tours.ferrata.badgeNoGrade': 'Via ferrata rotası', 'tours.ferrata.crossingInfo': 'Rota {length} boyunca “{name}” üzerinden geçiyor. Bunun için via ferrata ekipmanı ve deneyim gerekir.', 'tours.ferrata.crossingShort': 'Rota bir via ferrata üzerinden geçiyor', diff --git a/shared/src/i18n/vi/tours.ts b/shared/src/i18n/vi/tours.ts index 091dad6be..ced3ff09b 100644 --- a/shared/src/i18n/vi/tours.ts +++ b/shared/src/i18n/vi/tours.ts @@ -170,8 +170,8 @@ const tours: TranslationStrings = { 'tours.terrain.placeOff': 'Bật Đặt điểm để nhấp đặt điểm trên địa hình.', 'tours.terrain.clickToPlan': 'Nhấp vào địa hình để đặt điểm. Khi đã có tuyến đường, bạn có thể bay qua và tô màu theo độ dốc.', - 'tours.ferrata.badge': 'Via ferrata {grade}', - 'tours.ferrata.badgeNoGrade': 'Via ferrata', + 'tours.ferrata.badge': 'Tuyến via ferrata {grade}', + 'tours.ferrata.badgeNoGrade': 'Tuyến via ferrata', 'tours.ferrata.crossingInfo': 'Tuyến đi qua “{name}” dài {length}. Cần trang bị via ferrata và kinh nghiệm.', 'tours.ferrata.crossingShort': 'Tuyến đi qua một via ferrata', 'tours.ferrata.waypointAtEnd': 'Điểm đầu hoặc cuối của “{name}”',