@fieldia/widgets 0.11.0 → 0.12.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 (213) 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 +2 -2
  29. package/src/lib/choice-tags.js.map +1 -1
  30. package/src/lib/choice-tags.mjs +2 -2
  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/kind-parts.d.mts +4 -3
  85. package/src/lib/kind-parts.d.ts +4 -3
  86. package/src/lib/kind-parts.js +5 -3
  87. package/src/lib/kind-parts.js.map +1 -1
  88. package/src/lib/kind-parts.mjs +5 -3
  89. package/src/lib/kind-parts.mjs.map +1 -1
  90. package/src/lib/labels.d.mts +37 -0
  91. package/src/lib/labels.d.ts +37 -0
  92. package/src/lib/labels.js +28 -0
  93. package/src/lib/labels.js.map +1 -1
  94. package/src/lib/labels.mjs +28 -0
  95. package/src/lib/labels.mjs.map +1 -1
  96. package/src/lib/lines.d.mts +12 -2
  97. package/src/lib/lines.d.ts +12 -2
  98. package/src/lib/lines.js +251 -15
  99. package/src/lib/lines.js.map +1 -1
  100. package/src/lib/lines.mjs +250 -16
  101. package/src/lib/lines.mjs.map +1 -1
  102. package/src/lib/links-table.d.mts +11 -0
  103. package/src/lib/links-table.d.ts +11 -0
  104. package/src/lib/links-table.js +116 -0
  105. package/src/lib/links-table.js.map +1 -0
  106. package/src/lib/links-table.mjs +112 -0
  107. package/src/lib/links-table.mjs.map +1 -0
  108. package/src/lib/locales/ar.js +28 -0
  109. package/src/lib/locales/ar.js.map +1 -1
  110. package/src/lib/locales/ar.mjs +28 -0
  111. package/src/lib/locales/ar.mjs.map +1 -1
  112. package/src/lib/locales/de.js +28 -0
  113. package/src/lib/locales/de.js.map +1 -1
  114. package/src/lib/locales/de.mjs +28 -0
  115. package/src/lib/locales/de.mjs.map +1 -1
  116. package/src/lib/locales/fr.js +28 -0
  117. package/src/lib/locales/fr.js.map +1 -1
  118. package/src/lib/locales/fr.mjs +28 -0
  119. package/src/lib/locales/fr.mjs.map +1 -1
  120. package/src/lib/payments.d.mts +2 -0
  121. package/src/lib/payments.d.ts +2 -0
  122. package/src/lib/payments.js +94 -0
  123. package/src/lib/payments.js.map +1 -0
  124. package/src/lib/payments.mjs +90 -0
  125. package/src/lib/payments.mjs.map +1 -0
  126. package/src/lib/popup.d.mts +11 -0
  127. package/src/lib/popup.d.ts +11 -0
  128. package/src/lib/popup.js +48 -0
  129. package/src/lib/popup.js.map +1 -0
  130. package/src/lib/popup.mjs +45 -0
  131. package/src/lib/popup.mjs.map +1 -0
  132. package/src/lib/priority.d.mts +10 -0
  133. package/src/lib/priority.d.ts +10 -0
  134. package/src/lib/priority.js +59 -0
  135. package/src/lib/priority.js.map +1 -0
  136. package/src/lib/priority.mjs +55 -0
  137. package/src/lib/priority.mjs.map +1 -0
  138. package/src/lib/progress.js +3 -0
  139. package/src/lib/progress.js.map +1 -1
  140. package/src/lib/progress.mjs +3 -0
  141. package/src/lib/progress.mjs.map +1 -1
  142. package/src/lib/properties.js +100 -9
  143. package/src/lib/properties.js.map +1 -1
  144. package/src/lib/properties.mjs +100 -9
  145. package/src/lib/properties.mjs.map +1 -1
  146. package/src/lib/read-text.d.mts +25 -0
  147. package/src/lib/read-text.d.ts +25 -0
  148. package/src/lib/read-text.js +102 -0
  149. package/src/lib/read-text.js.map +1 -0
  150. package/src/lib/read-text.mjs +98 -0
  151. package/src/lib/read-text.mjs.map +1 -0
  152. package/src/lib/relations.d.mts +12 -0
  153. package/src/lib/relations.d.ts +12 -0
  154. package/src/lib/relations.js +99 -8
  155. package/src/lib/relations.js.map +1 -1
  156. package/src/lib/relations.mjs +97 -8
  157. package/src/lib/relations.mjs.map +1 -1
  158. package/src/lib/slider.js +1 -1
  159. package/src/lib/slider.js.map +1 -1
  160. package/src/lib/slider.mjs +1 -1
  161. package/src/lib/slider.mjs.map +1 -1
  162. package/src/lib/state-dot.d.mts +2 -0
  163. package/src/lib/state-dot.d.ts +2 -0
  164. package/src/lib/state-dot.js +107 -0
  165. package/src/lib/state-dot.js.map +1 -0
  166. package/src/lib/state-dot.mjs +103 -0
  167. package/src/lib/state-dot.mjs.map +1 -0
  168. package/src/lib/statusbar.js +151 -14
  169. package/src/lib/statusbar.js.map +1 -1
  170. package/src/lib/statusbar.mjs +151 -14
  171. package/src/lib/statusbar.mjs.map +1 -1
  172. package/src/lib/styles-business.d.mts +8 -0
  173. package/src/lib/styles-business.d.ts +8 -0
  174. package/src/lib/styles-business.js +120 -0
  175. package/src/lib/styles-business.js.map +1 -0
  176. package/src/lib/styles-business.mjs +117 -0
  177. package/src/lib/styles-business.mjs.map +1 -0
  178. package/src/lib/styles-kinds.d.mts +1 -1
  179. package/src/lib/styles-kinds.d.ts +1 -1
  180. package/src/lib/styles-kinds.js +1 -1
  181. package/src/lib/styles-kinds.mjs +1 -1
  182. package/src/lib/styles-sheet.d.mts +6 -0
  183. package/src/lib/styles-sheet.d.ts +6 -0
  184. package/src/lib/styles-sheet.js +123 -0
  185. package/src/lib/styles-sheet.js.map +1 -0
  186. package/src/lib/styles-sheet.mjs +120 -0
  187. package/src/lib/styles-sheet.mjs.map +1 -0
  188. package/src/lib/styles.js +142 -10
  189. package/src/lib/styles.js.map +1 -1
  190. package/src/lib/styles.mjs +142 -10
  191. package/src/lib/styles.mjs.map +1 -1
  192. package/src/lib/tax-totals.d.mts +2 -0
  193. package/src/lib/tax-totals.d.ts +2 -0
  194. package/src/lib/tax-totals.js +92 -0
  195. package/src/lib/tax-totals.js.map +1 -0
  196. package/src/lib/tax-totals.mjs +88 -0
  197. package/src/lib/tax-totals.mjs.map +1 -0
  198. package/src/lib/timer.d.mts +4 -0
  199. package/src/lib/timer.d.ts +4 -0
  200. package/src/lib/timer.js +62 -0
  201. package/src/lib/timer.js.map +1 -0
  202. package/src/lib/timer.mjs +57 -0
  203. package/src/lib/timer.mjs.map +1 -0
  204. package/src/lib/widgets.d.mts +18 -3
  205. package/src/lib/widgets.d.ts +18 -3
  206. package/src/lib/widgets.js +63 -5
  207. package/src/lib/widgets.js.map +1 -1
  208. package/src/lib/widgets.mjs +63 -5
  209. package/src/lib/widgets.mjs.map +1 -1
  210. package/src/lib/yes-no.js +1 -1
  211. package/src/lib/yes-no.js.map +1 -1
  212. package/src/lib/yes-no.mjs +1 -1
  213. package/src/lib/yes-no.mjs.map +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.js","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/copy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { describeState, maker, setText, wordsFor } from './kind-parts.mjs';
