@fieldia/viewer 0.10.0 → 0.12.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 (110) 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 +6 -4
  9. package/bundle/fieldia.js.map +4 -4
  10. package/package.json +3 -3
  11. package/src/lib/attachment-preview.d.mts +27 -0
  12. package/src/lib/attachment-preview.d.ts +27 -0
  13. package/src/lib/attachment-preview.js +89 -0
  14. package/src/lib/attachment-preview.js.map +1 -0
  15. package/src/lib/attachment-preview.mjs +86 -0
  16. package/src/lib/attachment-preview.mjs.map +1 -0
  17. package/src/lib/dialog.d.mts +31 -2
  18. package/src/lib/dialog.d.ts +31 -2
  19. package/src/lib/dialog.js +158 -30
  20. package/src/lib/dialog.js.map +1 -1
  21. package/src/lib/dialog.mjs +155 -30
  22. package/src/lib/dialog.mjs.map +1 -1
  23. package/src/lib/hotkeys.d.mts +11 -0
  24. package/src/lib/hotkeys.d.ts +11 -0
  25. package/src/lib/hotkeys.js +34 -0
  26. package/src/lib/hotkeys.js.map +1 -0
  27. package/src/lib/hotkeys.mjs +30 -0
  28. package/src/lib/hotkeys.mjs.map +1 -0
  29. package/src/lib/labels.d.mts +39 -0
  30. package/src/lib/labels.d.ts +39 -0
  31. package/src/lib/labels.js +23 -0
  32. package/src/lib/labels.js.map +1 -1
  33. package/src/lib/labels.mjs +23 -0
  34. package/src/lib/labels.mjs.map +1 -1
  35. package/src/lib/list.d.mts +5 -2
  36. package/src/lib/list.d.ts +5 -2
  37. package/src/lib/list.js +6 -6
  38. package/src/lib/list.js.map +1 -1
  39. package/src/lib/list.mjs +6 -6
  40. package/src/lib/list.mjs.map +1 -1
  41. package/src/lib/locales/ar.js +23 -0
  42. package/src/lib/locales/ar.js.map +1 -1
  43. package/src/lib/locales/ar.mjs +23 -0
  44. package/src/lib/locales/ar.mjs.map +1 -1
  45. package/src/lib/locales/de.js +23 -0
  46. package/src/lib/locales/de.js.map +1 -1
  47. package/src/lib/locales/de.mjs +23 -0
  48. package/src/lib/locales/de.mjs.map +1 -1
  49. package/src/lib/locales/fr.js +23 -0
  50. package/src/lib/locales/fr.js.map +1 -1
  51. package/src/lib/locales/fr.mjs +23 -0
  52. package/src/lib/locales/fr.mjs.map +1 -1
  53. package/src/lib/look.d.mts +7 -3
  54. package/src/lib/look.d.ts +7 -3
  55. package/src/lib/look.js +72 -15
  56. package/src/lib/look.js.map +1 -1
  57. package/src/lib/look.mjs +72 -15
  58. package/src/lib/look.mjs.map +1 -1
  59. package/src/lib/open.d.mts +30 -0
  60. package/src/lib/open.d.ts +30 -0
  61. package/src/lib/open.js +92 -0
  62. package/src/lib/open.js.map +1 -0
  63. package/src/lib/open.mjs +89 -0
  64. package/src/lib/open.mjs.map +1 -0
  65. package/src/lib/place.d.mts +2 -0
  66. package/src/lib/place.d.ts +2 -0
  67. package/src/lib/place.js.map +1 -1
  68. package/src/lib/place.mjs.map +1 -1
  69. package/src/lib/record-bar.d.mts +56 -0
  70. package/src/lib/record-bar.d.ts +56 -0
  71. package/src/lib/record-bar.js +237 -0
  72. package/src/lib/record-bar.js.map +1 -0
  73. package/src/lib/record-bar.mjs +234 -0
  74. package/src/lib/record-bar.mjs.map +1 -0
  75. package/src/lib/record-styles.d.mts +9 -0
  76. package/src/lib/record-styles.d.ts +9 -0
  77. package/src/lib/record-styles.js +83 -0
  78. package/src/lib/record-styles.js.map +1 -0
  79. package/src/lib/record-styles.mjs +79 -0
  80. package/src/lib/record-styles.mjs.map +1 -0
  81. package/src/lib/related.d.mts +26 -3
  82. package/src/lib/related.d.ts +26 -3
  83. package/src/lib/related.js +37 -10
  84. package/src/lib/related.js.map +1 -1
  85. package/src/lib/related.mjs +36 -10
  86. package/src/lib/related.mjs.map +1 -1
  87. package/src/lib/say.d.mts +11 -0
  88. package/src/lib/say.d.ts +11 -0
  89. package/src/lib/say.js +61 -0
  90. package/src/lib/say.js.map +1 -0
  91. package/src/lib/say.mjs +58 -0
  92. package/src/lib/say.mjs.map +1 -0
  93. package/src/lib/tab-strip.d.mts +17 -0
  94. package/src/lib/tab-strip.d.ts +17 -0
  95. package/src/lib/tab-strip.js +51 -0
  96. package/src/lib/tab-strip.js.map +1 -0
  97. package/src/lib/tab-strip.mjs +48 -0
  98. package/src/lib/tab-strip.mjs.map +1 -0
  99. package/src/lib/value-words.d.mts +10 -0
  100. package/src/lib/value-words.d.ts +10 -0
  101. package/src/lib/value-words.js +38 -0
  102. package/src/lib/value-words.js.map +1 -0
  103. package/src/lib/value-words.mjs +35 -0
  104. package/src/lib/value-words.mjs.map +1 -0
  105. package/src/lib/viewer.d.mts +54 -5
  106. package/src/lib/viewer.d.ts +54 -5
  107. package/src/lib/viewer.js +924 -297
  108. package/src/lib/viewer.js.map +1 -1
  109. package/src/lib/viewer.mjs +926 -299
  110. package/src/lib/viewer.mjs.map +1 -1
