@fieldia/viewer 0.9.2 → 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 (118) hide show
  1. package/README.md +145 -1
  2. package/bundle/fieldia.ar.js +3 -0
  3. package/bundle/fieldia.ar.js.map +7 -0
  4. package/bundle/fieldia.de.js +3 -0
  5. package/bundle/fieldia.de.js.map +7 -0
  6. package/bundle/fieldia.fr.js +3 -0
  7. package/bundle/fieldia.fr.js.map +7 -0
  8. package/bundle/fieldia.js +4 -4
  9. package/bundle/fieldia.js.map +4 -4
  10. package/package.json +6 -3
  11. package/src/index.d.mts +4 -0
  12. package/src/index.d.ts +4 -0
  13. package/src/index.js +12 -0
  14. package/src/index.js.map +1 -1
  15. package/src/index.mjs +4 -0
  16. package/src/index.mjs.map +1 -1
  17. package/src/lib/add-language.d.mts +20 -0
  18. package/src/lib/add-language.d.ts +20 -0
  19. package/src/lib/add-language.js +19 -0
  20. package/src/lib/add-language.js.map +1 -0
  21. package/src/lib/add-language.mjs +16 -0
  22. package/src/lib/add-language.mjs.map +1 -0
  23. package/src/lib/dialog.d.mts +35 -3
  24. package/src/lib/dialog.d.ts +35 -3
  25. package/src/lib/dialog.js +109 -47
  26. package/src/lib/dialog.js.map +1 -1
  27. package/src/lib/dialog.mjs +107 -47
  28. package/src/lib/dialog.mjs.map +1 -1
  29. package/src/lib/dom.d.mts +10 -0
  30. package/src/lib/dom.d.ts +10 -0
  31. package/src/lib/dom.js +26 -0
  32. package/src/lib/dom.js.map +1 -1
  33. package/src/lib/dom.mjs +23 -1
  34. package/src/lib/dom.mjs.map +1 -1
  35. package/src/lib/focus-trap.d.mts +2 -0
  36. package/src/lib/focus-trap.d.ts +2 -0
  37. package/src/lib/focus-trap.js +7 -0
  38. package/src/lib/focus-trap.js.map +1 -0
  39. package/src/lib/focus-trap.mjs +3 -0
  40. package/src/lib/focus-trap.mjs.map +1 -0
  41. package/src/lib/labels.d.mts +27 -0
  42. package/src/lib/labels.d.ts +27 -0
  43. package/src/lib/labels.js +109 -277
  44. package/src/lib/labels.js.map +1 -1
  45. package/src/lib/labels.mjs +108 -277
  46. package/src/lib/labels.mjs.map +1 -1
  47. package/src/lib/list-styles.d.mts +1 -1
  48. package/src/lib/list-styles.d.ts +1 -1
  49. package/src/lib/list-styles.js +3 -2
  50. package/src/lib/list-styles.js.map +1 -1
  51. package/src/lib/list-styles.mjs +3 -2
  52. package/src/lib/list-styles.mjs.map +1 -1
  53. package/src/lib/list.d.mts +3 -2
  54. package/src/lib/list.d.ts +3 -2
  55. package/src/lib/list.js +5 -5
  56. package/src/lib/list.js.map +1 -1
  57. package/src/lib/list.mjs +5 -5
  58. package/src/lib/list.mjs.map +1 -1
  59. package/src/lib/locales/all.d.mts +8 -0
  60. package/src/lib/locales/all.d.ts +8 -0
  61. package/src/lib/locales/all.js +13 -0
  62. package/src/lib/locales/all.js.map +1 -0
  63. package/src/lib/locales/all.mjs +10 -0
  64. package/src/lib/locales/all.mjs.map +1 -0
  65. package/src/lib/locales/ar.d.mts +3 -0
  66. package/src/lib/locales/ar.d.ts +3 -0
  67. package/src/lib/locales/ar.js +80 -0
  68. package/src/lib/locales/ar.js.map +1 -0
  69. package/src/lib/locales/ar.mjs +77 -0
  70. package/src/lib/locales/ar.mjs.map +1 -0
  71. package/src/lib/locales/de.d.mts +3 -0
  72. package/src/lib/locales/de.d.ts +3 -0
  73. package/src/lib/locales/de.js +80 -0
  74. package/src/lib/locales/de.js.map +1 -0
  75. package/src/lib/locales/de.mjs +77 -0
  76. package/src/lib/locales/de.mjs.map +1 -0
  77. package/src/lib/locales/fr.d.mts +3 -0
  78. package/src/lib/locales/fr.d.ts +3 -0
  79. package/src/lib/locales/fr.js +80 -0
  80. package/src/lib/locales/fr.js.map +1 -0
  81. package/src/lib/locales/fr.mjs +77 -0
  82. package/src/lib/locales/fr.mjs.map +1 -0
  83. package/src/lib/look.d.mts +25 -0
  84. package/src/lib/look.d.ts +25 -0
  85. package/src/lib/look.js +141 -0
  86. package/src/lib/look.js.map +1 -0
  87. package/src/lib/look.mjs +136 -0
  88. package/src/lib/look.mjs.map +1 -0
  89. package/src/lib/open.d.mts +24 -0
  90. package/src/lib/open.d.ts +24 -0
  91. package/src/lib/open.js +81 -0
  92. package/src/lib/open.js.map +1 -0
  93. package/src/lib/open.mjs +78 -0
  94. package/src/lib/open.mjs.map +1 -0
  95. package/src/lib/place.d.mts +35 -0
  96. package/src/lib/place.d.ts +35 -0
  97. package/src/lib/place.js +37 -0
  98. package/src/lib/place.js.map +1 -0
  99. package/src/lib/place.mjs +33 -0
  100. package/src/lib/place.mjs.map +1 -0
  101. package/src/lib/related.d.mts +19 -0
  102. package/src/lib/related.d.ts +19 -0
  103. package/src/lib/related.js +17 -3
  104. package/src/lib/related.js.map +1 -1
  105. package/src/lib/related.mjs +16 -3
  106. package/src/lib/related.mjs.map +1 -1
  107. package/src/lib/say.d.mts +9 -0
  108. package/src/lib/say.d.ts +9 -0
  109. package/src/lib/say.js +45 -0
  110. package/src/lib/say.js.map +1 -0
  111. package/src/lib/say.mjs +42 -0
  112. package/src/lib/say.mjs.map +1 -0
  113. package/src/lib/viewer.d.mts +43 -7
  114. package/src/lib/viewer.d.ts +43 -7
  115. package/src/lib/viewer.js +513 -225
  116. package/src/lib/viewer.js.map +1 -1
  117. package/src/lib/viewer.mjs +516 -228
  118. package/src/lib/viewer.mjs.map +1 -1
