Contact Map
The map displays all your geolocated contacts on a modern, interactive vector map. It is the field visit tool: a rabbi, a volunteer, a coordinator can spot in seconds the members they haven't seen in a long time, prepare an optimized route, export the itinerary to Google Maps or print a paper field sheet.
Access it from the Contacts menu β Map, or via the URL
/app/contact/maps.
The screen at a glanceβ
On desktop, the interface consists of three columns:
| Column | Purpose |
|---|---|
| Left β Filters | Coloring mode, display switches, search, categories, sectors. |
| Center β The map | Fullscreen vector map with markers, GPS location, organization head office and active plan polyline. |
| Right β Visit plan | Reorderable list of selected stops, estimated distance/duration, Optimize / Export / Save buttons. |
At the top of the page, the SubHeader bar groups the main actions: contact search (autocomplete), My plans, My location, Organization, See all, and a colored New plan button.
The mapβ
Tiles and styleβ
Rendering uses MapLibre GL JS with the OpenFreeMap Positron style: clean light background, readable labels at every scale, no ads or watermarks. The map centers by default on your organization's head office at zoom level 14 (neighborhood).
The markersβ
Each geocoded address of a contact becomes a pin on the map. The pin takes the color determined by the active coloring mode (see below).
| Case | Appearance |
|---|---|
| Single contact | Uniform color pin, white outline |
| Address shared by several contacts | Pin with a small counter circle in the top-right showing the number of contacts (e.g. 3) |
| Contact added to the current plan | Pink magenta circle numbered (order in the tour) β replaces the classic pin |
| Organization head office | Special pin with your organization's logo |
| Your GPS location | Pulsing blue circle with direction indicator if available |
A click on a pin opens the detail popup. If the pin contains several contacts, the multi popup lists the present members and lets you pick one to view their profile.
Automatic and progressive geocodingβ
To position a contact, the postal address (street + postal code + city + country) is sent to a geocoding service. The latitude/longitude found is stored on the server side for subsequent visits β no need to recompute on each load.
On the first display, a progress badge appears at the top-left of the
map (Geolocation 240/850). Contacts already geocoded show up immediately;
the rest appear progressively (4 parallel requests).
The filtersβ
Coloring modeβ
Choose one mode out of five, in the left panel:
| Mode | Color logic |
|---|---|
| Last visit | Green (< 3 months), orange (3-6 months), purple (> 6 months), red (never visited) |
| Last interaction (all sources) | Same palette, but takes into account visits + payments + form submissions + recorded interactions |
| By category | Deterministic palette per category (each category always gets the same HSL hue) |
| By sector | Same but on the contact's route / sector field |
| Family status | Gray (deceased), blue (new), yellow (starred), green otherwise |
A legend at the bottom-left of the map recaps the meaning of the colors. It adapts to the active mode (in Category / Sector mode, it lists visible categories with their hue).
Autocompleted searchβ
The Search field below the coloring mode offers grouped autocompletion in 4 categories:
- People:
First Last name(with counter if several addresses) - Cities:
Paris(with number of contacts in the city) - Postal codes:
75011 - Addresses:
12 rue de Rivoli
Type 1+ character to see suggestions; click a suggestion to filter the map. The search is accent-insensitive and case-insensitive (NFD normalization).
Multi-select on categories and sectorsβ
The two blocks Categories and Sectors are multi-select pickers. The logic is "at least one": a contact is displayed if they carry at least one of the selected categories AND belong to at least one of the selected sectors.
Each option shows the count of relevant contacts
(Regular donors (87)), recomputed on each reload.
Display switchesβ
| Switch | Effect |
|---|---|
| Show only heads of household | Displays only one marker per household, the head. Avoids pin stacking at the same address. |
| Hide organization marker | Hides the pin with your organization's logo. |
Tip: "Create a plan with visible contacts"β
If your filters narrow the display to 2 to 50 contacts, a blue panel at the bottom of the filters offers "Create an optimized plan with these contacts β ". One click adds all visible contacts to the plan and launches the automatic optimization.
Beyond 50, the panel shows a hint inviting you to refine the filters (limit imposed by the optimization API).
A contact's popupβ
Clicking on a pin opens a popup summarizing:
- Avatar (title icon, status color) + First and last name (link to profile)
- Last visit chip:
Seen 2 months ago/Never visited(color consistent with the palette) - Full address + label (
Primary,Office,Second home...) - Address note if any (floor, entry code, instructions)
- 3 main action buttons:
- Navigate β opens Google Maps, Waze or Apple Maps (the choice is offered on desktop)
- Add a visit β opens the add-interaction modal
- Open profile β opens the full profile
In plan mode, an extra Add to plan / Remove from plan button appears.
Multi-contact popupβ
When several contacts share the same address (a family in one home), the popup shows the list of all members with their title icon. Click on a member to see their detailed profile.
GPS locationβ
If you allow location sharing in the browser, a pulsing blue marker
appears at your position. It is refreshed continuously via
navigator.geolocation.watchPosition.
The My location button in the SubHeader (and the compass FAB on mobile) recenters the map on you at zoom 15 (street).
Prepare a visit planβ
A visit plan is an ordered route of contacts to visit one after the other, with computed distance/duration and optionally saved in the database. It is the modern equivalent of the old Leaflet "tours".
Create a plan in selection modeβ
- Click New plan in the SubHeader (
routeicon). - The map switches to selection mode; the right-side Visit plan panel appears.
- Click on pins to add them to the plan. Each selected marker becomes a numbered pink circle indicating its current order.
- Once you have at least 2 stops, the Compute itinerary button draws a polyline connecting all points and shows estimated distance + duration at the top of the panel.
- Click Optimize (magic wand icon) to reorder stops via TSP
(
POST /contact/route/optimize, OpenRouteService). - Drag & drop in the list to reorder manually if needed (numbers update in real time).
- Travel profile: On foot, By bike or By car (changes the computed distance and duration).
Export or printβ
The Export button offers two formats:
| Format | Behavior |
|---|---|
| Google Maps | Opens a new tab with a multi-stop Google Maps itinerary ready to navigate (Google limit: ~10 stops per URL, beyond that the export truncates) |
| PDF (print) | Shows a printable field sheet with an image of the current map, numbered list of stops, distance / duration. Use "Save as PDF" from your browser in the print dialog. |
Save the planβ
The Save button (disk icon) opens a modal to name the plan and add a description. Once saved, the plan appears in My visit plans (see Visit plans) and can be:
- Reopened on the map with its stops preselected
- Started in field mode on the mobile app
- Renamed, duplicated or deleted
Without saving, the plan stays ephemeral (lost on the next page reload).
The map on mobileβ
The mobile app offers a fullscreen experience specifically designed for the field.
Fullscreen layoutβ
No top toolbar: the map takes the whole window. A stack of floating FABs on the right gives access to the actions:
| FAB | Role |
|---|---|
list-checks | Opens My visit plans |
filter | Opens the filters BottomSheet |
search | Opens contact search (SearchContact modal) |
compass | Grouped menu: My location / Organization / See all |
route (large, colored) | New visit plan (toggles selection mode) |
BottomSheetsβ
Tapping a marker opens a full-width BottomSheet (instead of a centered popup) with the main actions (Navigate, Add a visit, Open profile). The sheet closes by sliding down.
The filter FAB opens a sheet equivalent to the desktop filter panel: coloring mode, switches, search, multi-select.
Active navigation modeβ
When you start a plan (from your plans list or directly by selecting
contacts then tapping Optimize & start), the app switches to the
Active plan screen (/mobile/contacts/tournee-active). See
Visit plans for details on field mode (real-time
ETA, "Visit done" sheet, voice notes).
Typical use casesβ
Prepare the weekly tourβ
- Coloring mode: Last visit.
- Spot all red pins (never seen) and purple ones (> 6 months) in your neighborhood.
- Click New plan then select 6 to 10 contacts.
- Optimize β the order is reorganized to minimize the on-foot distance.
- Save under the name
Thursday tour. - On the day, open the mobile app β My plans β Start.
Spot contacts in a neighborhoodβ
- Type the postal code or city in the search (autocompleted).
- The map filters instantly to that area's contacts.
- Hover the red pins to identify priority contacts.
Target a categoryβ
- Coloring mode: By category.
- Select
Elderlyin the Categories filter. - The map shows only these contacts, each colored by their main category; the legend at the bottom-left recalls who is who.
Identify incomplete addressesβ
When the geolocation badge stops (240 / 850), check the ratio: if you
have 850 contacts in your base but only 720 on the map, you know there are
130 missing β usually because of empty or non-geocodable addresses.
Guided tourβ
The page includes a guided tour of 10 steps (pulsing "Discover this page" button in the header). It covers the full workflow: filters, coloring, popup, clusters, plan creation, optimization, export, save.
On mobile, a separate tour of 8 steps guides the user through the fullscreen environment (FAB, BottomSheets, selection mode).
See Guided tours for details on the system.
Limitationsβ
- Geocoding: depends on address quality. Very old, foreign or very specific addresses (hamlets) may not be found.
- TSP optimization: capped at 50 stops per plan (free OpenRouteService quota). For a longer route, split into multiple plans.
- Optimization quota: 2,500 calls / day per ORS account, across all users. Beyond that, the Optimize button returns an error until the next day.
- Itinerary: does not account for real-time traffic, closures, updated one-way streets. It is an indicative path that helps you visualize and export β use Google Maps or Waze for actual navigation.
- GPS location: accuracy and latency depend on the browser; on Android without "Precise location" permission, accuracy can drop to several hundred meters.
- PDF export: uses the browser's print function; the final rendering depends on the print engine (Chrome, Safari, Firefox).