@syncfusion/ej2-react-form-renderer 0.1.2-beta → 34.2.2
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 +88 -105
- package/diConfig.json +85 -0
- package/dist/ej2-react-form-renderer.min.js +10 -0
- package/dist/ej2-react-form-renderer.umd.min.js +11 -0
- package/dist/ej2-react-form-renderer.umd.min.js.map +1 -0
- package/dist/es6/ej2-react-form-renderer.es2015.js +37 -0
- package/dist/es6/ej2-react-form-renderer.es2015.js.map +1 -0
- package/form-renderer.d.ts +4 -0
- package/form-renderer.js +4 -0
- package/index.d.ts +2 -4
- package/index.js +2 -4
- package/license +6 -13
- package/package.json +19 -38
- package/src/form-renderer/formrenderer.component.d.ts +34 -0
- package/src/form-renderer/formrenderer.component.js +49 -0
- package/src/form-renderer/index.d.ts +1 -0
- package/src/form-renderer/index.js +1 -0
- package/src/global.js +1 -0
- package/src/index.d.ts +2 -6
- package/src/index.js +2 -6
- package/styles/bds-lite.css +1 -0
- package/styles/bds-lite.scss +1 -0
- package/styles/bds.css +1 -0
- package/styles/bds.scss +1 -0
- package/styles/bootstrap-dark-lite.css +1 -0
- package/styles/bootstrap-dark-lite.scss +1 -0
- package/styles/bootstrap-dark.css +1 -26
- package/styles/bootstrap-dark.scss +1 -0
- package/styles/bootstrap-lite.css +1 -0
- package/styles/bootstrap-lite.scss +1 -0
- package/styles/bootstrap.css +1 -26
- package/styles/bootstrap.scss +1 -0
- package/styles/bootstrap4-lite.css +1 -0
- package/styles/bootstrap4-lite.scss +1 -0
- package/styles/bootstrap4.css +1 -26
- package/styles/bootstrap4.scss +1 -0
- package/styles/bootstrap5-dark-lite.css +1 -0
- package/styles/bootstrap5-dark-lite.scss +1 -0
- package/styles/bootstrap5-dark.css +1 -26
- package/styles/bootstrap5-dark.scss +1 -0
- package/styles/bootstrap5-lite.css +1 -0
- package/styles/bootstrap5-lite.scss +1 -0
- package/styles/bootstrap5.3-lite.css +1 -0
- package/styles/bootstrap5.3-lite.scss +1 -0
- package/styles/bootstrap5.3.css +1 -26
- package/styles/bootstrap5.3.scss +1 -0
- package/styles/bootstrap5.css +1 -26
- package/styles/bootstrap5.scss +1 -0
- package/styles/fabric-dark-lite.css +1 -0
- package/styles/fabric-dark-lite.scss +1 -0
- package/styles/fabric-dark.css +1 -0
- package/styles/fabric-dark.scss +1 -0
- package/styles/fabric-lite.css +1 -0
- package/styles/fabric-lite.scss +1 -0
- package/styles/fabric.css +1 -0
- package/styles/fabric.scss +1 -0
- package/styles/fluent-dark-lite.css +1 -0
- package/styles/fluent-dark-lite.scss +1 -0
- package/styles/fluent-dark.css +1 -26
- package/styles/fluent-dark.scss +1 -0
- package/styles/fluent-lite.css +1 -0
- package/styles/fluent-lite.scss +1 -0
- package/styles/fluent.css +1 -26
- package/styles/fluent.scss +1 -0
- package/styles/fluent2-lite.css +1 -0
- package/styles/fluent2-lite.scss +1 -0
- package/styles/fluent2.css +1 -26
- package/styles/fluent2.scss +1 -0
- package/styles/form-renderer/bds.css +1 -0
- package/styles/form-renderer/bds.scss +1 -0
- package/styles/form-renderer/bootstrap-dark.css +1 -0
- package/styles/form-renderer/bootstrap-dark.scss +1 -0
- package/styles/form-renderer/bootstrap.css +1 -0
- package/styles/form-renderer/bootstrap.scss +1 -0
- package/styles/form-renderer/bootstrap4.css +1 -0
- package/styles/form-renderer/bootstrap4.scss +1 -0
- package/styles/form-renderer/bootstrap5-dark.css +1 -0
- package/styles/form-renderer/bootstrap5-dark.scss +1 -0
- package/styles/form-renderer/bootstrap5.3.css +1 -0
- package/styles/form-renderer/bootstrap5.3.scss +1 -0
- package/styles/form-renderer/bootstrap5.css +1 -0
- package/styles/form-renderer/bootstrap5.scss +1 -0
- package/styles/form-renderer/fabric-dark.css +1 -0
- package/styles/form-renderer/fabric-dark.scss +1 -0
- package/styles/form-renderer/fabric.css +1 -0
- package/styles/form-renderer/fabric.scss +1 -0
- package/styles/form-renderer/fluent-dark.css +1 -0
- package/styles/form-renderer/fluent-dark.scss +1 -0
- package/styles/form-renderer/fluent.css +1 -0
- package/styles/form-renderer/fluent.scss +1 -0
- package/styles/form-renderer/fluent2.css +1 -0
- package/styles/form-renderer/fluent2.scss +1 -0
- package/styles/form-renderer/highcontrast-light.css +1 -0
- package/styles/form-renderer/highcontrast-light.scss +1 -0
- package/styles/form-renderer/highcontrast.css +1 -0
- package/styles/form-renderer/highcontrast.scss +1 -0
- package/styles/form-renderer/material-dark.css +1 -0
- package/styles/form-renderer/material-dark.scss +1 -0
- package/styles/form-renderer/material.css +1 -0
- package/styles/form-renderer/material.scss +1 -0
- package/styles/form-renderer/material3-dark.css +1 -0
- package/styles/form-renderer/material3-dark.scss +1 -0
- package/styles/form-renderer/material3.css +1 -0
- package/styles/form-renderer/material3.scss +1 -0
- package/styles/form-renderer/tailwind-dark.css +1 -0
- package/styles/form-renderer/tailwind-dark.scss +1 -0
- package/styles/form-renderer/tailwind.css +1 -0
- package/styles/form-renderer/tailwind.scss +1 -0
- package/styles/form-renderer/tailwind3.css +1 -0
- package/styles/form-renderer/tailwind3.scss +1 -0
- package/styles/highcontrast-light-lite.css +1 -0
- package/styles/highcontrast-light-lite.scss +1 -0
- package/styles/highcontrast-light.css +1 -0
- package/styles/highcontrast-light.scss +1 -0
- package/styles/highcontrast-lite.css +1 -0
- package/styles/highcontrast-lite.scss +1 -0
- package/styles/highcontrast.css +1 -0
- package/styles/highcontrast.scss +1 -0
- package/styles/material-dark-lite.css +1 -0
- package/styles/material-dark-lite.scss +1 -0
- package/styles/material-dark.css +1 -26
- package/styles/material-dark.scss +1 -0
- package/styles/material-lite.css +1 -0
- package/styles/material-lite.scss +1 -0
- package/styles/material.css +1 -26
- package/styles/material.scss +1 -0
- package/styles/material3-dark-lite.css +1 -0
- package/styles/material3-dark-lite.scss +1 -0
- package/styles/material3-dark.css +1 -26
- package/styles/material3-dark.scss +1 -0
- package/styles/material3-lite.css +1 -0
- package/styles/material3-lite.scss +1 -0
- package/styles/material3.css +1 -26
- package/styles/material3.scss +1 -0
- package/styles/tailwind-dark-lite.css +1 -0
- package/styles/tailwind-dark-lite.scss +1 -0
- package/styles/tailwind-dark.css +1 -26
- package/styles/tailwind-dark.scss +1 -0
- package/styles/tailwind-lite.css +1 -0
- package/styles/tailwind-lite.scss +1 -0
- package/styles/tailwind.css +1 -26
- package/styles/tailwind.scss +1 -0
- package/styles/tailwind3-lite.css +1 -0
- package/styles/tailwind3-lite.scss +1 -0
- package/styles/tailwind3.css +1 -26
- package/styles/tailwind3.scss +1 -0
- package/src/CheckboxGroup.d.ts +0 -12
- package/src/CheckboxGroup.js +0 -49
- package/src/ConditionalRuleEngine.d.ts +0 -295
- package/src/ConditionalRuleEngine.js +0 -566
- package/src/CustomTabComponent.d.ts +0 -13
- package/src/CustomTabComponent.js +0 -35
- package/src/DataGridComponent.d.ts +0 -28
- package/src/DataGridComponent.js +0 -147
- package/src/FormRenderer.d.ts +0 -84
- package/src/FormRenderer.js +0 -707
- package/src/FormValidator.d.ts +0 -479
- package/src/FormValidator.js +0 -579
- package/src/MinMaxRuleEngine.d.ts +0 -95
- package/src/MinMaxRuleEngine.js +0 -361
- package/src/StaticHtmlRenderer.d.ts +0 -8
- package/src/StaticHtmlRenderer.js +0 -21
- package/src/expressions/DependencyTracker.d.ts +0 -30
- package/src/expressions/DependencyTracker.js +0 -128
- package/src/expressions/ExpressionEngine.d.ts +0 -81
- package/src/expressions/ExpressionEngine.js +0 -503
- package/src/expressions/ExpressionParser.d.ts +0 -39
- package/src/expressions/ExpressionParser.js +0 -270
- package/src/json-converter.d.ts +0 -171
- package/src/json-converter.js +0 -1209
- package/src/parser.d.ts +0 -99
- package/src/parser.js +0 -753
- package/src/renderFormField.d.ts +0 -21
- package/src/renderFormField.js +0 -226
- package/src/types/FormSchema.d.ts +0 -211
- package/src/types/FormSchema.js +0 -1
- package/src/utils.js +0 -408
- package/styles/bootstrap5.3-dark.css +0 -26
- package/styles/fluent2-dark.css +0 -26
- package/styles/form-renderer.base.css +0 -499
- package/styles/tailwind3-dark.css +0 -10
package/src/DataGridComponent.js
DELETED
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import React, { useImperativeHandle, useRef, useState, useCallback, useMemo, useEffect } from 'react';
|
|
3
|
-
import { GridComponent, ColumnsDirective, ColumnDirective, Inject, Toolbar, Edit, Page, Filter, Resize, Sort, } from '@syncfusion/ej2-react-grids';
|
|
4
|
-
(() => {
|
|
5
|
-
try {
|
|
6
|
-
const filterPrefix = '[EJ2Grid.Warning]';
|
|
7
|
-
const _origWarn = console.warn;
|
|
8
|
-
const _origLog = console.log;
|
|
9
|
-
const _origError = console.error;
|
|
10
|
-
const makeFiltered = (orig) => (...args) => {
|
|
11
|
-
try {
|
|
12
|
-
const first = args[0];
|
|
13
|
-
if (typeof first === 'string' && first.includes(filterPrefix))
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
catch { }
|
|
17
|
-
orig.apply(console, args);
|
|
18
|
-
};
|
|
19
|
-
// Apply only once
|
|
20
|
-
if (!console.__ej2WarnsFiltered) {
|
|
21
|
-
console.warn = makeFiltered(_origWarn);
|
|
22
|
-
console.log = makeFiltered(_origLog);
|
|
23
|
-
console.error = makeFiltered(_origError);
|
|
24
|
-
console.__ej2WarnsFiltered = true;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
catch { }
|
|
28
|
-
})();
|
|
29
|
-
/**
|
|
30
|
-
* DataGridComponent: Wrapper around Syncfusion GridComponent
|
|
31
|
-
*
|
|
32
|
-
* Responsibilities:
|
|
33
|
-
* - Manages internal _currentData state (initialized from dataSource)
|
|
34
|
-
* - Exposes getGridData() via useImperativeHandle for form submission
|
|
35
|
-
* - Handles actionComplete events (add/edit/delete operations)
|
|
36
|
-
* - Maps GridColumn.validationRules to ColumnDirective.validationRules
|
|
37
|
-
* - Renders Syncfusion toolbar with CRUD actions based on allowAdding/Editing/Deleting
|
|
38
|
-
*/
|
|
39
|
-
export const DataGridComponent = React.forwardRef(({ id, columns, dataSource = [], height = '200px', width = '100%', locale, cssClass, pageSize = 6, allowPaging = true, allowAdding = true, allowEditing = true, allowDeleting = true, allowFiltering = false, onDataChange }, ref) => {
|
|
40
|
-
// Internal state: maintain current grid data
|
|
41
|
-
const [_currentData, setCurrentData] = useState(Array.isArray(dataSource) ? dataSource : []);
|
|
42
|
-
const gridRef = useRef(null);
|
|
43
|
-
/**
|
|
44
|
-
* Detect column definition changes and refresh grid
|
|
45
|
-
* This ensures that changes to headerText, type, width, etc. are immediately reflected
|
|
46
|
-
* Only enabled in preview mode to avoid issues in the main form builder view
|
|
47
|
-
*/
|
|
48
|
-
useEffect(() => {
|
|
49
|
-
if (gridRef.current) {
|
|
50
|
-
if (columns && !(columns.length > 0)) {
|
|
51
|
-
gridRef.current.columns = [];
|
|
52
|
-
}
|
|
53
|
-
else if (gridRef.current.columns.length === 0 && columns && columns.length == 1) {
|
|
54
|
-
gridRef.current.columns = columns;
|
|
55
|
-
}
|
|
56
|
-
setTimeout(() => {
|
|
57
|
-
if (gridRef.current?.refresh) {
|
|
58
|
-
if (dataSource && Array.isArray(dataSource) && dataSource.length > 0) {
|
|
59
|
-
gridRef.current.dataSource = dataSource;
|
|
60
|
-
}
|
|
61
|
-
gridRef.current.refresh();
|
|
62
|
-
}
|
|
63
|
-
}, 10);
|
|
64
|
-
}
|
|
65
|
-
}, [columns, allowAdding, allowDeleting, allowEditing, allowPaging, pageSize, allowFiltering]);
|
|
66
|
-
useEffect(() => {
|
|
67
|
-
const normalized = Array.isArray(dataSource) ? dataSource : [];
|
|
68
|
-
setCurrentData(normalized);
|
|
69
|
-
}, [dataSource]);
|
|
70
|
-
/**
|
|
71
|
-
* Expose getGridData() via ref - returns current grid data for form submission
|
|
72
|
-
*/
|
|
73
|
-
useImperativeHandle(ref, () => ({
|
|
74
|
-
getGridData: () => _currentData,
|
|
75
|
-
gridRef
|
|
76
|
-
}), [_currentData]);
|
|
77
|
-
/**
|
|
78
|
-
* Handle Syncfusion grid action events (add/edit/delete)
|
|
79
|
-
* Update _currentData state when rows are modified
|
|
80
|
-
*/
|
|
81
|
-
const handleActionComplete = useCallback((args) => {
|
|
82
|
-
if (!gridRef.current)
|
|
83
|
-
return;
|
|
84
|
-
const eventType = args.requestType;
|
|
85
|
-
// Handle different action types
|
|
86
|
-
switch (eventType) {
|
|
87
|
-
case 'save':
|
|
88
|
-
case 'delete':
|
|
89
|
-
case 'add':
|
|
90
|
-
// After any data modification, sync grid data to state
|
|
91
|
-
// Use dataSource directly as it's the current working data in Syncfusion
|
|
92
|
-
if (gridRef.current.dataSource) {
|
|
93
|
-
const updatedData = Array.isArray(gridRef.current.dataSource)
|
|
94
|
-
? gridRef.current.dataSource
|
|
95
|
-
: [];
|
|
96
|
-
setCurrentData(updatedData);
|
|
97
|
-
onDataChange?.(updatedData);
|
|
98
|
-
}
|
|
99
|
-
break;
|
|
100
|
-
default:
|
|
101
|
-
break;
|
|
102
|
-
}
|
|
103
|
-
}, [onDataChange]);
|
|
104
|
-
/**
|
|
105
|
-
* Build toolbar array dynamically based on allowAdding/Editing/Deleting
|
|
106
|
-
* Default toolbar includes: Add, Edit, Delete, Update, Cancel, ExcelExport, Search
|
|
107
|
-
*/
|
|
108
|
-
const buildToolbar = useCallback(() => {
|
|
109
|
-
const toolbarItems = [];
|
|
110
|
-
if (allowAdding) {
|
|
111
|
-
toolbarItems.push('Add');
|
|
112
|
-
}
|
|
113
|
-
if (allowEditing) {
|
|
114
|
-
toolbarItems.push('Edit');
|
|
115
|
-
}
|
|
116
|
-
if (allowDeleting) {
|
|
117
|
-
toolbarItems.push('Delete');
|
|
118
|
-
}
|
|
119
|
-
// Always include Update and Cancel for inline editing flow
|
|
120
|
-
toolbarItems.push('Update', 'Cancel');
|
|
121
|
-
return toolbarItems;
|
|
122
|
-
}, [allowAdding, allowEditing, allowDeleting]);
|
|
123
|
-
/**
|
|
124
|
-
* Map validation rules from GridColumn.validationRules to Syncfusion format
|
|
125
|
-
* Syncfusion ValidationRules type supports:
|
|
126
|
-
* - required: boolean
|
|
127
|
-
* - min/max: number (for numeric types)
|
|
128
|
-
* - minLength/maxLength: number (for string types)
|
|
129
|
-
*/
|
|
130
|
-
const mapValidationRules = useCallback((col) => {
|
|
131
|
-
if (!col.validationRules) {
|
|
132
|
-
return undefined;
|
|
133
|
-
}
|
|
134
|
-
return col.validationRules;
|
|
135
|
-
}, []);
|
|
136
|
-
/**
|
|
137
|
-
* Memoize toolbar to prevent unnecessary re-renders
|
|
138
|
-
*/
|
|
139
|
-
const toolbarConfig = useMemo(() => buildToolbar(), [buildToolbar]);
|
|
140
|
-
return (_jsx("div", { className: "datagrid-wrapper", style: { width, height: 'auto' }, children: _jsx("div", { className: "datagrid-grid", children: _jsxs(GridComponent, { ref: gridRef, id: id, dataSource: _currentData, allowPaging: allowPaging, filterSettings: { mode: "Immediate" }, pageSettings: { pageSize }, editSettings: {
|
|
141
|
-
allowEditing,
|
|
142
|
-
allowAdding,
|
|
143
|
-
allowDeleting,
|
|
144
|
-
mode: 'Normal',
|
|
145
|
-
}, locale: locale || 'en-US', cssClass: cssClass, toolbar: toolbarConfig, actionComplete: handleActionComplete, height: typeof height === 'string' ? height : `${height}px`, width: typeof width === 'string' ? width : `${width}px`, allowSorting: true, allowFiltering: allowFiltering, allowSelection: true, children: [_jsx(ColumnsDirective, { children: columns && columns.length > 0 && columns.map((col) => (_jsx(ColumnDirective, { field: col.field, headerText: col.headerText, type: col.type || 'string', isPrimaryKey: col.isPrimaryKey || false, width: col.width, format: col.type === 'date' ? (col.format || 'MM/dd/yyyy') : col.format, editType: col.editType, validationRules: mapValidationRules(col) }, col.field))) }), _jsx(Inject, { services: [Edit, Toolbar, Page, Resize, Sort, Filter] })] }) }) }));
|
|
146
|
-
});
|
|
147
|
-
DataGridComponent.displayName = 'DataGridComponent';
|
package/src/FormRenderer.d.ts
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Form Renderer Component
|
|
3
|
-
* Renders JSON-driven forms with React FormValidator
|
|
4
|
-
*/
|
|
5
|
-
import React from 'react';
|
|
6
|
-
import { type FormSchema, type ButtonClickEventArgs } from './types/FormSchema';
|
|
7
|
-
import { type LayoutNode, type UIField, type DataField } from './json-converter';
|
|
8
|
-
export interface DataSchema {
|
|
9
|
-
version: string;
|
|
10
|
-
properties: Record<string, DataField>;
|
|
11
|
-
}
|
|
12
|
-
export interface UISchema {
|
|
13
|
-
properties: Record<string, UIField>;
|
|
14
|
-
layout: LayoutNode[];
|
|
15
|
-
}
|
|
16
|
-
export interface ChangeEventArgs {
|
|
17
|
-
field: string;
|
|
18
|
-
value: any;
|
|
19
|
-
}
|
|
20
|
-
export interface SubmitEventArgs {
|
|
21
|
-
data: Record<string, any>;
|
|
22
|
-
isValid: boolean;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Form layout options (only applies when UI schema is NOT provided)
|
|
26
|
-
*/
|
|
27
|
-
export declare const FormLayout: {
|
|
28
|
-
readonly SingleColumn: "single";
|
|
29
|
-
readonly TwoColumn: "twocolumn";
|
|
30
|
-
readonly ThreeColumn: "threecolumn";
|
|
31
|
-
readonly FourColumn: "fourcolumn";
|
|
32
|
-
};
|
|
33
|
-
export type FormLayout = typeof FormLayout[keyof typeof FormLayout];
|
|
34
|
-
export interface FormRendererProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'onSubmit' | 'onClick'> {
|
|
35
|
-
/**
|
|
36
|
-
* Data Schema - can be provided as:
|
|
37
|
-
* - JSON string (parsed with UniversalJsonParser)
|
|
38
|
-
* - FormSchema object (components converted to DataSchema)
|
|
39
|
-
* - DataSchema object (used directly)
|
|
40
|
-
*/
|
|
41
|
-
schema?: DataSchema | string | FormSchema | any;
|
|
42
|
-
/**
|
|
43
|
-
* Specifies the locale/language for the form component.
|
|
44
|
-
* Supports locale-specific formatting and translations.
|
|
45
|
-
* @default 'en-US'
|
|
46
|
-
*/
|
|
47
|
-
locale?: string;
|
|
48
|
-
/**
|
|
49
|
-
* Callback invoked when the form is submitted.
|
|
50
|
-
* Receives form data and validation status.
|
|
51
|
-
* @param args - Object containing form data and isValid flag
|
|
52
|
-
*/
|
|
53
|
-
onSubmit?: (args: SubmitEventArgs) => void;
|
|
54
|
-
/**
|
|
55
|
-
* Callback invoked when any form field value changes.
|
|
56
|
-
* Fired on user input for tracked fields.
|
|
57
|
-
* @param args - Object containing changed field name and new value
|
|
58
|
-
*/
|
|
59
|
-
onChange?: (args: ChangeEventArgs) => void;
|
|
60
|
-
/**
|
|
61
|
-
* Callback invoked when a button in the form is clicked.
|
|
62
|
-
* Applies to all button types (button, submit, splitButton).
|
|
63
|
-
* @param args - Object containing button click event details
|
|
64
|
-
*/
|
|
65
|
-
onButtonClick?: (args: ButtonClickEventArgs) => void;
|
|
66
|
-
/**
|
|
67
|
-
* CSS class names to apply to the root form container element.
|
|
68
|
-
* Supports space-separated multiple classes.
|
|
69
|
-
*/
|
|
70
|
-
className?: string;
|
|
71
|
-
/**
|
|
72
|
-
* Form layout configuration (only applies when UI schema is NOT provided).
|
|
73
|
-
* Determines how form fields are arranged in columns.
|
|
74
|
-
* @default FormLayout.SingleColumn
|
|
75
|
-
*/
|
|
76
|
-
layout?: FormLayout;
|
|
77
|
-
/**
|
|
78
|
-
* Called when all form elements are rendered and ready for interaction.
|
|
79
|
-
* Useful for performing post-render initialization or setup.
|
|
80
|
-
*/
|
|
81
|
-
created?: () => void;
|
|
82
|
-
}
|
|
83
|
-
export declare const FormRenderer: React.ForwardRefExoticComponent<FormRendererProps & React.RefAttributes<any>>;
|
|
84
|
-
export default FormRenderer;
|