package/src/lib/look.mjs CHANGED
@@ -3,7 +3,9 @@
3
3
  * font, room, corners, labels and colour scheme becomes attributes and tokens
4
4
  * on the form's root, and the stylesheet turns them into the form's own
5
5
  * colours and sizes — so every widget follows, in either skin, light or dark.
6
- * A page with no look is left exactly as its skin draws it.
6
+ * A look for a kind of part (text boxes, choices, groups, buttons, tables)
7
+ * becomes tokens of that kind, worn by it alone. A page with no look is left
8
+ * exactly as its skin draws it.
7
9
  */
8
10
  /** Words written on a light accent, and on the dark page's accent. */
9
11
  const INK = '#111418';
@@ -32,30 +34,84 @@ export function contrast(a, b) {
32
34
  const textOn = (hex) => (contrast(hex, '#ffffff') >= READABLE ? '#ffffff' : INK);
33
35
  /** On a dark page the accent is light: whichever of ink or white reads better on it. */
34
36
  const textOnDark = (hex) => (contrast(hex, INK) >= contrast(hex, '#ffffff') ? INK : '#ffffff');
35
- /** A colour taken towards white by `amount` (0 to 1). */
36
- const lighten = (hex, amount) => toHex(channels(hex).map((c) => c + (255 - c) * amount));
37
- /** A colour taken towards black by `amount` (0 to 1). */
38
- const darken = (hex, amount) => toHex(channels(hex).map((c) => c * (1 - amount)));
37
+ /** A colour taken towards another by `amount` (0 to 1). */
38
+ const towards = (hex, to, amount) => toHex(channels(hex).map((c, i) => c + (channels(to)[i] - c) * amount));
39
39
  /** The accent's softer shade on a surface, as the stylesheet mixes it: 12% of the accent. */
40
- const softOn = (hex, surface) => toHex(channels(hex).map((c, i) => c * 0.12 + channels(surface)[i] * 0.88));
40
+ const softOn = (hex, surface) => towards(surface, hex, 0.12);
41
41
  /** Reads as words on a surface, on the lightest ground there, and on its own softer shade (a picked tab, a chip). */
42
42
  const readsOn = (hex, grounds) => [...grounds, softOn(hex, grounds[0])].every((ground) => contrast(hex, ground) >= READABLE);
43
+ /** A colour moved towards `to` in small steps, only as far as it has to be, until it `reads`; at worst it is `to`. */
44
+ function moved(hex, to, reads) {
45
+ let colour = hex;
46
+ for (let step = 1; step <= 40 && !reads(colour); step++)
47
+ colour = towards(hex, to, step / 40);
48
+ return colour;
49
+ }
43
50
  /**
44
51
  * The accent, and what goes with it in either scheme. Each is moved, in small
45
52
  * steps and only as far as it has to be, until words in it and on it read at
46
- * 4.5:1 — darker on a light page, lighter on a dark one. The softer and hover
47
- * shades are mixed from these by the stylesheet.
53
+ * 4.5:1 — darker on a light page, lighter on a dark one — on the page and on
54
+ * any `grounds` of its parts. The softer and hover shades are mixed from these
55
+ * by the stylesheet.
48
56
  */
49
- export function accentShades(hex) {
57
+ export function accentShades(hex, grounds = { light: [], dark: [] }) {
50
58
  const given = hex.toLowerCase();
51
- let accent = given;
52
- for (let step = 1; step <= 40 && !readsOn(accent, ['#ffffff', LIGHT_GROUND]); step++)
53
- accent = darken(given, step / 40);
54
- let dark = given;
55
- for (let step = 1; step <= 40 && !readsOn(dark, [DARK_SURFACE]); step++)
56
- dark = lighten(given, step / 40);
59
+ const accent = moved(given, '#000000', (colour) => readsOn(colour, ['#ffffff', LIGHT_GROUND, ...grounds.light]));
60
+ const dark = moved(given, '#ffffff', (colour) => readsOn(colour, [DARK_SURFACE, ...grounds.dark]));
57
61
  return { accent, accentText: textOn(accent), dark, darkText: textOnDark(dark) };
58
62
  }
63
+ /** Each scheme's words that every ground of a part must keep readable: its text, muted words and errors. */
64
+ const LIGHT_WORDS = ['#212529', '#636976', '#c63c3d'];
65
+ const DARK_WORDS = ['#e8eaed', '#a3a9b2', '#ff8a7a'];
66
+ /** The skins' own accent where the page names none: outlined's, the lighter of the two, which has the most to read on. */
67
+ const SKIN_ACCENT = { accent: '#1365d9', dark: '#5aa2ff' };
68
+ /** What a part's settings are called on the form, `data-inputs="bg radius"`, and in its tokens, `--fd-inputs-bg`. */
69
+ const NAMES = { background: 'bg', border: 'border', corners: 'radius', textSize: 'size', accent: 'accent' };
70
+ const SIZES = { small: '13px', large: '16px' };
71
+ /** The corners of a box, and of a group, in pixels: the page's own (`data-corners`) for each. */
72
+ const RADII = { square: [0, 0], soft: [6, 10], round: [12, 16] };
73
+ /**
74
+ * A look for each kind of part, as its own tokens on the form, each worked out
75
+ * for the page's scheme (both, for auto, as `light-dark()`): a ground moved
76
+ * until the page's words and accent read on it — lighter on a light page,
77
+ * towards the dark surface on a dark one; an accent moved until words in it
78
+ * and on it read, on the page and on every ground given; an edge as given.
79
+ */
80
+ function applyParts(root, look) {
81
+ const wear = (light, dark) => (look.scheme === 'dark' ? dark : look.scheme === 'auto' ? `light-dark(${light}, ${dark})` : light);
82
+ const page = look.accent ? accentShades(look.accent) : SKIN_ACCENT;
83
+ const parts = Object.entries(look.parts ?? {});
84
+ const set = (kind, name, value) => root.style.setProperty(`--fd-${kind}-${name}`, value);
85
+ // The grounds first: every accent has to read on each of them.
86
+ const grounds = { light: [], dark: [] };
87
+ const readsAll = (words) => (colour) => words.every((word) => contrast(word, colour) >= READABLE);
88
+ for (const [kind, part] of parts) {
89
+ const given = part.background?.toLowerCase();
90
+ if (!given)
91
+ continue;
92
+ const light = moved(given, '#ffffff', readsAll([...LIGHT_WORDS, page.accent]));
93
+ const dark = moved(given, DARK_SURFACE, readsAll([...DARK_WORDS, page.dark]));
94
+ grounds.light.push(light);
95
+ grounds.dark.push(dark);
96
+ set(kind, 'bg', wear(light, dark));
97
+ }
98
+ for (const [kind, part] of parts) {
99
+ const names = Object.keys(NAMES).filter((name) => part[name]).map((name) => NAMES[name]);
100
+ if (names.length)
101
+ root.setAttribute(`data-${kind}`, names.join(' '));
102
+ if (part.border)
103
+ set(kind, 'border', part.border);
104
+ if (part.corners)
105
+ set(kind, 'radius', `${RADII[part.corners][kind === 'groups' ? 1 : 0]}px`);
106
+ if (part.textSize)
107
+ set(kind, 'size', SIZES[part.textSize]);
108
+ if (part.accent) {
109
+ const shades = accentShades(part.accent, grounds);
110
+ set(kind, 'accent', wear(shades.accent, shades.dark));
111
+ set(kind, 'accent-text', wear(shades.accentText, shades.darkText));
112
+ }
113
+ }
114
+ }
59
115
  /** Put the page's look on the form's root. */
60
116
  export function applyLook(root, look) {
61
117
  if (!look)
@@ -75,5 +131,6 @@ export function applyLook(root, look) {
75
131
  root.style.setProperty('--fd-look-accent-dark', shades.dark);
76
132
  root.style.setProperty('--fd-look-accent-dark-text', shades.darkText);
77
133
  }
134
+ applyParts(root, look);
78
135
  }
79
136
  //# sourceMappingURL=look.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"look.mjs","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/look.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"look.mjs","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/look.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { OpenRequest, OpenResult, Page, PostedMessage, Tone } from '@fieldia/core';
2
+ import { type ViewerOptions } from './viewer.mjs';
3
+ /** What opening a page needs of the viewer that opens it. */
4
+ export interface Opener {
5
+ options: ViewerOptions;
6
+ /** The element the viewer is in: a page opened in its place goes there. */
7
+ place: HTMLElement;
8
+ /** The viewer's own form element, which steps aside meanwhile. */
9
+ root: HTMLElement;
10
+ /** The page's title as the viewer shows it: in its language, through the app's translator. */
11
+ title(page: Page): string;
12
+ /** "Back", in the page's language. */
13
+ back: string;
14
+ /** Why a page cannot be opened: the app has none by that id. */
15
+ missing(page: string): string;
16
+ /** Words said as this viewer says them: a page opened over it says its own here, so they show over it and outlive it. */
17
+ say(message: string, tone: Tone): void;
18
+ /** Words posted in this record's conversation: a page opened over it posts its own here. */
19
+ post(message: PostedMessage): Promise<boolean>;
20
+ /** This record's name, for the crumb a page opened in its place goes back by. */
21
+ name(): string;
22
+ }
23
+ /**
24
+ * Open a page as a step asks, for the viewer's host: the app's own way first
25
+ * (`onOpen`), else found through `pages` and opened in a dialog, a side panel
26
+ * (from the side the step names) or this form's place — with the same data
27
+ * source, pages, words and look.
28
+ * Resolves with how it ended; the saved record named by its page's title field.
29
+ */
30
+ export declare function openPage(opener: Opener, request: OpenRequest): Promise<OpenResult>;
@@ -0,0 +1,30 @@
1
+ import type { OpenRequest, OpenResult, Page, PostedMessage, Tone } from '@fieldia/core';
2
+ import { type ViewerOptions } from './viewer';
3
+ /** What opening a page needs of the viewer that opens it. */
4
+ export interface Opener {
5
+ options: ViewerOptions;
6
+ /** The element the viewer is in: a page opened in its place goes there. */
7
+ place: HTMLElement;
8
+ /** The viewer's own form element, which steps aside meanwhile. */
9
+ root: HTMLElement;
10
+ /** The page's title as the viewer shows it: in its language, through the app's translator. */
11
+ title(page: Page): string;
12
+ /** "Back", in the page's language. */
13
+ back: string;
14
+ /** Why a page cannot be opened: the app has none by that id. */
15
+ missing(page: string): string;
16
+ /** Words said as this viewer says them: a page opened over it says its own here, so they show over it and outlive it. */
17
+ say(message: string, tone: Tone): void;
18
+ /** Words posted in this record's conversation: a page opened over it posts its own here. */
19
+ post(message: PostedMessage): Promise<boolean>;
20
+ /** This record's name, for the crumb a page opened in its place goes back by. */
21
+ name(): string;
22
+ }
23
+ /**
24
+ * Open a page as a step asks, for the viewer's host: the app's own way first
25
+ * (`onOpen`), else found through `pages` and opened in a dialog, a side panel
26
+ * (from the side the step names) or this form's place — with the same data
27
+ * source, pages, words and look.
28
+ * Resolves with how it ended; the saved record named by its page's title field.
29
+ */
30
+ export declare function openPage(opener: Opener, request: OpenRequest): Promise<OpenResult>;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.openPage = openPage;
4
+ const dialog_1 = require("./dialog");
5
+ const related_1 = require("./related");
6
+ const viewer_1 = require("./viewer");
7
+ /**
8
+ * Open a page as a step asks, for the viewer's host: the app's own way first
9
+ * (`onOpen`), else found through `pages` and opened in a dialog, a side panel
10
+ * (from the side the step names) or this form's place — with the same data
11
+ * source, pages, words and look.
12
+ * Resolves with how it ended; the saved record named by its page's title field.
13
+ */
14
+ async function openPage(opener, request) {
15
+ const { options } = opener;
16
+ const theirs = options.onOpen?.(request);
17
+ if (theirs)
18
+ return theirs;
19
+ const found = await (0, related_1.findPage)(options, request.version === undefined ? { id: request.page } : { id: request.page, version: request.version });
20
+ if (!found)
21
+ throw new Error(opener.missing(request.page));
22
+ // It wears the look of the page that opened it, unless it has one of its own.
23
+ const look = options.page.look;
24
+ const shared = {
25
+ ...options,
26
+ page: look && !found.look ? { ...found, look } : found,
27
+ form: undefined,
28
+ recordId: request.recordId ?? null,
29
+ values: request.values,
30
+ listFilter: request.filter,
31
+ // What belongs to the page that opened it alone.
32
+ drafts: undefined,
33
+ autosave: undefined,
34
+ readonly: undefined,
35
+ editSwitch: undefined,
36
+ saveStatus: undefined,
37
+ // The pager and the trail are this record's: a dialog has neither, and a page in its place a trail of its own.
38
+ records: undefined,
39
+ breadcrumbs: undefined,
40
+ };
41
+ const title = request.title ?? opener.title(found);
42
+ // Over this form, its words are this form's: a page in its place has this form's place, and its own. Either posts in this record's conversation.
43
+ const over = { ...shared, host: { ...options.host, say: opener.say, post: opener.post } };
44
+ const result = request.as === 'page' ? await inPlace(opener, { ...shared, host: { ...options.host, post: opener.post } })
45
+ : request.as === 'panel' ? await (0, dialog_1.openFormPanel)({ ...over, title, side: request.side })
46
+ : await (0, dialog_1.openFormDialog)({ ...over, title, size: found.layout.type === 'sheet' ? 'large' : 'medium' });
47
+ const name = (0, related_1.nameFieldOf)(found);
48
+ const label = name ? result.values[name] : undefined;
49
+ return { ...result, ...(typeof label === 'string' && label ? { label } : {}) };
50
+ }
51
+ /**
52
+ * A page in this form's place, with the way back over it: where the app
53
+ * gives this record breadcrumbs, the trail with this record last; else, or
54
+ * where its page draws none (a list), Back. Saved or sent — once its own
55
+ * after-save steps have run — it gives way back to this form, as it was, and
56
+ * the run goes on; the way back, or a `close` step inside it, returns without.
57
+ */
58
+ function inPlace(opener, options) {
59
+ const { place, root } = opener;
60
+ const doc = place.ownerDocument;
61
+ const from = doc.activeElement;
62
+ return new Promise((resolve) => {
63
+ let done = false;
64
+ const end = (saved) => {
65
+ if (done)
66
+ return;
67
+ done = true;
68
+ const state = opened.form.getState();
69
+ opened.destroy();
70
+ root.hidden = false;
71
+ if (from?.isConnected)
72
+ from.focus();
73
+ resolve({ saved, recordId: state.recordId ?? null, values: state.values });
74
+ };
75
+ root.hidden = true;
76
+ // Where the app keeps a trail, this record joins it as the way back.
77
+ const trail = opener.options.breadcrumbs ? [...opener.options.breadcrumbs, { label: opener.name(), open: () => end(false) }] : undefined;
78
+ const opened = (0, viewer_1.mountViewer)(place, { ...options, breadcrumbs: trail, host: { ...options.host, close: () => end(false) } });
79
+ const back = doc.createElement('button');
80
+ back.type = 'button';
81
+ back.className = 'fd-button fd-button-link fd-back';
82
+ back.textContent = opener.back;
83
+ back.addEventListener('click', () => end(false));
84
+ if (!opened.element.querySelector('.fd-breadcrumbs'))
85
+ opened.element.prepend(back);
86
+ const leave = () => void opened.form.settled().then(() => end(true));
87
+ opened.on('save', leave);
88
+ opened.on('send', leave);
89
+ ((0, dialog_1.focusField)(opened.element) ?? opened.element.querySelector(dialog_1.FIRST_FIELD) ?? back).focus();
90
+ });
91
+ }
92
+ //# sourceMappingURL=open.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/open.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { FIRST_FIELD, focusField, openFormDialog, openFormPanel } from './dialog.mjs';
2
+ import { findPage, nameFieldOf } from './related.mjs';
3
+ import { mountViewer } from './viewer.mjs';
4
+ /**
5
+ * Open a page as a step asks, for the viewer's host: the app's own way first
6
+ * (`onOpen`), else found through `pages` and opened in a dialog, a side panel
7
+ * (from the side the step names) or this form's place — with the same data
8
+ * source, pages, words and look.
9
+ * Resolves with how it ended; the saved record named by its page's title field.
10
+ */
11
+ export async function openPage(opener, request) {
12
+ const { options } = opener;
13
+ const theirs = options.onOpen?.(request);
14
+ if (theirs)
15
+ return theirs;
16
+ const found = await findPage(options, request.version === undefined ? { id: request.page } : { id: request.page, version: request.version });
17
+ if (!found)
18
+ throw new Error(opener.missing(request.page));
19
+ // It wears the look of the page that opened it, unless it has one of its own.
20
+ const look = options.page.look;
21
+ const shared = {
22
+ ...options,
23
+ page: look && !found.look ? { ...found, look } : found,
24
+ form: undefined,
25
+ recordId: request.recordId ?? null,
26
+ values: request.values,
27
+ listFilter: request.filter,
28
+ // What belongs to the page that opened it alone.
29
+ drafts: undefined,
30
+ autosave: undefined,
31
+ readonly: undefined,
32
+ editSwitch: undefined,
33
+ saveStatus: undefined,
34
+ // The pager and the trail are this record's: a dialog has neither, and a page in its place a trail of its own.
35
+ records: undefined,
36
+ breadcrumbs: undefined,
37
+ };
38
+ const title = request.title ?? opener.title(found);
39
+ // Over this form, its words are this form's: a page in its place has this form's place, and its own. Either posts in this record's conversation.
40
+ const over = { ...shared, host: { ...options.host, say: opener.say, post: opener.post } };
41
+ const result = request.as === 'page' ? await inPlace(opener, { ...shared, host: { ...options.host, post: opener.post } })
42
+ : request.as === 'panel' ? await openFormPanel({ ...over, title, side: request.side })
43
+ : await openFormDialog({ ...over, title, size: found.layout.type === 'sheet' ? 'large' : 'medium' });
44
+ const name = nameFieldOf(found);
45
+ const label = name ? result.values[name] : undefined;
46
+ return { ...result, ...(typeof label === 'string' && label ? { label } : {}) };
47
+ }
48
+ /**
49
+ * A page in this form's place, with the way back over it: where the app
50
+ * gives this record breadcrumbs, the trail with this record last; else, or
51
+ * where its page draws none (a list), Back. Saved or sent — once its own
52
+ * after-save steps have run — it gives way back to this form, as it was, and
53
+ * the run goes on; the way back, or a `close` step inside it, returns without.
54
+ */
55
+ function inPlace(opener, options) {
56
+ const { place, root } = opener;
57
+ const doc = place.ownerDocument;
58
+ const from = doc.activeElement;
59
+ return new Promise((resolve) => {
60
+ let done = false;
61
+ const end = (saved) => {
62
+ if (done)
63
+ return;
64
+ done = true;
65
+ const state = opened.form.getState();
66
+ opened.destroy();
67
+ root.hidden = false;
68
+ if (from?.isConnected)
69
+ from.focus();
70
+ resolve({ saved, recordId: state.recordId ?? null, values: state.values });
71
+ };
72
+ root.hidden = true;
73
+ // Where the app keeps a trail, this record joins it as the way back.
74
+ const trail = opener.options.breadcrumbs ? [...opener.options.breadcrumbs, { label: opener.name(), open: () => end(false) }] : undefined;
75
+ const opened = mountViewer(place, { ...options, breadcrumbs: trail, host: { ...options.host, close: () => end(false) } });
76
+ const back = doc.createElement('button');
77
+ back.type = 'button';
78
+ back.className = 'fd-button fd-button-link fd-back';
79
+ back.textContent = opener.back;
80
+ back.addEventListener('click', () => end(false));
81
+ if (!opened.element.querySelector('.fd-breadcrumbs'))
82
+ opened.element.prepend(back);
83
+ const leave = () => void opened.form.settled().then(() => end(true));
84
+ opened.on('save', leave);
85
+ opened.on('send', leave);
86
+ (focusField(opened.element) ?? opened.element.querySelector(FIRST_FIELD) ?? back).focus();
87
+ });
88
+ }
89
+ //# sourceMappingURL=open.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.mjs","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/open.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,8 @@ export interface Place {
11
11
  onPage: boolean;
12
12
  /** Where labels sit here, as the page or a group round it says; undefined leaves them to the skin. */
13
13
  labels?: LabelPlace;
14
+ /** On a line of parts: words are drawn as words in the line, not a paragraph of their own. */
15
+ inline?: boolean;
14
16
  }
15
17
  export type SectionStyle = NonNullable<SectionNode['style']>;
16
18
  export interface SectionPlan {
@@ -11,6 +11,8 @@ export interface Place {
11
11
  onPage: boolean;
12
12
  /** Where labels sit here, as the page or a group round it says; undefined leaves them to the skin. */
13
13
  labels?: LabelPlace;
14
+ /** On a line of parts: words are drawn as words in the line, not a paragraph of their own. */
15
+ inline?: boolean;
14
16
  }
15
17
  export type SectionStyle = NonNullable<SectionNode['style']>;
16
18
  export interface SectionPlan {
@@ -1 +1 @@
1
- {"version":3,"file":"place.js","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/place.ts"],"names":[],"mappings":";;AAiCA,kCAiBC;AASD,gCAIC;AA/DD,wCAA+G;AAgC/G,uFAAuF;AACvF,SAAgB,WAAW,CAAC,IAAiB,EAAE,KAAY;IACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;IACnC,MAAM,WAAW,GAAG,KAAK,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACrD,MAAM,GAAG,GAAG,IAAA,kBAAW,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IAC/B,MAAM,EAAE,GAAG,WAAW,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxG,OAAO;QACL,KAAK;QACL,WAAW;QACX,EAAE;QACF,KAAK,EAAE;YACL,OAAO,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG;YAC9D,kGAAkG;YAClG,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,CAAC;YAC/D,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;SACpC;KACF,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE1D;;;GAGG;AACH,SAAgB,UAAU,CAAC,IAAe,EAAE,IAAe,EAAE,KAA6B;IACxF,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,OAAO,CAAC;IACjE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;IACpC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AACpE,CAAC"}
1
+ {"version":3,"file":"place.js","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/place.ts"],"names":[],"mappings":";;AAmCA,kCAiBC;AASD,gCAIC;AAjED,wCAA+G;AAkC/G,uFAAuF;AACvF,SAAgB,WAAW,CAAC,IAAiB,EAAE,KAAY;IACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;IACnC,MAAM,WAAW,GAAG,KAAK,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACrD,MAAM,GAAG,GAAG,IAAA,kBAAW,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IAC/B,MAAM,EAAE,GAAG,WAAW,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxG,OAAO;QACL,KAAK;QACL,WAAW;QACX,EAAE;QACF,KAAK,EAAE;YACL,OAAO,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG;YAC9D,kGAAkG;YAClG,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,CAAC;YAC/D,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;SACpC;KACF,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE1D;;;GAGG;AACH,SAAgB,UAAU,CAAC,IAAe,EAAE,IAAe,EAAE,KAA6B;IACxF,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,OAAO,CAAC;IACjE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;IACpC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AACpE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"place.mjs","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/place.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqE,MAAM,eAAe,CAAC;AAgC/G,uFAAuF;AACvF,MAAM,UAAU,WAAW,CAAC,IAAiB,EAAE,KAAY;IACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;IACnC,MAAM,WAAW,GAAG,KAAK,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACrD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IAC/B,MAAM,EAAE,GAAG,WAAW,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxG,OAAO;QACL,KAAK;QACL,WAAW;QACX,EAAE;QACF,KAAK,EAAE;YACL,OAAO,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG;YAC9D,kGAAkG;YAClG,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,CAAC;YAC/D,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;SACpC;KACF,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE1D;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAe,EAAE,IAAe,EAAE,KAA6B;IACxF,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,OAAO,CAAC;IACjE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;IACpC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AACpE,CAAC"}
1
+ {"version":3,"file":"place.mjs","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/place.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqE,MAAM,eAAe,CAAC;AAkC/G,uFAAuF;AACvF,MAAM,UAAU,WAAW,CAAC,IAAiB,EAAE,KAAY;IACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;IACnC,MAAM,WAAW,GAAG,KAAK,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACrD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IAC/B,MAAM,EAAE,GAAG,WAAW,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxG,OAAO;QACL,KAAK;QACL,WAAW;QACX,EAAE;QACF,KAAK,EAAE;YACL,OAAO,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG;YAC9D,kGAAkG;YAClG,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,CAAC;YAC/D,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;SACpC;KACF,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE1D;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAe,EAAE,IAAe,EAAE,KAA6B;IACxF,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,OAAO,CAAC;IACjE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;IACpC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AACpE,CAAC"}
@@ -0,0 +1,56 @@
1
+ import type { Form, RecordId, RecordToolbar, RunResult } from '@fieldia/core';
2
+ import { type IconSet } from '@fieldia/widgets';
3
+ import { type El } from './dom.mjs';
4
+ import type { ViewerLabels } from './labels.mjs';
5
+ /**
6
+ * The records round the one shown, for the pager over it: how many there
7
+ * are, where this one is among them (from 0), and the id at a place, which
8
+ * may come from the server.
9
+ */
10
+ export interface RecordPager {
11
+ total: number;
12
+ at: number;
13
+ id(at: number): RecordId | Promise<RecordId>;
14
+ }
15
+ /** A page on the way to the record, as the breadcrumbs show it: its words, and what a press does — back to it. */
16
+ export interface Breadcrumb {
17
+ label: string;
18
+ /** Back to that page: the app's own way. */
19
+ open?: () => void;
20
+ /** Or an address to go to. */
21
+ href?: string;
22
+ }
23
+ /** What the bar over a record needs of the viewer that draws it. */
24
+ export interface RecordBarContext {
25
+ doc: Document;
26
+ el: El;
27
+ form: Form;
28
+ toolbar: RecordToolbar | undefined;
29
+ records: readonly RecordId[] | RecordPager | undefined;
30
+ breadcrumbs: readonly Breadcrumb[] | undefined;
31
+ labels: ViewerLabels;
32
+ icons?: IconSet;
33
+ uid(id: string): string;
34
+ fill(template: string, values: Record<string, string | number>): string;
35
+ withIcon(name: string | undefined, text: string): (Node | string)[];
36
+ /** A press of an item: one run at a time, the gear busy meanwhile. */
37
+ press(button: HTMLElement, run: () => Promise<RunResult>): Promise<void>;
38
+ /** The record's name, as its crumb says it; empty for a new one. */
39
+ name(): string;
40
+ /** Save what changed before the pager moves on; false keeps the record where it is. */
41
+ leave(): Promise<boolean>;
42
+ /** Draw the form again: the pager's records changed, the record shown perhaps not. */
43
+ render(): void;
44
+ }
45
+ /**
46
+ * The bar over a record, as Flectra's control panel: the breadcrumbs the app
47
+ * gives, the gear menu the page fills (its Print group, then its actions),
48
+ * and the pager over the records the app gives. Null when it would hold
49
+ * nothing. A dialog is given neither breadcrumbs nor records, so there only
50
+ * the menu shows; on a phone the trail folds to the page before this one.
51
+ */
52
+ export declare function recordBar(context: RecordBarContext): {
53
+ element: HTMLElement;
54
+ update(): void;
55
+ destroy(): void;
56
+ } | null;
@@ -0,0 +1,56 @@
1
+ import type { Form, RecordId, RecordToolbar, RunResult } from '@fieldia/core';
2
+ import { type IconSet } from '@fieldia/widgets';
3
+ import { type El } from './dom';
4
+ import type { ViewerLabels } from './labels';
5
+ /**
6
+ * The records round the one shown, for the pager over it: how many there
7
+ * are, where this one is among them (from 0), and the id at a place, which
8
+ * may come from the server.
9
+ */
10
+ export interface RecordPager {
11
+ total: number;
12
+ at: number;
13
+ id(at: number): RecordId | Promise<RecordId>;
14
+ }
15
+ /** A page on the way to the record, as the breadcrumbs show it: its words, and what a press does — back to it. */
16
+ export interface Breadcrumb {
17
+ label: string;
18
+ /** Back to that page: the app's own way. */
19
+ open?: () => void;
20
+ /** Or an address to go to. */
21
+ href?: string;
22
+ }
23
+ /** What the bar over a record needs of the viewer that draws it. */
24
+ export interface RecordBarContext {
25
+ doc: Document;
26
+ el: El;
27
+ form: Form;
28
+ toolbar: RecordToolbar | undefined;
29
+ records: readonly RecordId[] | RecordPager | undefined;
30
+ breadcrumbs: readonly Breadcrumb[] | undefined;
31
+ labels: ViewerLabels;
32
+ icons?: IconSet;
33
+ uid(id: string): string;
34
+ fill(template: string, values: Record<string, string | number>): string;
35
+ withIcon(name: string | undefined, text: string): (Node | string)[];
36
+ /** A press of an item: one run at a time, the gear busy meanwhile. */
37
+ press(button: HTMLElement, run: () => Promise<RunResult>): Promise<void>;
38
+ /** The record's name, as its crumb says it; empty for a new one. */
39
+ name(): string;
40
+ /** Save what changed before the pager moves on; false keeps the record where it is. */
41
+ leave(): Promise<boolean>;
42
+ /** Draw the form again: the pager's records changed, the record shown perhaps not. */
43
+ render(): void;
44
+ }
45
+ /**
46
+ * The bar over a record, as Flectra's control panel: the breadcrumbs the app
47
+ * gives, the gear menu the page fills (its Print group, then its actions),
48
+ * and the pager over the records the app gives. Null when it would hold
49
+ * nothing. A dialog is given neither breadcrumbs nor records, so there only
50
+ * the menu shows; on a phone the trail folds to the page before this one.
51
+ */
52
+ export declare function recordBar(context: RecordBarContext): {
53
+ element: HTMLElement;
54
+ update(): void;
55
+ destroy(): void;
56
+ } | null;