@fieldia/map 0.14.0 → 0.15.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.
Files changed (90) hide show
  1. package/README.md +74 -7
  2. package/package.json +5 -4
  3. package/src/index.d.mts +3 -0
  4. package/src/index.d.ts +3 -0
  5. package/src/index.js +5 -1
  6. package/src/index.js.map +1 -1
  7. package/src/index.mjs +2 -0
  8. package/src/index.mjs.map +1 -1
  9. package/src/lib/area.js +29 -246
  10. package/src/lib/area.js.map +1 -1
  11. package/src/lib/area.mjs +29 -246
  12. package/src/lib/area.mjs.map +1 -1
  13. package/src/lib/card.d.mts +45 -0
  14. package/src/lib/card.d.ts +45 -0
  15. package/src/lib/card.js +89 -0
  16. package/src/lib/card.js.map +1 -0
  17. package/src/lib/card.mjs +85 -0
  18. package/src/lib/card.mjs.map +1 -0
  19. package/src/lib/cluster.d.mts +12 -0
  20. package/src/lib/cluster.d.ts +12 -0
  21. package/src/lib/cluster.js +60 -0
  22. package/src/lib/cluster.js.map +1 -0
  23. package/src/lib/cluster.mjs +57 -0
  24. package/src/lib/cluster.mjs.map +1 -0
  25. package/src/lib/drawing.d.mts +36 -0
  26. package/src/lib/drawing.d.ts +36 -0
  27. package/src/lib/drawing.js +267 -0
  28. package/src/lib/drawing.js.map +1 -0
  29. package/src/lib/drawing.mjs +263 -0
  30. package/src/lib/drawing.mjs.map +1 -0
  31. package/src/lib/kinds.js +9 -2
  32. package/src/lib/kinds.js.map +1 -1
  33. package/src/lib/kinds.mjs +9 -2
  34. package/src/lib/kinds.mjs.map +1 -1
  35. package/src/lib/labels.d.mts +32 -0
  36. package/src/lib/labels.d.ts +32 -0
  37. package/src/lib/labels.js +88 -1
  38. package/src/lib/labels.js.map +1 -1
  39. package/src/lib/labels.mjs +86 -0
  40. package/src/lib/labels.mjs.map +1 -1
  41. package/src/lib/list-view.d.mts +13 -0
  42. package/src/lib/list-view.d.ts +13 -0
  43. package/src/lib/list-view.js +481 -0
  44. package/src/lib/list-view.js.map +1 -0
  45. package/src/lib/list-view.mjs +478 -0
  46. package/src/lib/list-view.mjs.map +1 -0
  47. package/src/lib/map-core.d.mts +4 -2
  48. package/src/lib/map-core.d.ts +4 -2
  49. package/src/lib/map-core.js +19 -7
  50. package/src/lib/map-core.js.map +1 -1
  51. package/src/lib/map-core.mjs +18 -7
  52. package/src/lib/map-core.mjs.map +1 -1
  53. package/src/lib/map-icons.d.mts +8 -0
  54. package/src/lib/map-icons.d.ts +8 -0
  55. package/src/lib/map-icons.js +21 -0
  56. package/src/lib/map-icons.js.map +1 -0
  57. package/src/lib/map-icons.mjs +18 -0
  58. package/src/lib/map-icons.mjs.map +1 -0
  59. package/src/lib/pins.d.mts +56 -0
  60. package/src/lib/pins.d.ts +56 -0
  61. package/src/lib/pins.js +161 -0
  62. package/src/lib/pins.js.map +1 -0
  63. package/src/lib/pins.mjs +154 -0
  64. package/src/lib/pins.mjs.map +1 -0
  65. package/src/lib/place.d.mts +1 -1
  66. package/src/lib/place.d.ts +1 -1
  67. package/src/lib/place.js +46 -6
  68. package/src/lib/place.js.map +1 -1
  69. package/src/lib/place.mjs +48 -8
  70. package/src/lib/place.mjs.map +1 -1
  71. package/src/lib/providers.d.mts +29 -8
  72. package/src/lib/providers.d.ts +29 -8
  73. package/src/lib/providers.js +217 -33
  74. package/src/lib/providers.js.map +1 -1
  75. package/src/lib/providers.mjs +217 -33
  76. package/src/lib/providers.mjs.map +1 -1
  77. package/src/lib/search-box.d.mts +4 -2
  78. package/src/lib/search-box.d.ts +4 -2
  79. package/src/lib/search-box.js +20 -6
  80. package/src/lib/search-box.js.map +1 -1
  81. package/src/lib/search-box.mjs +20 -6
  82. package/src/lib/search-box.mjs.map +1 -1
  83. package/src/lib/settings.d.mts +5 -2
  84. package/src/lib/settings.d.ts +5 -2
  85. package/src/lib/styles.d.mts +9 -1
  86. package/src/lib/styles.d.ts +9 -1
  87. package/src/lib/styles.js +146 -2
  88. package/src/lib/styles.js.map +1 -1
  89. package/src/lib/styles.mjs +144 -1
  90. package/src/lib/styles.mjs.map +1 -1
