@fieldia/map 0.19.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 +90 -3
- package/package.json +4 -4
- package/src/lib/address-labels.d.mts +14 -2
- package/src/lib/address-labels.d.ts +14 -2
- package/src/lib/address-labels.js.map +1 -1
- package/src/lib/address-labels.mjs.map +1 -1
- package/src/lib/address-line.d.mts +10 -1
- package/src/lib/address-line.d.ts +10 -1
- package/src/lib/address-line.js +25 -8
- package/src/lib/address-line.js.map +1 -1
- package/src/lib/address-line.mjs +24 -8
- package/src/lib/address-line.mjs.map +1 -1
- 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 +128 -10
- package/src/lib/address-parts.d.ts +128 -10
- package/src/lib/address-parts.js +836 -17
- package/src/lib/address-parts.js.map +1 -1
- package/src/lib/address-parts.mjs +827 -14
- package/src/lib/address-parts.mjs.map +1 -1
- package/src/lib/address-search.d.mts +8 -4
- package/src/lib/address-search.d.ts +8 -4
- package/src/lib/address-search.js +27 -9
- package/src/lib/address-search.js.map +1 -1
- package/src/lib/address-search.mjs +28 -10
- package/src/lib/address-search.mjs.map +1 -1
- package/src/lib/address-suggest.d.mts +5 -2
- package/src/lib/address-suggest.d.ts +5 -2
- package/src/lib/address-suggest.js +161 -28
- package/src/lib/address-suggest.js.map +1 -1
- package/src/lib/address-suggest.mjs +161 -28
- package/src/lib/address-suggest.mjs.map +1 -1
- 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/place.js +21 -10
- package/src/lib/place.js.map +1 -1
- package/src/lib/place.mjs +21 -10
- package/src/lib/place.mjs.map +1 -1
- package/src/lib/providers.d.mts +6 -0
- package/src/lib/providers.d.ts +6 -0
- package/src/lib/providers.js +46 -97
- package/src/lib/providers.js.map +1 -1
- package/src/lib/providers.mjs +46 -97
- package/src/lib/providers.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 +15 -3
- package/src/lib/search-box.d.ts +15 -3
- package/src/lib/search-box.js +118 -34
- package/src/lib/search-box.js.map +1 -1
- package/src/lib/search-box.mjs +118 -34
- package/src/lib/search-box.mjs.map +1 -1
package/src/lib/search-box.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
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;
|
|
@@ -30,13 +31,48 @@ function searchBox(options) {
|
|
|
30
31
|
element.append(...(options.input ? [] : [input]), list);
|
|
31
32
|
let places = [];
|
|
32
33
|
let active = -1;
|
|
33
|
-
let asking = null;
|
|
34
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
|
+
}
|
|
35
67
|
function close() {
|
|
68
|
+
const open = !list.hidden;
|
|
36
69
|
list.hidden = true;
|
|
37
70
|
input.setAttribute('aria-expanded', 'false');
|
|
38
71
|
input.removeAttribute('aria-activedescendant');
|
|
39
72
|
active = -1;
|
|
73
|
+
// What was said of the list (how many places came) goes with it.
|
|
74
|
+
if (open)
|
|
75
|
+
options.say(null);
|
|
40
76
|
}
|
|
41
77
|
function mark(index) {
|
|
42
78
|
active = index;
|
|
@@ -50,35 +86,44 @@ function searchBox(options) {
|
|
|
50
86
|
input.removeAttribute('aria-activedescendant');
|
|
51
87
|
}
|
|
52
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;
|
|
53
92
|
input.value = place.label;
|
|
54
93
|
close();
|
|
55
94
|
options.say(null);
|
|
95
|
+
place.picked?.();
|
|
56
96
|
options.pick(place);
|
|
57
97
|
}
|
|
58
|
-
function show(found) {
|
|
59
|
-
|
|
60
|
-
|
|
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) => {
|
|
61
104
|
const option = doc.createElement('li');
|
|
62
105
|
option.id = `${listId}-${i}`;
|
|
63
106
|
option.setAttribute('role', 'option');
|
|
64
107
|
option.setAttribute('aria-selected', 'false');
|
|
65
|
-
// The place on one line, where it is on the next, as a map's own search shows them.
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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));
|
|
76
121
|
// Picked on the press, the box keeping its focus.
|
|
77
122
|
option.addEventListener('mousedown', (event) => event.preventDefault());
|
|
78
123
|
option.addEventListener('click', () => choose(place));
|
|
79
124
|
return option;
|
|
80
125
|
}));
|
|
81
|
-
const any =
|
|
126
|
+
const any = places.length > 0;
|
|
82
127
|
list.hidden = !any;
|
|
83
128
|
input.setAttribute('aria-expanded', String(any));
|
|
84
129
|
active = -1;
|
|
@@ -86,21 +131,52 @@ function searchBox(options) {
|
|
|
86
131
|
}
|
|
87
132
|
function run() {
|
|
88
133
|
clearTimeout(timer);
|
|
134
|
+
timer = undefined;
|
|
89
135
|
const text = input.value.trim();
|
|
90
|
-
asking?.abort();
|
|
91
136
|
if (text.length < (options.asYouType ? 2 : 1)) {
|
|
137
|
+
drop();
|
|
92
138
|
close();
|
|
93
139
|
options.say(null);
|
|
94
140
|
return;
|
|
95
141
|
}
|
|
96
|
-
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;
|
|
97
157
|
options.say(labels.searching);
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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)
|
|
103
170
|
return;
|
|
171
|
+
wanted = '';
|
|
172
|
+
show(found, these, text);
|
|
173
|
+
}, (error) => {
|
|
174
|
+
if (mine.signal.aborted)
|
|
175
|
+
return;
|
|
176
|
+
going.delete(these);
|
|
177
|
+
if (wanted !== these)
|
|
178
|
+
return;
|
|
179
|
+
wanted = '';
|
|
104
180
|
close();
|
|
105
181
|
options.say(labels.searchFailed, 'error');
|
|
106
182
|
// The reader is told to try again; the developer, why it failed.
|
|
@@ -108,6 +184,9 @@ function searchBox(options) {
|
|
|
108
184
|
});
|
|
109
185
|
}
|
|
110
186
|
input.addEventListener('input', () => {
|
|
187
|
+
picked = false;
|
|
188
|
+
// A row marked was marked for the words before.
|
|
189
|
+
mark(-1);
|
|
111
190
|
if (!options.asYouType) {
|
|
112
191
|
close();
|
|
113
192
|
return;
|
|
@@ -123,21 +202,25 @@ function searchBox(options) {
|
|
|
123
202
|
return;
|
|
124
203
|
event.preventDefault();
|
|
125
204
|
const step = event.key === 'ArrowDown' ? 1 : -1;
|
|
126
|
-
|
|
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);
|
|
127
207
|
}
|
|
128
208
|
else if (event.key === 'Enter') {
|
|
129
209
|
// Never the form's own Enter.
|
|
130
210
|
event.preventDefault();
|
|
131
|
-
// Enter takes the place chosen with the arrows, or the first: the one nearest and likeliest.
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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)
|
|
135
216
|
run();
|
|
136
217
|
}
|
|
137
218
|
else if (event.key === 'Escape') {
|
|
138
|
-
|
|
219
|
+
// The list closed, and the search that would open it again dropped, waiting or on its way.
|
|
220
|
+
if (!list.hidden || wanted || timer) {
|
|
139
221
|
event.preventDefault();
|
|
140
222
|
close();
|
|
223
|
+
drop();
|
|
141
224
|
}
|
|
142
225
|
else if (input.value && !options.freeText) {
|
|
143
226
|
event.preventDefault();
|
|
@@ -146,15 +229,16 @@ function searchBox(options) {
|
|
|
146
229
|
}
|
|
147
230
|
}
|
|
148
231
|
});
|
|
149
|
-
|
|
232
|
+
// Left: nothing waiting goes on to open the list over the next box.
|
|
233
|
+
input.addEventListener('blur', () => {
|
|
234
|
+
close();
|
|
235
|
+
drop();
|
|
236
|
+
});
|
|
150
237
|
return {
|
|
151
238
|
element,
|
|
152
239
|
input,
|
|
153
240
|
list,
|
|
154
|
-
destroy
|
|
155
|
-
clearTimeout(timer);
|
|
156
|
-
asking?.abort();
|
|
157
|
-
},
|
|
241
|
+
destroy: stop,
|
|
158
242
|
};
|
|
159
243
|
}
|
|
160
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,3 +1,4 @@
|
|
|
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;
|
|
@@ -27,13 +28,48 @@ export function searchBox(options) {
|
|
|
27
28
|
element.append(...(options.input ? [] : [input]), list);
|
|
28
29
|
let places = [];
|
|
29
30
|
let active = -1;
|
|
30
|
-
let asking = null;
|
|
31
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
|
+
}
|
|
32
64
|
function close() {
|
|
65
|
+
const open = !list.hidden;
|
|
33
66
|
list.hidden = true;
|
|
34
67
|
input.setAttribute('aria-expanded', 'false');
|
|
35
68
|
input.removeAttribute('aria-activedescendant');
|
|
36
69
|
active = -1;
|
|
70
|
+
// What was said of the list (how many places came) goes with it.
|
|
71
|
+
if (open)
|
|
72
|
+
options.say(null);
|
|
37
73
|
}
|
|
38
74
|
function mark(index) {
|
|
39
75
|
active = index;
|
|
@@ -47,35 +83,44 @@ export function searchBox(options) {
|
|
|
47
83
|
input.removeAttribute('aria-activedescendant');
|
|
48
84
|
}
|
|
49
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;
|
|
50
89
|
input.value = place.label;
|
|
51
90
|
close();
|
|
52
91
|
options.say(null);
|
|
92
|
+
place.picked?.();
|
|
53
93
|
options.pick(place);
|
|
54
94
|
}
|
|
55
|
-
function show(found) {
|
|
56
|
-
|
|
57
|
-
|
|
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) => {
|
|
58
101
|
const option = doc.createElement('li');
|
|
59
102
|
option.id = `${listId}-${i}`;
|
|
60
103
|
option.setAttribute('role', 'option');
|
|
61
104
|
option.setAttribute('aria-selected', 'false');
|
|
62
|
-
// The place on one line, where it is on the next, as a map's own search shows them.
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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));
|
|
73
118
|
// Picked on the press, the box keeping its focus.
|
|
74
119
|
option.addEventListener('mousedown', (event) => event.preventDefault());
|
|
75
120
|
option.addEventListener('click', () => choose(place));
|
|
76
121
|
return option;
|
|
77
122
|
}));
|
|
78
|
-
const any =
|
|
123
|
+
const any = places.length > 0;
|
|
79
124
|
list.hidden = !any;
|
|
80
125
|
input.setAttribute('aria-expanded', String(any));
|
|
81
126
|
active = -1;
|
|
@@ -83,21 +128,52 @@ export function searchBox(options) {
|
|
|
83
128
|
}
|
|
84
129
|
function run() {
|
|
85
130
|
clearTimeout(timer);
|
|
131
|
+
timer = undefined;
|
|
86
132
|
const text = input.value.trim();
|
|
87
|
-
asking?.abort();
|
|
88
133
|
if (text.length < (options.asYouType ? 2 : 1)) {
|
|
134
|
+
drop();
|
|
89
135
|
close();
|
|
90
136
|
options.say(null);
|
|
91
137
|
return;
|
|
92
138
|
}
|
|
93
|
-
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;
|
|
94
154
|
options.say(labels.searching);
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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)
|
|
100
167
|
return;
|
|
168
|
+
wanted = '';
|
|
169
|
+
show(found, these, text);
|
|
170
|
+
}, (error) => {
|
|
171
|
+
if (mine.signal.aborted)
|
|
172
|
+
return;
|
|
173
|
+
going.delete(these);
|
|
174
|
+
if (wanted !== these)
|
|
175
|
+
return;
|
|
176
|
+
wanted = '';
|
|
101
177
|
close();
|
|
102
178
|
options.say(labels.searchFailed, 'error');
|
|
103
179
|
// The reader is told to try again; the developer, why it failed.
|
|
@@ -105,6 +181,9 @@ export function searchBox(options) {
|
|
|
105
181
|
});
|
|
106
182
|
}
|
|
107
183
|
input.addEventListener('input', () => {
|
|
184
|
+
picked = false;
|
|
185
|
+
// A row marked was marked for the words before.
|
|
186
|
+
mark(-1);
|
|
108
187
|
if (!options.asYouType) {
|
|
109
188
|
close();
|
|
110
189
|
return;
|
|
@@ -120,21 +199,25 @@ export function searchBox(options) {
|
|
|
120
199
|
return;
|
|
121
200
|
event.preventDefault();
|
|
122
201
|
const step = event.key === 'ArrowDown' ? 1 : -1;
|
|
123
|
-
|
|
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);
|
|
124
204
|
}
|
|
125
205
|
else if (event.key === 'Enter') {
|
|
126
206
|
// Never the form's own Enter.
|
|
127
207
|
event.preventDefault();
|
|
128
|
-
// Enter takes the place chosen with the arrows, or the first: the one nearest and likeliest.
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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)
|
|
132
213
|
run();
|
|
133
214
|
}
|
|
134
215
|
else if (event.key === 'Escape') {
|
|
135
|
-
|
|
216
|
+
// The list closed, and the search that would open it again dropped, waiting or on its way.
|
|
217
|
+
if (!list.hidden || wanted || timer) {
|
|
136
218
|
event.preventDefault();
|
|
137
219
|
close();
|
|
220
|
+
drop();
|
|
138
221
|
}
|
|
139
222
|
else if (input.value && !options.freeText) {
|
|
140
223
|
event.preventDefault();
|
|
@@ -143,15 +226,16 @@ export function searchBox(options) {
|
|
|
143
226
|
}
|
|
144
227
|
}
|
|
145
228
|
});
|
|
146
|
-
|
|
229
|
+
// Left: nothing waiting goes on to open the list over the next box.
|
|
230
|
+
input.addEventListener('blur', () => {
|
|
231
|
+
close();
|
|
232
|
+
drop();
|
|
233
|
+
});
|
|
147
234
|
return {
|
|
148
235
|
element,
|
|
149
236
|
input,
|
|
150
237
|
list,
|
|
151
|
-
destroy
|
|
152
|
-
clearTimeout(timer);
|
|
153
|
-
asking?.abort();
|
|
154
|
-
},
|
|
238
|
+
destroy: stop,
|
|
155
239
|
};
|
|
156
240
|
}
|
|
157
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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"}
|