@@ -0,0 +1,81 @@
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
+ // What belongs to the page that opened it alone.
31
+ drafts: undefined,
32
+ autosave: undefined,
33
+ readonly: undefined,
34
+ editSwitch: undefined,
35
+ saveStatus: undefined,
36
+ };
37
+ const title = request.title ?? opener.title(found);
38
+ const result = request.as === 'page' ? await inPlace(opener, shared)
39
+ : request.as === 'panel' ? await (0, dialog_1.openFormPanel)({ ...shared, title, side: request.side })
40
+ : await (0, dialog_1.openFormDialog)({ ...shared, title, size: found.layout.type === 'sheet' ? 'large' : 'medium' });
41
+ const name = (0, related_1.nameFieldOf)(found);
42
+ const label = name ? result.values[name] : undefined;
43
+ return { ...result, ...(typeof label === 'string' && label ? { label } : {}) };
44
+ }
45
+ /**
46
+ * A page in this form's place, with Back over it. Saved or sent — once its own
47
+ * after-save steps have run — it gives way back to this form, as it was, and
48
+ * the run goes on; Back, or a `close` step inside it, returns without.
49
+ */
50
+ function inPlace(opener, options) {
51
+ const { place, root } = opener;
52
+ const doc = place.ownerDocument;
53
+ const from = doc.activeElement;
54
+ return new Promise((resolve) => {
55
+ let done = false;
56
+ const end = (saved) => {
57
+ if (done)
58
+ return;
59
+ done = true;
60
+ const state = opened.form.getState();
61
+ opened.destroy();
62
+ root.hidden = false;
63
+ if (from?.isConnected)
64
+ from.focus();
65
+ resolve({ saved, recordId: state.recordId ?? null, values: state.values });
66
+ };
67
+ root.hidden = true;
68
+ const opened = (0, viewer_1.mountViewer)(place, { ...options, host: { ...options.host, close: () => end(false) } });
69
+ const back = doc.createElement('button');
70
+ back.type = 'button';
71
+ back.className = 'fd-button fd-button-link fd-back';
72
+ back.textContent = opener.back;
73
+ back.addEventListener('click', () => end(false));
74
+ opened.element.prepend(back);
75
+ const leave = () => void opened.form.settled().then(() => end(true));
76
+ opened.on('save', leave);
77
+ opened.on('send', leave);
78
+ (opened.element.querySelector(dialog_1.FIRST_FIELD) ?? back).focus();
79
+ });
80
+ }
81
+ //# 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,78 @@
1
+ import { FIRST_FIELD, 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
+ // What belongs to the page that opened it alone.
28
+ drafts: undefined,
29
+ autosave: undefined,
30
+ readonly: undefined,
31
+ editSwitch: undefined,
32
+ saveStatus: undefined,
33
+ };
34
+ const title = request.title ?? opener.title(found);
35
+ const result = request.as === 'page' ? await inPlace(opener, shared)
36
+ : request.as === 'panel' ? await openFormPanel({ ...shared, title, side: request.side })
37
+ : await openFormDialog({ ...shared, title, size: found.layout.type === 'sheet' ? 'large' : 'medium' });
38
+ const name = nameFieldOf(found);
39
+ const label = name ? result.values[name] : undefined;
40
+ return { ...result, ...(typeof label === 'string' && label ? { label } : {}) };
41
+ }
42
+ /**
43
+ * A page in this form's place, with Back over it. Saved or sent — once its own
44
+ * after-save steps have run — it gives way back to this form, as it was, and
45
+ * the run goes on; Back, or a `close` step inside it, returns without.
46
+ */
47
+ function inPlace(opener, options) {
48
+ const { place, root } = opener;
49
+ const doc = place.ownerDocument;
50
+ const from = doc.activeElement;
51
+ return new Promise((resolve) => {
52
+ let done = false;
53
+ const end = (saved) => {
54
+ if (done)
55
+ return;
56
+ done = true;
57
+ const state = opened.form.getState();
58
+ opened.destroy();
59
+ root.hidden = false;
60
+ if (from?.isConnected)
61
+ from.focus();
62
+ resolve({ saved, recordId: state.recordId ?? null, values: state.values });
63
+ };
64
+ root.hidden = true;
65
+ const opened = mountViewer(place, { ...options, host: { ...options.host, close: () => end(false) } });
66
+ const back = doc.createElement('button');
67
+ back.type = 'button';
68
+ back.className = 'fd-button fd-button-link fd-back';
69
+ back.textContent = opener.back;
70
+ back.addEventListener('click', () => end(false));
71
+ opened.element.prepend(back);
72
+ const leave = () => void opened.form.settled().then(() => end(true));
73
+ opened.on('save', leave);
74
+ opened.on('send', leave);
75
+ (opened.element.querySelector(FIRST_FIELD) ?? back).focus();
76
+ });
77
+ }
78
+ //# 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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"}
@@ -0,0 +1,35 @@
1
+ import { type FieldNode, type FieldType, type LabelPlace, type SectionNode } from '@fieldia/core';
2
+ /**
3
+ * Where a part sits, as the viewer lays a page out: how many columns the grid
4
+ * round it has, whether anything is drawn round it yet, and where labels go
5
+ * there. Worked out once, top down, so the stylesheet is handed plain facts.
6
+ */
7
+ export interface Place {
8
+ /** The columns of the grid it sits in, at full width: one on the page, in a tab or in a step. */
9
+ columns: number;
10
+ /** Nothing is drawn round it yet: a card here is a box of its own. */
11
+ onPage: boolean;
12
+ /** Where labels sit here, as the page or a group round it says; undefined leaves them to the skin. */
13
+ labels?: LabelPlace;
14
+ }
15
+ export type SectionStyle = NonNullable<SectionNode['style']>;
16
+ export interface SectionPlan {
17
+ style: SectionStyle;
18
+ /**
19
+ * An arrangement: untitled and plain, it only holds parts side by side or
20
+ * one under another. In a grid with columns it lays them on the `tracks` it
21
+ * covers there; one column wide with columns of its own, they share that
22
+ * one cell (`shared`). Anywhere else it has a grid of its own.
23
+ */
24
+ arrangement: boolean;
25
+ at?: 'tracks' | 'shared';
26
+ /** Where the parts inside it sit. */
27
+ inner: Place;
28
+ }
29
+ /** How a section is drawn where it sits, and where that leaves the parts inside it. */
30
+ export declare function planSection(node: SectionNode, place: Place): SectionPlan;
31
+ /**
32
+ * Where a field's label sits: its own place, else where it is put; a table's label beside it goes above.
33
+ * A tick box's words always come after the box: they are all it says, and beside or out of sight would part them from it.
34
+ */
35
+ export declare function labelPlace(node: FieldNode, type: FieldType, place: LabelPlace | undefined): LabelPlace | 'after' | undefined;
@@ -0,0 +1,35 @@
1
+ import { type FieldNode, type FieldType, type LabelPlace, type SectionNode } from '@fieldia/core';
2
+ /**
3
+ * Where a part sits, as the viewer lays a page out: how many columns the grid
4
+ * round it has, whether anything is drawn round it yet, and where labels go
5
+ * there. Worked out once, top down, so the stylesheet is handed plain facts.
6
+ */
7
+ export interface Place {
8
+ /** The columns of the grid it sits in, at full width: one on the page, in a tab or in a step. */
9
+ columns: number;
10
+ /** Nothing is drawn round it yet: a card here is a box of its own. */
11
+ onPage: boolean;
12
+ /** Where labels sit here, as the page or a group round it says; undefined leaves them to the skin. */
13
+ labels?: LabelPlace;
14
+ }
15
+ export type SectionStyle = NonNullable<SectionNode['style']>;
16
+ export interface SectionPlan {
17
+ style: SectionStyle;
18
+ /**
19
+ * An arrangement: untitled and plain, it only holds parts side by side or
20
+ * one under another. In a grid with columns it lays them on the `tracks` it
21
+ * covers there; one column wide with columns of its own, they share that
22
+ * one cell (`shared`). Anywhere else it has a grid of its own.
23
+ */
24
+ arrangement: boolean;
25
+ at?: 'tracks' | 'shared';
26
+ /** Where the parts inside it sit. */
27
+ inner: Place;
28
+ }
29
+ /** How a section is drawn where it sits, and where that leaves the parts inside it. */
30
+ export declare function planSection(node: SectionNode, place: Place): SectionPlan;
31
+ /**
32
+ * Where a field's label sits: its own place, else where it is put; a table's label beside it goes above.
33
+ * A tick box's words always come after the box: they are all it says, and beside or out of sight would part them from it.
34
+ */
35
+ export declare function labelPlace(node: FieldNode, type: FieldType, place: LabelPlace | undefined): LabelPlace | 'after' | undefined;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.planSection = planSection;
4
+ exports.labelPlace = labelPlace;
5
+ const core_1 = require("@fieldia/core");
6
+ /** How a section is drawn where it sits, and where that leaves the parts inside it. */
7
+ function planSection(node, place) {
8
+ const style = node.style ?? 'card';
9
+ const arrangement = style === 'plain' && !node.title;
10
+ const own = (0, core_1.wideColumns)(node.columns);
11
+ const span = node.colspan ?? 1;
12
+ const at = arrangement && place.columns > 1 ? (span === 1 && own > 1 ? 'shared' : 'tracks') : undefined;
13
+ return {
14
+ style,
15
+ arrangement,
16
+ at,
17
+ inner: {
18
+ columns: at === 'tracks' ? Math.min(span, place.columns) : own,
19
+ // A line under a title and a plain group draw no box: what is inside them still sits on the page.
20
+ onPage: place.onPage && (style === 'plain' || style === 'line'),
21
+ labels: node.labels ?? place.labels,
22
+ },
23
+ };
24
+ }
25
+ /** Kinds shown as a table: no room beside them for a label, which goes above. */
26
+ const TABLES = new Set(['one2many', 'matrix']);
27
+ /**
28
+ * Where a field's label sits: its own place, else where it is put; a table's label beside it goes above.
29
+ * A tick box's words always come after the box: they are all it says, and beside or out of sight would part them from it.
30
+ */
31
+ function labelPlace(node, type, place) {
32
+ if (type === 'boolean' && node.widget === 'tick')
33
+ return 'after';
34
+ const chosen = node.labels ?? place;
35
+ return chosen === 'beside' && TABLES.has(type) ? 'above' : chosen;
36
+ }
37
+ //# sourceMappingURL=place.js.map
@@ -0,0 +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"}
@@ -0,0 +1,33 @@
1
+ import { wideColumns } from '@fieldia/core';
2
+ /** How a section is drawn where it sits, and where that leaves the parts inside it. */
3
+ export function planSection(node, place) {
4
+ const style = node.style ?? 'card';
5
+ const arrangement = style === 'plain' && !node.title;
6
+ const own = wideColumns(node.columns);
7
+ const span = node.colspan ?? 1;
8
+ const at = arrangement && place.columns > 1 ? (span === 1 && own > 1 ? 'shared' : 'tracks') : undefined;
9
+ return {
10
+ style,
11
+ arrangement,
12
+ at,
13
+ inner: {
14
+ columns: at === 'tracks' ? Math.min(span, place.columns) : own,
15
+ // A line under a title and a plain group draw no box: what is inside them still sits on the page.
16
+ onPage: place.onPage && (style === 'plain' || style === 'line'),
17
+ labels: node.labels ?? place.labels,
18
+ },
19
+ };
20
+ }
21
+ /** Kinds shown as a table: no room beside them for a label, which goes above. */
22
+ const TABLES = new Set(['one2many', 'matrix']);
23
+ /**
24
+ * Where a field's label sits: its own place, else where it is put; a table's label beside it goes above.
25
+ * A tick box's words always come after the box: they are all it says, and beside or out of sight would part them from it.
26
+ */
27
+ export function labelPlace(node, type, place) {
28
+ if (type === 'boolean' && node.widget === 'tick')
29
+ return 'after';
30
+ const chosen = node.labels ?? place;
31
+ return chosen === 'beside' && TABLES.has(type) ? 'above' : chosen;
32
+ }
33
+ //# sourceMappingURL=place.mjs.map
@@ -0,0 +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"}
@@ -3,5 +3,24 @@ import type { WidgetDialogs } from '@fieldia/widgets';
3
3
  import type { ViewerOptions } from './viewer.mjs';