2
+ /**
3
+ * A value with a button that copies it: Flectra's CopyClipboardChar and
4
+ * CopyClipboardText. The value is typed in its box as any text, or read-only;
5
+ * the button, once pressed, says "Copied" for two seconds, to screen readers
6
+ * too. Nothing to copy while it is empty.
7
+ */
8
+ export const copyWidget = ({ form, name, field, node, id, document, labels, locale }) => {
9
+ const make = maker(document);
10
+ const words = wordsFor(labels, locale);
11
+ const long = field.type === 'text';
12
+ const input = long ? make('textarea', { id, class: 'fd-input fd-textarea', rows: '3' }) : make('input', { id, type: 'text', class: 'fd-input', autocomplete: 'off' });
13
+ if (node.placeholder)
14
+ input.placeholder = node.placeholder;
15
+ input.addEventListener('input', () => form.setValue(name, input.value === '' ? null : input.value));
16
+ const button = make('button', { type: 'button', class: 'fd-button fd-copy-button', hidden: '' }, words.copyValue);
17
+ const said = make('span', { class: 'fd-sr-only', role: 'status' });
18
+ let timer;
19
+ button.addEventListener('click', async () => {
20
+ const text = String(form.getState().values[name] ?? '');
21
+ if (!text)
22
+ return;
23
+ try {
24
+ await navigator.clipboard.writeText(text);
25
+ }
26
+ catch {
27
+ // No clipboard to write to (an insecure page): the browser's own copy of the text, selected.
28
+ input.select();
29
+ document.execCommand?.('copy');
30
+ }
31
+ setText(button, words.copied);
32
+ setText(said, words.copied);
33
+ clearTimeout(timer);
34
+ timer = setTimeout(() => {
35
+ setText(button, words.copyValue);
36
+ setText(said, '');
37
+ }, 2000);
38
+ });
39
+ return {
40
+ element: make('span', { class: `fd-copy${long ? ' fd-copy-long' : ''}` }, input, button, said),
41
+ focus: () => input.focus(),
42
+ destroy: () => clearTimeout(timer),
43
+ update(state) {
44
+ const text = state.value === null || state.value === undefined ? '' : String(state.value);
45
+ if (input.value !== text)
46
+ input.value = text;
47
+ if (input.readOnly !== state.readonly)
48
+ input.readOnly = state.readonly;
49
+ button.hidden = !text;
50
+ describeState(input, state);
51
+ },
52
+ };
53
+ };
54
+ //# sourceMappingURL=copy.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/copy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { WidgetFactory } from './widgets.mjs';
2
+ export declare const dateRangeWidget: WidgetFactory;
@@ -0,0 +1,2 @@
1
+ import type { WidgetFactory } from './widgets';
2
+ export declare const dateRangeWidget: WidgetFactory;
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dateRangeWidget = void 0;
4
+ const kind_parts_1 = require("./kind-parts");
5
+ /**
6
+ * A range of dates in one box, from → to: Flectra's widget="daterange". The
7
+ * node's field is the first day, `options.endField` the last; each is typed in
8
+ * its own date box, or the range is picked on a calendar — the first day, then
9
+ * the last, put the right way round if picked the other way. A date and
10
+ * time keeps its hours when its day is picked. The calendar is the ARIA date
11
+ * picker: arrows by day and week, mirrored right to left, PageUp and PageDown
12
+ * by month, Enter to pick, Escape to close.
13
+ */
14
+ const pad = (n) => String(n).padStart(2, '0');
15
+ const addDays = (d, n) => new Date(d.getFullYear(), d.getMonth(), d.getDate() + n);
16
+ const addMonths = (d, n) => new Date(d.getFullYear(), d.getMonth() + n, Math.min(d.getDate(), new Date(d.getFullYear(), d.getMonth() + n + 1, 0).getDate()));
17
+ const sameDay = (a, b) => !!a && !!b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
18
+ const CALENDAR = '<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="2" y="3" width="12" height="11" rx="1.5"></rect><path d="M2 6.5h12M5 1.5v3M11 1.5v3"></path></svg>';
19
+ const dayKey = (d) => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
20
+ const dateRangeWidget = ({ form, name, field, node, id, document, labels, locale = 'en' }) => {
21
+ const make = (0, kind_parts_1.maker)(document);
22
+ const words = (0, kind_parts_1.wordsFor)(labels, locale);
23
+ const kind = field.type === 'datetime' ? 'datetime' : 'date';
24
+ const endName = typeof node.options?.['endField'] === 'string' ? node.options['endField'] : null;
25
+ const endLabel = endName ? (form.page.fields[endName]?.label ?? endName) : '';
26
+ const lang = locale === 'en' ? 'en-GB' : locale;
27
+ const monthName = new Intl.DateTimeFormat(lang, { month: 'long', year: 'numeric', numberingSystem: 'latn' });
28
+ const dayName = new Intl.DateTimeFormat(lang, { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric', numberingSystem: 'latn' });
29
+ const weekday = new Intl.DateTimeFormat(lang, { weekday: 'short' });
30
+ /** A field's value as its box shows it, and the day it falls on. */
31
+ const boxText = (value) => {
32
+ if (typeof value !== 'string' || !value)
33
+ return '';
34
+ if (kind === 'date')
35
+ return value.slice(0, 10);
36
+ const d = new Date(value);
37
+ return Number.isNaN(d.getTime()) ? '' : `${dayKey(d)}T${pad(d.getHours())}:${pad(d.getMinutes())}`;
38
+ };
39
+ const dayOf = (value) => {
40
+ const text = boxText(value);
41
+ const m = /^(\d{4})-(\d{2})-(\d{2})(?:T(\d{2}):(\d{2}))?/.exec(text);
42
+ return m ? new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]), Number(m[4] ?? 0), Number(m[5] ?? 0)) : null;
43
+ };
44
+ /** A day as the field keeps it: a date, or the day at the hours it had. */
45
+ const valueOn = (day, was) => {
46
+ if (kind === 'date')
47
+ return dayKey(day);
48
+ const before = dayOf(was);
49
+ return new Date(day.getFullYear(), day.getMonth(), day.getDate(), before?.getHours() ?? 0, before?.getMinutes() ?? 0).toISOString();
50
+ };
51
+ const box = (fieldName, label, boxId) => {
52
+ const input = make('input', { type: kind === 'date' ? 'date' : 'datetime-local', class: 'fd-input fd-range-input', 'aria-label': label, ...(boxId ? { id: boxId } : {}) });
53
+ input.addEventListener('input', () => {
54
+ if (!input.value)
55
+ return form.setValue(fieldName, null);
56
+ if (kind === 'date')
57
+ return form.setValue(fieldName, input.value);
58
+ const d = new Date(input.value);
59
+ if (!Number.isNaN(d.getTime()))
60
+ form.setValue(fieldName, d.toISOString());
61
+ });
62
+ return input;
63
+ };
64
+ const from = box(name, field.label, id);
65
+ const to = endName ? box(endName, endLabel) : null;
66
+ const button = make('button', { type: 'button', class: 'fd-calendar-button fd-range-button', 'aria-label': words.chooseDate, 'aria-haspopup': 'dialog', 'aria-expanded': 'false', 'aria-controls': `${id}-range` });
67
+ button.innerHTML = CALENDAR; // a constant drawing, never words from the page
68
+ const prev = make('button', { type: 'button', 'aria-label': words.previousMonth }, '‹');
69
+ const next = make('button', { type: 'button', 'aria-label': words.nextMonth }, '›');
70
+ const title = make('span', { class: 'fd-calendar-title', 'aria-live': 'polite' });
71
+ const grid = make('table', { class: 'fd-calendar-grid', role: 'grid' });
72
+ const calendar = make('div', { id: `${id}-range`, class: 'fd-calendar fd-range-calendar', role: 'dialog', hidden: '' }, make('div', { class: 'fd-calendar-head' }, prev, title, next), grid);
73
+ const element = make('div', { class: 'fd-range', role: 'group' }, make('span', { class: 'fd-range-box' }, from, ...(to ? [make('span', { class: 'fd-range-arrow', 'aria-hidden': 'true' }, '→'), to] : [])), button, calendar);
74
+ let focused = new Date();
75
+ /** The first day picked on the calendar, while the last is still to pick. */
76
+ let starting = null;
77
+ let hovered = null;
78
+ function pick(day) {
79
+ const values = form.getState().values;
80
+ if (!endName) {
81
+ form.setValue(name, valueOn(day, values[name]));
82
+ return close();
83
+ }
84
+ if (!starting) {
85
+ starting = day;
86
+ focused = day;
87
+ return draw(true);
88
+ }
89
+ const [first, last] = day < starting ? [day, starting] : [starting, day];
90
+ starting = null;
91
+ // Each as a person's change, so the page's own steps for either run.
92
+ form.setValue(name, valueOn(first, values[name]));
93
+ form.setValue(endName, valueOn(last, values[endName]));
94
+ close();
95
+ }
96
+ function draw(focus) {
97
+ const values = form.getState().values;
98
+ const start = starting ?? dayOf(values[name]);
99
+ const end = starting ? (hovered && hovered >= starting ? hovered : null) : endName ? dayOf(values[endName]) : null;
100
+ const label = monthName.format(focused);
101
+ title.textContent = label;
102
+ calendar.setAttribute('aria-label', label);
103
+ const first = new Date(focused.getFullYear(), focused.getMonth(), 1);
104
+ const monday = addDays(first, -((first.getDay() + 6) % 7));
105
+ const head = make('tr', {}, ...Array.from({ length: 7 }, (_, i) => make('th', { scope: 'col' }, weekday.format(addDays(monday, i)).replace(/\.$/, ''))));
106
+ const body = make('tbody');
107
+ for (let row = monday; row <= new Date(focused.getFullYear(), focused.getMonth() + 1, 0); row = addDays(row, 7)) {
108
+ const tr = make('tr');
109
+ for (let i = 0; i < 7; i++) {
110
+ const d = addDays(row, i);
111
+ const button = make('button', { type: 'button', 'data-day': dayKey(d), 'aria-label': dayName.format(d), tabindex: sameDay(d, focused) ? '0' : '-1' }, String(d.getDate()));
112
+ if (d.getMonth() !== focused.getMonth())
113
+ button.classList.add('fd-outside');
114
+ const edge = sameDay(d, start) || sameDay(d, end);
115
+ if (edge)
116
+ button.setAttribute('aria-selected', 'true');
117
+ if (start && end && d > start && d < end && !edge)
118
+ button.classList.add('fd-in-range');
119
+ if (sameDay(d, new Date()))
120
+ button.setAttribute('aria-current', 'date');
121
+ button.addEventListener('click', () => pick(d));
122
+ button.addEventListener('pointerenter', () => {
123
+ if (!starting)
124
+ return;
125
+ hovered = d;
126
+ for (const other of grid.querySelectorAll('button[data-day]')) {
127
+ const at = dayOf(other.dataset['day']);
128
+ other.classList.toggle('fd-in-range', !!at && at > starting && at < d);
129
+ }
130
+ });
131
+ button.addEventListener('keydown', (event) => onKey(event, d));
132
+ tr.append(make('td', {}, button));
133
+ }
134
+ body.append(tr);
135
+ }
136
+ grid.replaceChildren(make('thead', {}, head), body);
137
+ if (focus)
138
+ grid.querySelector('button[tabindex="0"]')?.focus();
139
+ }
140
+ function onKey(event, day) {
141
+ const rtl = (0, kind_parts_1.rightToLeft)(element);
142
+ const moves = {
143
+ ArrowLeft: () => addDays(day, rtl ? 1 : -1),
144
+ ArrowRight: () => addDays(day, rtl ? -1 : 1),
145
+ ArrowUp: () => addDays(day, -7),
146
+ ArrowDown: () => addDays(day, 7),
147
+ PageUp: () => addMonths(day, -1),
148
+ PageDown: () => addMonths(day, 1),
149
+ Home: () => addDays(day, -((day.getDay() + 6) % 7)),
150
+ End: () => addDays(day, 6 - ((day.getDay() + 6) % 7)),
151
+ };
152
+ if (moves[event.key]) {
153
+ event.preventDefault();
154
+ focused = moves[event.key]();
155
+ if (starting)
156
+ hovered = focused;
157
+ draw(true);
158
+ }
159
+ else if (event.key === 'Enter' || event.key === ' ') {
160
+ event.preventDefault();
161
+ pick(day);
162
+ }
163
+ }
164
+ function open() {
165
+ starting = null;
166
+ hovered = null;
167
+ focused = dayOf(form.getState().values[name]) ?? new Date();
168
+ calendar.hidden = false;
169
+ button.setAttribute('aria-expanded', 'true');
170
+ draw(true);
171
+ }
172
+ function close() {
173
+ if (calendar.hidden)
174
+ return;
175
+ calendar.hidden = true;
176
+ starting = null;
177
+ button.setAttribute('aria-expanded', 'false');
178
+ button.focus();
179
+ }
180
+ button.addEventListener('click', () => (calendar.hidden ? open() : close()));
181
+ prev.addEventListener('click', () => ((focused = addMonths(focused, -1)), draw(false)));
182
+ next.addEventListener('click', () => ((focused = addMonths(focused, 1)), draw(false)));
183
+ calendar.addEventListener('keydown', (event) => {
184
+ if (event.key !== 'Escape')
185
+ return;
186
+ event.preventDefault();
187
+ event.stopPropagation();
188
+ close();
189
+ });
190
+ const outside = (event) => {
191
+ if (calendar.hidden || element.contains(event.target))
192
+ return;
193
+ calendar.hidden = true;
194
+ starting = null;
195
+ button.setAttribute('aria-expanded', 'false');
196
+ };
197
+ document.addEventListener('mousedown', outside);
198
+ return {
199
+ element,
200
+ focus: () => from.focus(),
201
+ destroy: () => document.removeEventListener('mousedown', outside),
202
+ update(state) {
203
+ for (const [input, value] of [[from, state.value], ...(to && endName ? [[to, state.values[endName]]] : [])]) {
204
+ const text = boxText(value);
205
+ if (document.activeElement !== input && input.value !== text)
206
+ input.value = text;
207
+ if (input.readOnly !== state.readonly)
208
+ input.readOnly = state.readonly;
209
+ input.classList.toggle('fd-blank', !text);
210
+ }
211
+ button.hidden = state.readonly;
212
+ if (state.readonly)
213
+ calendar.hidden = true;
214
+ (0, kind_parts_1.setAttr)(element, 'aria-labelledby', null);
215
+ (0, kind_parts_1.describeState)(from, state);
216
+ },
217
+ };
218
+ };
219
+ exports.dateRangeWidget = dateRangeWidget;
220
+ //# sourceMappingURL=date-range.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-range.js","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/date-range.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,216 @@
1
+ import { describeState, maker, rightToLeft, setAttr, wordsFor } from './kind-parts.mjs';
2
+ /**
3
+ * A range of dates in one box, from → to: Flectra's widget="daterange". The
4
+ * node's field is the first day, `options.endField` the last; each is typed in
5
+ * its own date box, or the range is picked on a calendar — the first day, then
6
+ * the last, put the right way round if picked the other way. A date and
7
+ * time keeps its hours when its day is picked. The calendar is the ARIA date
8
+ * picker: arrows by day and week, mirrored right to left, PageUp and PageDown
9
+ * by month, Enter to pick, Escape to close.
10
+ */
11
+ const pad = (n) => String(n).padStart(2, '0');
12
+ const addDays = (d, n) => new Date(d.getFullYear(), d.getMonth(), d.getDate() + n);
13
+ const addMonths = (d, n) => new Date(d.getFullYear(), d.getMonth() + n, Math.min(d.getDate(), new Date(d.getFullYear(), d.getMonth() + n + 1, 0).getDate()));
14
+ const sameDay = (a, b) => !!a && !!b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
15
+ const CALENDAR = '<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="2" y="3" width="12" height="11" rx="1.5"></rect><path d="M2 6.5h12M5 1.5v3M11 1.5v3"></path></svg>';
16
+ const dayKey = (d) => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
17
+ export const dateRangeWidget = ({ form, name, field, node, id, document, labels, locale = 'en' }) => {
18
+ const make = maker(document);
19
+ const words = wordsFor(labels, locale);
20
+ const kind = field.type === 'datetime' ? 'datetime' : 'date';
21
+ const endName = typeof node.options?.['endField'] === 'string' ? node.options['endField'] : null;
22
+ const endLabel = endName ? (form.page.fields[endName]?.label ?? endName) : '';
23
+ const lang = locale === 'en' ? 'en-GB' : locale;
24
+ const monthName = new Intl.DateTimeFormat(lang, { month: 'long', year: 'numeric', numberingSystem: 'latn' });
25
+ const dayName = new Intl.DateTimeFormat(lang, { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric', numberingSystem: 'latn' });
26
+ const weekday = new Intl.DateTimeFormat(lang, { weekday: 'short' });
27
+ /** A field's value as its box shows it, and the day it falls on. */
28
+ const boxText = (value) => {
29
+ if (typeof value !== 'string' || !value)
30
+ return '';
31
+ if (kind === 'date')
32
+ return value.slice(0, 10);
33
+ const d = new Date(value);
34
+ return Number.isNaN(d.getTime()) ? '' : `${dayKey(d)}T${pad(d.getHours())}:${pad(d.getMinutes())}`;
35
+ };
36
+ const dayOf = (value) => {
37
+ const text = boxText(value);
38
+ const m = /^(\d{4})-(\d{2})-(\d{2})(?:T(\d{2}):(\d{2}))?/.exec(text);
39
+ return m ? new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]), Number(m[4] ?? 0), Number(m[5] ?? 0)) : null;
40
+ };
41
+ /** A day as the field keeps it: a date, or the day at the hours it had. */
42
+ const valueOn = (day, was) => {
43
+ if (kind === 'date')
44
+ return dayKey(day);
45
+ const before = dayOf(was);
46
+ return new Date(day.getFullYear(), day.getMonth(), day.getDate(), before?.getHours() ?? 0, before?.getMinutes() ?? 0).toISOString();
47
+ };
48
+ const box = (fieldName, label, boxId) => {
49
+ const input = make('input', { type: kind === 'date' ? 'date' : 'datetime-local', class: 'fd-input fd-range-input', 'aria-label': label, ...(boxId ? { id: boxId } : {}) });
50
+ input.addEventListener('input', () => {
51
+ if (!input.value)
52
+ return form.setValue(fieldName, null);
53
+ if (kind === 'date')
54
+ return form.setValue(fieldName, input.value);
55
+ const d = new Date(input.value);
56
+ if (!Number.isNaN(d.getTime()))
57
+ form.setValue(fieldName, d.toISOString());
58
+ });
59
+ return input;
60
+ };
61
+ const from = box(name, field.label, id);
62
+ const to = endName ? box(endName, endLabel) : null;
63
+ const button = make('button', { type: 'button', class: 'fd-calendar-button fd-range-button', 'aria-label': words.chooseDate, 'aria-haspopup': 'dialog', 'aria-expanded': 'false', 'aria-controls': `${id}-range` });
64
+ button.innerHTML = CALENDAR; // a constant drawing, never words from the page
65
+ const prev = make('button', { type: 'button', 'aria-label': words.previousMonth }, '‹');
66
+ const next = make('button', { type: 'button', 'aria-label': words.nextMonth }, '›');
67
+ const title = make('span', { class: 'fd-calendar-title', 'aria-live': 'polite' });
68
+ const grid = make('table', { class: 'fd-calendar-grid', role: 'grid' });
69
+ const calendar = make('div', { id: `${id}-range`, class: 'fd-calendar fd-range-calendar', role: 'dialog', hidden: '' }, make('div', { class: 'fd-calendar-head' }, prev, title, next), grid);
70
+ const element = make('div', { class: 'fd-range', role: 'group' }, make('span', { class: 'fd-range-box' }, from, ...(to ? [make('span', { class: 'fd-range-arrow', 'aria-hidden': 'true' }, '→'), to] : [])), button, calendar);
71
+ let focused = new Date();
72
+ /** The first day picked on the calendar, while the last is still to pick. */
73
+ let starting = null;
74
+ let hovered = null;
75
+ function pick(day) {
76
+ const values = form.getState().values;
77
+ if (!endName) {
78
+ form.setValue(name, valueOn(day, values[name]));
79
+ return close();
80
+ }
81
+ if (!starting) {
82
+ starting = day;
83
+ focused = day;
84
+ return draw(true);
85
+ }
86
+ const [first, last] = day < starting ? [day, starting] : [starting, day];
87
+ starting = null;
88
+ // Each as a person's change, so the page's own steps for either run.
89
+ form.setValue(name, valueOn(first, values[name]));
90
+ form.setValue(endName, valueOn(last, values[endName]));
91
+ close();
92
+ }
93
+ function draw(focus) {
94
+ const values = form.getState().values;
95
+ const start = starting ?? dayOf(values[name]);
96
+ const end = starting ? (hovered && hovered >= starting ? hovered : null) : endName ? dayOf(values[endName]) : null;
97
+ const label = monthName.format(focused);
98
+ title.textContent = label;
99
+ calendar.setAttribute('aria-label', label);
100
+ const first = new Date(focused.getFullYear(), focused.getMonth(), 1);
101
+ const monday = addDays(first, -((first.getDay() + 6) % 7));
102
+ const head = make('tr', {}, ...Array.from({ length: 7 }, (_, i) => make('th', { scope: 'col' }, weekday.format(addDays(monday, i)).replace(/\.$/, ''))));
103
+ const body = make('tbody');
104
+ for (let row = monday; row <= new Date(focused.getFullYear(), focused.getMonth() + 1, 0); row = addDays(row, 7)) {
105
+ const tr = make('tr');
106
+ for (let i = 0; i < 7; i++) {
107
+ const d = addDays(row, i);
108
+ const button = make('button', { type: 'button', 'data-day': dayKey(d), 'aria-label': dayName.format(d), tabindex: sameDay(d, focused) ? '0' : '-1' }, String(d.getDate()));
109
+ if (d.getMonth() !== focused.getMonth())
110
+ button.classList.add('fd-outside');
111
+ const edge = sameDay(d, start) || sameDay(d, end);
112
+ if (edge)
113
+ button.setAttribute('aria-selected', 'true');
114
+ if (start && end && d > start && d < end && !edge)
115
+ button.classList.add('fd-in-range');
116
+ if (sameDay(d, new Date()))
117
+ button.setAttribute('aria-current', 'date');
118
+ button.addEventListener('click', () => pick(d));
119
+ button.addEventListener('pointerenter', () => {
120
+ if (!starting)
121
+ return;
122
+ hovered = d;
123
+ for (const other of grid.querySelectorAll('button[data-day]')) {
124
+ const at = dayOf(other.dataset['day']);
125
+ other.classList.toggle('fd-in-range', !!at && at > starting && at < d);
126
+ }
127
+ });
128
+ button.addEventListener('keydown', (event) => onKey(event, d));
129
+ tr.append(make('td', {}, button));
130
+ }
131
+ body.append(tr);
132
+ }
133
+ grid.replaceChildren(make('thead', {}, head), body);
134
+ if (focus)
135
+ grid.querySelector('button[tabindex="0"]')?.focus();
136
+ }
137
+ function onKey(event, day) {
138
+ const rtl = rightToLeft(element);
139
+ const moves = {
140
+ ArrowLeft: () => addDays(day, rtl ? 1 : -1),
141
+ ArrowRight: () => addDays(day, rtl ? -1 : 1),
142
+ ArrowUp: () => addDays(day, -7),
143
+ ArrowDown: () => addDays(day, 7),
144
+ PageUp: () => addMonths(day, -1),
145
+ PageDown: () => addMonths(day, 1),
146
+ Home: () => addDays(day, -((day.getDay() + 6) % 7)),
147
+ End: () => addDays(day, 6 - ((day.getDay() + 6) % 7)),
148
+ };
149
+ if (moves[event.key]) {
150
+ event.preventDefault();
151
+ focused = moves[event.key]();
152
+ if (starting)
153
+ hovered = focused;
154
+ draw(true);
155
+ }
156
+ else if (event.key === 'Enter' || event.key === ' ') {
157
+ event.preventDefault();
158
+ pick(day);
159
+ }
160
+ }
161
+ function open() {
162
+ starting = null;
163
+ hovered = null;
164
+ focused = dayOf(form.getState().values[name]) ?? new Date();
165
+ calendar.hidden = false;
166
+ button.setAttribute('aria-expanded', 'true');
167
+ draw(true);
168
+ }
169
+ function close() {
170
+ if (calendar.hidden)
171
+ return;
172
+ calendar.hidden = true;
173
+ starting = null;
174
+ button.setAttribute('aria-expanded', 'false');
175
+ button.focus();
176
+ }
177
+ button.addEventListener('click', () => (calendar.hidden ? open() : close()));
178
+ prev.addEventListener('click', () => ((focused = addMonths(focused, -1)), draw(false)));
179
+ next.addEventListener('click', () => ((focused = addMonths(focused, 1)), draw(false)));
180
+ calendar.addEventListener('keydown', (event) => {
181
+ if (event.key !== 'Escape')
182
+ return;
183
+ event.preventDefault();
184
+ event.stopPropagation();
185
+ close();
186
+ });
187
+ const outside = (event) => {
188
+ if (calendar.hidden || element.contains(event.target))
189
+ return;
190
+ calendar.hidden = true;
191
+ starting = null;
192
+ button.setAttribute('aria-expanded', 'false');
193
+ };
194
+ document.addEventListener('mousedown', outside);
195
+ return {
196
+ element,
197
+ focus: () => from.focus(),
198
+ destroy: () => document.removeEventListener('mousedown', outside),
199
+ update(state) {
200
+ for (const [input, value] of [[from, state.value], ...(to && endName ? [[to, state.values[endName]]] : [])]) {
201
+ const text = boxText(value);
202
+ if (document.activeElement !== input && input.value !== text)
203
+ input.value = text;
204
+ if (input.readOnly !== state.readonly)
205
+ input.readOnly = state.readonly;
206
+ input.classList.toggle('fd-blank', !text);
207
+ }
208
+ button.hidden = state.readonly;
209
+ if (state.readonly)
210
+ calendar.hidden = true;
211
+ setAttr(element, 'aria-labelledby', null);
212
+ describeState(from, state);
213
+ },
214
+ };
215
+ };
216
+ //# sourceMappingURL=date-range.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-range.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/date-range.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,30 @@
1
1
  import type { LineField, Locale, Value } from '@fieldia/core';
