@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.
Files changed (70) hide show
  1. package/README.md +126 -1
  2. package/bundle/fieldia.ar.js +2 -2
  3. package/bundle/fieldia.ar.js.map +2 -2
  4. package/bundle/fieldia.de.js +2 -2
  5. package/bundle/fieldia.de.js.map +2 -2
  6. package/bundle/fieldia.fr.js +2 -2
  7. package/bundle/fieldia.fr.js.map +2 -2
  8. package/bundle/fieldia.js +4 -4
  9. package/bundle/fieldia.js.map +4 -4
  10. package/package.json +3 -3
  11. package/src/lib/dialog.d.mts +29 -2
  12. package/src/lib/dialog.d.ts +29 -2
  13. package/src/lib/dialog.js +94 -27
  14. package/src/lib/dialog.js.map +1 -1
  15. package/src/lib/dialog.mjs +92 -27
  16. package/src/lib/dialog.mjs.map +1 -1
  17. package/src/lib/labels.d.mts +14 -0
  18. package/src/lib/labels.d.ts +14 -0
  19. package/src/lib/labels.js +6 -0
  20. package/src/lib/labels.js.map +1 -1
  21. package/src/lib/labels.mjs +6 -0
  22. package/src/lib/labels.mjs.map +1 -1
  23. package/src/lib/list.d.mts +3 -2
  24. package/src/lib/list.d.ts +3 -2
  25. package/src/lib/list.js +5 -5
  26. package/src/lib/list.js.map +1 -1
  27. package/src/lib/list.mjs +5 -5
  28. package/src/lib/list.mjs.map +1 -1
  29. package/src/lib/locales/ar.js +6 -0
  30. package/src/lib/locales/ar.js.map +1 -1
  31. package/src/lib/locales/ar.mjs +6 -0
  32. package/src/lib/locales/ar.mjs.map +1 -1
  33. package/src/lib/locales/de.js +6 -0
  34. package/src/lib/locales/de.js.map +1 -1
  35. package/src/lib/locales/de.mjs +6 -0
  36. package/src/lib/locales/de.mjs.map +1 -1
  37. package/src/lib/locales/fr.js +6 -0
  38. package/src/lib/locales/fr.js.map +1 -1
  39. package/src/lib/locales/fr.mjs +6 -0
  40. package/src/lib/locales/fr.mjs.map +1 -1
  41. package/src/lib/look.d.mts +7 -3
  42. package/src/lib/look.d.ts +7 -3
  43. package/src/lib/look.js +72 -15
  44. package/src/lib/look.js.map +1 -1
  45. package/src/lib/look.mjs +72 -15
  46. package/src/lib/look.mjs.map +1 -1
  47. package/src/lib/open.d.mts +24 -0
  48. package/src/lib/open.d.ts +24 -0
  49. package/src/lib/open.js +81 -0
  50. package/src/lib/open.js.map +1 -0
  51. package/src/lib/open.mjs +78 -0
  52. package/src/lib/open.mjs.map +1 -0
  53. package/src/lib/related.d.mts +19 -0
  54. package/src/lib/related.d.ts +19 -0
  55. package/src/lib/related.js +15 -2
  56. package/src/lib/related.js.map +1 -1
  57. package/src/lib/related.mjs +14 -2
  58. package/src/lib/related.mjs.map +1 -1
  59. package/src/lib/say.d.mts +9 -0
  60. package/src/lib/say.d.ts +9 -0
  61. package/src/lib/say.js +45 -0
  62. package/src/lib/say.js.map +1 -0
  63. package/src/lib/say.mjs +42 -0
  64. package/src/lib/say.mjs.map +1 -0
  65. package/src/lib/viewer.d.mts +33 -5
  66. package/src/lib/viewer.d.ts +33 -5
  67. package/src/lib/viewer.js +464 -279
  68. package/src/lib/viewer.js.map +1 -1
  69. package/src/lib/viewer.mjs +465 -280
  70. 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.10.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.10.0",
31
- "@fieldia/widgets": "0.10.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,
@@ -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. */
@@ -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 = (tag, attrs = {}, text) => {
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 fd-size-${options.size ?? 'medium'}`,
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: 'fd-dialog-backdrop fd-form-dialog-backdrop' });
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
- const handle = (0, viewer_1.mountViewer)(body, { ...options, page: look && !options.page.look ? { ...options.page, look } : options.page, showActions: false });
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('input:not([type="hidden"]), select, textarea, [contenteditable="true"]');
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', () => close(false));
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
- close(false);
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
- for (const [name, value] of Object.entries(next)) {
121
- if (name in fields && JSON.stringify(values[name] ?? null) !== JSON.stringify(value ?? null))
122
- form.setValue(name, value);
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 = (tag, attrs = {}, text) => {
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' });
@@ -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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"}
@@ -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 = (tag, attrs = {}, text) => {
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 fd-size-${options.size ?? 'medium'}`,
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: 'fd-dialog-backdrop fd-form-dialog-backdrop' });
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
- const handle = mountViewer(body, { ...options, page: look && !options.page.look ? { ...options.page, look } : options.page, showActions: false });
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('input:not([type="hidden"]), select, textarea, [contenteditable="true"]');
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', () => close(false));
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
- close(false);
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
- for (const [name, value] of Object.entries(next)) {
117
- if (name in fields && JSON.stringify(values[name] ?? null) !== JSON.stringify(value ?? null))
118
- form.setValue(name, value);
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 = (tag, attrs = {}, text) => {
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' });