@fieldia/widgets 0.11.0 → 0.13.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 (243) hide show
  1. package/package.json +2 -2
  2. package/src/index.d.mts +2 -0
  3. package/src/index.d.ts +2 -0
  4. package/src/index.js +6 -1
  5. package/src/index.js.map +1 -1
  6. package/src/index.mjs +2 -0
  7. package/src/index.mjs.map +1 -1
  8. package/src/lib/badge.d.mts +8 -0
  9. package/src/lib/badge.d.ts +8 -0
  10. package/src/lib/badge.js +37 -0
  11. package/src/lib/badge.js.map +1 -0
  12. package/src/lib/badge.mjs +33 -0
  13. package/src/lib/badge.mjs.map +1 -0
  14. package/src/lib/calendar.d.mts +3 -1
  15. package/src/lib/calendar.d.ts +3 -1
  16. package/src/lib/calendar.js +17 -1
  17. package/src/lib/calendar.js.map +1 -1
  18. package/src/lib/calendar.mjs +17 -1
  19. package/src/lib/calendar.mjs.map +1 -1
  20. package/src/lib/cards.js +12 -4
  21. package/src/lib/cards.js.map +1 -1
  22. package/src/lib/cards.mjs +13 -5
  23. package/src/lib/cards.mjs.map +1 -1
  24. package/src/lib/choice-images.js +1 -1
  25. package/src/lib/choice-images.js.map +1 -1
  26. package/src/lib/choice-images.mjs +1 -1
  27. package/src/lib/choice-images.mjs.map +1 -1
  28. package/src/lib/choice-tags.js +6 -4
  29. package/src/lib/choice-tags.js.map +1 -1
  30. package/src/lib/choice-tags.mjs +6 -4
  31. package/src/lib/choice-tags.mjs.map +1 -1
  32. package/src/lib/colour.d.mts +11 -0
  33. package/src/lib/colour.d.ts +11 -0
  34. package/src/lib/colour.js +114 -0
  35. package/src/lib/colour.js.map +1 -0
  36. package/src/lib/colour.mjs +110 -0
  37. package/src/lib/colour.mjs.map +1 -0
  38. package/src/lib/copy.d.mts +8 -0
  39. package/src/lib/copy.d.ts +8 -0
  40. package/src/lib/copy.js +58 -0
  41. package/src/lib/copy.js.map +1 -0
  42. package/src/lib/copy.mjs +54 -0
  43. package/src/lib/copy.mjs.map +1 -0
  44. package/src/lib/date-range.d.mts +2 -0
  45. package/src/lib/date-range.d.ts +2 -0
  46. package/src/lib/date-range.js +220 -0
  47. package/src/lib/date-range.js.map +1 -0
  48. package/src/lib/date-range.mjs +216 -0
  49. package/src/lib/date-range.mjs.map +1 -0
  50. package/src/lib/display.d.mts +25 -1
  51. package/src/lib/display.d.ts +25 -1
  52. package/src/lib/display.js +42 -2
  53. package/src/lib/display.js.map +1 -1
  54. package/src/lib/display.mjs +39 -2
  55. package/src/lib/display.mjs.map +1 -1
  56. package/src/lib/distribution.d.mts +13 -0
  57. package/src/lib/distribution.d.ts +13 -0
  58. package/src/lib/distribution.js +159 -0
  59. package/src/lib/distribution.js.map +1 -0
  60. package/src/lib/distribution.mjs +152 -0
  61. package/src/lib/distribution.mjs.map +1 -0
  62. package/src/lib/duration.d.mts +18 -0
  63. package/src/lib/duration.d.ts +18 -0
  64. package/src/lib/duration.js +137 -0
  65. package/src/lib/duration.js.map +1 -0
  66. package/src/lib/duration.mjs +128 -0
  67. package/src/lib/duration.mjs.map +1 -0
  68. package/src/lib/embed.d.mts +3 -0
  69. package/src/lib/embed.d.ts +3 -0
  70. package/src/lib/embed.js +97 -0
  71. package/src/lib/embed.js.map +1 -0
  72. package/src/lib/embed.mjs +92 -0
  73. package/src/lib/embed.mjs.map +1 -0
  74. package/src/lib/extras.js +6 -0
  75. package/src/lib/extras.js.map +1 -1
  76. package/src/lib/extras.mjs +6 -0
  77. package/src/lib/extras.mjs.map +1 -1
  78. package/src/lib/files.d.mts +11 -0
  79. package/src/lib/files.d.ts +11 -0
  80. package/src/lib/files.js +19 -0
  81. package/src/lib/files.js.map +1 -1
  82. package/src/lib/files.mjs +18 -0
  83. package/src/lib/files.mjs.map +1 -1
  84. package/src/lib/float.d.mts +14 -0
  85. package/src/lib/float.d.ts +14 -0
  86. package/src/lib/float.js +91 -0
  87. package/src/lib/float.js.map +1 -0
  88. package/src/lib/float.mjs +88 -0
  89. package/src/lib/float.mjs.map +1 -0
  90. package/src/lib/kind-parts.d.mts +4 -3
  91. package/src/lib/kind-parts.d.ts +4 -3
  92. package/src/lib/kind-parts.js +5 -3
  93. package/src/lib/kind-parts.js.map +1 -1
  94. package/src/lib/kind-parts.mjs +5 -3
  95. package/src/lib/kind-parts.mjs.map +1 -1
  96. package/src/lib/labels.d.mts +39 -0
  97. package/src/lib/labels.d.ts +39 -0
  98. package/src/lib/labels.js +29 -0
  99. package/src/lib/labels.js.map +1 -1
  100. package/src/lib/labels.mjs +29 -0
  101. package/src/lib/labels.mjs.map +1 -1
  102. package/src/lib/layout-styles.d.mts +1 -1
  103. package/src/lib/layout-styles.d.ts +1 -1
  104. package/src/lib/layout-styles.js +12 -5
  105. package/src/lib/layout-styles.js.map +1 -1
  106. package/src/lib/layout-styles.mjs +12 -5
  107. package/src/lib/layout-styles.mjs.map +1 -1
  108. package/src/lib/lines.d.mts +12 -2
  109. package/src/lib/lines.d.ts +12 -2
  110. package/src/lib/lines.js +372 -25
  111. package/src/lib/lines.js.map +1 -1
  112. package/src/lib/lines.mjs +371 -26
  113. package/src/lib/lines.mjs.map +1 -1
  114. package/src/lib/links-table.d.mts +11 -0
  115. package/src/lib/links-table.d.ts +11 -0
  116. package/src/lib/links-table.js +116 -0
  117. package/src/lib/links-table.js.map +1 -0
  118. package/src/lib/links-table.mjs +112 -0
  119. package/src/lib/links-table.mjs.map +1 -0
  120. package/src/lib/locales/ar.js +29 -0
  121. package/src/lib/locales/ar.js.map +1 -1
  122. package/src/lib/locales/ar.mjs +29 -0
  123. package/src/lib/locales/ar.mjs.map +1 -1
  124. package/src/lib/locales/de.js +29 -0
  125. package/src/lib/locales/de.js.map +1 -1
  126. package/src/lib/locales/de.mjs +29 -0
  127. package/src/lib/locales/de.mjs.map +1 -1
  128. package/src/lib/locales/fr.js +29 -0
  129. package/src/lib/locales/fr.js.map +1 -1
  130. package/src/lib/locales/fr.mjs +29 -0
  131. package/src/lib/locales/fr.mjs.map +1 -1
  132. package/src/lib/numbers.d.mts +5 -1
  133. package/src/lib/numbers.d.ts +5 -1
  134. package/src/lib/numbers.js +15 -2
  135. package/src/lib/numbers.js.map +1 -1
  136. package/src/lib/numbers.mjs +13 -2
  137. package/src/lib/numbers.mjs.map +1 -1
  138. package/src/lib/payments.d.mts +2 -0
  139. package/src/lib/payments.d.ts +2 -0
  140. package/src/lib/payments.js +94 -0
  141. package/src/lib/payments.js.map +1 -0
  142. package/src/lib/payments.mjs +90 -0
  143. package/src/lib/payments.mjs.map +1 -0
  144. package/src/lib/popup.d.mts +11 -0
  145. package/src/lib/popup.d.ts +11 -0
  146. package/src/lib/popup.js +48 -0
  147. package/src/lib/popup.js.map +1 -0
  148. package/src/lib/popup.mjs +45 -0
  149. package/src/lib/popup.mjs.map +1 -0
  150. package/src/lib/priority.d.mts +10 -0
  151. package/src/lib/priority.d.ts +10 -0
  152. package/src/lib/priority.js +59 -0
  153. package/src/lib/priority.js.map +1 -0
  154. package/src/lib/priority.mjs +55 -0
  155. package/src/lib/priority.mjs.map +1 -0
  156. package/src/lib/progress.js +3 -0
  157. package/src/lib/progress.js.map +1 -1
  158. package/src/lib/progress.mjs +3 -0
  159. package/src/lib/progress.mjs.map +1 -1
  160. package/src/lib/properties.js +100 -9
  161. package/src/lib/properties.js.map +1 -1
  162. package/src/lib/properties.mjs +100 -9
  163. package/src/lib/properties.mjs.map +1 -1
  164. package/src/lib/read-text.d.mts +25 -0
  165. package/src/lib/read-text.d.ts +25 -0
  166. package/src/lib/read-text.js +102 -0
  167. package/src/lib/read-text.js.map +1 -0
  168. package/src/lib/read-text.mjs +98 -0
  169. package/src/lib/read-text.mjs.map +1 -0
  170. package/src/lib/relations.d.mts +12 -0
  171. package/src/lib/relations.d.ts +12 -0
  172. package/src/lib/relations.js +110 -10
  173. package/src/lib/relations.js.map +1 -1
  174. package/src/lib/relations.mjs +108 -10
  175. package/src/lib/relations.mjs.map +1 -1
  176. package/src/lib/slider.js +1 -1
  177. package/src/lib/slider.js.map +1 -1
  178. package/src/lib/slider.mjs +1 -1
  179. package/src/lib/slider.mjs.map +1 -1
  180. package/src/lib/state-dot.d.mts +2 -0
  181. package/src/lib/state-dot.d.ts +2 -0
  182. package/src/lib/state-dot.js +107 -0
  183. package/src/lib/state-dot.js.map +1 -0
  184. package/src/lib/state-dot.mjs +103 -0
  185. package/src/lib/state-dot.mjs.map +1 -0
  186. package/src/lib/statusbar.js +151 -14
  187. package/src/lib/statusbar.js.map +1 -1
  188. package/src/lib/statusbar.mjs +151 -14
  189. package/src/lib/statusbar.mjs.map +1 -1
  190. package/src/lib/styles-business.d.mts +8 -0
  191. package/src/lib/styles-business.d.ts +8 -0
  192. package/src/lib/styles-business.js +120 -0
  193. package/src/lib/styles-business.js.map +1 -0
  194. package/src/lib/styles-business.mjs +117 -0
  195. package/src/lib/styles-business.mjs.map +1 -0
  196. package/src/lib/styles-inputs.d.mts +1 -1
  197. package/src/lib/styles-inputs.d.ts +1 -1
  198. package/src/lib/styles-inputs.js +2 -0
  199. package/src/lib/styles-inputs.js.map +1 -1
  200. package/src/lib/styles-inputs.mjs +2 -0
  201. package/src/lib/styles-inputs.mjs.map +1 -1
  202. package/src/lib/styles-kinds.d.mts +1 -1
  203. package/src/lib/styles-kinds.d.ts +1 -1
  204. package/src/lib/styles-kinds.js +2 -2
  205. package/src/lib/styles-kinds.mjs +2 -2
  206. package/src/lib/styles-sheet.d.mts +6 -0
  207. package/src/lib/styles-sheet.d.ts +6 -0
  208. package/src/lib/styles-sheet.js +139 -0
  209. package/src/lib/styles-sheet.js.map +1 -0
  210. package/src/lib/styles-sheet.mjs +136 -0
  211. package/src/lib/styles-sheet.mjs.map +1 -0
  212. package/src/lib/styles.js +223 -27
  213. package/src/lib/styles.js.map +1 -1
  214. package/src/lib/styles.mjs +223 -27
  215. package/src/lib/styles.mjs.map +1 -1
  216. package/src/lib/tax-totals.d.mts +2 -0
  217. package/src/lib/tax-totals.d.ts +2 -0
  218. package/src/lib/tax-totals.js +92 -0
  219. package/src/lib/tax-totals.js.map +1 -0
  220. package/src/lib/tax-totals.mjs +88 -0
  221. package/src/lib/tax-totals.mjs.map +1 -0
  222. package/src/lib/themes.d.mts +29 -0
  223. package/src/lib/themes.d.ts +29 -0
  224. package/src/lib/themes.js +180 -0
  225. package/src/lib/themes.js.map +1 -0
  226. package/src/lib/themes.mjs +177 -0
  227. package/src/lib/themes.mjs.map +1 -0
  228. package/src/lib/timer.d.mts +4 -0
  229. package/src/lib/timer.d.ts +4 -0
  230. package/src/lib/timer.js +62 -0
  231. package/src/lib/timer.js.map +1 -0
  232. package/src/lib/timer.mjs +57 -0
  233. package/src/lib/timer.mjs.map +1 -0
  234. package/src/lib/widgets.d.mts +18 -3
  235. package/src/lib/widgets.d.ts +18 -3
  236. package/src/lib/widgets.js +89 -10
  237. package/src/lib/widgets.js.map +1 -1
  238. package/src/lib/widgets.mjs +90 -11
  239. package/src/lib/widgets.mjs.map +1 -1
  240. package/src/lib/yes-no.js +1 -1
  241. package/src/lib/yes-no.js.map +1 -1
  242. package/src/lib/yes-no.mjs +1 -1
  243. package/src/lib/yes-no.mjs.map +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distribution.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/distribution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Field, Locale, Value } from '@fieldia/core';
