@fieldia/viewer 0.10.0 → 0.11.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 +126 -1
- package/bundle/fieldia.ar.js +2 -2
- package/bundle/fieldia.ar.js.map +2 -2
- package/bundle/fieldia.de.js +2 -2
- package/bundle/fieldia.de.js.map +2 -2
- package/bundle/fieldia.fr.js +2 -2
- package/bundle/fieldia.fr.js.map +2 -2
- package/bundle/fieldia.js +4 -4
- package/bundle/fieldia.js.map +4 -4
- package/package.json +3 -3
- package/src/lib/dialog.d.mts +29 -2
- package/src/lib/dialog.d.ts +29 -2
- package/src/lib/dialog.js +94 -27
- package/src/lib/dialog.js.map +1 -1
- package/src/lib/dialog.mjs +92 -27
- package/src/lib/dialog.mjs.map +1 -1
- package/src/lib/labels.d.mts +14 -0
- package/src/lib/labels.d.ts +14 -0
- package/src/lib/labels.js +6 -0
- package/src/lib/labels.js.map +1 -1
- package/src/lib/labels.mjs +6 -0
- package/src/lib/labels.mjs.map +1 -1
- package/src/lib/list.d.mts +3 -2
- package/src/lib/list.d.ts +3 -2
- package/src/lib/list.js +5 -5
- package/src/lib/list.js.map +1 -1
- package/src/lib/list.mjs +5 -5
- package/src/lib/list.mjs.map +1 -1
- package/src/lib/locales/ar.js +6 -0
- package/src/lib/locales/ar.js.map +1 -1
- package/src/lib/locales/ar.mjs +6 -0
- package/src/lib/locales/ar.mjs.map +1 -1
- package/src/lib/locales/de.js +6 -0
- package/src/lib/locales/de.js.map +1 -1
- package/src/lib/locales/de.mjs +6 -0
- package/src/lib/locales/de.mjs.map +1 -1
- package/src/lib/locales/fr.js +6 -0
- package/src/lib/locales/fr.js.map +1 -1
- package/src/lib/locales/fr.mjs +6 -0
- package/src/lib/locales/fr.mjs.map +1 -1
- package/src/lib/look.d.mts +7 -3
- package/src/lib/look.d.ts +7 -3
- package/src/lib/look.js +72 -15
- package/src/lib/look.js.map +1 -1
- package/src/lib/look.mjs +72 -15
- package/src/lib/look.mjs.map +1 -1
- package/src/lib/open.d.mts +24 -0
- package/src/lib/open.d.ts +24 -0
- package/src/lib/open.js +81 -0
- package/src/lib/open.js.map +1 -0
- package/src/lib/open.mjs +78 -0
- package/src/lib/open.mjs.map +1 -0
- package/src/lib/related.d.mts +19 -0
- package/src/lib/related.d.ts +19 -0
- package/src/lib/related.js +15 -2
- package/src/lib/related.js.map +1 -1
- package/src/lib/related.mjs +14 -2
- package/src/lib/related.mjs.map +1 -1
- package/src/lib/say.d.mts +9 -0
- package/src/lib/say.d.ts +9 -0
- package/src/lib/say.js +45 -0
- package/src/lib/say.js.map +1 -0
- package/src/lib/say.mjs +42 -0
- package/src/lib/say.mjs.map +1 -0
- package/src/lib/viewer.d.mts +33 -5
- package/src/lib/viewer.d.ts +33 -5
- package/src/lib/viewer.js +464 -279
- package/src/lib/viewer.js.map +1 -1
- package/src/lib/viewer.mjs +465 -280
- 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.11.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",
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"./package.json": "./package.json"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@fieldia/core": "0.
|
|
31
|
-
"@fieldia/widgets": "0.
|
|
30
|
+
"@fieldia/core": "0.11.0",
|
|
31
|
+
"@fieldia/widgets": "0.11.0",
|
|
32
32
|
"tslib": "^2.8.1"
|
|
33
33
|
},
|
|
34
34
|
"sideEffects": false,
|
package/src/lib/dialog.d.mts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import type { PageLook, RecordId, RelatedRecord, Values } from '@fieldia/core';
|
|
1
|
+
import type { PageLook, PanelSide, RecordId, RelatedRecord, Values } from '@fieldia/core';
|
|
2
2
|
import { type Skin, type ViewerOptions } from './viewer.mjs';
|
|
3
3
|
/**
|
|
4
4
|
* A page in a dialog: a new related record, a line to edit, a quick task. The
|
|
5
5
|
* dialog saves (Save & Close) or closes without saving (Discard, ×, Escape);
|
|
6
6
|
* the page's own Save and Discard stay hidden. The focus moves into the dialog,
|
|
7
7
|
* Tab stays inside it, and the focus goes back where it was when it closes.
|
|
8
|
+
* A side panel (`openFormPanel`) is the same box at the edge of the screen.
|
|
8
9
|
*/
|
|
9
10
|
export interface FormDialogOptions extends ViewerOptions {
|
|
10
11
|
title: string;
|
|
@@ -26,12 +27,38 @@ export interface FormDialogOptions extends ViewerOptions {
|
|
|
26
27
|
look?: PageLook;
|
|
27
28
|
}
|
|
28
29
|
export interface FormDialogResult {
|
|
29
|
-
/** True when Save & Close was pressed and the form accepted. */
|
|
30
|
+
/** True when Save & Close (Done, in a panel in "values" mode) was pressed and the form accepted. */
|
|
30
31
|
saved: boolean;
|
|
31
32
|
recordId: RecordId | null;
|
|
32
33
|
values: Values;
|
|
33
34
|
}
|
|
35
|
+
/** A page in a side panel: the dialog's options, with the edge it comes from and its depth in place of a size. */
|
|
36
|
+
export interface FormPanelOptions extends Omit<FormDialogOptions, 'size'> {
|
|
37
|
+
/**
|
|
38
|
+
* The edge it comes from: `end` (the default: the end of the line, the right,
|
|
39
|
+
* or the left right to left) or `start`, as the page reads; or `left`,
|
|
40
|
+
* `right`, `top` or `bottom` of the screen, whatever the page's direction.
|
|
41
|
+
*/
|
|
42
|
+
side?: PanelSide;
|
|
43
|
+
/** A panel at the end, start, left or right: about 420, 560 (the default) or 720 pixels wide on a wide screen; the whole screen on a phone. */
|
|
44
|
+
width?: 'narrow' | 'medium' | 'wide';
|
|
45
|
+
/** A panel at the top or bottom, the whole width: about 40, 60 (the default) or 85 in a hundred of the screen's height; the whole screen on a phone. */
|
|
46
|
+
height?: 'short' | 'medium' | 'tall';
|
|
47
|
+
}
|
|
48
|
+
/** The first box to type or choose in, where a page opened takes the focus. */
|
|
49
|
+
export declare const FIRST_FIELD = "input:not([type=\"hidden\"]), select, textarea, [contenteditable=\"true\"]";
|
|
34
50
|
export declare function openFormDialog(options: FormDialogOptions): Promise<FormDialogResult>;
|
|
51
|
+
/**
|
|
52
|
+
* A page in a side panel: the dialog's twin, at full height along the
|
|
53
|
+
* inline-end edge (the left, right to left) unless it names another `side` —
|
|
54
|
+
* the whole width along the top or the bottom — the page behind dimmed but in
|
|
55
|
+
* sight; a full-screen sheet on a phone, from above for the top, from below
|
|
56
|
+
* for the rest. It saves, or in "values" mode hands back its values with
|
|
57
|
+
* Done, as the dialog does; Escape and × ask first when there are changes to
|
|
58
|
+
* lose. A dialog opened from it sits above it, and a panel opened from it
|
|
59
|
+
* stacks over it, this one stepped back from its own edge.
|
|
60
|
+
*/
|
|
61
|
+
export declare function openFormPanel(options: FormPanelOptions): Promise<FormDialogResult>;
|
|
35
62
|
export interface SearchDialogOptions {
|
|
36
63
|
title: string;
|
|
37
64
|
/** Finds records for what is typed: the field's own search, filter and all. */
|
package/src/lib/dialog.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import type { PageLook, RecordId, RelatedRecord, Values } from '@fieldia/core';
|
|
1
|
+
import type { PageLook, PanelSide, RecordId, RelatedRecord, Values } from '@fieldia/core';
|
|
2
2
|
import { type Skin, type ViewerOptions } from './viewer';
|
|
3
3
|
/**
|
|
4
4
|
* A page in a dialog: a new related record, a line to edit, a quick task. The
|
|
5
5
|
* dialog saves (Save & Close) or closes without saving (Discard, ×, Escape);
|
|
6
6
|
* the page's own Save and Discard stay hidden. The focus moves into the dialog,
|
|
7
7
|
* Tab stays inside it, and the focus goes back where it was when it closes.
|
|
8
|
+
* A side panel (`openFormPanel`) is the same box at the edge of the screen.
|
|
8
9
|
*/
|
|
9
10
|
export interface FormDialogOptions extends ViewerOptions {
|
|
10
11
|
title: string;
|
|
@@ -26,12 +27,38 @@ export interface FormDialogOptions extends ViewerOptions {
|
|
|
26
27
|
look?: PageLook;
|
|
27
28
|
}
|
|
28
29
|
export interface FormDialogResult {
|
|
29
|
-
/** True when Save & Close was pressed and the form accepted. */
|
|
30
|
+
/** True when Save & Close (Done, in a panel in "values" mode) was pressed and the form accepted. */
|
|
30
31
|
saved: boolean;
|
|
31
32
|
recordId: RecordId | null;
|
|
32
33
|
values: Values;
|
|
33
34
|
}
|
|
35
|
+
/** A page in a side panel: the dialog's options, with the edge it comes from and its depth in place of a size. */
|
|
36
|
+
export interface FormPanelOptions extends Omit<FormDialogOptions, 'size'> {
|
|
37
|
+
/**
|
|
38
|
+
* The edge it comes from: `end` (the default: the end of the line, the right,
|
|
39
|
+
* or the left right to left) or `start`, as the page reads; or `left`,
|
|
40
|
+
* `right`, `top` or `bottom` of the screen, whatever the page's direction.
|
|
41
|
+
*/
|
|
42
|
+
side?: PanelSide;
|
|
43
|
+
/** A panel at the end, start, left or right: about 420, 560 (the default) or 720 pixels wide on a wide screen; the whole screen on a phone. */
|
|
44
|
+
width?: 'narrow' | 'medium' | 'wide';
|
|
45
|
+
/** A panel at the top or bottom, the whole width: about 40, 60 (the default) or 85 in a hundred of the screen's height; the whole screen on a phone. */
|
|
46
|
+
height?: 'short' | 'medium' | 'tall';
|
|
47
|
+
}
|
|
48
|
+
/** The first box to type or choose in, where a page opened takes the focus. */
|
|
49
|
+
export declare const FIRST_FIELD = "input:not([type=\"hidden\"]), select, textarea, [contenteditable=\"true\"]";
|
|
34
50
|
export declare function openFormDialog(options: FormDialogOptions): Promise<FormDialogResult>;
|
|
51
|
+
/**
|
|
52
|
+
* A page in a side panel: the dialog's twin, at full height along the
|
|
53
|
+
* inline-end edge (the left, right to left) unless it names another `side` —
|
|
54
|
+
* the whole width along the top or the bottom — the page behind dimmed but in
|
|
55
|
+
* sight; a full-screen sheet on a phone, from above for the top, from below
|
|
56
|
+
* for the rest. It saves, or in "values" mode hands back its values with
|
|
57
|
+
* Done, as the dialog does; Escape and × ask first when there are changes to
|
|
58
|
+
* lose. A dialog opened from it sits above it, and a panel opened from it
|
|
59
|
+
* stacks over it, this one stepped back from its own edge.
|
|
60
|
+
*/
|
|
61
|
+
export declare function openFormPanel(options: FormPanelOptions): Promise<FormDialogResult>;
|
|
35
62
|
export interface SearchDialogOptions {
|
|
36
63
|
title: string;
|
|
37
64
|
/** Finds records for what is typed: the field's own search, filter and all. */
|
package/src/lib/dialog.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FIRST_FIELD = void 0;
|
|
3
4
|
exports.openFormDialog = openFormDialog;
|
|
5
|
+
exports.openFormPanel = openFormPanel;
|
|
4
6
|
exports.openSearchDialog = openSearchDialog;
|
|
5
7
|
const widgets_1 = require("@fieldia/widgets");
|
|
6
8
|
const labels_1 = require("./labels");
|
|
@@ -8,34 +10,59 @@ const focus_trap_1 = require("./focus-trap");
|
|
|
8
10
|
const look_1 = require("./look");
|
|
9
11
|
const viewer_1 = require("./viewer");
|
|
10
12
|
let dialogs = 0;
|
|
13
|
+
/** The first box to type or choose in, where a page opened takes the focus. */
|
|
14
|
+
exports.FIRST_FIELD = 'input:not([type="hidden"]), select, textarea, [contenteditable="true"]';
|
|
15
|
+
/** The dialogs' way to make an element of a document: a tag, its attributes, and its words. */
|
|
16
|
+
const maker = (doc) => (tag, attrs = {}, text) => {
|
|
17
|
+
const element = doc.createElement(tag);
|
|
18
|
+
for (const [name, value] of Object.entries(attrs))
|
|
19
|
+
element.setAttribute(name, value);
|
|
20
|
+
if (text !== undefined)
|
|
21
|
+
element.textContent = text;
|
|
22
|
+
return element;
|
|
23
|
+
};
|
|
11
24
|
function openFormDialog(options) {
|
|
25
|
+
return openForm(options, `fd-size-${options.size ?? 'medium'}`);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* A page in a side panel: the dialog's twin, at full height along the
|
|
29
|
+
* inline-end edge (the left, right to left) unless it names another `side` —
|
|
30
|
+
* the whole width along the top or the bottom — the page behind dimmed but in
|
|
31
|
+
* sight; a full-screen sheet on a phone, from above for the top, from below
|
|
32
|
+
* for the rest. It saves, or in "values" mode hands back its values with
|
|
33
|
+
* Done, as the dialog does; Escape and × ask first when there are changes to
|
|
34
|
+
* lose. A dialog opened from it sits above it, and a panel opened from it
|
|
35
|
+
* stacks over it, this one stepped back from its own edge.
|
|
36
|
+
*/
|
|
37
|
+
function openFormPanel(options) {
|
|
38
|
+
const side = options.side ?? 'end';
|
|
39
|
+
return openForm(options, `fd-form-panel ${side === 'top' || side === 'bottom' ? `fd-height-${options.height ?? 'medium'}` : `fd-width-${options.width ?? 'medium'}`}`, side);
|
|
40
|
+
}
|
|
41
|
+
/** A dialog or a panel (from its side): a page in a box with a head, a body that scrolls and a foot; `shape` is the box's own classes. */
|
|
42
|
+
function openForm(options, shape, side) {
|
|
43
|
+
const panel = !!side;
|
|
12
44
|
const doc = options.container?.ownerDocument ?? document;
|
|
13
45
|
const container = options.container ?? doc.body;
|
|
14
46
|
const opener = doc.activeElement instanceof doc.defaultView.HTMLElement ? doc.activeElement : null;
|
|
15
47
|
const labels = { ...viewer_1.VIEWER_LABELS[(0, labels_1.ownLocale)(options.locale)], ...options.labels };
|
|
16
48
|
const id = `fd-dialog-${++dialogs}`;
|
|
17
|
-
const make = (
|
|
18
|
-
const element = doc.createElement(tag);
|
|
19
|
-
for (const [name, value] of Object.entries(attrs))
|
|
20
|
-
element.setAttribute(name, value);
|
|
21
|
-
if (text !== undefined)
|
|
22
|
-
element.textContent = text;
|
|
23
|
-
return element;
|
|
24
|
-
};
|
|
49
|
+
const make = maker(doc);
|
|
25
50
|
const title = make('h2', { id: `${id}-title`, class: 'fd-form-dialog-title' }, options.title);
|
|
26
51
|
const closeButton = make('button', { type: 'button', class: 'fd-dialog-close', 'aria-label': labels.close }, '×');
|
|
27
52
|
const body = make('div', { class: 'fd-form-dialog-body' });
|
|
28
53
|
const discard = make('button', { type: 'button', class: 'fd-button' }, labels.discard);
|
|
29
|
-
const saveClose = make('button', { type: 'button', class: 'fd-button fd-button-primary' }, labels.saveClose);
|
|
54
|
+
const saveClose = make('button', { type: 'button', class: 'fd-button fd-button-primary' }, panel && options.mode === 'values' ? labels.done : labels.saveClose);
|
|
30
55
|
const box = make('div', {
|
|
31
56
|
// Its own tokens and skin: the dialog sits outside the page that opened it.
|
|
32
|
-
class: `fd-theme fd-form-dialog
|
|
57
|
+
class: `fd-theme fd-form-dialog ${shape}`,
|
|
33
58
|
'data-fd-skin': options.skin ?? 'underline',
|
|
34
59
|
role: 'dialog',
|
|
35
60
|
'aria-modal': 'true',
|
|
36
61
|
'aria-labelledby': title.id,
|
|
37
62
|
tabindex: '-1',
|
|
38
63
|
});
|
|
64
|
+
if (side)
|
|
65
|
+
box.setAttribute('data-side', side);
|
|
39
66
|
if (options.dir)
|
|
40
67
|
box.setAttribute('dir', options.dir);
|
|
41
68
|
// One look for the box and the page in it: the page's own, else the opener's.
|
|
@@ -44,15 +71,27 @@ function openFormDialog(options) {
|
|
|
44
71
|
box.append(make('div', { class: 'fd-form-dialog-head' }), body, make('div', { class: 'fd-actions fd-actions-end fd-form-dialog-foot' }));
|
|
45
72
|
box.firstElementChild?.append(title, closeButton);
|
|
46
73
|
box.lastElementChild?.append(discard, saveClose);
|
|
47
|
-
const backdrop = make('div', { class:
|
|
74
|
+
const backdrop = make('div', { class: `fd-dialog-backdrop fd-form-dialog-backdrop${panel ? ' fd-form-panel-backdrop' : ''}` });
|
|
48
75
|
backdrop.append(box);
|
|
76
|
+
// The panel this one opens over steps back while it is open.
|
|
77
|
+
const under = panel ? [...doc.querySelectorAll('.fd-form-panel')].pop() : undefined;
|
|
78
|
+
under?.setAttribute('data-behind', '');
|
|
49
79
|
container.append(backdrop);
|
|
50
|
-
|
|
80
|
+
// A host of its own, so its steps run here too: a `close` step closes it unsaved.
|
|
81
|
+
const handle = (0, viewer_1.mountViewer)(body, {
|
|
82
|
+
...options,
|
|
83
|
+
page: look && !options.page.look ? { ...options.page, look } : options.page,
|
|
84
|
+
showActions: false,
|
|
85
|
+
host: { ...options.host, close: () => discard.click() },
|
|
86
|
+
});
|
|
87
|
+
// A panel runs the way its page does, its language's way unless told: the inline end it sits at is the left, right to left.
|
|
88
|
+
if (panel && handle.element.dir)
|
|
89
|
+
backdrop.dir = handle.element.dir;
|
|
51
90
|
let done = false;
|
|
52
91
|
if (options.recompute)
|
|
53
92
|
recalculate(handle.form, options.page.fields, options.recompute, () => done);
|
|
54
93
|
// Into the dialog: its first field, once the record is in, or the dialog itself meanwhile.
|
|
55
|
-
const firstField = () => body.querySelector(
|
|
94
|
+
const firstField = () => body.querySelector(exports.FIRST_FIELD);
|
|
56
95
|
(firstField() ?? box).focus();
|
|
57
96
|
void handle.form.settled().then(() => {
|
|
58
97
|
if (doc.activeElement === box || !box.contains(doc.activeElement))
|
|
@@ -68,9 +107,44 @@ function openFormDialog(options) {
|
|
|
68
107
|
const result = { saved, recordId: state.recordId ?? null, values: state.values };
|
|
69
108
|
handle.destroy();
|
|
70
109
|
backdrop.remove();
|
|
110
|
+
under?.removeAttribute('data-behind');
|
|
71
111
|
opener?.focus();
|
|
72
112
|
resolve(result);
|
|
73
113
|
};
|
|
114
|
+
/** "Discard your changes?" over the panel, the focus on Cancel; true for Discard. Its keys are its own. */
|
|
115
|
+
const ask = () => new Promise((answer) => {
|
|
116
|
+
const was = doc.activeElement;
|
|
117
|
+
const text = make('p', { id: `${id}-ask` }, labels.discardChanges);
|
|
118
|
+
const no = make('button', { type: 'button', class: 'fd-button' }, labels.cancel);
|
|
119
|
+
const yes = make('button', { type: 'button', class: 'fd-button fd-button-primary' }, labels.discard);
|
|
120
|
+
const buttons = make('div', { class: 'fd-actions fd-actions-end' });
|
|
121
|
+
const question = make('div', { class: 'fd-dialog', role: 'alertdialog', 'aria-modal': 'true', 'aria-labelledby': text.id });
|
|
122
|
+
const shade = make('div', { class: 'fd-dialog-backdrop' });
|
|
123
|
+
buttons.append(no, yes);
|
|
124
|
+
question.append(text, buttons);
|
|
125
|
+
shade.append(question);
|
|
126
|
+
const end = (discarding) => {
|
|
127
|
+
shade.remove();
|
|
128
|
+
was?.focus();
|
|
129
|
+
answer(discarding);
|
|
130
|
+
};
|
|
131
|
+
no.addEventListener('click', () => end(false));
|
|
132
|
+
yes.addEventListener('click', () => end(true));
|
|
133
|
+
shade.addEventListener('keydown', (event) => {
|
|
134
|
+
event.stopPropagation();
|
|
135
|
+
if (event.key === 'Escape')
|
|
136
|
+
end(false);
|
|
137
|
+
else
|
|
138
|
+
(0, focus_trap_1.keepTabIn)(question, event);
|
|
139
|
+
});
|
|
140
|
+
box.append(shade);
|
|
141
|
+
no.focus();
|
|
142
|
+
});
|
|
143
|
+
/** Escape and ×: a panel with changes in it asks first; a dialog closes at once, as it always has. */
|
|
144
|
+
const leave = async () => {
|
|
145
|
+
if (!panel || !handle.form.getState().dirty.length || (await ask()))
|
|
146
|
+
close(false);
|
|
147
|
+
};
|
|
74
148
|
saveClose.addEventListener('click', async () => {
|
|
75
149
|
saveClose.disabled = true;
|
|
76
150
|
const accepted = options.mode === 'values' ? handle.check() : await handle.save();
|
|
@@ -79,7 +153,7 @@ function openFormDialog(options) {
|
|
|
79
153
|
close(true);
|
|
80
154
|
});
|
|
81
155
|
discard.addEventListener('click', () => close(false));
|
|
82
|
-
closeButton.addEventListener('click',
|
|
156
|
+
closeButton.addEventListener('click', leave);
|
|
83
157
|
box.addEventListener('keydown', (event) => {
|
|
84
158
|
// Ctrl+Enter is Save & Close from wherever the cursor is, even after a field used the Enter
|
|
85
159
|
// (a tag box adding its tag), taking what is still being typed. The grid keeps its own keys.
|
|
@@ -96,7 +170,7 @@ function openFormDialog(options) {
|
|
|
96
170
|
return;
|
|
97
171
|
if (event.key === 'Escape') {
|
|
98
172
|
event.preventDefault();
|
|
99
|
-
|
|
173
|
+
void leave();
|
|
100
174
|
}
|
|
101
175
|
else
|
|
102
176
|
(0, focus_trap_1.keepTabIn)(box, event);
|
|
@@ -117,10 +191,10 @@ function recalculate(form, fields, recompute, closed) {
|
|
|
117
191
|
if (closed() || JSON.stringify(form.getState().values) !== now)
|
|
118
192
|
return; // a newer answer is on its way
|
|
119
193
|
writing = true;
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
194
|
+
// The answer is the app's change, not a person's: the page's change steps do not run for it.
|
|
195
|
+
const changed = Object.fromEntries(Object.entries(next).filter(([name, value]) => name in fields && JSON.stringify(values[name] ?? null) !== JSON.stringify(value ?? null)));
|
|
196
|
+
if (Object.keys(changed).length)
|
|
197
|
+
form.setValues(changed);
|
|
124
198
|
writing = false;
|
|
125
199
|
seen = JSON.stringify(form.getState().values);
|
|
126
200
|
}, () => undefined);
|
|
@@ -139,14 +213,7 @@ function openSearchDialog(options) {
|
|
|
139
213
|
const labels = viewer_1.VIEWER_LABELS[locale];
|
|
140
214
|
const words = widgets_1.WIDGET_LABELS[locale];
|
|
141
215
|
const id = `fd-dialog-${++dialogs}`;
|
|
142
|
-
const make = (
|
|
143
|
-
const element = doc.createElement(tag);
|
|
144
|
-
for (const [name, value] of Object.entries(attrs))
|
|
145
|
-
element.setAttribute(name, value);
|
|
146
|
-
if (text !== undefined)
|
|
147
|
-
element.textContent = text;
|
|
148
|
-
return element;
|
|
149
|
-
};
|
|
216
|
+
const make = maker(doc);
|
|
150
217
|
const title = make('h2', { id: `${id}-title`, class: 'fd-form-dialog-title' }, options.title);
|
|
151
218
|
const closeButton = make('button', { type: 'button', class: 'fd-dialog-close', 'aria-label': labels.close }, '×');
|
|
152
219
|
const query = make('input', { type: 'search', class: 'fd-input', 'aria-label': words.search, placeholder: words.search, 'aria-controls': `${id}-list`, autocomplete: 'off' });
|
package/src/lib/dialog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dialog.js","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/dialog.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dialog.js","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/dialog.ts"],"names":[],"mappings":"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"}
|
package/src/lib/dialog.mjs
CHANGED
|
@@ -4,34 +4,59 @@ import { keepTabIn } from './focus-trap.mjs';
|
|
|
4
4
|
import { applyLook } from './look.mjs';
|
|
5
5
|
import { mountViewer, VIEWER_LABELS } from './viewer.mjs';
|
|
6
6
|
let dialogs = 0;
|
|
7
|
+
/** The first box to type or choose in, where a page opened takes the focus. */
|
|
8
|
+
export const FIRST_FIELD = 'input:not([type="hidden"]), select, textarea, [contenteditable="true"]';
|
|
9
|
+
/** The dialogs' way to make an element of a document: a tag, its attributes, and its words. */
|
|
10
|
+
const maker = (doc) => (tag, attrs = {}, text) => {
|
|
11
|
+
const element = doc.createElement(tag);
|
|
12
|
+
for (const [name, value] of Object.entries(attrs))
|
|
13
|
+
element.setAttribute(name, value);
|
|
14
|
+
if (text !== undefined)
|
|
15
|
+
element.textContent = text;
|
|
16
|
+
return element;
|
|
17
|
+
};
|
|
7
18
|
export function openFormDialog(options) {
|
|
19
|
+
return openForm(options, `fd-size-${options.size ?? 'medium'}`);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* A page in a side panel: the dialog's twin, at full height along the
|
|
23
|
+
* inline-end edge (the left, right to left) unless it names another `side` —
|
|
24
|
+
* the whole width along the top or the bottom — the page behind dimmed but in
|
|
25
|
+
* sight; a full-screen sheet on a phone, from above for the top, from below
|
|
26
|
+
* for the rest. It saves, or in "values" mode hands back its values with
|
|
27
|
+
* Done, as the dialog does; Escape and × ask first when there are changes to
|
|
28
|
+
* lose. A dialog opened from it sits above it, and a panel opened from it
|
|
29
|
+
* stacks over it, this one stepped back from its own edge.
|
|
30
|
+
*/
|
|
31
|
+
export function openFormPanel(options) {
|
|
32
|
+
const side = options.side ?? 'end';
|
|
33
|
+
return openForm(options, `fd-form-panel ${side === 'top' || side === 'bottom' ? `fd-height-${options.height ?? 'medium'}` : `fd-width-${options.width ?? 'medium'}`}`, side);
|
|
34
|
+
}
|
|
35
|
+
/** A dialog or a panel (from its side): a page in a box with a head, a body that scrolls and a foot; `shape` is the box's own classes. */
|
|
36
|
+
function openForm(options, shape, side) {
|
|
37
|
+
const panel = !!side;
|
|
8
38
|
const doc = options.container?.ownerDocument ?? document;
|
|
9
39
|
const container = options.container ?? doc.body;
|
|
10
40
|
const opener = doc.activeElement instanceof doc.defaultView.HTMLElement ? doc.activeElement : null;
|
|
11
41
|
const labels = { ...VIEWER_LABELS[ownLocale(options.locale)], ...options.labels };
|
|
12
42
|
const id = `fd-dialog-${++dialogs}`;
|
|
13
|
-
const make = (
|
|
14
|
-
const element = doc.createElement(tag);
|
|
15
|
-
for (const [name, value] of Object.entries(attrs))
|
|
16
|
-
element.setAttribute(name, value);
|
|
17
|
-
if (text !== undefined)
|
|
18
|
-
element.textContent = text;
|
|
19
|
-
return element;
|
|
20
|
-
};
|
|
43
|
+
const make = maker(doc);
|
|
21
44
|
const title = make('h2', { id: `${id}-title`, class: 'fd-form-dialog-title' }, options.title);
|
|
22
45
|
const closeButton = make('button', { type: 'button', class: 'fd-dialog-close', 'aria-label': labels.close }, '×');
|
|
23
46
|
const body = make('div', { class: 'fd-form-dialog-body' });
|
|
24
47
|
const discard = make('button', { type: 'button', class: 'fd-button' }, labels.discard);
|
|
25
|
-
const saveClose = make('button', { type: 'button', class: 'fd-button fd-button-primary' }, labels.saveClose);
|
|
48
|
+
const saveClose = make('button', { type: 'button', class: 'fd-button fd-button-primary' }, panel && options.mode === 'values' ? labels.done : labels.saveClose);
|
|
26
49
|
const box = make('div', {
|
|
27
50
|
// Its own tokens and skin: the dialog sits outside the page that opened it.
|
|
28
|
-
class: `fd-theme fd-form-dialog
|
|
51
|
+
class: `fd-theme fd-form-dialog ${shape}`,
|
|
29
52
|
'data-fd-skin': options.skin ?? 'underline',
|
|
30
53
|
role: 'dialog',
|
|
31
54
|
'aria-modal': 'true',
|
|
32
55
|
'aria-labelledby': title.id,
|
|
33
56
|
tabindex: '-1',
|
|
34
57
|
});
|
|
58
|
+
if (side)
|
|
59
|
+
box.setAttribute('data-side', side);
|
|
35
60
|
if (options.dir)
|
|
36
61
|
box.setAttribute('dir', options.dir);
|
|
37
62
|
// One look for the box and the page in it: the page's own, else the opener's.
|
|
@@ -40,15 +65,27 @@ export function openFormDialog(options) {
|
|
|
40
65
|
box.append(make('div', { class: 'fd-form-dialog-head' }), body, make('div', { class: 'fd-actions fd-actions-end fd-form-dialog-foot' }));
|
|
41
66
|
box.firstElementChild?.append(title, closeButton);
|
|
42
67
|
box.lastElementChild?.append(discard, saveClose);
|
|
43
|
-
const backdrop = make('div', { class:
|
|
68
|
+
const backdrop = make('div', { class: `fd-dialog-backdrop fd-form-dialog-backdrop${panel ? ' fd-form-panel-backdrop' : ''}` });
|
|
44
69
|
backdrop.append(box);
|
|
70
|
+
// The panel this one opens over steps back while it is open.
|
|
71
|
+
const under = panel ? [...doc.querySelectorAll('.fd-form-panel')].pop() : undefined;
|
|
72
|
+
under?.setAttribute('data-behind', '');
|
|
45
73
|
container.append(backdrop);
|
|
46
|
-
|
|
74
|
+
// A host of its own, so its steps run here too: a `close` step closes it unsaved.
|
|
75
|
+
const handle = mountViewer(body, {
|
|
76
|
+
...options,
|
|
77
|
+
page: look && !options.page.look ? { ...options.page, look } : options.page,
|
|
78
|
+
showActions: false,
|
|
79
|
+
host: { ...options.host, close: () => discard.click() },
|
|
80
|
+
});
|
|
81
|
+
// A panel runs the way its page does, its language's way unless told: the inline end it sits at is the left, right to left.
|
|
82
|
+
if (panel && handle.element.dir)
|
|
83
|
+
backdrop.dir = handle.element.dir;
|
|
47
84
|
let done = false;
|
|
48
85
|
if (options.recompute)
|
|
49
86
|
recalculate(handle.form, options.page.fields, options.recompute, () => done);
|
|
50
87
|
// Into the dialog: its first field, once the record is in, or the dialog itself meanwhile.
|
|
51
|
-
const firstField = () => body.querySelector(
|
|
88
|
+
const firstField = () => body.querySelector(FIRST_FIELD);
|
|
52
89
|
(firstField() ?? box).focus();
|
|
53
90
|
void handle.form.settled().then(() => {
|
|
54
91
|
if (doc.activeElement === box || !box.contains(doc.activeElement))
|
|
@@ -64,9 +101,44 @@ export function openFormDialog(options) {
|
|
|
64
101
|
const result = { saved, recordId: state.recordId ?? null, values: state.values };
|
|
65
102
|
handle.destroy();
|
|
66
103
|
backdrop.remove();
|
|
104
|
+
under?.removeAttribute('data-behind');
|
|
67
105
|
opener?.focus();
|
|
68
106
|
resolve(result);
|
|
69
107
|
};
|
|
108
|
+
/** "Discard your changes?" over the panel, the focus on Cancel; true for Discard. Its keys are its own. */
|
|
109
|
+
const ask = () => new Promise((answer) => {
|
|
110
|
+
const was = doc.activeElement;
|
|
111
|
+
const text = make('p', { id: `${id}-ask` }, labels.discardChanges);
|
|
112
|
+
const no = make('button', { type: 'button', class: 'fd-button' }, labels.cancel);
|
|
113
|
+
const yes = make('button', { type: 'button', class: 'fd-button fd-button-primary' }, labels.discard);
|
|
114
|
+
const buttons = make('div', { class: 'fd-actions fd-actions-end' });
|
|
115
|
+
const question = make('div', { class: 'fd-dialog', role: 'alertdialog', 'aria-modal': 'true', 'aria-labelledby': text.id });
|
|
116
|
+
const shade = make('div', { class: 'fd-dialog-backdrop' });
|
|
117
|
+
buttons.append(no, yes);
|
|
118
|
+
question.append(text, buttons);
|
|
119
|
+
shade.append(question);
|
|
120
|
+
const end = (discarding) => {
|
|
121
|
+
shade.remove();
|
|
122
|
+
was?.focus();
|
|
123
|
+
answer(discarding);
|
|
124
|
+
};
|
|
125
|
+
no.addEventListener('click', () => end(false));
|
|
126
|
+
yes.addEventListener('click', () => end(true));
|
|
127
|
+
shade.addEventListener('keydown', (event) => {
|
|
128
|
+
event.stopPropagation();
|
|
129
|
+
if (event.key === 'Escape')
|
|
130
|
+
end(false);
|
|
131
|
+
else
|
|
132
|
+
keepTabIn(question, event);
|
|
133
|
+
});
|
|
134
|
+
box.append(shade);
|
|
135
|
+
no.focus();
|
|
136
|
+
});
|
|
137
|
+
/** Escape and ×: a panel with changes in it asks first; a dialog closes at once, as it always has. */
|
|
138
|
+
const leave = async () => {
|
|
139
|
+
if (!panel || !handle.form.getState().dirty.length || (await ask()))
|
|
140
|
+
close(false);
|
|
141
|
+
};
|
|
70
142
|
saveClose.addEventListener('click', async () => {
|
|
71
143
|
saveClose.disabled = true;
|
|
72
144
|
const accepted = options.mode === 'values' ? handle.check() : await handle.save();
|
|
@@ -75,7 +147,7 @@ export function openFormDialog(options) {
|
|
|
75
147
|
close(true);
|
|
76
148
|
});
|
|
77
149
|
discard.addEventListener('click', () => close(false));
|
|
78
|
-
closeButton.addEventListener('click',
|
|
150
|
+
closeButton.addEventListener('click', leave);
|
|
79
151
|
box.addEventListener('keydown', (event) => {
|
|
80
152
|
// Ctrl+Enter is Save & Close from wherever the cursor is, even after a field used the Enter
|
|
81
153
|
// (a tag box adding its tag), taking what is still being typed. The grid keeps its own keys.
|
|
@@ -92,7 +164,7 @@ export function openFormDialog(options) {
|
|
|
92
164
|
return;
|
|
93
165
|
if (event.key === 'Escape') {
|
|
94
166
|
event.preventDefault();
|
|
95
|
-
|
|
167
|
+
void leave();
|
|
96
168
|
}
|
|
97
169
|
else
|
|
98
170
|
keepTabIn(box, event);
|
|
@@ -113,10 +185,10 @@ function recalculate(form, fields, recompute, closed) {
|
|
|
113
185
|
if (closed() || JSON.stringify(form.getState().values) !== now)
|
|
114
186
|
return; // a newer answer is on its way
|
|
115
187
|
writing = true;
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
188
|
+
// The answer is the app's change, not a person's: the page's change steps do not run for it.
|
|
189
|
+
const changed = Object.fromEntries(Object.entries(next).filter(([name, value]) => name in fields && JSON.stringify(values[name] ?? null) !== JSON.stringify(value ?? null)));
|
|
190
|
+
if (Object.keys(changed).length)
|
|
191
|
+
form.setValues(changed);
|
|
120
192
|
writing = false;
|
|
121
193
|
seen = JSON.stringify(form.getState().values);
|
|
122
194
|
}, () => undefined);
|
|
@@ -135,14 +207,7 @@ export function openSearchDialog(options) {
|
|
|
135
207
|
const labels = VIEWER_LABELS[locale];
|
|
136
208
|
const words = WIDGET_LABELS[locale];
|
|
137
209
|
const id = `fd-dialog-${++dialogs}`;
|
|
138
|
-
const make = (
|
|
139
|
-
const element = doc.createElement(tag);
|
|
140
|
-
for (const [name, value] of Object.entries(attrs))
|
|
141
|
-
element.setAttribute(name, value);
|
|
142
|
-
if (text !== undefined)
|
|
143
|
-
element.textContent = text;
|
|
144
|
-
return element;
|
|
145
|
-
};
|
|
210
|
+
const make = maker(doc);
|
|
146
211
|
const title = make('h2', { id: `${id}-title`, class: 'fd-form-dialog-title' }, options.title);
|
|
147
212
|
const closeButton = make('button', { type: 'button', class: 'fd-dialog-close', 'aria-label': labels.close }, '×');
|
|
148
213
|
const query = make('input', { type: 'search', class: 'fd-input', 'aria-label': words.search, placeholder: words.search, 'aria-controls': `${id}-list`, autocomplete: 'off' });
|