@fieldia/map 0.15.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -11
- package/package.json +4 -4
- package/src/index.d.mts +2 -1
- package/src/index.d.ts +2 -1
- package/src/index.js +3 -1
- package/src/index.js.map +1 -1
- package/src/index.mjs +1 -0
- package/src/index.mjs.map +1 -1
- package/src/lib/answers.d.mts +17 -0
- package/src/lib/answers.d.ts +17 -0
- package/src/lib/answers.js +27 -0
- package/src/lib/answers.js.map +1 -0
- package/src/lib/answers.mjs +21 -0
- package/src/lib/answers.mjs.map +1 -0
- package/src/lib/card.d.mts +10 -2
- package/src/lib/card.d.ts +10 -2
- package/src/lib/card.js +13 -4
- package/src/lib/card.js.map +1 -1
- package/src/lib/card.mjs +13 -4
- package/src/lib/card.mjs.map +1 -1
- package/src/lib/form-map.d.mts +16 -0
- package/src/lib/form-map.d.ts +16 -0
- package/src/lib/form-map.js +525 -0
- package/src/lib/form-map.js.map +1 -0
- package/src/lib/form-map.mjs +522 -0
- package/src/lib/form-map.mjs.map +1 -0
- package/src/lib/labels.d.mts +13 -0
- package/src/lib/labels.d.ts +13 -0
- package/src/lib/labels.js +12 -1
- package/src/lib/labels.js.map +1 -1
- package/src/lib/labels.mjs +10 -0
- package/src/lib/labels.mjs.map +1 -1
- package/src/lib/list-view.js +48 -65
- package/src/lib/list-view.js.map +1 -1
- package/src/lib/list-view.mjs +42 -59
- package/src/lib/list-view.mjs.map +1 -1
- package/src/lib/map-core.js +22 -2
- package/src/lib/map-core.js.map +1 -1
- package/src/lib/map-core.mjs +22 -2
- package/src/lib/map-core.mjs.map +1 -1
- package/src/lib/marks.d.mts +34 -0
- package/src/lib/marks.d.ts +34 -0
- package/src/lib/marks.js +56 -0
- package/src/lib/marks.js.map +1 -0
- package/src/lib/marks.mjs +49 -0
- package/src/lib/marks.mjs.map +1 -0
- package/src/lib/pins.d.mts +2 -0
- package/src/lib/pins.d.ts +2 -0
- package/src/lib/pins.js +5 -1
- package/src/lib/pins.js.map +1 -1
- package/src/lib/pins.mjs +3 -1
- package/src/lib/pins.mjs.map +1 -1
- package/src/lib/providers.d.mts +27 -3
- package/src/lib/providers.d.ts +27 -3
- package/src/lib/providers.js +69 -67
- package/src/lib/providers.js.map +1 -1
- package/src/lib/providers.mjs +17 -15
- package/src/lib/providers.mjs.map +1 -1
- package/src/lib/route-line.d.mts +34 -0
- package/src/lib/route-line.d.ts +34 -0
- package/src/lib/route-line.js +53 -0
- package/src/lib/route-line.js.map +1 -0
- package/src/lib/route-line.mjs +47 -0
- package/src/lib/route-line.mjs.map +1 -0
- package/src/lib/routes.d.mts +28 -0
- package/src/lib/routes.d.ts +28 -0
- package/src/lib/routes.js +112 -0
- package/src/lib/routes.js.map +1 -0
- package/src/lib/routes.mjs +105 -0
- package/src/lib/routes.mjs.map +1 -0
- package/src/lib/settings.d.mts +5 -3
- package/src/lib/settings.d.ts +5 -3
- package/src/lib/styles.d.mts +9 -1
- package/src/lib/styles.d.ts +9 -1
- package/src/lib/styles.js +42 -3
- package/src/lib/styles.js.map +1 -1
- package/src/lib/styles.mjs +40 -2
- package/src/lib/styles.mjs.map +1 -1
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
import { compileModifier, expressionContext } from '@fieldia/core';
|
|
2
|
+
import { drawCard } from './card.mjs';
|
|
3
|
+
import { readPoint } from './geo.mjs';
|
|
4
|
+
import { fill, formMapLabels } from './labels.mjs';
|
|
5
|
+
import { createMapBox, warnOnce } from './map-core.mjs';
|
|
6
|
+
import { anchor, byKeys, MOVE_KEYS, onPress, popCard, SIZED_BY_FACE } from './marks.mjs';
|
|
7
|
+
import { comma, makePins, shown } from './pins.mjs';
|
|
8
|
+
import { nearestOnLine, pointAlong, routeLine, splitLine } from './route-line.mjs';
|
|
9
|
+
import { installFormMapStyles } from './styles.mjs';
|
|
10
|
+
/**
|
|
11
|
+
* A map on a form (`type: "map"`), for the viewer's `maps`: the record's
|
|
12
|
+
* places as layers. A layer is the record's own place (a kitchen, a door, a
|
|
13
|
+
* courier), a place for each of its lines (a round's stops), a route along
|
|
14
|
+
* the roads between them, or the reader's own place. Pins are drawn as a
|
|
15
|
+
* list's map draws them. A place that moves glides to each new position —
|
|
16
|
+
* along its route when it is on one — says when it was last seen once its
|
|
17
|
+
* news is old, and is followed until the person moves the map. A route's
|
|
18
|
+
* part already travelled fades, and its time and distance left are written
|
|
19
|
+
* into the record's fields the page names.
|
|
20
|
+
*
|
|
21
|
+
* mountViewer(host, { page, maps: mapParts({ provider }) })
|
|
22
|
+
*/
|
|
23
|
+
export function mapParts(settings) {
|
|
24
|
+
return (context) => formMap(settings, context);
|
|
25
|
+
}
|
|
26
|
+
/** How long a pin takes to glide to its new place, in milliseconds. */
|
|
27
|
+
const GLIDE_MS = 900;
|
|
28
|
+
/** A traveller this far from their route, in metres, has left it: a new one is asked for. */
|
|
29
|
+
const OFF_ROUTE_M = 60;
|
|
30
|
+
/** A route is asked for again at most this often, in milliseconds, however its traveller wanders. */
|
|
31
|
+
const ROUTE_EVERY_MS = 10_000;
|
|
32
|
+
/** Room kept round the places when the map fits them, in pixels. */
|
|
33
|
+
const ROOM = 48;
|
|
34
|
+
function formMap(settings, context) {
|
|
35
|
+
const { node, page, form, document: doc, locale } = context;
|
|
36
|
+
installFormMapStyles(doc);
|
|
37
|
+
const labels = formMapLabels(locale, settings.labels?.[locale]);
|
|
38
|
+
const element = doc.createElement('div');
|
|
39
|
+
element.className = 'fd-map-form';
|
|
40
|
+
if (node.label) {
|
|
41
|
+
const heading = doc.createElement('p');
|
|
42
|
+
heading.className = 'fd-map-form-label';
|
|
43
|
+
heading.textContent = node.label;
|
|
44
|
+
element.append(heading);
|
|
45
|
+
}
|
|
46
|
+
const box = createMapBox({
|
|
47
|
+
document: doc,
|
|
48
|
+
provider: settings.provider,
|
|
49
|
+
locale,
|
|
50
|
+
labels,
|
|
51
|
+
name: node.label ?? labels.map,
|
|
52
|
+
keys: labels.pinKeys,
|
|
53
|
+
center: settings.center,
|
|
54
|
+
zoom: settings.zoom,
|
|
55
|
+
height: node.height ?? 360,
|
|
56
|
+
});
|
|
57
|
+
element.append(box.element);
|
|
58
|
+
const note = doc.createElement('p');
|
|
59
|
+
note.className = 'fd-map-list-note';
|
|
60
|
+
note.setAttribute('role', 'status');
|
|
61
|
+
note.hidden = true;
|
|
62
|
+
const followButton = doc.createElement('button');
|
|
63
|
+
followButton.type = 'button';
|
|
64
|
+
followButton.className = 'fd-map-here fd-map-follow';
|
|
65
|
+
followButton.textContent = labels.follow;
|
|
66
|
+
followButton.hidden = true;
|
|
67
|
+
const me = node.layers.find((layer) => layer.myLocation);
|
|
68
|
+
const locate = doc.createElement('button');
|
|
69
|
+
locate.type = 'button';
|
|
70
|
+
locate.className = 'fd-map-locate';
|
|
71
|
+
locate.setAttribute('aria-label', labels.myLocation);
|
|
72
|
+
locate.title = labels.myLocation;
|
|
73
|
+
locate.setAttribute('aria-pressed', 'false');
|
|
74
|
+
locate.innerHTML = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 2v3M12 19v3M2 12h3M19 12h3"/></svg>';
|
|
75
|
+
const reduced = !!doc.defaultView?.matchMedia?.('(prefers-reduced-motion: reduce)').matches;
|
|
76
|
+
// ---- each layer's pins, from the record's fields or its lines' ---------------------
|
|
77
|
+
const pinsOf = new Map();
|
|
78
|
+
for (const layer of node.layers) {
|
|
79
|
+
if (layer.point === undefined && layer.latitude === undefined)
|
|
80
|
+
continue;
|
|
81
|
+
const lineFields = layer.lines ? page.fields[layer.lines].fields : undefined;
|
|
82
|
+
const scope = lineFields ? { ...page, fields: lineFields } : page;
|
|
83
|
+
pinsOf.set(layer.id, { pins: makePins({ document: doc, page: scope, locale, pin: layer.pin ?? {}, title: layer.card?.title ?? '', icons: context.icons, drawers: settings.pins }), scope });
|
|
84
|
+
}
|
|
85
|
+
const hidden = new Map(node.layers.filter((layer) => typeof layer.invisible === 'string' || layer.invisible === true).map((layer) => [layer.id, compileModifier(layer.invisible)]));
|
|
86
|
+
const placeOf = (layer, values) => {
|
|
87
|
+
if (layer.point)
|
|
88
|
+
return readPoint(values[layer.point]);
|
|
89
|
+
const lat = values[layer.latitude];
|
|
90
|
+
const lng = values[layer.longitude];
|
|
91
|
+
return typeof lat === 'number' && typeof lng === 'number' && Math.abs(lat) <= 90 && Math.abs(lng) <= 180 ? { lat, lng } : null;
|
|
92
|
+
};
|
|
93
|
+
/** Every place on the map now: each layer's own, or each of its lines'. */
|
|
94
|
+
function placesNow(values) {
|
|
95
|
+
const context = expressionContext(values, page.fields);
|
|
96
|
+
return node.layers.flatMap((layer) => {
|
|
97
|
+
if (!pinsOf.has(layer.id) || hidden.get(layer.id)?.evaluate(context))
|
|
98
|
+
return [];
|
|
99
|
+
if (!layer.lines) {
|
|
100
|
+
const at = placeOf(layer, values);
|
|
101
|
+
return at ? [{ key: layer.id, layer, record: { id: layer.id, values }, at }] : [];
|
|
102
|
+
}
|
|
103
|
+
const lines = values[layer.lines] ?? [];
|
|
104
|
+
return lines.flatMap((line) => {
|
|
105
|
+
const at = placeOf(layer, line.values);
|
|
106
|
+
return at ? [{ key: `${layer.id}:${line.key}`, layer, record: { id: line.id ?? line.key, values: line.values }, at }] : [];
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/** A pin's name: its layer's words, then what the pin says ("Courier, 4 min"). */
|
|
111
|
+
function nameOf(place) {
|
|
112
|
+
const scope = pinsOf.get(place.layer.id).scope;
|
|
113
|
+
const title = place.layer.card?.title ? shown(scope, place.layer.card.title, place.record.values, locale) : '';
|
|
114
|
+
const said = place.layer.pin?.label ? shown(scope, place.layer.pin.label, place.record.values, locale) : '';
|
|
115
|
+
return [place.layer.label, title, said].filter(Boolean).join(comma(locale)) || place.layer.id;
|
|
116
|
+
}
|
|
117
|
+
// ---- the person's own moves, after which a followed place is followed no more -------
|
|
118
|
+
let moving = false;
|
|
119
|
+
let userMoved = false;
|
|
120
|
+
const pressed = (event) => {
|
|
121
|
+
if (!event.target?.closest('.leaflet-marker-icon, .leaflet-popup, .fd-map-follow, .fd-map-locate, .fd-map-credits, .fd-map-logo'))
|
|
122
|
+
moving = true;
|
|
123
|
+
};
|
|
124
|
+
const keyed = (event) => {
|
|
125
|
+
if (event.target === box.element && MOVE_KEYS.has(event.key))
|
|
126
|
+
moving = true;
|
|
127
|
+
};
|
|
128
|
+
const wheeled = (event) => {
|
|
129
|
+
if (event.ctrlKey || event.metaKey)
|
|
130
|
+
moving = true;
|
|
131
|
+
};
|
|
132
|
+
box.element.addEventListener('pointerdown', pressed, { capture: true });
|
|
133
|
+
box.element.addEventListener('keydown', keyed, { capture: true });
|
|
134
|
+
box.element.addEventListener('wheel', wheeled, { capture: true, passive: true });
|
|
135
|
+
const following = node.layers.some((layer) => layer.live?.follow);
|
|
136
|
+
// ---- drawing -----------------------------------------------------------------------
|
|
137
|
+
const marks = new Map();
|
|
138
|
+
const routes = new Map();
|
|
139
|
+
let values = {};
|
|
140
|
+
let fitted = false;
|
|
141
|
+
let destroyed = false;
|
|
142
|
+
let openCard = null;
|
|
143
|
+
let mine = null;
|
|
144
|
+
let meMark = null;
|
|
145
|
+
let meCircle = null;
|
|
146
|
+
let watching = null;
|
|
147
|
+
function draw(map, L) {
|
|
148
|
+
const now = placesNow(values);
|
|
149
|
+
const seen = new Set();
|
|
150
|
+
for (const place of now) {
|
|
151
|
+
seen.add(place.key);
|
|
152
|
+
const face = pinsOf.get(place.layer.id).pins.face(place.record);
|
|
153
|
+
const html = face.element.outerHTML;
|
|
154
|
+
const name = nameOf(place);
|
|
155
|
+
const mark = marks.get(place.key);
|
|
156
|
+
if (!mark) {
|
|
157
|
+
const marker = L.marker([place.at.lat, place.at.lng], { icon: L.divIcon({ className: `fd-map-mark ${anchor(face)}`, html: face.element, iconSize: SIZED_BY_FACE }), keyboard: true, riseOnHover: true }).addTo(map);
|
|
158
|
+
const made = { marker, layer: place.layer, at: place.at, html, name, movedAt: Date.now() };
|
|
159
|
+
marks.set(place.key, made);
|
|
160
|
+
marker.getElement()?.setAttribute('aria-label', name);
|
|
161
|
+
const height = face.stands === 'foot' ? face.height : face.height / 2;
|
|
162
|
+
if (place.layer.card)
|
|
163
|
+
onPress(marker, (event) => showCard(map, L, place.key, height, byKeys(event)));
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (html !== mark.html) {
|
|
167
|
+
mark.marker.setIcon(L.divIcon({ className: `fd-map-mark ${anchor(face)}`, html: face.element, iconSize: SIZED_BY_FACE }));
|
|
168
|
+
mark.html = html;
|
|
169
|
+
}
|
|
170
|
+
mark.name = name;
|
|
171
|
+
if (mark.at.lat !== place.at.lat || mark.at.lng !== place.at.lng) {
|
|
172
|
+
mark.at = place.at;
|
|
173
|
+
mark.movedAt = Date.now();
|
|
174
|
+
if (place.layer.live && !reduced)
|
|
175
|
+
glide(map, place.key, mark);
|
|
176
|
+
else {
|
|
177
|
+
mark.marker.setLatLng([place.at.lat, place.at.lng]);
|
|
178
|
+
follow(map, mark);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
for (const [key, mark] of marks) {
|
|
183
|
+
if (seen.has(key))
|
|
184
|
+
continue;
|
|
185
|
+
if (mark.glide)
|
|
186
|
+
cancelAnimationFrame(mark.glide);
|
|
187
|
+
mark.marker.remove();
|
|
188
|
+
marks.delete(key);
|
|
189
|
+
}
|
|
190
|
+
restale();
|
|
191
|
+
drawRoutes(map, L);
|
|
192
|
+
if (!fitted)
|
|
193
|
+
fit(map);
|
|
194
|
+
}
|
|
195
|
+
function fit(map) {
|
|
196
|
+
const points = [...[...marks.values()].map((m) => m.at), ...[...routes.values()].flatMap((r) => r.found?.line ?? []), ...(mine ? [mine.at] : [])];
|
|
197
|
+
if (!points.length)
|
|
198
|
+
return;
|
|
199
|
+
fitted = true;
|
|
200
|
+
if (points.length === 1)
|
|
201
|
+
map.setView([points[0].lat, points[0].lng], Math.max(map.getZoom(), 15), { animate: false });
|
|
202
|
+
else
|
|
203
|
+
map.fitBounds(points.map((p) => [p.lat, p.lng]), { padding: [ROOM, ROOM], maxZoom: 16, animate: false });
|
|
204
|
+
}
|
|
205
|
+
/** A moving place glides to its new spot: along its route when it is on it, else straight. */
|
|
206
|
+
function glide(map, key, mark) {
|
|
207
|
+
if (mark.glide)
|
|
208
|
+
cancelAnimationFrame(mark.glide);
|
|
209
|
+
const from = mark.marker.getLatLng();
|
|
210
|
+
const to = mark.at;
|
|
211
|
+
const path = routes.get(routeLayerFrom(key) ?? '')?.found?.path;
|
|
212
|
+
let at = (t) => ({ lat: from.lat + (to.lat - from.lat) * t, lng: from.lng + (to.lng - from.lng) * t });
|
|
213
|
+
if (path) {
|
|
214
|
+
const a = nearestOnLine(path, from);
|
|
215
|
+
const b = nearestOnLine(path, to);
|
|
216
|
+
if (a.off < OFF_ROUTE_M && b.off < OFF_ROUTE_M && b.along >= a.along)
|
|
217
|
+
at = (t) => pointAlong(path, a.along + (b.along - a.along) * t);
|
|
218
|
+
}
|
|
219
|
+
const start = performance.now();
|
|
220
|
+
const step = (time) => {
|
|
221
|
+
const t = Math.min(1, (time - start) / GLIDE_MS);
|
|
222
|
+
// Eased in and out, as a thing that moves does.
|
|
223
|
+
const eased = t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2;
|
|
224
|
+
const place = t < 1 ? at(eased) : to;
|
|
225
|
+
mark.marker.setLatLng([place.lat, place.lng]);
|
|
226
|
+
if (t < 1)
|
|
227
|
+
mark.glide = requestAnimationFrame(step);
|
|
228
|
+
else {
|
|
229
|
+
mark.glide = undefined;
|
|
230
|
+
follow(map, mark);
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
mark.glide = requestAnimationFrame(step);
|
|
234
|
+
}
|
|
235
|
+
/** The route that starts at a layer's place: its traveller's. */
|
|
236
|
+
const routeLayerFrom = (key) => node.layers.find((layer) => layer.route?.from === key)?.id;
|
|
237
|
+
/** A followed place kept in view, until the person moves the map. */
|
|
238
|
+
function follow(map, mark) {
|
|
239
|
+
if (!mark.layer.live?.follow || userMoved || destroyed)
|
|
240
|
+
return;
|
|
241
|
+
map.panInside(mark.marker.getLatLng(), { padding: [ROOM, ROOM] });
|
|
242
|
+
}
|
|
243
|
+
/** A place whose news is old says when it was last seen, in the page's language, and greys. */
|
|
244
|
+
function restale() {
|
|
245
|
+
const words = new Intl.RelativeTimeFormat(locale, { numeric: 'always' });
|
|
246
|
+
for (const mark of marks.values()) {
|
|
247
|
+
const after = mark.layer.live?.staleAfter;
|
|
248
|
+
const icon = mark.marker.getElement();
|
|
249
|
+
const face = icon?.querySelector('.fd-map-face');
|
|
250
|
+
if (!after || !icon || !face)
|
|
251
|
+
continue;
|
|
252
|
+
const seconds = (Date.now() - mark.movedAt) / 1000;
|
|
253
|
+
const stale = seconds > after;
|
|
254
|
+
face.toggleAttribute('data-stale', stale);
|
|
255
|
+
let badge = face.querySelector('.fd-map-face-stale');
|
|
256
|
+
if (!stale) {
|
|
257
|
+
badge?.remove();
|
|
258
|
+
icon.setAttribute('aria-label', mark.name);
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
const minutes = Math.max(1, Math.round(seconds / 60));
|
|
262
|
+
const time = minutes < 90 ? words.format(-minutes, 'minute') : words.format(-Math.round(minutes / 60), 'hour');
|
|
263
|
+
if (!badge) {
|
|
264
|
+
badge = doc.createElement('span');
|
|
265
|
+
badge.className = 'fd-map-face-stale';
|
|
266
|
+
face.append(badge);
|
|
267
|
+
}
|
|
268
|
+
badge.textContent = fill(labels.lastSeen, { time });
|
|
269
|
+
icon.setAttribute('aria-label', `${mark.name}${comma(locale)}${badge.textContent}`);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
const staleTimer = setInterval(restale, 15_000);
|
|
273
|
+
// ---- routes ------------------------------------------------------------------------
|
|
274
|
+
/** Where a layer is now: one place's spot, or the reader's own. */
|
|
275
|
+
const positionOf = (id) => (me?.id === id ? (mine?.at ?? null) : (marks.get(id)?.at ?? null));
|
|
276
|
+
function drawRoutes(map, L) {
|
|
277
|
+
const shownNow = expressionContext(values, page.fields);
|
|
278
|
+
for (const layer of node.layers) {
|
|
279
|
+
const route = layer.route;
|
|
280
|
+
if (!route)
|
|
281
|
+
continue;
|
|
282
|
+
const off = hidden.get(layer.id)?.evaluate(shownNow);
|
|
283
|
+
const from = positionOf(route.from);
|
|
284
|
+
const to = route.to ? positionOf(route.to) : null;
|
|
285
|
+
const via = route.through ? [...marks.entries()].filter(([key]) => key.startsWith(`${route.through}:`)).map(([, mark]) => mark.at) : [];
|
|
286
|
+
let state = routes.get(layer.id);
|
|
287
|
+
if (!state)
|
|
288
|
+
routes.set(layer.id, (state = { layer, asking: 0, ends: '', askedAt: 0 }));
|
|
289
|
+
// Hidden, or with an end missing: off the map, though what was found is kept for when it shows again.
|
|
290
|
+
if (off || !from || (route.to && !to) || via.length + (to ? 1 : 0) < 1) {
|
|
291
|
+
state.done?.remove();
|
|
292
|
+
state.left?.remove();
|
|
293
|
+
state.done = state.left = undefined;
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
const ends = JSON.stringify([...via, ...(to ? [to] : [])].map((p) => [p.lat.toFixed(5), p.lng.toFixed(5)]));
|
|
297
|
+
const away = state.found ? nearestOnLine(state.found.path, from).off : Infinity;
|
|
298
|
+
const fresh = ends !== state.ends || (away > OFF_ROUTE_M && Date.now() - state.askedAt > ROUTE_EVERY_MS);
|
|
299
|
+
if (fresh)
|
|
300
|
+
ask(state, [from, ...via, ...(to ? [to] : [])], ends);
|
|
301
|
+
if (state.found)
|
|
302
|
+
drawRoute(map, L, state, from);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
function ask(state, points, ends) {
|
|
306
|
+
const finder = settings.route ?? settings.provider.route;
|
|
307
|
+
state.ends = ends;
|
|
308
|
+
state.askedAt = Date.now();
|
|
309
|
+
if (!finder) {
|
|
310
|
+
warnOnce(`This map has a route, and its provider "${settings.provider.id}" finds none: give mapParts a provider with routes, or the app's own route.`);
|
|
311
|
+
return say(labels.routeFailed);
|
|
312
|
+
}
|
|
313
|
+
state.abort?.abort();
|
|
314
|
+
const abort = new AbortController();
|
|
315
|
+
state.abort = abort;
|
|
316
|
+
const asked = ++state.asking;
|
|
317
|
+
finder({ points, mode: state.layer.route?.mode ?? 'car', locale, signal: abort.signal })
|
|
318
|
+
.then((found) => {
|
|
319
|
+
if (asked !== state.asking || destroyed)
|
|
320
|
+
return;
|
|
321
|
+
state.found = { ...found, path: routeLine(found.line) };
|
|
322
|
+
say('');
|
|
323
|
+
box.ready((map, L) => {
|
|
324
|
+
const from = positionOf(state.layer.route.from);
|
|
325
|
+
if (from)
|
|
326
|
+
drawRoute(map, L, state, from);
|
|
327
|
+
// The first route shows whole, unless the person has moved the map.
|
|
328
|
+
if (!userMoved && state.written === undefined) {
|
|
329
|
+
fitted = false;
|
|
330
|
+
fit(map);
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
})
|
|
334
|
+
.catch((error) => {
|
|
335
|
+
if (abort.signal.aborted || destroyed)
|
|
336
|
+
return;
|
|
337
|
+
warnOnce(`A route could not be found: ${error.message}`);
|
|
338
|
+
say(labels.routeFailed);
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
/** The route as it stands: the part travelled faded, the part left bright; its numbers written where the page says. */
|
|
342
|
+
function drawRoute(map, L, state, from) {
|
|
343
|
+
const found = state.found;
|
|
344
|
+
const route = state.layer.route;
|
|
345
|
+
let left = found.path.line;
|
|
346
|
+
let done = [];
|
|
347
|
+
let seconds = found.seconds;
|
|
348
|
+
let metres = found.metres;
|
|
349
|
+
if (route.progress) {
|
|
350
|
+
const on = nearestOnLine(found.path, from);
|
|
351
|
+
({ done, left } = splitLine(found.path, on));
|
|
352
|
+
const share = found.path.metres ? on.along / found.path.metres : 0;
|
|
353
|
+
seconds = found.seconds * (1 - share);
|
|
354
|
+
metres = Math.max(0, found.metres * (1 - share));
|
|
355
|
+
}
|
|
356
|
+
const latLngs = (line) => line.map((p) => [p.lat, p.lng]);
|
|
357
|
+
if (done.length > 1) {
|
|
358
|
+
if (state.done)
|
|
359
|
+
state.done.setLatLngs(latLngs(done));
|
|
360
|
+
else
|
|
361
|
+
state.done = L.polyline(latLngs(done), { className: 'fd-map-route-done', interactive: false }).addTo(map);
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
state.done?.remove();
|
|
365
|
+
state.done = undefined;
|
|
366
|
+
}
|
|
367
|
+
if (state.left)
|
|
368
|
+
state.left.setLatLngs(latLngs(left));
|
|
369
|
+
else
|
|
370
|
+
state.left = L.polyline(latLngs(left), { className: 'fd-map-route', interactive: false }).addTo(map);
|
|
371
|
+
write(state, seconds, metres);
|
|
372
|
+
}
|
|
373
|
+
/** The route's numbers into the record's fields the page names, when they change: never in the middle of the form's own update. */
|
|
374
|
+
function write(state, seconds, metres) {
|
|
375
|
+
const into = state.layer.route?.write;
|
|
376
|
+
if (!into)
|
|
377
|
+
return;
|
|
378
|
+
const changes = [];
|
|
379
|
+
if (into.seconds && values[into.seconds] !== Math.round(seconds))
|
|
380
|
+
changes.push([into.seconds, Math.round(seconds)]);
|
|
381
|
+
if (into.metres && values[into.metres] !== Math.round(metres))
|
|
382
|
+
changes.push([into.metres, Math.round(metres)]);
|
|
383
|
+
if (into.line && state.written !== state.asking) {
|
|
384
|
+
const line = state.found.line.map((p) => [Math.round(p.lng * 1e6) / 1e6, Math.round(p.lat * 1e6) / 1e6]);
|
|
385
|
+
changes.push([into.line, { type: 'LineString', coordinates: line }]);
|
|
386
|
+
}
|
|
387
|
+
state.written = state.asking;
|
|
388
|
+
if (!changes.length)
|
|
389
|
+
return;
|
|
390
|
+
// The app's change, not a person's: the page's change steps do not run for it.
|
|
391
|
+
queueMicrotask(() => !destroyed && form.setValues(Object.fromEntries(changes)));
|
|
392
|
+
}
|
|
393
|
+
// ---- a card, the reader's own place, and the words over the map ----------------------
|
|
394
|
+
function showCard(map, L, key, height, focus) {
|
|
395
|
+
const mark = marks.get(key);
|
|
396
|
+
const place = placesNow(values).find((p) => p.key === key);
|
|
397
|
+
if (!mark || !place?.layer.card)
|
|
398
|
+
return;
|
|
399
|
+
closeCard(map, false);
|
|
400
|
+
const scope = pinsOf.get(place.layer.id).scope;
|
|
401
|
+
const card = drawCard({
|
|
402
|
+
document: doc,
|
|
403
|
+
page: scope,
|
|
404
|
+
locale,
|
|
405
|
+
labels,
|
|
406
|
+
dir: doc.defaultView?.getComputedStyle(element).direction === 'rtl' ? 'rtl' : 'ltr',
|
|
407
|
+
card: { ...place.layer.card, open: false },
|
|
408
|
+
title: place.layer.card.title ?? '',
|
|
409
|
+
fields: place.layer.card.fields ?? [],
|
|
410
|
+
record: place.record,
|
|
411
|
+
close: () => closeCard(map, true),
|
|
412
|
+
});
|
|
413
|
+
const back = mark.marker.getElement() ?? null;
|
|
414
|
+
openCard = { popup: popCard(map, L, { at: mark.at, height, card, focus, escape: () => closeCard(map, true) }), back };
|
|
415
|
+
}
|
|
416
|
+
function closeCard(map, back) {
|
|
417
|
+
if (!openCard)
|
|
418
|
+
return;
|
|
419
|
+
const { popup, back: to } = openCard;
|
|
420
|
+
openCard = null;
|
|
421
|
+
map.closePopup(popup);
|
|
422
|
+
if (back)
|
|
423
|
+
to?.focus();
|
|
424
|
+
}
|
|
425
|
+
function say(words) {
|
|
426
|
+
note.textContent = words;
|
|
427
|
+
note.hidden = !words;
|
|
428
|
+
}
|
|
429
|
+
/** The reader's own place: asked of the browser only when they press for it, then kept up to date. */
|
|
430
|
+
function locateMe() {
|
|
431
|
+
const geo = doc.defaultView?.navigator.geolocation;
|
|
432
|
+
if (watching !== null) {
|
|
433
|
+
geo?.clearWatch(watching);
|
|
434
|
+
watching = null;
|
|
435
|
+
locate.setAttribute('aria-pressed', 'false');
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
if (!geo)
|
|
439
|
+
return say(labels.locationFailed);
|
|
440
|
+
locate.setAttribute('aria-pressed', 'true');
|
|
441
|
+
say(labels.locating);
|
|
442
|
+
let first = true;
|
|
443
|
+
watching = geo.watchPosition((position) => {
|
|
444
|
+
mine = { at: { lat: position.coords.latitude, lng: position.coords.longitude }, accuracy: position.coords.accuracy };
|
|
445
|
+
say('');
|
|
446
|
+
box.ready((map, L) => {
|
|
447
|
+
const at = [mine.at.lat, mine.at.lng];
|
|
448
|
+
if (!meMark)
|
|
449
|
+
meMark = L.marker(at, { icon: L.divIcon({ className: 'fd-map-me', iconSize: [18, 18] }), keyboard: false, interactive: false }).addTo(map);
|
|
450
|
+
else
|
|
451
|
+
meMark.setLatLng(at);
|
|
452
|
+
if (!meCircle)
|
|
453
|
+
meCircle = L.circle(at, { radius: mine.accuracy, className: 'fd-map-accuracy', interactive: false }).addTo(map);
|
|
454
|
+
else
|
|
455
|
+
meCircle.setLatLng(at).setRadius(mine.accuracy);
|
|
456
|
+
drawRoutes(map, L);
|
|
457
|
+
if (first) {
|
|
458
|
+
first = false;
|
|
459
|
+
fitted = false;
|
|
460
|
+
fit(map);
|
|
461
|
+
}
|
|
462
|
+
});
|
|
463
|
+
}, (error) => {
|
|
464
|
+
say(error.code === error.PERMISSION_DENIED ? labels.locationBlocked : labels.locationFailed);
|
|
465
|
+
locate.setAttribute('aria-pressed', 'false');
|
|
466
|
+
if (watching !== null)
|
|
467
|
+
geo.clearWatch(watching);
|
|
468
|
+
watching = null;
|
|
469
|
+
}, { enableHighAccuracy: true, maximumAge: 10_000 });
|
|
470
|
+
}
|
|
471
|
+
box.ready((map, L) => {
|
|
472
|
+
box.element.append(note, followButton, ...(me ? [locate] : []));
|
|
473
|
+
box.shield(followButton);
|
|
474
|
+
box.shield(locate);
|
|
475
|
+
box.follow(note);
|
|
476
|
+
box.follow(followButton);
|
|
477
|
+
locate.addEventListener('click', locateMe);
|
|
478
|
+
followButton.addEventListener('click', () => {
|
|
479
|
+
userMoved = false;
|
|
480
|
+
followButton.hidden = true;
|
|
481
|
+
const followed = [...marks.values()].find((mark) => mark.layer.live?.follow);
|
|
482
|
+
if (followed)
|
|
483
|
+
map.panTo(followed.marker.getLatLng());
|
|
484
|
+
});
|
|
485
|
+
map.on('moveend', () => {
|
|
486
|
+
if (moving && following) {
|
|
487
|
+
userMoved = true;
|
|
488
|
+
followButton.hidden = false;
|
|
489
|
+
}
|
|
490
|
+
moving = false;
|
|
491
|
+
});
|
|
492
|
+
map.on('popupclose', (event) => {
|
|
493
|
+
if (openCard?.popup === event.popup)
|
|
494
|
+
openCard = null;
|
|
495
|
+
});
|
|
496
|
+
draw(map, L);
|
|
497
|
+
});
|
|
498
|
+
return {
|
|
499
|
+
element,
|
|
500
|
+
update(state) {
|
|
501
|
+
values = state.values;
|
|
502
|
+
box.refresh();
|
|
503
|
+
box.ready((map, L) => draw(map, L));
|
|
504
|
+
},
|
|
505
|
+
destroy() {
|
|
506
|
+
destroyed = true;
|
|
507
|
+
clearInterval(staleTimer);
|
|
508
|
+
if (watching !== null)
|
|
509
|
+
doc.defaultView?.navigator.geolocation.clearWatch(watching);
|
|
510
|
+
for (const mark of marks.values())
|
|
511
|
+
if (mark.glide)
|
|
512
|
+
cancelAnimationFrame(mark.glide);
|
|
513
|
+
for (const route of routes.values())
|
|
514
|
+
route.abort?.abort();
|
|
515
|
+
box.element.removeEventListener('pointerdown', pressed, { capture: true });
|
|
516
|
+
box.element.removeEventListener('keydown', keyed, { capture: true });
|
|
517
|
+
box.element.removeEventListener('wheel', wheeled, { capture: true });
|
|
518
|
+
box.destroy();
|
|
519
|
+
},
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
//# sourceMappingURL=form-map.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-map.mjs","sourceRoot":"","sources":["../../../../../libs/map/src/lib/form-map.ts"],"names":[],"mappings":"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"}
|
package/src/lib/labels.d.mts
CHANGED
|
@@ -82,9 +82,22 @@ export interface ListMapLabels {
|
|
|
82
82
|
inDrawnArea: string;
|
|
83
83
|
}
|
|
84
84
|
export declare const LIST_MAP_LABELS: Record<Locale, ListMapLabels>;
|
|
85
|
+
/** The words a form's map shows, besides the maps' own and a list map's: kept apart, as theirs are. */
|
|
86
|
+
export interface FormMapLabels {
|
|
87
|
+
/** A map's name when its page gives none. */
|
|
88
|
+
map: string;
|
|
89
|
+
/** A place whose news is old: `{time}` is how long ago, in the page's language ("3 minutes ago"). */
|
|
90
|
+
lastSeen: string;
|
|
91
|
+
/** Back to following a place that moves, after the person moved the map away. */
|
|
92
|
+
follow: string;
|
|
93
|
+
routeFailed: string;
|
|
94
|
+
}
|
|
95
|
+
export declare const FORM_MAP_LABELS: Record<Locale, FormMapLabels>;
|
|
85
96
|
/** The words for a page's language, with the app's own over them. */
|
|
86
97
|
export declare function mapLabels(locale: Locale | undefined, own?: Partial<MapLabels>): MapLabels;
|
|
87
98
|
/** A list's map's words for a page's language, the maps' own with them, and the app's own over both. */
|
|
88
99
|
export declare function listMapLabels(locale: Locale | undefined, own?: Partial<MapLabels & ListMapLabels>): MapLabels & ListMapLabels;
|
|
89
100
|
/** A word with its `{name}`s filled in. */
|
|
90
101
|
export declare const fill: (words: string, values: Record<string, string | number>) => string;
|
|
102
|
+
/** A form's map's words for a page's language: the maps' own, a list map's (its pins and cards), its own, the app's over all. */
|
|
103
|
+
export declare function formMapLabels(locale: Locale | undefined, own?: Partial<MapLabels & ListMapLabels & FormMapLabels>): MapLabels & ListMapLabels & FormMapLabels;
|
package/src/lib/labels.d.ts
CHANGED
|
@@ -82,9 +82,22 @@ export interface ListMapLabels {
|
|
|
82
82
|
inDrawnArea: string;
|
|
83
83
|
}
|
|
84
84
|
export declare const LIST_MAP_LABELS: Record<Locale, ListMapLabels>;
|
|
85
|
+
/** The words a form's map shows, besides the maps' own and a list map's: kept apart, as theirs are. */
|
|
86
|
+
export interface FormMapLabels {
|
|
87
|
+
/** A map's name when its page gives none. */
|
|
88
|
+
map: string;
|
|
89
|
+
/** A place whose news is old: `{time}` is how long ago, in the page's language ("3 minutes ago"). */
|
|
90
|
+
lastSeen: string;
|
|
91
|
+
/** Back to following a place that moves, after the person moved the map away. */
|
|
92
|
+
follow: string;
|
|
93
|
+
routeFailed: string;
|
|
94
|
+
}
|
|
95
|
+
export declare const FORM_MAP_LABELS: Record<Locale, FormMapLabels>;
|
|
85
96
|
/** The words for a page's language, with the app's own over them. */
|
|
86
97
|
export declare function mapLabels(locale: Locale | undefined, own?: Partial<MapLabels>): MapLabels;
|
|
87
98
|
/** A list's map's words for a page's language, the maps' own with them, and the app's own over both. */
|
|
88
99
|
export declare function listMapLabels(locale: Locale | undefined, own?: Partial<MapLabels & ListMapLabels>): MapLabels & ListMapLabels;
|
|
89
100
|
/** A word with its `{name}`s filled in. */
|
|
90
101
|
export declare const fill: (words: string, values: Record<string, string | number>) => string;
|
|
102
|
+
/** A form's map's words for a page's language: the maps' own, a list map's (its pins and cards), its own, the app's over all. */
|
|
103
|
+
export declare function formMapLabels(locale: Locale | undefined, own?: Partial<MapLabels & ListMapLabels & FormMapLabels>): MapLabels & ListMapLabels & FormMapLabels;
|
package/src/lib/labels.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.fill = exports.LIST_MAP_LABELS = exports.MAP_LABELS = void 0;
|
|
3
|
+
exports.fill = exports.FORM_MAP_LABELS = exports.LIST_MAP_LABELS = exports.MAP_LABELS = void 0;
|
|
4
4
|
exports.mapLabels = mapLabels;
|
|
5
5
|
exports.listMapLabels = listMapLabels;
|
|
6
|
+
exports.formMapLabels = formMapLabels;
|
|
6
7
|
exports.MAP_LABELS = {
|
|
7
8
|
en: {
|
|
8
9
|
mapOf: '{label}, map',
|
|
@@ -287,6 +288,12 @@ exports.LIST_MAP_LABELS = {
|
|
|
287
288
|
inDrawnArea: 'Im gezeichneten Gebiet',
|
|
288
289
|
},
|
|
289
290
|
};
|
|
291
|
+
exports.FORM_MAP_LABELS = {
|
|
292
|
+
en: { map: 'Map', lastSeen: 'Last seen {time}', follow: 'Follow', routeFailed: 'The way could not be found.' },
|
|
293
|
+
ar: { map: 'خريطة', lastSeen: 'آخر ظهور {time}', follow: 'تتبّع', routeFailed: 'تعذّر إيجاد الطريق.' },
|
|
294
|
+
fr: { map: 'Carte', lastSeen: 'Vu pour la dernière fois {time}', follow: 'Suivre', routeFailed: 'Le trajet est introuvable.' },
|
|
295
|
+
de: { map: 'Karte', lastSeen: 'Zuletzt gesehen {time}', follow: 'Folgen', routeFailed: 'Der Weg wurde nicht gefunden.' },
|
|
296
|
+
};
|
|
290
297
|
/** The words for a page's language, with the app's own over them. */
|
|
291
298
|
function mapLabels(locale, own) {
|
|
292
299
|
return { ...exports.MAP_LABELS[locale ?? 'en'], ...own };
|
|
@@ -298,4 +305,8 @@ function listMapLabels(locale, own) {
|
|
|
298
305
|
/** A word with its `{name}`s filled in. */
|
|
299
306
|
const fill = (words, values) => words.replace(/\{(\w+)\}/g, (all, key) => (key in values ? String(values[key]) : all));
|
|
300
307
|
exports.fill = fill;
|
|
308
|
+
/** A form's map's words for a page's language: the maps' own, a list map's (its pins and cards), its own, the app's over all. */
|
|
309
|
+
function formMapLabels(locale, own) {
|
|
310
|
+
return { ...exports.MAP_LABELS[locale ?? 'en'], ...exports.LIST_MAP_LABELS[locale ?? 'en'], ...exports.FORM_MAP_LABELS[locale ?? 'en'], ...own };
|
|
311
|
+
}
|
|
301
312
|
//# sourceMappingURL=labels.js.map
|