@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.
- package/LICENSE +21 -0
- package/README.md +19 -2
- package/package.json +35 -3
- package/src/index.d.mts +7 -0
- package/src/index.d.ts +7 -0
- package/src/index.js +11 -0
- package/src/index.js.map +1 -0
- package/src/index.mjs +8 -0
- package/src/index.mjs.map +1 -0
- package/src/lib/extras.d.mts +5 -0
- package/src/lib/extras.d.ts +5 -0
- package/src/lib/extras.js +130 -0
- package/src/lib/extras.js.map +1 -0
- package/src/lib/extras.mjs +124 -0
- package/src/lib/extras.mjs.map +1 -0
- package/src/lib/files.d.mts +3 -0
- package/src/lib/files.d.ts +3 -0
- package/src/lib/files.js +115 -0
- package/src/lib/files.js.map +1 -0
- package/src/lib/files.mjs +112 -0
- package/src/lib/files.mjs.map +1 -0
- package/src/lib/labels.d.mts +17 -0
- package/src/lib/labels.d.ts +17 -0
- package/src/lib/labels.js +62 -0
- package/src/lib/labels.js.map +1 -0
- package/src/lib/labels.mjs +59 -0
- package/src/lib/labels.mjs.map +1 -0
- package/src/lib/lines.d.mts +2 -0
- package/src/lib/lines.d.ts +2 -0
- package/src/lib/lines.js +140 -0
- package/src/lib/lines.js.map +1 -0
- package/src/lib/lines.mjs +136 -0
- package/src/lib/lines.mjs.map +1 -0
- package/src/lib/relations.d.mts +6 -0
- package/src/lib/relations.d.ts +6 -0
- package/src/lib/relations.js +362 -0
- package/src/lib/relations.js.map +1 -0
- package/src/lib/relations.mjs +355 -0
- package/src/lib/relations.mjs.map +1 -0
- package/src/lib/styles.d.mts +16 -0
- package/src/lib/styles.d.ts +16 -0
- package/src/lib/styles.js +394 -0
- package/src/lib/styles.js.map +1 -0
- package/src/lib/styles.mjs +390 -0
- package/src/lib/styles.mjs.map +1 -0
- package/src/lib/widgets.d.mts +44 -0
- package/src/lib/widgets.d.ts +44 -0
- package/src/lib/widgets.js +356 -0
- package/src/lib/widgets.js.map +1 -0
- package/src/lib/widgets.mjs +351 -0
- 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"}
|
package/src/lib/lines.js
ADDED
|
@@ -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":";;;AACA,qCAAyC;AACzC,uCAA0E;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;AAEM,MAAM,WAAW,GAAkB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAa,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,IAAA,sBAAY,EAAC,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;AA3HW,QAAA,WAAW,eA2HtB"}
|
|
@@ -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":"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"}
|
|
@@ -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;
|