@fieldia/map 0.18.0 → 0.19.1
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 +143 -3
- package/package.json +4 -4
- package/src/index.d.mts +5 -0
- package/src/index.d.ts +5 -0
- package/src/index.js +4 -1
- package/src/index.js.map +1 -1
- package/src/index.mjs +2 -0
- package/src/index.mjs.map +1 -1
- package/src/lib/address-labels.d.mts +33 -0
- package/src/lib/address-labels.d.ts +33 -0
- package/src/lib/address-labels.js +16 -0
- package/src/lib/address-labels.js.map +1 -0
- package/src/lib/address-labels.mjs +12 -0
- package/src/lib/address-labels.mjs.map +1 -0
- package/src/lib/address-line.d.mts +11 -0
- package/src/lib/address-line.d.ts +11 -0
- package/src/lib/address-line.js +51 -0
- package/src/lib/address-line.js.map +1 -0
- package/src/lib/address-line.mjs +47 -0
- package/src/lib/address-line.mjs.map +1 -0
- package/src/lib/address-names.d.mts +38 -0
- package/src/lib/address-names.d.ts +38 -0
- package/src/lib/address-names.js +240 -0
- package/src/lib/address-names.js.map +1 -0
- package/src/lib/address-names.mjs +232 -0
- package/src/lib/address-names.mjs.map +1 -0
- package/src/lib/address-parts.d.mts +146 -0
- package/src/lib/address-parts.d.ts +146 -0
- package/src/lib/address-parts.js +866 -0
- package/src/lib/address-parts.js.map +1 -0
- package/src/lib/address-parts.mjs +851 -0
- package/src/lib/address-parts.mjs.map +1 -0
- package/src/lib/address-search.d.mts +25 -0
- package/src/lib/address-search.d.ts +25 -0
- package/src/lib/address-search.js +70 -0
- package/src/lib/address-search.js.map +1 -0
- package/src/lib/address-search.mjs +67 -0
- package/src/lib/address-search.mjs.map +1 -0
- package/src/lib/address-suggest.d.mts +21 -0
- package/src/lib/address-suggest.d.ts +21 -0
- package/src/lib/address-suggest.js +273 -0
- package/src/lib/address-suggest.js.map +1 -0
- package/src/lib/address-suggest.mjs +270 -0
- package/src/lib/address-suggest.mjs.map +1 -0
- package/src/lib/area-count.d.mts +47 -0
- package/src/lib/area-count.d.ts +47 -0
- package/src/lib/area-count.js +123 -0
- package/src/lib/area-count.js.map +1 -0
- package/src/lib/area-count.mjs +116 -0
- package/src/lib/area-count.mjs.map +1 -0
- package/src/lib/card.d.mts +14 -5
- package/src/lib/card.d.ts +14 -5
- package/src/lib/card.js +67 -12
- package/src/lib/card.js.map +1 -1
- package/src/lib/card.mjs +66 -12
- package/src/lib/card.mjs.map +1 -1
- package/src/lib/embed.d.mts +86 -0
- package/src/lib/embed.d.ts +86 -0
- package/src/lib/embed.js +96 -0
- package/src/lib/embed.js.map +1 -0
- package/src/lib/embed.mjs +93 -0
- package/src/lib/embed.mjs.map +1 -0
- package/src/lib/form-map.js +9 -7
- package/src/lib/form-map.js.map +1 -1
- package/src/lib/form-map.mjs +10 -8
- package/src/lib/form-map.mjs.map +1 -1
- package/src/lib/kinds.d.mts +6 -4
- package/src/lib/kinds.d.ts +6 -4
- package/src/lib/kinds.js +49 -2
- package/src/lib/kinds.js.map +1 -1
- package/src/lib/kinds.mjs +49 -2
- package/src/lib/kinds.mjs.map +1 -1
- package/src/lib/labels.d.mts +2 -0
- package/src/lib/labels.d.ts +2 -0
- package/src/lib/labels.js +4 -0
- package/src/lib/labels.js.map +1 -1
- package/src/lib/labels.mjs +4 -0
- package/src/lib/labels.mjs.map +1 -1
- package/src/lib/list-view.d.mts +37 -1
- package/src/lib/list-view.d.ts +37 -1
- package/src/lib/list-view.js +97 -37
- package/src/lib/list-view.js.map +1 -1
- package/src/lib/list-view.mjs +97 -38
- package/src/lib/list-view.mjs.map +1 -1
- package/src/lib/map-core.d.mts +6 -1
- package/src/lib/map-core.d.ts +6 -1
- package/src/lib/map-core.js +13 -5
- package/src/lib/map-core.js.map +1 -1
- package/src/lib/map-core.mjs +13 -5
- package/src/lib/map-core.mjs.map +1 -1
- package/src/lib/pins.d.mts +20 -8
- package/src/lib/pins.d.ts +20 -8
- package/src/lib/pins.js +60 -15
- package/src/lib/pins.js.map +1 -1
- package/src/lib/pins.mjs +60 -17
- package/src/lib/pins.mjs.map +1 -1
- package/src/lib/place.js +23 -11
- package/src/lib/place.js.map +1 -1
- package/src/lib/place.mjs +23 -11
- package/src/lib/place.mjs.map +1 -1
- package/src/lib/providers.d.mts +16 -0
- package/src/lib/providers.d.ts +16 -0
- package/src/lib/providers.js +71 -112
- package/src/lib/providers.js.map +1 -1
- package/src/lib/providers.mjs +71 -112
- package/src/lib/providers.mjs.map +1 -1
- package/src/lib/regions.js +18 -1
- package/src/lib/regions.js.map +1 -1
- package/src/lib/regions.mjs +18 -1
- package/src/lib/regions.mjs.map +1 -1
- package/src/lib/route-line.d.mts +9 -0
- package/src/lib/route-line.d.ts +9 -0
- package/src/lib/route-line.js +13 -0
- package/src/lib/route-line.js.map +1 -1
- package/src/lib/route-line.mjs +11 -0
- package/src/lib/route-line.mjs.map +1 -1
- package/src/lib/routes.js +6 -2
- package/src/lib/routes.js.map +1 -1
- package/src/lib/routes.mjs +6 -2
- package/src/lib/routes.mjs.map +1 -1
- package/src/lib/search-box.d.mts +20 -2
- package/src/lib/search-box.d.ts +20 -2
- package/src/lib/search-box.js +133 -44
- package/src/lib/search-box.js.map +1 -1
- package/src/lib/search-box.mjs +133 -44
- package/src/lib/search-box.mjs.map +1 -1
- package/src/lib/settings.d.mts +19 -2
- package/src/lib/settings.d.ts +19 -2
- package/src/lib/styles.d.mts +12 -1
- package/src/lib/styles.d.ts +12 -1
- package/src/lib/styles.js +61 -3
- package/src/lib/styles.js.map +1 -1
- package/src/lib/styles.mjs +59 -2
- package/src/lib/styles.mjs.map +1 -1
- package/src/lib/view-box.d.mts +18 -0
- package/src/lib/view-box.d.ts +18 -0
- package/src/lib/view-box.js +31 -0
- package/src/lib/view-box.js.map +1 -0
- package/src/lib/view-box.mjs +25 -0
- package/src/lib/view-box.mjs.map +1 -0
- package/src/lib/widgets.d.mts +3 -0
- package/src/lib/widgets.d.ts +3 -0
- package/src/lib/widgets.js +10 -1
- package/src/lib/widgets.js.map +1 -1
- package/src/lib/widgets.mjs +10 -1
- package/src/lib/widgets.mjs.map +1 -1
package/src/lib/search-box.js
CHANGED
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.searchBox = searchBox;
|
|
4
|
+
const address_line_1 = require("./address-line");
|
|
4
5
|
const map_core_1 = require("./map-core");
|
|
5
6
|
function searchBox(options) {
|
|
6
7
|
const { document: doc, labels } = options;
|
|
7
8
|
const element = doc.createElement('div');
|
|
8
9
|
element.className = 'fd-map-search';
|
|
9
|
-
const input = doc.createElement('input');
|
|
10
|
-
input
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
const input = options.input ?? doc.createElement('input');
|
|
11
|
+
if (!options.input) {
|
|
12
|
+
input.className = 'fd-input';
|
|
13
|
+
input.id = options.id;
|
|
14
|
+
input.type = 'text';
|
|
15
|
+
input.placeholder = labels.search;
|
|
16
|
+
input.autocomplete = 'off';
|
|
17
|
+
input.spellcheck = false;
|
|
18
|
+
input.enterKeyHint = 'search';
|
|
19
|
+
}
|
|
17
20
|
const listId = `${options.id}-places`;
|
|
18
21
|
input.setAttribute('role', 'combobox');
|
|
19
22
|
input.setAttribute('aria-autocomplete', 'list');
|
|
@@ -25,16 +28,51 @@ function searchBox(options) {
|
|
|
25
28
|
list.setAttribute('role', 'listbox');
|
|
26
29
|
list.setAttribute('aria-label', labels.search);
|
|
27
30
|
list.hidden = true;
|
|
28
|
-
element.append(input, list);
|
|
31
|
+
element.append(...(options.input ? [] : [input]), list);
|
|
29
32
|
let places = [];
|
|
30
33
|
let active = -1;
|
|
31
|
-
let asking = null;
|
|
32
34
|
let timer;
|
|
35
|
+
/**
|
|
36
|
+
* The places each search brought, by its words (near the same place), and
|
|
37
|
+
* the searches on their way, by theirs, until a place is picked: the same
|
|
38
|
+
* words show them again, or wait for them. A search dropped is not called
|
|
39
|
+
* back, as the provider has its request (and may bill it): its answer is
|
|
40
|
+
* kept when it comes, and only not shown.
|
|
41
|
+
*/
|
|
42
|
+
const answers = new Map();
|
|
43
|
+
const going = new Map();
|
|
44
|
+
/** The words whose answer opens the list when it comes, and which the search is said to be going for: none once it is dropped. */
|
|
45
|
+
let wanted = '';
|
|
46
|
+
/** The search whose places the list shows, and the words it asked for. */
|
|
47
|
+
let showing = '';
|
|
48
|
+
let listed = '';
|
|
49
|
+
/** A place picked, and nothing typed since: Enter asks nothing. */
|
|
50
|
+
let picked = false;
|
|
51
|
+
/** The search waiting to go never goes; the one on its way opens nothing when it comes, and is no longer said to be going. */
|
|
52
|
+
function drop() {
|
|
53
|
+
clearTimeout(timer);
|
|
54
|
+
timer = undefined;
|
|
55
|
+
if (!wanted)
|
|
56
|
+
return;
|
|
57
|
+
wanted = '';
|
|
58
|
+
options.say(null);
|
|
59
|
+
}
|
|
60
|
+
/** The address is found, or the box gone: what is on its way is of no use, and called back; the next words are asked for anew (a provider's session ends with the pick). */
|
|
61
|
+
function stop() {
|
|
62
|
+
drop();
|
|
63
|
+
going.forEach((asked) => asked.abort());
|
|
64
|
+
going.clear();
|
|
65
|
+
answers.clear();
|
|
66
|
+
}
|
|
33
67
|
function close() {
|
|
68
|
+
const open = !list.hidden;
|
|
34
69
|
list.hidden = true;
|
|
35
70
|
input.setAttribute('aria-expanded', 'false');
|
|
36
71
|
input.removeAttribute('aria-activedescendant');
|
|
37
72
|
active = -1;
|
|
73
|
+
// What was said of the list (how many places came) goes with it.
|
|
74
|
+
if (open)
|
|
75
|
+
options.say(null);
|
|
38
76
|
}
|
|
39
77
|
function mark(index) {
|
|
40
78
|
active = index;
|
|
@@ -48,35 +86,44 @@ function searchBox(options) {
|
|
|
48
86
|
input.removeAttribute('aria-activedescendant');
|
|
49
87
|
}
|
|
50
88
|
function choose(place) {
|
|
89
|
+
// A pause in typing ends here: nothing more is asked for these words, and no answer opens the list again.
|
|
90
|
+
stop();
|
|
91
|
+
picked = true;
|
|
51
92
|
input.value = place.label;
|
|
52
93
|
close();
|
|
53
94
|
options.say(null);
|
|
95
|
+
place.picked?.();
|
|
54
96
|
options.pick(place);
|
|
55
97
|
}
|
|
56
|
-
function show(found) {
|
|
57
|
-
|
|
58
|
-
|
|
98
|
+
function show(found, these, words) {
|
|
99
|
+
showing = these;
|
|
100
|
+
listed = words;
|
|
101
|
+
// Two rows that read alike are one to the person reading them: the first is kept.
|
|
102
|
+
places = found.filter((place, i) => found.findIndex((other) => other.label === place.label && other.detail === place.detail) === i);
|
|
103
|
+
list.replaceChildren(...places.map((place, i) => {
|
|
59
104
|
const option = doc.createElement('li');
|
|
60
105
|
option.id = `${listId}-${i}`;
|
|
61
106
|
option.setAttribute('role', 'option');
|
|
62
107
|
option.setAttribute('aria-selected', 'false');
|
|
63
|
-
// The place on one line, where it is on the next, as a map's own search shows them.
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
108
|
+
// The place on one line, where it is on the next, as a map's own search shows them: both at the page's side, each in its own words' direction ("1 Mohammed Mahmoud" on an Arabic page).
|
|
109
|
+
const line = (className, words) => {
|
|
110
|
+
const span = doc.createElement('span');
|
|
111
|
+
span.className = className;
|
|
112
|
+
const own = doc.createElement('bdi');
|
|
113
|
+
own.dir = (0, address_line_1.directionOf)(words) || 'auto';
|
|
114
|
+
own.textContent = words;
|
|
115
|
+
span.append(own);
|
|
116
|
+
return span;
|
|
117
|
+
};
|
|
118
|
+
option.append(line('fd-map-result-name', place.label));
|
|
119
|
+
if (place.detail)
|
|
120
|
+
option.append(line('fd-map-result-detail', place.detail));
|
|
74
121
|
// Picked on the press, the box keeping its focus.
|
|
75
122
|
option.addEventListener('mousedown', (event) => event.preventDefault());
|
|
76
123
|
option.addEventListener('click', () => choose(place));
|
|
77
124
|
return option;
|
|
78
125
|
}));
|
|
79
|
-
const any =
|
|
126
|
+
const any = places.length > 0;
|
|
80
127
|
list.hidden = !any;
|
|
81
128
|
input.setAttribute('aria-expanded', String(any));
|
|
82
129
|
active = -1;
|
|
@@ -84,21 +131,52 @@ function searchBox(options) {
|
|
|
84
131
|
}
|
|
85
132
|
function run() {
|
|
86
133
|
clearTimeout(timer);
|
|
134
|
+
timer = undefined;
|
|
87
135
|
const text = input.value.trim();
|
|
88
|
-
asking?.abort();
|
|
89
136
|
if (text.length < (options.asYouType ? 2 : 1)) {
|
|
137
|
+
drop();
|
|
90
138
|
close();
|
|
91
139
|
options.say(null);
|
|
92
140
|
return;
|
|
93
141
|
}
|
|
94
|
-
const
|
|
142
|
+
const near = options.near();
|
|
143
|
+
const zoom = options.zoom?.();
|
|
144
|
+
const these = JSON.stringify([text, near, zoom]);
|
|
145
|
+
const had = answers.get(these);
|
|
146
|
+
if (had) {
|
|
147
|
+
// Here already: shown, unless they are, and nothing else waited for.
|
|
148
|
+
drop();
|
|
149
|
+
if (list.hidden || showing !== these)
|
|
150
|
+
show(had, these, text);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
// On their way and waited for already.
|
|
154
|
+
if (wanted === these)
|
|
155
|
+
return;
|
|
156
|
+
wanted = these;
|
|
95
157
|
options.say(labels.searching);
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
158
|
+
// On their way though dropped (Escape, a letter more): waited for again, not asked again.
|
|
159
|
+
if (going.has(these))
|
|
160
|
+
return;
|
|
161
|
+
const mine = new AbortController();
|
|
162
|
+
going.set(these, mine);
|
|
163
|
+
// Its answer is kept, whether or not its words are still waited for, and shown if they are. Called back (by a pick), it is nobody's.
|
|
164
|
+
options.search({ text, near, zoom, locale: options.locale, signal: mine.signal }).then((found) => {
|
|
165
|
+
if (mine.signal.aborted)
|
|
166
|
+
return;
|
|
167
|
+
going.delete(these);
|
|
168
|
+
answers.set(these, found);
|
|
169
|
+
if (wanted !== these)
|
|
170
|
+
return;
|
|
171
|
+
wanted = '';
|
|
172
|
+
show(found, these, text);
|
|
173
|
+
}, (error) => {
|
|
174
|
+
if (mine.signal.aborted)
|
|
101
175
|
return;
|
|
176
|
+
going.delete(these);
|
|
177
|
+
if (wanted !== these)
|
|
178
|
+
return;
|
|
179
|
+
wanted = '';
|
|
102
180
|
close();
|
|
103
181
|
options.say(labels.searchFailed, 'error');
|
|
104
182
|
// The reader is told to try again; the developer, why it failed.
|
|
@@ -106,6 +184,9 @@ function searchBox(options) {
|
|
|
106
184
|
});
|
|
107
185
|
}
|
|
108
186
|
input.addEventListener('input', () => {
|
|
187
|
+
picked = false;
|
|
188
|
+
// A row marked was marked for the words before.
|
|
189
|
+
mark(-1);
|
|
109
190
|
if (!options.asYouType) {
|
|
110
191
|
close();
|
|
111
192
|
return;
|
|
@@ -114,42 +195,50 @@ function searchBox(options) {
|
|
|
114
195
|
timer = setTimeout(run, 250);
|
|
115
196
|
});
|
|
116
197
|
input.addEventListener('keydown', (event) => {
|
|
198
|
+
if (input.readOnly)
|
|
199
|
+
return;
|
|
117
200
|
if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
|
|
118
201
|
if (list.hidden)
|
|
119
202
|
return;
|
|
120
203
|
event.preventDefault();
|
|
121
204
|
const step = event.key === 'ArrowDown' ? 1 : -1;
|
|
122
|
-
|
|
205
|
+
// From no row marked, Down marks the first and Up the last (as from the first); each goes round at the end.
|
|
206
|
+
mark(((active < 0 && step < 0 ? 0 : active) + step + places.length) % places.length);
|
|
123
207
|
}
|
|
124
208
|
else if (event.key === 'Enter') {
|
|
125
209
|
// Never the form's own Enter.
|
|
126
210
|
event.preventDefault();
|
|
127
|
-
// Enter takes the place chosen with the arrows, or the first: the one nearest and likeliest.
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
211
|
+
// Enter takes the place chosen with the arrows, or the first: the one nearest and likeliest, of a list made for the words in the box. A list made for fewer words names another place ("Al" for "Al Malqa"): their own are asked for now, and listed. On the place picked, nothing.
|
|
212
|
+
const chosen = active >= 0 ? places[active] : listed === input.value.trim() ? places[0] : undefined;
|
|
213
|
+
if (!list.hidden && chosen)
|
|
214
|
+
choose(chosen);
|
|
215
|
+
else if (!picked)
|
|
131
216
|
run();
|
|
132
217
|
}
|
|
133
218
|
else if (event.key === 'Escape') {
|
|
134
|
-
|
|
219
|
+
// The list closed, and the search that would open it again dropped, waiting or on its way.
|
|
220
|
+
if (!list.hidden || wanted || timer) {
|
|
135
221
|
event.preventDefault();
|
|
136
222
|
close();
|
|
223
|
+
drop();
|
|
137
224
|
}
|
|
138
|
-
else if (input.value) {
|
|
225
|
+
else if (input.value && !options.freeText) {
|
|
139
226
|
event.preventDefault();
|
|
140
227
|
input.value = '';
|
|
141
228
|
options.say(null);
|
|
142
229
|
}
|
|
143
230
|
}
|
|
144
231
|
});
|
|
145
|
-
|
|
232
|
+
// Left: nothing waiting goes on to open the list over the next box.
|
|
233
|
+
input.addEventListener('blur', () => {
|
|
234
|
+
close();
|
|
235
|
+
drop();
|
|
236
|
+
});
|
|
146
237
|
return {
|
|
147
238
|
element,
|
|
148
239
|
input,
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
asking?.abort();
|
|
152
|
-
},
|
|
240
|
+
list,
|
|
241
|
+
destroy: stop,
|
|
153
242
|
};
|
|
154
243
|
}
|
|
155
244
|
//# sourceMappingURL=search-box.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-box.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/search-box.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"search-box.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/search-box.ts"],"names":[],"mappings":"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"}
|
package/src/lib/search-box.mjs
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
|
+
import { directionOf } from './address-line.mjs';
|
|
1
2
|
import { warnOnce } from './map-core.mjs';
|
|
2
3
|
export function searchBox(options) {
|
|
3
4
|
const { document: doc, labels } = options;
|
|
4
5
|
const element = doc.createElement('div');
|
|
5
6
|
element.className = 'fd-map-search';
|
|
6
|
-
const input = doc.createElement('input');
|
|
7
|
-
input
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
const input = options.input ?? doc.createElement('input');
|
|
8
|
+
if (!options.input) {
|
|
9
|
+
input.className = 'fd-input';
|
|
10
|
+
input.id = options.id;
|
|
11
|
+
input.type = 'text';
|
|
12
|
+
input.placeholder = labels.search;
|
|
13
|
+
input.autocomplete = 'off';
|
|
14
|
+
input.spellcheck = false;
|
|
15
|
+
input.enterKeyHint = 'search';
|
|
16
|
+
}
|
|
14
17
|
const listId = `${options.id}-places`;
|
|
15
18
|
input.setAttribute('role', 'combobox');
|
|
16
19
|
input.setAttribute('aria-autocomplete', 'list');
|
|
@@ -22,16 +25,51 @@ export function searchBox(options) {
|
|
|
22
25
|
list.setAttribute('role', 'listbox');
|
|
23
26
|
list.setAttribute('aria-label', labels.search);
|
|
24
27
|
list.hidden = true;
|
|
25
|
-
element.append(input, list);
|
|
28
|
+
element.append(...(options.input ? [] : [input]), list);
|
|
26
29
|
let places = [];
|
|
27
30
|
let active = -1;
|
|
28
|
-
let asking = null;
|
|
29
31
|
let timer;
|
|
32
|
+
/**
|
|
33
|
+
* The places each search brought, by its words (near the same place), and
|
|
34
|
+
* the searches on their way, by theirs, until a place is picked: the same
|
|
35
|
+
* words show them again, or wait for them. A search dropped is not called
|
|
36
|
+
* back, as the provider has its request (and may bill it): its answer is
|
|
37
|
+
* kept when it comes, and only not shown.
|
|
38
|
+
*/
|
|
39
|
+
const answers = new Map();
|
|
40
|
+
const going = new Map();
|
|
41
|
+
/** The words whose answer opens the list when it comes, and which the search is said to be going for: none once it is dropped. */
|
|
42
|
+
let wanted = '';
|
|
43
|
+
/** The search whose places the list shows, and the words it asked for. */
|
|
44
|
+
let showing = '';
|
|
45
|
+
let listed = '';
|
|
46
|
+
/** A place picked, and nothing typed since: Enter asks nothing. */
|
|
47
|
+
let picked = false;
|
|
48
|
+
/** The search waiting to go never goes; the one on its way opens nothing when it comes, and is no longer said to be going. */
|
|
49
|
+
function drop() {
|
|
50
|
+
clearTimeout(timer);
|
|
51
|
+
timer = undefined;
|
|
52
|
+
if (!wanted)
|
|
53
|
+
return;
|
|
54
|
+
wanted = '';
|
|
55
|
+
options.say(null);
|
|
56
|
+
}
|
|
57
|
+
/** The address is found, or the box gone: what is on its way is of no use, and called back; the next words are asked for anew (a provider's session ends with the pick). */
|
|
58
|
+
function stop() {
|
|
59
|
+
drop();
|
|
60
|
+
going.forEach((asked) => asked.abort());
|
|
61
|
+
going.clear();
|
|
62
|
+
answers.clear();
|
|
63
|
+
}
|
|
30
64
|
function close() {
|
|
65
|
+
const open = !list.hidden;
|
|
31
66
|
list.hidden = true;
|
|
32
67
|
input.setAttribute('aria-expanded', 'false');
|
|
33
68
|
input.removeAttribute('aria-activedescendant');
|
|
34
69
|
active = -1;
|
|
70
|
+
// What was said of the list (how many places came) goes with it.
|
|
71
|
+
if (open)
|
|
72
|
+
options.say(null);
|
|
35
73
|
}
|
|
36
74
|
function mark(index) {
|
|
37
75
|
active = index;
|
|
@@ -45,35 +83,44 @@ export function searchBox(options) {
|
|
|
45
83
|
input.removeAttribute('aria-activedescendant');
|
|
46
84
|
}
|
|
47
85
|
function choose(place) {
|
|
86
|
+
// A pause in typing ends here: nothing more is asked for these words, and no answer opens the list again.
|
|
87
|
+
stop();
|
|
88
|
+
picked = true;
|
|
48
89
|
input.value = place.label;
|
|
49
90
|
close();
|
|
50
91
|
options.say(null);
|
|
92
|
+
place.picked?.();
|
|
51
93
|
options.pick(place);
|
|
52
94
|
}
|
|
53
|
-
function show(found) {
|
|
54
|
-
|
|
55
|
-
|
|
95
|
+
function show(found, these, words) {
|
|
96
|
+
showing = these;
|
|
97
|
+
listed = words;
|
|
98
|
+
// Two rows that read alike are one to the person reading them: the first is kept.
|
|
99
|
+
places = found.filter((place, i) => found.findIndex((other) => other.label === place.label && other.detail === place.detail) === i);
|
|
100
|
+
list.replaceChildren(...places.map((place, i) => {
|
|
56
101
|
const option = doc.createElement('li');
|
|
57
102
|
option.id = `${listId}-${i}`;
|
|
58
103
|
option.setAttribute('role', 'option');
|
|
59
104
|
option.setAttribute('aria-selected', 'false');
|
|
60
|
-
// The place on one line, where it is on the next, as a map's own search shows them.
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
105
|
+
// The place on one line, where it is on the next, as a map's own search shows them: both at the page's side, each in its own words' direction ("1 Mohammed Mahmoud" on an Arabic page).
|
|
106
|
+
const line = (className, words) => {
|
|
107
|
+
const span = doc.createElement('span');
|
|
108
|
+
span.className = className;
|
|
109
|
+
const own = doc.createElement('bdi');
|
|
110
|
+
own.dir = directionOf(words) || 'auto';
|
|
111
|
+
own.textContent = words;
|
|
112
|
+
span.append(own);
|
|
113
|
+
return span;
|
|
114
|
+
};
|
|
115
|
+
option.append(line('fd-map-result-name', place.label));
|
|
116
|
+
if (place.detail)
|
|
117
|
+
option.append(line('fd-map-result-detail', place.detail));
|
|
71
118
|
// Picked on the press, the box keeping its focus.
|
|
72
119
|
option.addEventListener('mousedown', (event) => event.preventDefault());
|
|
73
120
|
option.addEventListener('click', () => choose(place));
|
|
74
121
|
return option;
|
|
75
122
|
}));
|
|
76
|
-
const any =
|
|
123
|
+
const any = places.length > 0;
|
|
77
124
|
list.hidden = !any;
|
|
78
125
|
input.setAttribute('aria-expanded', String(any));
|
|
79
126
|
active = -1;
|
|
@@ -81,21 +128,52 @@ export function searchBox(options) {
|
|
|
81
128
|
}
|
|
82
129
|
function run() {
|
|
83
130
|
clearTimeout(timer);
|
|
131
|
+
timer = undefined;
|
|
84
132
|
const text = input.value.trim();
|
|
85
|
-
asking?.abort();
|
|
86
133
|
if (text.length < (options.asYouType ? 2 : 1)) {
|
|
134
|
+
drop();
|
|
87
135
|
close();
|
|
88
136
|
options.say(null);
|
|
89
137
|
return;
|
|
90
138
|
}
|
|
91
|
-
const
|
|
139
|
+
const near = options.near();
|
|
140
|
+
const zoom = options.zoom?.();
|
|
141
|
+
const these = JSON.stringify([text, near, zoom]);
|
|
142
|
+
const had = answers.get(these);
|
|
143
|
+
if (had) {
|
|
144
|
+
// Here already: shown, unless they are, and nothing else waited for.
|
|
145
|
+
drop();
|
|
146
|
+
if (list.hidden || showing !== these)
|
|
147
|
+
show(had, these, text);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// On their way and waited for already.
|
|
151
|
+
if (wanted === these)
|
|
152
|
+
return;
|
|
153
|
+
wanted = these;
|
|
92
154
|
options.say(labels.searching);
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
155
|
+
// On their way though dropped (Escape, a letter more): waited for again, not asked again.
|
|
156
|
+
if (going.has(these))
|
|
157
|
+
return;
|
|
158
|
+
const mine = new AbortController();
|
|
159
|
+
going.set(these, mine);
|
|
160
|
+
// Its answer is kept, whether or not its words are still waited for, and shown if they are. Called back (by a pick), it is nobody's.
|
|
161
|
+
options.search({ text, near, zoom, locale: options.locale, signal: mine.signal }).then((found) => {
|
|
162
|
+
if (mine.signal.aborted)
|
|
163
|
+
return;
|
|
164
|
+
going.delete(these);
|
|
165
|
+
answers.set(these, found);
|
|
166
|
+
if (wanted !== these)
|
|
167
|
+
return;
|
|
168
|
+
wanted = '';
|
|
169
|
+
show(found, these, text);
|
|
170
|
+
}, (error) => {
|
|
171
|
+
if (mine.signal.aborted)
|
|
98
172
|
return;
|
|
173
|
+
going.delete(these);
|
|
174
|
+
if (wanted !== these)
|
|
175
|
+
return;
|
|
176
|
+
wanted = '';
|
|
99
177
|
close();
|
|
100
178
|
options.say(labels.searchFailed, 'error');
|
|
101
179
|
// The reader is told to try again; the developer, why it failed.
|
|
@@ -103,6 +181,9 @@ export function searchBox(options) {
|
|
|
103
181
|
});
|
|
104
182
|
}
|
|
105
183
|
input.addEventListener('input', () => {
|
|
184
|
+
picked = false;
|
|
185
|
+
// A row marked was marked for the words before.
|
|
186
|
+
mark(-1);
|
|
106
187
|
if (!options.asYouType) {
|
|
107
188
|
close();
|
|
108
189
|
return;
|
|
@@ -111,42 +192,50 @@ export function searchBox(options) {
|
|
|
111
192
|
timer = setTimeout(run, 250);
|
|
112
193
|
});
|
|
113
194
|
input.addEventListener('keydown', (event) => {
|
|
195
|
+
if (input.readOnly)
|
|
196
|
+
return;
|
|
114
197
|
if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
|
|
115
198
|
if (list.hidden)
|
|
116
199
|
return;
|
|
117
200
|
event.preventDefault();
|
|
118
201
|
const step = event.key === 'ArrowDown' ? 1 : -1;
|
|
119
|
-
|
|
202
|
+
// From no row marked, Down marks the first and Up the last (as from the first); each goes round at the end.
|
|
203
|
+
mark(((active < 0 && step < 0 ? 0 : active) + step + places.length) % places.length);
|
|
120
204
|
}
|
|
121
205
|
else if (event.key === 'Enter') {
|
|
122
206
|
// Never the form's own Enter.
|
|
123
207
|
event.preventDefault();
|
|
124
|
-
// Enter takes the place chosen with the arrows, or the first: the one nearest and likeliest.
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
208
|
+
// Enter takes the place chosen with the arrows, or the first: the one nearest and likeliest, of a list made for the words in the box. A list made for fewer words names another place ("Al" for "Al Malqa"): their own are asked for now, and listed. On the place picked, nothing.
|
|
209
|
+
const chosen = active >= 0 ? places[active] : listed === input.value.trim() ? places[0] : undefined;
|
|
210
|
+
if (!list.hidden && chosen)
|
|
211
|
+
choose(chosen);
|
|
212
|
+
else if (!picked)
|
|
128
213
|
run();
|
|
129
214
|
}
|
|
130
215
|
else if (event.key === 'Escape') {
|
|
131
|
-
|
|
216
|
+
// The list closed, and the search that would open it again dropped, waiting or on its way.
|
|
217
|
+
if (!list.hidden || wanted || timer) {
|
|
132
218
|
event.preventDefault();
|
|
133
219
|
close();
|
|
220
|
+
drop();
|
|
134
221
|
}
|
|
135
|
-
else if (input.value) {
|
|
222
|
+
else if (input.value && !options.freeText) {
|
|
136
223
|
event.preventDefault();
|
|
137
224
|
input.value = '';
|
|
138
225
|
options.say(null);
|
|
139
226
|
}
|
|
140
227
|
}
|
|
141
228
|
});
|
|
142
|
-
|
|
229
|
+
// Left: nothing waiting goes on to open the list over the next box.
|
|
230
|
+
input.addEventListener('blur', () => {
|
|
231
|
+
close();
|
|
232
|
+
drop();
|
|
233
|
+
});
|
|
143
234
|
return {
|
|
144
235
|
element,
|
|
145
236
|
input,
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
asking?.abort();
|
|
149
|
-
},
|
|
237
|
+
list,
|
|
238
|
+
destroy: stop,
|
|
150
239
|
};
|
|
151
240
|
}
|
|
152
241
|
//# sourceMappingURL=search-box.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-box.mjs","sourceRoot":"","sources":["../../../../../libs/map/src/lib/search-box.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"search-box.mjs","sourceRoot":"","sources":["../../../../../libs/map/src/lib/search-box.ts"],"names":[],"mappings":"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"}
|