@@ -0,0 +1,478 @@
1
+ import { drawCard, drawCrowd } from './card.mjs';
2
+ import { clusterPoints } from './cluster.mjs';
3
+ import { SHAPE_ICONS, shapeDrawing } from './drawing.mjs';
4
+ import { readPoint } from './geo.mjs';
5
+ import { fill, listMapLabels } from './labels.mjs';
6
+ import { createMapBox } from './map-core.mjs';
7
+ import { installListMapStyles } from './styles.mjs';
8
+ import { makePins, withCurrency } from './pins.mjs';
9
+ /**
10
+ * A list's records on a map, for the viewer's `listViews`: the list's own
11
+ * search and its chosen records, shared with the table. A pin lights its row
12
+ * and a row its pin; a pin opens a card with the record's picture, a few of
13
+ * its fields, a box to choose it and a button to open it. Pins that crowd
14
+ * become a bubble with their count. After the map is moved, "Search this
15
+ * area" puts the area into the search bar, as the person's own search.
16
+ *
17
+ * mountViewer(host, { page, listViews: mapListViews({ provider }) })
18
+ */
19
+ export function mapListViews(settings) {
20
+ return { map: (context) => listMap(settings, context) };
21
+ }
22
+ /** Pins nearer than this, in pixels, become one bubble. */
23
+ const CROWD = 48;
24
+ /** Room kept around the records when the map fits them, in pixels. */
25
+ const ROOM = 40;
26
+ /** Moves the person makes; a fit, a card's own pan and a resize are not. */
27
+ const MOVE_KEYS = new Set(['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', '+', '-', '=', '_']);
28
+ /** No size for a mark: Leaflet then sets none, and the mark is as large as its face (its types leave null out; its code takes it). */
29
+ const SIZED_BY_FACE = null;
30
+ /** How a mark stands on its point: its size is its face's, so CSS stands it there. */
31
+ const anchor = (face) => (face.element.dataset['look'] === 'label' ? 'fd-map-tail' : face.stands === 'foot' ? 'fd-map-foot' : 'fd-map-middle');
32
+ function listMap(settings, context) {
33
+ const { page, node, document: doc, locale } = context;
34
+ // The viewer asks for a map only for a list with `map`.
35
+ const spec = node.map;
36
+ const labels = listMapLabels(locale, settings.labels?.[locale]);
37
+ const model = page.data.kind === 'record' ? page.data.model : '';
38
+ const title = spec.card?.title ?? node.columns[0];
39
+ const cardFields = spec.card?.fields ?? node.columns.filter((name) => name !== title).slice(0, 4);
40
+ const pins = makePins({ document: doc, page, locale, pin: spec.pin ?? {}, title, icons: context.icons, drawers: settings.pins });
41
+ const where = spec.point ? [spec.point] : [spec.latitude, spec.longitude];
42
+ const fields = [...new Set([...where, ...pins.fields, ...(spec.card?.image ? [spec.card.image] : []), ...cardFields.flatMap((name) => withCurrency(page, name))])];
43
+ const count = (n) => new Intl.NumberFormat(locale, { numberingSystem: 'latn' }).format(n);
44
+ installListMapStyles(doc);
45
+ const element = doc.createElement('div');
46
+ element.className = 'fd-map-list';
47
+ const box = createMapBox({
48
+ document: doc,
49
+ provider: settings.provider,
50
+ locale,
51
+ labels,
52
+ name: page.title ?? model,
53
+ keys: labels.pinKeys,
54
+ center: settings.center,
55
+ zoom: settings.zoom,
56
+ height: 'clamp(320px, 64vh, 640px)',
57
+ });
58
+ element.append(box.element);
59
+ const here = doc.createElement('button');
60
+ here.type = 'button';
61
+ here.className = 'fd-map-here';
62
+ here.textContent = labels.searchThisArea;
63
+ here.hidden = true;
64
+ const note = doc.createElement('p');
65
+ note.className = 'fd-map-list-note';
66
+ note.setAttribute('role', 'status');
67
+ note.hidden = true;
68
+ // ---- an area drawn, to search in -----------------------------------------------------
69
+ const live = doc.createElement('div');
70
+ live.className = 'fd-sr-only';
71
+ live.setAttribute('aria-live', 'polite');
72
+ element.append(live);
73
+ const announce = (words) => {
74
+ live.textContent = '';
75
+ // A new node each time, so the same words are said again.
76
+ setTimeout(() => (live.textContent = words), 30);
77
+ };
78
+ const tools = doc.createElement('div');
79
+ tools.className = 'fd-map-draw';
80
+ tools.setAttribute('role', 'group');
81
+ tools.setAttribute('aria-label', labels.drawArea);
82
+ const toolButtons = new Map();
83
+ for (const shape of ['polygon', 'box', 'circle']) {
84
+ const button = doc.createElement('button');
85
+ button.type = 'button';
86
+ button.innerHTML = SHAPE_ICONS[shape];
87
+ button.setAttribute('aria-label', labels[shape]);
88
+ button.title = `${labels.drawArea}: ${labels[shape]}`;
89
+ button.setAttribute('aria-pressed', 'false');
90
+ button.addEventListener('click', () => drawing.arm(drawing.mode === shape ? null : shape));
91
+ toolButtons.set(shape, button);
92
+ tools.append(button);
93
+ }
94
+ const drawing = shapeDrawing({
95
+ box,
96
+ labels,
97
+ keys: element,
98
+ announce,
99
+ armed: (mode) => {
100
+ for (const [shape, button] of toolButtons)
101
+ button.setAttribute('aria-pressed', String(shape === mode));
102
+ },
103
+ done: (area) => box.ready((map, L) => searchIn(map, L, area)),
104
+ escaped: () => toolButtons.get('polygon')?.focus(),
105
+ finishesOn: (target) => target === toolButtons.get('polygon'),
106
+ over: '.fd-map-here, .fd-map-draw, .fd-map-list-note',
107
+ });
108
+ /** The area drawn, on the map while its search is in the search bar. */
109
+ let searched = null;
110
+ let searchedKey = '';
111
+ let records = [];
112
+ let places = [];
113
+ let drawn = [];
114
+ const drawnOf = new Map();
115
+ let hot = null;
116
+ let open = null;
117
+ let layer = null;
118
+ /** A record lit inside a bubble: its own pin over the bubble, for as long as its row is lit. */
119
+ let ghost = null;
120
+ let asking = 0;
121
+ let destroyed = false;
122
+ let fitted = false;
123
+ let lastFilter = '';
124
+ /** The search changed by the map's own "Search this area": the view stays where the person put it. */
125
+ let ownSearch = false;
126
+ let moving = false;
127
+ const dir = () => (doc.defaultView?.getComputedStyle(element).direction === 'rtl' ? 'rtl' : 'ltr');
128
+ const isKeys = (event) => !!event && event.type.startsWith('key');
129
+ const placeOf = (values) => {
130
+ if (spec.point)
131
+ return readPoint(values[spec.point]);
132
+ const lat = values[spec.latitude];
133
+ const lng = values[spec.longitude];
134
+ return typeof lat === 'number' && typeof lng === 'number' && Math.abs(lat) <= 90 && Math.abs(lng) <= 180 ? { lat, lng } : null;
135
+ };
136
+ // ---- the person's own moves, after which "Search this area" is offered ----------
137
+ const pressed = (event) => {
138
+ const target = event.target;
139
+ if (!target?.closest('.leaflet-marker-icon, .leaflet-popup, .fd-map-here, .fd-map-credits, .fd-map-logo'))
140
+ moving = true;
141
+ };
142
+ const keyed = (event) => {
143
+ if (event.target === box.element && MOVE_KEYS.has(event.key))
144
+ moving = true;
145
+ };
146
+ const wheeled = (event) => {
147
+ if (event.ctrlKey || event.metaKey)
148
+ moving = true;
149
+ };
150
+ box.element.addEventListener('pointerdown', pressed, { capture: true });
151
+ box.element.addEventListener('keydown', keyed, { capture: true });
152
+ box.element.addEventListener('wheel', wheeled, { capture: true, passive: true });
153
+ function searchHere(map) {
154
+ const bounds = map.getBounds();
155
+ const round = (n) => Math.round(n * 1e6) / 1e6;
156
+ const wrap = (lng) => round(((((lng + 180) % 360) + 360) % 360) - 180);
157
+ const south = round(Math.max(-90, bounds.getSouth()));
158
+ const north = round(Math.min(90, bounds.getNorth()));
159
+ const whole = bounds.getEast() - bounds.getWest() >= 360;
160
+ const west = whole ? -180 : wrap(bounds.getWest());
161
+ const east = whole ? 180 : wrap(bounds.getEast());
162
+ const filter = spec.point
163
+ ? [{ field: spec.point, op: 'within', value: { south, west, north, east } }]
164
+ : [
165
+ { field: spec.latitude, op: 'between', value: [south, north] },
166
+ // Over the antimeridian no one range holds the longitudes: either side of it, then.
167
+ ...(whole
168
+ ? []
169
+ : west <= east
170
+ ? [{ field: spec.longitude, op: 'between', value: [west, east] }]
171
+ : [{ any: [{ field: spec.longitude, op: '>=', value: west }, { field: spec.longitude, op: '<=', value: east }] }]),
172
+ ];
173
+ ownSearch = true;
174
+ here.hidden = true;
175
+ context.addSearch({ label: labels.inThisArea, filter });
176
+ }
177
+ /** An area drawn becomes a search of its own, "In the area drawn": the places inside it, in the table and on the map. */
178
+ function searchIn(map, L, area) {
179
+ const round = (n) => Math.round(n * 1e6) / 1e6;
180
+ const shape = area.shape === 'circle'
181
+ ? { center: [round(area.center.lng), round(area.center.lat)], radius: Math.round(area.radius) }
182
+ : { polygon: area.points.map((p) => [round(p.lng), round(p.lat)]) };
183
+ const condition = spec.point
184
+ ? { field: spec.point, op: 'within', value: shape }
185
+ : { field: spec.latitude, op: 'within', value: { ...shape, longitude: spec.longitude } };
186
+ searched?.remove();
187
+ searched = (area.shape === 'circle'
188
+ ? L.circle([area.center.lat, area.center.lng], { radius: area.radius, className: 'fd-map-shape fd-map-searched', interactive: false })
189
+ : L.polygon(area.points.map((p) => [p.lat, p.lng]), { className: 'fd-map-shape fd-map-searched', interactive: false })).addTo(map);
190
+ searchedKey = JSON.stringify(condition);
191
+ ownSearch = true;
192
+ here.hidden = true;
193
+ announce(labels.shapeDrawn);
194
+ context.addSearch({ label: labels.inDrawnArea, filter: [condition] });
195
+ }
196
+ // ---- the card -------------------------------------------------------------------
197
+ function closeCard(map, back) {
198
+ if (!open)
199
+ return;
200
+ const { popup, back: to } = open;
201
+ open = null;
202
+ map.closePopup(popup);
203
+ if (back)
204
+ to?.focus();
205
+ }
206
+ function showCard(map, L, at, height, card, id, back, byKeys) {
207
+ closeCard(map, false);
208
+ // Escape closes the card and goes back to its pin; the arrows stay with the card, not the map.
209
+ card.element.addEventListener('keydown', (event) => {
210
+ if (event.key === 'Escape') {
211
+ event.stopPropagation();
212
+ closeCard(map, true);
213
+ }
214
+ else if (MOVE_KEYS.has(event.key))
215
+ event.stopPropagation();
216
+ });
217
+ const popup = L.popup({ closeButton: false, autoPanPadding: [16, 16], className: 'fd-map-card-popup', minWidth: 220, maxWidth: 280, offset: [0, 4 - height] })
218
+ .setLatLng([at.lat, at.lng])
219
+ .setContent(card.element);
220
+ open = { id, card, popup, back };
221
+ popup.openOn(map);
222
+ if (byKeys)
223
+ card.focus();
224
+ }
225
+ function openCard(map, L, record, at, height, back, byKeys) {
226
+ const card = drawCard({
227
+ document: doc,
228
+ page,
229
+ locale,
230
+ labels,
231
+ dir: dir(),
232
+ card: spec.card ?? {},
233
+ title,
234
+ fields: cardFields,
235
+ record,
236
+ chosen: context.isChosen(record.id),
237
+ choose: (on) => context.choose(record.id, on),
238
+ ...(context.open ? { open: () => context.open?.(record.id) } : {}),
239
+ close: () => closeCard(map, true),
240
+ });
241
+ showCard(map, L, at, height, card, record.id, back, byKeys);
242
+ }
243
+ // ---- the pins -------------------------------------------------------------------
244
+ function draw(map, L) {
245
+ layer ??= L.layerGroup().addTo(map);
246
+ layer.clearLayers();
247
+ drawn = [];
248
+ drawnOf.clear();
249
+ const placed = records.flatMap((record, i) => (places[i] ? [{ record, at: places[i] }] : []));
250
+ const zoom = map.getZoom();
251
+ const groups = spec.cluster === false
252
+ ? placed.map((_, i) => [i])
253
+ : clusterPoints(placed.map(({ at }) => map.project([at.lat, at.lng], zoom)), CROWD);
254
+ for (const group of groups) {
255
+ if (group.length === 1)
256
+ single(map, L, placed[group[0]].record, placed[group[0]].at);
257
+ else
258
+ bubble(map, L, group.map((i) => placed[i]));
259
+ }
260
+ restyle();
261
+ light(map, L);
262
+ }
263
+ /**
264
+ * A mark pressed: clicked, or Enter or Space while it has the focus. Leaflet
265
+ * makes a mark a button to the keyboard but clicks it only for a popup of its own.
266
+ */
267
+ function onPress(marker, act) {
268
+ marker.on('click', (event) => act(event.originalEvent));
269
+ marker.on('keydown', (event) => {
270
+ const key = event.originalEvent;
271
+ if (key.key !== 'Enter' && key.key !== ' ')
272
+ return;
273
+ key.preventDefault();
274
+ act(key);
275
+ });
276
+ }
277
+ function mark(entry, name) {
278
+ const element = entry.marker.getElement();
279
+ element?.setAttribute('aria-label', name);
280
+ drawn.push(entry);
281
+ for (const id of entry.ids)
282
+ drawnOf.set(id, entry);
283
+ return element;
284
+ }
285
+ function single(map, L, record, at) {
286
+ const face = pins.face(record);
287
+ const icon = L.divIcon({ className: `fd-map-mark ${anchor(face)}`, html: face.element, iconSize: SIZED_BY_FACE });
288
+ const marker = L.marker([at.lat, at.lng], { icon, keyboard: true, riseOnHover: true, riseOffset: 500 }).addTo(layer);
289
+ const element = mark({ marker, face: face.element, ids: [record.id] }, pins.name(record));
290
+ if (element)
291
+ element.dataset['id'] = String(record.id);
292
+ const height = face.stands === 'foot' ? face.height : face.height / 2;
293
+ onPress(marker, (event) => {
294
+ // Ctrl (⌘) and a click chooses the record, as in a list of files.
295
+ if (event && (event.ctrlKey || event.metaKey))
296
+ context.choose(record.id, !context.isChosen(record.id));
297
+ else
298
+ openCard(map, L, record, at, height, element ?? null, isKeys(event));
299
+ });
300
+ marker.on('mouseover', () => context.highlight(record.id));
301
+ marker.on('mouseout', () => context.highlight(null));
302
+ element?.addEventListener('focus', () => context.highlight(record.id));
303
+ element?.addEventListener('blur', () => context.highlight(null));
304
+ }
305
+ function bubble(map, L, members) {
306
+ const n = members.length;
307
+ const face = doc.createElement('div');
308
+ face.className = 'fd-map-bubble';
309
+ face.dataset['size'] = n < 10 ? 's' : n < 100 ? 'm' : 'l';
310
+ face.textContent = new Intl.NumberFormat(locale, { notation: 'compact', numberingSystem: 'latn' }).format(n);
311
+ const centre = { lat: members.reduce((sum, p) => sum + p.at.lat, 0) / n, lng: members.reduce((sum, p) => sum + p.at.lng, 0) / n };
312
+ const icon = L.divIcon({ className: 'fd-map-mark fd-map-middle', html: face, iconSize: SIZED_BY_FACE });
313
+ const marker = L.marker([centre.lat, centre.lng], { icon, keyboard: true, riseOnHover: true }).addTo(layer);
314
+ const element = mark({ marker, face, ids: members.map((p) => p.record.id) }, fill(labels.cluster, { n: count(n) }));
315
+ const bounds = L.latLngBounds(members.map((p) => [p.at.lat, p.at.lng]));
316
+ onPress(marker, (event) => {
317
+ const byKeys = isKeys(event);
318
+ const most = Math.min(map.getMaxZoom(), 19);
319
+ // Closer, until they part; on one spot (a tower's flats), a list of them.
320
+ if (map.getZoom() < most && !bounds.getNorthEast().equals(bounds.getSouthWest(), 1e-7)) {
321
+ moving = true;
322
+ map.fitBounds(bounds, { padding: [ROOM, ROOM], maxZoom: most });
323
+ if (byKeys)
324
+ box.element.focus();
325
+ return;
326
+ }
327
+ const crowd = drawCrowd({
328
+ document: doc,
329
+ labels,
330
+ dir: dir(),
331
+ records: members.map((p) => ({ record: p.record, name: pins.name(p.record) })),
332
+ pick: (record) => {
333
+ const at = members.find((p) => p.record.id === record.id)?.at ?? centre;
334
+ openCard(map, L, record, at, 20, element ?? null, true);
335
+ },
336
+ close: () => closeCard(map, true),
337
+ });
338
+ showCard(map, L, centre, 20, crowd, null, element ?? null, byKeys);
339
+ });
340
+ }
341
+ /** A lit record that is in a bubble shows where it is: its own pin, over the bubble. */
342
+ function light(map, L) {
343
+ ghost?.remove();
344
+ ghost = null;
345
+ const entry = hot === null ? undefined : drawnOf.get(hot);
346
+ if (!entry || entry.ids.length === 1)
347
+ return;
348
+ const i = records.findIndex((record) => record.id === hot);
349
+ const at = places[i];
350
+ if (!at)
351
+ return;
352
+ const face = pins.face(records[i]);
353
+ face.element.toggleAttribute('data-hot', true);
354
+ face.element.toggleAttribute('data-chosen', context.isChosen(records[i].id));
355
+ const icon = L.divIcon({ className: `fd-map-mark fd-map-ghost ${anchor(face)}`, html: face.element, iconSize: SIZED_BY_FACE });
356
+ ghost = L.marker([at.lat, at.lng], { icon, interactive: false, keyboard: false, zIndexOffset: 2000 }).addTo(map);
357
+ ghost.getElement()?.setAttribute('aria-hidden', 'true');
358
+ }
359
+ /** Each pin as it stands: lit when its row is, ticked when its record is chosen. */
360
+ function restyle() {
361
+ for (const entry of drawn) {
362
+ const lit = hot !== null && entry.ids.includes(hot);
363
+ entry.face.toggleAttribute('data-hot', lit);
364
+ entry.face.toggleAttribute('data-chosen', entry.ids.some((id) => context.isChosen(id)));
365
+ entry.marker.setZIndexOffset(lit ? 1000 : 0);
366
+ }
367
+ }
368
+ function fit(map) {
369
+ const at = places.filter((p) => !!p);
370
+ if (!at.length)
371
+ return;
372
+ fitted = true;
373
+ if (at.length === 1)
374
+ map.setView([at[0].lat, at[0].lng], Math.max(map.getZoom(), 15), { animate: false });
375
+ else
376
+ map.fitBounds(at.map((p) => [p.lat, p.lng]), { padding: [ROOM, ROOM], maxZoom: 16, animate: false });
377
+ }
378
+ box.ready((map, L) => {
379
+ box.element.append(tools, here, note);
380
+ box.shield(tools);
381
+ box.shield(here);
382
+ box.follow(note);
383
+ box.follow(here);
384
+ here.addEventListener('click', () => searchHere(map));
385
+ map.on('zoomend', () => draw(map, L));
386
+ map.on('moveend', () => {
387
+ if (moving)
388
+ here.hidden = false;
389
+ moving = false;
390
+ });
391
+ map.on('popupclose', (event) => {
392
+ if (open?.popup === event.popup)
393
+ open = null;
394
+ });
395
+ });
396
+ async function reload() {
397
+ const source = context.dataSource;
398
+ if (!source?.list)
399
+ return;
400
+ const asked = ++asking;
401
+ const filter = context.filter();
402
+ const key = JSON.stringify(filter);
403
+ let result;
404
+ try {
405
+ result = await source.list({ model, fields, filter, sort: node.sort ?? [], offset: 0, limit: spec.limit ?? 500 });
406
+ }
407
+ catch {
408
+ if (asked !== asking || destroyed)
409
+ return;
410
+ note.textContent = labels.mapFailed;
411
+ note.hidden = false;
412
+ return;
413
+ }
414
+ if (asked !== asking || destroyed)
415
+ return;
416
+ records = result.records;
417
+ places = records.map((record) => placeOf(record.values));
418
+ const refit = !fitted || (key !== lastFilter && !ownSearch);
419
+ lastFilter = key;
420
+ ownSearch = false;
421
+ // The area drawn leaves the map when its search leaves the search bar.
422
+ if (searchedKey && !key.includes(searchedKey)) {
423
+ searched?.remove();
424
+ searched = null;
425
+ searchedKey = '';
426
+ }
427
+ const missing = places.filter((p) => !p).length;
428
+ const words = [
429
+ result.total > records.length ? fill(labels.mapShowsFirst, { n: count(records.length), total: count(result.total) }) : '',
430
+ missing ? fill(labels.notOnMap, { n: count(missing) }) : '',
431
+ ].filter(Boolean);
432
+ note.textContent = words.join(' ');
433
+ note.hidden = !words.length;
434
+ box.ready((map, L) => {
435
+ if (destroyed)
436
+ return;
437
+ if (refit) {
438
+ fit(map);
439
+ here.hidden = true;
440
+ }
441
+ draw(map, L);
442
+ if (open?.id !== null && open && !records.some((r) => r.id === open?.id))
443
+ closeCard(map, false);
444
+ else
445
+ open?.card.setChosen(open.id !== null && context.isChosen(open.id));
446
+ });
447
+ }
448
+ return {
449
+ element,
450
+ reload,
451
+ highlight(id) {
452
+ hot = id;
453
+ restyle();
454
+ box.ready((map, L) => light(map, L));
455
+ },
456
+ chosenChanged() {
457
+ restyle();
458
+ if (open?.id !== null && open)
459
+ open.card.setChosen(context.isChosen(open.id));
460
+ },
461
+ shown() {
462
+ box.refresh();
463
+ box.ready((map) => {
464
+ map.invalidateSize({ pan: false });
465
+ if (!fitted)
466
+ fit(map);
467
+ });
468
+ },
469
+ destroy() {
470
+ destroyed = true;
471
+ box.element.removeEventListener('pointerdown', pressed, { capture: true });
472
+ box.element.removeEventListener('keydown', keyed, { capture: true });
473
+ box.element.removeEventListener('wheel', wheeled, { capture: true });
474
+ box.destroy();
475
+ },
476
+ };
477
+ }
478
+ //# sourceMappingURL=list-view.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-view.mjs","sourceRoot":"","sources":["../../../../../libs/map/src/lib/list-view.ts"],"names":[],"mappings":"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"}
@@ -25,8 +25,8 @@ export interface MapBoxOptions {
25
25
  keys?: string;
26
26
  center?: LatLng;
27
27
  zoom?: number;
28
- /** Height in pixels; 280 unless said. */
29
- height?: number;
28
+ /** Height in pixels, or as CSS says it (`clamp(…)`); 280 pixels unless said. */
29
+ height?: number | string;
30
30
  }