2
+ import type { WidgetFactory } from './widgets.mjs';
3
+ /** Hours as HH:MM: 6.5 → "06:30", -1.5 → "-01:30"; the minutes rounded. */
4
+ export declare function formatDuration(hours: number): string;
5
+ /**
6
+ * What was typed as hours: "6:30", "06:30" or "6.5" (in the page's language,
7
+ * "6,5"). Null when emptied; undefined while it is still being typed ("6:");
8
+ * the text itself when it is no time, for the form to say so.
9
+ */
10
+ export declare function parseDuration(raw: string, locale?: Locale): Value | undefined;
11
+ /** A fraction as a per cent, as the page's language writes one: 0.25 → "25%" ("25 %" in French); at most `decimals` places, none written that are zero. */
12
+ export declare function formatPercentage(fraction: number, locale?: Locale, decimals?: number): string;
13
+ /** Hours typed and shown as HH:MM. */
14
+ export declare const durationWidget: WidgetFactory;
15
+ /** A fraction typed and shown as a per cent: 0.25 is "25", "%" after it. */
16
+ export declare const percentageWidget: WidgetFactory;
17
+ /** A duration's or a percentage's value as words, where it is not edited: a cell, a total, a read-only part. Null for any other widget. */
18
+ export declare function shownNumber(widget: string | undefined, field: Field, value: Value | undefined, locale: Locale, options?: Record<string, unknown>): string | null;
@@ -0,0 +1,18 @@
1
+ import type { Field, Locale, Value } from '@fieldia/core';
2
+ import type { WidgetFactory } from './widgets';
3
+ /** Hours as HH:MM: 6.5 → "06:30", -1.5 → "-01:30"; the minutes rounded. */
4
+ export declare function formatDuration(hours: number): string;
5
+ /**
6
+ * What was typed as hours: "6:30", "06:30" or "6.5" (in the page's language,
7
+ * "6,5"). Null when emptied; undefined while it is still being typed ("6:");
8
+ * the text itself when it is no time, for the form to say so.
9
+ */
10
+ export declare function parseDuration(raw: string, locale?: Locale): Value | undefined;
11
+ /** A fraction as a per cent, as the page's language writes one: 0.25 → "25%" ("25 %" in French); at most `decimals` places, none written that are zero. */
12
+ export declare function formatPercentage(fraction: number, locale?: Locale, decimals?: number): string;
13
+ /** Hours typed and shown as HH:MM. */
14
+ export declare const durationWidget: WidgetFactory;
15
+ /** A fraction typed and shown as a per cent: 0.25 is "25", "%" after it. */
16
+ export declare const percentageWidget: WidgetFactory;
17
+ /** A duration's or a percentage's value as words, where it is not edited: a cell, a total, a read-only part. Null for any other widget. */
18
+ export declare function shownNumber(widget: string | undefined, field: Field, value: Value | undefined, locale: Locale, options?: Record<string, unknown>): string | null;
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.percentageWidget = exports.durationWidget = void 0;
4
+ exports.formatDuration = formatDuration;
5
+ exports.parseDuration = parseDuration;
6
+ exports.formatPercentage = formatPercentage;
7
+ exports.shownNumber = shownNumber;
8
+ const numbers_1 = require("./numbers");
9
+ const kind_parts_1 = require("./kind-parts");
10
+ /**
11
+ * Two numbers shown as people read them rather than as they are kept: hours
12
+ * as hours and minutes, "06:30" for 6.5 (Flectra's float_time, `duration`),
13
+ * and a fraction as a per cent, "25 %" for 0.25 (Flectra's `percentage`).
14
+ * Each is typed as it is shown, and kept as the number. Options: `suffix`,
15
+ * words inside the box after the value ("hours").
16
+ */
17
+ const pad = (n) => String(n).padStart(2, '0');
18
+ /** Hours as HH:MM: 6.5 → "06:30", -1.5 → "-01:30"; the minutes rounded. */
19
+ function formatDuration(hours) {
20
+ const minutes = Math.round(Math.abs(hours) * 60);
21
+ return `${hours < 0 && minutes ? '-' : ''}${pad(Math.floor(minutes / 60))}:${pad(minutes % 60)}`;
22
+ }
23
+ /**
24
+ * What was typed as hours: "6:30", "06:30" or "6.5" (in the page's language,
25
+ * "6,5"). Null when emptied; undefined while it is still being typed ("6:");
26
+ * the text itself when it is no time, for the form to say so.
27
+ */
28
+ function parseDuration(raw, locale = 'en') {
29
+ const text = (0, numbers_1.normalizeNumber)(raw.trim(), locale);
30
+ if (text === '')
31
+ return null;
32
+ const time = /^(-?)(\d+):(\d{1,2})$/.exec(text);
33
+ if (time) {
34
+ const minutes = Number(time[3]);
35
+ if (minutes > 59)
36
+ return raw.trim();
37
+ const hours = Number(time[2]) + minutes / 60;
38
+ return time[1] ? -hours : hours;
39
+ }
40
+ if (/^-?(\d+\.?\d*|\.\d+)$/.test(text))
41
+ return Number(text);
42
+ if (/^-?(\d+:?)?\.?$/.test(text))
43
+ return undefined;
44
+ return raw.trim();
45
+ }
46
+ const percents = new Map();
47
+ function percentFormat(locale, decimals, style) {
48
+ const key = `${locale}:${decimals}:${style}`;
49
+ let found = percents.get(key);
50
+ if (!found) {
51
+ found = new Intl.NumberFormat(locale, { style, numberingSystem: 'latn', minimumFractionDigits: 0, maximumFractionDigits: decimals });
52
+ percents.set(key, found);
53
+ }
54
+ return found;
55
+ }
56
+ /** A fraction as a per cent, as the page's language writes one: 0.25 → "25%" ("25 %" in French); at most `decimals` places, none written that are zero. */
57
+ function formatPercentage(fraction, locale = 'en', decimals = 2) {
58
+ return percentFormat(locale, decimals, 'percent').format(fraction);
59
+ }
60
+ /** The places a percentage shows: the field's own, else two. */
61
+ const placesOf = (field) => (field.type === 'float' ? (field.digits?.[1] ?? 2) : 2);
62
+ /** A box whose value is shown and typed in its own way, with words after it inside the box. */
63
+ function shownBox(context, way) {
64
+ const { form, name, node, id, document } = context;
65
+ const make = (0, kind_parts_1.maker)(document);
66
+ const input = make('input', { id, type: 'text', class: `fd-input fd-number-input ${way.className}`, autocomplete: 'off', inputmode: way.inputMode });
67
+ if (node.placeholder)
68
+ input.placeholder = node.placeholder;
69
+ const shown = (value) => (typeof value === 'number' ? way.show(value) : value === null || value === undefined ? '' : String(value));
70
+ input.addEventListener('input', () => {
71
+ const value = way.parse(input.value);
72
+ if (value !== undefined)
73
+ form.setValue(name, value);
74
+ });
75
+ input.addEventListener('blur', () => {
76
+ input.value = shown(form.getState().values[name]);
77
+ });
78
+ // Inside the box after the value, as a number's unit is.
79
+ const suffix = typeof node.options?.['suffix'] === 'string' && node.options['suffix'] ? node.options['suffix'] : way.unit;
80
+ const unit = suffix ? make('span', { class: 'fd-unit', id: `${id}-unit2` }, suffix) : null;
81
+ const element = unit ? make('span', { class: 'fd-number' }, input, unit) : input;
82
+ if (unit)
83
+ input.style.setProperty('padding-inline-end', `calc(var(--fd-pad-x) + ${suffix?.length ?? 0}ch + 4px)`);
84
+ return {
85
+ element,
86
+ focus: () => input.focus(),
87
+ update(state) {
88
+ const typing = document.activeElement === input;
89
+ const parsed = way.parse(input.value);
90
+ if (!(typing && (parsed === undefined || parsed === state.value))) {
91
+ const text = shown(state.value);
92
+ if (input.value !== text)
93
+ input.value = text;
94
+ }
95
+ if (input.readOnly !== state.readonly)
96
+ input.readOnly = state.readonly;
97
+ (0, kind_parts_1.setAttr)(input, 'aria-required', String(state.required));
98
+ (0, kind_parts_1.describeState)(input, { ...state, describedBy: [state.describedBy, unit?.id].filter(Boolean).join(' ') });
99
+ },
100
+ };
101
+ }
102
+ /** Hours typed and shown as HH:MM. */
103
+ const durationWidget = (context) => {
104
+ const locale = context.locale ?? 'en';
105
+ return shownBox(context, { show: formatDuration, parse: (text) => parseDuration(text, locale), inputMode: 'text', className: 'fd-duration' });
106
+ };
107
+ exports.durationWidget = durationWidget;
108
+ /** A fraction typed and shown as a per cent: 0.25 is "25", "%" after it. */
109
+ const percentageWidget = (context) => {
110
+ const locale = context.locale ?? 'en';
111
+ const places = placesOf(context.field);
112
+ return shownBox(context, {
113
+ show: (value) => percentFormat(locale, places, 'decimal').format(Math.round(value * 100 * 10 ** places) / 10 ** places),
114
+ parse(raw) {
115
+ const text = (0, numbers_1.normalizeNumber)(raw.trim(), locale).replace(/%$/, '');
116
+ if (text === '')
117
+ return null;
118
+ if (/^-?(\d+\.?\d*|\.\d+)$/.test(text))
119
+ return Math.round((Number(text) / 100) * 1e10) / 1e10;
120
+ if (/^-?\.?$/.test(text))
121
+ return undefined;
122
+ return raw.trim();
123
+ },
124
+ unit: '%',
125
+ inputMode: 'decimal',
126
+ className: 'fd-percentage',
127
+ });
128
+ };
129
+ exports.percentageWidget = percentageWidget;
130
+ /** A duration's or a percentage's value as words, where it is not edited: a cell, a total, a read-only part. Null for any other widget. */
131
+ function shownNumber(widget, field, value, locale, options = {}) {
132
+ if (typeof value !== 'number' || (widget !== 'duration' && widget !== 'percentage'))
133
+ return null;
134
+ const suffix = typeof options['suffix'] === 'string' && options['suffix'] ? ` ${options['suffix']}` : '';
135
+ return widget === 'duration' ? formatDuration(value) + suffix : formatPercentage(value, locale, placesOf(field));
136
+ }
137
+ //# sourceMappingURL=duration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration.js","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/duration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ import { normalizeNumber } from './numbers.mjs';
2
+ import { describeState, maker, setAttr } from './kind-parts.mjs';
3
+ /**
4
+ * Two numbers shown as people read them rather than as they are kept: hours
5
+ * as hours and minutes, "06:30" for 6.5 (Flectra's float_time, `duration`),
6
+ * and a fraction as a per cent, "25 %" for 0.25 (Flectra's `percentage`).
7
+ * Each is typed as it is shown, and kept as the number. Options: `suffix`,
8
+ * words inside the box after the value ("hours").
9
+ */
10
+ const pad = (n) => String(n).padStart(2, '0');
11
+ /** Hours as HH:MM: 6.5 → "06:30", -1.5 → "-01:30"; the minutes rounded. */
12
+ export function formatDuration(hours) {
13
+ const minutes = Math.round(Math.abs(hours) * 60);
14
+ return `${hours < 0 && minutes ? '-' : ''}${pad(Math.floor(minutes / 60))}:${pad(minutes % 60)}`;
15
+ }
16
+ /**
17
+ * What was typed as hours: "6:30", "06:30" or "6.5" (in the page's language,
18
+ * "6,5"). Null when emptied; undefined while it is still being typed ("6:");
19
+ * the text itself when it is no time, for the form to say so.
20
+ */
21
+ export function parseDuration(raw, locale = 'en') {
22
+ const text = normalizeNumber(raw.trim(), locale);
23
+ if (text === '')
24
+ return null;
25
+ const time = /^(-?)(\d+):(\d{1,2})$/.exec(text);
26
+ if (time) {
27
+ const minutes = Number(time[3]);
28
+ if (minutes > 59)
29
+ return raw.trim();
30
+ const hours = Number(time[2]) + minutes / 60;
31
+ return time[1] ? -hours : hours;
32
+ }
33
+ if (/^-?(\d+\.?\d*|\.\d+)$/.test(text))
34
+ return Number(text);
35
+ if (/^-?(\d+:?)?\.?$/.test(text))
36
+ return undefined;
37
+ return raw.trim();
38
+ }
39
+ const percents = new Map();
40
+ function percentFormat(locale, decimals, style) {
41
+ const key = `${locale}:${decimals}:${style}`;
42
+ let found = percents.get(key);
43
+ if (!found) {
44
+ found = new Intl.NumberFormat(locale, { style, numberingSystem: 'latn', minimumFractionDigits: 0, maximumFractionDigits: decimals });
45
+ percents.set(key, found);
46
+ }
47
+ return found;
48
+ }
49
+ /** A fraction as a per cent, as the page's language writes one: 0.25 → "25%" ("25 %" in French); at most `decimals` places, none written that are zero. */
50
+ export function formatPercentage(fraction, locale = 'en', decimals = 2) {
51
+ return percentFormat(locale, decimals, 'percent').format(fraction);
52
+ }
53
+ /** The places a percentage shows: the field's own, else two. */
54
+ const placesOf = (field) => (field.type === 'float' ? (field.digits?.[1] ?? 2) : 2);
55
+ /** A box whose value is shown and typed in its own way, with words after it inside the box. */
56
+ function shownBox(context, way) {
57
+ const { form, name, node, id, document } = context;
58
+ const make = maker(document);
59
+ const input = make('input', { id, type: 'text', class: `fd-input fd-number-input ${way.className}`, autocomplete: 'off', inputmode: way.inputMode });
60
+ if (node.placeholder)
61
+ input.placeholder = node.placeholder;
62
+ const shown = (value) => (typeof value === 'number' ? way.show(value) : value === null || value === undefined ? '' : String(value));
63
+ input.addEventListener('input', () => {
64
+ const value = way.parse(input.value);
65
+ if (value !== undefined)
66
+ form.setValue(name, value);
67
+ });
68
+ input.addEventListener('blur', () => {
69
+ input.value = shown(form.getState().values[name]);
70
+ });
71
+ // Inside the box after the value, as a number's unit is.
72
+ const suffix = typeof node.options?.['suffix'] === 'string' && node.options['suffix'] ? node.options['suffix'] : way.unit;
73
+ const unit = suffix ? make('span', { class: 'fd-unit', id: `${id}-unit2` }, suffix) : null;
74
+ const element = unit ? make('span', { class: 'fd-number' }, input, unit) : input;
75
+ if (unit)
76
+ input.style.setProperty('padding-inline-end', `calc(var(--fd-pad-x) + ${suffix?.length ?? 0}ch + 4px)`);
77
+ return {
78
+ element,
79
+ focus: () => input.focus(),
80
+ update(state) {
81
+ const typing = document.activeElement === input;
82
+ const parsed = way.parse(input.value);
83
+ if (!(typing && (parsed === undefined || parsed === state.value))) {
84
+ const text = shown(state.value);
85
+ if (input.value !== text)
86
+ input.value = text;
87
+ }
88
+ if (input.readOnly !== state.readonly)
89
+ input.readOnly = state.readonly;
90
+ setAttr(input, 'aria-required', String(state.required));
91
+ describeState(input, { ...state, describedBy: [state.describedBy, unit?.id].filter(Boolean).join(' ') });
92
+ },
93
+ };
94
+ }
95
+ /** Hours typed and shown as HH:MM. */
96
+ export const durationWidget = (context) => {
97
+ const locale = context.locale ?? 'en';
98
+ return shownBox(context, { show: formatDuration, parse: (text) => parseDuration(text, locale), inputMode: 'text', className: 'fd-duration' });
99
+ };
100
+ /** A fraction typed and shown as a per cent: 0.25 is "25", "%" after it. */
101
+ export const percentageWidget = (context) => {
102
+ const locale = context.locale ?? 'en';
103
+ const places = placesOf(context.field);
104
+ return shownBox(context, {
105
+ show: (value) => percentFormat(locale, places, 'decimal').format(Math.round(value * 100 * 10 ** places) / 10 ** places),
106
+ parse(raw) {
107
+ const text = normalizeNumber(raw.trim(), locale).replace(/%$/, '');
108
+ if (text === '')
109
+ return null;
110
+ if (/^-?(\d+\.?\d*|\.\d+)$/.test(text))
111
+ return Math.round((Number(text) / 100) * 1e10) / 1e10;
112
+ if (/^-?\.?$/.test(text))
113
+ return undefined;
114
+ return raw.trim();
115
+ },
116
+ unit: '%',
117
+ inputMode: 'decimal',
118
+ className: 'fd-percentage',
119
+ });
120
+ };
121
+ /** A duration's or a percentage's value as words, where it is not edited: a cell, a total, a read-only part. Null for any other widget. */
122
+ export function shownNumber(widget, field, value, locale, options = {}) {
123
+ if (typeof value !== 'number' || (widget !== 'duration' && widget !== 'percentage'))
124
+ return null;
125
+ const suffix = typeof options['suffix'] === 'string' && options['suffix'] ? ` ${options['suffix']}` : '';
126
+ return widget === 'duration' ? formatDuration(value) + suffix : formatPercentage(value, locale, placesOf(field));
127
+ }
128
+ //# sourceMappingURL=duration.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/duration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { WidgetFactory } from './widgets.mjs';
2
+ export declare const pdfWidget: WidgetFactory;
3
+ export declare const embedWidget: WidgetFactory;
@@ -0,0 +1,3 @@
1
+ import type { WidgetFactory } from './widgets';
2
+ export declare const pdfWidget: WidgetFactory;
3
+ export declare const embedWidget: WidgetFactory;
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.embedWidget = exports.pdfWidget = void 0;
4
+ const files_1 = require("./files");
5
+ const kind_parts_1 = require("./kind-parts");
6
+ /**
7
+ * A document shown inline, in the browser's own viewer: a PDF kept in a file
8
+ * field, under the field's own file box (Flectra's widget="pdf_viewer"), or a
9
+ * web page at the address a text field holds, with a link to open it in a tab
10
+ * of its own (its embed_viewer: a Google Slides deck). Nothing is drawn by
11
+ * Fieldia: the frame shows what the browser does. `options.height` is the
12
+ * frame's height in pixels (480).
13
+ */
14
+ const heightOf = (value) => (typeof value === 'number' && value > 0 ? value : 480);
15
+ const isWeb = (text) => /^https?:\/\//i.test(text);
16
+ /** A file's address for a frame: its data as a blob the browser shows (freed by `free`), or the address the app gave. */
17
+ function addressOf(file) {
18
+ if (file.data) {
19
+ const bytes = Uint8Array.from(atob(file.data), (c) => c.charCodeAt(0));
20
+ return URL.createObjectURL(new Blob([bytes], { type: file.type || 'application/pdf' }));
21
+ }
22
+ return file.url ?? '';
23
+ }
24
+ const pdfWidget = (context) => {
25
+ const make = (0, kind_parts_1.maker)(context.document);
26
+ const words = (0, kind_parts_1.wordsFor)(context.labels, context.locale);
27
+ const files = (0, files_1.binaryWidget)({ ...context, node: { ...context.node, widget: undefined } });
28
+ const frame = make('iframe', { class: 'fd-embed-frame' });
29
+ frame.style.height = `${heightOf(context.node.options?.['height'])}px`;
30
+ const none = make('div', { class: 'fd-embed-none' }, words.noDocument);
31
+ const view = make('div', { class: 'fd-embed-view' });
32
+ let shown;
33
+ let address = '';
34
+ const free = () => address.startsWith('blob:') && URL.revokeObjectURL(address);
35
+ return {
36
+ element: make('div', { class: 'fd-embed fd-embed-pdf' }, files.element, view),
37
+ focus: () => files.focus(),
38
+ destroy() {
39
+ free();
40
+ files.destroy?.();
41
+ },
42
+ update(state) {
43
+ files.update(state);
44
+ const file = (Array.isArray(state.value) ? state.value[0] : state.value);
45
+ if (file !== shown) {
46
+ shown = file;
47
+ free();
48
+ address = file ? addressOf(file) : '';
49
+ if (address) {
50
+ frame.title = file?.name ?? context.field.label;
51
+ frame.src = address;
52
+ }
53
+ }
54
+ // While there is none, the file box says what to do; read-only, these words say there is none.
55
+ view.replaceChildren(...(address ? [frame] : state.readonly ? [none] : []));
56
+ },
57
+ };
58
+ };
59
+ exports.pdfWidget = pdfWidget;
60
+ const embedWidget = ({ form, name, field, node, id, document, labels, locale }) => {
61
+ const make = (0, kind_parts_1.maker)(document);
62
+ const words = (0, kind_parts_1.wordsFor)(labels, locale);
63
+ const input = make('input', { id, type: 'url', class: 'fd-input', autocomplete: 'url' });
64
+ if (node.placeholder)
65
+ input.placeholder = node.placeholder;
66
+ input.addEventListener('input', () => form.setValue(name, input.value === '' ? null : input.value));
67
+ // Its own scripts run, as an embedded deck's must; it cannot reach the form, nor leave the frame but for a new tab.
68
+ const frame = make('iframe', { class: 'fd-embed-frame', title: field.label, sandbox: 'allow-scripts allow-same-origin allow-popups allow-presentation', referrerpolicy: 'no-referrer', loading: 'lazy' });
69
+ frame.style.height = `${heightOf(node.options?.['height'])}px`;
70
+ const open = make('a', { class: 'fd-button fd-button-link fd-embed-open', target: '_blank', rel: 'noopener noreferrer', hidden: '' }, words.openInNewTab);
71
+ const view = make('div', { class: 'fd-embed-view' });
72
+ let shown = '';
73
+ return {
74
+ element: make('div', { class: 'fd-embed' }, make('div', { class: 'fd-embed-bar' }, input, open), view),
75
+ focus: () => input.focus(),
76
+ update(state) {
77
+ const text = typeof state.value === 'string' ? state.value.trim() : '';
78
+ if (document.activeElement !== input && input.value !== (typeof state.value === 'string' ? state.value : ''))
79
+ input.value = typeof state.value === 'string' ? state.value : '';
80
+ if (input.readOnly !== state.readonly)
81
+ input.readOnly = state.readonly;
82
+ input.hidden = state.readonly;
83
+ const web = isWeb(text) ? text : '';
84
+ if (web !== shown) {
85
+ shown = web;
86
+ if (web)
87
+ frame.src = web;
88
+ view.replaceChildren(...(web ? [frame] : []));
89
+ }
90
+ open.hidden = !web;
91
+ if (web)
92
+ open.href = web;
93
+ },
94
+ };
95
+ };
96
+ exports.embedWidget = embedWidget;
97
+ //# sourceMappingURL=embed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed.js","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/embed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import { binaryWidget } from './files.mjs';
2
+ import { maker, wordsFor } from './kind-parts.mjs';
3
+ /**
4
+ * A document shown inline, in the browser's own viewer: a PDF kept in a file
5
+ * field, under the field's own file box (Flectra's widget="pdf_viewer"), or a
6
+ * web page at the address a text field holds, with a link to open it in a tab
7
+ * of its own (its embed_viewer: a Google Slides deck). Nothing is drawn by
8
+ * Fieldia: the frame shows what the browser does. `options.height` is the
9
+ * frame's height in pixels (480).
10
+ */
11
+ const heightOf = (value) => (typeof value === 'number' && value > 0 ? value : 480);
12
+ const isWeb = (text) => /^https?:\/\//i.test(text);
13
+ /** A file's address for a frame: its data as a blob the browser shows (freed by `free`), or the address the app gave. */
14
+ function addressOf(file) {
15
+ if (file.data) {
16
+ const bytes = Uint8Array.from(atob(file.data), (c) => c.charCodeAt(0));
17
+ return URL.createObjectURL(new Blob([bytes], { type: file.type || 'application/pdf' }));
18
+ }
19
+ return file.url ?? '';
20
+ }
21
+ export const pdfWidget = (context) => {
22
+ const make = maker(context.document);
23
+ const words = wordsFor(context.labels, context.locale);
24
+ const files = binaryWidget({ ...context, node: { ...context.node, widget: undefined } });
25
+ const frame = make('iframe', { class: 'fd-embed-frame' });
26
+ frame.style.height = `${heightOf(context.node.options?.['height'])}px`;
27
+ const none = make('div', { class: 'fd-embed-none' }, words.noDocument);
28
+ const view = make('div', { class: 'fd-embed-view' });
29
+ let shown;
30
+ let address = '';
31
+ const free = () => address.startsWith('blob:') && URL.revokeObjectURL(address);
32
+ return {
33
+ element: make('div', { class: 'fd-embed fd-embed-pdf' }, files.element, view),
34
+ focus: () => files.focus(),
35
+ destroy() {
36
+ free();
37
+ files.destroy?.();
38
+ },
39
+ update(state) {
40
+ files.update(state);
41
+ const file = (Array.isArray(state.value) ? state.value[0] : state.value);
42
+ if (file !== shown) {
43
+ shown = file;
44
+ free();
45
+ address = file ? addressOf(file) : '';
46
+ if (address) {
47
+ frame.title = file?.name ?? context.field.label;
48
+ frame.src = address;
49
+ }
50
+ }
51
+ // While there is none, the file box says what to do; read-only, these words say there is none.
52
+ view.replaceChildren(...(address ? [frame] : state.readonly ? [none] : []));
53
+ },
54
+ };
55
+ };
56
+ export const embedWidget = ({ form, name, field, node, id, document, labels, locale }) => {
57
+ const make = maker(document);
58
+ const words = wordsFor(labels, locale);
59
+ const input = make('input', { id, type: 'url', class: 'fd-input', autocomplete: 'url' });
60
+ if (node.placeholder)
61
+ input.placeholder = node.placeholder;
62
+ input.addEventListener('input', () => form.setValue(name, input.value === '' ? null : input.value));
63
+ // Its own scripts run, as an embedded deck's must; it cannot reach the form, nor leave the frame but for a new tab.
64
+ const frame = make('iframe', { class: 'fd-embed-frame', title: field.label, sandbox: 'allow-scripts allow-same-origin allow-popups allow-presentation', referrerpolicy: 'no-referrer', loading: 'lazy' });
65
+ frame.style.height = `${heightOf(node.options?.['height'])}px`;
66
+ const open = make('a', { class: 'fd-button fd-button-link fd-embed-open', target: '_blank', rel: 'noopener noreferrer', hidden: '' }, words.openInNewTab);
67
+ const view = make('div', { class: 'fd-embed-view' });
68
+ let shown = '';
69
+ return {
70
+ element: make('div', { class: 'fd-embed' }, make('div', { class: 'fd-embed-bar' }, input, open), view),
71
+ focus: () => input.focus(),
72
+ update(state) {
73
+ const text = typeof state.value === 'string' ? state.value.trim() : '';
74
+ if (document.activeElement !== input && input.value !== (typeof state.value === 'string' ? state.value : ''))
75
+ input.value = typeof state.value === 'string' ? state.value : '';
76
+ if (input.readOnly !== state.readonly)
77
+ input.readOnly = state.readonly;
78
+ input.hidden = state.readonly;
79
+ const web = isWeb(text) ? text : '';
80
+ if (web !== shown) {
81
+ shown = web;
82
+ if (web)
83
+ frame.src = web;
84
+ view.replaceChildren(...(web ? [frame] : []));
85
+ }
86
+ open.hidden = !web;
87
+ if (web)
88
+ open.href = web;
89
+ },
90
+ };
91
+ };
92
+ //# sourceMappingURL=embed.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/embed.ts"],"names":[],"mappings":"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"}
package/src/lib/extras.js CHANGED
@@ -88,6 +88,11 @@ const htmlWidget = ({ form, name, node, id, document, labels = labels_1.WIDGET_L
88
88
  area.setAttribute('role', 'textbox');
89
89
  area.setAttribute('aria-multiline', 'true');
90
90
  area.setAttribute('contenteditable', 'true');
91
+ // The page's words in the empty box, drawn by the stylesheet while it can be typed in.
92
+ if (node.placeholder) {
93
+ area.setAttribute('data-placeholder', node.placeholder);
94
+ area.setAttribute('aria-placeholder', node.placeholder);
95
+ }
91
96
  const withToolbar = node.options?.['toolbar'] !== false;
92
97
  let last = '';
93
98
  area.addEventListener('input', () => {
@@ -127,6 +132,7 @@ const htmlWidget = ({ form, name, node, id, document, labels = labels_1.WIDGET_L
127
132
  last = clean;
128
133
  }
129
134
  area.setAttribute('contenteditable', String(!state.readonly));
135
+ area.classList.toggle('fd-blank', !clean.trim());
130
136
  area.setAttribute('aria-readonly', String(state.readonly));
131
137
  area.setAttribute('aria-invalid', String(state.invalid));
132
138
  if (state.describedBy)