4
4
  /** The field a page's records are named by: its title, or "name", or its first line of text. */
5
5
  export declare function nameFieldOf(page: Page): string | null;
6
+ /**
7
+ * What a part asks the app's pages for: the page for a model, to show a
8
+ * linked record in a dialog; or a saved page by its id — and the version it
9
+ * keeps to, when it keeps to one — to draw a saved form placed in another.
10
+ */
11
+ export type PageRequest = {
12
+ model: string;
13
+ } | {
14
+ id: string;
15
+ version?: number;
16
+ };
17
+ /**
18
+ * The app's pages: a record of them by key — a model, a page's id, or
19
+ * `id@version` for a version kept to — or a function asked for each, which
20
+ * may answer at once or with a promise.
21
+ */
22
+ export type PageFinder = Record<string, Page> | ((request: PageRequest) => Page | null | undefined | Promise<Page | null | undefined>);
23
+ /** The page the app gives for a request: from `pages`, and for a model from `relatedPages` after it. A promise when it answers later. */
24
+ export declare function findPage(options: Pick<ViewerOptions, 'pages' | 'relatedPages'>, request: PageRequest): Page | null | Promise<Page | null>;
6
25
  /** The dialogs a page's widgets may open, made from the viewer's own options. */
7
26
  export declare function pageDialogs(options: ViewerOptions): WidgetDialogs;