31
31
  export interface MapBox {
32
32
  element: HTMLElement;
@@ -44,4 +44,6 @@ export interface MapBox {
44
44
  follow(element: HTMLElement): void;
45
45
  destroy(): void;
46
46
  }
47
+ /** Says a provider's trouble to the developer once, in the console: a map that stays empty says nothing itself. */
48
+ export declare function warnOnce(words: string): void;
47
49
  export declare function createMapBox(options: MapBoxOptions): MapBox;
@@ -25,8 +25,8 @@ export interface MapBoxOptions {
25
25
  keys?: string;
26
26
  center?: LatLng;
27
27
  zoom?: number;
28
- /** Height in pixels; 280 unless said. */
29
- height?: number;
28
+ /** Height in pixels, or as CSS says it (`clamp(…)`); 280 pixels unless said. */
29
+ height?: number | string;
30
30
  }
31
31
  export interface MapBox {
32
32
  element: HTMLElement;
@@ -44,4 +44,6 @@ export interface MapBox {
44
44
  follow(element: HTMLElement): void;
45
45
  destroy(): void;
46
46
  }
47
+ /** Says a provider's trouble to the developer once, in the console: a map that stays empty says nothing itself. */
48
+ export declare function warnOnce(words: string): void;
47
49
  export declare function createMapBox(options: MapBoxOptions): MapBox;
@@ -1,10 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.warnOnce = warnOnce;
3
4
  exports.createMapBox = createMapBox;
4
5
  const labels_1 = require("./labels");
5
6
  const leaflet_1 = require("./leaflet");
6
7
  const styles_1 = require("./styles");
7
8
  const warned = new Set();
9
+ /** Says a provider's trouble to the developer once, in the console: a map that stays empty says nothing itself. */
10
+ function warnOnce(words) {
11
+ if (warned.has(words))
12
+ return;
13
+ warned.add(words);
14
+ console.warn(`[Fieldia] ${words}`);
15
+ }
8
16
  const isMac = (doc) => /Mac|iPhone|iPad/.test(doc.defaultView?.navigator.platform ?? '');
9
17
  function createMapBox(options) {
10
18
  const { document: doc, provider, locale, labels } = options;
@@ -13,7 +21,7 @@ function createMapBox(options) {
13
21
  element.className = 'fd-map-box';
14
22
  // The map's own layout is left to right in every language; the controls over it follow the page.
15
23
  element.dir = 'ltr';
16
- element.style.setProperty('--fd-map-height', `${options.height ?? 280}px`);
24
+ element.style.setProperty('--fd-map-height', typeof options.height === 'string' ? options.height : `${options.height ?? 280}px`);
17
25
  element.setAttribute('role', 'region');
18
26
  element.setAttribute('aria-label', (0, labels_1.fill)(labels.mapOf, { label: options.name }));
19
27
  const keysId = `fd-map-keys-${Math.random().toString(36).slice(2, 9)}`;
@@ -67,10 +75,8 @@ function createMapBox(options) {
67
75
  }
68
76
  overlays.push(mark);
69
77
  }
70
- if (provider.demoOnly && !warned.has(provider.id)) {
71
- warned.add(provider.id);
72
- console.warn(`[Fieldia] The "${provider.id}" map provider is for demos and development only: choose a provider (azureMaps, googleMaps, mapbox, or tiles) for an app in use.`);
73
- }
78
+ if (provider.demoOnly)
79
+ warnOnce(`The "${provider.id}" map provider is for demos and development only: choose a provider (azureMaps, googleMaps, mapbox, or tiles) for an app in use.`);
74
80
  let map = null;
75
81
  let L = null;
76
82
  let destroyed = false;
@@ -140,10 +146,14 @@ function createMapBox(options) {
140
146
  async function setBaseMap(kind) {
141
147
  if (!map || !L || kind === baseMap)
142
148
  return;
143
- let spec = await provider.tiles(kind, locale).catch(() => null);
149
+ const refused = (error) => {
150
+ warnOnce(`The ${provider.id} map images could not be drawn: ${error.message}`);
151
+ return null;
152
+ };
153
+ let spec = await provider.tiles(kind, locale).catch(refused);
144
154
  let drawn = kind;
145
155
  if (!spec && kind !== 'road') {
146
- spec = await provider.tiles('road', locale).catch(() => null);
156
+ spec = await provider.tiles('road', locale).catch(refused);
147
157
  drawn = 'road';
148
158
  }
149
159
  if (!spec || destroyed || !map)
@@ -153,6 +163,8 @@ function createMapBox(options) {
153
163
  return;
154
164
  }
155
165
  const layer = (0, leaflet_1.tileLayer)(L, spec).addTo(map);
166
+ // An image refused (a key the provider does not take, a network that blocks it): the map shows the ground and nothing else.
167
+ layer.on('tileerror', () => warnOnce(`The ${provider.id} map images failed to load: a key or token the provider refuses, or a network that blocks it, does this. Open one image's address to see the provider's answer.`));
156
168
  baseLayer?.remove();
157
169
  baseLayer = layer;
158
170
  baseMap = drawn;