2
+ /**
3
+ * The currency a money field is in: its own, or the field holding it — on a
4
+ * line, `parent.` and a field of the record it is on (`parent`). A link by its
5
+ * name ("EGP"), a choice or text as it is; null when none is known.
6
+ */
7
+ export declare function currencyOf(def: LineField, values: Readonly<Record<string, Value>>, parent?: Readonly<Record<string, Value>>): string | null;
2
8
  /**
3
9
  * A value as a person reads it where it is not being edited: a cell of the
4
10
  * lines grid, a totals row. Shared by the plain lines table and @fieldia/grid.
11
+ * `parent` is the record a line is on, for money in its currency.
12
+ */
13
+ export declare function displayValue(def: LineField, value: Value | undefined, values?: Record<string, Value>, locale?: Locale, parent?: Readonly<Record<string, Value>>): string;
14
+ /** How a value is shown where it is not edited: by the widget it is drawn with (a cell's, a field's), and its options. */
15
+ export interface ShownWith {
16
+ widget?: string;
17
+ options?: Readonly<Record<string, unknown>>;
18
+ }
19
+ /**
20
+ * A value as words in the widget it is shown with — hours as HH:MM
21
+ * (`duration`), a fraction as a per cent (`percentage`) — else as its type
22
+ * says it (`displayValue`). For a table's cells and totals, plain and grid.
23
+ */
24
+ export declare function cellText(def: LineField, value: Value | undefined, values?: Record<string, Value>, locale?: Locale, parent?: Readonly<Record<string, Value>>, shown?: ShownWith): string;
25
+ /**
26
+ * The widgets a cell is drawn with rather than typed into: a bar, stars, a
27
+ * state's dot, a colour, a pill. A grid shows them in the cell itself, used
28
+ * there with a click; the rest are typed into as the field's own box.
5
29
  */
