@fieldia/viewer 0.7.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 -607
  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 +29 -1
  56. package/src/lib/viewer.js.map +1 -1
  57. package/src/lib/viewer.mjs +29 -1
  58. package/src/lib/viewer.mjs.map +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fieldia/viewer",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "description": "Mount a Fieldia page in any web page: plain DOM, no framework.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://fieldia.dev",
@@ -24,8 +24,8 @@
24
24
  "./package.json": "./package.json"
25
25
  },
26
26
  "dependencies": {
27
- "@fieldia/core": "0.7.0",
28
- "@fieldia/widgets": "0.7.0",
27
+ "@fieldia/core": "0.9.0",
28
+ "@fieldia/widgets": "0.9.0",
29
29
  "tslib": "^2.8.1"
30
30
  },
31
31
  "sideEffects": false,
@@ -0,0 +1,16 @@
1
+ import type { Facet, Page } from '@fieldia/core';
2
+ import type { El } from './dom.mjs';
3
+ import type { ViewerLabels } from './labels.mjs';
4
+ /**
5
+ * A filter of a person's own, under the list's filters: a field, a condition
6
+ * that suits it, and a value of its kind. Applied, it becomes a chip.
7
+ */
8
+ export declare function customFilterPart(context: {
9
+ page: Page;
10
+ el: El;
11
+ labels: ViewerLabels;
12
+ add: (facet: Facet) => void;
13
+ }): {
14
+ button: HTMLButtonElement;
15
+ form: HTMLDivElement;
16
+ };
@@ -0,0 +1,16 @@
1
+ import type { Facet, Page } from '@fieldia/core';
2
+ import type { El } from './dom';
3
+ import type { ViewerLabels } from './labels';
4
+ /**
5
+ * A filter of a person's own, under the list's filters: a field, a condition
6
+ * that suits it, and a value of its kind. Applied, it becomes a chip.
7
+ */
8
+ export declare function customFilterPart(context: {
9
+ page: Page;
10
+ el: El;
11
+ labels: ViewerLabels;
12
+ add: (facet: Facet) => void;
13
+ }): {
14
+ button: HTMLButtonElement;
15
+ form: HTMLDivElement;
16
+ };
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.customFilterPart = customFilterPart;
4
+ const TEXT = [['ilike', 'opContains'], ['=', 'opIs'], ['!=', 'opIsNot'], ['set', 'opSet'], ['notset', 'opNotSet']];
5
+ const LINK = [['ilike', 'opContains'], ['set', 'opSet'], ['notset', 'opNotSet']];
6
+ const CHOICE = [['=', 'opIs'], ['!=', 'opIsNot'], ['set', 'opSet'], ['notset', 'opNotSet']];
7
+ const NUMBER = [['=', 'opIs'], ['!=', 'opIsNot'], ['>', 'opGreater'], ['<', 'opLess'], ['set', 'opSet'], ['notset', 'opNotSet']];
8
+ const DATE = [['=', 'opIs'], ['>', 'opGreater'], ['<', 'opLess'], ['set', 'opSet'], ['notset', 'opNotSet']];
9
+ /** The conditions that suit a field, or none for a field a custom filter cannot look at. */
10
+ function conditionsFor(def) {
11
+ switch (def.type) {
12
+ case 'char':
13
+ case 'text':
14
+ case 'html':
15
+ return TEXT;
16
+ case 'many2one':
17
+ case 'many2many':
18
+ return LINK;
19
+ case 'selection':
20
+ return CHOICE;
21
+ case 'integer':
22
+ case 'float':
23
+ case 'monetary':
24
+ return NUMBER;
25
+ case 'date':
26
+ case 'datetime':
27
+ return DATE;
28
+ case 'boolean':
29
+ return [['=', 'opIs']];
30
+ default:
31
+ return [];
32
+ }
33
+ }
34
+ /**
35
+ * A filter of a person's own, under the list's filters: a field, a condition
36
+ * that suits it, and a value of its kind. Applied, it becomes a chip.
37
+ */
38
+ function customFilterPart(context) {
39
+ const { page, el, labels } = context;
40
+ const fields = Object.entries(page.fields).filter(([, def]) => conditionsFor(def).length);
41
+ const field = el('select', { class: 'fd-input', 'aria-label': labels.field }, ...fields.map(([name, def]) => el('option', { value: name }, def.label)));
42
+ const condition = el('select', { class: 'fd-input', 'aria-label': labels.condition });
43
+ const valueBox = el('span', { class: 'fd-custom-filter-value' });
44
+ const apply = el('button', { type: 'button', class: 'fd-button fd-button-primary' }, labels.apply);
45
+ const form = el('div', { class: 'fd-custom-filter', hidden: '' }, field, condition, valueBox, apply);
46
+ const button = el('button', { type: 'button', class: 'fd-search-option fd-search-add', 'aria-expanded': 'false' }, labels.addCustomFilter);
47
+ let value = el('input', { class: 'fd-input', 'aria-label': labels.value });
48
+ const def = () => page.fields[field.value];
49
+ function drawConditions() {
50
+ condition.replaceChildren(...conditionsFor(def()).map(([op, word]) => el('option', { value: op }, labels[word])));
51
+ drawValue();
52
+ }
53
+ /** A box of the field's kind: its choices, yes or no, a number, a day, or text. */
54
+ function drawValue() {
55
+ const current = def();
56
+ if (current.type === 'selection')
57
+ value = el('select', { class: 'fd-input', 'aria-label': labels.value }, ...current.options.map((o) => el('option', { value: String(o.value) }, o.label)));
58
+ else if (current.type === 'boolean')
59
+ value = el('select', { class: 'fd-input', 'aria-label': labels.value }, el('option', { value: 'true' }, labels.yes), el('option', { value: 'false' }, labels.no));
60
+ else {
61
+ const type = ['integer', 'float', 'monetary'].includes(current.type) ? 'number' : current.type === 'date' ? 'date' : current.type === 'datetime' ? 'datetime-local' : 'text';
62
+ value = el('input', { class: 'fd-input', type, 'aria-label': labels.value });
63
+ }
64
+ valueBox.replaceChildren(value);
65
+ valueBox.hidden = condition.value === 'set' || condition.value === 'notset';
66
+ }
67
+ field.addEventListener('change', drawConditions);
68
+ condition.addEventListener('change', () => (valueBox.hidden = condition.value === 'set' || condition.value === 'notset'));
69
+ button.addEventListener('click', () => {
70
+ form.hidden = !form.hidden;
71
+ button.setAttribute('aria-expanded', String(!form.hidden));
72
+ if (!form.hidden)
73
+ field.focus();
74
+ });
75
+ apply.addEventListener('click', () => {
76
+ const current = def();
77
+ const op = condition.value;
78
+ const word = labels[conditionsFor(current).find(([o]) => o === op)?.[1] ?? 'opIs'];
79
+ let wanted = null;
80
+ let shown = '';
81
+ if (!valueBox.hidden) {
82
+ const text = value.value.trim();
83
+ if (!text)
84
+ return value.focus();
85
+ if (current.type === 'selection') {
86
+ const option = current.options.find((o) => String(o.value) === text);
87
+ wanted = option?.value ?? text;
88
+ shown = option?.label ?? text;
89
+ }
90
+ else if (current.type === 'boolean') {
91
+ wanted = text === 'true';
92
+ shown = wanted ? labels.yes : labels.no;
93
+ }
94
+ else if (['integer', 'float', 'monetary'].includes(current.type)) {
95
+ wanted = Number(text);
96
+ if (!Number.isFinite(wanted))
97
+ return value.focus();
98
+ shown = text;
99
+ }
100
+ else {
101
+ wanted = text;
102
+ shown = text;
103
+ }
104
+ }
105
+ context.add({ kind: 'custom', label: [current.label, word, shown].filter(Boolean).join(' '), filter: [{ field: field.value, op, value: wanted }] });
106
+ form.hidden = true;
107
+ button.setAttribute('aria-expanded', 'false');
108
+ });
109
+ drawConditions();
110
+ return { button, form };
111
+ }
112
+ //# sourceMappingURL=custom-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-filter.js","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/custom-filter.ts"],"names":[],"mappings":";;AA2CA,4CAuEC;AA3GD,MAAM,IAAI,GAAwB,CAAC,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AACxI,MAAM,IAAI,GAAwB,CAAC,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AACtG,MAAM,MAAM,GAAwB,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AACjH,MAAM,MAAM,GAAwB,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AACtJ,MAAM,IAAI,GAAwB,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAEjI,4FAA4F;AAC5F,SAAS,aAAa,CAAC,GAAU;IAC/B,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACT,OAAO,IAAI,CAAC;QACd,KAAK,UAAU,CAAC;QAChB,KAAK,WAAW;YACd,OAAO,IAAI,CAAC;QACd,KAAK,WAAW;YACd,OAAO,MAAM,CAAC;QAChB,KAAK,SAAS,CAAC;QACf,KAAK,OAAO,CAAC;QACb,KAAK,UAAU;YACb,OAAO,MAAM,CAAC;QAChB,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU;YACb,OAAO,IAAI,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;QACzB;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,OAAkF;IACjH,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxJ,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACtF,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,6BAA6B,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACnG,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrG,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,gCAAgC,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IAC3I,IAAI,KAAK,GAAyC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAEjH,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE3C,SAAS,cAAc;QACrB,SAAS,CAAC,eAAe,CAAC,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAClH,SAAS,EAAE,CAAC;IACd,CAAC;IAED,mFAAmF;IACnF,SAAS,SAAS;QAChB,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;QACtB,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACvL,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;aAClM,CAAC;YACJ,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC;YAC7K,KAAK,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,KAAK,KAAK,KAAK,IAAI,SAAS,CAAC,KAAK,KAAK,QAAQ,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACjD,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,KAAK,KAAK,KAAK,IAAI,SAAS,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC;IAC1H,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;QACpC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;QACnC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,SAAS,CAAC,KAAW,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;QACnF,IAAI,MAAM,GAAc,IAAI,CAAC;QAC7B,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACjC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;gBACrE,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC;gBAC/B,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC;YAChC,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACtC,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC;gBACzB,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1C,CAAC;iBAAM,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnE,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;gBACtB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAAE,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC;gBACnD,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,IAAI,CAAC;gBACd,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACpJ,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,cAAc,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,109 @@
1
+ const TEXT = [['ilike', 'opContains'], ['=', 'opIs'], ['!=', 'opIsNot'], ['set', 'opSet'], ['notset', 'opNotSet']];
2
+ const LINK = [['ilike', 'opContains'], ['set', 'opSet'], ['notset', 'opNotSet']];
3
+ const CHOICE = [['=', 'opIs'], ['!=', 'opIsNot'], ['set', 'opSet'], ['notset', 'opNotSet']];
4
+ const NUMBER = [['=', 'opIs'], ['!=', 'opIsNot'], ['>', 'opGreater'], ['<', 'opLess'], ['set', 'opSet'], ['notset', 'opNotSet']];
5
+ const DATE = [['=', 'opIs'], ['>', 'opGreater'], ['<', 'opLess'], ['set', 'opSet'], ['notset', 'opNotSet']];
6
+ /** The conditions that suit a field, or none for a field a custom filter cannot look at. */
7
+ function conditionsFor(def) {
8
+ switch (def.type) {
9
+ case 'char':
10
+ case 'text':
11
+ case 'html':
12
+ return TEXT;
13
+ case 'many2one':
14
+ case 'many2many':
15
+ return LINK;
16
+ case 'selection':
17
+ return CHOICE;
18
+ case 'integer':
19
+ case 'float':
20
+ case 'monetary':
21
+ return NUMBER;
22
+ case 'date':
23
+ case 'datetime':
24
+ return DATE;
25
+ case 'boolean':
26
+ return [['=', 'opIs']];
27
+ default:
28
+ return [];
29
+ }
30
+ }
31
+ /**
32
+ * A filter of a person's own, under the list's filters: a field, a condition
33
+ * that suits it, and a value of its kind. Applied, it becomes a chip.
34
+ */
35
+ export function customFilterPart(context) {
36
+ const { page, el, labels } = context;
37
+ const fields = Object.entries(page.fields).filter(([, def]) => conditionsFor(def).length);
38
+ const field = el('select', { class: 'fd-input', 'aria-label': labels.field }, ...fields.map(([name, def]) => el('option', { value: name }, def.label)));
39
+ const condition = el('select', { class: 'fd-input', 'aria-label': labels.condition });
40
+ const valueBox = el('span', { class: 'fd-custom-filter-value' });
41
+ const apply = el('button', { type: 'button', class: 'fd-button fd-button-primary' }, labels.apply);
42
+ const form = el('div', { class: 'fd-custom-filter', hidden: '' }, field, condition, valueBox, apply);
43
+ const button = el('button', { type: 'button', class: 'fd-search-option fd-search-add', 'aria-expanded': 'false' }, labels.addCustomFilter);
44
+ let value = el('input', { class: 'fd-input', 'aria-label': labels.value });
45
+ const def = () => page.fields[field.value];
46
+ function drawConditions() {
47
+ condition.replaceChildren(...conditionsFor(def()).map(([op, word]) => el('option', { value: op }, labels[word])));
48
+ drawValue();
49
+ }
50
+ /** A box of the field's kind: its choices, yes or no, a number, a day, or text. */
51
+ function drawValue() {
52
+ const current = def();
53
+ if (current.type === 'selection')
54
+ value = el('select', { class: 'fd-input', 'aria-label': labels.value }, ...current.options.map((o) => el('option', { value: String(o.value) }, o.label)));
55
+ else if (current.type === 'boolean')
56
+ value = el('select', { class: 'fd-input', 'aria-label': labels.value }, el('option', { value: 'true' }, labels.yes), el('option', { value: 'false' }, labels.no));
57
+ else {
58
+ const type = ['integer', 'float', 'monetary'].includes(current.type) ? 'number' : current.type === 'date' ? 'date' : current.type === 'datetime' ? 'datetime-local' : 'text';
59
+ value = el('input', { class: 'fd-input', type, 'aria-label': labels.value });
60
+ }
61
+ valueBox.replaceChildren(value);
62
+ valueBox.hidden = condition.value === 'set' || condition.value === 'notset';
63
+ }
64
+ field.addEventListener('change', drawConditions);
65
+ condition.addEventListener('change', () => (valueBox.hidden = condition.value === 'set' || condition.value === 'notset'));
66
+ button.addEventListener('click', () => {
67
+ form.hidden = !form.hidden;
68
+ button.setAttribute('aria-expanded', String(!form.hidden));
69
+ if (!form.hidden)
70
+ field.focus();
71
+ });
72
+ apply.addEventListener('click', () => {
73
+ const current = def();
74
+ const op = condition.value;
75
+ const word = labels[conditionsFor(current).find(([o]) => o === op)?.[1] ?? 'opIs'];
76
+ let wanted = null;
77
+ let shown = '';
78
+ if (!valueBox.hidden) {
79
+ const text = value.value.trim();
80
+ if (!text)
81
+ return value.focus();
82
+ if (current.type === 'selection') {
83
+ const option = current.options.find((o) => String(o.value) === text);
84
+ wanted = option?.value ?? text;
85
+ shown = option?.label ?? text;
86
+ }
87
+ else if (current.type === 'boolean') {
88
+ wanted = text === 'true';
89
+ shown = wanted ? labels.yes : labels.no;
90
+ }
91
+ else if (['integer', 'float', 'monetary'].includes(current.type)) {
92
+ wanted = Number(text);
93
+ if (!Number.isFinite(wanted))
94
+ return value.focus();
95
+ shown = text;
96
+ }
97
+ else {
98
+ wanted = text;
99
+ shown = text;
100
+ }
101
+ }
102
+ context.add({ kind: 'custom', label: [current.label, word, shown].filter(Boolean).join(' '), filter: [{ field: field.value, op, value: wanted }] });
103
+ form.hidden = true;
104
+ button.setAttribute('aria-expanded', 'false');
105
+ });
106
+ drawConditions();
107
+ return { button, form };
108
+ }
109
+ //# sourceMappingURL=custom-filter.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-filter.mjs","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/custom-filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ /** The viewer's way to make an element: a tag, its attributes (left out when undefined), and what goes in it. */
2
+ export type El = <K extends keyof HTMLElementTagNameMap>(tag: K, attrs?: Record<string, string | undefined>, ...children: (Node | string)[]) => HTMLElementTagNameMap[K];
@@ -0,0 +1,2 @@
1
+ /** The viewer's way to make an element: a tag, its attributes (left out when undefined), and what goes in it. */
2
+ export type El = <K extends keyof HTMLElementTagNameMap>(tag: K, attrs?: Record<string, string | undefined>, ...children: (Node | string)[]) => HTMLElementTagNameMap[K];
package/src/lib/dom.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.js","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/dom.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dom.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.mjs","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/dom.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import type { Facet, ListNode, Page } from '@fieldia/core';
2
+ import type { PreferenceStore } from '@fieldia/widgets';
3
+ import type { El } from './dom.mjs';
4
+ import type { ViewerLabels } from './labels.mjs';
5
+ /** A search a person kept, by its name; the one used by default opens the list. */
6
+ export interface Favourite {
7
+ name: string;
8
+ facets: Facet[];
9
+ isDefault?: boolean;
10
+ }
11
+ export declare function readFavourites(preferences: PreferenceStore, page: Page): Favourite[];
12
+ /** What a list starts with: the favourite used by default, or else the list's own default filters. */
13
+ export declare function startingFacets(node: ListNode, preferences: PreferenceStore, page: Page): Facet[];
14
+ /**
15
+ * The Favourites of the search menu: searches kept by name, each one put back
16
+ * with a click or deleted, and the search on screen kept as a new one, used by
17
+ * default if the person says so. Kept where the page keeps its preferences.
18
+ */
19
+ export declare function favouritesPart(context: {
20
+ page: Page;
21
+ el: El;
22
+ labels: ViewerLabels;
23
+ fill: (template: string, values: Record<string, string>) => string;
24
+ preferences: PreferenceStore;
25
+ current: () => Facet[];
26
+ apply: (facets: Facet[]) => void;
27
+ }): {
28
+ list: HTMLUListElement;
29
+ none: HTMLParagraphElement;
30
+ open: HTMLButtonElement;
31
+ form: HTMLDivElement;
32
+ };
@@ -0,0 +1,32 @@
1
+ import type { Facet, ListNode, Page } from '@fieldia/core';
2
+ import type { PreferenceStore } from '@fieldia/widgets';
3
+ import type { El } from './dom';
4
+ import type { ViewerLabels } from './labels';
5
+ /** A search a person kept, by its name; the one used by default opens the list. */
6
+ export interface Favourite {
7
+ name: string;
8
+ facets: Facet[];
9
+ isDefault?: boolean;
10
+ }
11
+ export declare function readFavourites(preferences: PreferenceStore, page: Page): Favourite[];
12
+ /** What a list starts with: the favourite used by default, or else the list's own default filters. */
13
+ export declare function startingFacets(node: ListNode, preferences: PreferenceStore, page: Page): Facet[];
14
+ /**
15
+ * The Favourites of the search menu: searches kept by name, each one put back
16
+ * with a click or deleted, and the search on screen kept as a new one, used by
17
+ * default if the person says so. Kept where the page keeps its preferences.
18
+ */
19
+ export declare function favouritesPart(context: {
20
+ page: Page;
21
+ el: El;
22
+ labels: ViewerLabels;
23
+ fill: (template: string, values: Record<string, string>) => string;
24
+ preferences: PreferenceStore;
25
+ current: () => Facet[];
26
+ apply: (facets: Facet[]) => void;
27
+ }): {
28
+ list: HTMLUListElement;
29
+ none: HTMLParagraphElement;
30
+ open: HTMLButtonElement;
31
+ form: HTMLDivElement;
32
+ };
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readFavourites = readFavourites;
4
+ exports.startingFacets = startingFacets;
5
+ exports.favouritesPart = favouritesPart;
6
+ const key = (page) => `favourites:${page.id}`;
7
+ function readFavourites(preferences, page) {
8
+ const kept = preferences.get(key(page));
9
+ return Array.isArray(kept) ? kept : [];
10
+ }
11
+ /** What a list starts with: the favourite used by default, or else the list's own default filters. */
12
+ function startingFacets(node, preferences, page) {
13
+ const chosen = readFavourites(preferences, page).find((favourite) => favourite.isDefault);
14
+ if (chosen)
15
+ return chosen.facets;
16
+ if (!node.defaultFilters?.length)
17
+ return [];
18
+ return [{ kind: 'filters', ids: [...node.defaultFilters], labels: node.defaultFilters.map((id) => node.filters?.find((f) => f.id === id)?.label ?? id) }];
19
+ }
20
+ /**
21
+ * The Favourites of the search menu: searches kept by name, each one put back
22
+ * with a click or deleted, and the search on screen kept as a new one, used by
23
+ * default if the person says so. Kept where the page keeps its preferences.
24
+ */
25
+ function favouritesPart(context) {
26
+ const { page, el, labels, fill, preferences } = context;
27
+ const list = el('ul', { class: 'fd-favourite-list' });
28
+ const none = el('p', { class: 'fd-favourites-none' }, labels.noFavourites);
29
+ const name = el('input', { class: 'fd-input', 'aria-label': labels.searchName, placeholder: labels.searchName });
30
+ const byDefault = el('input', { type: 'checkbox' });
31
+ const save = el('button', { type: 'button', class: 'fd-button fd-button-primary' }, labels.save);
32
+ const form = el('div', { class: 'fd-favourite-form', hidden: '' }, name, el('label', { class: 'fd-favourite-default' }, byDefault, labels.useByDefault), save);
33
+ const open = el('button', { type: 'button', class: 'fd-search-option fd-search-add', 'aria-expanded': 'false' }, labels.saveSearch);
34
+ const write = (favourites) => preferences.set(key(page), favourites);
35
+ function draw() {
36
+ const favourites = readFavourites(preferences, page);
37
+ none.hidden = favourites.length > 0;
38
+ list.replaceChildren(...favourites.map((favourite) => {
39
+ const use = el('button', { type: 'button', class: 'fd-search-option', 'data-default': favourite.isDefault ? 'true' : undefined }, favourite.name);
40
+ use.addEventListener('click', () => context.apply(favourite.facets));
41
+ const remove = el('button', { type: 'button', class: 'fd-favourite-remove', 'aria-label': fill(labels.deleteFavourite, { name: favourite.name }) }, '×');
42
+ remove.addEventListener('click', () => {
43
+ write(readFavourites(preferences, page).filter((f) => f.name !== favourite.name));
44
+ draw();
45
+ });
46
+ return el('li', { class: 'fd-favourite' }, use, remove);
47
+ }));
48
+ }
49
+ open.addEventListener('click', () => {
50
+ form.hidden = !form.hidden;
51
+ open.setAttribute('aria-expanded', String(!form.hidden));
52
+ if (!form.hidden)
53
+ name.focus();
54
+ });
55
+ save.addEventListener('click', () => {
56
+ const named = name.value.trim();
57
+ if (!named)
58
+ return name.focus();
59
+ const kept = { name: named, facets: context.current(), ...(byDefault.checked ? { isDefault: true } : {}) };
60
+ // A name kept again replaces the old search; one default at a time.
61
+ const others = readFavourites(preferences, page)
62
+ .filter((f) => f.name !== named)
63
+ .map((f) => (byDefault.checked ? { name: f.name, facets: f.facets } : f));
64
+ write([...others, kept]);
65
+ name.value = '';
66
+ byDefault.checked = false;
67
+ form.hidden = true;
68
+ open.setAttribute('aria-expanded', 'false');
69
+ draw();
70
+ });
71
+ draw();
72
+ return { list, none, open, form };
73
+ }
74
+ //# sourceMappingURL=favourites.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"favourites.js","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/favourites.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ const key = (page) => `favourites:${page.id}`;
2
+ export function readFavourites(preferences, page) {
3
+ const kept = preferences.get(key(page));
4
+ return Array.isArray(kept) ? kept : [];
5
+ }
6
+ /** What a list starts with: the favourite used by default, or else the list's own default filters. */
7
+ export function startingFacets(node, preferences, page) {
8
+ const chosen = readFavourites(preferences, page).find((favourite) => favourite.isDefault);
9
+ if (chosen)
10
+ return chosen.facets;
11
+ if (!node.defaultFilters?.length)
12
+ return [];
13
+ return [{ kind: 'filters', ids: [...node.defaultFilters], labels: node.defaultFilters.map((id) => node.filters?.find((f) => f.id === id)?.label ?? id) }];
14
+ }
15
+ /**
16
+ * The Favourites of the search menu: searches kept by name, each one put back
17
+ * with a click or deleted, and the search on screen kept as a new one, used by
18
+ * default if the person says so. Kept where the page keeps its preferences.
19
+ */
20
+ export function favouritesPart(context) {
21
+ const { page, el, labels, fill, preferences } = context;
22
+ const list = el('ul', { class: 'fd-favourite-list' });
23
+ const none = el('p', { class: 'fd-favourites-none' }, labels.noFavourites);
24
+ const name = el('input', { class: 'fd-input', 'aria-label': labels.searchName, placeholder: labels.searchName });
25
+ const byDefault = el('input', { type: 'checkbox' });
26
+ const save = el('button', { type: 'button', class: 'fd-button fd-button-primary' }, labels.save);
27
+ const form = el('div', { class: 'fd-favourite-form', hidden: '' }, name, el('label', { class: 'fd-favourite-default' }, byDefault, labels.useByDefault), save);
28
+ const open = el('button', { type: 'button', class: 'fd-search-option fd-search-add', 'aria-expanded': 'false' }, labels.saveSearch);
29
+ const write = (favourites) => preferences.set(key(page), favourites);
30
+ function draw() {
31
+ const favourites = readFavourites(preferences, page);
32
+ none.hidden = favourites.length > 0;
33
+ list.replaceChildren(...favourites.map((favourite) => {
34
+ const use = el('button', { type: 'button', class: 'fd-search-option', 'data-default': favourite.isDefault ? 'true' : undefined }, favourite.name);
35
+ use.addEventListener('click', () => context.apply(favourite.facets));
36
+ const remove = el('button', { type: 'button', class: 'fd-favourite-remove', 'aria-label': fill(labels.deleteFavourite, { name: favourite.name }) }, '×');
37
+ remove.addEventListener('click', () => {
38
+ write(readFavourites(preferences, page).filter((f) => f.name !== favourite.name));
39
+ draw();
40
+ });
41
+ return el('li', { class: 'fd-favourite' }, use, remove);
42
+ }));
43
+ }
44
+ open.addEventListener('click', () => {
45
+ form.hidden = !form.hidden;
46
+ open.setAttribute('aria-expanded', String(!form.hidden));
47
+ if (!form.hidden)
48
+ name.focus();
49
+ });
50
+ save.addEventListener('click', () => {
51
+ const named = name.value.trim();
52
+ if (!named)
53
+ return name.focus();
54
+ const kept = { name: named, facets: context.current(), ...(byDefault.checked ? { isDefault: true } : {}) };
55
+ // A name kept again replaces the old search; one default at a time.
56
+ const others = readFavourites(preferences, page)
57
+ .filter((f) => f.name !== named)
58
+ .map((f) => (byDefault.checked ? { name: f.name, facets: f.facets } : f));
59
+ write([...others, kept]);
60
+ name.value = '';
61
+ byDefault.checked = false;
62
+ form.hidden = true;
63
+ open.setAttribute('aria-expanded', 'false');
64
+ draw();
65
+ });
66
+ draw();
67
+ return { list, none, open, form };
68
+ }
69
+ //# sourceMappingURL=favourites.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"favourites.mjs","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/favourites.ts"],"names":[],"mappings":"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"}
@@ -37,6 +37,52 @@ export interface ViewerLabels {
37
37
  checkFields: string;
38
38
  /** The banner when the server cannot be reached. */
39
39
  offline: string;
40
+ /** A list: its pages (`{from}`, `{to}`, `{total}`), what is chosen in it, and an empty one. */
41
+ previousPage: string;
42
+ nextPage: string;
43
+ range: string;
44
+ selected: string;
45
+ clearSelection: string;
46
+ selectAll: string;
47
+ selectRecord: string;
48
+ noRecords: string;
49
+ loadFailed: string;
50
+ /**
51
+ * A list's search bar: the box (`{field}` and `{text}` in a suggestion), its
52
+ * chips (`{label}`), the Filters, Group By and Favourites menu (`{name}`),
53
+ * and the conditions a custom filter offers.
54
+ */
55
+ search: string;
56
+ searchLabel: string;
57
+ searchFor: string;
58
+ searchOptions: string;
59
+ filters: string;
60
+ groupBy: string;
61
+ favourites: string;
62
+ or: string;
63
+ removeFacet: string;
64
+ addCustomFilter: string;
65
+ field: string;
66
+ condition: string;
67
+ value: string;
68
+ apply: string;
69
+ saveSearch: string;
70
+ searchName: string;
71
+ useByDefault: string;
72
+ deleteFavourite: string;
73
+ noFavourites: string;
74
+ opIs: string;
75
+ opIsNot: string;
76
+ opContains: string;
77
+ opGreater: string;
78
+ opLess: string;
79
+ opSet: string;
80
+ opNotSet: string;
81
+ yes: string;
82
+ no: string;
83
+ /** A list's groups: the one of records with no value, and the rest of a group's records (`{n}`). */
84
+ none: string;
85
+ loadMore: string;
40
86
  }
41
87
  export declare const VIEWER_LABELS: Record<Locale, ViewerLabels>;
42
88
  /** English, kept under its old name. */