@fieldia/react 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.
- package/README.md +21 -1
- package/package.json +4 -4
- package/src/lib/fieldia-form.d.mts +19 -1
- package/src/lib/fieldia-form.d.ts +19 -1
- package/src/lib/fieldia-form.js +15 -2
- package/src/lib/fieldia-form.js.map +1 -1
- package/src/lib/fieldia-form.mjs +15 -2
- package/src/lib/fieldia-form.mjs.map +1 -1
package/README.md
CHANGED
|
@@ -21,4 +21,24 @@ export function Customer() {
|
|
|
21
21
|
|
|
22
22
|
Custom fields and slot content can be React components (`fieldTypes`, `slots`);
|
|
23
23
|
`useFormState(form)` gives you a form's state as React state. A list page opens
|
|
24
|
-
a row through `onOpenRecord`.
|
|
24
|
+
a row through `onOpenRecord`.
|
|
25
|
+
|
|
26
|
+
The form's events are props, each read anew on every render without mounting
|
|
27
|
+
again; `onAction` may answer a button or a `call` step:
|
|
28
|
+
|
|
29
|
+
```tsx
|
|
30
|
+
<FieldiaForm
|
|
31
|
+
page={page}
|
|
32
|
+
dataSource={dataSource}
|
|
33
|
+
pages={pages}
|
|
34
|
+
onAction={async ({ action, values }) => (action === 'check_stock' ? { values: { price: await priceOf(values.product) } } : undefined)}
|
|
35
|
+
onChange={({ field, value, by }) => {}} // by: 'person' | 'step' | 'app'
|
|
36
|
+
onSave={({ recordId, values }) => {}}
|
|
37
|
+
onSend={({ values }) => {}}
|
|
38
|
+
onStep={({ step }) => {}}
|
|
39
|
+
onRun={({ id, result }) => {}}
|
|
40
|
+
/>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`host` and `onOpen` are the viewer's own options (see `@fieldia/viewer`); the
|
|
44
|
+
handle from `ref` or `onReady` has `on`, `setValues` and `run`. MIT licensed.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fieldia/react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "React binding for Fieldia: <FieldiaForm> over the plain-DOM viewer, with custom fields and slots as React components.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://fieldia.dev",
|
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
"./package.json": "./package.json"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@fieldia/core": "0.
|
|
25
|
-
"@fieldia/viewer": "0.
|
|
26
|
-
"@fieldia/widgets": "0.
|
|
24
|
+
"@fieldia/core": "0.12.0",
|
|
25
|
+
"@fieldia/viewer": "0.12.0",
|
|
26
|
+
"@fieldia/widgets": "0.12.0",
|
|
27
27
|
"tslib": "^2.8.1"
|
|
28
28
|
},
|
|
29
29
|
"sideEffects": false,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Field, FieldNode, Form, FormState, Value } from '@fieldia/core';
|
|
1
|
+
import type { Field, FieldNode, Form, FormEvents, FormState, Value } from '@fieldia/core';
|
|
2
2
|
import { type ViewerHandle, type ViewerOptions } from '@fieldia/viewer';
|
|
3
3
|
import type { WidgetState } from '@fieldia/widgets';
|
|
4
4
|
import { type ComponentType, type CSSProperties } from 'react';
|
|
@@ -41,6 +41,24 @@ export interface FieldiaFormProps extends Omit<ViewerOptions, 'slots'> {
|
|
|
41
41
|
style?: CSSProperties;
|
|
42
42
|
/** Called once per mount with the viewer's handle. */
|
|
43
43
|
onReady?: (handle: ViewerHandle) => void;
|
|
44
|
+
/** A field was written — `by` a person, a step or the app. */
|
|
45
|
+
onChange?: (event: FormEvents['change']) => void;
|
|
46
|
+
/** A record was saved. */
|
|
47
|
+
onSave?: (event: FormEvents['save']) => void;
|
|
48
|
+
/** A page of responses sent its answers. */
|
|
49
|
+
onSend?: (event: FormEvents['send']) => void;
|
|
50
|
+
/** A wizard's step was entered. */
|
|
51
|
+
onStep?: (event: FormEvents['step']) => void;
|
|
52
|
+
/** A run of steps ended — a button's, a moment's — and how. */
|
|
53
|
+
onRun?: (event: FormEvents['run']) => void;
|
|
54
|
+
/** The form has its values: a record loaded — the pager moved on, a copy shown — or a new one. */
|
|
55
|
+
onRecord?: (event: FormEvents['open']) => void;
|
|
56
|
+
/** The record was archived or brought back by a step, such as the gear menu's Archive. */
|
|
57
|
+
onArchive?: (event: FormEvents['archive']) => void;
|
|
58
|
+
/** The record was copied by a step; the form shows the copy. */
|
|
59
|
+
onDuplicate?: (event: FormEvents['duplicate']) => void;
|
|
60
|
+
/** The record was deleted by a step. */
|
|
61
|
+
onDelete?: (event: FormEvents['delete']) => void;
|
|
44
62
|
}
|
|
45
63
|
/** A form's state as React state: the component re-renders on every change. */
|
|
46
64
|
export declare function useFormState(form: Form): FormState;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Field, FieldNode, Form, FormState, Value } from '@fieldia/core';
|
|
1
|
+
import type { Field, FieldNode, Form, FormEvents, FormState, Value } from '@fieldia/core';
|
|
2
2
|
import { type ViewerHandle, type ViewerOptions } from '@fieldia/viewer';
|
|
3
3
|
import type { WidgetState } from '@fieldia/widgets';
|
|
4
4
|
import { type ComponentType, type CSSProperties } from 'react';
|
|
@@ -41,6 +41,24 @@ export interface FieldiaFormProps extends Omit<ViewerOptions, 'slots'> {
|
|
|
41
41
|
style?: CSSProperties;
|
|
42
42
|
/** Called once per mount with the viewer's handle. */
|
|
43
43
|
onReady?: (handle: ViewerHandle) => void;
|
|
44
|
+
/** A field was written — `by` a person, a step or the app. */
|
|
45
|
+
onChange?: (event: FormEvents['change']) => void;
|
|
46
|
+
/** A record was saved. */
|
|
47
|
+
onSave?: (event: FormEvents['save']) => void;
|
|
48
|
+
/** A page of responses sent its answers. */
|
|
49
|
+
onSend?: (event: FormEvents['send']) => void;
|
|
50
|
+
/** A wizard's step was entered. */
|
|
51
|
+
onStep?: (event: FormEvents['step']) => void;
|
|
52
|
+
/** A run of steps ended — a button's, a moment's — and how. */
|
|
53
|
+
onRun?: (event: FormEvents['run']) => void;
|
|
54
|
+
/** The form has its values: a record loaded — the pager moved on, a copy shown — or a new one. */
|
|
55
|
+
onRecord?: (event: FormEvents['open']) => void;
|
|
56
|
+
/** The record was archived or brought back by a step, such as the gear menu's Archive. */
|
|
57
|
+
onArchive?: (event: FormEvents['archive']) => void;
|
|
58
|
+
/** The record was copied by a step; the form shows the copy. */
|
|
59
|
+
onDuplicate?: (event: FormEvents['duplicate']) => void;
|
|
60
|
+
/** The record was deleted by a step. */
|
|
61
|
+
onDelete?: (event: FormEvents['delete']) => void;
|
|
44
62
|
}
|
|
45
63
|
/** A form's state as React state: the component re-renders on every change. */
|
|
46
64
|
export declare function useFormState(form: Form): FormState;
|
package/src/lib/fieldia-form.js
CHANGED
|
@@ -6,6 +6,8 @@ const jsx_runtime_1 = require("react/jsx-runtime");
|
|
|
6
6
|
const viewer_1 = require("@fieldia/viewer");
|
|
7
7
|
const react_1 = require("react");
|
|
8
8
|
const react_dom_1 = require("react-dom");
|
|
9
|
+
/** The form's events a prop hears, by the prop's name. */
|
|
10
|
+
const EVENTS = { onChange: 'change', onSave: 'save', onSend: 'send', onStep: 'step', onRun: 'run', onRecord: 'open', onArchive: 'archive', onDuplicate: 'duplicate', onDelete: 'delete' };
|
|
9
11
|
/** A form's state as React state: the component re-renders on every change. */
|
|
10
12
|
function useFormState(form) {
|
|
11
13
|
return (0, react_1.useSyncExternalStore)(form.subscribe, form.getState, form.getState);
|
|
@@ -52,6 +54,10 @@ exports.FieldiaForm = (0, react_1.forwardRef)(function FieldiaForm(props, ref) {
|
|
|
52
54
|
const fieldKeys = Object.keys(props.fieldTypes ?? {}).join('|');
|
|
53
55
|
const slotKeys = Object.keys(props.slots ?? {}).join('|');
|
|
54
56
|
const labelsKey = JSON.stringify(props.labels ?? {});
|
|
57
|
+
// A different person may see different parts: the form is made again for them.
|
|
58
|
+
const userKey = JSON.stringify(props.user ?? null);
|
|
59
|
+
// Other values from the app (its context) may filter and show other things: made again for them too.
|
|
60
|
+
const contextKey = JSON.stringify(props.context ?? null);
|
|
55
61
|
(0, react_1.useEffect)(() => {
|
|
56
62
|
const element = host.current;
|
|
57
63
|
if (!element)
|
|
@@ -85,15 +91,22 @@ exports.FieldiaForm = (0, react_1.forwardRef)(function FieldiaForm(props, ref) {
|
|
|
85
91
|
});
|
|
86
92
|
};
|
|
87
93
|
}
|
|
88
|
-
const { fieldTypes: _fields, slots: _slots, className: _class, style: _style, onReady: _ready, ...options } = latest.current;
|
|
94
|
+
const { fieldTypes: _fields, slots: _slots, className: _class, style: _style, onReady: _ready, onChange: _change, onSave: _save, onSend: _send, onStep: _step, onRun: _run, onRecord: _record, onArchive: _archive, onDuplicate: _duplicate, onDelete: _delete, ...options } = latest.current;
|
|
89
95
|
const mounted = (0, viewer_1.mountViewer)(element, {
|
|
90
96
|
...options,
|
|
91
97
|
widgets,
|
|
92
98
|
slots,
|
|
99
|
+
// The newest handler; what it answers — values, words, a page, a stop — the form takes.
|
|
93
100
|
onAction: (request) => latest.current.onAction?.(request),
|
|
94
101
|
// The newest handler, as for actions; rows look openable only when there is one.
|
|
95
102
|
onOpenRecord: options.onOpenRecord && ((id) => latest.current.onOpenRecord?.(id)),
|
|
103
|
+
// A page a step opens: the newest way of the app's, else the viewer's.
|
|
104
|
+
onOpen: (request) => latest.current.onOpen?.(request),
|
|
96
105
|
});
|
|
106
|
+
// Each event through the newest handler, as for actions.
|
|
107
|
+
for (const [prop, event] of Object.entries(EVENTS)) {
|
|
108
|
+
mounted.on(event, (payload) => latest.current[prop]?.(payload));
|
|
109
|
+
}
|
|
97
110
|
setHandle(mounted);
|
|
98
111
|
setPortals(found);
|
|
99
112
|
latest.current.onReady?.(mounted);
|
|
@@ -102,7 +115,7 @@ exports.FieldiaForm = (0, react_1.forwardRef)(function FieldiaForm(props, ref) {
|
|
|
102
115
|
setHandle(null);
|
|
103
116
|
setPortals([]);
|
|
104
117
|
};
|
|
105
|
-
}, [props.page, props.form, props.dataSource, props.recordId, props.dir, labelsKey, fieldKeys, slotKeys]);
|
|
118
|
+
}, [props.page, props.form, props.dataSource, props.recordId, userKey, contextKey, props.dir, labelsKey, fieldKeys, slotKeys]);
|
|
106
119
|
(0, react_1.useEffect)(() => {
|
|
107
120
|
handle?.setSkin(props.skin ?? 'underline');
|
|
108
121
|
}, [handle, props.skin]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fieldia-form.js","sourceRoot":"","sources":["../../../../../libs/react/src/lib/fieldia-form.tsx"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"fieldia-form.js","sourceRoot":"","sources":["../../../../../libs/react/src/lib/fieldia-form.tsx"],"names":[],"mappings":"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"}
|
package/src/lib/fieldia-form.mjs
CHANGED
|
@@ -2,6 +2,8 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
|
|
|
2
2
|
import { mountViewer } from '@fieldia/viewer';
|
|
3
3
|
import { forwardRef, useEffect, useImperativeHandle, useRef, useState, useSyncExternalStore, } from 'react';
|
|
4
4
|
import { createPortal } from 'react-dom';
|
|
5
|
+
/** The form's events a prop hears, by the prop's name. */
|
|
6
|
+
const EVENTS = { onChange: 'change', onSave: 'save', onSend: 'send', onStep: 'step', onRun: 'run', onRecord: 'open', onArchive: 'archive', onDuplicate: 'duplicate', onDelete: 'delete' };
|
|
5
7
|
/** A form's state as React state: the component re-renders on every change. */
|
|
6
8
|
export function useFormState(form) {
|
|
7
9
|
return useSyncExternalStore(form.subscribe, form.getState, form.getState);
|
|
@@ -48,6 +50,10 @@ export const FieldiaForm = forwardRef(function FieldiaForm(props, ref) {
|
|
|
48
50
|
const fieldKeys = Object.keys(props.fieldTypes ?? {}).join('|');
|
|
49
51
|
const slotKeys = Object.keys(props.slots ?? {}).join('|');
|
|
50
52
|
const labelsKey = JSON.stringify(props.labels ?? {});
|
|
53
|
+
// A different person may see different parts: the form is made again for them.
|
|
54
|
+
const userKey = JSON.stringify(props.user ?? null);
|
|
55
|
+
// Other values from the app (its context) may filter and show other things: made again for them too.
|
|
56
|
+
const contextKey = JSON.stringify(props.context ?? null);
|
|
51
57
|
useEffect(() => {
|
|
52
58
|
const element = host.current;
|
|
53
59
|
if (!element)
|
|
@@ -81,15 +87,22 @@ export const FieldiaForm = forwardRef(function FieldiaForm(props, ref) {
|
|
|
81
87
|
});
|
|
82
88
|
};
|
|
83
89
|
}
|
|
84
|
-
const { fieldTypes: _fields, slots: _slots, className: _class, style: _style, onReady: _ready, ...options } = latest.current;
|
|
90
|
+
const { fieldTypes: _fields, slots: _slots, className: _class, style: _style, onReady: _ready, onChange: _change, onSave: _save, onSend: _send, onStep: _step, onRun: _run, onRecord: _record, onArchive: _archive, onDuplicate: _duplicate, onDelete: _delete, ...options } = latest.current;
|
|
85
91
|
const mounted = mountViewer(element, {
|
|
86
92
|
...options,
|
|
87
93
|
widgets,
|
|
88
94
|
slots,
|
|
95
|
+
// The newest handler; what it answers — values, words, a page, a stop — the form takes.
|
|
89
96
|
onAction: (request) => latest.current.onAction?.(request),
|
|
90
97
|
// The newest handler, as for actions; rows look openable only when there is one.
|
|
91
98
|
onOpenRecord: options.onOpenRecord && ((id) => latest.current.onOpenRecord?.(id)),
|
|
99
|
+
// A page a step opens: the newest way of the app's, else the viewer's.
|
|
100
|
+
onOpen: (request) => latest.current.onOpen?.(request),
|
|
92
101
|
});
|
|
102
|
+
// Each event through the newest handler, as for actions.
|
|
103
|
+
for (const [prop, event] of Object.entries(EVENTS)) {
|
|
104
|
+
mounted.on(event, (payload) => latest.current[prop]?.(payload));
|
|
105
|
+
}
|
|
93
106
|
setHandle(mounted);
|
|
94
107
|
setPortals(found);
|
|
95
108
|
latest.current.onReady?.(mounted);
|
|
@@ -98,7 +111,7 @@ export const FieldiaForm = forwardRef(function FieldiaForm(props, ref) {
|
|
|
98
111
|
setHandle(null);
|
|
99
112
|
setPortals([]);
|
|
100
113
|
};
|
|
101
|
-
}, [props.page, props.form, props.dataSource, props.recordId, props.dir, labelsKey, fieldKeys, slotKeys]);
|
|
114
|
+
}, [props.page, props.form, props.dataSource, props.recordId, userKey, contextKey, props.dir, labelsKey, fieldKeys, slotKeys]);
|
|
102
115
|
useEffect(() => {
|
|
103
116
|
handle?.setSkin(props.skin ?? 'underline');
|
|
104
117
|
}, [handle, props.skin]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fieldia-form.mjs","sourceRoot":"","sources":["../../../../../libs/react/src/lib/fieldia-form.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAA4D,MAAM,iBAAiB,CAAC;AAExG,OAAO,EACL,UAAU,EACV,SAAS,EACT,mBAAmB,EACnB,MAAM,EACN,QAAQ,EACR,oBAAoB,GAIrB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"fieldia-form.mjs","sourceRoot":"","sources":["../../../../../libs/react/src/lib/fieldia-form.tsx"],"names":[],"mappings":"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"}
|