feat(import): selective GPX/KML element import and performance improvements

Add type-selector UI in the file import modal letting users choose which
GPX elements (waypoints, routes, tracks) or KML/KMZ elements (points,
paths) to import. KML LineString placemarks are now imported as path
places with route_geometry.

Performance improvements:
- Extract MemoPlaceRow with React.memo and contentVisibility:auto to cut
  unnecessary re-renders in PlacesSidebar
- Add weatherQueue to cap concurrent weather fetches at 3
- Replace sequential per-place deletes with a single bulkDelete API call
  (new DELETE /places/bulk endpoint + deletePlacesMany service)
- Memoize atlas/photo/weather service calls to avoid redundant requests
- Add multi-select mode to PlacesSidebar for bulk operations

Add large GPX/KML/KMZ fixtures for integration/perf testing and two
profiler analysis scripts under scripts/.
This commit is contained in:
jubnl
2026-04-18 01:28:37 +02:00
parent 9a31fcac7b
commit 6a718fccea
45 changed files with 22471 additions and 285 deletions
@@ -134,6 +134,8 @@ describe('fetchPhoto — in-flight deduplication', () => {
svc.fetchPhoto('k', 'pid', undefined, undefined, undefined, cb1);
svc.fetchPhoto('k', 'pid', undefined, undefined, undefined, cb2);
// acquireRequestSlot() is async (Promise.resolve), so flush microtasks before asserting
await flush();
expect(mockPlacePhoto).toHaveBeenCalledTimes(1);
resolve({ photoUrl: 'https://example.com/photo.jpg' });