@fieldia/viewer 0.8.0 → 0.9.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 (58) hide show
  1. package/README.md +10 -1
  2. package/bundle/fieldia.js +4 -609
  3. package/bundle/fieldia.js.map +4 -4
  4. package/package.json +3 -3
  5. package/src/lib/custom-filter.d.mts +16 -0
  6. package/src/lib/custom-filter.d.ts +16 -0
  7. package/src/lib/custom-filter.js +112 -0
  8. package/src/lib/custom-filter.js.map +1 -0
  9. package/src/lib/custom-filter.mjs +109 -0
  10. package/src/lib/custom-filter.mjs.map +1 -0
  11. package/src/lib/dom.d.mts +2 -0
  12. package/src/lib/dom.d.ts +2 -0
  13. package/src/lib/dom.js +3 -0
  14. package/src/lib/dom.js.map +1 -0
  15. package/src/lib/dom.mjs +2 -0
  16. package/src/lib/dom.mjs.map +1 -0
  17. package/src/lib/favourites.d.mts +32 -0
  18. package/src/lib/favourites.d.ts +32 -0
  19. package/src/lib/favourites.js +74 -0
  20. package/src/lib/favourites.js.map +1 -0
  21. package/src/lib/favourites.mjs +69 -0
  22. package/src/lib/favourites.mjs.map +1 -0
  23. package/src/lib/labels.d.mts +46 -0
  24. package/src/lib/labels.d.ts +46 -0
  25. package/src/lib/labels.js +156 -0
  26. package/src/lib/labels.js.map +1 -1
  27. package/src/lib/labels.mjs +156 -0
  28. package/src/lib/labels.mjs.map +1 -1
  29. package/src/lib/list-groups.d.mts +29 -0
  30. package/src/lib/list-groups.d.ts +29 -0
  31. package/src/lib/list-groups.js +86 -0
  32. package/src/lib/list-groups.js.map +1 -0
  33. package/src/lib/list-groups.mjs +83 -0
  34. package/src/lib/list-groups.mjs.map +1 -0
  35. package/src/lib/list-styles.d.mts +4 -0
  36. package/src/lib/list-styles.d.ts +4 -0
  37. package/src/lib/list-styles.js +108 -0
  38. package/src/lib/list-styles.js.map +1 -0
  39. package/src/lib/list-styles.mjs +104 -0
  40. package/src/lib/list-styles.mjs.map +1 -0
  41. package/src/lib/list.d.mts +34 -0
  42. package/src/lib/list.d.ts +34 -0
  43. package/src/lib/list.js +282 -0
  44. package/src/lib/list.js.map +1 -0
  45. package/src/lib/list.mjs +279 -0
  46. package/src/lib/list.mjs.map +1 -0
  47. package/src/lib/search-bar.d.mts +30 -0
  48. package/src/lib/search-bar.d.ts +30 -0
  49. package/src/lib/search-bar.js +205 -0
  50. package/src/lib/search-bar.js.map +1 -0
  51. package/src/lib/search-bar.mjs +201 -0
  52. package/src/lib/search-bar.mjs.map +1 -0
  53. package/src/lib/viewer.d.mts +3 -1
  54. package/src/lib/viewer.d.ts +3 -1
  55. package/src/lib/viewer.js +26 -1
  56. package/src/lib/viewer.js.map +1 -1
  57. package/src/lib/viewer.mjs +26 -1
  58. package/src/lib/viewer.mjs.map +1 -1