@@ -3,5 +3,24 @@ import type { WidgetDialogs } from '@fieldia/widgets';
3
3
  import type { ViewerOptions } from './viewer';
4
4
  /** The field a page's records are named by: its title, or "name", or its first line of text. */
5
5
  export declare function nameFieldOf(page: Page): string | null;
6
+ /**
7
+ * What a part asks the app's pages for: the page for a model, to show a
8
+ * linked record in a dialog; or a saved page by its id — and the version it
9
+ * keeps to, when it keeps to one — to draw a saved form placed in another.
10
+ */
11
+ export type PageRequest = {
12
+ model: string;
13
+ } | {
14
+ id: string;
15
+ version?: number;
16
+ };
17
+ /**
18
+ * The app's pages: a record of them by key — a model, a page's id, or
19
+ * `id@version` for a version kept to — or a function asked for each, which
20
+ * may answer at once or with a promise.
21
+ */
22
+ export type PageFinder = Record<string, Page> | ((request: PageRequest) => Page | null | undefined | Promise<Page | null | undefined>);
23
+ /** The page the app gives for a request: from `pages`, and for a model from `relatedPages` after it. A promise when it answers later. */
24
+ export declare function findPage(options: Pick<ViewerOptions, 'pages' | 'relatedPages'>, request: PageRequest): Page | null | Promise<Page | null>;
6
25
  /** The dialogs a page's widgets may open, made from the viewer's own options. */
