@fieldia/widgets 0.9.2 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/README.md +2 -1
  2. package/package.json +2 -2
  3. package/src/index.d.mts +2 -0
  4. package/src/index.d.ts +2 -0
  5. package/src/index.js +4 -0
  6. package/src/index.js.map +1 -1
  7. package/src/index.mjs +2 -0
  8. package/src/index.mjs.map +1 -1
  9. package/src/lib/address.d.mts +4 -0
  10. package/src/lib/address.d.ts +4 -0
  11. package/src/lib/address.js +105 -0
  12. package/src/lib/address.js.map +1 -0
  13. package/src/lib/address.mjs +100 -0
  14. package/src/lib/address.mjs.map +1 -0
  15. package/src/lib/cards.d.mts +2 -0
  16. package/src/lib/cards.d.ts +2 -0
  17. package/src/lib/cards.js +152 -0
  18. package/src/lib/cards.js.map +1 -0
  19. package/src/lib/cards.mjs +148 -0
  20. package/src/lib/cards.mjs.map +1 -0
  21. package/src/lib/choice-images.d.mts +2 -0
  22. package/src/lib/choice-images.d.ts +2 -0
  23. package/src/lib/choice-images.js +99 -0
  24. package/src/lib/choice-images.js.map +1 -0
  25. package/src/lib/choice-images.mjs +95 -0
  26. package/src/lib/choice-images.mjs.map +1 -0
  27. package/src/lib/choice-rules.d.mts +22 -0
  28. package/src/lib/choice-rules.d.ts +22 -0
  29. package/src/lib/choice-rules.js +46 -0
  30. package/src/lib/choice-rules.js.map +1 -0
  31. package/src/lib/choice-rules.mjs +41 -0
  32. package/src/lib/choice-rules.mjs.map +1 -0
  33. package/src/lib/choice-tags.d.mts +17 -0
  34. package/src/lib/choice-tags.d.ts +17 -0
  35. package/src/lib/choice-tags.js +187 -0
  36. package/src/lib/choice-tags.js.map +1 -0
  37. package/src/lib/choice-tags.mjs +182 -0
  38. package/src/lib/choice-tags.mjs.map +1 -0
  39. package/src/lib/choices-from.d.mts +8 -0
  40. package/src/lib/choices-from.d.ts +8 -0
  41. package/src/lib/choices-from.js +63 -0
  42. package/src/lib/choices-from.js.map +1 -0
  43. package/src/lib/choices-from.mjs +60 -0
  44. package/src/lib/choices-from.mjs.map +1 -0
  45. package/src/lib/display.js +4 -3
  46. package/src/lib/display.js.map +1 -1
  47. package/src/lib/display.mjs +5 -4
  48. package/src/lib/display.mjs.map +1 -1
  49. package/src/lib/extras.js +8 -4
  50. package/src/lib/extras.js.map +1 -1
  51. package/src/lib/extras.mjs +8 -4
  52. package/src/lib/extras.mjs.map +1 -1
  53. package/src/lib/files.d.mts +2 -0
  54. package/src/lib/files.d.ts +2 -0
  55. package/src/lib/files.js +236 -78
  56. package/src/lib/files.js.map +1 -1
  57. package/src/lib/files.mjs +235 -78
  58. package/src/lib/files.mjs.map +1 -1
  59. package/src/lib/focus-trap.d.mts +7 -0
  60. package/src/lib/focus-trap.d.ts +7 -0
  61. package/src/lib/focus-trap.js +26 -0
  62. package/src/lib/focus-trap.js.map +1 -0
  63. package/src/lib/focus-trap.mjs +23 -0
  64. package/src/lib/focus-trap.mjs.map +1 -0
  65. package/src/lib/icons.js +1 -0
  66. package/src/lib/icons.js.map +1 -1
  67. package/src/lib/icons.mjs +1 -0
  68. package/src/lib/icons.mjs.map +1 -1
  69. package/src/lib/kind-parts.d.mts +56 -0
  70. package/src/lib/kind-parts.d.ts +56 -0
  71. package/src/lib/kind-parts.js +121 -0
  72. package/src/lib/kind-parts.js.map +1 -0
  73. package/src/lib/kind-parts.mjs +107 -0
  74. package/src/lib/kind-parts.mjs.map +1 -0
  75. package/src/lib/labels.d.mts +85 -0
  76. package/src/lib/labels.d.ts +85 -0
  77. package/src/lib/labels.js +111 -189
  78. package/src/lib/labels.js.map +1 -1
  79. package/src/lib/labels.mjs +111 -189
  80. package/src/lib/labels.mjs.map +1 -1
  81. package/src/lib/layout-styles.d.mts +11 -0
  82. package/src/lib/layout-styles.d.ts +11 -0
  83. package/src/lib/layout-styles.js +178 -0
  84. package/src/lib/layout-styles.js.map +1 -0
  85. package/src/lib/layout-styles.mjs +175 -0
  86. package/src/lib/layout-styles.mjs.map +1 -0
  87. package/src/lib/limits.d.mts +20 -0
  88. package/src/lib/limits.d.ts +20 -0
  89. package/src/lib/limits.js +71 -0
  90. package/src/lib/limits.js.map +1 -0
  91. package/src/lib/limits.mjs +66 -0
  92. package/src/lib/limits.mjs.map +1 -0
  93. package/src/lib/line-moves.d.mts +8 -0
  94. package/src/lib/line-moves.d.ts +8 -0
  95. package/src/lib/line-moves.js +20 -0
  96. package/src/lib/line-moves.js.map +1 -0
  97. package/src/lib/line-moves.mjs +17 -0
  98. package/src/lib/line-moves.mjs.map +1 -0
  99. package/src/lib/lines.js +85 -7
  100. package/src/lib/lines.js.map +1 -1
  101. package/src/lib/lines.mjs +86 -8
  102. package/src/lib/lines.mjs.map +1 -1
  103. package/src/lib/locales/all.d.mts +8 -0
  104. package/src/lib/locales/all.d.ts +8 -0
  105. package/src/lib/locales/all.js +13 -0
  106. package/src/lib/locales/all.js.map +1 -0
  107. package/src/lib/locales/all.mjs +10 -0
  108. package/src/lib/locales/all.mjs.map +1 -0
  109. package/src/lib/locales/ar.d.mts +3 -0
  110. package/src/lib/locales/ar.d.ts +3 -0
  111. package/src/lib/locales/ar.js +108 -0
  112. package/src/lib/locales/ar.js.map +1 -0
  113. package/src/lib/locales/ar.mjs +105 -0
  114. package/src/lib/locales/ar.mjs.map +1 -0
  115. package/src/lib/locales/de.d.mts +3 -0
  116. package/src/lib/locales/de.d.ts +3 -0
  117. package/src/lib/locales/de.js +108 -0
  118. package/src/lib/locales/de.js.map +1 -0
  119. package/src/lib/locales/de.mjs +105 -0
  120. package/src/lib/locales/de.mjs.map +1 -0
  121. package/src/lib/locales/fr.d.mts +3 -0
  122. package/src/lib/locales/fr.d.ts +3 -0
  123. package/src/lib/locales/fr.js +108 -0
  124. package/src/lib/locales/fr.js.map +1 -0
  125. package/src/lib/locales/fr.mjs +105 -0
  126. package/src/lib/locales/fr.mjs.map +1 -0
  127. package/src/lib/matrix.d.mts +10 -0
  128. package/src/lib/matrix.d.ts +10 -0
  129. package/src/lib/matrix.js +86 -0
  130. package/src/lib/matrix.js.map +1 -0
  131. package/src/lib/matrix.mjs +82 -0
  132. package/src/lib/matrix.mjs.map +1 -0
  133. package/src/lib/numbers.d.mts +7 -0
  134. package/src/lib/numbers.d.ts +7 -0
  135. package/src/lib/numbers.js +15 -0
  136. package/src/lib/numbers.js.map +1 -1
  137. package/src/lib/numbers.mjs +14 -0
  138. package/src/lib/numbers.mjs.map +1 -1
  139. package/src/lib/progress.js +8 -4
  140. package/src/lib/progress.js.map +1 -1
  141. package/src/lib/progress.mjs +8 -4
  142. package/src/lib/progress.mjs.map +1 -1
  143. package/src/lib/ranking.d.mts +2 -0
  144. package/src/lib/ranking.d.ts +2 -0
  145. package/src/lib/ranking.js +172 -0
  146. package/src/lib/ranking.js.map +1 -0
  147. package/src/lib/ranking.mjs +168 -0
  148. package/src/lib/ranking.mjs.map +1 -0
  149. package/src/lib/relations.d.mts +1 -1
  150. package/src/lib/relations.d.ts +1 -1
  151. package/src/lib/relations.js +43 -18
  152. package/src/lib/relations.js.map +1 -1
  153. package/src/lib/relations.mjs +43 -18
  154. package/src/lib/relations.mjs.map +1 -1
  155. package/src/lib/shuffle.d.mts +7 -0
  156. package/src/lib/shuffle.d.ts +7 -0
  157. package/src/lib/shuffle.js +60 -0
  158. package/src/lib/shuffle.js.map +1 -0
  159. package/src/lib/shuffle.mjs +57 -0
  160. package/src/lib/shuffle.mjs.map +1 -0
  161. package/src/lib/signature.d.mts +2 -0
  162. package/src/lib/signature.d.ts +2 -0
  163. package/src/lib/signature.js +223 -0
  164. package/src/lib/signature.js.map +1 -0
  165. package/src/lib/signature.mjs +219 -0
  166. package/src/lib/signature.mjs.map +1 -0
  167. package/src/lib/slider.d.mts +10 -0
  168. package/src/lib/slider.d.ts +10 -0
  169. package/src/lib/slider.js +57 -0
  170. package/src/lib/slider.js.map +1 -0
  171. package/src/lib/slider.mjs +53 -0
  172. package/src/lib/slider.mjs.map +1 -0
  173. package/src/lib/styles-choices.d.mts +7 -0
  174. package/src/lib/styles-choices.d.ts +7 -0
  175. package/src/lib/styles-choices.js +47 -0
  176. package/src/lib/styles-choices.js.map +1 -0
  177. package/src/lib/styles-choices.mjs +44 -0
  178. package/src/lib/styles-choices.mjs.map +1 -0
  179. package/src/lib/styles-inputs.d.mts +9 -0
  180. package/src/lib/styles-inputs.d.ts +9 -0
  181. package/src/lib/styles-inputs.js +41 -0
  182. package/src/lib/styles-inputs.js.map +1 -0
  183. package/src/lib/styles-inputs.mjs +38 -0
  184. package/src/lib/styles-inputs.mjs.map +1 -0
  185. package/src/lib/styles-kinds.d.mts +7 -0
  186. package/src/lib/styles-kinds.d.ts +7 -0
  187. package/src/lib/styles-kinds.js +119 -0
  188. package/src/lib/styles-kinds.js.map +1 -0
  189. package/src/lib/styles-kinds.mjs +116 -0
  190. package/src/lib/styles-kinds.mjs.map +1 -0
  191. package/src/lib/styles-parts.d.mts +16 -0
  192. package/src/lib/styles-parts.d.ts +16 -0
  193. package/src/lib/styles-parts.js +69 -0
  194. package/src/lib/styles-parts.js.map +1 -0
  195. package/src/lib/styles-parts.mjs +66 -0
  196. package/src/lib/styles-parts.mjs.map +1 -0
  197. package/src/lib/styles.d.mts +10 -12
  198. package/src/lib/styles.d.ts +10 -12
  199. package/src/lib/styles.js +259 -64
  200. package/src/lib/styles.js.map +1 -1
  201. package/src/lib/styles.mjs +258 -63
  202. package/src/lib/styles.mjs.map +1 -1
  203. package/src/lib/units.d.mts +10 -0
  204. package/src/lib/units.d.ts +10 -0
  205. package/src/lib/units.js +19 -0
  206. package/src/lib/units.js.map +1 -0
  207. package/src/lib/units.mjs +16 -0
  208. package/src/lib/units.mjs.map +1 -0
  209. package/src/lib/widgets.js +215 -57
  210. package/src/lib/widgets.js.map +1 -1
  211. package/src/lib/widgets.mjs +215 -57
  212. package/src/lib/widgets.mjs.map +1 -1
  213. package/src/lib/yes-no.d.mts +9 -0
  214. package/src/lib/yes-no.d.ts +9 -0
  215. package/src/lib/yes-no.js +58 -0
  216. package/src/lib/yes-no.js.map +1 -0
  217. package/src/lib/yes-no.mjs +54 -0
  218. package/src/lib/yes-no.mjs.map +1 -0