@@ -0,0 +1,282 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listView = listView;
4
+ const core_1 = require("@fieldia/core");
5
+ const widgets_1 = require("@fieldia/widgets");
6
+ const favourites_1 = require("./favourites");
7
+ const list_groups_1 = require("./list-groups");
8
+ const list_styles_1 = require("./list-styles");
9
+ const search_bar_1 = require("./search-bar");
10
+ /** Numbers line up on the end of their column. */
11
+ const NUMBERS = new Set(['integer', 'float', 'monetary']);
12
+ /** Fields no list can put in order. */
13
+ const UNSORTABLE = new Set(['one2many', 'many2many', 'binary', 'image', 'html', 'json', 'properties']);
14
+ /**
15
+ * Records as a table: one page at a time, in the order a header asks for, each
16
+ * row opening its record. Chosen rows get the list's buttons, which hand the
17
+ * app their ids. A plain table, so it reads the same in every binding.
18
+ */
19
+ function listView(context) {
20
+ const { page, node, form, el, labels, fill, locale, doc } = context;
21
+ (0, list_styles_1.installListStyles)(doc);
22
+ const pageSize = node.pageSize ?? 40;
23
+ const defaultSort = node.sort ?? [];
24
+ let sort = defaultSort;
25
+ let offset = 0;
26
+ let total = 0;
27
+ /** The page of records, when the list is not grouped. */
28
+ let rows = [];
29
+ /** Each record's row, for the records on show however they are grouped. */
30
+ const recordOf = new WeakMap();
31
+ const visible = () => [...body.querySelectorAll('.fd-list-row')].map((tr) => recordOf.get(tr));
32
+ // Only a page of records gets this far: the page check refuses a list of anything else.
33
+ const model = page.data.kind === 'record' ? page.data.model : '';
34
+ let facets = (0, favourites_1.startingFacets)(node, context.preferences, page);
35
+ /** In the order they were chosen, which is the order the app gets them. */
36
+ const chosen = new Set();
37
+ let asking = 0;
38
+ let destroyed = false;
39
+ // The columns, and what an amount needs to be read: its currency, from the record.
40
+ const fields = [...new Set(node.columns.flatMap((name) => {
41
+ const def = page.fields[name];
42
+ return def.type === 'monetary' && def.currencyField ? [name, def.currencyField] : [name];
43
+ }))];
44
+ const show = (name, values) => (0, widgets_1.displayValue)(page.fields[name], values[name], values, locale);
45
+ // ---- the table ---------------------------------------------------------------
46
+ const chooseAll = el('input', { type: 'checkbox', class: 'fd-list-checkbox', 'aria-label': labels.selectAll });
47
+ const headers = node.columns.map((name) => {
48
+ const def = page.fields[name];
49
+ const th = el('th', { scope: 'col', 'data-field': name, class: NUMBERS.has(def.type) ? 'fd-num' : undefined });
50
+ if (UNSORTABLE.has(def.type))
51
+ th.append(def.label);
52
+ else {
53
+ const button = el('button', { type: 'button', class: 'fd-list-sort' }, def.label);
54
+ button.addEventListener('click', () => {
55
+ // The header's field leads; the list's own order breaks the ties.
56
+ const desc = sort[0]?.field === name ? !sort[0].desc : false;
57
+ sort = [{ field: name, ...(desc ? { desc } : {}) }, ...defaultSort.filter((order) => order.field !== name)];
58
+ offset = 0;
59
+ void load();
60
+ });
61
+ th.append(button);
62
+ }
63
+ return th;
64
+ });
65
+ const body = el('tbody');
66
+ const table = el('table', { class: 'fd-list-table', 'aria-label': page.title }, el('thead', {}, el('tr', {}, el('th', { class: 'fd-list-check', scope: 'col' }, chooseAll), ...headers)), body);
67
+ const empty = el('p', { class: 'fd-list-empty', hidden: '' }, labels.noRecords);
68
+ const retry = el('button', { type: 'button', class: 'fd-button fd-button-link' }, labels.retry);
69
+ const failed = el('p', { class: 'fd-list-failed', role: 'alert', hidden: '' }, labels.loadFailed, ' ', retry);
70
+ retry.addEventListener('click', () => void load());
71
+ function row(record, level = 0) {
72
+ const name = show(node.columns[0], record.values) || String(record.id);
73
+ const box = el('input', { type: 'checkbox', class: 'fd-list-checkbox', 'aria-label': fill(labels.selectRecord, { name }) });
74
+ box.checked = chosen.has(record.id);
75
+ box.addEventListener('change', () => {
76
+ if (box.checked)
77
+ chosen.add(record.id);
78
+ else
79
+ chosen.delete(record.id);
80
+ drawChoice();
81
+ });
82
+ const tr = el('tr', { class: context.onOpenRecord ? 'fd-list-row fd-list-openable' : 'fd-list-row', tabindex: '0', 'data-id': String(record.id), 'data-level': level ? String(level) : undefined }, el('td', { class: 'fd-list-check' }, box),
83
+ // Each value in its own direction: a phone number or an amount reads left to right on a right-to-left page.
84
+ ...node.columns.map((name) => el('td', { class: NUMBERS.has(page.fields[name].type) ? 'fd-num' : undefined }, el('bdi', {}, show(name, record.values)))));
85
+ tr.addEventListener('click', (event) => {
86
+ const cell = event.target.closest('td');
87
+ // The box's own cell is a bigger target for the box.
88
+ if (cell?.classList.contains('fd-list-check')) {
89
+ if (event.target === cell)
90
+ box.click();
91
+ return;
92
+ }
93
+ context.onOpenRecord?.(record.id);
94
+ });
95
+ tr.addEventListener('keydown', (event) => {
96
+ if (event.target !== tr)
97
+ return;
98
+ if (event.key === 'Enter') {
99
+ event.preventDefault();
100
+ context.onOpenRecord?.(record.id);
101
+ }
102
+ else if (event.key === ' ') {
103
+ event.preventDefault();
104
+ box.click();
105
+ }
106
+ else if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
107
+ event.preventDefault();
108
+ const next = event.key === 'ArrowDown' ? tr.nextElementSibling : tr.previousElementSibling;
109
+ next?.focus();
110
+ }
111
+ });
112
+ recordOf.set(tr, record);
113
+ return tr;
114
+ }
115
+ // ---- what is chosen, and the buttons for it --------------------------------------
116
+ const count = el('span', { class: 'fd-list-count', role: 'status' });
117
+ const clear = el('button', { type: 'button', class: 'fd-button fd-button-link' }, labels.clearSelection);
118
+ const buttons = (node.actions ?? []).map((action) => {
119
+ const button = el('button', { type: 'button', class: `fd-button fd-button-${action.style ?? 'secondary'}`, 'data-node': action.id }, ...context.withIcon(action.icon, action.label));
120
+ button.addEventListener('click', async () => {
121
+ if (action.confirm && !(await context.confirm(action.confirm)))
122
+ return;
123
+ await form.runAction(action.id, { recordIds: [...chosen] });
124
+ await load();
125
+ });
126
+ return button;
127
+ });
128
+ const selection = el('div', { class: 'fd-list-selection', hidden: '' }, count, ...buttons, clear);
129
+ clear.addEventListener('click', () => {
130
+ chosen.clear();
131
+ for (const box of body.querySelectorAll('.fd-list-checkbox'))
132
+ box.checked = false;
133
+ drawChoice();
134
+ });
135
+ chooseAll.addEventListener('change', () => {
136
+ for (const record of visible()) {
137
+ if (chooseAll.checked)
138
+ chosen.add(record.id);
139
+ else
140
+ chosen.delete(record.id);
141
+ }
142
+ for (const box of body.querySelectorAll('.fd-list-checkbox'))
143
+ box.checked = chooseAll.checked;
144
+ drawChoice();
145
+ });
146
+ function drawChoice() {
147
+ const shown = visible();
148
+ const onPage = shown.filter((record) => chosen.has(record.id)).length;
149
+ chooseAll.checked = shown.length > 0 && onPage === shown.length;
150
+ chooseAll.indeterminate = onPage > 0 && onPage < shown.length;
151
+ selection.hidden = chosen.size === 0;
152
+ count.textContent = fill(labels.selected, { n: chosen.size });
153
+ for (const tr of body.querySelectorAll('.fd-list-row')) {
154
+ tr.setAttribute('aria-selected', String([...chosen].some((id) => String(id) === tr.dataset['id'])));
155
+ }
156
+ }
157
+ // ---- pages -------------------------------------------------------------------
158
+ const range = el('span', { class: 'fd-pager-text' });
159
+ const previous = el('button', { type: 'button', class: 'fd-button fd-pager-button', 'aria-label': labels.previousPage }, '‹');
160
+ const next = el('button', { type: 'button', class: 'fd-button fd-pager-button', 'aria-label': labels.nextPage }, '›');
161
+ const pager = el('div', { class: 'fd-pager', role: 'group' }, range, previous, next);
162
+ previous.addEventListener('click', () => {
163
+ offset = Math.max(0, offset - pageSize);
164
+ void load();
165
+ });
166
+ next.addEventListener('click', () => {
167
+ offset += pageSize;
168
+ void load();
169
+ });
170
+ function drawPager() {
171
+ pager.hidden = total === 0;
172
+ range.textContent = fill(labels.range, { from: offset + 1, to: Math.min(offset + rows.length, total), total });
173
+ previous.disabled = offset === 0;
174
+ next.disabled = offset + pageSize >= total;
175
+ }
176
+ function drawSort() {
177
+ for (const th of headers) {
178
+ const order = sort[0]?.field === th.dataset['field'] ? sort[0] : null;
179
+ if (order)
180
+ th.setAttribute('aria-sort', order.desc ? 'descending' : 'ascending');
181
+ else
182
+ th.removeAttribute('aria-sort');
183
+ }
184
+ }
185
+ // ---- asking for the records ------------------------------------------------------
186
+ /** Rows came or went: what is chosen keeps to the records on show. */
187
+ function changed() {
188
+ const shown = new Set(visible().map((record) => record.id));
189
+ for (const id of [...chosen])
190
+ if (!shown.has(id))
191
+ chosen.delete(id);
192
+ drawChoice();
193
+ }
194
+ const grouped = (source) => ({
195
+ page,
196
+ el,
197
+ labels,
198
+ fill,
199
+ dataSource: source,
200
+ model,
201
+ fields,
202
+ columns: node.columns.length + 1,
203
+ pageSize,
204
+ sort: () => sort,
205
+ recordRow: row,
206
+ changed,
207
+ });
208
+ async function load() {
209
+ const mine = ++asking;
210
+ drawSort();
211
+ table.setAttribute('aria-busy', 'true');
212
+ let drawn = [];
213
+ try {
214
+ const filter = (0, core_1.facetsToFilter)(facets, node);
215
+ const grouping = (0, core_1.groupByFields)(facets);
216
+ const source = context.dataSource;
217
+ if (grouping.length && source?.groups && source.list) {
218
+ // Grouped: a row for each value of the first field, each opening into the rest.
219
+ const groups = await source.groups({ model, field: grouping[0], filter });
220
+ if (mine !== asking || destroyed)
221
+ return;
222
+ rows = [];
223
+ total = 0;
224
+ drawn = groups.map((group) => (0, list_groups_1.groupRow)(grouped(source), group, 0, filter, grouping));
225
+ }
226
+ else {
227
+ const answer = source?.list ? await source.list({ model, fields, filter, sort, offset, limit: pageSize }) : { records: [], total: 0 };
228
+ if (mine !== asking || destroyed)
229
+ return;
230
+ // Past the end, as when the last record of the last page went: back to the page that is left.
231
+ if (!answer.records.length && answer.total > 0 && offset > 0) {
232
+ offset = Math.floor((answer.total - 1) / pageSize) * pageSize;
233
+ return load();
234
+ }
235
+ rows = answer.records;
236
+ total = answer.total;
237
+ drawn = rows.map((record) => row(record));
238
+ }
239
+ failed.hidden = true;
240
+ }
241
+ catch {
242
+ if (mine !== asking || destroyed)
243
+ return;
244
+ rows = [];
245
+ total = 0;
246
+ failed.hidden = false;
247
+ }
248
+ body.replaceChildren(...drawn);
249
+ empty.hidden = drawn.length > 0 || !failed.hidden;
250
+ table.removeAttribute('aria-busy');
251
+ drawPager();
252
+ changed();
253
+ }
254
+ const search = (0, search_bar_1.searchBar)({
255
+ page,
256
+ node,
257
+ doc,
258
+ el,
259
+ labels,
260
+ fill,
261
+ uid: context.uid,
262
+ icons: context.icons,
263
+ preferences: context.preferences,
264
+ facets,
265
+ onChange(next) {
266
+ facets = next;
267
+ offset = 0;
268
+ void load();
269
+ },
270
+ });
271
+ const element = el('div', { class: 'fd-list', 'data-node': node.id }, el('div', { class: 'fd-list-bar' }, search.element, pager), selection, el('div', { class: 'fd-list-scroll' }, table), empty, failed);
272
+ void load();
273
+ return {
274
+ element,
275
+ reload: load,
276
+ destroy() {
277
+ destroyed = true;
278
+ search.destroy();
279
+ },
280
+ };
281
+ }
282
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,279 @@
1
+ import { facetsToFilter, groupByFields, } from '@fieldia/core';
2
+ import { displayValue } from '@fieldia/widgets';
3
+ import { startingFacets } from './favourites.mjs';
4
+ import { groupRow } from './list-groups.mjs';
5
+ import { installListStyles } from './list-styles.mjs';
6
+ import { searchBar } from './search-bar.mjs';
7
+ /** Numbers line up on the end of their column. */
8
+ const NUMBERS = new Set(['integer', 'float', 'monetary']);
9
+ /** Fields no list can put in order. */
10
+ const UNSORTABLE = new Set(['one2many', 'many2many', 'binary', 'image', 'html', 'json', 'properties']);
11
+ /**
12
+ * Records as a table: one page at a time, in the order a header asks for, each
13
+ * row opening its record. Chosen rows get the list's buttons, which hand the
14
+ * app their ids. A plain table, so it reads the same in every binding.
15
+ */
16
+ export function listView(context) {
17
+ const { page, node, form, el, labels, fill, locale, doc } = context;
18
+ installListStyles(doc);
19
+ const pageSize = node.pageSize ?? 40;
20
+ const defaultSort = node.sort ?? [];
21
+ let sort = defaultSort;
22
+ let offset = 0;
23
+ let total = 0;
24
+ /** The page of records, when the list is not grouped. */
25
+ let rows = [];
26
+ /** Each record's row, for the records on show however they are grouped. */
27
+ const recordOf = new WeakMap();
28
+ const visible = () => [...body.querySelectorAll('.fd-list-row')].map((tr) => recordOf.get(tr));
29
+ // Only a page of records gets this far: the page check refuses a list of anything else.
30
+ const model = page.data.kind === 'record' ? page.data.model : '';
31
+ let facets = startingFacets(node, context.preferences, page);
32
+ /** In the order they were chosen, which is the order the app gets them. */
33
+ const chosen = new Set();
34
+ let asking = 0;
35
+ let destroyed = false;
36
+ // The columns, and what an amount needs to be read: its currency, from the record.
37
+ const fields = [...new Set(node.columns.flatMap((name) => {
38
+ const def = page.fields[name];
39
+ return def.type === 'monetary' && def.currencyField ? [name, def.currencyField] : [name];
40
+ }))];
41
+ const show = (name, values) => displayValue(page.fields[name], values[name], values, locale);
42
+ // ---- the table ---------------------------------------------------------------
43
+ const chooseAll = el('input', { type: 'checkbox', class: 'fd-list-checkbox', 'aria-label': labels.selectAll });
44
+ const headers = node.columns.map((name) => {
45
+ const def = page.fields[name];
46
+ const th = el('th', { scope: 'col', 'data-field': name, class: NUMBERS.has(def.type) ? 'fd-num' : undefined });
47
+ if (UNSORTABLE.has(def.type))
48
+ th.append(def.label);
49
+ else {
50
+ const button = el('button', { type: 'button', class: 'fd-list-sort' }, def.label);
51
+ button.addEventListener('click', () => {
52
+ // The header's field leads; the list's own order breaks the ties.
53
+ const desc = sort[0]?.field === name ? !sort[0].desc : false;
54
+ sort = [{ field: name, ...(desc ? { desc } : {}) }, ...defaultSort.filter((order) => order.field !== name)];
55
+ offset = 0;
56
+ void load();
57
+ });
58
+ th.append(button);
59
+ }
60
+ return th;
61
+ });
62
+ const body = el('tbody');
63
+ const table = el('table', { class: 'fd-list-table', 'aria-label': page.title }, el('thead', {}, el('tr', {}, el('th', { class: 'fd-list-check', scope: 'col' }, chooseAll), ...headers)), body);
64
+ const empty = el('p', { class: 'fd-list-empty', hidden: '' }, labels.noRecords);
65
+ const retry = el('button', { type: 'button', class: 'fd-button fd-button-link' }, labels.retry);
66
+ const failed = el('p', { class: 'fd-list-failed', role: 'alert', hidden: '' }, labels.loadFailed, ' ', retry);
67
+ retry.addEventListener('click', () => void load());
68
+ function row(record, level = 0) {
69
+ const name = show(node.columns[0], record.values) || String(record.id);
70
+ const box = el('input', { type: 'checkbox', class: 'fd-list-checkbox', 'aria-label': fill(labels.selectRecord, { name }) });
71
+ box.checked = chosen.has(record.id);
72
+ box.addEventListener('change', () => {
73
+ if (box.checked)
74
+ chosen.add(record.id);
75
+ else
76
+ chosen.delete(record.id);
77
+ drawChoice();
78
+ });
79
+ const tr = el('tr', { class: context.onOpenRecord ? 'fd-list-row fd-list-openable' : 'fd-list-row', tabindex: '0', 'data-id': String(record.id), 'data-level': level ? String(level) : undefined }, el('td', { class: 'fd-list-check' }, box),
80
+ // Each value in its own direction: a phone number or an amount reads left to right on a right-to-left page.
81
+ ...node.columns.map((name) => el('td', { class: NUMBERS.has(page.fields[name].type) ? 'fd-num' : undefined }, el('bdi', {}, show(name, record.values)))));
82
+ tr.addEventListener('click', (event) => {
83
+ const cell = event.target.closest('td');
84
+ // The box's own cell is a bigger target for the box.
85
+ if (cell?.classList.contains('fd-list-check')) {
86
+ if (event.target === cell)
87
+ box.click();
88
+ return;
89
+ }
90
+ context.onOpenRecord?.(record.id);
91
+ });
92
+ tr.addEventListener('keydown', (event) => {
93
+ if (event.target !== tr)
94
+ return;
95
+ if (event.key === 'Enter') {
96
+ event.preventDefault();
97
+ context.onOpenRecord?.(record.id);
98
+ }
99
+ else if (event.key === ' ') {
100
+ event.preventDefault();
101
+ box.click();
102
+ }
103
+ else if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
104
+ event.preventDefault();
105
+ const next = event.key === 'ArrowDown' ? tr.nextElementSibling : tr.previousElementSibling;
106
+ next?.focus();
107
+ }
108
+ });
109
+ recordOf.set(tr, record);
110
+ return tr;
111
+ }
112
+ // ---- what is chosen, and the buttons for it --------------------------------------
113
+ const count = el('span', { class: 'fd-list-count', role: 'status' });
114
+ const clear = el('button', { type: 'button', class: 'fd-button fd-button-link' }, labels.clearSelection);
115
+ const buttons = (node.actions ?? []).map((action) => {
116
+ const button = el('button', { type: 'button', class: `fd-button fd-button-${action.style ?? 'secondary'}`, 'data-node': action.id }, ...context.withIcon(action.icon, action.label));
117
+ button.addEventListener('click', async () => {
118
+ if (action.confirm && !(await context.confirm(action.confirm)))
119
+ return;
120
+ await form.runAction(action.id, { recordIds: [...chosen] });
121
+ await load();
122
+ });
123
+ return button;
124
+ });
125
+ const selection = el('div', { class: 'fd-list-selection', hidden: '' }, count, ...buttons, clear);
126
+ clear.addEventListener('click', () => {
127
+ chosen.clear();
128
+ for (const box of body.querySelectorAll('.fd-list-checkbox'))
129
+ box.checked = false;
130
+ drawChoice();
131
+ });
132
+ chooseAll.addEventListener('change', () => {
133
+ for (const record of visible()) {
134
+ if (chooseAll.checked)
135
+ chosen.add(record.id);
136
+ else
137
+ chosen.delete(record.id);
138
+ }
139
+ for (const box of body.querySelectorAll('.fd-list-checkbox'))
140
+ box.checked = chooseAll.checked;
141
+ drawChoice();
142
+ });
143
+ function drawChoice() {
144
+ const shown = visible();
145
+ const onPage = shown.filter((record) => chosen.has(record.id)).length;
146
+ chooseAll.checked = shown.length > 0 && onPage === shown.length;
147
+ chooseAll.indeterminate = onPage > 0 && onPage < shown.length;
148
+ selection.hidden = chosen.size === 0;
149
+ count.textContent = fill(labels.selected, { n: chosen.size });
150
+ for (const tr of body.querySelectorAll('.fd-list-row')) {
151
+ tr.setAttribute('aria-selected', String([...chosen].some((id) => String(id) === tr.dataset['id'])));
152
+ }
153
+ }
154
+ // ---- pages -------------------------------------------------------------------
155
+ const range = el('span', { class: 'fd-pager-text' });
156
+ const previous = el('button', { type: 'button', class: 'fd-button fd-pager-button', 'aria-label': labels.previousPage }, '‹');
157
+ const next = el('button', { type: 'button', class: 'fd-button fd-pager-button', 'aria-label': labels.nextPage }, '›');
158
+ const pager = el('div', { class: 'fd-pager', role: 'group' }, range, previous, next);
159
+ previous.addEventListener('click', () => {
160
+ offset = Math.max(0, offset - pageSize);
161
+ void load();
162
+ });
163
+ next.addEventListener('click', () => {
164
+ offset += pageSize;
165
+ void load();
166
+ });
167
+ function drawPager() {
168
+ pager.hidden = total === 0;
169
+ range.textContent = fill(labels.range, { from: offset + 1, to: Math.min(offset + rows.length, total), total });
170
+ previous.disabled = offset === 0;
171
+ next.disabled = offset + pageSize >= total;
172
+ }
173
+ function drawSort() {
174
+ for (const th of headers) {
175
+ const order = sort[0]?.field === th.dataset['field'] ? sort[0] : null;
176
+ if (order)
177
+ th.setAttribute('aria-sort', order.desc ? 'descending' : 'ascending');
178
+ else
179
+ th.removeAttribute('aria-sort');
180
+ }
181
+ }
182
+ // ---- asking for the records ------------------------------------------------------
183
+ /** Rows came or went: what is chosen keeps to the records on show. */
184
+ function changed() {
185
+ const shown = new Set(visible().map((record) => record.id));
186
+ for (const id of [...chosen])
187
+ if (!shown.has(id))
188
+ chosen.delete(id);
189
+ drawChoice();
190
+ }
191
+ const grouped = (source) => ({
192
+ page,
193
+ el,
194
+ labels,
195
+ fill,
196
+ dataSource: source,
197
+ model,
198
+ fields,
199
+ columns: node.columns.length + 1,
200
+ pageSize,
201
+ sort: () => sort,
202
+ recordRow: row,
203
+ changed,
204
+ });
205
+ async function load() {
206
+ const mine = ++asking;
207
+ drawSort();
208
+ table.setAttribute('aria-busy', 'true');
209
+ let drawn = [];
210
+ try {
211
+ const filter = facetsToFilter(facets, node);
212
+ const grouping = groupByFields(facets);
213
+ const source = context.dataSource;
214
+ if (grouping.length && source?.groups && source.list) {
215
+ // Grouped: a row for each value of the first field, each opening into the rest.
216
+ const groups = await source.groups({ model, field: grouping[0], filter });
217
+ if (mine !== asking || destroyed)
218
+ return;
219
+ rows = [];
220
+ total = 0;
221
+ drawn = groups.map((group) => groupRow(grouped(source), group, 0, filter, grouping));
222
+ }
223
+ else {
224
+ const answer = source?.list ? await source.list({ model, fields, filter, sort, offset, limit: pageSize }) : { records: [], total: 0 };
225
+ if (mine !== asking || destroyed)
226
+ return;
227
+ // Past the end, as when the last record of the last page went: back to the page that is left.
228
+ if (!answer.records.length && answer.total > 0 && offset > 0) {
229
+ offset = Math.floor((answer.total - 1) / pageSize) * pageSize;
230
+ return load();
231
+ }
232
+ rows = answer.records;
233
+ total = answer.total;
234
+ drawn = rows.map((record) => row(record));
235
+ }
236
+ failed.hidden = true;
237
+ }
238
+ catch {
239
+ if (mine !== asking || destroyed)
240
+ return;
241
+ rows = [];
242
+ total = 0;
243
+ failed.hidden = false;
244
+ }
245
+ body.replaceChildren(...drawn);
246
+ empty.hidden = drawn.length > 0 || !failed.hidden;
247
+ table.removeAttribute('aria-busy');
248
+ drawPager();
249
+ changed();
250
+ }
251
+ const search = searchBar({
252
+ page,
253
+ node,
254
+ doc,
255
+ el,
256
+ labels,
257
+ fill,
258
+ uid: context.uid,
259
+ icons: context.icons,
260
+ preferences: context.preferences,
261
+ facets,
262
+ onChange(next) {
263
+ facets = next;
264
+ offset = 0;
265
+ void load();
266
+ },
267
+ });
268
+ const element = el('div', { class: 'fd-list', 'data-node': node.id }, el('div', { class: 'fd-list-bar' }, search.element, pager), selection, el('div', { class: 'fd-list-scroll' }, table), empty, failed);
269
+ void load();
270
+ return {
271
+ element,
272
+ reload: load,
273
+ destroy() {
274
+ destroyed = true;
275
+ search.destroy();
276
+ },
277
+ };
278
+ }
279
+ //# sourceMappingURL=list.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.mjs","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { type Facet, type ListNode, type Page } from '@fieldia/core';
2
+ import { type IconSet, type PreferenceStore } from '@fieldia/widgets';
3
+ import type { El } from './dom.mjs';
4
+ import type { ViewerLabels } from './labels.mjs';
5
+ export interface SearchContext {
6
+ page: Page;
7
+ node: ListNode;
8
+ doc: Document;
9
+ el: El;
10
+ labels: ViewerLabels;
11
+ fill: (template: string, values: Record<string, string | number>) => string;
12
+ uid: (id: string) => string;
13
+ icons?: IconSet;
14
+ preferences: PreferenceStore;
15
+ /** What the list starts with. */
16
+ facets: Facet[];
17
+ onChange: (facets: Facet[]) => void;
18
+ }
19
+ /** A chip's words: a field and the values looked for in it, filters any of which apply, or the fields grouped by. */
20
+ export declare function facetText(facet: Facet, labels: Pick<ViewerLabels, 'or'>): string;
21
+ /**
22
+ * A list's search bar: what is typed becomes a search in one of the list's
23
+ * fields, chosen from suggestions; the menu turns the list's filters on and
24
+ * off, groups by its fields, builds a filter, and keeps searches as
25
+ * favourites. Everything chosen shows as a chip, and all of it applies.
26
+ */
27
+ export declare function searchBar(context: SearchContext): {
28
+ element: HTMLDivElement;
29
+ destroy: () => void;
30
+ };