@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.
Files changed (79) hide show
  1. package/dist/cjs/a/ToggleSwitch/ToggleSwitch.js +10 -5
  2. package/dist/cjs/f/FormInput/FormInput.js +7 -0
  3. package/dist/cjs/f/fields/EditorInput/EditorInput.js +9 -7
  4. package/dist/cjs/f/fields/SelectInput/SelectInput.js +4 -5
  5. package/dist/cjs/f/fields/SelectInput/common/Single/Single.js +3 -3
  6. package/dist/cjs/g/FormBuilder/FormBuilder.js +77 -0
  7. package/dist/cjs/g/FormBuilder/common/Builder/Builder.js +156 -0
  8. package/dist/cjs/g/FormBuilder/common/Builder/common/InputBuilder/InputBuilder.js +229 -0
  9. package/dist/cjs/g/FormBuilder/common/Builder/common/InputBuilder/index.js +13 -0
  10. package/dist/cjs/g/FormBuilder/common/Builder/common/InputBuilder/styles.scss +192 -0
  11. package/dist/cjs/g/FormBuilder/common/Builder/common/Section/Section.js +133 -0
  12. package/dist/cjs/g/FormBuilder/common/Builder/common/Section/index.js +13 -0
  13. package/dist/cjs/g/FormBuilder/common/Builder/common/index.js +19 -0
  14. package/dist/cjs/g/FormBuilder/common/Builder/index.js +13 -0
  15. package/dist/cjs/g/FormBuilder/common/Builder/styles.scss +106 -0
  16. package/dist/cjs/g/FormBuilder/common/Renderer/Renderer.js +119 -0
  17. package/dist/cjs/g/FormBuilder/common/Renderer/common/Section/Section.js +60 -0
  18. package/dist/cjs/g/FormBuilder/common/Renderer/common/Section/index.js +13 -0
  19. package/dist/cjs/g/FormBuilder/common/Renderer/common/index.js +12 -0
  20. package/dist/cjs/g/FormBuilder/common/Renderer/index.js +13 -0
  21. package/dist/cjs/g/FormBuilder/common/Renderer/styles.scss +15 -0
  22. package/dist/cjs/g/FormBuilder/common/index.js +19 -0
  23. package/dist/cjs/g/FormBuilder/index.js +13 -0
  24. package/dist/cjs/g/FormBuilder/styles.scss +7 -0
  25. package/dist/cjs/g/index.js +8 -1
  26. package/dist/es/a/ToggleSwitch/ToggleSwitch.js +10 -5
  27. package/dist/es/f/FormInput/FormInput.js +7 -0
  28. package/dist/es/f/fields/EditorInput/EditorInput.js +9 -7
  29. package/dist/es/f/fields/SelectInput/SelectInput.js +4 -3
  30. package/dist/es/f/fields/SelectInput/common/Single/Single.js +3 -3
  31. package/dist/es/g/FormBuilder/FormBuilder.js +65 -0
  32. package/dist/es/g/FormBuilder/common/Builder/Builder.js +142 -0
  33. package/dist/es/g/FormBuilder/common/Builder/common/InputBuilder/InputBuilder.js +216 -0
  34. package/dist/es/g/FormBuilder/common/Builder/common/InputBuilder/index.js +2 -0
  35. package/dist/es/g/FormBuilder/common/Builder/common/InputBuilder/styles.scss +192 -0
  36. package/dist/es/g/FormBuilder/common/Builder/common/Section/Section.js +120 -0
  37. package/dist/es/g/FormBuilder/common/Builder/common/Section/index.js +2 -0
  38. package/dist/es/g/FormBuilder/common/Builder/common/index.js +2 -0
  39. package/dist/es/g/FormBuilder/common/Builder/index.js +2 -0
  40. package/dist/es/g/FormBuilder/common/Builder/styles.scss +106 -0
  41. package/dist/es/g/FormBuilder/common/Renderer/Renderer.js +113 -0
  42. package/dist/es/g/FormBuilder/common/Renderer/common/Section/Section.js +52 -0
  43. package/dist/es/g/FormBuilder/common/Renderer/common/Section/index.js +2 -0
  44. package/dist/es/g/FormBuilder/common/Renderer/common/index.js +1 -0
  45. package/dist/es/g/FormBuilder/common/Renderer/index.js +2 -0
  46. package/dist/es/g/FormBuilder/common/Renderer/styles.scss +15 -0
  47. package/dist/es/g/FormBuilder/common/index.js +2 -0
  48. package/dist/es/g/FormBuilder/index.js +2 -0
  49. package/dist/es/g/FormBuilder/styles.scss +7 -0
  50. package/dist/es/g/index.js +2 -1
  51. package/package.json +3 -3
  52. package/src/stories/a/ToggleSwitch.stories.jsx +8 -2
  53. package/src/stories/g/FormBuilder.stories.jsx +97 -0
  54. package/src/ui/a/ToggleSwitch/ToggleSwitch.jsx +9 -3
  55. package/src/ui/f/FormInput/FormInput.jsx +10 -0
  56. package/src/ui/f/fields/EditorInput/EditorInput.jsx +5 -6
  57. package/src/ui/f/fields/SelectInput/SelectInput.jsx +5 -2
  58. package/src/ui/f/fields/SelectInput/common/Single/Single.jsx +2 -1
  59. package/src/ui/g/FormBuilder/FormBuilder.jsx +85 -0
  60. package/src/ui/g/FormBuilder/common/Builder/Builder.jsx +175 -0
  61. package/src/ui/g/FormBuilder/common/Builder/common/InputBuilder/InputBuilder.jsx +279 -0
  62. package/src/ui/g/FormBuilder/common/Builder/common/InputBuilder/index.js +2 -0
  63. package/src/ui/g/FormBuilder/common/Builder/common/InputBuilder/styles.scss +192 -0
  64. package/src/ui/g/FormBuilder/common/Builder/common/Section/Section.jsx +156 -0
  65. package/src/ui/g/FormBuilder/common/Builder/common/Section/index.js +2 -0
  66. package/src/ui/g/FormBuilder/common/Builder/common/index.js +2 -0
  67. package/src/ui/g/FormBuilder/common/Builder/index.js +2 -0
  68. package/src/ui/g/FormBuilder/common/Builder/styles.scss +106 -0
  69. package/src/ui/g/FormBuilder/common/Renderer/Renderer.jsx +145 -0
  70. package/src/ui/g/FormBuilder/common/Renderer/common/Section/Section.jsx +75 -0
  71. package/src/ui/g/FormBuilder/common/Renderer/common/Section/index.js +2 -0
  72. package/src/ui/g/FormBuilder/common/Renderer/common/index.js +1 -0
  73. package/src/ui/g/FormBuilder/common/Renderer/index.js +2 -0
  74. package/src/ui/g/FormBuilder/common/Renderer/styles.scss +15 -0
  75. package/src/ui/g/FormBuilder/common/index.js +2 -0
  76. package/src/ui/g/FormBuilder/index.js +2 -0
  77. package/src/ui/g/FormBuilder/styles.scss +7 -0
  78. package/src/ui/g/index.js +1 -0
  79. 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="switch"
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="switch" />
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
- // someProp:false,
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 formik = useFormikContext()
68
+ const { values, setFieldValue } = useFormikContext()
68
69
 
69
70
  const setInitialValue = () => {
70
- const value = formik.values[name]
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
- formik.setValues({
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
- // ...otherProps
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 {...inputProps} />
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
- // ...otherProps
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