7
26
  export declare function pageDialogs(options: ViewerOptions): WidgetDialogs;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.nameFieldOf = nameFieldOf;
4
+ exports.findPage = findPage;
4
5
  exports.pageDialogs = pageDialogs;
5
6
  const dialog_1 = require("./dialog");
6
7
  /** The field a page's records are named by: its title, or "name", or its first line of text. */
@@ -27,6 +28,17 @@ function valuesPage(fields, title, readonly) {
27
28
  },
28
29
  };
29
30
  }
31
+ /** The page the app gives for a request: from `pages`, and for a model from `relatedPages` after it. A promise when it answers later. */
32
+ function findPage(options, request) {
33
+ const { pages, relatedPages } = options;
34
+ const key = 'model' in request ? request.model : request.version === undefined ? request.id : `${request.id}@${request.version}`;
35
+ const found = typeof pages === 'function' ? pages(request) : pages && Object.prototype.hasOwnProperty.call(pages, key) ? pages[key] : null;
36
+ if (found instanceof Promise)
37
+ return found.then((page) => page ?? null);
38
+ if (found || !('model' in request))
39
+ return found ?? null;
40
+ return (typeof relatedPages === 'function' ? relatedPages(request.model) : relatedPages?.[request.model]) ?? null;
41
+ }
30
42
  /** Only finding and making linked records: values edited in a dialog are no record of the source's to load, save or recalculate. */
