@fieldia/widgets 0.0.0-stage → 0.1.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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +19 -2
  3. package/package.json +35 -3
  4. package/src/index.d.mts +7 -0
  5. package/src/index.d.ts +7 -0
  6. package/src/index.js +11 -0
  7. package/src/index.js.map +1 -0
  8. package/src/index.mjs +8 -0
  9. package/src/index.mjs.map +1 -0
  10. package/src/lib/extras.d.mts +5 -0
  11. package/src/lib/extras.d.ts +5 -0
  12. package/src/lib/extras.js +130 -0
  13. package/src/lib/extras.js.map +1 -0
  14. package/src/lib/extras.mjs +124 -0
  15. package/src/lib/extras.mjs.map +1 -0
  16. package/src/lib/files.d.mts +3 -0
  17. package/src/lib/files.d.ts +3 -0
  18. package/src/lib/files.js +115 -0
  19. package/src/lib/files.js.map +1 -0
  20. package/src/lib/files.mjs +112 -0
  21. package/src/lib/files.mjs.map +1 -0
  22. package/src/lib/labels.d.mts +17 -0
  23. package/src/lib/labels.d.ts +17 -0
  24. package/src/lib/labels.js +62 -0
  25. package/src/lib/labels.js.map +1 -0
  26. package/src/lib/labels.mjs +59 -0
  27. package/src/lib/labels.mjs.map +1 -0
  28. package/src/lib/lines.d.mts +2 -0
  29. package/src/lib/lines.d.ts +2 -0
  30. package/src/lib/lines.js +140 -0
  31. package/src/lib/lines.js.map +1 -0
  32. package/src/lib/lines.mjs +136 -0
  33. package/src/lib/lines.mjs.map +1 -0
  34. package/src/lib/relations.d.mts +6 -0
  35. package/src/lib/relations.d.ts +6 -0
  36. package/src/lib/relations.js +362 -0
  37. package/src/lib/relations.js.map +1 -0
  38. package/src/lib/relations.mjs +355 -0
  39. package/src/lib/relations.mjs.map +1 -0
  40. package/src/lib/styles.d.mts +16 -0
  41. package/src/lib/styles.d.ts +16 -0
  42. package/src/lib/styles.js +394 -0
  43. package/src/lib/styles.js.map +1 -0
  44. package/src/lib/styles.mjs +390 -0
  45. package/src/lib/styles.mjs.map +1 -0
  46. package/src/lib/widgets.d.mts +44 -0
  47. package/src/lib/widgets.d.ts +44 -0
  48. package/src/lib/widgets.js +356 -0
  49. package/src/lib/widgets.js.map +1 -0
  50. package/src/lib/widgets.mjs +351 -0
  51. package/src/lib/widgets.mjs.map +1 -0
