@nvs-dynamic-form/react-core 2.3.1 → 2.4.0
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/dist/cjs/nvs-dynamic-form/_template.js +4 -17
- package/dist/cjs/nvs-dynamic-form/_template.js.map +1 -1
- package/dist/cjs/nvs-dynamic-form/components/arrayField/_template.js +24 -25
- package/dist/cjs/nvs-dynamic-form/components/arrayField/_template.js.map +1 -1
- package/dist/cjs/nvs-dynamic-form/components/elements/_template.d.ts +16 -0
- package/dist/cjs/nvs-dynamic-form/components/elements/_template.js +62 -0
- package/dist/cjs/nvs-dynamic-form/components/elements/_template.js.map +1 -0
- package/dist/cjs/nvs-dynamic-form/components/elements/index.d.ts +1 -0
- package/dist/cjs/nvs-dynamic-form/components/elements/index.js +18 -0
- package/dist/cjs/nvs-dynamic-form/components/elements/index.js.map +1 -0
- package/dist/cjs/nvs-dynamic-form/components/formBuilder/_template.d.ts +20 -0
- package/dist/cjs/nvs-dynamic-form/components/formBuilder/_template.js +84 -0
- package/dist/cjs/nvs-dynamic-form/components/formBuilder/_template.js.map +1 -0
- package/dist/cjs/nvs-dynamic-form/components/formBuilder/index.d.ts +1 -0
- package/dist/cjs/nvs-dynamic-form/components/formBuilder/index.js +18 -0
- package/dist/cjs/nvs-dynamic-form/components/formBuilder/index.js.map +1 -0
- package/dist/cjs/nvs-dynamic-form/components/groupField/_template.d.ts +2 -1
- package/dist/cjs/nvs-dynamic-form/components/groupField/_template.js +33 -17
- package/dist/cjs/nvs-dynamic-form/components/groupField/_template.js.map +1 -1
- package/dist/cjs/nvs-dynamic-form/components/groupField/_type.d.ts +1 -0
- package/dist/cjs/types/array-field.type.d.ts +4 -2
- package/dist/cjs/types/array-field.type.js +2 -0
- package/dist/cjs/types/array-field.type.js.map +1 -1
- package/dist/cjs/types/group-field.type.d.ts +3 -5
- package/dist/esm/nvs-dynamic-form/_template.js +4 -17
- package/dist/esm/nvs-dynamic-form/_template.js.map +1 -1
- package/dist/esm/nvs-dynamic-form/components/arrayField/_template.js +25 -26
- package/dist/esm/nvs-dynamic-form/components/arrayField/_template.js.map +1 -1
- package/dist/esm/nvs-dynamic-form/components/elements/_template.d.ts +16 -0
- package/dist/esm/nvs-dynamic-form/components/elements/_template.js +35 -0
- package/dist/esm/nvs-dynamic-form/components/elements/_template.js.map +1 -0
- package/dist/esm/nvs-dynamic-form/components/elements/index.d.ts +1 -0
- package/dist/esm/nvs-dynamic-form/components/elements/index.js +2 -0
- package/dist/esm/nvs-dynamic-form/components/elements/index.js.map +1 -0
- package/dist/esm/nvs-dynamic-form/components/formBuilder/_template.d.ts +20 -0
- package/dist/esm/nvs-dynamic-form/components/formBuilder/_template.js +57 -0
- package/dist/esm/nvs-dynamic-form/components/formBuilder/_template.js.map +1 -0
- package/dist/esm/nvs-dynamic-form/components/formBuilder/index.d.ts +1 -0
- package/dist/esm/nvs-dynamic-form/components/formBuilder/index.js +2 -0
- package/dist/esm/nvs-dynamic-form/components/formBuilder/index.js.map +1 -0
- package/dist/esm/nvs-dynamic-form/components/groupField/_template.d.ts +2 -1
- package/dist/esm/nvs-dynamic-form/components/groupField/_template.js +10 -17
- package/dist/esm/nvs-dynamic-form/components/groupField/_template.js.map +1 -1
- package/dist/esm/nvs-dynamic-form/components/groupField/_type.d.ts +1 -0
- package/dist/esm/types/array-field.type.d.ts +4 -2
- package/dist/esm/types/array-field.type.js +2 -0
- package/dist/esm/types/array-field.type.js.map +1 -1
- package/dist/esm/types/group-field.type.d.ts +3 -5
- package/lib/nvs-dynamic-form/_template.tsx +21 -18
- package/lib/nvs-dynamic-form/components/arrayField/_template.tsx +50 -39
- package/lib/nvs-dynamic-form/components/elements/_template.tsx +94 -0
- package/lib/nvs-dynamic-form/components/elements/index.tsx +1 -0
- package/lib/nvs-dynamic-form/components/formBuilder/_template.tsx +149 -0
- package/lib/nvs-dynamic-form/components/formBuilder/index.tsx +1 -0
- package/lib/nvs-dynamic-form/components/groupField/_template.tsx +33 -13
- package/lib/nvs-dynamic-form/components/groupField/_type.tsx +1 -0
- package/lib/nvs-dynamic-form/stories/components/button.tsx +17 -0
- package/lib/nvs-dynamic-form/stories/components/container.tsx +14 -0
- package/lib/nvs-dynamic-form/stories/components/index.tsx +3 -0
- package/lib/nvs-dynamic-form/stories/components/textboxElement.tsx +20 -0
- package/lib/nvs-dynamic-form/stories/fields/arrayField/basicExample.stories.tsx +87 -0
- package/lib/nvs-dynamic-form/stories/fields/arrayField/groupField.stories.tsx +102 -0
- package/lib/nvs-dynamic-form/stories/fields/arrayField/nested.stories.tsx +137 -0
- package/lib/nvs-dynamic-form/stories/fields/basicExample.stories.tsx +66 -0
- package/lib/nvs-dynamic-form/stories/fields/groupField/arrayFields.stories.tsx +113 -0
- package/lib/nvs-dynamic-form/stories/fields/groupField/basicExample.stories.tsx +86 -0
- package/lib/nvs-dynamic-form/stories/fields/groupField/container.stories.tsx +112 -0
- package/lib/nvs-dynamic-form/stories/fields/groupField/nested.stories.tsx +103 -0
- package/lib/types/array-field.type.tsx +6 -2
- package/lib/types/group-field.type.tsx +3 -3
- package/package.json +1 -1
- package/dist/cjs/nvs-dynamic-form/services/generateFormContentUtils.d.ts +0 -46
- package/dist/cjs/nvs-dynamic-form/services/generateFormContentUtils.js +0 -97
- package/dist/cjs/nvs-dynamic-form/services/generateFormContentUtils.js.map +0 -1
- package/dist/esm/nvs-dynamic-form/services/generateFormContentUtils.d.ts +0 -46
- package/dist/esm/nvs-dynamic-form/services/generateFormContentUtils.js +0 -90
- package/dist/esm/nvs-dynamic-form/services/generateFormContentUtils.js.map +0 -1
- package/lib/nvs-dynamic-form/_stories.tsx +0 -349
- package/lib/nvs-dynamic-form/services/generateFormContentUtils.tsx +0 -196
|
@@ -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 {
|
|
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
|
|
13
|
-
|
|
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
|
|
30
|
-
|
|
31
|
-
|
|
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
|
};
|
|
@@ -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,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
|
+
};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import * as Yup from "yup";
|
|
2
|
+
|
|
3
|
+
import { ArrayField, GroupField } from "../../../../types";
|
|
4
|
+
import {
|
|
5
|
+
ButtonComponent,
|
|
6
|
+
TextboxElement,
|
|
7
|
+
TextboxField,
|
|
8
|
+
} from "../../components";
|
|
9
|
+
import { INvsDynamicForm, NvsDynamicForm } from "../../..";
|
|
10
|
+
|
|
11
|
+
export default {
|
|
12
|
+
component: NvsDynamicForm,
|
|
13
|
+
title: "Array Field",
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export const GroupFieldInArray: { args: INvsDynamicForm; name: string } = {
|
|
17
|
+
name: "Group Field In Array",
|
|
18
|
+
args: {
|
|
19
|
+
onSubmit: (values) => {
|
|
20
|
+
alert(JSON.stringify(values));
|
|
21
|
+
},
|
|
22
|
+
submitButtonIsFullWidth: false,
|
|
23
|
+
submitButtonLabel: "Save",
|
|
24
|
+
submitButtonVisible: true,
|
|
25
|
+
submitButtonPosition: "right",
|
|
26
|
+
submitButtonDefaultOptions: {
|
|
27
|
+
label: "Save",
|
|
28
|
+
isFullWidth: true,
|
|
29
|
+
position: "right",
|
|
30
|
+
},
|
|
31
|
+
buttonComponent: ButtonComponent,
|
|
32
|
+
formElements: {
|
|
33
|
+
textbox: {
|
|
34
|
+
component: TextboxElement,
|
|
35
|
+
class: TextboxField,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
fields: [
|
|
39
|
+
new TextboxField({
|
|
40
|
+
id: "firstName",
|
|
41
|
+
placeholder: "Enter your first name",
|
|
42
|
+
defaultValue: "ismet",
|
|
43
|
+
validate: Yup.string().required(),
|
|
44
|
+
screenSize: {
|
|
45
|
+
desktop: 6,
|
|
46
|
+
mobile: 6,
|
|
47
|
+
},
|
|
48
|
+
}),
|
|
49
|
+
new TextboxField({
|
|
50
|
+
id: "lastName",
|
|
51
|
+
placeholder: "Enter your last name",
|
|
52
|
+
screenSize: {
|
|
53
|
+
desktop: 6,
|
|
54
|
+
mobile: 6,
|
|
55
|
+
},
|
|
56
|
+
}),
|
|
57
|
+
new ArrayField({
|
|
58
|
+
id: "addresses",
|
|
59
|
+
label: "Addresses",
|
|
60
|
+
addButtonOptions: {
|
|
61
|
+
label: "Add Address",
|
|
62
|
+
},
|
|
63
|
+
defaultValues: [
|
|
64
|
+
{
|
|
65
|
+
address: {
|
|
66
|
+
cityName: "Istanbul",
|
|
67
|
+
districtName: "Kadıköy",
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
validate: Yup.array().min(2).max(3),
|
|
72
|
+
fields: [
|
|
73
|
+
new TextboxField({
|
|
74
|
+
id: "addressName",
|
|
75
|
+
label: "Address Name",
|
|
76
|
+
placeholder: "Enter your address name",
|
|
77
|
+
screenSize: 12,
|
|
78
|
+
validate: Yup.string().required(),
|
|
79
|
+
}),
|
|
80
|
+
new GroupField({
|
|
81
|
+
id: "address",
|
|
82
|
+
fields: [
|
|
83
|
+
new TextboxField({
|
|
84
|
+
id: "cityName",
|
|
85
|
+
label: "City Name",
|
|
86
|
+
placeholder: "Enter your city name",
|
|
87
|
+
screenSize: 6,
|
|
88
|
+
validate: Yup.string().required(),
|
|
89
|
+
}),
|
|
90
|
+
new TextboxField({
|
|
91
|
+
id: "districtName",
|
|
92
|
+
label: "district Name",
|
|
93
|
+
placeholder: "Enter your district name",
|
|
94
|
+
screenSize: 6,
|
|
95
|
+
}),
|
|
96
|
+
],
|
|
97
|
+
}),
|
|
98
|
+
],
|
|
99
|
+
}),
|
|
100
|
+
],
|
|
101
|
+
},
|
|
102
|
+
};
|