@fieldia/widgets 0.9.2 → 0.10.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/package.json +2 -2
- package/src/index.d.mts +2 -0
- package/src/index.d.ts +2 -0
- package/src/index.js +4 -0
- package/src/index.js.map +1 -1
- package/src/index.mjs +2 -0
- package/src/index.mjs.map +1 -1
- package/src/lib/address.d.mts +4 -0
- package/src/lib/address.d.ts +4 -0
- package/src/lib/address.js +105 -0
- package/src/lib/address.js.map +1 -0
- package/src/lib/address.mjs +100 -0
- package/src/lib/address.mjs.map +1 -0
- package/src/lib/cards.d.mts +2 -0
- package/src/lib/cards.d.ts +2 -0
- package/src/lib/cards.js +152 -0
- package/src/lib/cards.js.map +1 -0
- package/src/lib/cards.mjs +148 -0
- package/src/lib/cards.mjs.map +1 -0
- package/src/lib/choice-images.d.mts +2 -0
- package/src/lib/choice-images.d.ts +2 -0
- package/src/lib/choice-images.js +99 -0
- package/src/lib/choice-images.js.map +1 -0
- package/src/lib/choice-images.mjs +95 -0
- package/src/lib/choice-images.mjs.map +1 -0
- package/src/lib/choice-rules.d.mts +22 -0
- package/src/lib/choice-rules.d.ts +22 -0
- package/src/lib/choice-rules.js +46 -0
- package/src/lib/choice-rules.js.map +1 -0
- package/src/lib/choice-rules.mjs +41 -0
- package/src/lib/choice-rules.mjs.map +1 -0
- package/src/lib/choice-tags.d.mts +17 -0
- package/src/lib/choice-tags.d.ts +17 -0
- package/src/lib/choice-tags.js +187 -0
- package/src/lib/choice-tags.js.map +1 -0
- package/src/lib/choice-tags.mjs +182 -0
- package/src/lib/choice-tags.mjs.map +1 -0
- package/src/lib/choices-from.d.mts +8 -0
- package/src/lib/choices-from.d.ts +8 -0
- package/src/lib/choices-from.js +63 -0
- package/src/lib/choices-from.js.map +1 -0
- package/src/lib/choices-from.mjs +60 -0
- package/src/lib/choices-from.mjs.map +1 -0
- package/src/lib/display.js +4 -3
- package/src/lib/display.js.map +1 -1
- package/src/lib/display.mjs +5 -4
- package/src/lib/display.mjs.map +1 -1
- package/src/lib/extras.js +8 -4
- package/src/lib/extras.js.map +1 -1
- package/src/lib/extras.mjs +8 -4
- package/src/lib/extras.mjs.map +1 -1
- package/src/lib/files.d.mts +2 -0
- package/src/lib/files.d.ts +2 -0
- package/src/lib/files.js +180 -80
- package/src/lib/files.js.map +1 -1
- package/src/lib/files.mjs +179 -80
- package/src/lib/files.mjs.map +1 -1
- package/src/lib/focus-trap.d.mts +7 -0
- package/src/lib/focus-trap.d.ts +7 -0
- package/src/lib/focus-trap.js +26 -0
- package/src/lib/focus-trap.js.map +1 -0
- package/src/lib/focus-trap.mjs +23 -0
- package/src/lib/focus-trap.mjs.map +1 -0
- package/src/lib/icons.js +1 -0
- package/src/lib/icons.js.map +1 -1
- package/src/lib/icons.mjs +1 -0
- package/src/lib/icons.mjs.map +1 -1
- package/src/lib/kind-parts.d.mts +56 -0
- package/src/lib/kind-parts.d.ts +56 -0
- package/src/lib/kind-parts.js +121 -0
- package/src/lib/kind-parts.js.map +1 -0
- package/src/lib/kind-parts.mjs +107 -0
- package/src/lib/kind-parts.mjs.map +1 -0
- package/src/lib/labels.d.mts +80 -0
- package/src/lib/labels.d.ts +80 -0
- package/src/lib/labels.js +107 -189
- package/src/lib/labels.js.map +1 -1
- package/src/lib/labels.mjs +107 -189
- package/src/lib/labels.mjs.map +1 -1
- package/src/lib/layout-styles.d.mts +11 -0
- package/src/lib/layout-styles.d.ts +11 -0
- package/src/lib/layout-styles.js +176 -0
- package/src/lib/layout-styles.js.map +1 -0
- package/src/lib/layout-styles.mjs +173 -0
- package/src/lib/layout-styles.mjs.map +1 -0
- package/src/lib/limits.d.mts +20 -0
- package/src/lib/limits.d.ts +20 -0
- package/src/lib/limits.js +71 -0
- package/src/lib/limits.js.map +1 -0
- package/src/lib/limits.mjs +66 -0
- package/src/lib/limits.mjs.map +1 -0
- package/src/lib/line-moves.d.mts +8 -0
- package/src/lib/line-moves.d.ts +8 -0
- package/src/lib/line-moves.js +20 -0
- package/src/lib/line-moves.js.map +1 -0
- package/src/lib/line-moves.mjs +17 -0
- package/src/lib/line-moves.mjs.map +1 -0
- package/src/lib/lines.js +85 -7
- package/src/lib/lines.js.map +1 -1
- package/src/lib/lines.mjs +86 -8
- package/src/lib/lines.mjs.map +1 -1
- package/src/lib/locales/all.d.mts +8 -0
- package/src/lib/locales/all.d.ts +8 -0
- package/src/lib/locales/all.js +13 -0
- package/src/lib/locales/all.js.map +1 -0
- package/src/lib/locales/all.mjs +10 -0
- package/src/lib/locales/all.mjs.map +1 -0
- package/src/lib/locales/ar.d.mts +3 -0
- package/src/lib/locales/ar.d.ts +3 -0
- package/src/lib/locales/ar.js +104 -0
- package/src/lib/locales/ar.js.map +1 -0
- package/src/lib/locales/ar.mjs +101 -0
- package/src/lib/locales/ar.mjs.map +1 -0
- package/src/lib/locales/de.d.mts +3 -0
- package/src/lib/locales/de.d.ts +3 -0
- package/src/lib/locales/de.js +104 -0
- package/src/lib/locales/de.js.map +1 -0
- package/src/lib/locales/de.mjs +101 -0
- package/src/lib/locales/de.mjs.map +1 -0
- package/src/lib/locales/fr.d.mts +3 -0
- package/src/lib/locales/fr.d.ts +3 -0
- package/src/lib/locales/fr.js +104 -0
- package/src/lib/locales/fr.js.map +1 -0
- package/src/lib/locales/fr.mjs +101 -0
- package/src/lib/locales/fr.mjs.map +1 -0
- package/src/lib/matrix.d.mts +10 -0
- package/src/lib/matrix.d.ts +10 -0
- package/src/lib/matrix.js +86 -0
- package/src/lib/matrix.js.map +1 -0
- package/src/lib/matrix.mjs +82 -0
- package/src/lib/matrix.mjs.map +1 -0
- package/src/lib/numbers.d.mts +7 -0
- package/src/lib/numbers.d.ts +7 -0
- package/src/lib/numbers.js +15 -0
- package/src/lib/numbers.js.map +1 -1
- package/src/lib/numbers.mjs +14 -0
- package/src/lib/numbers.mjs.map +1 -1
- package/src/lib/progress.js +8 -4
- package/src/lib/progress.js.map +1 -1
- package/src/lib/progress.mjs +8 -4
- package/src/lib/progress.mjs.map +1 -1
- package/src/lib/ranking.d.mts +2 -0
- package/src/lib/ranking.d.ts +2 -0
- package/src/lib/ranking.js +172 -0
- package/src/lib/ranking.js.map +1 -0
- package/src/lib/ranking.mjs +168 -0
- package/src/lib/ranking.mjs.map +1 -0
- package/src/lib/relations.d.mts +1 -1
- package/src/lib/relations.d.ts +1 -1
- package/src/lib/relations.js +43 -18
- package/src/lib/relations.js.map +1 -1
- package/src/lib/relations.mjs +43 -18
- package/src/lib/relations.mjs.map +1 -1
- package/src/lib/shuffle.d.mts +7 -0
- package/src/lib/shuffle.d.ts +7 -0
- package/src/lib/shuffle.js +60 -0
- package/src/lib/shuffle.js.map +1 -0
- package/src/lib/shuffle.mjs +57 -0
- package/src/lib/shuffle.mjs.map +1 -0
- package/src/lib/signature.d.mts +2 -0
- package/src/lib/signature.d.ts +2 -0
- package/src/lib/signature.js +223 -0
- package/src/lib/signature.js.map +1 -0
- package/src/lib/signature.mjs +219 -0
- package/src/lib/signature.mjs.map +1 -0
- package/src/lib/slider.d.mts +10 -0
- package/src/lib/slider.d.ts +10 -0
- package/src/lib/slider.js +57 -0
- package/src/lib/slider.js.map +1 -0
- package/src/lib/slider.mjs +53 -0
- package/src/lib/slider.mjs.map +1 -0
- package/src/lib/styles-choices.d.mts +7 -0
- package/src/lib/styles-choices.d.ts +7 -0
- package/src/lib/styles-choices.js +47 -0
- package/src/lib/styles-choices.js.map +1 -0
- package/src/lib/styles-choices.mjs +44 -0
- package/src/lib/styles-choices.mjs.map +1 -0
- package/src/lib/styles-inputs.d.mts +9 -0
- package/src/lib/styles-inputs.d.ts +9 -0
- package/src/lib/styles-inputs.js +41 -0
- package/src/lib/styles-inputs.js.map +1 -0
- package/src/lib/styles-inputs.mjs +38 -0
- package/src/lib/styles-inputs.mjs.map +1 -0
- package/src/lib/styles-kinds.d.mts +7 -0
- package/src/lib/styles-kinds.d.ts +7 -0
- package/src/lib/styles-kinds.js +119 -0
- package/src/lib/styles-kinds.js.map +1 -0
- package/src/lib/styles-kinds.mjs +116 -0
- package/src/lib/styles-kinds.mjs.map +1 -0
- package/src/lib/styles.d.mts +2 -14
- package/src/lib/styles.d.ts +2 -14
- package/src/lib/styles.js +172 -60
- package/src/lib/styles.js.map +1 -1
- package/src/lib/styles.mjs +172 -60
- package/src/lib/styles.mjs.map +1 -1
- package/src/lib/units.d.mts +10 -0
- package/src/lib/units.d.ts +10 -0
- package/src/lib/units.js +19 -0
- package/src/lib/units.js.map +1 -0
- package/src/lib/units.mjs +16 -0
- package/src/lib/units.mjs.map +1 -0
- package/src/lib/widgets.js +215 -57
- package/src/lib/widgets.js.map +1 -1
- package/src/lib/widgets.mjs +215 -57
- package/src/lib/widgets.mjs.map +1 -1
- package/src/lib/yes-no.d.mts +9 -0
- package/src/lib/yes-no.d.ts +9 -0
- package/src/lib/yes-no.js +58 -0
- package/src/lib/yes-no.js.map +1 -0
- package/src/lib/yes-no.mjs +54 -0
- package/src/lib/yes-no.mjs.map +1 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fieldia/widgets",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "Fieldia field inputs in plain DOM, with the underline and outlined skins.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://fieldia.dev",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"./package.json": "./package.json"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@fieldia/core": "0.
|
|
24
|
+
"@fieldia/core": "0.10.0",
|
|
25
25
|
"tslib": "^2.8.1"
|
|
26
26
|
},
|
|
27
27
|
"sideEffects": false,
|
package/src/index.d.mts
CHANGED
package/src/index.d.ts
CHANGED
package/src/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.countriesIn = void 0;
|
|
3
4
|
const tslib_1 = require("tslib");
|
|
4
5
|
tslib_1.__exportStar(require("./lib/widgets"), exports);
|
|
5
6
|
tslib_1.__exportStar(require("./lib/styles"), exports);
|
|
@@ -17,4 +18,7 @@ tslib_1.__exportStar(require("./lib/statusbar"), exports);
|
|
|
17
18
|
tslib_1.__exportStar(require("./lib/calendar"), exports);
|
|
18
19
|
tslib_1.__exportStar(require("./lib/properties"), exports);
|
|
19
20
|
tslib_1.__exportStar(require("./lib/icons"), exports);
|
|
21
|
+
tslib_1.__exportStar(require("./lib/focus-trap"), exports);
|
|
22
|
+
var address_1 = require("./lib/address");
|
|
23
|
+
Object.defineProperty(exports, "countriesIn", { enumerable: true, get: function () { return address_1.countriesIn; } });
|
|
20
24
|
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/widgets/src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/widgets/src/index.ts"],"names":[],"mappings":";;;;AAAA,wDAA8B;AAC9B,uDAA6B;AAC7B,uDAA6B;AAC7B,0DAAgC;AAChC,sDAA4B;AAC5B,sDAA4B;AAC5B,uDAA6B;AAC7B,wDAA8B;AAC9B,4DAAkC;AAClC,wDAA8B;AAC9B,yDAA+B;AAC/B,sDAA4B;AAC5B,0DAAgC;AAChC,yDAA+B;AAC/B,2DAAiC;AACjC,sDAA4B;AAC5B,2DAAiC;AACjC,yCAA4C;AAAnC,sGAAA,WAAW,OAAA"}
|
package/src/index.mjs
CHANGED
|
@@ -14,4 +14,6 @@ export * from './lib/statusbar.mjs';
|
|
|
14
14
|
export * from './lib/calendar.mjs';
|
|
15
15
|
export * from './lib/properties.mjs';
|
|
16
16
|
export * from './lib/icons.mjs';
|
|
17
|
+
export * from './lib/focus-trap.mjs';
|
|
18
|
+
export { countriesIn } from './lib/address.mjs';
|
|
17
19
|
//# sourceMappingURL=index.mjs.map
|
package/src/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../../libs/widgets/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../../libs/widgets/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.addressWidget = void 0;
|
|
4
|
+
exports.countriesIn = countriesIn;
|
|
5
|
+
const kind_parts_1 = require("./kind-parts");
|
|
6
|
+
/**
|
|
7
|
+
* An address on a JSON field (`json.address`), in its parts — street, a
|
|
8
|
+
* second line, city, region, postcode and country — each with its own label,
|
|
9
|
+
* filled in by the browser when it can. `options.parts` chooses which, and in
|
|
10
|
+
* what order: street, city, postcode and country unless it says. The country
|
|
11
|
+
* is chosen from a list in the page's language and kept as its ISO code;
|
|
12
|
+
* `options.country` is the one it starts on, kept once anything else is
|
|
13
|
+
* typed. `options.requiredParts` are marked, and the form asks for them. The
|
|
14
|
+
* value is an object of the parts filled in, keeping any part it was given
|
|
15
|
+
* that it does not ask for; nothing at all when every part is empty.
|
|
16
|
+
*/
|
|
17
|
+
const PARTS = {
|
|
18
|
+
street: ['addressStreet', 'street-address'],
|
|
19
|
+
line2: ['addressLine2', 'address-line2'],
|
|
20
|
+
city: ['addressCity', 'address-level2'],
|
|
21
|
+
region: ['addressRegion', 'address-level1'],
|
|
22
|
+
postcode: ['addressPostcode', 'postal-code'],
|
|
23
|
+
country: ['addressCountry', 'country'],
|
|
24
|
+
};
|
|
25
|
+
const isPart = (name) => typeof name === 'string' && name in PARTS;
|
|
26
|
+
/** Codes with a region's name that are no country: old ones, groups, and the like. */
|
|
27
|
+
const NOT_COUNTRIES = 'AC AN BU CP CQ CS DD DG DY EA EU EZ FX HV IC NH QO RH SU TA TP UK UN VD XA XB YD YU ZR ZZ';
|
|
28
|
+
const countries = {};
|
|
29
|
+
/** Every country, by its code and its name in the language, in the language's order. */
|
|
30
|
+
function countriesIn(locale) {
|
|
31
|
+
if (!countries[locale]) {
|
|
32
|
+
const names = new Intl.DisplayNames([locale], { type: 'region', fallback: 'none' });
|
|
33
|
+
const found = [];
|
|
34
|
+
for (let a = 65; a < 91; a++)
|
|
35
|
+
for (let b = 65; b < 91; b++) {
|
|
36
|
+
const code = String.fromCharCode(a, b);
|
|
37
|
+
const name = !NOT_COUNTRIES.includes(code) && names.of(code);
|
|
38
|
+
if (name)
|
|
39
|
+
found.push([code, name]);
|
|
40
|
+
}
|
|
41
|
+
countries[locale] = found.sort((x, y) => x[1].localeCompare(y[1], locale));
|
|
42
|
+
}
|
|
43
|
+
return countries[locale];
|
|
44
|
+
}
|
|
45
|
+
const addressWidget = ({ form, name, node, id, document, labels, locale = 'en' }) => {
|
|
46
|
+
const words = (0, kind_parts_1.wordsFor)(labels, locale);
|
|
47
|
+
const make = (0, kind_parts_1.maker)(document);
|
|
48
|
+
const options = node.options ?? {};
|
|
49
|
+
const asked = options['parts'];
|
|
50
|
+
const parts = Array.isArray(asked) ? asked.filter(isPart) : ['street', 'city', 'postcode', 'country'];
|
|
51
|
+
const needed = Array.isArray(options['requiredParts']) ? options['requiredParts'] : [];
|
|
52
|
+
const start = typeof options['country'] === 'string' ? options['country'] : '';
|
|
53
|
+
const element = make('div', { id, class: 'fd-address', role: 'group' });
|
|
54
|
+
/** The parts as they are now, a part as typed in place of its own. */
|
|
55
|
+
const write = (part, text) => {
|
|
56
|
+
const now = form.getState().values[name];
|
|
57
|
+
const kept = now && typeof now === 'object' && !Array.isArray(now) ? { ...now } : {};
|
|
58
|
+
kept[part] = text;
|
|
59
|
+
// The country it starts on goes with the parts typed, but is no answer on its own.
|
|
60
|
+
if (start && parts.includes('country') && kept['country'] === undefined)
|
|
61
|
+
kept['country'] = start;
|
|
62
|
+
// Only the parts with something in them.
|
|
63
|
+
const filled = Object.fromEntries(Object.entries(kept).filter(([, v]) => typeof v !== 'string' || v.trim() !== ''));
|
|
64
|
+
const keys = Object.keys(filled);
|
|
65
|
+
form.setValue(name, keys.length && (part === 'country' || keys.join() !== 'country' || filled['country'] !== start) ? filled : null);
|
|
66
|
+
};
|
|
67
|
+
const boxes = parts.map((part) => {
|
|
68
|
+
const [label, autocomplete] = PARTS[part];
|
|
69
|
+
const attrs = { id: `${id}-${part}`, class: 'fd-input', 'data-part': part, autocomplete: part === 'street' && parts.includes('line2') ? 'address-line1' : autocomplete, 'aria-required': needed.includes(part) ? 'true' : undefined };
|
|
70
|
+
const input = part === 'country'
|
|
71
|
+
? make('select', attrs, make('option', { value: '' }), ...countriesIn(locale).map(([code, country]) => make('option', { value: code }, country)))
|
|
72
|
+
: make('input', { type: 'text', ...attrs });
|
|
73
|
+
input.addEventListener(part === 'country' ? 'change' : 'input', () => write(part, input.value));
|
|
74
|
+
if (part === 'country')
|
|
75
|
+
input.classList.add('fd-select');
|
|
76
|
+
element.append(make('div', { class: `fd-address-part fd-address-${part}${needed.includes(part) ? ' fd-required' : ''}` }, make('label', { class: 'fd-address-label', for: input.id }, words[label]), input));
|
|
77
|
+
return { part, input };
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
element,
|
|
81
|
+
focus: () => boxes[0]?.input.focus(),
|
|
82
|
+
update(state) {
|
|
83
|
+
const value = state.value && typeof state.value === 'object' && !Array.isArray(state.value) ? state.value : {};
|
|
84
|
+
for (const { part, input } of boxes) {
|
|
85
|
+
const text = typeof value[part] === 'string' ? value[part] : part === 'country' && value['country'] === undefined ? start : '';
|
|
86
|
+
if (input instanceof HTMLSelectElement) {
|
|
87
|
+
// A country given in words is shown as it was given.
|
|
88
|
+
if (text && ![...input.options].some((o) => o.value === text))
|
|
89
|
+
input.append(make('option', { value: text }, text));
|
|
90
|
+
input.disabled = state.readonly;
|
|
91
|
+
}
|
|
92
|
+
else
|
|
93
|
+
input.readOnly = state.readonly;
|
|
94
|
+
// What is being typed stays as typed.
|
|
95
|
+
if (document.activeElement !== input && input.value !== text)
|
|
96
|
+
input.value = text;
|
|
97
|
+
// Wrong, a part that must be filled and is not is marked.
|
|
98
|
+
input.setAttribute('aria-invalid', String(state.invalid && (!needed.length || (needed.includes(part) && !text.trim()))));
|
|
99
|
+
}
|
|
100
|
+
(0, kind_parts_1.describeState)(element, state);
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
exports.addressWidget = addressWidget;
|
|
105
|
+
//# sourceMappingURL=address.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address.js","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/address.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { describeState, maker, wordsFor } from './kind-parts.mjs';
|
|
2
|
+
/**
|
|
3
|
+
* An address on a JSON field (`json.address`), in its parts — street, a
|
|
4
|
+
* second line, city, region, postcode and country — each with its own label,
|
|
5
|
+
* filled in by the browser when it can. `options.parts` chooses which, and in
|
|
6
|
+
* what order: street, city, postcode and country unless it says. The country
|
|
7
|
+
* is chosen from a list in the page's language and kept as its ISO code;
|
|
8
|
+
* `options.country` is the one it starts on, kept once anything else is
|
|
9
|
+
* typed. `options.requiredParts` are marked, and the form asks for them. The
|
|
10
|
+
* value is an object of the parts filled in, keeping any part it was given
|
|
11
|
+
* that it does not ask for; nothing at all when every part is empty.
|
|
12
|
+
*/
|
|
13
|
+
const PARTS = {
|
|
14
|
+
street: ['addressStreet', 'street-address'],
|
|
15
|
+
line2: ['addressLine2', 'address-line2'],
|
|
16
|
+
city: ['addressCity', 'address-level2'],
|
|
17
|
+
region: ['addressRegion', 'address-level1'],
|
|
18
|
+
postcode: ['addressPostcode', 'postal-code'],
|
|
19
|
+
country: ['addressCountry', 'country'],
|
|
20
|
+
};
|
|
21
|
+
const isPart = (name) => typeof name === 'string' && name in PARTS;
|
|
22
|
+
/** Codes with a region's name that are no country: old ones, groups, and the like. */
|
|
23
|
+
const NOT_COUNTRIES = 'AC AN BU CP CQ CS DD DG DY EA EU EZ FX HV IC NH QO RH SU TA TP UK UN VD XA XB YD YU ZR ZZ';
|
|
24
|
+
const countries = {};
|
|
25
|
+
/** Every country, by its code and its name in the language, in the language's order. */
|
|
26
|
+
export function countriesIn(locale) {
|
|
27
|
+
if (!countries[locale]) {
|
|
28
|
+
const names = new Intl.DisplayNames([locale], { type: 'region', fallback: 'none' });
|
|
29
|
+
const found = [];
|
|
30
|
+
for (let a = 65; a < 91; a++)
|
|
31
|
+
for (let b = 65; b < 91; b++) {
|
|
32
|
+
const code = String.fromCharCode(a, b);
|
|
33
|
+
const name = !NOT_COUNTRIES.includes(code) && names.of(code);
|
|
34
|
+
if (name)
|
|
35
|
+
found.push([code, name]);
|
|
36
|
+
}
|
|
37
|
+
countries[locale] = found.sort((x, y) => x[1].localeCompare(y[1], locale));
|
|
38
|
+
}
|
|
39
|
+
return countries[locale];
|
|
40
|
+
}
|
|
41
|
+
export const addressWidget = ({ form, name, node, id, document, labels, locale = 'en' }) => {
|
|
42
|
+
const words = wordsFor(labels, locale);
|
|
43
|
+
const make = maker(document);
|
|
44
|
+
const options = node.options ?? {};
|
|
45
|
+
const asked = options['parts'];
|
|
46
|
+
const parts = Array.isArray(asked) ? asked.filter(isPart) : ['street', 'city', 'postcode', 'country'];
|
|
47
|
+
const needed = Array.isArray(options['requiredParts']) ? options['requiredParts'] : [];
|
|
48
|
+
const start = typeof options['country'] === 'string' ? options['country'] : '';
|
|
49
|
+
const element = make('div', { id, class: 'fd-address', role: 'group' });
|
|
50
|
+
/** The parts as they are now, a part as typed in place of its own. */
|
|
51
|
+
const write = (part, text) => {
|
|
52
|
+
const now = form.getState().values[name];
|
|
53
|
+
const kept = now && typeof now === 'object' && !Array.isArray(now) ? { ...now } : {};
|
|
54
|
+
kept[part] = text;
|
|
55
|
+
// The country it starts on goes with the parts typed, but is no answer on its own.
|
|
56
|
+
if (start && parts.includes('country') && kept['country'] === undefined)
|
|
57
|
+
kept['country'] = start;
|
|
58
|
+
// Only the parts with something in them.
|
|
59
|
+
const filled = Object.fromEntries(Object.entries(kept).filter(([, v]) => typeof v !== 'string' || v.trim() !== ''));
|
|
60
|
+
const keys = Object.keys(filled);
|
|
61
|
+
form.setValue(name, keys.length && (part === 'country' || keys.join() !== 'country' || filled['country'] !== start) ? filled : null);
|
|
62
|
+
};
|
|
63
|
+
const boxes = parts.map((part) => {
|
|
64
|
+
const [label, autocomplete] = PARTS[part];
|
|
65
|
+
const attrs = { id: `${id}-${part}`, class: 'fd-input', 'data-part': part, autocomplete: part === 'street' && parts.includes('line2') ? 'address-line1' : autocomplete, 'aria-required': needed.includes(part) ? 'true' : undefined };
|
|
66
|
+
const input = part === 'country'
|
|
67
|
+
? make('select', attrs, make('option', { value: '' }), ...countriesIn(locale).map(([code, country]) => make('option', { value: code }, country)))
|
|
68
|
+
: make('input', { type: 'text', ...attrs });
|
|
69
|
+
input.addEventListener(part === 'country' ? 'change' : 'input', () => write(part, input.value));
|
|
70
|
+
if (part === 'country')
|
|
71
|
+
input.classList.add('fd-select');
|
|
72
|
+
element.append(make('div', { class: `fd-address-part fd-address-${part}${needed.includes(part) ? ' fd-required' : ''}` }, make('label', { class: 'fd-address-label', for: input.id }, words[label]), input));
|
|
73
|
+
return { part, input };
|
|
74
|
+
});
|
|
75
|
+
return {
|
|
76
|
+
element,
|
|
77
|
+
focus: () => boxes[0]?.input.focus(),
|
|
78
|
+
update(state) {
|
|
79
|
+
const value = state.value && typeof state.value === 'object' && !Array.isArray(state.value) ? state.value : {};
|
|
80
|
+
for (const { part, input } of boxes) {
|
|
81
|
+
const text = typeof value[part] === 'string' ? value[part] : part === 'country' && value['country'] === undefined ? start : '';
|
|
82
|
+
if (input instanceof HTMLSelectElement) {
|
|
83
|
+
// A country given in words is shown as it was given.
|
|
84
|
+
if (text && ![...input.options].some((o) => o.value === text))
|
|
85
|
+
input.append(make('option', { value: text }, text));
|
|
86
|
+
input.disabled = state.readonly;
|
|
87
|
+
}
|
|
88
|
+
else
|
|
89
|
+
input.readOnly = state.readonly;
|
|
90
|
+
// What is being typed stays as typed.
|
|
91
|
+
if (document.activeElement !== input && input.value !== text)
|
|
92
|
+
input.value = text;
|
|
93
|
+
// Wrong, a part that must be filled and is not is marked.
|
|
94
|
+
input.setAttribute('aria-invalid', String(state.invalid && (!needed.length || (needed.includes(part) && !text.trim()))));
|
|
95
|
+
}
|
|
96
|
+
describeState(element, state);
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=address.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/address.ts"],"names":[],"mappings":"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"}
|
package/src/lib/cards.js
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cardsWidget = void 0;
|
|
4
|
+
const kind_parts_1 = require("./kind-parts");
|
|
5
|
+
const line_moves_1 = require("./line-moves");
|
|
6
|
+
const lines_1 = require("./lines");
|
|
7
|
+
const widgets_1 = require("./widgets");
|
|
8
|
+
const count = (value) => (typeof value === 'number' && Number.isInteger(value) && value >= 0 ? value : undefined);
|
|
9
|
+
const cardsWidget = ({ form, name, field, node, id, document, labels, locale, dialogs }) => {
|
|
10
|
+
const words = (0, kind_parts_1.wordsFor)(labels, locale);
|
|
11
|
+
const make = (0, kind_parts_1.maker)(document);
|
|
12
|
+
const def = field;
|
|
13
|
+
const options = node.options ?? {};
|
|
14
|
+
const min = count(options['min']) ?? 0;
|
|
15
|
+
const max = count(options['max']) ?? Infinity;
|
|
16
|
+
const itemLabel = typeof options['itemLabel'] === 'string' && options['itemLabel'].trim() ? options['itemLabel'].trim() : null;
|
|
17
|
+
const titleOf = (n) => (itemLabel ? `${itemLabel} ${n}` : (0, kind_parts_1.fillIn)(words.entry, { n }));
|
|
18
|
+
// The fields that keep the lines' order or say what a line is are not asked for.
|
|
19
|
+
const names = (node.columns ?? Object.keys(def.fields)).filter((f) => def.fields[f] && f !== def.sequenceField && f !== def.lineKinds?.field);
|
|
20
|
+
const list = make('div', { class: 'fd-repeat-list' });
|
|
21
|
+
const addButton = make('button', { type: 'button', class: 'fd-button fd-repeat-add' }, typeof options['addLabel'] === 'string' && options['addLabel'] ? options['addLabel'] : words.addAnother);
|
|
22
|
+
const voice = (0, kind_parts_1.announcer)(make);
|
|
23
|
+
const element = make('div', { id, class: 'fd-repeat', role: 'group' }, list, addButton, voice.element);
|
|
24
|
+
const cards = new Map();
|
|
25
|
+
const lines = () => form.getState().values[name] ?? [];
|
|
26
|
+
let readonly = false;
|
|
27
|
+
/** Where the cursor goes once the cards are drawn again. */
|
|
28
|
+
let focusNext = null;
|
|
29
|
+
// A new form starts with the cards it needs at least.
|
|
30
|
+
for (let have = lines().length; have < min; have++)
|
|
31
|
+
form.addLine(name);
|
|
32
|
+
addButton.addEventListener('click', () => {
|
|
33
|
+
if (readonly || lines().length >= max)
|
|
34
|
+
return;
|
|
35
|
+
const key = form.addLine(name);
|
|
36
|
+
focusNext = () => cards.get(key)?.fields[0]?.widget.focus();
|
|
37
|
+
settle();
|
|
38
|
+
});
|
|
39
|
+
function makeCard(line) {
|
|
40
|
+
const titleId = `${id}-${line.key}-title`;
|
|
41
|
+
const title = make('span', { id: titleId, class: 'fd-repeat-title' });
|
|
42
|
+
const remove = make('button', { type: 'button', class: 'fd-repeat-remove' }, '×');
|
|
43
|
+
const tool = (text, word, act) => {
|
|
44
|
+
const button = make('button', { type: 'button', class: 'fd-repeat-tool' }, text);
|
|
45
|
+
button.addEventListener('click', act);
|
|
46
|
+
return [button, word];
|
|
47
|
+
};
|
|
48
|
+
const at = () => lines().findIndex((l) => l.key === line.key);
|
|
49
|
+
const tools = [tool('↑', 'moveUp', () => move(line.key, at() - 1)), tool('↓', 'moveDown', () => move(line.key, at() + 1)), tool('⧉', 'copy', () => copy(line.key))];
|
|
50
|
+
const body = make('div', { class: 'fd-repeat-fields' });
|
|
51
|
+
const cardElement = make('div', { class: 'fd-repeat-card', role: 'group', 'aria-labelledby': titleId, 'data-line': line.key }, make('div', { class: 'fd-repeat-head' }, title, ...tools.map(([b]) => b), remove), body);
|
|
52
|
+
const fields = names.map((column) => {
|
|
53
|
+
const sub = def.fields[column];
|
|
54
|
+
const cellId = `${id}-${line.key}-${column}`;
|
|
55
|
+
const subNode = { type: 'field', id: `${node.id}.${line.key}.${column}`, field: column };
|
|
56
|
+
const widget = (0, widgets_1.createWidget)({ form: (0, lines_1.lineForm)(form, name, line.key), name: column, field: sub, node: subNode, id: cellId, document, labels, locale, dialogs });
|
|
57
|
+
const label = make('label', { class: 'fd-repeat-label', for: cellId }, sub.label);
|
|
58
|
+
if (!['INPUT', 'SELECT', 'TEXTAREA'].includes(widget.element.tagName))
|
|
59
|
+
label.addEventListener('click', () => widget.focus());
|
|
60
|
+
const error = make('div', { class: 'fd-cell-error', hidden: '' });
|
|
61
|
+
body.append(make('div', { class: 'fd-repeat-field' }, label, widget.element, error));
|
|
62
|
+
return { name: column, def: sub, widget, error };
|
|
63
|
+
});
|
|
64
|
+
remove.addEventListener('click', () => {
|
|
65
|
+
const all = lines();
|
|
66
|
+
const at = all.findIndex((l) => l.key === line.key);
|
|
67
|
+
if (readonly || at === -1 || all.length <= min)
|
|
68
|
+
return;
|
|
69
|
+
const gone = title.textContent ?? '';
|
|
70
|
+
form.removeLine(name, line.key);
|
|
71
|
+
voice.say((0, kind_parts_1.fillIn)(words.removed, { name: gone }));
|
|
72
|
+
// The card that took its place, else the one before, else "Add another".
|
|
73
|
+
const after = lines();
|
|
74
|
+
const next = after[Math.min(at, after.length - 1)];
|
|
75
|
+
focusNext = () => (next ? cards.get(next.key)?.fields[0]?.widget.focus() : addButton.focus());
|
|
76
|
+
settle();
|
|
77
|
+
});
|
|
78
|
+
return { element: cardElement, title, remove, tools, fields };
|
|
79
|
+
}
|
|
80
|
+
/** A card to another place, the focus kept on what had it, and where it went said aloud. */
|
|
81
|
+
function move(key, to) {
|
|
82
|
+
const from = lines().findIndex((l) => l.key === key);
|
|
83
|
+
if (readonly || to < 0 || to >= lines().length || to === from)
|
|
84
|
+
return;
|
|
85
|
+
const gone = cards.get(key)?.title.textContent ?? '';
|
|
86
|
+
(0, line_moves_1.moveLineTo)(form, name, def, key, to);
|
|
87
|
+
// The focus stays on the button pressed; at an end, the other way takes it.
|
|
88
|
+
const way = (from > to && to > 0) || to === lines().length - 1 ? 0 : 1;
|
|
89
|
+
cards.get(key)?.tools[way][0].focus();
|
|
90
|
+
voice.say((0, kind_parts_1.fillIn)(words.movedTo, { label: gone, n: to + 1, total: lines().length }));
|
|
91
|
+
}
|
|
92
|
+
/** A copy of a card, its answers too, right after it, the cursor in its first field. */
|
|
93
|
+
function copy(key) {
|
|
94
|
+
const all = lines();
|
|
95
|
+
const at = all.findIndex((l) => l.key === key);
|
|
96
|
+
if (readonly || at < 0 || all.length >= max)
|
|
97
|
+
return;
|
|
98
|
+
const values = { ...all[at].values };
|
|
99
|
+
if (def.sequenceField)
|
|
100
|
+
delete values[def.sequenceField];
|
|
101
|
+
const made = form.addLine(name, values);
|
|
102
|
+
(0, line_moves_1.moveLineTo)(form, name, def, made, at + 1);
|
|
103
|
+
cards.get(made)?.fields[0]?.widget.focus();
|
|
104
|
+
}
|
|
105
|
+
function settle() {
|
|
106
|
+
const run = focusNext;
|
|
107
|
+
focusNext = null;
|
|
108
|
+
run?.();
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
element,
|
|
112
|
+
focus: () => ([...cards.values()].find((card) => card.element === list.firstElementChild)?.fields[0]?.widget ?? addButton).focus(),
|
|
113
|
+
update(state) {
|
|
114
|
+
readonly = state.readonly;
|
|
115
|
+
const current = state.value ?? [];
|
|
116
|
+
const errors = form.getState().errors;
|
|
117
|
+
const keep = new Set(current.map((l) => l.key));
|
|
118
|
+
for (const [key, card] of cards) {
|
|
119
|
+
if (keep.has(key))
|
|
120
|
+
continue;
|
|
121
|
+
card.element.remove();
|
|
122
|
+
for (const f of card.fields)
|
|
123
|
+
f.widget.destroy?.();
|
|
124
|
+
cards.delete(key);
|
|
125
|
+
}
|
|
126
|
+
current.forEach((line, index) => {
|
|
127
|
+
let card = cards.get(line.key);
|
|
128
|
+
if (!card)
|
|
129
|
+
cards.set(line.key, (card = makeCard(line)));
|
|
130
|
+
if (list.children[index] !== card.element)
|
|
131
|
+
list.insertBefore(card.element, list.children[index] ?? null);
|
|
132
|
+
card.title.textContent = titleOf(index + 1);
|
|
133
|
+
card.remove.setAttribute('aria-label', (0, kind_parts_1.fillIn)(words.remove, { name: card.title.textContent }));
|
|
134
|
+
card.remove.hidden = readonly || current.length <= min;
|
|
135
|
+
for (const [button, word] of card.tools) {
|
|
136
|
+
button.setAttribute('aria-label', (0, kind_parts_1.fillIn)(words[word], { label: card.title.textContent, name: card.title.textContent }));
|
|
137
|
+
button.hidden = readonly || (word === 'moveUp' ? index === 0 : word === 'moveDown' ? index === current.length - 1 : current.length >= max);
|
|
138
|
+
}
|
|
139
|
+
for (const f of card.fields) {
|
|
140
|
+
const message = errors[`${name}.${line.key}.${f.name}`];
|
|
141
|
+
f.error.hidden = !message;
|
|
142
|
+
f.error.textContent = message ?? '';
|
|
143
|
+
f.widget.update({ value: line.values[f.name], values: line.values, readonly: readonly || f.def.readonly === true, required: f.def.required === true, invalid: !!message });
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
addButton.hidden = readonly || current.length >= max;
|
|
147
|
+
(0, kind_parts_1.describeState)(element, state);
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
};
|
|
151
|
+
exports.cardsWidget = cardsWidget;
|
|
152
|
+
//# sourceMappingURL=cards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cards.js","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/cards.ts"],"names":[],"mappings":"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"}
|