6
- export declare function displayValue(def: LineField, value: Value | undefined, values?: Record<string, Value>, locale?: Locale): string;
30
+ export declare const DRAWN_IN_CELLS: ReadonlySet<string>;
@@ -1,6 +1,30 @@
1
1
  import type { LineField, Locale, Value } from '@fieldia/core';
2
+ /**
3
+ * The currency a money field is in: its own, or the field holding it — on a
4
+ * line, `parent.` and a field of the record it is on (`parent`). A link by its
5
+ * name ("EGP"), a choice or text as it is; null when none is known.
6
+ */
7
+ export declare function currencyOf(def: LineField, values: Readonly<Record<string, Value>>, parent?: Readonly<Record<string, Value>>): string | null;
2
8
  /**
3
9
  * A value as a person reads it where it is not being edited: a cell of the
4
10
  * lines grid, a totals row. Shared by the plain lines table and @fieldia/grid.
11
+ * `parent` is the record a line is on, for money in its currency.
12
+ */
13
+ export declare function displayValue(def: LineField, value: Value | undefined, values?: Record<string, Value>, locale?: Locale, parent?: Readonly<Record<string, Value>>): string;
14
+ /** How a value is shown where it is not edited: by the widget it is drawn with (a cell's, a field's), and its options. */
15
+ export interface ShownWith {
16
+ widget?: string;
17
+ options?: Readonly<Record<string, unknown>>;
18
+ }
19
+ /**
20
+ * A value as words in the widget it is shown with — hours as HH:MM
21
+ * (`duration`), a fraction as a per cent (`percentage`) — else as its type
22
+ * says it (`displayValue`). For a table's cells and totals, plain and grid.
23
+ */
24
+ export declare function cellText(def: LineField, value: Value | undefined, values?: Record<string, Value>, locale?: Locale, parent?: Readonly<Record<string, Value>>, shown?: ShownWith): string;
25
+ /**
26
+ * The widgets a cell is drawn with rather than typed into: a bar, stars, a
27
+ * state's dot, a colour, a pill. A grid shows them in the cell itself, used
28
+ * there with a click; the rest are typed into as the field's own box.
5
29
  */
6
- export declare function displayValue(def: LineField, value: Value | undefined, values?: Record<string, Value>, locale?: Locale): string;
30
+ export declare const DRAWN_IN_CELLS: ReadonlySet<string>;