@nvs-dynamic-form/react-core 2.3.1 → 2.4.1

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 (83) hide show
  1. package/dist/cjs/nvs-dynamic-form/_template.js +4 -17
  2. package/dist/cjs/nvs-dynamic-form/_template.js.map +1 -1
  3. package/dist/cjs/nvs-dynamic-form/components/arrayField/_template.js +24 -25
  4. package/dist/cjs/nvs-dynamic-form/components/arrayField/_template.js.map +1 -1
  5. package/dist/cjs/nvs-dynamic-form/components/elements/_template.d.ts +16 -0
  6. package/dist/cjs/nvs-dynamic-form/components/elements/_template.js +62 -0
  7. package/dist/cjs/nvs-dynamic-form/components/elements/_template.js.map +1 -0
  8. package/dist/cjs/nvs-dynamic-form/components/elements/index.d.ts +1 -0
  9. package/dist/cjs/nvs-dynamic-form/components/elements/index.js +18 -0
  10. package/dist/cjs/nvs-dynamic-form/components/elements/index.js.map +1 -0
  11. package/dist/cjs/nvs-dynamic-form/components/formBuilder/_template.d.ts +20 -0
  12. package/dist/cjs/nvs-dynamic-form/components/formBuilder/_template.js +84 -0
  13. package/dist/cjs/nvs-dynamic-form/components/formBuilder/_template.js.map +1 -0
  14. package/dist/cjs/nvs-dynamic-form/components/formBuilder/index.d.ts +1 -0
  15. package/dist/cjs/nvs-dynamic-form/components/formBuilder/index.js +18 -0
  16. package/dist/cjs/nvs-dynamic-form/components/formBuilder/index.js.map +1 -0
  17. package/dist/cjs/nvs-dynamic-form/components/groupField/_template.d.ts +2 -1
  18. package/dist/cjs/nvs-dynamic-form/components/groupField/_template.js +33 -17
  19. package/dist/cjs/nvs-dynamic-form/components/groupField/_template.js.map +1 -1
  20. package/dist/cjs/nvs-dynamic-form/components/groupField/_type.d.ts +1 -0
  21. package/dist/cjs/types/array-field.type.d.ts +4 -2
  22. package/dist/cjs/types/array-field.type.js +2 -0
  23. package/dist/cjs/types/array-field.type.js.map +1 -1
  24. package/dist/cjs/types/group-field.type.d.ts +5 -5
  25. package/dist/cjs/types/group-field.type.js +2 -0
  26. package/dist/cjs/types/group-field.type.js.map +1 -1
  27. package/dist/esm/nvs-dynamic-form/_template.js +4 -17
  28. package/dist/esm/nvs-dynamic-form/_template.js.map +1 -1
  29. package/dist/esm/nvs-dynamic-form/components/arrayField/_template.js +25 -26
  30. package/dist/esm/nvs-dynamic-form/components/arrayField/_template.js.map +1 -1
  31. package/dist/esm/nvs-dynamic-form/components/elements/_template.d.ts +16 -0
  32. package/dist/esm/nvs-dynamic-form/components/elements/_template.js +35 -0
  33. package/dist/esm/nvs-dynamic-form/components/elements/_template.js.map +1 -0
  34. package/dist/esm/nvs-dynamic-form/components/elements/index.d.ts +1 -0
  35. package/dist/esm/nvs-dynamic-form/components/elements/index.js +2 -0
  36. package/dist/esm/nvs-dynamic-form/components/elements/index.js.map +1 -0
  37. package/dist/esm/nvs-dynamic-form/components/formBuilder/_template.d.ts +20 -0
  38. package/dist/esm/nvs-dynamic-form/components/formBuilder/_template.js +57 -0
  39. package/dist/esm/nvs-dynamic-form/components/formBuilder/_template.js.map +1 -0
  40. package/dist/esm/nvs-dynamic-form/components/formBuilder/index.d.ts +1 -0
  41. package/dist/esm/nvs-dynamic-form/components/formBuilder/index.js +2 -0
  42. package/dist/esm/nvs-dynamic-form/components/formBuilder/index.js.map +1 -0
  43. package/dist/esm/nvs-dynamic-form/components/groupField/_template.d.ts +2 -1
  44. package/dist/esm/nvs-dynamic-form/components/groupField/_template.js +10 -17
  45. package/dist/esm/nvs-dynamic-form/components/groupField/_template.js.map +1 -1
  46. package/dist/esm/nvs-dynamic-form/components/groupField/_type.d.ts +1 -0
  47. package/dist/esm/types/array-field.type.d.ts +4 -2
  48. package/dist/esm/types/array-field.type.js +2 -0
  49. package/dist/esm/types/array-field.type.js.map +1 -1
  50. package/dist/esm/types/group-field.type.d.ts +5 -5
  51. package/dist/esm/types/group-field.type.js +2 -0
  52. package/dist/esm/types/group-field.type.js.map +1 -1
  53. package/lib/nvs-dynamic-form/_template.tsx +21 -18
  54. package/lib/nvs-dynamic-form/components/arrayField/_template.tsx +50 -39
  55. package/lib/nvs-dynamic-form/components/elements/_template.tsx +94 -0
  56. package/lib/nvs-dynamic-form/components/elements/index.tsx +1 -0
  57. package/lib/nvs-dynamic-form/components/formBuilder/_template.tsx +149 -0
  58. package/lib/nvs-dynamic-form/components/formBuilder/index.tsx +1 -0
  59. package/lib/nvs-dynamic-form/components/groupField/_template.tsx +33 -13
  60. package/lib/nvs-dynamic-form/components/groupField/_type.tsx +1 -0
  61. package/lib/nvs-dynamic-form/stories/components/button.tsx +17 -0
  62. package/lib/nvs-dynamic-form/stories/components/container.tsx +14 -0
  63. package/lib/nvs-dynamic-form/stories/components/index.tsx +3 -0
  64. package/lib/nvs-dynamic-form/stories/components/textboxElement.tsx +20 -0
  65. package/lib/nvs-dynamic-form/stories/fields/arrayField/basicExample.stories.tsx +87 -0
  66. package/lib/nvs-dynamic-form/stories/fields/arrayField/groupField.stories.tsx +102 -0
  67. package/lib/nvs-dynamic-form/stories/fields/arrayField/nested.stories.tsx +137 -0
  68. package/lib/nvs-dynamic-form/stories/fields/basicExample.stories.tsx +66 -0
  69. package/lib/nvs-dynamic-form/stories/fields/groupField/arrayFields.stories.tsx +113 -0
  70. package/lib/nvs-dynamic-form/stories/fields/groupField/basicExample.stories.tsx +86 -0
  71. package/lib/nvs-dynamic-form/stories/fields/groupField/container.stories.tsx +112 -0
  72. package/lib/nvs-dynamic-form/stories/fields/groupField/nested.stories.tsx +103 -0
  73. package/lib/types/array-field.type.tsx +6 -2
  74. package/lib/types/group-field.type.tsx +7 -3
  75. package/package.json +1 -1
  76. package/dist/cjs/nvs-dynamic-form/services/generateFormContentUtils.d.ts +0 -46
  77. package/dist/cjs/nvs-dynamic-form/services/generateFormContentUtils.js +0 -97
  78. package/dist/cjs/nvs-dynamic-form/services/generateFormContentUtils.js.map +0 -1
  79. package/dist/esm/nvs-dynamic-form/services/generateFormContentUtils.d.ts +0 -46
  80. package/dist/esm/nvs-dynamic-form/services/generateFormContentUtils.js +0 -90
  81. package/dist/esm/nvs-dynamic-form/services/generateFormContentUtils.js.map +0 -1
  82. package/lib/nvs-dynamic-form/_stories.tsx +0 -349
  83. package/lib/nvs-dynamic-form/services/generateFormContentUtils.tsx +0 -196
