@ea-lab/reactive-json 0.0.20 → 0.0.22
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 +1 -1
- package/dist/esm/types/component/action/HashChangeListener.d.ts +9 -0
- package/{lib/component/action/Hide.jsx → dist/esm/types/component/action/Hide.d.ts} +2 -6
- package/dist/esm/types/component/action/MessageListener.d.ts +9 -0
- package/dist/esm/types/component/action/Popover.d.ts +5 -0
- package/dist/esm/types/component/action/ReactOnEvent.d.ts +26 -0
- package/dist/esm/types/component/action/Redirect.d.ts +9 -0
- package/dist/esm/types/component/action/Tooltip.d.ts +5 -0
- package/{lib/component/action/VisuallyHide.jsx → dist/esm/types/component/action/VisuallyHide.d.ts} +1 -4
- package/dist/esm/types/component/element/form/CheckBoxField.d.ts +7 -0
- package/dist/esm/types/component/element/form/DateField.d.ts +2 -0
- package/dist/esm/types/component/element/form/NumberField.d.ts +7 -0
- package/dist/esm/types/component/element/form/SelectField.d.ts +7 -0
- package/dist/esm/types/component/element/form/TextAreaField.d.ts +6 -0
- package/dist/esm/types/component/element/form/TextField.d.ts +6 -0
- package/dist/esm/types/component/element/form/formElementsCommon.d.ts +23 -0
- package/dist/esm/types/component/element/html/AccordionItem.d.ts +16 -0
- package/dist/esm/types/component/element/html/FolderSortableTree.d.ts +6 -0
- package/dist/esm/types/component/element/html/FormatNumeral.d.ts +7 -0
- package/dist/esm/types/component/element/html/Html.d.ts +8 -0
- package/dist/esm/types/component/element/html/LabelFromValue.d.ts +22 -0
- package/dist/esm/types/component/element/html/Modal.d.ts +6 -0
- package/dist/esm/types/component/element/html/ModalForm.d.ts +9 -0
- package/dist/esm/types/component/element/html/Paragraph.d.ts +5 -0
- package/dist/esm/types/component/element/html/PreformattedMarkup.d.ts +7 -0
- package/dist/esm/types/component/element/html/SortableTreeItemCollapseButton.d.ts +9 -0
- package/dist/esm/types/component/element/html/Tabs.d.ts +18 -0
- package/dist/esm/types/component/element/special/BootstrapElement.d.ts +10 -0
- package/dist/esm/types/component/element/special/Count.d.ts +13 -0
- package/dist/esm/types/component/element/special/DataFilter.d.ts +11 -0
- package/dist/esm/types/component/element/special/DelayedActions.d.ts +25 -0
- package/dist/esm/types/component/element/special/PageControls.d.ts +9 -0
- package/dist/esm/types/component/element/special/Phantom.d.ts +17 -0
- package/dist/esm/types/component/element/special/Switch.d.ts +6 -0
- package/dist/esm/types/component/hook/usePagination.d.ts +30 -0
- package/dist/esm/types/component/index.d.ts +5 -0
- package/dist/esm/types/component/reaction/addData.d.ts +6 -0
- package/dist/esm/types/component/reaction/fetchData.d.ts +8 -0
- package/dist/esm/types/component/reaction/moveData.d.ts +6 -0
- package/dist/esm/types/component/reaction/postMessage.d.ts +6 -0
- package/dist/esm/types/component/reaction/redirectNow.d.ts +6 -0
- package/dist/esm/types/component/reaction/removeData.d.ts +6 -0
- package/dist/esm/types/component/reaction/setClipboardData.d.ts +6 -0
- package/dist/esm/types/component/reaction/setData.d.ts +6 -0
- package/dist/esm/types/component/reaction/submitData.d.ts +8 -0
- package/dist/esm/types/component/reaction/triggerEvent.d.ts +6 -0
- package/dist/esm/types/component/utility/formatString.d.ts +17 -0
- package/dist/esm/types/engine/Actions.d.ts +19 -0
- package/dist/esm/types/engine/ComponentCollector.d.ts +12 -0
- package/{lib/engine/EventDispatcherContext.jsx → dist/esm/types/engine/EventDispatcherContext.d.ts} +4 -7
- package/dist/esm/types/engine/EventDispatcherProvider.d.ts +16 -0
- package/{lib/engine/GlobalDataContext.jsx → dist/esm/types/engine/GlobalDataContext.d.ts} +1 -4
- package/dist/esm/types/engine/GlobalDataContextProvider.d.ts +11 -0
- package/{lib/engine/PaginationContext.jsx → dist/esm/types/engine/PaginationContext.d.ts} +3 -4
- package/dist/esm/types/engine/PaginationProvider.d.ts +12 -0
- package/dist/esm/types/engine/ReactiveJsonRoot.d.ts +28 -0
- package/{lib/engine/TemplateContext.jsx → dist/esm/types/engine/TemplateContext.d.ts} +1 -4
- package/dist/esm/types/engine/TemplateSystem.d.ts +89 -0
- package/dist/esm/types/engine/View.d.ts +7 -0
- package/dist/esm/types/index.d.ts +6 -0
- package/dist/esm/types/main.d.ts +10 -0
- package/dist/index.cjs.js +9201 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.esm.js +9180 -0
- package/dist/index.esm.js.map +1 -0
- package/package.json +26 -15
- package/dist/reactive-json.css +0 -5
- package/dist/reactive-json.js +0 -47707
- package/dist/reactive-json.js.map +0 -1
- package/dist/reactive-json.umd.cjs +0 -366
- package/dist/reactive-json.umd.cjs.map +0 -1
- package/lib/component/action/HashChangeListener.jsx +0 -66
- package/lib/component/action/MessageListener.jsx +0 -62
- package/lib/component/action/Popover.jsx +0 -53
- package/lib/component/action/ReactOnEvent.jsx +0 -118
- package/lib/component/action/Redirect.jsx +0 -26
- package/lib/component/action/Tooltip.jsx +0 -27
- package/lib/component/element/form/CheckBoxField.jsx +0 -215
- package/lib/component/element/form/DateField.jsx +0 -42
- package/lib/component/element/form/NumberField.jsx +0 -29
- package/lib/component/element/form/SelectField.jsx +0 -130
- package/lib/component/element/form/TextAreaField.jsx +0 -48
- package/lib/component/element/form/TextField.jsx +0 -65
- package/lib/component/element/form/formElementsCommon.jsx +0 -54
- package/lib/component/element/html/AccordionItem.jsx +0 -42
- package/lib/component/element/html/FolderSortableTree.jsx +0 -307
- package/lib/component/element/html/FormatNumeral.jsx +0 -118
- package/lib/component/element/html/Html.jsx +0 -107
- package/lib/component/element/html/LabelFromValue.jsx +0 -89
- package/lib/component/element/html/Modal.jsx +0 -77
- package/lib/component/element/html/ModalForm.jsx +0 -30
- package/lib/component/element/html/Paragraph.jsx +0 -10
- package/lib/component/element/html/PreformattedMarkup.jsx +0 -54
- package/lib/component/element/html/SortableTreeItemCollapseButton.jsx +0 -20
- package/lib/component/element/html/Tabs.jsx +0 -55
- package/lib/component/element/special/BootstrapElement.jsx +0 -32
- package/lib/component/element/special/Count.jsx +0 -46
- package/lib/component/element/special/DataFilter.jsx +0 -156
- package/lib/component/element/special/DelayedActions.jsx +0 -119
- package/lib/component/element/special/PageControls.jsx +0 -19
- package/lib/component/element/special/Phantom.jsx +0 -25
- package/lib/component/element/special/Switch.jsx +0 -131
- package/lib/component/hook/usePagination.jsx +0 -184
- package/lib/component/reaction/addData.jsx +0 -23
- package/lib/component/reaction/fetchData.jsx +0 -83
- package/lib/component/reaction/moveData.jsx +0 -52
- package/lib/component/reaction/postMessage.jsx +0 -43
- package/lib/component/reaction/redirectNow.jsx +0 -17
- package/lib/component/reaction/removeData.jsx +0 -48
- package/lib/component/reaction/setClipboardData.jsx +0 -20
- package/lib/component/reaction/setData.jsx +0 -23
- package/lib/component/reaction/submitData.jsx +0 -136
- package/lib/component/reaction/triggerEvent.jsx +0 -62
- package/lib/component/utility/formatString.jsx +0 -59
- package/lib/engine/Actions.jsx +0 -392
- package/lib/engine/ComponentCollector.js +0 -28
- package/lib/engine/EventDispatcherProvider.jsx +0 -80
- package/lib/engine/GlobalDataContextProvider.jsx +0 -33
- package/lib/engine/PaginationProvider.jsx +0 -61
- package/lib/engine/ReactiveJsonRoot.jsx +0 -318
- package/lib/engine/TemplateSystem.jsx +0 -302
- package/lib/engine/View.jsx +0 -248
- package/lib/main.jsx +0 -52
package/lib/engine/View.jsx
DELETED
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
import {useContext} from 'react';
|
|
2
|
-
import CheckBoxField from "../component/element/form/CheckBoxField";
|
|
3
|
-
import DateField from "../component/element/form/DateField";
|
|
4
|
-
import NumberField from "../component/element/form/NumberField";
|
|
5
|
-
import SelectField from "../component/element/form/SelectField";
|
|
6
|
-
import TextAreaField from "../component/element/form/TextAreaField";
|
|
7
|
-
import TextField from "../component/element/form/TextField";
|
|
8
|
-
import AccordionItem from "../component/element/html/AccordionItem";
|
|
9
|
-
import FolderSortableTree from "../component/element/html/FolderSortableTree";
|
|
10
|
-
import FormatNumeral from "../component/element/html/FormatNumeral";
|
|
11
|
-
import Html from "../component/element/html/Html";
|
|
12
|
-
import LabelFromValue from "../component/element/html/LabelFromValue";
|
|
13
|
-
import Modal from "../component/element/html/Modal";
|
|
14
|
-
import Paragraph from "../component/element/html/Paragraph";
|
|
15
|
-
import PreformattedMarkup from "../component/element/html/PreformattedMarkup";
|
|
16
|
-
import SortableTreeItemCollapseButton from "../component/element/html/SortableTreeItemCollapseButton";
|
|
17
|
-
import Tabs from "../component/element/html/Tabs";
|
|
18
|
-
import BootstrapElement from "../component/element/special/BootstrapElement";
|
|
19
|
-
import Count from "../component/element/special/Count";
|
|
20
|
-
import DataFilter from "../component/element/special/DataFilter";
|
|
21
|
-
import DelayedActions from "../component/element/special/DelayedActions";
|
|
22
|
-
import PageControls from "../component/element/special/PageControls";
|
|
23
|
-
import Phantom from "../component/element/special/Phantom";
|
|
24
|
-
import Switch from "../component/element/special/Switch";
|
|
25
|
-
import GlobalDataContext from "./GlobalDataContext";
|
|
26
|
-
import TemplateContext from "./TemplateContext";
|
|
27
|
-
import TemplateValue, {dataLocationToPath, evaluateTemplateValue} from "./TemplateSystem";
|
|
28
|
-
import {
|
|
29
|
-
Accordion,
|
|
30
|
-
Alert,
|
|
31
|
-
Badge,
|
|
32
|
-
Button,
|
|
33
|
-
} from "react-bootstrap";
|
|
34
|
-
|
|
35
|
-
function View({props, currentData, datafield, path}) {
|
|
36
|
-
const globalDataContext = useContext(GlobalDataContext);
|
|
37
|
-
const templateContext = useContext(TemplateContext);
|
|
38
|
-
|
|
39
|
-
const plugins = globalDataContext.plugins ?? {
|
|
40
|
-
"element": {
|
|
41
|
-
"Azerty": Html,
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
const test = {
|
|
46
|
-
"element": {
|
|
47
|
-
"Qsdfgh": Html,
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const components = {
|
|
52
|
-
AccordionItem,
|
|
53
|
-
CheckBoxField,
|
|
54
|
-
Count,
|
|
55
|
-
DateField,
|
|
56
|
-
DataFilter,
|
|
57
|
-
DelayedActions,
|
|
58
|
-
FolderSortableTree,
|
|
59
|
-
FormatNumeral,
|
|
60
|
-
Html,
|
|
61
|
-
LabelFromValue,
|
|
62
|
-
Modal,
|
|
63
|
-
NumberField,
|
|
64
|
-
PageControls,
|
|
65
|
-
Paragraph,
|
|
66
|
-
Phantom,
|
|
67
|
-
PreformattedMarkup,
|
|
68
|
-
SelectField,
|
|
69
|
-
SortableTreeItemCollapseButton,
|
|
70
|
-
Switch,
|
|
71
|
-
Tabs,
|
|
72
|
-
TextAreaField,
|
|
73
|
-
TextField,
|
|
74
|
-
...plugins?.element,
|
|
75
|
-
...test?.element,
|
|
76
|
-
"Ijiji": TextAreaField,
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Gives direct access to React Bootstrap components.
|
|
81
|
-
*/
|
|
82
|
-
const bootstrapComponents = {
|
|
83
|
-
BsAccordion: Accordion,
|
|
84
|
-
BsAlert: Alert,
|
|
85
|
-
BsBadge: Badge,
|
|
86
|
-
BsButton: Button,
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
const {element} = globalDataContext;
|
|
90
|
-
|
|
91
|
-
if (currentData === undefined) {
|
|
92
|
-
currentData = "";
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
if (props?.type) {
|
|
96
|
-
// A type is specified.
|
|
97
|
-
// First, try to find a component matching the given type by name.
|
|
98
|
-
// When not found, we map to a Html component as fallback.
|
|
99
|
-
// TODO: make this generic by moving bootstrap related code outside View.
|
|
100
|
-
let componentRegistryId = undefined;
|
|
101
|
-
let ComponentToRender = undefined;
|
|
102
|
-
|
|
103
|
-
const componentRegistries = [
|
|
104
|
-
{"registryId": "module", "components": components},
|
|
105
|
-
{"registryId": "bootstrap", "components": bootstrapComponents},
|
|
106
|
-
];
|
|
107
|
-
|
|
108
|
-
while (componentRegistries.length) {
|
|
109
|
-
const {registryId, components: registryComponents} = componentRegistries.shift();
|
|
110
|
-
|
|
111
|
-
ComponentToRender = registryComponents[props.type] ?? undefined;
|
|
112
|
-
|
|
113
|
-
if (ComponentToRender !== undefined) {
|
|
114
|
-
componentRegistryId = registryId;
|
|
115
|
-
break;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
if (ComponentToRender === undefined) {
|
|
120
|
-
// Use the module:Html component as fallback.
|
|
121
|
-
ComponentToRender = Html;
|
|
122
|
-
componentRegistryId = "module";
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
if (componentRegistryId === "bootstrap") {
|
|
126
|
-
return <BootstrapElement
|
|
127
|
-
bsComponent={ComponentToRender}
|
|
128
|
-
path={path}
|
|
129
|
-
props={props}
|
|
130
|
-
currentData={currentData}
|
|
131
|
-
datafield={datafield}/>;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
if (Html === ComponentToRender) {
|
|
135
|
-
// Either the user has specifically asked for a Html component,
|
|
136
|
-
// or this is a fallback for an unknown type.
|
|
137
|
-
// Make sure the tag is set.
|
|
138
|
-
props.tag = props.tag ?? props.type;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
return <ComponentToRender
|
|
142
|
-
path={path}
|
|
143
|
-
props={props}
|
|
144
|
-
currentData={currentData}
|
|
145
|
-
datafield={datafield}/>;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
if (props?.load) {
|
|
149
|
-
// An external render source must be loaded.
|
|
150
|
-
// let load = props.load;
|
|
151
|
-
let loadedRenderArray;
|
|
152
|
-
|
|
153
|
-
const _customDataLocation = props?.customDataLocation ?? undefined;
|
|
154
|
-
if (_customDataLocation) debugger;
|
|
155
|
-
|
|
156
|
-
// Determine which data to use.
|
|
157
|
-
const finalCurrentData = _customDataLocation
|
|
158
|
-
// The data is located somewhere in the current data.
|
|
159
|
-
? evaluateTemplateValue({
|
|
160
|
-
globalDataContext: globalDataContext,
|
|
161
|
-
templateContext: templateContext,
|
|
162
|
-
valueToEvaluate: _customDataLocation,
|
|
163
|
-
})
|
|
164
|
-
// The data is the current data.
|
|
165
|
-
: currentData;
|
|
166
|
-
|
|
167
|
-
// The data path must be set accordingly.
|
|
168
|
-
const finalDataPath = _customDataLocation
|
|
169
|
-
? dataLocationToPath({dataLocation: _customDataLocation, currentPath: path, globalDataContext, templateContext})
|
|
170
|
-
: path;
|
|
171
|
-
|
|
172
|
-
// This external source can return a single component to render,
|
|
173
|
-
// or a collection of components.
|
|
174
|
-
if (typeof props.load === "function") {
|
|
175
|
-
// A JS function has been defined. Execute it with the currentData.
|
|
176
|
-
// The function must return a render array.
|
|
177
|
-
loadedRenderArray = props.load(finalCurrentData);
|
|
178
|
-
} else {
|
|
179
|
-
// Load the render array from the registry.
|
|
180
|
-
loadedRenderArray = element[props.load];
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// Override any values of the registry render array with the current render array,
|
|
184
|
-
// without the properties specific to the "load" method.
|
|
185
|
-
const {load, customDataLocation, ...propsWithoutLoadKey} = props;
|
|
186
|
-
loadedRenderArray = {...loadedRenderArray, ...propsWithoutLoadKey};
|
|
187
|
-
|
|
188
|
-
// Now that we have our render array, recurse on the View component.
|
|
189
|
-
if (props.keepTemplateContext) {
|
|
190
|
-
// Keep the current template context.
|
|
191
|
-
return (
|
|
192
|
-
<View
|
|
193
|
-
currentData={finalCurrentData}
|
|
194
|
-
datafield={datafield}
|
|
195
|
-
path={finalDataPath}
|
|
196
|
-
props={loadedRenderArray}
|
|
197
|
-
/>
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// We open a new template context in the process.
|
|
202
|
-
return (
|
|
203
|
-
<TemplateContext.Provider value={{templateData: finalCurrentData, templatePath: finalDataPath}}>
|
|
204
|
-
<View
|
|
205
|
-
currentData={finalCurrentData}
|
|
206
|
-
datafield={datafield}
|
|
207
|
-
path={finalDataPath}
|
|
208
|
-
props={loadedRenderArray}
|
|
209
|
-
/>
|
|
210
|
-
</TemplateContext.Provider>
|
|
211
|
-
);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// Try to go deeper to render something.
|
|
215
|
-
if (Array.isArray(props)) {
|
|
216
|
-
return props.map((item, index) =>
|
|
217
|
-
<View
|
|
218
|
-
currentData={currentData[index] ?? undefined}
|
|
219
|
-
datafield={index}
|
|
220
|
-
key={path + "." + index}
|
|
221
|
-
path={path + "." + index}
|
|
222
|
-
props={item ?? undefined}
|
|
223
|
-
/>
|
|
224
|
-
);
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
if (typeof props === "object") {
|
|
228
|
-
return Object.entries(props).map(([itemKey, item]) => {
|
|
229
|
-
return <View
|
|
230
|
-
currentData={currentData[itemKey] ?? undefined}
|
|
231
|
-
datafield={itemKey ?? undefined}
|
|
232
|
-
key={path + "." + itemKey}
|
|
233
|
-
path={path + "." + itemKey}
|
|
234
|
-
props={item}
|
|
235
|
-
/>
|
|
236
|
-
}
|
|
237
|
-
);
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
// Display the content directly.
|
|
241
|
-
// The content tries to use the currentData in case the data wants to rewrite the output.
|
|
242
|
-
// If not available, we simply use the given props, which is usually a string, which can
|
|
243
|
-
// also be a reference to a template context data.
|
|
244
|
-
// If no props is available, do not render anything.
|
|
245
|
-
return <TemplateValue valueToEvaluate={currentData || (props ?? null)}/>;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
export default View;
|
package/lib/main.jsx
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Entry point for the lib.
|
|
3
|
-
*/
|
|
4
|
-
import "bootstrap/dist/css/bootstrap.min.css";
|
|
5
|
-
|
|
6
|
-
import ReactiveJsonRoot from "./engine/ReactiveJsonRoot.jsx";
|
|
7
|
-
import {mergeComponentCollections} from "./engine/ComponentCollector.js";
|
|
8
|
-
import {StrictMode} from "react"
|
|
9
|
-
import {createRoot} from "react-dom/client";
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* mergeComponentCollections helps in loading plugins when reactive-json is loaded in library mode.
|
|
13
|
-
*/
|
|
14
|
-
export {ReactiveJsonRoot, mergeComponentCollections};
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Standalone mode.
|
|
18
|
-
* @example
|
|
19
|
-
* <reactive-json data-method="GET" data-url="https://your-site.example/rjs-build/build.json">
|
|
20
|
-
* <data-source-request-header data-header-field="X-Header-Field-Name" data-header-value="Your value"></data-source-request-header>
|
|
21
|
-
* </reactive-json>
|
|
22
|
-
*/
|
|
23
|
-
document.querySelectorAll("reactive-json").forEach((element) => {
|
|
24
|
-
// Use this to change the fetch method.
|
|
25
|
-
const maybeMethod = element.dataset?.method;
|
|
26
|
-
|
|
27
|
-
// Get data included in the root element.
|
|
28
|
-
const headersForData_asElements = element.querySelectorAll("data-source-request-header");
|
|
29
|
-
const headersForData = headersForData_asElements.length ? {} : undefined;
|
|
30
|
-
|
|
31
|
-
headersForData_asElements.forEach((headerElement, key, parent) => {
|
|
32
|
-
const headerField = headerElement?.dataset?.headerField;
|
|
33
|
-
const headerValue = headerElement?.dataset?.headerValue;
|
|
34
|
-
|
|
35
|
-
if (!headerField || !headerValue) {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
headersForData[headerField] = headerValue;
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
// TODO: Retrieve the reactive-json plugins and inject them in ReactiveJsonRoot.
|
|
43
|
-
createRoot(element).render(
|
|
44
|
-
<StrictMode>
|
|
45
|
-
<ReactiveJsonRoot
|
|
46
|
-
dataFetchMethod={maybeMethod}
|
|
47
|
-
dataUrl={element.dataset.url}
|
|
48
|
-
headersForData={headersForData}
|
|
49
|
-
/>
|
|
50
|
-
</StrictMode>,
|
|
51
|
-
);
|
|
52
|
-
});
|