@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
@@ -6,9 +6,9 @@ import {
6
6
  LabelOptions,
7
7
  } from "../../../types";
8
8
  import { FieldArray, FormikProps } from "formik";
9
- import React, { useState } from "react";
9
+ import React, { ReactNode, useCallback, useState } from "react";
10
10
 
11
- import { GenerateFormContentUtils } from "../../services/generateFormContentUtils";
11
+ import { Elements } from "../elements";
12
12
  import { IArrayField } from "./_type";
13
13
  import { List } from "../list/_template";
14
14
 
@@ -24,6 +24,16 @@ export const ArrayField: React.FC<IArrayField> = ({
24
24
  removeButtonDefaultOptions,
25
25
  labelDefaultOptions,
26
26
  }: IArrayField) => {
27
+ const createArrayItem = useCallback(
28
+ (index: number) => {
29
+ return lodash.cloneDeep(arrayField.fields).map((field) => {
30
+ field.id = `${arrayField.id}[${index}].${field.id}`;
31
+ return field;
32
+ });
33
+ },
34
+ [arrayField.fields],
35
+ );
36
+
27
37
  const [addButtonOptions] = useState(
28
38
  new ArrayFieldAddButton(
29
39
  lodash.merge(
@@ -45,27 +55,18 @@ export const ArrayField: React.FC<IArrayField> = ({
45
55
  lodash.merge(labelDefaultOptions ?? {}, arrayField.labelOptions ?? {}),
46
56
  ),
47
57
  );
48
- const generateFormContentUtils = new GenerateFormContentUtils({
49
- containerComponent,
50
- formElements,
51
- useContainersOutsideGroup,
52
- useGroupContainer,
53
- containerVisible: containerVisible,
54
- fields: arrayField.fields,
55
- fieldArrayAddButtonDefaultOptions: addButtonDefaultOptions,
56
- fieldArrayRemoveButtonDefaultOptions: removeButtonDefaultOptions,
57
- });
58
-
59
- const createArrayItem = (name: string, index: number) => {
60
- return arrayField.fields.map((field) => ({
61
- ...field,
62
- id: `${name}[${index}].${field.id}`,
63
- }));
58
+
59
+ const ContentContainer = ({ children }: { children: ReactNode }) => {
60
+ return (
61
+ <div className="nvs-container-fluid">
62
+ <div className="nvs-row">{children}</div>
63
+ </div>
64
+ );
64
65
  };
65
66
 
66
67
  const getDefaultItem = () => {
67
68
  return arrayField.fields.reduce((acc: { [key: string]: any }, field) => {
68
- acc[field.id] = field.defaultValue;
69
+ if ("defaultValue" in field) acc[field.id] = field.defaultValue;
69
70
  return acc;
70
71
  }, {});
71
72
  };
@@ -75,9 +76,18 @@ export const ArrayField: React.FC<IArrayField> = ({
75
76
  <div className="df-array-field-content">
76
77
  <div className="nvs-container-fluid">
77
78
  <div className="nvs-row">
78
- {generateFormContentUtils.createFormElements(
79
- createArrayItem(arrayField.id, index),
80
- )}
79
+ <Elements
80
+ fields={createArrayItem(index)}
81
+ formElements={formElements}
82
+ containerComponent={containerComponent}
83
+ useContainersOutsideGroup={useContainersOutsideGroup}
84
+ useGroupContainer={useGroupContainer}
85
+ containerVisible={containerVisible}
86
+ buttonComponent={ButtonComponent}
87
+ fieldArrayAddButtonDefaultOptions={addButtonDefaultOptions}
88
+ fieldArrayRemoveButtonDefaultOptions={removeButtonDefaultOptions}
89
+ labelDefaultOptions={labelDefaultOptions}
90
+ />
81
91
  </div>
82
92
  </div>
83
93
  </div>
@@ -103,9 +113,7 @@ export const ArrayField: React.FC<IArrayField> = ({
103
113
  const createArrayItemRemoveButton = (onRemoveItem: Function) => {
104
114
  return (
105
115
  <div className="df-array-field-remove-button">
106
- {generateFormContentUtils.createContentContainer(
107
- createRemoveButton(onRemoveItem),
108
- )}
116
+ <ContentContainer>{createRemoveButton(onRemoveItem)}</ContentContainer>
109
117
  </div>
110
118
  );
111
119
  };
@@ -138,18 +146,18 @@ export const ArrayField: React.FC<IArrayField> = ({
138
146
  };
139
147
 
140
148
  const createArrayItemAddButton = (onAddItem: Function) => {
141
- return generateFormContentUtils.createContentContainer(
142
- createAddButton(onAddItem),
143
- );
149
+ return <ContentContainer>{createAddButton(onAddItem)}</ContentContainer>;
144
150
  };
145
151
 
146
152
  const createArrayFieldLabel = () => {
147
- return generateFormContentUtils.createContentContainer(
148
- <div className="nvs-col-12">
149
- <label className={`df-array-field-label ${labelOptions.class}`}>
150
- {arrayField.label}
151
- </label>
152
- </div>,
153
+ return (
154
+ <ContentContainer>
155
+ <div className="nvs-col-12">
156
+ <label className={`df-array-field-label ${labelOptions.class}`}>
157
+ {arrayField.label}
158
+ </label>
159
+ </div>
160
+ </ContentContainer>
153
161
  );
154
162
  };
155
163
 
@@ -180,11 +188,14 @@ export const ArrayField: React.FC<IArrayField> = ({
180
188
  {({ push, remove, form }) => (
181
189
  <>
182
190
  {arrayField.label && createArrayFieldLabel()}
183
- {form.values[arrayField.id]?.map((_: any, index: number) =>
184
- createFieldArrayContent(remove, index),
185
- )}
186
- {checkFieldArrayMaxSize(form.values[arrayField.id].length) &&
187
- createArrayItemAddButton(push)}
191
+ {lodash
192
+ .get(form.values, arrayField.id)
193
+ ?.map((_: any, index: number) =>
194
+ createFieldArrayContent(remove, index),
195
+ )}
196
+ {checkFieldArrayMaxSize(
197
+ lodash.get(form.values, arrayField.id)?.length,
198
+ ) && createArrayItemAddButton(push)}
188
199
  {createErrorList(form)}
189
200
  </>
190
201
  )}
@@ -0,0 +1,94 @@
1
+ import {
2
+ ArrayField,
3
+ ArrayFieldAddButton,
4
+ GroupField,
5
+ LabelOptions,
6
+ } from "../../../types";
7
+ import { Field, IFormElement } from "../field";
8
+ import React, { useEffect, useState } from "react";
9
+
10
+ import { ArrayField as ArrayFieldElement } from "../arrayField";
11
+ import { FieldBase } from "../../../types";
12
+ import { FieldType } from "../../_type";
13
+ import { GroupField as GroupFieldElement } from "../groupField";
14
+
15
+ export const Elements = ({
16
+ fields,
17
+ formElements,
18
+ containerComponent,
19
+ useContainersOutsideGroup,
20
+ useGroupContainer,
21
+ containerVisible,
22
+ buttonComponent,
23
+ fieldArrayAddButtonDefaultOptions = {},
24
+ fieldArrayRemoveButtonDefaultOptions = {},
25
+ labelDefaultOptions = {},
26
+ }: {
27
+ fields: Array<FieldType>;
28
+ formElements: IFormElement;
29
+ containerComponent: React.FC<any>;
30
+ useContainersOutsideGroup: boolean;
31
+ useGroupContainer: boolean;
32
+ containerVisible: boolean;
33
+ buttonComponent?: React.FC<any>;
34
+ fieldArrayAddButtonDefaultOptions?: ArrayFieldAddButton;
35
+ fieldArrayRemoveButtonDefaultOptions?: ArrayFieldAddButton;
36
+ labelDefaultOptions?: LabelOptions;
37
+ }) => {
38
+ const [fieldsElements, setFieldsElements] = useState<JSX.Element[]>([]);
39
+
40
+ const createFormElements = (): JSX.Element[] => {
41
+ const fieldsElements = [];
42
+ for (const field of fields) {
43
+ if (field instanceof GroupField)
44
+ fieldsElements.push(createGroupFieldElement(field));
45
+ else if (field instanceof ArrayField)
46
+ fieldsElements.push(createArrayFieldElement(field));
47
+ else fieldsElements.push(createSingleFieldElement(field));
48
+ }
49
+ return fieldsElements;
50
+ };
51
+
52
+ const createSingleFieldElement = (field: FieldBase<unknown>) => {
53
+ return <Field key={field.id} formElements={formElements} field={field} />;
54
+ };
55
+
56
+ const createGroupFieldElement = (field: GroupField) => {
57
+ return (
58
+ <GroupFieldElement
59
+ key={field.id}
60
+ formElements={formElements}
61
+ field={field}
62
+ containerComponent={containerComponent}
63
+ useContainersOutsideGroup={useContainersOutsideGroup}
64
+ useGroupContainer={useGroupContainer}
65
+ containerVisible={containerVisible}
66
+ buttonComponent={buttonComponent!}
67
+ />
68
+ );
69
+ };
70
+
71
+ const createArrayFieldElement = (field: ArrayField) => {
72
+ return (
73
+ <ArrayFieldElement
74
+ key={field.id}
75
+ formElements={formElements}
76
+ field={field}
77
+ containerComponent={containerComponent}
78
+ useContainersOutsideGroup={useContainersOutsideGroup}
79
+ useGroupContainer={useGroupContainer}
80
+ containerVisible={containerVisible}
81
+ buttonComponent={buttonComponent!}
82
+ addButtonDefaultOptions={fieldArrayAddButtonDefaultOptions}
83
+ removeButtonDefaultOptions={fieldArrayRemoveButtonDefaultOptions}
84
+ labelDefaultOptions={labelDefaultOptions}
85
+ />
86
+ );
87
+ };
88
+
89
+ useEffect(() => {
90
+ if (fields.length > 0) setFieldsElements(createFormElements());
91
+ }, [fields]);
92
+
93
+ return fieldsElements.length > 0 ? fieldsElements : <></>;
94
+ };
@@ -0,0 +1 @@
1
+ export * from "./_template";
@@ -0,0 +1,149 @@
1
+ import React, { ReactNode, useEffect, useState } from "react";
2
+ import { ArrayField, GroupField, LabelOptions } from "../../../types";
3
+ import { IFormElement } from "../field";
4
+ import { FieldType } from "../../_type";
5
+ import { ArrayFieldAddButton } from "../../../types";
6
+ import { Container } from "../container";
7
+ import { Elements } from "../elements";
8
+
9
+ export const FormBuilder = ({
10
+ containerComponent,
11
+ formElements,
12
+ useContainersOutsideGroup,
13
+ useGroupContainer,
14
+ containerVisible,
15
+ fields,
16
+ containerOptions = {},
17
+ buttonComponent,
18
+ fieldArrayAddButtonDefaultOptions,
19
+ fieldArrayRemoveButtonDefaultOptions,
20
+ labelDefaultOptions,
21
+ }: {
22
+ containerComponent: React.FC<any>;
23
+ formElements: IFormElement;
24
+ useContainersOutsideGroup: boolean;
25
+ useGroupContainer: boolean;
26
+ containerVisible: boolean;
27
+ fields: Array<FieldType>;
28
+ buttonComponent?: React.FC<any>;
29
+ containerOptions?: { [key: string]: any };
30
+ fieldArrayAddButtonDefaultOptions?: ArrayFieldAddButton;
31
+ fieldArrayRemoveButtonDefaultOptions?: ArrayFieldAddButton;
32
+ labelDefaultOptions?: LabelOptions;
33
+ }) => {
34
+ const [formContent, setFormContent] = useState<ReactNode>();
35
+
36
+ const createFormContent = () => {
37
+ const singleFields = createSingleFieldsElements();
38
+ const groupFields = createGroupFieldsElements();
39
+
40
+ let formContent;
41
+ if (containerVisible && useContainersOutsideGroup && singleFields)
42
+ formContent = (
43
+ <>
44
+ {createContainer(singleFields, containerOptions)}
45
+ {groupFields}
46
+ </>
47
+ );
48
+ else
49
+ formContent = createFormGroup(
50
+ <>
51
+ {singleFields}
52
+ {groupFields}
53
+ </>,
54
+ );
55
+
56
+ return formContent;
57
+ };
58
+
59
+ const createContentContainer = (formElements: ReactNode) => {
60
+ return (
61
+ <div className="nvs-container-fluid">
62
+ <div className="nvs-row">{formElements}</div>
63
+ </div>
64
+ );
65
+ };
66
+
67
+ const createSingleFieldsElements = () => {
68
+ const singleFields = getSingleFields();
69
+ return (
70
+ singleFields.length > 0 &&
71
+ createContentContainer(
72
+ <Elements
73
+ fields={singleFields}
74
+ formElements={formElements}
75
+ containerComponent={containerComponent}
76
+ useContainersOutsideGroup={useContainersOutsideGroup}
77
+ useGroupContainer={useGroupContainer}
78
+ containerVisible={containerVisible}
79
+ buttonComponent={buttonComponent}
80
+ fieldArrayAddButtonDefaultOptions={fieldArrayAddButtonDefaultOptions}
81
+ fieldArrayRemoveButtonDefaultOptions={
82
+ fieldArrayRemoveButtonDefaultOptions
83
+ }
84
+ labelDefaultOptions={labelDefaultOptions}
85
+ />,
86
+ )
87
+ );
88
+ };
89
+
90
+ const createGroupFieldsElements = () => {
91
+ const groupFields = getGroupFields();
92
+ return (
93
+ groupFields.length > 0 && (
94
+ <Elements
95
+ fields={groupFields}
96
+ formElements={formElements}
97
+ containerComponent={containerComponent}
98
+ useContainersOutsideGroup={useContainersOutsideGroup}
99
+ useGroupContainer={useGroupContainer}
100
+ containerVisible={containerVisible}
101
+ buttonComponent={buttonComponent}
102
+ fieldArrayAddButtonDefaultOptions={fieldArrayAddButtonDefaultOptions}
103
+ fieldArrayRemoveButtonDefaultOptions={
104
+ fieldArrayRemoveButtonDefaultOptions
105
+ }
106
+ labelDefaultOptions={labelDefaultOptions}
107
+ />
108
+ )
109
+ );
110
+ };
111
+
112
+ const isSingleField = (field: FieldType) => {
113
+ return !(
114
+ (field instanceof GroupField || field instanceof ArrayField) &&
115
+ field.containerVisible &&
116
+ useGroupContainer &&
117
+ containerVisible
118
+ );
119
+ };
120
+
121
+ const getSingleFields = () => {
122
+ return fields.filter((field) => isSingleField(field));
123
+ };
124
+
125
+ const getGroupFields = () => {
126
+ return fields.filter((field) => !isSingleField(field));
127
+ };
128
+
129
+ const createContainer = (content: ReactNode, containerProps: object) => {
130
+ return (
131
+ <Container
132
+ containerComponent={containerComponent}
133
+ options={containerProps}
134
+ >
135
+ {content}
136
+ </Container>
137
+ );
138
+ };
139
+
140
+ const createFormGroup = (formContent: ReactNode) => {
141
+ return <div className="df-form-group">{formContent}</div>;
142
+ };
143
+
144
+ useEffect(() => {
145
+ setFormContent(createFormContent());
146
+ }, [fields]);
147
+
148
+ return <>{formContent}</>;
149
+ };
@@ -0,0 +1 @@
1
+ export * from "./_template";
@@ -1,4 +1,7 @@
1
- import { GenerateFormContentUtils } from "../../services/generateFormContentUtils";
1
+ import React, { useState } from "react";
2
+
3
+ import { Elements } from "../elements";
4
+ import { FormBuilder } from "../formBuilder";
2
5
  import { IGroupField } from "./_type";
3
6
 
4
7
  export const GroupField = ({
@@ -8,25 +11,42 @@ export const GroupField = ({
8
11
  containerVisible,
9
12
  useContainersOutsideGroup,
10
13
  useGroupContainer,
14
+ buttonComponent,
11
15
  }: IGroupField) => {
12
- const generateFormContentUtils = new GenerateFormContentUtils({
13
- containerComponent,
14
- formElements,
15
- useContainersOutsideGroup,
16
- useGroupContainer,
17
- containerOptions: groupField.containerOptions,
18
- containerVisible: containerVisible && groupField.containerVisible!,
19
- fields: groupField.fields.map((field) => {
16
+ const [fields, _] = useState(
17
+ groupField.fields.map((field) => {
20
18
  field.id = `${groupField.id}.${field.id}`;
21
19
  return field;
22
20
  }),
23
- });
21
+ );
24
22
 
25
23
  const isContainerVisible = () => {
26
24
  return groupField.containerVisible && useGroupContainer && containerVisible;
27
25
  };
28
26
 
29
- return isContainerVisible()
30
- ? generateFormContentUtils.createFormContent()
31
- : generateFormContentUtils.createFormElements(groupField.fields);
27
+ return (
28
+ fields &&
29
+ (isContainerVisible() ? (
30
+ <FormBuilder
31
+ containerComponent={containerComponent}
32
+ formElements={formElements}
33
+ useContainersOutsideGroup={useContainersOutsideGroup}
34
+ useGroupContainer={useGroupContainer}
35
+ containerOptions={groupField.containerOptions}
36
+ containerVisible={containerVisible}
37
+ fields={fields}
38
+ buttonComponent={buttonComponent}
39
+ />
40
+ ) : (
41
+ <Elements
42
+ fields={fields}
43
+ containerComponent={containerComponent}
44
+ formElements={formElements}
45
+ useContainersOutsideGroup={useContainersOutsideGroup}
46
+ useGroupContainer={useGroupContainer}
47
+ containerVisible={containerVisible}
48
+ buttonComponent={buttonComponent}
49
+ />
50
+ ))
51
+ );
32
52
  };
@@ -7,4 +7,5 @@ export interface IGroupField extends IField {
7
7
  containerVisible: boolean;
8
8
  useContainersOutsideGroup: boolean;
9
9
  useGroupContainer: boolean;
10
+ buttonComponent?: React.FC<any>;
10
11
  }
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+
3
+ export const ButtonComponent = ({
4
+ children,
5
+ type = "submit",
6
+ onClick = () => {},
7
+ }: {
8
+ children: string;
9
+ type: "submit" | "reset" | "button";
10
+ onClick?: () => void;
11
+ }) => {
12
+ return (
13
+ <button onClick={onClick} style={{ width: "100%" }} type={type}>
14
+ {children}
15
+ </button>
16
+ );
17
+ };
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+
3
+ export const Container = ({ children, ...props }) => {
4
+ return (
5
+ <div id="custom-container" className="nvs-container-fluid">
6
+ <div className="nvs-row">
7
+ <div className="nvs-col-12">
8
+ <h1>{props.title}</h1>
9
+ </div>
10
+ <div className="nvs-col-12">{children}</div>
11
+ </div>
12
+ </div>
13
+ );
14
+ };
@@ -0,0 +1,3 @@
1
+ export * from "./button";
2
+ export * from "./container";
3
+ export * from "./textboxElement";
@@ -0,0 +1,20 @@
1
+ import { FieldBase } from "../../../types";
2
+ import React from "react";
3
+
4
+ export class TextboxField extends FieldBase<string> {
5
+ override readonly fieldType? = "textbox";
6
+ type?: "email" | "number" | "password" | "tel" | "text" | "url";
7
+ placeholder?: string;
8
+
9
+ constructor(options: TextboxField) {
10
+ super(options, "");
11
+ this.type = options.type ?? "text";
12
+ this.placeholder = options.placeholder ?? "";
13
+ }
14
+ }
15
+
16
+ export const TextboxElement = ({ defaultValue, ...props }: TextboxField) => {
17
+ return (
18
+ <input style={{ width: "100%", boxSizing: "border-box" }} {...props} />
19
+ );
20
+ };
@@ -0,0 +1,87 @@
1
+ import * as Yup from "yup";
2
+
3
+ import {
4
+ ButtonComponent,
5
+ TextboxElement,
6
+ TextboxField,
7
+ } from "../../components";
8
+ import { INvsDynamicForm, NvsDynamicForm } from "../../..";
9
+
10
+ import { ArrayField } from "../../../../types";
11
+
12
+ export default {
13
+ component: NvsDynamicForm,
14
+ title: "Array Field",
15
+ };
16
+
17
+ export const Default: { args: INvsDynamicForm; name: string } = {
18
+ name: "Default",
19
+ args: {
20
+ onSubmit: (values) => {
21
+ alert(JSON.stringify(values));
22
+ },
23
+ submitButtonIsFullWidth: false,
24
+ submitButtonLabel: "Save",
25
+ submitButtonVisible: true,
26
+ submitButtonPosition: "right",
27
+ submitButtonDefaultOptions: {
28
+ label: "Save",
29
+ isFullWidth: true,
30
+ position: "right",
31
+ },
32
+ buttonComponent: ButtonComponent,
33
+ formElements: {
34
+ textbox: {
35
+ component: TextboxElement,
36
+ class: TextboxField,
37
+ },
38
+ },
39
+ fields: [
40
+ new TextboxField({
41
+ id: "firstName",
42
+ placeholder: "Enter your first name",
43
+ defaultValue: "ismet",
44
+ validate: Yup.string().required(),
45
+ screenSize: {
46
+ desktop: 6,
47
+ mobile: 6,
48
+ },
49
+ }),
50
+ new TextboxField({
51
+ id: "lastName",
52
+ placeholder: "Enter your last name",
53
+ screenSize: {
54
+ desktop: 6,
55
+ mobile: 6,
56
+ },
57
+ }),
58
+ new ArrayField({
59
+ id: "addresses",
60
+ label: "Addresses",
61
+ addButtonOptions: {
62
+ label: "Add Address",
63
+ },
64
+ defaultValues: [
65
+ { cityName: "İzmir", districtName: "Göztepe" },
66
+ { cityName: "İstanbul", districtName: "Kadıköy" },
67
+ ],
68
+ validate: Yup.array().min(2).max(3),
69
+ fields: [
70
+ new TextboxField({
71
+ id: "cityName",
72
+ label: "City Name",
73
+ placeholder: "Enter your city name",
74
+ screenSize: 6,
75
+ validate: Yup.string().required(),
76
+ }),
77
+ new TextboxField({
78
+ id: "districtName",
79
+ label: "district Name",
80
+ placeholder: "Enter your district name",
81
+ screenSize: 6,
82
+ }),
83
+ ],
84
+ }),
85
+ ],
86
+ },
87
+ };