@@ -1,349 +0,0 @@
1
- import { INvsDynamicForm, NvsDynamicForm } from ".";
2
- import * as Yup from "yup";
3
-
4
- import React, { ChangeEvent } from "react";
5
- import { ArrayField, FieldBase, GroupField } from "../types";
6
-
7
- export default {
8
- component: NvsDynamicForm,
9
- title: "Nvs Dynamic Form",
10
- };
11
-
12
- const ButtonComponent = ({
13
- children,
14
- type = "submit",
15
- onClick = () => {},
16
- }: {
17
- children: string;
18
- type: "submit" | "reset" | "button";
19
- onClick?: () => void;
20
- }) => {
21
- return (
22
- <button onClick={onClick} style={{ width: "100%" }} type={type}>
23
- {children}
24
- </button>
25
- );
26
- };
27
-
28
- const TextboxElement = ({ defaultValue, ...props }: TextboxField) => {
29
- return (
30
- <input style={{ width: "100%", boxSizing: "border-box" }} {...props} />
31
- );
32
- };
33
-
34
- const Container = ({ children, ...props }) => {
35
- return (
36
- <div id="custom-container" className="nvs-container-fluid">
37
- <div className="nvs-row">
38
- <div className="nvs-col-12">
39
- <h1>{props.title}</h1>
40
- </div>
41
- <div className="nvs-col-12">{children}</div>
42
- </div>
43
- </div>
44
- );
45
- };
46
-
47
- class TextboxField extends FieldBase<string> {
48
- override readonly fieldType? = "textbox";
49
- type?: "email" | "number" | "password" | "tel" | "text" | "url";
50
- placeholder?: string;
51
-
52
- constructor(options: TextboxField) {
53
- super(options, "");
54
- this.type = options.type ?? "text";
55
- this.placeholder = options.placeholder ?? "";
56
- }
57
- }
58
-
59
- export const Default: { args: INvsDynamicForm; name: string } = {
60
- name: "Simple Example",
61
- args: {
62
- onSubmit: (values) => {
63
- alert(JSON.stringify(values));
64
- },
65
- submitButtonIsFullWidth: false,
66
- submitButtonLabel: "Save",
67
- submitButtonVisible: true,
68
- submitButtonPosition: "right",
69
- submitButtonDefaultOptions: {
70
- label: "Save",
71
- isFullWidth: true,
72
- position: "right",
73
- },
74
- buttonComponent: ButtonComponent,
75
- formElements: {
76
- textbox: {
77
- component: TextboxElement,
78
- class: TextboxField,
79
- },
80
- },
81
- fields: [
82
- new TextboxField({
83
- id: "firstName",
84
- placeholder: "Enter your first name",
85
- defaultValue: "ismet",
86
- validate: Yup.string().required(),
87
- onChange: (event) => {
88
- console.log((event as ChangeEvent<HTMLInputElement>).target.value);
89
- },
90
- screenSize: {
91
- desktop: 6,
92
- mobile: 6,
93
- },
94
- }),
95
- new TextboxField({
96
- id: "lastName",
97
- placeholder: "Enter your last name",
98
- validate: Yup.string().required(),
99
- screenSize: {
100
- desktop: 6,
101
- mobile: 6,
102
- },
103
- }),
104
- new TextboxField({
105
- id: "emailAddress",
106
- placeholder: "Enter your e-mail address",
107
- screenSize: 12,
108
- type: "email",
109
- }),
110
- ],
111
- },
112
- };
113
-
114
- export const Group: { args: INvsDynamicForm; name: string } = {
115
- name: "Group Example",
116
- args: {
117
- onSubmit: (values) => {
118
- alert(JSON.stringify(values));
119
- },
120
- submitButtonIsFullWidth: false,
121
- submitButtonLabel: "Save",
122
- submitButtonVisible: true,
123
- submitButtonPosition: "right",
124
- submitButtonDefaultOptions: {
125
- label: "Save",
126
- isFullWidth: true,
127
- position: "right",
128
- },
129
- buttonComponent: ButtonComponent,
130
- formElements: {
131
- textbox: {
132
- component: TextboxElement,
133
- class: TextboxField,
134
- },
135
- },
136
- fields: [
137
- new TextboxField({
138
- id: "firstName",
139
- label: "First Name",
140
- placeholder: "Enter your first name",
141
- defaultValue: "ismet",
142
- validate: Yup.string().required(),
143
- onChange: (event) => {
144
- console.log((event as ChangeEvent<HTMLInputElement>).target.value);
145
- },
146
- screenSize: {
147
- desktop: 6,
148
- mobile: 6,
149
- },
150
- }),
151
- new TextboxField({
152
- id: "lastName",
153
- label: "Last Name",
154
- placeholder: "Enter your last name",
155
- validate: Yup.string().required(),
156
- screenSize: {
157
- desktop: 6,
158
- mobile: 6,
159
- },
160
- }),
161
- new GroupField({
162
- id: "contact",
163
- fields: [
164
- new TextboxField({
165
- id: "emailAddress",
166
- label: "E-mail Address",
167
- placeholder: "Enter your e-mail address",
168
- screenSize: 6,
169
- type: "email",
170
- defaultValue: "info@ismetkizgin.com",
171
- }),
172
- new TextboxField({
173
- id: "phoneNumber",
174
- label: "Phone Number",
175
- placeholder: "Enter your phone number",
176
- screenSize: 6,
177
- }),
178
- ],
179
- }),
180
- ],
181
- },
182
- };
183
-
184
- export const GroupAndContainer: { args: INvsDynamicForm; name: string } = {
185
- name: "Container Example",
186
- args: {
187
- onSubmit: (values) => {
188
- alert(JSON.stringify(values));
189
- },
190
- container: Container,
191
- containerVisible: true,
192
- useGroupContainer: true,
193
- useContainersOutsideGroup: true,
194
- containerOptions: {
195
- title: "Personal Information",
196
- },
197
- submitButtonDefaultOptions: {
198
- label: "Save",
199
- isFullWidth: true,
200
- position: "right",
201
- },
202
- buttonComponent: ButtonComponent,
203
- formElements: {
204
- textbox: {
205
- component: TextboxElement,
206
- class: TextboxField,
207
- },
208
- },
209
- fields: [
210
- new TextboxField({
211
- id: "firstName",
212
- label: "First Name",
213
- placeholder: "Enter your first name",
214
- defaultValue: "ismet",
215
- validate: Yup.string().required(),
216
- onChange: (event) => {
217
- console.log((event as ChangeEvent<HTMLInputElement>).target.value);
218
- },
219
- screenSize: {
220
- desktop: 6,
221
- mobile: 6,
222
- },
223
- }),
224
- new TextboxField({
225
- id: "lastName",
226
- label: "Last Name",
227
- placeholder: "Enter your last name",
228
- validate: Yup.string().required(),
229
- screenSize: {
230
- desktop: 6,
231
- mobile: 6,
232
- },
233
- }),
234
- new GroupField({
235
- id: "contact",
236
- containerVisible: true,
237
- containerOptions: {
238
- title: "Contact Information",
239
- },
240
- fields: [
241
- new TextboxField({
242
- id: "emailAddress",
243
- label: "E-mail Address",
244
- placeholder: "Enter your e-mail address",
245
- screenSize: 6,
246
- type: "email",
247
- defaultValue: "info@ismetkizgin.com",
248
- }),
249
- new TextboxField({
250
- id: "phoneNumber",
251
- label: "Phone Number",
252
- placeholder: "Enter your phone number",
253
- screenSize: 6,
254
- }),
255
- ],
256
- }),
257
- new GroupField({
258
- id: "location",
259
- containerVisible: false,
260
- fields: [
261
- new TextboxField({
262
- id: "cityName",
263
- label: "City Name",
264
- placeholder: "Enter your city name",
265
- screenSize: 6,
266
- }),
267
- new TextboxField({
268
- id: "districtName",
269
- label: "district Name",
270
- placeholder: "Enter your district name",
271
- screenSize: 6,
272
- }),
273
- ],
274
- }),
275
- ],
276
- },
277
- };
278
-
279
- export const FieldArray: { args: INvsDynamicForm; name: string } = {
280
- name: "Field Array Example",
281
- args: {
282
- onSubmit: (values) => {
283
- alert(JSON.stringify(values));
284
- },
285
- submitButtonIsFullWidth: false,
286
- submitButtonLabel: "Save",
287
- submitButtonVisible: true,
288
- submitButtonPosition: "right",
289
- submitButtonDefaultOptions: {
290
- label: "Save",
291
- isFullWidth: true,
292
- position: "right",
293
- },
294
- buttonComponent: ButtonComponent,
295
- formElements: {
296
- textbox: {
297
- component: TextboxElement,
298
- class: TextboxField,
299
- },
300
- },
301
- fields: [
302
- new TextboxField({
303
- id: "firstName",
304
- placeholder: "Enter your first name",
305
- defaultValue: "ismet",
306
- validate: Yup.string().required(),
307
- screenSize: {
308
- desktop: 6,
309
- mobile: 6,
310
- },
311
- }),
312
- new TextboxField({
313
- id: "lastName",
314
- placeholder: "Enter your last name",
315
- screenSize: {
316
- desktop: 6,
317
- mobile: 6,
318
- },
319
- }),
320
- new ArrayField({
321
- id: "addresses",
322
- label: "Addresses",
323
- addButtonOptions: {
324
- label: "Add Address",
325
- },
326
- defaultValues: [
327
- { cityName: "İzmir", districtName: "Göztepe" },
328
- { cityName: "İstanbul", districtName: "Kadıköy" },
329
- ],
330
- validate: Yup.array().min(2).max(3),
331
- fields: [
332
- new TextboxField({
333
- id: "cityName",
334
- label: "City Name",
335
- placeholder: "Enter your city name",
336
- screenSize: 6,
337
- validate: Yup.string().required(),
338
- }),
339
- new TextboxField({
340
- id: "districtName",
341
- label: "district Name",
342
- placeholder: "Enter your district name",
343
- screenSize: 6,
344
- }),
345
- ],
346
- }),
347
- ],
348
- },
349
- };
@@ -1,196 +0,0 @@
1
- import {
2
- ArrayField,
3
- ArrayFieldAddButton,
4
- FieldBase,
5
- GroupField,
6
- LabelOptions,
7
- } from "../../types";
8
-
9
- import { ArrayField as ArrayFieldElement } from "../components/arrayField";
10
- import { Container } from "../components/container";
11
- import { Field } from "../components/field";
12
- import { FieldType } from "../_type";
13
- import { GroupField as GroupFieldElement } from "../components/groupField";
14
- import { IFormElement } from "../components/field";
15
- import React from "react";
16
- import { ReactNode } from "react";
17
-
18
- export class GenerateFormContentUtils {
19
- private readonly containerComponent: React.FC<any>;
20
- private readonly formElements: IFormElement;
21
- private readonly useContainersOutsideGroup: boolean;
22
- private readonly useGroupContainer: boolean;
23
- private readonly containerVisible: boolean;
24
- private readonly fields: Array<FieldType>;
25
- private readonly containerOptions: { [key: string]: any };
26
- private readonly buttonComponent?: React.FC<any>;
27
- private readonly fieldArrayAddButtonDefaultOptions: ArrayFieldAddButton;
28
- private readonly fieldArrayRemoveButtonDefaultOptions: ArrayFieldAddButton;
29
- private readonly labelDefaultOptions: LabelOptions;
30
-
31
- constructor({
32
- containerComponent,
33
- formElements,
34
- useContainersOutsideGroup,
35
- useGroupContainer,
36
- containerVisible,
37
- fields,
38
- containerOptions,
39
- buttonComponent,
40
- fieldArrayAddButtonDefaultOptions,
41
- fieldArrayRemoveButtonDefaultOptions,
42
- labelDefaultOptions,
43
- }: {
44
- containerComponent: React.FC<any>;
45
- formElements: IFormElement;
46
- useContainersOutsideGroup: boolean;
47
- useGroupContainer: boolean;
48
- containerVisible: boolean;
49
- fields: Array<FieldType>;
50
- buttonComponent?: React.FC<any>;
51
- containerOptions?: { [key: string]: any };
52
- fieldArrayAddButtonDefaultOptions?: ArrayFieldAddButton;
53
- fieldArrayRemoveButtonDefaultOptions?: ArrayFieldAddButton;
54
- labelDefaultOptions?: LabelOptions;
55
- }) {
56
- this.containerComponent = containerComponent;
57
- this.formElements = formElements;
58
- this.useContainersOutsideGroup = useContainersOutsideGroup;
59
- this.useGroupContainer = useGroupContainer;
60
- this.containerVisible = containerVisible;
61
- this.fields = fields;
62
- this.containerOptions = containerOptions ?? {};
63
- this.buttonComponent = buttonComponent;
64
- this.fieldArrayAddButtonDefaultOptions =
65
- fieldArrayAddButtonDefaultOptions ?? {};
66
- this.fieldArrayRemoveButtonDefaultOptions =
67
- fieldArrayRemoveButtonDefaultOptions ?? {};
68
- this.labelDefaultOptions = labelDefaultOptions ?? {};
69
- }
70
-
71
- createContainer(content: ReactNode, containerProps: object) {
72
- return (
73
- <Container
74
- containerComponent={this.containerComponent}
75
- options={containerProps}
76
- >
77
- {content}
78
- </Container>
79
- );
80
- }
81
-
82
- createFormContent() {
83
- const singleFields = this.createSingleFieldsElements();
84
- const groupFields = this.createGroupFieldsElements();
85
-
86
- let formContent;
87
- if (this.containerVisible && this.useContainersOutsideGroup && singleFields)
88
- formContent = (
89
- <>
90
- {this.createContainer(singleFields, this.containerOptions)}
91
- {groupFields}
92
- </>
93
- );
94
- else
95
- formContent = this.createFormGroup(
96
- <>
97
- {singleFields}
98
- {groupFields}
99
- </>,
100
- );
101
-
102
- return formContent;
103
- }
104
-
105
- createFormElements(fields: Array<FieldType>): JSX.Element[] {
106
- const fieldsElements = [];
107
- for (const field of fields) {
108
- if (field instanceof GroupField)
109
- fieldsElements.push(this.createGroupFieldElement(field));
110
- else if (field instanceof ArrayField)
111
- fieldsElements.push(this.createArrayFieldElement(field));
112
- else fieldsElements.push(this.createSingleFieldElement(field));
113
- }
114
- return fieldsElements;
115
- }
116
-
117
- createContentContainer(formElements: ReactNode) {
118
- return (
119
- <div className="nvs-container-fluid">
120
- <div className="nvs-row">{formElements}</div>
121
- </div>
122
- );
123
- }
124
-
125
- private getSingleFields() {
126
- return this.fields.filter((field) => this.isSingleField(field));
127
- }
128
-
129
- private getGroupFields() {
130
- return this.fields.filter((field) => !this.isSingleField(field));
131
- }
132
-
133
- private createSingleFieldsElements() {
134
- const singleFields = this.getSingleFields();
135
- return (
136
- singleFields.length > 0 &&
137
- this.createContentContainer(this.createFormElements(singleFields))
138
- );
139
- }
140
-
141
- private createGroupFieldsElements() {
142
- const groupFields = this.getGroupFields();
143
- return groupFields.length > 0 && this.createFormElements(groupFields);
144
- }
145
-
146
- private createSingleFieldElement(field: FieldBase<unknown>) {
147
- return (
148
- <Field key={field.id} formElements={this.formElements} field={field} />
149
- );
150
- }
151
-
152
- private createGroupFieldElement(field: GroupField) {
153
- return (
154
- <GroupFieldElement
155
- key={field.id}
156
- formElements={this.formElements}
157
- field={field}
158
- containerComponent={this.containerComponent}
159
- useContainersOutsideGroup={this.useContainersOutsideGroup}
160
- useGroupContainer={this.useGroupContainer}
161
- containerVisible={this.containerVisible}
162
- />
163
- );
164
- }
165
-
166
- private createArrayFieldElement(field: ArrayField) {
167
- return (
168
- <ArrayFieldElement
169
- key={field.id}
170
- formElements={this.formElements}
171
- field={field}
172
- containerComponent={this.containerComponent}
173
- useContainersOutsideGroup={this.useContainersOutsideGroup}
174
- useGroupContainer={this.useGroupContainer}
175
- containerVisible={this.containerVisible}
176
- buttonComponent={this.buttonComponent!}
177
- addButtonDefaultOptions={this.fieldArrayAddButtonDefaultOptions}
178
- removeButtonDefaultOptions={this.fieldArrayRemoveButtonDefaultOptions}
179
- labelDefaultOptions={this.labelDefaultOptions}
180
- />
181
- );
182
- }
183
-
184
- private isSingleField(field: FieldType) {
185
- return !(
186
- field instanceof GroupField &&
187
- field.containerVisible &&
188
- this.useGroupContainer &&
189
- this.containerVisible
190
- );
191
- }
192
-
193
- private createFormGroup(formContent: ReactNode) {
194
- return <div className="df-form-group">{formContent}</div>;
195
- }
196
- }