@pareto-engineering/design-system 4.0.0 → 4.1.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/a/ToggleSwitch/ToggleSwitch.js +10 -5
- package/dist/cjs/f/FormInput/FormInput.js +7 -0
- package/dist/cjs/f/fields/EditorInput/EditorInput.js +9 -7
- package/dist/cjs/f/fields/SelectInput/SelectInput.js +4 -5
- package/dist/cjs/f/fields/SelectInput/common/Single/Single.js +3 -3
- package/dist/cjs/g/FormBuilder/FormBuilder.js +77 -0
- package/dist/cjs/g/FormBuilder/common/Builder/Builder.js +156 -0
- package/dist/cjs/g/FormBuilder/common/Builder/common/InputBuilder/InputBuilder.js +229 -0
- package/dist/cjs/g/FormBuilder/common/Builder/common/InputBuilder/index.js +13 -0
- package/dist/cjs/g/FormBuilder/common/Builder/common/InputBuilder/styles.scss +192 -0
- package/dist/cjs/g/FormBuilder/common/Builder/common/Section/Section.js +133 -0
- package/dist/cjs/g/FormBuilder/common/Builder/common/Section/index.js +13 -0
- package/dist/cjs/g/FormBuilder/common/Builder/common/index.js +19 -0
- package/dist/cjs/g/FormBuilder/common/Builder/index.js +13 -0
- package/dist/cjs/g/FormBuilder/common/Builder/styles.scss +106 -0
- package/dist/cjs/g/FormBuilder/common/Renderer/Renderer.js +119 -0
- package/dist/cjs/g/FormBuilder/common/Renderer/common/Section/Section.js +60 -0
- package/dist/cjs/g/FormBuilder/common/Renderer/common/Section/index.js +13 -0
- package/dist/cjs/g/FormBuilder/common/Renderer/common/index.js +12 -0
- package/dist/cjs/g/FormBuilder/common/Renderer/index.js +13 -0
- package/dist/cjs/g/FormBuilder/common/Renderer/styles.scss +15 -0
- package/dist/cjs/g/FormBuilder/common/index.js +19 -0
- package/dist/cjs/g/FormBuilder/index.js +13 -0
- package/dist/cjs/g/FormBuilder/styles.scss +7 -0
- package/dist/cjs/g/index.js +8 -1
- package/dist/es/a/ToggleSwitch/ToggleSwitch.js +10 -5
- package/dist/es/f/FormInput/FormInput.js +7 -0
- package/dist/es/f/fields/EditorInput/EditorInput.js +9 -7
- package/dist/es/f/fields/SelectInput/SelectInput.js +4 -3
- package/dist/es/f/fields/SelectInput/common/Single/Single.js +3 -3
- package/dist/es/g/FormBuilder/FormBuilder.js +65 -0
- package/dist/es/g/FormBuilder/common/Builder/Builder.js +142 -0
- package/dist/es/g/FormBuilder/common/Builder/common/InputBuilder/InputBuilder.js +216 -0
- package/dist/es/g/FormBuilder/common/Builder/common/InputBuilder/index.js +2 -0
- package/dist/es/g/FormBuilder/common/Builder/common/InputBuilder/styles.scss +192 -0
- package/dist/es/g/FormBuilder/common/Builder/common/Section/Section.js +120 -0
- package/dist/es/g/FormBuilder/common/Builder/common/Section/index.js +2 -0
- package/dist/es/g/FormBuilder/common/Builder/common/index.js +2 -0
- package/dist/es/g/FormBuilder/common/Builder/index.js +2 -0
- package/dist/es/g/FormBuilder/common/Builder/styles.scss +106 -0
- package/dist/es/g/FormBuilder/common/Renderer/Renderer.js +113 -0
- package/dist/es/g/FormBuilder/common/Renderer/common/Section/Section.js +52 -0
- package/dist/es/g/FormBuilder/common/Renderer/common/Section/index.js +2 -0
- package/dist/es/g/FormBuilder/common/Renderer/common/index.js +1 -0
- package/dist/es/g/FormBuilder/common/Renderer/index.js +2 -0
- package/dist/es/g/FormBuilder/common/Renderer/styles.scss +15 -0
- package/dist/es/g/FormBuilder/common/index.js +2 -0
- package/dist/es/g/FormBuilder/index.js +2 -0
- package/dist/es/g/FormBuilder/styles.scss +7 -0
- package/dist/es/g/index.js +2 -1
- package/package.json +3 -3
- package/src/stories/a/ToggleSwitch.stories.jsx +8 -2
- package/src/stories/g/FormBuilder.stories.jsx +97 -0
- package/src/ui/a/ToggleSwitch/ToggleSwitch.jsx +9 -3
- package/src/ui/f/FormInput/FormInput.jsx +10 -0
- package/src/ui/f/fields/EditorInput/EditorInput.jsx +5 -6
- package/src/ui/f/fields/SelectInput/SelectInput.jsx +5 -2
- package/src/ui/f/fields/SelectInput/common/Single/Single.jsx +2 -1
- package/src/ui/g/FormBuilder/FormBuilder.jsx +85 -0
- package/src/ui/g/FormBuilder/common/Builder/Builder.jsx +175 -0
- package/src/ui/g/FormBuilder/common/Builder/common/InputBuilder/InputBuilder.jsx +279 -0
- package/src/ui/g/FormBuilder/common/Builder/common/InputBuilder/index.js +2 -0
- package/src/ui/g/FormBuilder/common/Builder/common/InputBuilder/styles.scss +192 -0
- package/src/ui/g/FormBuilder/common/Builder/common/Section/Section.jsx +156 -0
- package/src/ui/g/FormBuilder/common/Builder/common/Section/index.js +2 -0
- package/src/ui/g/FormBuilder/common/Builder/common/index.js +2 -0
- package/src/ui/g/FormBuilder/common/Builder/index.js +2 -0
- package/src/ui/g/FormBuilder/common/Builder/styles.scss +106 -0
- package/src/ui/g/FormBuilder/common/Renderer/Renderer.jsx +145 -0
- package/src/ui/g/FormBuilder/common/Renderer/common/Section/Section.jsx +75 -0
- package/src/ui/g/FormBuilder/common/Renderer/common/Section/index.js +2 -0
- package/src/ui/g/FormBuilder/common/Renderer/common/index.js +1 -0
- package/src/ui/g/FormBuilder/common/Renderer/index.js +2 -0
- package/src/ui/g/FormBuilder/common/Renderer/styles.scss +15 -0
- package/src/ui/g/FormBuilder/common/index.js +2 -0
- package/src/ui/g/FormBuilder/index.js +2 -0
- package/src/ui/g/FormBuilder/styles.scss +7 -0
- package/src/ui/g/index.js +1 -0
- package/tests/__snapshots__/Storyshots.test.js.snap +793 -1
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/* @pareto-engineering/generator-front 1.1.1-alpha.2 */
|
|
2
|
+
import * as React from 'react'
|
|
3
|
+
|
|
4
|
+
import { useState } from 'react'
|
|
5
|
+
|
|
6
|
+
import { FormBuilder, Button } from 'ui'
|
|
7
|
+
|
|
8
|
+
export default {
|
|
9
|
+
title :'g/FormBuilder',
|
|
10
|
+
component :FormBuilder,
|
|
11
|
+
subcomponents:{
|
|
12
|
+
// Item:FormBuilder.Item
|
|
13
|
+
},
|
|
14
|
+
decorators:[
|
|
15
|
+
// storyfn => <div className="">{ storyfn() }</div>,
|
|
16
|
+
],
|
|
17
|
+
argTypes:{
|
|
18
|
+
backgroundColor:{ control: 'color' },
|
|
19
|
+
},
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const Builder = {
|
|
23
|
+
args:{
|
|
24
|
+
mode:'build',
|
|
25
|
+
},
|
|
26
|
+
render:(args) => {
|
|
27
|
+
const [values, setValues] = useState({})
|
|
28
|
+
|
|
29
|
+
const handleSampleSaveOnNext = (argsValues) => {
|
|
30
|
+
setValues(argsValues)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
<>
|
|
35
|
+
<FormBuilder {...args} onBuilderFormSave={handleSampleSaveOnNext} formBuilderId="some-sample-form-id" />
|
|
36
|
+
<Button form="some-sample-form-id" type="submit">
|
|
37
|
+
Sample Next Button in a Work flow
|
|
38
|
+
</Button>
|
|
39
|
+
<pre>{JSON.stringify(values, null, 2)}</pre>
|
|
40
|
+
</>
|
|
41
|
+
)
|
|
42
|
+
},
|
|
43
|
+
}
|
|
44
|
+
const sampleFormData = {
|
|
45
|
+
sections:[
|
|
46
|
+
{
|
|
47
|
+
title :'titlel',
|
|
48
|
+
description:'{"root":{"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"background-color: #a37575;","text":"asdvczvcsdvjksadvkl sdvasdvn mdvaskldvnsdavkjc,mndsvb asdvsdvsadv","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1}],"direction":"ltr","format":"","indent":0,"type":"root","version":1}}',
|
|
49
|
+
key :'section-title',
|
|
50
|
+
inputs :[
|
|
51
|
+
{
|
|
52
|
+
name :'section_0_input_0',
|
|
53
|
+
label :'Names',
|
|
54
|
+
type :'multiple',
|
|
55
|
+
required:false,
|
|
56
|
+
options :[
|
|
57
|
+
{
|
|
58
|
+
key :'sections-0-inputs-0-options--1',
|
|
59
|
+
value :'James',
|
|
60
|
+
label :'James',
|
|
61
|
+
nextSection:'',
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
key :'sections-0-inputs-0-options-0',
|
|
65
|
+
value :'Coigo',
|
|
66
|
+
label :'Coigo',
|
|
67
|
+
nextSection:'',
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
key :'sections-0-inputs-0-options-1',
|
|
71
|
+
value :'Nyanjui',
|
|
72
|
+
label :'Nyanjui',
|
|
73
|
+
nextSection:'',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
key :'sections-0-inputs-0-options-2',
|
|
77
|
+
value :'Masalia',
|
|
78
|
+
label :'Masalia',
|
|
79
|
+
nextSection:'',
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
conditionalLogic:null,
|
|
83
|
+
description :'',
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
navigation:{
|
|
87
|
+
nextSection:'next',
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
}
|
|
92
|
+
export const Renderer = {
|
|
93
|
+
args:{
|
|
94
|
+
mode :'render',
|
|
95
|
+
formData:sampleFormData,
|
|
96
|
+
},
|
|
97
|
+
}
|
|
@@ -23,6 +23,7 @@ const ToggleSwitch = ({
|
|
|
23
23
|
handleOnChange,
|
|
24
24
|
checked,
|
|
25
25
|
size,
|
|
26
|
+
inputId,
|
|
26
27
|
// ...otherProps
|
|
27
28
|
}) => (
|
|
28
29
|
<button
|
|
@@ -45,12 +46,12 @@ const ToggleSwitch = ({
|
|
|
45
46
|
>
|
|
46
47
|
<input
|
|
47
48
|
type="checkbox"
|
|
48
|
-
id=
|
|
49
|
+
id={inputId}
|
|
49
50
|
checked={checked}
|
|
50
51
|
onChange={handleOnChange}
|
|
51
52
|
/>
|
|
52
53
|
{/* eslint-disable-next-line jsx-a11y/label-has-associated-control */}
|
|
53
|
-
<label htmlFor=
|
|
54
|
+
<label htmlFor={inputId} />
|
|
54
55
|
</button>
|
|
55
56
|
)
|
|
56
57
|
|
|
@@ -84,10 +85,15 @@ ToggleSwitch.propTypes = {
|
|
|
84
85
|
* The size of this element
|
|
85
86
|
*/
|
|
86
87
|
size:PropTypes.string,
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* The ID of the elelment to be toggled
|
|
91
|
+
*/
|
|
92
|
+
inputId:PropTypes.string,
|
|
87
93
|
}
|
|
88
94
|
|
|
89
95
|
ToggleSwitch.defaultProps = {
|
|
90
|
-
|
|
96
|
+
inputId:'switch',
|
|
91
97
|
}
|
|
92
98
|
|
|
93
99
|
export default ToggleSwitch
|
|
@@ -51,6 +51,16 @@ const FormInput = ({
|
|
|
51
51
|
/>
|
|
52
52
|
)
|
|
53
53
|
}
|
|
54
|
+
if (type === 'multiple') {
|
|
55
|
+
return (
|
|
56
|
+
<ChoicesInput
|
|
57
|
+
className={newClassName}
|
|
58
|
+
disabled={disabled}
|
|
59
|
+
multiple
|
|
60
|
+
{...otherProps}
|
|
61
|
+
/>
|
|
62
|
+
)
|
|
63
|
+
}
|
|
54
64
|
if (type === 'choices') {
|
|
55
65
|
return (
|
|
56
66
|
<ChoicesInput
|
|
@@ -62,12 +62,13 @@ const EditorInput = ({
|
|
|
62
62
|
showDebugger,
|
|
63
63
|
stopPropagationKeys,
|
|
64
64
|
setEditorState,
|
|
65
|
+
// handleOnChange,
|
|
65
66
|
// ...otherProps
|
|
66
67
|
}) => {
|
|
67
|
-
const
|
|
68
|
+
const { values, setFieldValue } = useFormikContext()
|
|
68
69
|
|
|
69
70
|
const setInitialValue = () => {
|
|
70
|
-
const value =
|
|
71
|
+
const value = values[name]
|
|
71
72
|
|
|
72
73
|
try {
|
|
73
74
|
JSON.parse(value)
|
|
@@ -108,10 +109,7 @@ const EditorInput = ({
|
|
|
108
109
|
}
|
|
109
110
|
|
|
110
111
|
const onChange = (state) => {
|
|
111
|
-
|
|
112
|
-
...formik.values,
|
|
113
|
-
[name]:JSON.stringify(state),
|
|
114
|
-
})
|
|
112
|
+
setFieldValue(name, JSON.stringify(state))
|
|
115
113
|
}
|
|
116
114
|
|
|
117
115
|
const initialConfig = {
|
|
@@ -177,6 +175,7 @@ const EditorInput = ({
|
|
|
177
175
|
<ContentEditable
|
|
178
176
|
className="content-editable"
|
|
179
177
|
id={name}
|
|
178
|
+
name={name}
|
|
180
179
|
/>
|
|
181
180
|
)}
|
|
182
181
|
ErrorBoundary={LexicalErrorBoundary}
|
|
@@ -39,7 +39,7 @@ const SelectInput = ({
|
|
|
39
39
|
placeholder,
|
|
40
40
|
getTagColor,
|
|
41
41
|
multiple,
|
|
42
|
-
|
|
42
|
+
...otherProps
|
|
43
43
|
}) => {
|
|
44
44
|
const inputProps = {
|
|
45
45
|
name,
|
|
@@ -72,7 +72,10 @@ const SelectInput = ({
|
|
|
72
72
|
.join(' ')}
|
|
73
73
|
style={style}
|
|
74
74
|
>
|
|
75
|
-
<Input
|
|
75
|
+
<Input
|
|
76
|
+
{...inputProps}
|
|
77
|
+
{...otherProps}
|
|
78
|
+
/>
|
|
76
79
|
</div>
|
|
77
80
|
)
|
|
78
81
|
}
|
|
@@ -38,7 +38,7 @@ const Single = ({
|
|
|
38
38
|
disabled,
|
|
39
39
|
isLoading,
|
|
40
40
|
autoComplete,
|
|
41
|
-
|
|
41
|
+
...otherProps
|
|
42
42
|
}) => {
|
|
43
43
|
const [field, , helpers] = useField({ name, validate })
|
|
44
44
|
|
|
@@ -82,6 +82,7 @@ const Single = ({
|
|
|
82
82
|
id={name}
|
|
83
83
|
disabled={disabled}
|
|
84
84
|
autoComplete={autoComplete}
|
|
85
|
+
{...otherProps}
|
|
85
86
|
>
|
|
86
87
|
{
|
|
87
88
|
options.map((option) => {
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/* @pareto-engineering/generator-front 1.1.1-alpha.2 */
|
|
2
|
+
import * as React from 'react'
|
|
3
|
+
|
|
4
|
+
import PropTypes from 'prop-types'
|
|
5
|
+
|
|
6
|
+
import styleNames from '@pareto-engineering/bem/exports'
|
|
7
|
+
|
|
8
|
+
import './styles.scss'
|
|
9
|
+
|
|
10
|
+
// Local Definitions
|
|
11
|
+
|
|
12
|
+
import { Renderer, Builder } from './common'
|
|
13
|
+
|
|
14
|
+
const baseClassName = styleNames.base
|
|
15
|
+
|
|
16
|
+
const componentClassName = 'form-builder'
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* This is the component description.
|
|
20
|
+
*/
|
|
21
|
+
const FormBuilder = ({
|
|
22
|
+
id,
|
|
23
|
+
className:userClassName,
|
|
24
|
+
style,
|
|
25
|
+
mode,
|
|
26
|
+
formData,
|
|
27
|
+
formBuilderId,
|
|
28
|
+
onBuilderFormSave,
|
|
29
|
+
onRendererFormSave,
|
|
30
|
+
// ...otherProps
|
|
31
|
+
}) => (
|
|
32
|
+
<div
|
|
33
|
+
id={id}
|
|
34
|
+
className={[
|
|
35
|
+
|
|
36
|
+
baseClassName,
|
|
37
|
+
|
|
38
|
+
componentClassName,
|
|
39
|
+
userClassName,
|
|
40
|
+
]
|
|
41
|
+
.filter((e) => e)
|
|
42
|
+
.join(' ')}
|
|
43
|
+
style={style}
|
|
44
|
+
// {...otherProps}
|
|
45
|
+
>
|
|
46
|
+
{mode === 'build' && <Builder formBuilderId={formBuilderId} onSave={onBuilderFormSave} />}
|
|
47
|
+
{mode === 'render' && <Renderer formData={formData} onSave={onRendererFormSave} />}
|
|
48
|
+
</div>
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
FormBuilder.propTypes = {
|
|
52
|
+
/**
|
|
53
|
+
* The HTML id for this element
|
|
54
|
+
*/
|
|
55
|
+
id:PropTypes.string,
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* The HTML class names for this element
|
|
59
|
+
*/
|
|
60
|
+
className:PropTypes.string,
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* The React-written, css properties for this element.
|
|
64
|
+
*/
|
|
65
|
+
style:PropTypes.objectOf(PropTypes.string),
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* The mode of the form builder to determine whether to render a form or build a form
|
|
69
|
+
*/
|
|
70
|
+
mode:PropTypes.oneOf(['build', 'render']),
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* This is the ID of the form element in the <Builder /> component
|
|
74
|
+
*/
|
|
75
|
+
formBuilderId:PropTypes.string.isRequired,
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
FormBuilder.defaultProps = {
|
|
79
|
+
mode:'build',
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
FormBuilder.Builder = Builder
|
|
83
|
+
FormBuilder.Renderer = Renderer
|
|
84
|
+
|
|
85
|
+
export default FormBuilder
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/* @pareto-engineering/generator-front 1.1.1-alpha.2 */
|
|
2
|
+
import * as React from 'react'
|
|
3
|
+
|
|
4
|
+
import { Formik, Form, FieldArray } from 'formik'
|
|
5
|
+
|
|
6
|
+
import PropTypes from 'prop-types'
|
|
7
|
+
|
|
8
|
+
import styleNames from '@pareto-engineering/bem/exports'
|
|
9
|
+
|
|
10
|
+
import { SelectInput } from 'ui/f'
|
|
11
|
+
|
|
12
|
+
import { Section } from './common'
|
|
13
|
+
|
|
14
|
+
import './styles.scss'
|
|
15
|
+
|
|
16
|
+
// Local Definitions
|
|
17
|
+
|
|
18
|
+
const baseClassName = styleNames.base
|
|
19
|
+
|
|
20
|
+
const componentClassName = 'builder'
|
|
21
|
+
|
|
22
|
+
const reorderInputs = (values) => {
|
|
23
|
+
const valuesCopy = JSON.parse(JSON.stringify(values))
|
|
24
|
+
|
|
25
|
+
valuesCopy.sections.forEach((section) => {
|
|
26
|
+
const orderMap = new Map()
|
|
27
|
+
section.orderedInputDragIds.forEach((id, index) => orderMap.set(id, index))
|
|
28
|
+
section.inputs.sort((a, b) => orderMap.get(a.name) - orderMap.get(b.name))
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
return valuesCopy
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
*/
|
|
36
|
+
const Builder = ({
|
|
37
|
+
id,
|
|
38
|
+
className:userClassName,
|
|
39
|
+
style,
|
|
40
|
+
onSave,
|
|
41
|
+
formBuilderId,
|
|
42
|
+
// ...otherProps
|
|
43
|
+
}) => {
|
|
44
|
+
const handleSubmit = (values) => {
|
|
45
|
+
const reOrderedValues = reorderInputs(values)
|
|
46
|
+
onSave(reOrderedValues)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<div
|
|
51
|
+
id={id}
|
|
52
|
+
className={[
|
|
53
|
+
baseClassName,
|
|
54
|
+
componentClassName,
|
|
55
|
+
userClassName,
|
|
56
|
+
]
|
|
57
|
+
.filter((e) => e)
|
|
58
|
+
.join(' ')}
|
|
59
|
+
style={style}
|
|
60
|
+
>
|
|
61
|
+
|
|
62
|
+
<p className="h3">Form Builder</p>
|
|
63
|
+
<Formik
|
|
64
|
+
initialValues={{
|
|
65
|
+
sections:[
|
|
66
|
+
{
|
|
67
|
+
title :'',
|
|
68
|
+
description :'',
|
|
69
|
+
key :'section-0',
|
|
70
|
+
inputs :[],
|
|
71
|
+
orderedInputDragIds:[],
|
|
72
|
+
navigation :{ nextSection: 'next' },
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
}}
|
|
76
|
+
onSubmit={handleSubmit}
|
|
77
|
+
>
|
|
78
|
+
{({ values }) => {
|
|
79
|
+
const availableSections = values.sections.map((section, idx) => ({
|
|
80
|
+
value:idx,
|
|
81
|
+
label:`Go to ${section.title || `Untitled Section ${idx + 1}`}`,
|
|
82
|
+
}))
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
<Form id={formBuilderId}>
|
|
86
|
+
<FieldArray name="sections">
|
|
87
|
+
{({ push }) => (
|
|
88
|
+
<>
|
|
89
|
+
{values.sections.map((section, index) => (
|
|
90
|
+
<Section key={section.key} index={index} />
|
|
91
|
+
))}
|
|
92
|
+
<div className="section-footer">
|
|
93
|
+
<button
|
|
94
|
+
className="add-section-cta"
|
|
95
|
+
type="button"
|
|
96
|
+
onClick={() => {
|
|
97
|
+
const currentIndex = values.sections.length
|
|
98
|
+
|
|
99
|
+
return push({
|
|
100
|
+
title :'',
|
|
101
|
+
description:'',
|
|
102
|
+
key :`section-${currentIndex}`,
|
|
103
|
+
inputs :[
|
|
104
|
+
{
|
|
105
|
+
type :'text',
|
|
106
|
+
options :[],
|
|
107
|
+
required :true,
|
|
108
|
+
description:'',
|
|
109
|
+
name :`section_${values.sections.length}_input_0`,
|
|
110
|
+
label :'',
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
orderedInputDragIds:[],
|
|
114
|
+
navigation :{ nextSection: 'next' },
|
|
115
|
+
})
|
|
116
|
+
}}
|
|
117
|
+
>
|
|
118
|
+
<div className="icon-container">
|
|
119
|
+
<span className="icon">
|
|
120
|
+
+
|
|
121
|
+
</span>
|
|
122
|
+
</div>
|
|
123
|
+
<span className="text x-paragraph c-x">Add Section</span>
|
|
124
|
+
</button>
|
|
125
|
+
<div className="section-navigation">
|
|
126
|
+
<span className="x-paragraph c-x">
|
|
127
|
+
After Section
|
|
128
|
+
{' '}
|
|
129
|
+
{values.sections.length}
|
|
130
|
+
</span>
|
|
131
|
+
<SelectInput
|
|
132
|
+
name={`sections.${values.sections.length - 1}.navigation.nextSection`}
|
|
133
|
+
options={[
|
|
134
|
+
{ label: 'Select section', value: '', disabled: true },
|
|
135
|
+
{ label: 'Continue to next section', value: 'next' },
|
|
136
|
+
...availableSections,
|
|
137
|
+
{ label: 'Submit form', value: 'submit' },
|
|
138
|
+
]}
|
|
139
|
+
/>
|
|
140
|
+
</div>
|
|
141
|
+
</div>
|
|
142
|
+
</>
|
|
143
|
+
)}
|
|
144
|
+
</FieldArray>
|
|
145
|
+
|
|
146
|
+
</Form>
|
|
147
|
+
)
|
|
148
|
+
}}
|
|
149
|
+
</Formik>
|
|
150
|
+
</div>
|
|
151
|
+
)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
Builder.propTypes = {
|
|
155
|
+
/**
|
|
156
|
+
* The HTML id for this element
|
|
157
|
+
*/
|
|
158
|
+
id:PropTypes.string,
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* The HTML class names for this element
|
|
162
|
+
*/
|
|
163
|
+
className:PropTypes.string,
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* The React-written, css properties for this element.
|
|
167
|
+
*/
|
|
168
|
+
style:PropTypes.objectOf(PropTypes.string),
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
Builder.defaultProps = {
|
|
172
|
+
// someProp:false
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export default Builder
|