@fieldia/map 0.14.1 → 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.
- package/README.md +63 -3
- package/package.json +5 -4
- package/src/index.d.mts +3 -0
- package/src/index.d.ts +3 -0
- package/src/index.js +5 -1
- package/src/index.js.map +1 -1
- package/src/index.mjs +2 -0
- package/src/index.mjs.map +1 -1
- package/src/lib/area.js +29 -246
- package/src/lib/area.js.map +1 -1
- package/src/lib/area.mjs +29 -246
- package/src/lib/area.mjs.map +1 -1
- package/src/lib/card.d.mts +45 -0
- package/src/lib/card.d.ts +45 -0
- package/src/lib/card.js +89 -0
- package/src/lib/card.js.map +1 -0
- package/src/lib/card.mjs +85 -0
- package/src/lib/card.mjs.map +1 -0
- package/src/lib/cluster.d.mts +12 -0
- package/src/lib/cluster.d.ts +12 -0
- package/src/lib/cluster.js +60 -0
- package/src/lib/cluster.js.map +1 -0
- package/src/lib/cluster.mjs +57 -0
- package/src/lib/cluster.mjs.map +1 -0
- package/src/lib/drawing.d.mts +36 -0
- package/src/lib/drawing.d.ts +36 -0
- package/src/lib/drawing.js +267 -0
- package/src/lib/drawing.js.map +1 -0
- package/src/lib/drawing.mjs +263 -0
- package/src/lib/drawing.mjs.map +1 -0
- package/src/lib/kinds.js +9 -2
- package/src/lib/kinds.js.map +1 -1
- package/src/lib/kinds.mjs +9 -2
- package/src/lib/kinds.mjs.map +1 -1
- package/src/lib/labels.d.mts +28 -0
- package/src/lib/labels.d.ts +28 -0
- package/src/lib/labels.js +76 -1
- package/src/lib/labels.js.map +1 -1
- package/src/lib/labels.mjs +74 -0
- package/src/lib/labels.mjs.map +1 -1
- package/src/lib/list-view.d.mts +13 -0
- package/src/lib/list-view.d.ts +13 -0
- package/src/lib/list-view.js +481 -0
- package/src/lib/list-view.js.map +1 -0
- package/src/lib/list-view.mjs +478 -0
- package/src/lib/list-view.mjs.map +1 -0
- package/src/lib/map-core.d.mts +2 -2
- package/src/lib/map-core.d.ts +2 -2
- package/src/lib/map-core.js +1 -1
- package/src/lib/map-core.js.map +1 -1
- package/src/lib/map-core.mjs +1 -1
- package/src/lib/map-core.mjs.map +1 -1
- package/src/lib/map-icons.d.mts +8 -0
- package/src/lib/map-icons.d.ts +8 -0
- package/src/lib/map-icons.js +21 -0
- package/src/lib/map-icons.js.map +1 -0
- package/src/lib/map-icons.mjs +18 -0
- package/src/lib/map-icons.mjs.map +1 -0
- package/src/lib/pins.d.mts +56 -0
- package/src/lib/pins.d.ts +56 -0
- package/src/lib/pins.js +161 -0
- package/src/lib/pins.js.map +1 -0
- package/src/lib/pins.mjs +154 -0
- package/src/lib/pins.mjs.map +1 -0
- package/src/lib/settings.d.mts +5 -2
- package/src/lib/settings.d.ts +5 -2
- package/src/lib/styles.d.mts +8 -0
- package/src/lib/styles.d.ts +8 -0
- package/src/lib/styles.js +142 -1
- package/src/lib/styles.js.map +1 -1
- package/src/lib/styles.mjs +140 -0
- package/src/lib/styles.mjs.map +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/card.ts"],"names":[],"mappings":"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"}
|
package/src/lib/card.mjs
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { fill } from './labels.mjs';
|
|
2
|
+
import { imageSource, shown } from './pins.mjs';
|
|
3
|
+
function make(doc, tag, className, ...children) {
|
|
4
|
+
const element = doc.createElement(tag);
|
|
5
|
+
element.className = className;
|
|
6
|
+
element.append(...children);
|
|
7
|
+
return element;
|
|
8
|
+
}
|
|
9
|
+
function closeButton(doc, labels, close) {
|
|
10
|
+
const button = make(doc, 'button', 'fd-map-card-close', '×');
|
|
11
|
+
button.type = 'button';
|
|
12
|
+
button.setAttribute('aria-label', labels.closeCard);
|
|
13
|
+
button.title = labels.closeCard;
|
|
14
|
+
button.addEventListener('click', close);
|
|
15
|
+
return button;
|
|
16
|
+
}
|
|
17
|
+
export function drawCard(options) {
|
|
18
|
+
const { document: doc, page, locale, labels, record } = options;
|
|
19
|
+
const title = shown(page, options.title, record.values, locale) || String(record.id);
|
|
20
|
+
const element = make(doc, 'div', 'fd-map-card');
|
|
21
|
+
element.dir = options.dir;
|
|
22
|
+
element.setAttribute('role', 'group');
|
|
23
|
+
element.setAttribute('aria-label', title);
|
|
24
|
+
element.dataset['id'] = String(record.id);
|
|
25
|
+
const picture = options.card.image ? imageSource(record.values[options.card.image]) : '';
|
|
26
|
+
if (picture) {
|
|
27
|
+
const img = make(doc, 'img', 'fd-map-card-image');
|
|
28
|
+
img.alt = '';
|
|
29
|
+
img.decoding = 'async';
|
|
30
|
+
img.src = picture;
|
|
31
|
+
element.append(img);
|
|
32
|
+
}
|
|
33
|
+
const body = make(doc, 'div', 'fd-map-card-body');
|
|
34
|
+
const close = closeButton(doc, labels, options.close);
|
|
35
|
+
body.append(make(doc, 'div', 'fd-map-card-head', make(doc, 'strong', 'fd-map-card-title', title), close));
|
|
36
|
+
const lines = options.fields
|
|
37
|
+
.map((name) => [page.fields[name]?.label ?? name, shown(page, name, record.values, locale)])
|
|
38
|
+
.filter(([, value]) => value !== '');
|
|
39
|
+
if (lines.length)
|
|
40
|
+
body.append(make(doc, 'dl', 'fd-map-card-fields', ...lines.map(([label, value]) => make(doc, 'div', '', make(doc, 'dt', '', label), make(doc, 'dd', '', value)))));
|
|
41
|
+
const box = make(doc, 'input', 'fd-map-card-check');
|
|
42
|
+
box.type = 'checkbox';
|
|
43
|
+
box.checked = options.chosen;
|
|
44
|
+
box.addEventListener('change', () => options.choose(box.checked));
|
|
45
|
+
const actions = make(doc, 'div', 'fd-map-card-actions', make(doc, 'label', 'fd-map-card-choose', box, labels.choose));
|
|
46
|
+
let first = close;
|
|
47
|
+
if (options.open && options.card.open !== false) {
|
|
48
|
+
const open = make(doc, 'button', 'fd-button fd-button-primary fd-map-card-open', labels.openRecord);
|
|
49
|
+
open.type = 'button';
|
|
50
|
+
open.addEventListener('click', () => options.open?.());
|
|
51
|
+
actions.append(open);
|
|
52
|
+
first = open;
|
|
53
|
+
}
|
|
54
|
+
body.append(actions);
|
|
55
|
+
element.append(body);
|
|
56
|
+
return {
|
|
57
|
+
element,
|
|
58
|
+
setChosen: (on) => (box.checked = on),
|
|
59
|
+
focus: () => first.focus(),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/** Pins on one spot that no zoom parts: a list of them, each opening its own card. */
|
|
63
|
+
export function drawCrowd(options) {
|
|
64
|
+
const { document: doc, labels } = options;
|
|
65
|
+
const heading = fill(labels.crowd, { n: options.records.length });
|
|
66
|
+
const element = make(doc, 'div', 'fd-map-card fd-map-crowd');
|
|
67
|
+
element.dir = options.dir;
|
|
68
|
+
element.setAttribute('role', 'group');
|
|
69
|
+
element.setAttribute('aria-label', heading);
|
|
70
|
+
const close = closeButton(doc, labels, options.close);
|
|
71
|
+
const items = options.records.map(({ record, name }) => {
|
|
72
|
+
const button = make(doc, 'button', 'fd-map-crowd-item', name);
|
|
73
|
+
button.type = 'button';
|
|
74
|
+
button.dataset['id'] = String(record.id);
|
|
75
|
+
button.addEventListener('click', () => options.pick(record));
|
|
76
|
+
return make(doc, 'li', '', button);
|
|
77
|
+
});
|
|
78
|
+
element.append(make(doc, 'div', 'fd-map-card-body', make(doc, 'div', 'fd-map-card-head', make(doc, 'strong', 'fd-map-card-title', heading), close), make(doc, 'ul', 'fd-map-crowd-list', ...items)));
|
|
79
|
+
return {
|
|
80
|
+
element,
|
|
81
|
+
setChosen: () => undefined,
|
|
82
|
+
focus: () => (items[0]?.querySelector('button') ?? close).focus(),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=card.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.mjs","sourceRoot":"","sources":["../../../../../libs/map/src/lib/card.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pins that crowd, gathered: each point in turn takes every point not yet
|
|
3
|
+
* gathered within `radius` pixels of it. A bubble stands in the middle of
|
|
4
|
+
* its points, so two bubbles' middles can fall near each other: those are
|
|
5
|
+
* gathered again, until no two lie nearer than `radius`. Points are looked
|
|
6
|
+
* up in a grid of `radius` squares, nine squares around each: thousands in a
|
|
7
|
+
* few milliseconds. Returns the groups as indexes into `points`, each in order.
|
|
8
|
+
*/
|
|
9
|
+
export declare function clusterPoints(points: readonly {
|
|
10
|
+
x: number;
|
|
11
|
+
y: number;
|
|
12
|
+
}[], radius: number): number[][];
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pins that crowd, gathered: each point in turn takes every point not yet
|
|
3
|
+
* gathered within `radius` pixels of it. A bubble stands in the middle of
|
|
4
|
+
* its points, so two bubbles' middles can fall near each other: those are
|
|
5
|
+
* gathered again, until no two lie nearer than `radius`. Points are looked
|
|
6
|
+
* up in a grid of `radius` squares, nine squares around each: thousands in a
|
|
7
|
+
* few milliseconds. Returns the groups as indexes into `points`, each in order.
|
|
8
|
+
*/
|
|
9
|
+
export declare function clusterPoints(points: readonly {
|
|
10
|
+
x: number;
|
|
11
|
+
y: number;
|
|
12
|
+
}[], radius: number): number[][];
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.clusterPoints = clusterPoints;
|
|
4
|
+
/**
|
|
5
|
+
* Pins that crowd, gathered: each point in turn takes every point not yet
|
|
6
|
+
* gathered within `radius` pixels of it. A bubble stands in the middle of
|
|
7
|
+
* its points, so two bubbles' middles can fall near each other: those are
|
|
8
|
+
* gathered again, until no two lie nearer than `radius`. Points are looked
|
|
9
|
+
* up in a grid of `radius` squares, nine squares around each: thousands in a
|
|
10
|
+
* few milliseconds. Returns the groups as indexes into `points`, each in order.
|
|
11
|
+
*/
|
|
12
|
+
function clusterPoints(points, radius) {
|
|
13
|
+
let groups = gather(points, radius);
|
|
14
|
+
for (;;) {
|
|
15
|
+
const middles = groups.map((group) => ({
|
|
16
|
+
x: group.reduce((sum, i) => sum + points[i].x, 0) / group.length,
|
|
17
|
+
y: group.reduce((sum, i) => sum + points[i].y, 0) / group.length,
|
|
18
|
+
}));
|
|
19
|
+
const merged = gather(middles, radius);
|
|
20
|
+
if (merged.length === groups.length)
|
|
21
|
+
return groups;
|
|
22
|
+
groups = merged.map((parts) => parts.flatMap((part) => groups[part]).sort((a, b) => a - b)).sort((a, b) => a[0] - b[0]);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** One pass: each point in turn takes every point not yet taken within `radius` of it. */
|
|
26
|
+
function gather(points, radius) {
|
|
27
|
+
const cell = (n) => Math.floor(n / radius);
|
|
28
|
+
const grid = new Map();
|
|
29
|
+
points.forEach((p, i) => {
|
|
30
|
+
const key = `${cell(p.x)}:${cell(p.y)}`;
|
|
31
|
+
const list = grid.get(key);
|
|
32
|
+
if (list)
|
|
33
|
+
list.push(i);
|
|
34
|
+
else
|
|
35
|
+
grid.set(key, [i]);
|
|
36
|
+
});
|
|
37
|
+
const taken = new Uint8Array(points.length);
|
|
38
|
+
const groups = [];
|
|
39
|
+
points.forEach((p, i) => {
|
|
40
|
+
if (taken[i])
|
|
41
|
+
return;
|
|
42
|
+
taken[i] = 1;
|
|
43
|
+
const group = [i];
|
|
44
|
+
const cx = cell(p.x);
|
|
45
|
+
const cy = cell(p.y);
|
|
46
|
+
for (let dx = -1; dx <= 1; dx++) {
|
|
47
|
+
for (let dy = -1; dy <= 1; dy++) {
|
|
48
|
+
for (const j of grid.get(`${cx + dx}:${cy + dy}`) ?? []) {
|
|
49
|
+
if (taken[j] || Math.hypot(points[j].x - p.x, points[j].y - p.y) > radius)
|
|
50
|
+
continue;
|
|
51
|
+
taken[j] = 1;
|
|
52
|
+
group.push(j);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
groups.push(group.sort((a, b) => a - b));
|
|
57
|
+
});
|
|
58
|
+
return groups;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=cluster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/cluster.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pins that crowd, gathered: each point in turn takes every point not yet
|
|
3
|
+
* gathered within `radius` pixels of it. A bubble stands in the middle of
|
|
4
|
+
* its points, so two bubbles' middles can fall near each other: those are
|
|
5
|
+
* gathered again, until no two lie nearer than `radius`. Points are looked
|
|
6
|
+
* up in a grid of `radius` squares, nine squares around each: thousands in a
|
|
7
|
+
* few milliseconds. Returns the groups as indexes into `points`, each in order.
|
|
8
|
+
*/
|
|
9
|
+
export function clusterPoints(points, radius) {
|
|
10
|
+
let groups = gather(points, radius);
|
|
11
|
+
for (;;) {
|
|
12
|
+
const middles = groups.map((group) => ({
|
|
13
|
+
x: group.reduce((sum, i) => sum + points[i].x, 0) / group.length,
|
|
14
|
+
y: group.reduce((sum, i) => sum + points[i].y, 0) / group.length,
|
|
15
|
+
}));
|
|
16
|
+
const merged = gather(middles, radius);
|
|
17
|
+
if (merged.length === groups.length)
|
|
18
|
+
return groups;
|
|
19
|
+
groups = merged.map((parts) => parts.flatMap((part) => groups[part]).sort((a, b) => a - b)).sort((a, b) => a[0] - b[0]);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** One pass: each point in turn takes every point not yet taken within `radius` of it. */
|
|
23
|
+
function gather(points, radius) {
|
|
24
|
+
const cell = (n) => Math.floor(n / radius);
|
|
25
|
+
const grid = new Map();
|
|
26
|
+
points.forEach((p, i) => {
|
|
27
|
+
const key = `${cell(p.x)}:${cell(p.y)}`;
|
|
28
|
+
const list = grid.get(key);
|
|
29
|
+
if (list)
|
|
30
|
+
list.push(i);
|
|
31
|
+
else
|
|
32
|
+
grid.set(key, [i]);
|
|
33
|
+
});
|
|
34
|
+
const taken = new Uint8Array(points.length);
|
|
35
|
+
const groups = [];
|
|
36
|
+
points.forEach((p, i) => {
|
|
37
|
+
if (taken[i])
|
|
38
|
+
return;
|
|
39
|
+
taken[i] = 1;
|
|
40
|
+
const group = [i];
|
|
41
|
+
const cx = cell(p.x);
|
|
42
|
+
const cy = cell(p.y);
|
|
43
|
+
for (let dx = -1; dx <= 1; dx++) {
|
|
44
|
+
for (let dy = -1; dy <= 1; dy++) {
|
|
45
|
+
for (const j of grid.get(`${cx + dx}:${cy + dy}`) ?? []) {
|
|
46
|
+
if (taken[j] || Math.hypot(points[j].x - p.x, points[j].y - p.y) > radius)
|
|
47
|
+
continue;
|
|
48
|
+
taken[j] = 1;
|
|
49
|
+
group.push(j);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
groups.push(group.sort((a, b) => a - b));
|
|
54
|
+
});
|
|
55
|
+
return groups;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=cluster.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster.mjs","sourceRoot":"","sources":["../../../../../libs/map/src/lib/cluster.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type Area, type Shape } from './geo.mjs';
|
|
2
|
+
import { type MapLabels } from './labels.mjs';
|
|
3
|
+
import type { MapBox } from './map-core.mjs';
|
|
4
|
+
/**
|
|
5
|
+
* A shape drawn on a map: a polygon point by point, a box or a circle by a
|
|
6
|
+
* drag, by a mouse, a finger, a pen or the keys. A bar over the map says what
|
|
7
|
+
* to do, with Finish and Cancel. While a tool is in hand the ground holds
|
|
8
|
+
* still: a press is a point, never a pan. Shared by the area field and a
|
|
9
|
+
* list's map, which hand it what is drawn.
|
|
10
|
+
*/
|
|
11
|
+
/** Each tool's drawing, for its button. */
|
|
12
|
+
export declare const SHAPE_ICONS: Record<Shape, string>;
|
|
13
|
+
export interface ShapeDrawingOptions {
|
|
14
|
+
box: MapBox;
|
|
15
|
+
labels: MapLabels;
|
|
16
|
+
/** Where the drawing's keys are heard, wherever the focus is inside it: a field, or a list's map. */
|
|
17
|
+
keys: HTMLElement;
|
|
18
|
+
announce(words: string): void;
|
|
19
|
+
/** The tool in hand changed, or was put down. */
|
|
20
|
+
armed(mode: Shape | null): void;
|
|
21
|
+
/** A shape is drawn: the tool is put down first. */
|
|
22
|
+
done(area: Area): void;
|
|
23
|
+
/** Escape put the tool down: where the focus goes. */
|
|
24
|
+
escaped(): void;
|
|
25
|
+
/** Whether Enter on this part finishes a polygon, besides the map and Finish (the Polygon button). */
|
|
26
|
+
finishesOn?(target: EventTarget | null): boolean;
|
|
27
|
+
/** Parts over the map a press on is no point: the bar's own, the zoom, the credits, and the caller's. */
|
|
28
|
+
over?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface ShapeDrawing {
|
|
31
|
+
/** The tool in hand, or none. */
|
|
32
|
+
readonly mode: Shape | null;
|
|
33
|
+
/** Take a tool, or put it down (null). */
|
|
34
|
+
arm(next: Shape | null): void;
|
|
35
|
+
}
|
|
36
|
+
export declare function shapeDrawing(options: ShapeDrawingOptions): ShapeDrawing;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type Area, type Shape } from './geo';
|
|
2
|
+
import { type MapLabels } from './labels';
|
|
3
|
+
import type { MapBox } from './map-core';
|
|
4
|
+
/**
|
|
5
|
+
* A shape drawn on a map: a polygon point by point, a box or a circle by a
|
|
6
|
+
* drag, by a mouse, a finger, a pen or the keys. A bar over the map says what
|
|
7
|
+
* to do, with Finish and Cancel. While a tool is in hand the ground holds
|
|
8
|
+
* still: a press is a point, never a pan. Shared by the area field and a
|
|
9
|
+
* list's map, which hand it what is drawn.
|
|
10
|
+
*/
|
|
11
|
+
/** Each tool's drawing, for its button. */
|
|
12
|
+
export declare const SHAPE_ICONS: Record<Shape, string>;
|
|
13
|
+
export interface ShapeDrawingOptions {
|
|
14
|
+
box: MapBox;
|
|
15
|
+
labels: MapLabels;
|
|
16
|
+
/** Where the drawing's keys are heard, wherever the focus is inside it: a field, or a list's map. */
|
|
17
|
+
keys: HTMLElement;
|
|
18
|
+
announce(words: string): void;
|
|
19
|
+
/** The tool in hand changed, or was put down. */
|
|
20
|
+
armed(mode: Shape | null): void;
|
|
21
|
+
/** A shape is drawn: the tool is put down first. */
|
|
22
|
+
done(area: Area): void;
|
|
23
|
+
/** Escape put the tool down: where the focus goes. */
|
|
24
|
+
escaped(): void;
|
|
25
|
+
/** Whether Enter on this part finishes a polygon, besides the map and Finish (the Polygon button). */
|
|
26
|
+
finishesOn?(target: EventTarget | null): boolean;
|
|
27
|
+
/** Parts over the map a press on is no point: the bar's own, the zoom, the credits, and the caller's. */
|
|
28
|
+
over?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface ShapeDrawing {
|
|
31
|
+
/** The tool in hand, or none. */
|
|
32
|
+
readonly mode: Shape | null;
|
|
33
|
+
/** Take a tool, or put it down (null). */
|
|
34
|
+
arm(next: Shape | null): void;
|
|
35
|
+
}
|
|
36
|
+
export declare function shapeDrawing(options: ShapeDrawingOptions): ShapeDrawing;
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SHAPE_ICONS = void 0;
|
|
4
|
+
exports.shapeDrawing = shapeDrawing;
|
|
5
|
+
const geo_1 = require("./geo");
|
|
6
|
+
const labels_1 = require("./labels");
|
|
7
|
+
/**
|
|
8
|
+
* A shape drawn on a map: a polygon point by point, a box or a circle by a
|
|
9
|
+
* drag, by a mouse, a finger, a pen or the keys. A bar over the map says what
|
|
10
|
+
* to do, with Finish and Cancel. While a tool is in hand the ground holds
|
|
11
|
+
* still: a press is a point, never a pan. Shared by the area field and a
|
|
12
|
+
* list's map, which hand it what is drawn.
|
|
13
|
+
*/
|
|
14
|
+
/** Each tool's drawing, for its button. */
|
|
15
|
+
exports.SHAPE_ICONS = {
|
|
16
|
+
polygon: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M5 8l7-5 7 6-3 11H7z"/></svg>',
|
|
17
|
+
box: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><rect x="4" y="6" width="16" height="12" rx="1"/></svg>',
|
|
18
|
+
circle: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><circle cx="12" cy="12" r="8"/></svg>',
|
|
19
|
+
};
|
|
20
|
+
/** How near the first point a press closes the ring: a fingertip's width, not the mark's. */
|
|
21
|
+
const CLOSE_PX = 22;
|
|
22
|
+
/** A press that moves less than this is a press, not a drag: no box, no circle. */
|
|
23
|
+
const DRAG_PX = 4;
|
|
24
|
+
function shapeDrawing(options) {
|
|
25
|
+
const { box, labels, announce } = options;
|
|
26
|
+
const doc = box.element.ownerDocument;
|
|
27
|
+
const over = ['.fd-map-hint', '.fd-map-zoom', '.fd-map-credits', '.fd-map-logo', options.over].filter(Boolean).join(', ');
|
|
28
|
+
let mode = null;
|
|
29
|
+
/** A polygon's points so far. */
|
|
30
|
+
let points = [];
|
|
31
|
+
/** Where a box or a circle began, by a press or by Space. */
|
|
32
|
+
let anchor = null;
|
|
33
|
+
let map = null;
|
|
34
|
+
let L = null;
|
|
35
|
+
/** The outline reaching for the pointer. */
|
|
36
|
+
let trace = null;
|
|
37
|
+
/** A polygon's points while it is drawn. */
|
|
38
|
+
const marks = [];
|
|
39
|
+
// The bar over the map while a tool is in hand: what to do, and the ways out.
|
|
40
|
+
const hint = doc.createElement('div');
|
|
41
|
+
hint.className = 'fd-map-hint';
|
|
42
|
+
hint.hidden = true;
|
|
43
|
+
const hintWords = doc.createElement('p');
|
|
44
|
+
const finishButton = doc.createElement('button');
|
|
45
|
+
finishButton.type = 'button';
|
|
46
|
+
finishButton.className = 'fd-button fd-button-primary';
|
|
47
|
+
finishButton.textContent = labels.finish;
|
|
48
|
+
finishButton.addEventListener('click', () => finish());
|
|
49
|
+
const cancelButton = doc.createElement('button');
|
|
50
|
+
cancelButton.type = 'button';
|
|
51
|
+
cancelButton.className = 'fd-button';
|
|
52
|
+
cancelButton.textContent = labels.cancel;
|
|
53
|
+
cancelButton.addEventListener('click', () => arm(null));
|
|
54
|
+
hint.append(hintWords, finishButton, cancelButton);
|
|
55
|
+
box.element.append(hint);
|
|
56
|
+
box.shield(hint);
|
|
57
|
+
box.follow(hint);
|
|
58
|
+
function sayStep() {
|
|
59
|
+
if (!mode)
|
|
60
|
+
return;
|
|
61
|
+
const words = mode === 'polygon' ? labels.drawPolygon : mode === 'box' ? labels.drawBox : labels.drawCircle;
|
|
62
|
+
hintWords.textContent = mode === 'polygon' && points.length ? `${words} ${(0, labels_1.fill)(labels.points, { n: points.length })}.` : words;
|
|
63
|
+
finishButton.hidden = mode !== 'polygon' || points.length < 3;
|
|
64
|
+
}
|
|
65
|
+
function arm(next) {
|
|
66
|
+
mode = next;
|
|
67
|
+
points = [];
|
|
68
|
+
anchor = null;
|
|
69
|
+
trace?.remove();
|
|
70
|
+
trace = null;
|
|
71
|
+
remark();
|
|
72
|
+
hint.hidden = !mode;
|
|
73
|
+
// Every tool holds the ground still: a press is a point, never a pan.
|
|
74
|
+
box.setPannable(!mode);
|
|
75
|
+
box.ready((m) => (mode ? m.doubleClickZoom.disable() : m.doubleClickZoom.enable()));
|
|
76
|
+
if (mode)
|
|
77
|
+
box.element.dataset['drawing'] = mode;
|
|
78
|
+
else
|
|
79
|
+
delete box.element.dataset['drawing'];
|
|
80
|
+
sayStep();
|
|
81
|
+
options.armed(mode);
|
|
82
|
+
if (mode)
|
|
83
|
+
announce(hintWords.textContent ?? '');
|
|
84
|
+
}
|
|
85
|
+
function gripIcon() {
|
|
86
|
+
return L.divIcon({ className: 'fd-map-grip', iconSize: [24, 24], iconAnchor: [12, 12] });
|
|
87
|
+
}
|
|
88
|
+
/** The marks of a polygon's points: made again only when the points change, never as the pointer moves. */
|
|
89
|
+
function remark() {
|
|
90
|
+
for (const m of marks.splice(0))
|
|
91
|
+
m.remove();
|
|
92
|
+
if (!map || !L || mode !== 'polygon')
|
|
93
|
+
return;
|
|
94
|
+
points.forEach((p, i) => {
|
|
95
|
+
const mark = L.marker([p.lat, p.lng], { icon: gripIcon(), interactive: i === 0, keyboard: false }).addTo(map);
|
|
96
|
+
// Back on the first point closes the ring.
|
|
97
|
+
if (i === 0)
|
|
98
|
+
mark.on('click', () => points.length >= 3 && finish());
|
|
99
|
+
marks.push(mark);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/** The outline being drawn, toward the pointer: changed in place as it moves. */
|
|
103
|
+
function retrace(toward) {
|
|
104
|
+
if (!map || !L)
|
|
105
|
+
return;
|
|
106
|
+
let ring = null;
|
|
107
|
+
let circle = null;
|
|
108
|
+
if (mode === 'polygon') {
|
|
109
|
+
ring = [...points, ...(toward ? [toward] : [])];
|
|
110
|
+
if (ring.length < 2)
|
|
111
|
+
ring = null;
|
|
112
|
+
marks[0]?.getElement()?.toggleAttribute('data-closes', nearFirst(toward));
|
|
113
|
+
}
|
|
114
|
+
else if (anchor && toward) {
|
|
115
|
+
if (mode === 'box')
|
|
116
|
+
ring = (0, geo_1.boxFrom)(anchor, toward);
|
|
117
|
+
else
|
|
118
|
+
circle = { center: anchor, radius: (0, geo_1.metresBetween)(anchor, toward) };
|
|
119
|
+
}
|
|
120
|
+
const latLngs = ring?.map((p) => [p.lat, p.lng]);
|
|
121
|
+
if (trace && latLngs && trace instanceof L.Polygon && !(trace instanceof L.Rectangle)) {
|
|
122
|
+
trace.setLatLngs(latLngs);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (trace && circle && trace instanceof L.Circle) {
|
|
126
|
+
trace.setLatLng([circle.center.lat, circle.center.lng]);
|
|
127
|
+
trace.setRadius(circle.radius);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
trace?.remove();
|
|
131
|
+
trace = null;
|
|
132
|
+
if (latLngs)
|
|
133
|
+
trace = L.polygon(latLngs, { className: 'fd-map-trace', interactive: false }).addTo(map);
|
|
134
|
+
else if (circle)
|
|
135
|
+
trace = L.circle([circle.center.lat, circle.center.lng], { radius: circle.radius, className: 'fd-map-trace', interactive: false }).addTo(map);
|
|
136
|
+
}
|
|
137
|
+
function nearFirst(at) {
|
|
138
|
+
if (!map || !at || points.length < 3)
|
|
139
|
+
return false;
|
|
140
|
+
return map.latLngToContainerPoint([points[0].lat, points[0].lng]).distanceTo(map.latLngToContainerPoint([at.lat, at.lng])) <= CLOSE_PX;
|
|
141
|
+
}
|
|
142
|
+
function addPoint(at) {
|
|
143
|
+
if (mode === 'polygon') {
|
|
144
|
+
if (nearFirst(at))
|
|
145
|
+
return finish();
|
|
146
|
+
points.push(at);
|
|
147
|
+
sayStep();
|
|
148
|
+
remark();
|
|
149
|
+
retrace();
|
|
150
|
+
announce((0, labels_1.fill)(labels.points, { n: points.length }));
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (!anchor) {
|
|
154
|
+
anchor = at;
|
|
155
|
+
retrace(at);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const start = anchor;
|
|
159
|
+
if (mode === 'box')
|
|
160
|
+
complete({ shape: 'box', points: (0, geo_1.boxFrom)(start, at) });
|
|
161
|
+
else if (mode === 'circle')
|
|
162
|
+
complete({ shape: 'circle', center: start, radius: Math.max(1, (0, geo_1.metresBetween)(start, at)) });
|
|
163
|
+
}
|
|
164
|
+
function finish() {
|
|
165
|
+
if (mode !== 'polygon' || points.length < 3)
|
|
166
|
+
return;
|
|
167
|
+
complete({ shape: 'polygon', points: [...points] });
|
|
168
|
+
}
|
|
169
|
+
function complete(drawn) {
|
|
170
|
+
arm(null);
|
|
171
|
+
options.done(drawn);
|
|
172
|
+
}
|
|
173
|
+
box.ready((m, leaflet) => {
|
|
174
|
+
map = m;
|
|
175
|
+
L = leaflet;
|
|
176
|
+
m.on('click', (event) => {
|
|
177
|
+
if (mode === 'polygon')
|
|
178
|
+
addPoint({ lat: event.latlng.lat, lng: event.latlng.lng });
|
|
179
|
+
});
|
|
180
|
+
m.on('dblclick', () => {
|
|
181
|
+
if (mode !== 'polygon')
|
|
182
|
+
return;
|
|
183
|
+
// The two clicks of a double-click have each placed a point, on top of each other: one is enough.
|
|
184
|
+
const [a, b] = points.slice(-2);
|
|
185
|
+
if (a && b && m.latLngToContainerPoint([a.lat, a.lng]).distanceTo(m.latLngToContainerPoint([b.lat, b.lng])) < 6) {
|
|
186
|
+
points.pop();
|
|
187
|
+
remark();
|
|
188
|
+
}
|
|
189
|
+
finish();
|
|
190
|
+
});
|
|
191
|
+
m.on('mousemove', (event) => {
|
|
192
|
+
if (mode === 'polygon' && points.length)
|
|
193
|
+
retrace({ lat: event.latlng.lat, lng: event.latlng.lng });
|
|
194
|
+
});
|
|
195
|
+
// A box and a circle are drawn by dragging: pointer events, which a mouse, a finger and a pen all raise.
|
|
196
|
+
let pressed = null;
|
|
197
|
+
box.element.addEventListener('pointerdown', (event) => {
|
|
198
|
+
if ((mode !== 'box' && mode !== 'circle') || event.button !== 0)
|
|
199
|
+
return;
|
|
200
|
+
if (event.target.closest(over))
|
|
201
|
+
return;
|
|
202
|
+
const at = m.mouseEventToLatLng(event);
|
|
203
|
+
pressed = { x: event.clientX, y: event.clientY, id: event.pointerId };
|
|
204
|
+
anchor = { lat: at.lat, lng: at.lng };
|
|
205
|
+
box.element.setPointerCapture?.(event.pointerId);
|
|
206
|
+
});
|
|
207
|
+
box.element.addEventListener('pointermove', (event) => {
|
|
208
|
+
if (!pressed || event.pointerId !== pressed.id)
|
|
209
|
+
return;
|
|
210
|
+
const at = m.mouseEventToLatLng(event);
|
|
211
|
+
retrace({ lat: at.lat, lng: at.lng });
|
|
212
|
+
});
|
|
213
|
+
const release = (event) => {
|
|
214
|
+
if (!pressed || event.pointerId !== pressed.id)
|
|
215
|
+
return;
|
|
216
|
+
const moved = Math.hypot(event.clientX - pressed.x, event.clientY - pressed.y);
|
|
217
|
+
const at = m.mouseEventToLatLng(event);
|
|
218
|
+
pressed = null;
|
|
219
|
+
// A press with no drag is no shape: the tool stays in hand.
|
|
220
|
+
if (event.type === 'pointercancel' || moved < DRAG_PX) {
|
|
221
|
+
anchor = null;
|
|
222
|
+
retrace();
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
addPoint({ lat: at.lat, lng: at.lng });
|
|
226
|
+
};
|
|
227
|
+
box.element.addEventListener('pointerup', release);
|
|
228
|
+
box.element.addEventListener('pointercancel', release);
|
|
229
|
+
});
|
|
230
|
+
// The keys of drawing, wherever in the part the focus is.
|
|
231
|
+
options.keys.addEventListener('keydown', (event) => {
|
|
232
|
+
if (!mode)
|
|
233
|
+
return;
|
|
234
|
+
const onMap = event.target === box.element;
|
|
235
|
+
if (event.key === 'Escape') {
|
|
236
|
+
event.preventDefault();
|
|
237
|
+
// The list's own card and search take no Escape meant for the drawing.
|
|
238
|
+
event.stopPropagation();
|
|
239
|
+
arm(null);
|
|
240
|
+
options.escaped();
|
|
241
|
+
}
|
|
242
|
+
else if (event.key === 'Enter' && mode === 'polygon' && points.length >= 3 && (onMap || event.target === finishButton || !!options.finishesOn?.(event.target))) {
|
|
243
|
+
event.preventDefault();
|
|
244
|
+
finish();
|
|
245
|
+
}
|
|
246
|
+
else if (event.key === 'Backspace' && mode === 'polygon' && points.length && onMap) {
|
|
247
|
+
event.preventDefault();
|
|
248
|
+
points.pop();
|
|
249
|
+
sayStep();
|
|
250
|
+
remark();
|
|
251
|
+
retrace();
|
|
252
|
+
announce((0, labels_1.fill)(labels.points, { n: points.length }));
|
|
253
|
+
}
|
|
254
|
+
else if (event.key === ' ' && onMap && map) {
|
|
255
|
+
event.preventDefault();
|
|
256
|
+
const c = map.getCenter();
|
|
257
|
+
addPoint({ lat: c.lat, lng: c.lng });
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
return {
|
|
261
|
+
get mode() {
|
|
262
|
+
return mode;
|
|
263
|
+
},
|
|
264
|
+
arm,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=drawing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drawing.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/drawing.ts"],"names":[],"mappings":"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"}
|