package/README.md CHANGED
@@ -2,7 +2,8 @@
2
2
 
3
3
  The field inputs of [Fieldia](https://fieldia.dev), in plain DOM: text, numbers,
4
4
  choices, ratings and scales, dates, many2one search pickers, tags, tables of
5
- lines, file and image uploads, formatted text and JSON. Two skins, chosen per
5
+ lines, file and image uploads (as a list, thumbnails, or cards with each name
6
+ under its picture), formatted text and JSON. Two skins, chosen per
6
7
  form with `data-fd-skin`:
7
8
 
8
9
  - `underline` — labels beside values, quiet underlined inputs (a business sheet)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fieldia/widgets",
3
- "version": "0.9.2",
3
+ "version": "0.11.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.9.2",
24
+ "@fieldia/core": "0.11.0",
25
25
  "tslib": "^2.8.1"
26
26
  },
27
27
  "sideEffects": false,
package/src/index.d.mts CHANGED
@@ -14,3 +14,5 @@ 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';
package/src/index.d.ts CHANGED
@@ -14,3 +14,5 @@ export * from './lib/statusbar';
14
14
  export * from './lib/calendar';
15
15
  export * from './lib/properties';
16
16
  export * from './lib/icons';
17
+ export * from './lib/focus-trap';
18
+ export { countriesIn } from './lib/address';
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":";;;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"}
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,4 @@
1
+ import type { WidgetFactory } from './widgets.mjs';
2
+ /** Every country, by its code and its name in the language, in the language's order. */
3
+ export declare function countriesIn(locale: string): [string, string][];
4
+ export declare const addressWidget: WidgetFactory;
@@ -0,0 +1,4 @@
1
+ import type { WidgetFactory } from './widgets';
2
+ /** Every country, by its code and its name in the language, in the language's order. */
3
+ export declare function countriesIn(locale: string): [string, string][];
4
+ export declare const addressWidget: WidgetFactory;
@@ -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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"}
@@ -0,0 +1,2 @@
1
+ import { type WidgetFactory } from './widgets.mjs';
2
+ export declare const cardsWidget: WidgetFactory;
@@ -0,0 +1,2 @@
1
+ import { type WidgetFactory } from './widgets';
2
+ export declare const cardsWidget: WidgetFactory;
@@ -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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"}