@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.
- package/README.md +10 -1
- package/bundle/fieldia.js +4 -607
- package/bundle/fieldia.js.map +4 -4
- package/package.json +3 -3
- package/src/lib/custom-filter.d.mts +16 -0
- package/src/lib/custom-filter.d.ts +16 -0
- package/src/lib/custom-filter.js +112 -0
- package/src/lib/custom-filter.js.map +1 -0
- package/src/lib/custom-filter.mjs +109 -0
- package/src/lib/custom-filter.mjs.map +1 -0
- package/src/lib/dom.d.mts +2 -0
- package/src/lib/dom.d.ts +2 -0
- package/src/lib/dom.js +3 -0
- package/src/lib/dom.js.map +1 -0
- package/src/lib/dom.mjs +2 -0
- package/src/lib/dom.mjs.map +1 -0
- package/src/lib/favourites.d.mts +32 -0
- package/src/lib/favourites.d.ts +32 -0
- package/src/lib/favourites.js +74 -0
- package/src/lib/favourites.js.map +1 -0
- package/src/lib/favourites.mjs +69 -0
- package/src/lib/favourites.mjs.map +1 -0
- package/src/lib/labels.d.mts +46 -0
- package/src/lib/labels.d.ts +46 -0
- package/src/lib/labels.js +156 -0
- package/src/lib/labels.js.map +1 -1
- package/src/lib/labels.mjs +156 -0
- package/src/lib/labels.mjs.map +1 -1
- package/src/lib/list-groups.d.mts +29 -0
- package/src/lib/list-groups.d.ts +29 -0
- package/src/lib/list-groups.js +86 -0
- package/src/lib/list-groups.js.map +1 -0
- package/src/lib/list-groups.mjs +83 -0
- package/src/lib/list-groups.mjs.map +1 -0
- package/src/lib/list-styles.d.mts +4 -0
- package/src/lib/list-styles.d.ts +4 -0
- package/src/lib/list-styles.js +108 -0
- package/src/lib/list-styles.js.map +1 -0
- package/src/lib/list-styles.mjs +104 -0
- package/src/lib/list-styles.mjs.map +1 -0
- package/src/lib/list.d.mts +34 -0
- package/src/lib/list.d.ts +34 -0
- package/src/lib/list.js +282 -0
- package/src/lib/list.js.map +1 -0
- package/src/lib/list.mjs +279 -0
- package/src/lib/list.mjs.map +1 -0
- package/src/lib/search-bar.d.mts +30 -0
- package/src/lib/search-bar.d.ts +30 -0
- package/src/lib/search-bar.js +205 -0
- package/src/lib/search-bar.js.map +1 -0
- package/src/lib/search-bar.mjs +201 -0
- package/src/lib/search-bar.mjs.map +1 -0
- package/src/lib/viewer.d.mts +3 -1
- package/src/lib/viewer.d.ts +3 -1
- package/src/lib/viewer.js +29 -1
- package/src/lib/viewer.js.map +1 -1
- package/src/lib/viewer.mjs +29 -1
- 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.
|
|
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.
|
|
28
|
-
"@fieldia/widgets": "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":"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"}
|
|
@@ -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];
|
package/src/lib/dom.d.ts
ADDED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"dom.js","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/dom.ts"],"names":[],"mappings":""}
|
package/src/lib/dom.mjs
ADDED
|
@@ -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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"}
|
package/src/lib/labels.d.mts
CHANGED
|
@@ -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. */
|