@syncfusion/ej2-react-form-renderer 0.1.2-beta → 34.2.3

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 (181) hide show
  1. package/README.md +88 -105
  2. package/diConfig.json +85 -0
  3. package/dist/ej2-react-form-renderer.min.js +10 -0
  4. package/dist/ej2-react-form-renderer.umd.min.js +11 -0
  5. package/dist/ej2-react-form-renderer.umd.min.js.map +1 -0
  6. package/dist/es6/ej2-react-form-renderer.es2015.js +37 -0
  7. package/dist/es6/ej2-react-form-renderer.es2015.js.map +1 -0
  8. package/form-renderer.d.ts +4 -0
  9. package/form-renderer.js +4 -0
  10. package/index.d.ts +2 -4
  11. package/index.js +2 -4
  12. package/license +6 -13
  13. package/package.json +19 -38
  14. package/src/form-renderer/formrenderer.component.d.ts +34 -0
  15. package/src/form-renderer/formrenderer.component.js +49 -0
  16. package/src/form-renderer/index.d.ts +1 -0
  17. package/src/form-renderer/index.js +1 -0
  18. package/src/global.js +1 -0
  19. package/src/index.d.ts +2 -6
  20. package/src/index.js +2 -6
  21. package/styles/bds-lite.css +1 -0
  22. package/styles/bds-lite.scss +1 -0
  23. package/styles/bds.css +1 -0
  24. package/styles/bds.scss +1 -0
  25. package/styles/bootstrap-dark-lite.css +1 -0
  26. package/styles/bootstrap-dark-lite.scss +1 -0
  27. package/styles/bootstrap-dark.css +1 -26
  28. package/styles/bootstrap-dark.scss +1 -0
  29. package/styles/bootstrap-lite.css +1 -0
  30. package/styles/bootstrap-lite.scss +1 -0
  31. package/styles/bootstrap.css +1 -26
  32. package/styles/bootstrap.scss +1 -0
  33. package/styles/bootstrap4-lite.css +1 -0
  34. package/styles/bootstrap4-lite.scss +1 -0
  35. package/styles/bootstrap4.css +1 -26
  36. package/styles/bootstrap4.scss +1 -0
  37. package/styles/bootstrap5-dark-lite.css +1 -0
  38. package/styles/bootstrap5-dark-lite.scss +1 -0
  39. package/styles/bootstrap5-dark.css +1 -26
  40. package/styles/bootstrap5-dark.scss +1 -0
  41. package/styles/bootstrap5-lite.css +1 -0
  42. package/styles/bootstrap5-lite.scss +1 -0
  43. package/styles/bootstrap5.3-lite.css +1 -0
  44. package/styles/bootstrap5.3-lite.scss +1 -0
  45. package/styles/bootstrap5.3.css +1 -26
  46. package/styles/bootstrap5.3.scss +1 -0
  47. package/styles/bootstrap5.css +1 -26
  48. package/styles/bootstrap5.scss +1 -0
  49. package/styles/fabric-dark-lite.css +1 -0
  50. package/styles/fabric-dark-lite.scss +1 -0
  51. package/styles/fabric-dark.css +1 -0
  52. package/styles/fabric-dark.scss +1 -0
  53. package/styles/fabric-lite.css +1 -0
  54. package/styles/fabric-lite.scss +1 -0
  55. package/styles/fabric.css +1 -0
  56. package/styles/fabric.scss +1 -0
  57. package/styles/fluent-dark-lite.css +1 -0
  58. package/styles/fluent-dark-lite.scss +1 -0
  59. package/styles/fluent-dark.css +1 -26
  60. package/styles/fluent-dark.scss +1 -0
  61. package/styles/fluent-lite.css +1 -0
  62. package/styles/fluent-lite.scss +1 -0
  63. package/styles/fluent.css +1 -26
  64. package/styles/fluent.scss +1 -0
  65. package/styles/fluent2-lite.css +1 -0
  66. package/styles/fluent2-lite.scss +1 -0
  67. package/styles/fluent2.css +1 -26
  68. package/styles/fluent2.scss +1 -0
  69. package/styles/form-renderer/bds.css +1 -0
  70. package/styles/form-renderer/bds.scss +1 -0
  71. package/styles/form-renderer/bootstrap-dark.css +1 -0
  72. package/styles/form-renderer/bootstrap-dark.scss +1 -0
  73. package/styles/form-renderer/bootstrap.css +1 -0
  74. package/styles/form-renderer/bootstrap.scss +1 -0
  75. package/styles/form-renderer/bootstrap4.css +1 -0
  76. package/styles/form-renderer/bootstrap4.scss +1 -0
  77. package/styles/form-renderer/bootstrap5-dark.css +1 -0
  78. package/styles/form-renderer/bootstrap5-dark.scss +1 -0
  79. package/styles/form-renderer/bootstrap5.3.css +1 -0
  80. package/styles/form-renderer/bootstrap5.3.scss +1 -0
  81. package/styles/form-renderer/bootstrap5.css +1 -0
  82. package/styles/form-renderer/bootstrap5.scss +1 -0
  83. package/styles/form-renderer/fabric-dark.css +1 -0
  84. package/styles/form-renderer/fabric-dark.scss +1 -0
  85. package/styles/form-renderer/fabric.css +1 -0
  86. package/styles/form-renderer/fabric.scss +1 -0
  87. package/styles/form-renderer/fluent-dark.css +1 -0
  88. package/styles/form-renderer/fluent-dark.scss +1 -0
  89. package/styles/form-renderer/fluent.css +1 -0
  90. package/styles/form-renderer/fluent.scss +1 -0
  91. package/styles/form-renderer/fluent2.css +1 -0
  92. package/styles/form-renderer/fluent2.scss +1 -0
  93. package/styles/form-renderer/highcontrast-light.css +1 -0
  94. package/styles/form-renderer/highcontrast-light.scss +1 -0
  95. package/styles/form-renderer/highcontrast.css +1 -0
  96. package/styles/form-renderer/highcontrast.scss +1 -0
  97. package/styles/form-renderer/material-dark.css +1 -0
  98. package/styles/form-renderer/material-dark.scss +1 -0
  99. package/styles/form-renderer/material.css +1 -0
  100. package/styles/form-renderer/material.scss +1 -0
  101. package/styles/form-renderer/material3-dark.css +1 -0
  102. package/styles/form-renderer/material3-dark.scss +1 -0
  103. package/styles/form-renderer/material3.css +1 -0
  104. package/styles/form-renderer/material3.scss +1 -0
  105. package/styles/form-renderer/tailwind-dark.css +1 -0
  106. package/styles/form-renderer/tailwind-dark.scss +1 -0
  107. package/styles/form-renderer/tailwind.css +1 -0
  108. package/styles/form-renderer/tailwind.scss +1 -0
  109. package/styles/form-renderer/tailwind3.css +1 -0
  110. package/styles/form-renderer/tailwind3.scss +1 -0
  111. package/styles/highcontrast-light-lite.css +1 -0
  112. package/styles/highcontrast-light-lite.scss +1 -0
  113. package/styles/highcontrast-light.css +1 -0
  114. package/styles/highcontrast-light.scss +1 -0
  115. package/styles/highcontrast-lite.css +1 -0
  116. package/styles/highcontrast-lite.scss +1 -0
  117. package/styles/highcontrast.css +1 -0
  118. package/styles/highcontrast.scss +1 -0
  119. package/styles/material-dark-lite.css +1 -0
  120. package/styles/material-dark-lite.scss +1 -0
  121. package/styles/material-dark.css +1 -26
  122. package/styles/material-dark.scss +1 -0
  123. package/styles/material-lite.css +1 -0
  124. package/styles/material-lite.scss +1 -0
  125. package/styles/material.css +1 -26
  126. package/styles/material.scss +1 -0
  127. package/styles/material3-dark-lite.css +1 -0
  128. package/styles/material3-dark-lite.scss +1 -0
  129. package/styles/material3-dark.css +1 -26
  130. package/styles/material3-dark.scss +1 -0
  131. package/styles/material3-lite.css +1 -0
  132. package/styles/material3-lite.scss +1 -0
  133. package/styles/material3.css +1 -26
  134. package/styles/material3.scss +1 -0
  135. package/styles/tailwind-dark-lite.css +1 -0
  136. package/styles/tailwind-dark-lite.scss +1 -0
  137. package/styles/tailwind-dark.css +1 -26
  138. package/styles/tailwind-dark.scss +1 -0
  139. package/styles/tailwind-lite.css +1 -0
  140. package/styles/tailwind-lite.scss +1 -0
  141. package/styles/tailwind.css +1 -26
  142. package/styles/tailwind.scss +1 -0
  143. package/styles/tailwind3-lite.css +1 -0
  144. package/styles/tailwind3-lite.scss +1 -0
  145. package/styles/tailwind3.css +1 -26
  146. package/styles/tailwind3.scss +1 -0
  147. package/src/CheckboxGroup.d.ts +0 -12
  148. package/src/CheckboxGroup.js +0 -49
  149. package/src/ConditionalRuleEngine.d.ts +0 -295
  150. package/src/ConditionalRuleEngine.js +0 -566
  151. package/src/CustomTabComponent.d.ts +0 -13
  152. package/src/CustomTabComponent.js +0 -35
  153. package/src/DataGridComponent.d.ts +0 -28
  154. package/src/DataGridComponent.js +0 -147
  155. package/src/FormRenderer.d.ts +0 -84
  156. package/src/FormRenderer.js +0 -707
  157. package/src/FormValidator.d.ts +0 -479
  158. package/src/FormValidator.js +0 -579
  159. package/src/MinMaxRuleEngine.d.ts +0 -95
  160. package/src/MinMaxRuleEngine.js +0 -361
  161. package/src/StaticHtmlRenderer.d.ts +0 -8
  162. package/src/StaticHtmlRenderer.js +0 -21
  163. package/src/expressions/DependencyTracker.d.ts +0 -30
  164. package/src/expressions/DependencyTracker.js +0 -128
  165. package/src/expressions/ExpressionEngine.d.ts +0 -81
  166. package/src/expressions/ExpressionEngine.js +0 -503
  167. package/src/expressions/ExpressionParser.d.ts +0 -39
  168. package/src/expressions/ExpressionParser.js +0 -270
  169. package/src/json-converter.d.ts +0 -171
  170. package/src/json-converter.js +0 -1209
  171. package/src/parser.d.ts +0 -99
  172. package/src/parser.js +0 -753
  173. package/src/renderFormField.d.ts +0 -21
  174. package/src/renderFormField.js +0 -226
  175. package/src/types/FormSchema.d.ts +0 -211
  176. package/src/types/FormSchema.js +0 -1
  177. package/src/utils.js +0 -408
  178. package/styles/bootstrap5.3-dark.css +0 -26
  179. package/styles/fluent2-dark.css +0 -26
  180. package/styles/form-renderer.base.css +0 -499
  181. package/styles/tailwind3-dark.css +0 -10
@@ -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';
@@ -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;