@@ -0,0 +1,351 @@
1
+ import { linkCheckboxesWidget, many2oneWidget, referenceWidget, tagsWidget } from './relations.mjs';
2
+ import { linesWidget } from './lines.mjs';
3
+ import { binaryWidget, imageWidget } from './files.mjs';
4
+ import { htmlWidget, jsonWidget } from './extras.mjs';
5
+ /**
6
+ * Pick the widget for a field: the app's or the built-in one for
7
+ * `type.widget` (such as `selection.radio`), then for the type alone. A type
8
+ * with no editor yet shows its value read-only.
9
+ */
10
+ export function createWidget(context, registry = {}) {
11
+ const { field, node } = context;
12
+ const keys = [
13
+ node.widget ? `${field.type}.${node.widget}` : null,
14
+ field.type === 'selection' && field.multiple ? 'selection.checkboxes' : null,
15
+ field.type,
16
+ ].filter((key) => key !== null);
17
+ for (const key of keys) {
18
+ const factory = registry[key] ?? builtInWidgets[key];
19
+ if (factory)
20
+ return factory(context);
21
+ }
22
+ return pendingWidget(context);
23
+ }
24
+ // ---------------------------------------------------------------------------
25
+ function make(doc, tag, props = {}, ...children) {
26
+ const element = doc.createElement(tag);
27
+ for (const [name, value] of Object.entries(props))
28
+ if (value !== undefined)
29
+ element.setAttribute(name, value);
30
+ element.append(...children);
31
+ return element;
32
+ }
33
+ function describe(element, state) {
34
+ element.setAttribute('aria-invalid', String(state.invalid));
35
+ element.setAttribute('aria-required', String(state.required));
36
+ if (state.describedBy)
37
+ element.setAttribute('aria-describedby', state.describedBy);
38
+ else
39
+ element.removeAttribute('aria-describedby');
40
+ }
41
+ const textOf = (value) => (value === null || value === undefined ? '' : String(value));
42
+ function textWidget(inputType) {
43
+ return ({ form, name, field, node, id, document }) => {
44
+ const input = make(document, 'input', { id, type: inputType, class: 'fd-input', autocomplete: 'off' });
45
+ if (field.type === 'char' && field.size !== undefined)
46
+ input.maxLength = field.size;
47
+ if (node.placeholder)
48
+ input.placeholder = node.placeholder;
49
+ input.addEventListener('input', () => form.setValue(name, input.value === '' ? null : input.value));
50
+ return {
51
+ element: input,
52
+ focus: () => input.focus(),
53
+ update(state) {
54
+ const text = textOf(state.value);
55
+ if (input.value !== text)
56
+ input.value = text;
57
+ input.readOnly = state.readonly;
58
+ describe(input, state);
59
+ },
60
+ };
61
+ };
62
+ }
63
+ const textareaWidget = ({ form, name, field, node, id, document }) => {
64
+ const area = make(document, 'textarea', { id, class: 'fd-input fd-textarea', rows: '3' });
65
+ if (field.type === 'text' && field.size !== undefined)
66
+ area.maxLength = field.size;
67
+ if (node.placeholder)
68
+ area.placeholder = node.placeholder;
69
+ area.addEventListener('input', () => form.setValue(name, area.value === '' ? null : area.value));
70
+ return {
71
+ element: area,
72
+ focus: () => area.focus(),
73
+ update(state) {
74
+ const text = textOf(state.value);
75
+ if (area.value !== text)
76
+ area.value = text;
77
+ area.readOnly = state.readonly;
78
+ describe(area, state);
79
+ },
80
+ };
81
+ };
82
+ const NUMBER = /^-?(\d+\.?\d*|\.\d+)$/;
83
+ const UNFINISHED = /^-?\.?$/;
84
+ /** Numbers stay as typed while focused: "1." means 1 now and 1.5 a keystroke later. */
85
+ const numberWidget = (context) => {
86
+ const { form, name, field, node, id, document } = context;
87
+ const integer = field.type === 'integer';
88
+ const input = make(document, 'input', { id, type: 'text', class: 'fd-input fd-number-input', autocomplete: 'off' });
89
+ input.inputMode = integer ? 'numeric' : 'decimal';
90
+ if (node.placeholder)
91
+ input.placeholder = node.placeholder;
92
+ const parse = (raw) => {
93
+ const text = raw.trim();
94
+ if (text === '')
95
+ return null;
96
+ if (NUMBER.test(text))
97
+ return Number(text);
98
+ if (UNFINISHED.test(text))
99
+ return undefined; // "-" or ".": keep typing
100
+ return text; // not a number: validation names it
101
+ };
102
+ input.addEventListener('input', () => {
103
+ const value = parse(input.value);
104
+ if (value !== undefined)
105
+ form.setValue(name, value);
106
+ });
107
+ input.addEventListener('blur', () => {
108
+ input.value = textOf(form.getState().values[name]);
109
+ });
110
+ const currency = field.type === 'monetary' ? make(document, 'span', { class: 'fd-currency', 'aria-hidden': 'true' }) : null;
111
+ const element = currency ? make(document, 'span', { class: 'fd-number' }, currency, input) : input;
112
+ return {
113
+ element,
114
+ focus: () => input.focus(),
115
+ update(state) {
116
+ const typing = document.activeElement === input;
117
+ const parsed = parse(input.value);
118
+ const showsSame = parsed === undefined || parsed === state.value;
119
+ if (!(typing && showsSame)) {
120
+ const text = textOf(state.value);
121
+ if (input.value !== text)
122
+ input.value = text;
123
+ }
124
+ input.readOnly = state.readonly;
125
+ describe(input, state);
126
+ if (currency && field.type === 'monetary') {
127
+ const holder = field.currencyField ? state.values[field.currencyField] : null;
128
+ currency.textContent =
129
+ holder && typeof holder === 'object' && 'label' in holder ? holder.label : (typeof holder === 'string' ? holder : field.currency ?? '');
130
+ }
131
+ },
132
+ };
133
+ };
134
+ function checkboxWidget(role) {
135
+ return ({ form, name, id, document }) => {
136
+ const box = make(document, 'input', { id, type: 'checkbox', class: role ? 'fd-switch' : 'fd-checkbox', role });
137
+ box.addEventListener('change', () => form.setValue(name, box.checked));
138
+ return {
139
+ element: box,
140
+ focus: () => box.focus(),
141
+ update(state) {
142
+ box.checked = state.value === true;
143
+ box.disabled = state.readonly;
144
+ describe(box, state);
145
+ },
146
+ };
147
+ };
148
+ }
149
+ function options(field) {
150
+ return field.type === 'selection' ? field.options : [];
151
+ }
152
+ const selectWidget = ({ form, name, field, id, document }) => {
153
+ const choices = options(field);
154
+ const select = make(document, 'select', { id, class: 'fd-input fd-select' }, make(document, 'option', { value: '' }));
155
+ choices.forEach((option, i) => select.append(make(document, 'option', { value: String(i) }, option.label)));
156
+ select.addEventListener('change', () => form.setValue(name, select.value === '' ? null : choices[Number(select.value)].value));
157
+ return {
158
+ element: select,
159
+ focus: () => select.focus(),
160
+ update(state) {
161
+ const index = choices.findIndex((option) => option.value === state.value);
162
+ select.value = index === -1 ? '' : String(index);
163
+ select.disabled = state.readonly;
164
+ describe(select, state);
165
+ },
166
+ };
167
+ };
168
+ function choiceGroup(kind) {
169
+ return ({ form, name, field, id, document }) => {
170
+ const choices = options(field);
171
+ const group = make(document, 'div', { id, class: `fd-choices fd-choices-${kind}`, role: kind === 'radio' ? 'radiogroup' : 'group' });
172
+ const inputs = choices.map((option, i) => {
173
+ const input = make(document, 'input', { type: kind, name: id, value: String(i), id: `${id}-${i}` });
174
+ group.append(make(document, 'label', { class: 'fd-choice', for: `${id}-${i}` }, input, make(document, 'span', {}, option.label)));
175
+ return input;
176
+ });
177
+ group.addEventListener('change', () => {
178
+ if (kind === 'radio') {
179
+ const chosen = inputs.findIndex((input) => input.checked);
180
+ form.setValue(name, chosen === -1 ? null : choices[chosen].value);
181
+ }
182
+ else {
183
+ form.setValue(name, choices.filter((_, i) => inputs[i].checked).map((option) => option.value));
184
+ }
185
+ });
186
+ return {
187
+ element: group,
188
+ focus: () => (inputs.find((input) => input.checked) ?? inputs[0])?.focus(),
189
+ update(state) {
190
+ const chosen = Array.isArray(state.value) ? state.value : [state.value];
191
+ inputs.forEach((input, i) => {
192
+ input.checked = chosen.includes(choices[i].value);
193
+ input.disabled = state.readonly;
194
+ });
195
+ describe(group, state);
196
+ },
197
+ };
198
+ };
199
+ }
200
+ /** Stars or numbers to pick from, as a radio group with arrow-key support. */
201
+ function pointsWidget(style) {
202
+ return ({ form, name, field, id, document }) => {
203
+ const min = 'min' in field && field.min !== undefined ? field.min : style === 'rating' ? 1 : 0;
204
+ const max = 'max' in field && field.max !== undefined ? field.max : style === 'rating' ? 5 : 10;
205
+ const group = make(document, 'div', { id, class: `fd-points fd-${style}`, role: 'radiogroup' });
206
+ const points = [];
207
+ for (let n = min; n <= max; n++) {
208
+ const point = make(document, 'button', { type: 'button', role: 'radio', 'aria-label': `${n} of ${max}`, 'data-value': String(n) }, style === 'rating' ? '★' : String(n));
209
+ if (style === 'scale')
210
+ point.removeAttribute('aria-label');
211
+ point.addEventListener('click', () => form.setValue(name, n));
212
+ points.push(point);
213
+ group.append(point);
214
+ }
215
+ group.addEventListener('keydown', (event) => {
216
+ const current = form.getState().values[name];
217
+ const value = typeof current === 'number' ? current : min - 1;
218
+ const step = event.key === 'ArrowRight' || event.key === 'ArrowUp' ? 1 : event.key === 'ArrowLeft' || event.key === 'ArrowDown' ? -1 : 0;
219
+ if (!step)
220
+ return;
221
+ event.preventDefault();
222
+ const next = Math.min(max, Math.max(min, value + step));
223
+ form.setValue(name, next);
224
+ points[next - min]?.focus();
225
+ });
226
+ return {
227
+ element: group,
228
+ focus: () => (points.find((p) => p.getAttribute('aria-checked') === 'true') ?? points[0])?.focus(),
229
+ update(state) {
230
+ const value = typeof state.value === 'number' ? state.value : null;
231
+ points.forEach((point, i) => {
232
+ const n = min + i;
233
+ point.setAttribute('aria-checked', String(n === value));
234
+ point.classList.toggle('fd-on', style === 'rating' ? value !== null && n <= value : n === value);
235
+ point.tabIndex = n === value || (value === null && i === 0) ? 0 : -1;
236
+ point.disabled = state.readonly;
237
+ });
238
+ describe(group, state);
239
+ },
240
+ };
241
+ };
242
+ }
243
+ const dateWidget = ({ form, name, id, document }) => {
244
+ const input = make(document, 'input', { id, type: 'date', class: 'fd-input fd-date' });
245
+ input.addEventListener('input', () => form.setValue(name, input.value || null));
246
+ return {
247
+ element: input,
248
+ focus: () => input.focus(),
249
+ update(state) {
250
+ const text = textOf(state.value);
251
+ if (input.value !== text)
252
+ input.value = text;
253
+ input.readOnly = state.readonly;
254
+ describe(input, state);
255
+ },
256
+ };
257
+ };
258
+ const pad = (n) => String(n).padStart(2, '0');
259
+ /** Shown in local time, stored as an ISO instant in UTC. */
260
+ const dateTimeWidget = ({ form, name, id, document }) => {
261
+ const input = make(document, 'input', { id, type: 'datetime-local', class: 'fd-input fd-datetime' });
262
+ const local = (iso) => {
263
+ if (typeof iso !== 'string' || !iso)
264
+ return '';
265
+ const d = new Date(iso);
266
+ return Number.isNaN(d.getTime()) ? '' : `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`;
267
+ };
268
+ input.addEventListener('input', () => {
269
+ if (!input.value)
270
+ return form.setValue(name, null);
271
+ const d = new Date(input.value);
272
+ if (!Number.isNaN(d.getTime()))
273
+ form.setValue(name, d.toISOString());
274
+ });
275
+ return {
276
+ element: input,
277
+ focus: () => input.focus(),
278
+ update(state) {
279
+ const text = local(state.value);
280
+ if (input.value !== text)
281
+ input.value = text;
282
+ input.readOnly = state.readonly;
283
+ describe(input, state);
284
+ },
285
+ };
286
+ };
287
+ /** Until a type has its own editor (Phase 5), show what it holds. */
288
+ function pendingWidget({ field, id, document }) {
289
+ const span = make(document, 'span', { id, class: 'fd-pending', 'data-fd-pending': field.type });
290
+ return {
291
+ element: span,
292
+ focus: () => undefined,
293
+ update(state) {
294
+ span.textContent = summary(state.value, field);
295
+ },
296
+ };
297
+ }
298
+ export function summary(value, field) {
299
+ if (value === null || value === undefined)
300
+ return '';
301
+ switch (field.type) {
302
+ case 'many2one':
303
+ case 'reference':
304
+ return value.label;
305
+ case 'many2many':
306
+ return value.map((record) => record.label).join(', ');
307
+ case 'one2many': {
308
+ const count = value.length;
309
+ return `${count} ${count === 1 ? 'line' : 'lines'}`;
310
+ }
311
+ case 'binary':
312
+ case 'image':
313
+ return value.name;
314
+ case 'html':
315
+ return String(value).replace(/<[^>]*>/g, ' ').replace(/\s+/g, ' ').trim();
316
+ default:
317
+ return typeof value === 'object' ? JSON.stringify(value) : String(value);
318
+ }
319
+ }
320
+ export const builtInWidgets = {
321
+ char: textWidget('text'),
322
+ 'char.email': textWidget('email'),
323
+ 'char.phone': textWidget('tel'),
324
+ 'char.url': textWidget('url'),
325
+ 'char.password': textWidget('password'),
326
+ text: textareaWidget,
327
+ integer: numberWidget,
328
+ float: numberWidget,
329
+ monetary: numberWidget,
330
+ 'integer.rating': pointsWidget('rating'),
331
+ 'integer.scale': pointsWidget('scale'),
332
+ boolean: checkboxWidget(),
333
+ 'boolean.toggle': checkboxWidget('switch'),
334
+ selection: selectWidget,
335
+ 'selection.radio': choiceGroup('radio'),
336
+ 'selection.checkboxes': choiceGroup('checkbox'),
337
+ date: dateWidget,
338
+ datetime: dateTimeWidget,
339
+ many2one: many2oneWidget,
340
+ many2many: tagsWidget,
341
+ 'many2many.tags': tagsWidget,
342
+ 'many2many.checkboxes': linkCheckboxesWidget,
343
+ reference: referenceWidget,
344
+ one2many: linesWidget,
345
+ binary: binaryWidget,
346
+ image: imageWidget,
347
+ html: htmlWidget,
348
+ json: jsonWidget,
349
+ properties: jsonWidget,
350
+ };
351
+ //# sourceMappingURL=widgets.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widgets.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/widgets.ts"],"names":[],"mappings":"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"}