@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,112 @@
1
+ import { formatBytes } from '@fieldia/core';
2
+ import { WIDGET_LABELS } from './labels.mjs';
3
+ /**
4
+ * File and image fields. A chosen or dropped file is read into the value as
5
+ * base64, the way a backend's binary fields carry it; a stored one may carry
6
+ * a `url` instead. Size and type limits are checked by the field's validation.
7
+ */
8
+ function read(file) {
9
+ return new Promise((resolve, reject) => {
10
+ const reader = new FileReader();
11
+ reader.onload = () => {
12
+ const url = String(reader.result ?? '');
13
+ resolve({ name: file.name, type: file.type, size: file.size, data: url.slice(url.indexOf(',') + 1) });
14
+ };
15
+ reader.onerror = () => reject(reader.error);
16
+ reader.readAsDataURL(file);
17
+ });
18
+ }
19
+ function fileWidget(kind) {
20
+ return ({ form, name, field, id, document, labels = WIDGET_LABELS.en }) => {
21
+ const element = document.createElement('div');
22
+ element.className = `fd-file fd-file-${kind}`;
23
+ const input = document.createElement('input');
24
+ input.type = 'file';
25
+ input.id = id;
26
+ input.className = 'fd-sr-only';
27
+ const accept = field.type === 'binary' ? field.accept : kind === 'image' ? ['image/*'] : undefined;
28
+ if (accept)
29
+ input.accept = accept.join(',');
30
+ const preview = document.createElement('img');
31
+ preview.className = 'fd-image-preview';
32
+ preview.alt = field.label;
33
+ preview.hidden = true;
34
+ const pick = document.createElement('label');
35
+ pick.className = kind === 'image' ? 'fd-file-pick fd-image-pick' : 'fd-file-pick';
36
+ pick.htmlFor = id;
37
+ const pickText = document.createElement('span');
38
+ pickText.className = 'fd-button';
39
+ pickText.textContent = kind === 'image' ? labels.uploadImage : labels.upload;
40
+ const hint = document.createElement('span');
41
+ hint.className = 'fd-help';
42
+ hint.textContent = labels.dropHere;
43
+ pick.append(pickText, hint);
44
+ const chosen = document.createElement('div');
45
+ chosen.className = 'fd-file-chosen';
46
+ const fileName = document.createElement('span');
47
+ fileName.className = 'fd-file-name';
48
+ const replace = document.createElement('button');
49
+ replace.type = 'button';
50
+ replace.className = 'fd-button fd-button-link';
51
+ replace.textContent = labels.replace;
52
+ replace.addEventListener('click', () => input.click());
53
+ const remove = document.createElement('button');
54
+ remove.type = 'button';
55
+ remove.className = 'fd-button fd-button-link';
56
+ remove.textContent = labels.removeFile;
57
+ remove.addEventListener('click', () => form.setValue(name, null));
58
+ chosen.append(fileName, replace, remove);
59
+ element.append(input, ...(kind === 'image' ? [preview] : []), pick, chosen);
60
+ let readonly = false;
61
+ const take = async (file) => {
62
+ if (!file || readonly)
63
+ return;
64
+ form.setValue(name, await read(file));
65
+ };
66
+ input.addEventListener('change', () => {
67
+ void take(input.files?.[0]);
68
+ input.value = '';
69
+ });
70
+ element.addEventListener('dragover', (event) => {
71
+ if (readonly)
72
+ return;
73
+ event.preventDefault();
74
+ element.classList.add('fd-dragging');
75
+ });
76
+ element.addEventListener('dragleave', () => element.classList.remove('fd-dragging'));
77
+ element.addEventListener('drop', (event) => {
78
+ event.preventDefault();
79
+ element.classList.remove('fd-dragging');
80
+ void take(event.dataTransfer?.files?.[0]);
81
+ });
82
+ return {
83
+ element,
84
+ focus: () => (pick.hidden ? replace : input).focus(),
85
+ update(state) {
86
+ readonly = state.readonly;
87
+ const file = state.value;
88
+ pick.hidden = !!file || readonly;
89
+ chosen.hidden = !file;
90
+ replace.hidden = remove.hidden = readonly;
91
+ input.disabled = readonly;
92
+ input.setAttribute('aria-invalid', String(state.invalid));
93
+ if (state.describedBy)
94
+ input.setAttribute('aria-describedby', state.describedBy);
95
+ fileName.textContent = file ? `${file.name} · ${formatBytes(file.size)}` : '';
96
+ if (kind === 'image') {
97
+ const src = file ? (file.data ? `data:${file.type};base64,${file.data}` : file.url ?? '') : '';
98
+ preview.hidden = !src;
99
+ if (preview.getAttribute('src') !== src) {
100
+ if (src)
101
+ preview.src = src;
102
+ else
103
+ preview.removeAttribute('src');
104
+ }
105
+ }
106
+ },
107
+ };
108
+ };
109
+ }
110
+ export const binaryWidget = fileWidget('binary');
111
+ export const imageWidget = fileWidget('image');
112
+ //# sourceMappingURL=files.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Locale } from '@fieldia/core';
2
+ /** Every word a widget shows on its own. `{label}` and `{name}` are filled in. */
3
+ export interface WidgetLabels {
4
+ search: string;
5
+ noResults: string;
6
+ remove: string;
7
+ clear: string;
8
+ addLine: string;
9
+ deleteLine: string;
10
+ upload: string;
11
+ uploadImage: string;
12
+ replace: string;
13
+ removeFile: string;
14
+ dropHere: string;
15
+ invalidJson: string;
16
+ }
17
+ export declare const WIDGET_LABELS: Record<Locale, WidgetLabels>;
@@ -0,0 +1,17 @@
1
+ import type { Locale } from '@fieldia/core';
2
+ /** Every word a widget shows on its own. `{label}` and `{name}` are filled in. */
3
+ export interface WidgetLabels {
4
+ search: string;
5
+ noResults: string;
6
+ remove: string;
7
+ clear: string;
8
+ addLine: string;
9
+ deleteLine: string;
10
+ upload: string;
11
+ uploadImage: string;
12
+ replace: string;
13
+ removeFile: string;
14
+ dropHere: string;
15
+ invalidJson: string;
16
+ }
17
+ export declare const WIDGET_LABELS: Record<Locale, WidgetLabels>;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WIDGET_LABELS = void 0;
4
+ exports.WIDGET_LABELS = {
5
+ en: {
6
+ search: 'Search…',
7
+ noResults: 'No results',
8
+ remove: 'Remove {name}',
9
+ clear: 'Clear {label}',
10
+ addLine: 'Add a line',
11
+ deleteLine: 'Delete line',
12
+ upload: 'Upload a file',
13
+ uploadImage: 'Add a photo',
14
+ replace: 'Replace',
15
+ removeFile: 'Remove',
16
+ dropHere: 'or drop it here',
17
+ invalidJson: 'Not valid JSON',
18
+ },
19
+ ar: {
20
+ search: 'بحث…',
21
+ noResults: 'لا توجد نتائج',
22
+ remove: 'إزالة {name}',
23
+ clear: 'مسح {label}',
24
+ addLine: 'إضافة سطر',
25
+ deleteLine: 'حذف السطر',
26
+ upload: 'رفع ملف',
27
+ uploadImage: 'إضافة صورة',
28
+ replace: 'استبدال',
29
+ removeFile: 'إزالة',
30
+ dropHere: 'أو أفلته هنا',
31
+ invalidJson: 'ليس JSON صالحًا',
32
+ },
33
+ de: {
34
+ search: 'Suchen…',
35
+ noResults: 'Keine Ergebnisse',
36
+ remove: '{name} entfernen',
37
+ clear: '{label} leeren',
38
+ addLine: 'Zeile hinzufügen',
39
+ deleteLine: 'Zeile löschen',
40
+ upload: 'Datei hochladen',
41
+ uploadImage: 'Foto hinzufügen',
42
+ replace: 'Ersetzen',
43
+ removeFile: 'Entfernen',
44
+ dropHere: 'oder hier ablegen',
45
+ invalidJson: 'Kein gültiges JSON',
46
+ },
47
+ fr: {
48
+ search: 'Rechercher…',
49
+ noResults: 'Aucun résultat',
50
+ remove: 'Retirer {name}',
51
+ clear: 'Effacer {label}',
52
+ addLine: 'Ajouter une ligne',
53
+ deleteLine: 'Supprimer la ligne',
54
+ upload: 'Téléverser un fichier',
55
+ uploadImage: 'Ajouter une photo',
56
+ replace: 'Remplacer',
57
+ removeFile: 'Retirer',
58
+ dropHere: 'ou déposez-le ici',
59
+ invalidJson: 'JSON invalide',
60
+ },
61
+ };
62
+ //# sourceMappingURL=labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.js","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/labels.ts"],"names":[],"mappings":";;;AAkBa,QAAA,aAAa,GAAiC;IACzD,EAAE,EAAE;QACF,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,YAAY;QACvB,MAAM,EAAE,eAAe;QACvB,KAAK,EAAE,eAAe;QACtB,OAAO,EAAE,YAAY;QACrB,UAAU,EAAE,aAAa;QACzB,MAAM,EAAE,eAAe;QACvB,WAAW,EAAE,aAAa;QAC1B,OAAO,EAAE,SAAS;QAClB,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,iBAAiB;QAC3B,WAAW,EAAE,gBAAgB;KAC9B;IACD,EAAE,EAAE;QACF,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,eAAe;QAC1B,MAAM,EAAE,cAAc;QACtB,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,WAAW;QACpB,UAAU,EAAE,WAAW;QACvB,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,YAAY;QACzB,OAAO,EAAE,SAAS;QAClB,UAAU,EAAE,OAAO;QACnB,QAAQ,EAAE,cAAc;QACxB,WAAW,EAAE,iBAAiB;KAC/B;IACD,EAAE,EAAE;QACF,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,kBAAkB;QAC7B,MAAM,EAAE,kBAAkB;QAC1B,KAAK,EAAE,gBAAgB;QACvB,OAAO,EAAE,kBAAkB;QAC3B,UAAU,EAAE,eAAe;QAC3B,MAAM,EAAE,iBAAiB;QACzB,WAAW,EAAE,iBAAiB;QAC9B,OAAO,EAAE,UAAU;QACnB,UAAU,EAAE,WAAW;QACvB,QAAQ,EAAE,mBAAmB;QAC7B,WAAW,EAAE,oBAAoB;KAClC;IACD,EAAE,EAAE;QACF,MAAM,EAAE,aAAa;QACrB,SAAS,EAAE,gBAAgB;QAC3B,MAAM,EAAE,gBAAgB;QACxB,KAAK,EAAE,iBAAiB;QACxB,OAAO,EAAE,mBAAmB;QAC5B,UAAU,EAAE,oBAAoB;QAChC,MAAM,EAAE,uBAAuB;QAC/B,WAAW,EAAE,mBAAmB;QAChC,OAAO,EAAE,WAAW;QACpB,UAAU,EAAE,SAAS;QACrB,QAAQ,EAAE,mBAAmB;QAC7B,WAAW,EAAE,eAAe;KAC7B;CACF,CAAC"}
@@ -0,0 +1,59 @@
1
+ export const WIDGET_LABELS = {
2
+ en: {
3
+ search: 'Search…',
4
+ noResults: 'No results',
5
+ remove: 'Remove {name}',
6
+ clear: 'Clear {label}',
7
+ addLine: 'Add a line',
8
+ deleteLine: 'Delete line',
9
+ upload: 'Upload a file',
10
+ uploadImage: 'Add a photo',
11
+ replace: 'Replace',
12
+ removeFile: 'Remove',
13
+ dropHere: 'or drop it here',
14
+ invalidJson: 'Not valid JSON',
15
+ },
16
+ ar: {
17
+ search: 'بحث…',
18
+ noResults: 'لا توجد نتائج',
19
+ remove: 'إزالة {name}',
20
+ clear: 'مسح {label}',
21
+ addLine: 'إضافة سطر',
22
+ deleteLine: 'حذف السطر',
23
+ upload: 'رفع ملف',
24
+ uploadImage: 'إضافة صورة',
25
+ replace: 'استبدال',
26
+ removeFile: 'إزالة',
27
+ dropHere: 'أو أفلته هنا',
28
+ invalidJson: 'ليس JSON صالحًا',
29
+ },
30
+ de: {
31
+ search: 'Suchen…',
32
+ noResults: 'Keine Ergebnisse',
33
+ remove: '{name} entfernen',
34
+ clear: '{label} leeren',
35
+ addLine: 'Zeile hinzufügen',
36
+ deleteLine: 'Zeile löschen',
37
+ upload: 'Datei hochladen',
38
+ uploadImage: 'Foto hinzufügen',
39
+ replace: 'Ersetzen',
40
+ removeFile: 'Entfernen',
41
+ dropHere: 'oder hier ablegen',
42
+ invalidJson: 'Kein gültiges JSON',
43
+ },
44
+ fr: {
45
+ search: 'Rechercher…',
46
+ noResults: 'Aucun résultat',
47
+ remove: 'Retirer {name}',
48
+ clear: 'Effacer {label}',
49
+ addLine: 'Ajouter une ligne',
50
+ deleteLine: 'Supprimer la ligne',
51
+ upload: 'Téléverser un fichier',
52
+ uploadImage: 'Ajouter une photo',
53
+ replace: 'Remplacer',
54
+ removeFile: 'Retirer',
55
+ dropHere: 'ou déposez-le ici',
56
+ invalidJson: 'JSON invalide',
57
+ },
58
+ };
59
+ //# sourceMappingURL=labels.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/labels.ts"],"names":[],"mappings":"AAkBA,MAAM,CAAC,MAAM,aAAa,GAAiC;IACzD,EAAE,EAAE;QACF,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,YAAY;QACvB,MAAM,EAAE,eAAe;QACvB,KAAK,EAAE,eAAe;QACtB,OAAO,EAAE,YAAY;QACrB,UAAU,EAAE,aAAa;QACzB,MAAM,EAAE,eAAe;QACvB,WAAW,EAAE,aAAa;QAC1B,OAAO,EAAE,SAAS;QAClB,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,iBAAiB;QAC3B,WAAW,EAAE,gBAAgB;KAC9B;IACD,EAAE,EAAE;QACF,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,eAAe;QAC1B,MAAM,EAAE,cAAc;QACtB,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,WAAW;QACpB,UAAU,EAAE,WAAW;QACvB,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,YAAY;QACzB,OAAO,EAAE,SAAS;QAClB,UAAU,EAAE,OAAO;QACnB,QAAQ,EAAE,cAAc;QACxB,WAAW,EAAE,iBAAiB;KAC/B;IACD,EAAE,EAAE;QACF,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,kBAAkB;QAC7B,MAAM,EAAE,kBAAkB;QAC1B,KAAK,EAAE,gBAAgB;QACvB,OAAO,EAAE,kBAAkB;QAC3B,UAAU,EAAE,eAAe;QAC3B,MAAM,EAAE,iBAAiB;QACzB,WAAW,EAAE,iBAAiB;QAC9B,OAAO,EAAE,UAAU;QACnB,UAAU,EAAE,WAAW;QACvB,QAAQ,EAAE,mBAAmB;QAC7B,WAAW,EAAE,oBAAoB;KAClC;IACD,EAAE,EAAE;QACF,MAAM,EAAE,aAAa;QACrB,SAAS,EAAE,gBAAgB;QAC3B,MAAM,EAAE,gBAAgB;QACxB,KAAK,EAAE,iBAAiB;QACxB,OAAO,EAAE,mBAAmB;QAC5B,UAAU,EAAE,oBAAoB;QAChC,MAAM,EAAE,uBAAuB;QAC/B,WAAW,EAAE,mBAAmB;QAChC,OAAO,EAAE,WAAW;QACpB,UAAU,EAAE,SAAS;QACrB,QAAQ,EAAE,mBAAmB;QAC7B,WAAW,EAAE,eAAe;KAC7B;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type WidgetFactory } from './widgets.mjs';
2
+ export declare const linesWidget: WidgetFactory;
@@ -0,0 +1,2 @@
1
+ import { type WidgetFactory } from './widgets';
2
+ export declare const linesWidget: WidgetFactory;
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.linesWidget = void 0;
4
+ const labels_1 = require("./labels");
5
+ const widgets_1 = require("./widgets");
6
+ /** The form a cell sees: the line's values, written back into the line. */
7
+ function lineForm(form, field, key) {
8
+ const values = () => ((form.getState().values[field] ?? []).find((l) => l.key === key)?.values ?? {});
9
+ return {
10
+ ...form,
11
+ getState: () => ({ ...form.getState(), values: values() }),
12
+ setValue: (name, value) => form.updateLine(field, key, name, value),
13
+ search: (name, query, limit) => form.searchLine(field, key, name, query, limit),
14
+ };
15
+ }
16
+ const linesWidget = ({ form, name, field, node, id, document, labels = labels_1.WIDGET_LABELS.en }) => {
17
+ const def = field;
18
+ const columns = (node.columns ?? Object.keys(def.fields)).filter((column) => def.fields[column]);
19
+ const element = document.createElement('div');
20
+ element.className = 'fd-lines';
21
+ element.id = id;
22
+ element.setAttribute('role', 'group');
23
+ const scroller = document.createElement('div');
24
+ scroller.className = 'fd-lines-scroll';
25
+ const table = document.createElement('table');
26
+ table.className = 'fd-lines-table';
27
+ const head = document.createElement('thead');
28
+ const headRow = document.createElement('tr');
29
+ for (const column of columns) {
30
+ const th = document.createElement('th');
31
+ th.scope = 'col';
32
+ th.textContent = def.fields[column].label;
33
+ headRow.append(th);
34
+ }
35
+ const lastTh = document.createElement('th');
36
+ lastTh.className = 'fd-lines-tools';
37
+ headRow.append(lastTh);
38
+ head.append(headRow);
39
+ const body = document.createElement('tbody');
40
+ table.append(head, body);
41
+ scroller.append(table);
42
+ const add = document.createElement('button');
43
+ add.type = 'button';
44
+ add.className = 'fd-button fd-button-link fd-lines-add';
45
+ add.textContent = `+ ${labels.addLine}`;
46
+ element.append(scroller, add);
47
+ const rows = new Map();
48
+ let focusNew = null;
49
+ let readonly = false;
50
+ add.addEventListener('click', () => {
51
+ focusNew = form.addLine(name);
52
+ const row = rows.get(focusNew);
53
+ if (row) {
54
+ row.cells[0]?.widget.focus();
55
+ focusNew = null;
56
+ }
57
+ });
58
+ function makeRow(line) {
59
+ const tr = document.createElement('tr');
60
+ tr.dataset['line'] = line.key;
61
+ const adapter = lineForm(form, name, line.key);
62
+ const cells = columns.map((column) => {
63
+ const sub = def.fields[column];
64
+ const cellId = `${id}-${line.key}-${column}`;
65
+ const subNode = { type: 'field', id: `${node.id}.${line.key}.${column}`, field: column };
66
+ const widget = (0, widgets_1.createWidget)({ form: adapter, name: column, field: sub, node: subNode, id: cellId, document, labels });
67
+ const td = document.createElement('td');
68
+ const label = document.createElement('label');
69
+ label.className = 'fd-sr-only';
70
+ label.htmlFor = cellId;
71
+ label.textContent = sub.label;
72
+ const error = document.createElement('div');
73
+ error.className = 'fd-cell-error';
74
+ error.hidden = true;
75
+ td.append(label, widget.element, error);
76
+ tr.append(td);
77
+ return { name: column, def: sub, widget, error };
78
+ });
79
+ const tools = document.createElement('td');
80
+ tools.className = 'fd-lines-tools';
81
+ const remove = document.createElement('button');
82
+ remove.type = 'button';
83
+ remove.className = 'fd-line-delete';
84
+ remove.textContent = '×';
85
+ remove.setAttribute('aria-label', labels.deleteLine);
86
+ remove.addEventListener('click', () => form.removeLine(name, line.key));
87
+ tools.append(remove);
88
+ tr.append(tools);
89
+ return { element: tr, cells, remove };
90
+ }
91
+ return {
92
+ element,
93
+ focus: () => (body.querySelector('input, select, textarea') ?? add).focus(),
94
+ update(state) {
95
+ readonly = state.readonly;
96
+ add.hidden = readonly;
97
+ const current = state.value ?? [];
98
+ const errors = form.getState().errors;
99
+ const keep = new Set(current.map((line) => line.key));
100
+ for (const [key, row] of rows) {
101
+ if (!keep.has(key)) {
102
+ row.element.remove();
103
+ rows.delete(key);
104
+ }
105
+ }
106
+ current.forEach((line, index) => {
107
+ let row = rows.get(line.key);
108
+ if (!row) {
109
+ row = makeRow(line);
110
+ rows.set(line.key, row);
111
+ }
112
+ if (body.children[index] !== row.element)
113
+ body.insertBefore(row.element, body.children[index] ?? null);
114
+ row.remove.hidden = readonly;
115
+ if (readonly)
116
+ row.remove.remove();
117
+ else if (!row.remove.isConnected)
118
+ row.element.lastElementChild?.append(row.remove);
119
+ for (const cell of row.cells) {
120
+ const message = errors[`${name}.${line.key}.${cell.name}`];
121
+ cell.error.hidden = !message;
122
+ cell.error.textContent = message ?? '';
123
+ cell.widget.update({
124
+ value: line.values[cell.name],
125
+ values: line.values,
126
+ readonly: readonly || cell.def.readonly === true,
127
+ required: cell.def.required === true,
128
+ invalid: !!message,
129
+ });
130
+ }
131
+ });
132
+ if (focusNew && rows.has(focusNew)) {
133
+ rows.get(focusNew)?.cells[0]?.widget.focus();
134
+ focusNew = null;
135
+ }
136
+ },
137
+ };
138
+ };
139
+ exports.linesWidget = linesWidget;
140
+ //# sourceMappingURL=lines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lines.js","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/lines.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ import { WIDGET_LABELS } from './labels.mjs';
2
+ import { createWidget } from './widgets.mjs';
3
+ /** The form a cell sees: the line's values, written back into the line. */
4
+ function lineForm(form, field, key) {
5
+ const values = () => ((form.getState().values[field] ?? []).find((l) => l.key === key)?.values ?? {});
6
+ return {
7
+ ...form,
8
+ getState: () => ({ ...form.getState(), values: values() }),
9
+ setValue: (name, value) => form.updateLine(field, key, name, value),
10
+ search: (name, query, limit) => form.searchLine(field, key, name, query, limit),
11
+ };
12
+ }
13
+ export const linesWidget = ({ form, name, field, node, id, document, labels = WIDGET_LABELS.en }) => {
14
+ const def = field;
15
+ const columns = (node.columns ?? Object.keys(def.fields)).filter((column) => def.fields[column]);
16
+ const element = document.createElement('div');
17
+ element.className = 'fd-lines';
18
+ element.id = id;
19
+ element.setAttribute('role', 'group');
20
+ const scroller = document.createElement('div');
21
+ scroller.className = 'fd-lines-scroll';
22
+ const table = document.createElement('table');
23
+ table.className = 'fd-lines-table';
24
+ const head = document.createElement('thead');
25
+ const headRow = document.createElement('tr');
26
+ for (const column of columns) {
27
+ const th = document.createElement('th');
28
+ th.scope = 'col';
29
+ th.textContent = def.fields[column].label;
30
+ headRow.append(th);
31
+ }
32
+ const lastTh = document.createElement('th');
33
+ lastTh.className = 'fd-lines-tools';
34
+ headRow.append(lastTh);
35
+ head.append(headRow);
36
+ const body = document.createElement('tbody');
37
+ table.append(head, body);
38
+ scroller.append(table);
39
+ const add = document.createElement('button');
40
+ add.type = 'button';
41
+ add.className = 'fd-button fd-button-link fd-lines-add';
42
+ add.textContent = `+ ${labels.addLine}`;
43
+ element.append(scroller, add);
44
+ const rows = new Map();
45
+ let focusNew = null;
46
+ let readonly = false;
47
+ add.addEventListener('click', () => {
48
+ focusNew = form.addLine(name);
49
+ const row = rows.get(focusNew);
50
+ if (row) {
51
+ row.cells[0]?.widget.focus();
52
+ focusNew = null;
53
+ }
54
+ });
55
+ function makeRow(line) {
56
+ const tr = document.createElement('tr');
57
+ tr.dataset['line'] = line.key;
58
+ const adapter = lineForm(form, name, line.key);
59
+ const cells = columns.map((column) => {
60
+ const sub = def.fields[column];
61
+ const cellId = `${id}-${line.key}-${column}`;
62
+ const subNode = { type: 'field', id: `${node.id}.${line.key}.${column}`, field: column };
63
+ const widget = createWidget({ form: adapter, name: column, field: sub, node: subNode, id: cellId, document, labels });
64
+ const td = document.createElement('td');
65
+ const label = document.createElement('label');
66
+ label.className = 'fd-sr-only';
67
+ label.htmlFor = cellId;
68
+ label.textContent = sub.label;
69
+ const error = document.createElement('div');
70
+ error.className = 'fd-cell-error';
71
+ error.hidden = true;
72
+ td.append(label, widget.element, error);
73
+ tr.append(td);
74
+ return { name: column, def: sub, widget, error };
75
+ });
76
+ const tools = document.createElement('td');
77
+ tools.className = 'fd-lines-tools';
78
+ const remove = document.createElement('button');
79
+ remove.type = 'button';
80
+ remove.className = 'fd-line-delete';
81
+ remove.textContent = '×';
82
+ remove.setAttribute('aria-label', labels.deleteLine);
83
+ remove.addEventListener('click', () => form.removeLine(name, line.key));
84
+ tools.append(remove);
85
+ tr.append(tools);
86
+ return { element: tr, cells, remove };
87
+ }
88
+ return {
89
+ element,
90
+ focus: () => (body.querySelector('input, select, textarea') ?? add).focus(),
91
+ update(state) {
92
+ readonly = state.readonly;
93
+ add.hidden = readonly;
94
+ const current = state.value ?? [];
95
+ const errors = form.getState().errors;
96
+ const keep = new Set(current.map((line) => line.key));
97
+ for (const [key, row] of rows) {
98
+ if (!keep.has(key)) {
99
+ row.element.remove();
100
+ rows.delete(key);
101
+ }
102
+ }
103
+ current.forEach((line, index) => {
104
+ let row = rows.get(line.key);
105
+ if (!row) {
106
+ row = makeRow(line);
107
+ rows.set(line.key, row);
108
+ }
109
+ if (body.children[index] !== row.element)
110
+ body.insertBefore(row.element, body.children[index] ?? null);
111
+ row.remove.hidden = readonly;
112
+ if (readonly)
113
+ row.remove.remove();
114
+ else if (!row.remove.isConnected)
115
+ row.element.lastElementChild?.append(row.remove);
116
+ for (const cell of row.cells) {
117
+ const message = errors[`${name}.${line.key}.${cell.name}`];
118
+ cell.error.hidden = !message;
119
+ cell.error.textContent = message ?? '';
120
+ cell.widget.update({
121
+ value: line.values[cell.name],
122
+ values: line.values,
123
+ readonly: readonly || cell.def.readonly === true,
124
+ required: cell.def.required === true,
125
+ invalid: !!message,
126
+ });
127
+ }
128
+ });
129
+ if (focusNew && rows.has(focusNew)) {
130
+ rows.get(focusNew)?.cells[0]?.widget.focus();
131
+ focusNew = null;
132
+ }
133
+ },
134
+ };
135
+ };
136
+ //# sourceMappingURL=lines.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lines.mjs","sourceRoot":"","sources":["../../../../../libs/widgets/src/lib/lines.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAmC,MAAM,WAAW,CAAC;AAe1E,2EAA2E;AAC3E,SAAS,QAAQ,CAAC,IAAU,EAAE,KAAa,EAAE,GAAW;IACtD,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,KAAK,CAAmB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;IACzH,OAAO;QACL,GAAG,IAAI;QACP,QAAQ,EAAE,GAAc,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;QACrE,QAAQ,EAAE,CAAC,IAAY,EAAE,KAAY,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC;QAClF,MAAM,EAAE,CAAC,IAAY,EAAE,KAAa,EAAE,KAAc,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC;KACzG,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAkB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE;IACjH,MAAM,GAAG,GAAG,KAA6C,CAAC;IAC1D,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACjG,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,CAAC,SAAS,GAAG,UAAU,CAAC;IAC/B,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC/C,QAAQ,CAAC,SAAS,GAAG,iBAAiB,CAAC;IACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,SAAS,GAAG,gBAAgB,CAAC;IACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACxC,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC;QACjB,EAAE,CAAC,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC;QAC1C,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACrB,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,CAAC,SAAS,GAAG,gBAAgB,CAAC;IACpC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC7C,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC7C,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC;IACpB,GAAG,CAAC,SAAS,GAAG,uCAAuC,CAAC;IACxD,GAAG,CAAC,WAAW,GAAG,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAE9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAe,CAAC;IACpC,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;QACjC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,IAAI,GAAG,EAAE,CAAC;YACR,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YAC7B,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,SAAS,OAAO,CAAC,IAAU;QACzB,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACxC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;QAC9B,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACnC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,GAAG,EAAE,IAAI,IAAI,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAc,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,IAAI,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;YACpG,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAY,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/H,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC9C,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC;YAC/B,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YACvB,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC;YAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC5C,KAAK,CAAC,SAAS,GAAG,eAAe,CAAC;YAClC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;YACpB,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACxC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACd,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACnD,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3C,KAAK,CAAC,SAAS,GAAG,gBAAgB,CAAC;QACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;QACvB,MAAM,CAAC,SAAS,GAAG,gBAAgB,CAAC;QACpC,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC;QACzB,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACxE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACxC,CAAC;IAED,OAAO;QACL,OAAO;QACP,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAc,yBAAyB,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE;QACxF,MAAM,CAAC,KAAK;YACV,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YAC1B,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC;YACtB,MAAM,OAAO,GAAI,KAAK,CAAC,KAAuB,IAAI,EAAE,CAAC;YACrD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC;YACtC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACtD,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;gBAC9B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnB,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;oBACrB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;YACD,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAC9B,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC7B,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;oBACpB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC1B,CAAC;gBACD,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,OAAO;oBAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;gBACvG,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC;gBAC7B,IAAI,QAAQ;oBAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;qBAC7B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW;oBAAE,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACnF,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;oBAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC3D,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC;oBAC7B,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,OAAO,IAAI,EAAE,CAAC;oBACvC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;wBACjB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;wBAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,QAAQ,EAAE,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,IAAI;wBAChD,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,IAAI;wBACpC,OAAO,EAAE,CAAC,CAAC,OAAO;qBACnB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CAAC;YACH,IAAI,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC7C,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { WidgetFactory } from './widgets.mjs';
2
+ export declare const many2oneWidget: WidgetFactory;
3
+ export declare const tagsWidget: WidgetFactory;
4
+ /** Every record as a checkbox. For short lists: it loads up to 50. */
5
+ export declare const linkCheckboxesWidget: WidgetFactory;
6
+ export declare const referenceWidget: WidgetFactory;
@@ -0,0 +1,6 @@
1
+ import type { WidgetFactory } from './widgets';
2
+ export declare const many2oneWidget: WidgetFactory;
3
+ export declare const tagsWidget: WidgetFactory;
4
+ /** Every record as a checkbox. For short lists: it loads up to 50. */
5
+ export declare const linkCheckboxesWidget: WidgetFactory;
6
+ export declare const referenceWidget: WidgetFactory;