31
43
  function lookupsOf(source) {
32
44
  if (!source)
@@ -38,7 +50,7 @@ function lookupsOf(source) {
38
50
  }
39
51
  /** The dialogs a page's widgets may open, made from the viewer's own options. */
40
52
  function pageDialogs(options) {
41
- const pageFor = (model) => (typeof options.relatedPages === 'function' ? options.relatedPages(model) : options.relatedPages?.[model]) ?? null;
53
+ const pageFor = (model) => findPage(options, { model });
42
54
  // A dialog's page looks and reads like the page that opened it, and can open dialogs of its own.
43
55
  const shared = {
44
56
  locale: options.locale,
@@ -46,13 +58,15 @@ function pageDialogs(options) {
46
58
  dir: options.dir,
47
59
  widgets: options.widgets,
48
60
  preferences: options.preferences,
61
+ pages: options.pages,
49
62
  relatedPages: options.relatedPages,
50
63
  translate: options.translate,
64
+ look: options.page.look,
51
65
  };
52
66
  return {
53
67
  canOpen: (model) => pageFor(model) !== null,
54
68
  async openRecord(model, request) {
55
- const related = pageFor(model);
69
+ const related = await pageFor(model);
56
70
  if (!related)
57
71
  return null;
58
72
  const nameField = nameFieldOf(related);
@@ -70,7 +84,7 @@ function pageDialogs(options) {
70
84
  const name = nameField ? result.values[nameField] : null;
71
85
  return { id: result.recordId, label: typeof name === 'string' && name ? name : request.name ?? request.title };
72
86
  },
73
- searchMore: (request) => (0, dialog_1.openSearchDialog)({ title: request.title, search: request.search, locale: options.locale, skin: options.skin, dir: options.dir }),
87
+ searchMore: (request) => (0, dialog_1.openSearchDialog)({ title: request.title, search: request.search, locale: options.locale, skin: options.skin, dir: options.dir, look: options.page.look }),
74
88
  async editValues(request) {
75
89
  const result = await (0, dialog_1.openFormDialog)({
76
90
  ...shared,
@@ -1 +1 @@
1
- {"version":3,"file":"related.js","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/related.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"related.js","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/related.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,17 @@ function valuesPage(fields, title, readonly) {
23
23
  },
24
24
  };
25
25
  }
26
+ /** The page the app gives for a request: from `pages`, and for a model from `relatedPages` after it. A promise when it answers later. */
27
+ export function findPage(options, request) {
28
+ const { pages, relatedPages } = options;
29
+ const key = 'model' in request ? request.model : request.version === undefined ? request.id : `${request.id}@${request.version}`;
30
+ const found = typeof pages === 'function' ? pages(request) : pages && Object.prototype.hasOwnProperty.call(pages, key) ? pages[key] : null;
31
+ if (found instanceof Promise)
32
+ return found.then((page) => page ?? null);
33
+ if (found || !('model' in request))
34
+ return found ?? null;
35
+ return (typeof relatedPages === 'function' ? relatedPages(request.model) : relatedPages?.[request.model]) ?? null;
36
+ }
26
37
  /** Only finding and making linked records: values edited in a dialog are no record of the source's to load, save or recalculate. */
27
38
  function lookupsOf(source) {
28
39
  if (!source)
@@ -34,7 +45,7 @@ function lookupsOf(source) {
34
45
  }
35
46
  /** The dialogs a page's widgets may open, made from the viewer's own options. */
36
47
  export function pageDialogs(options) {
37
- const pageFor = (model) => (typeof options.relatedPages === 'function' ? options.relatedPages(model) : options.relatedPages?.[model]) ?? null;
48
+ const pageFor = (model) => findPage(options, { model });
38
49
  // A dialog's page looks and reads like the page that opened it, and can open dialogs of its own.
39
50
  const shared = {
40
51
  locale: options.locale,
@@ -42,13 +53,15 @@ export function pageDialogs(options) {
42
53
  dir: options.dir,
43
54
  widgets: options.widgets,
44
55
  preferences: options.preferences,
56
+ pages: options.pages,
45
57
  relatedPages: options.relatedPages,
46
58
  translate: options.translate,
59
+ look: options.page.look,
47
60
  };
48
61
  return {
49
62
  canOpen: (model) => pageFor(model) !== null,
50
63
  async openRecord(model, request) {
51
- const related = pageFor(model);
64
+ const related = await pageFor(model);
52
65
  if (!related)
53
66
  return null;
54
67
  const nameField = nameFieldOf(related);
@@ -66,7 +79,7 @@ export function pageDialogs(options) {
66
79
  const name = nameField ? result.values[nameField] : null;
67
80
  return { id: result.recordId, label: typeof name === 'string' && name ? name : request.name ?? request.title };
68
81
  },
69
- searchMore: (request) => openSearchDialog({ title: request.title, search: request.search, locale: options.locale, skin: options.skin, dir: options.dir }),
82
+ searchMore: (request) => openSearchDialog({ title: request.title, search: request.search, locale: options.locale, skin: options.skin, dir: options.dir, look: options.page.look }),
70
83
  async editValues(request) {
71
84
  const result = await openFormDialog({
72
85
  ...shared,
@@ -1 +1 @@
1
- {"version":3,"file":"related.mjs","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/related.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"related.mjs","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/related.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Tone } from '@fieldia/core';
2
+ import type { El } from './dom.mjs';
3
+ /**
4
+ * Words a step says, as toasts at the foot of the screen: each in its tone,
5
+ * one over another, in a polite live region inside the form — so they wear its
6
+ * skin, scheme and direction. Each goes by itself after a moment, but not
7
+ * while the pointer or the focus is on it, and at once with its ×.
8
+ */
9
+ export declare function sayer(root: HTMLElement, el: El, dismiss: string): (message: string, tone: Tone) => void;
@@ -0,0 +1,9 @@
1
+ import type { Tone } from '@fieldia/core';
2
+ import type { El } from './dom';
3
+ /**
4
+ * Words a step says, as toasts at the foot of the screen: each in its tone,
5
+ * one over another, in a polite live region inside the form — so they wear its
6
+ * skin, scheme and direction. Each goes by itself after a moment, but not
7
+ * while the pointer or the focus is on it, and at once with its ×.
8
+ */
9
+ export declare function sayer(root: HTMLElement, el: El, dismiss: string): (message: string, tone: Tone) => void;
package/src/lib/say.js ADDED
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sayer = sayer;
4
+ /** How long words stay before they go by themselves: a warning or a danger stays longer. */
5
+ const STAY_MS = 6000;
6
+ const STAY_LONG_MS = 10000;
7
+ /** The most toasts on screen at once: the oldest give way. */
8
+ const MOST = 4;
9
+ /**
10
+ * Words a step says, as toasts at the foot of the screen: each in its tone,
11
+ * one over another, in a polite live region inside the form — so they wear its
12
+ * skin, scheme and direction. Each goes by itself after a moment, but not
13
+ * while the pointer or the focus is on it, and at once with its ×.
14
+ */
15
+ function sayer(root, el, dismiss) {
16
+ // There before anything is said, so a screen reader hears what comes into it.
17
+ const region = el('div', { class: 'fd-says', role: 'status', 'aria-live': 'polite' });
18
+ root.append(region);
19
+ return (message, tone) => {
20
+ const close = el('button', { type: 'button', class: 'fd-alert-close', 'aria-label': dismiss }, '×');
21
+ const toast = el('div', { class: 'fd-say', 'data-tone': tone }, el('span', {}, message), close);
22
+ // Its edge in its tone's colour, from the scheme's own: a danger is the error colour.
23
+ toast.style.setProperty('--fd-tone', `var(--fd-${tone === 'danger' ? 'error' : tone})`);
24
+ let timer;
25
+ const hold = () => clearTimeout(timer);
26
+ const go = () => {
27
+ hold();
28
+ toast.remove();
29
+ };
30
+ const wait = () => {
31
+ hold();
32
+ timer = setTimeout(go, tone === 'warning' || tone === 'danger' ? STAY_LONG_MS : STAY_MS);
33
+ };
34
+ close.addEventListener('click', go);
35
+ toast.addEventListener('mouseenter', hold);
36
+ toast.addEventListener('focusin', hold);
37
+ toast.addEventListener('mouseleave', wait);
38
+ toast.addEventListener('focusout', wait);
39
+ region.append(toast);
40
+ while (region.children.length > MOST)
41
+ region.firstElementChild?.remove();
42
+ wait();
43
+ };
44
+ }
45
+ //# sourceMappingURL=say.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"say.js","sourceRoot":"","sources":["../../../../../libs/viewer/src/lib/say.ts"],"names":[],"mappings":";;AAeA,sBA4BC;AAxCD,4FAA4F;AAC5F,MAAM,OAAO,GAAG,IAAI,CAAC;AACrB,MAAM,YAAY,GAAG,KAAK,CAAC;AAC3B,8DAA8D;AAC9D,MAAM,IAAI,GAAG,CAAC,CAAC;AAEf;;;;;GAKG;AACH,SAAgB,KAAK,CAAC,IAAiB,EAAE,EAAM,EAAE,OAAe;IAC9D,8EAA8E;IAC9E,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QACpG,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;QAChG,sFAAsF;QACtF,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,YAAY,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QACxF,IAAI,KAAgD,CAAC;QACrD,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,GAAG,EAAE;YACd,IAAI,EAAE,CAAC;YACP,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,EAAE,CAAC;YACP,KAAK,GAAG,UAAU,CAAC,EAAE,EAAE,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC3F,CAAC,CAAC;QACF,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACpC,KAAK,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC3C,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACxC,KAAK,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC3C,KAAK,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI;YAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC;QACzE,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC"}