Skip to content

Commit 437cadc

Browse files
committed
fix: form render mutating formData
1 parent 0012dc3 commit 437cadc

File tree

4 files changed

+41
-34
lines changed

4 files changed

+41
-34
lines changed

src/lib/js/components/component.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@ import { get, set } from '../common/utils/object.mjs'
2020
import { toTitleCase } from '../common/utils/string.mjs'
2121

2222
export default class Component extends Data {
23-
constructor(name, data = {}, render) {
24-
super(name, { ...data, id: data.id || uuid() })
25-
this.id = this.data.id
23+
constructor(name, dataArg = {}, render) {
24+
const data = { ...dataArg, id: dataArg.id || uuid() }
25+
super(name, data)
26+
this.id = data.id
2627
this.name = name
2728
this.config = Components[`${this.name}s`].config
2829
merge(this.config, data.config)
@@ -96,8 +97,9 @@ export default class Component extends Data {
9697
* @return {Object} parent element
9798
*/
9899
empty() {
99-
const removed = this.children.map(child => child.remove())
100-
this.data.children = this.data.children.filter(childId => removed.indexOf(childId) === -1)
100+
const removed = this.children.map(child => {
101+
child.remove()
102+
})
101103
this.dom.classList.add('empty')
102104
return removed
103105
}

src/lib/js/components/data.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ export default class Data {
8484
const parent = this.get(delPath)
8585
if (Array.isArray(parent)) {
8686
parent.splice(Number(delItem), 1)
87-
} else {
87+
} else if (parent) {
8888
delete parent[delItem]
8989
}
9090
return parent

src/lib/js/components/index.js

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import Data from './data.js'
2-
import { uuid, sessionStorage, isAddress } from '../common/utils/index.mjs'
2+
import { uuid, sessionStorage, isAddress, parseData, clone } from '../common/utils/index.mjs'
33
import ControlsData from './controls/index.js'
44

55
import StagesData from './stages/index.js'
@@ -16,15 +16,28 @@ export const Fields = FieldsData
1616
export const Controls = ControlsData
1717
export const Externals = ExternalsData
1818

19-
const DEFAULT_DATA = {
19+
const defaultFormData = () => ({
2020
id: uuid(),
21+
stages: { [uuid()]: {} },
22+
rows: {},
23+
columns: {},
24+
fields: {},
25+
})
26+
27+
const getFormData = (formData, useSessionStorage = false) => {
28+
if (formData) {
29+
return clone(parseData(formData))
30+
}
31+
if (useSessionStorage) {
32+
return sessionStorage.get(SESSION_FORMDATA_KEY) || defaultFormData()
33+
}
34+
35+
return defaultFormData()
2136
}
2237

2338
export class Components extends Data {
24-
constructor(opts) {
39+
constructor() {
2540
super('components')
26-
this.opts = opts
27-
this.data = DEFAULT_DATA
2841
this.disableEvents = true
2942
this.stages = Stages
3043
this.rows = Rows
@@ -34,26 +47,18 @@ export class Components extends Data {
3447
this.externals = Externals
3548
}
3649

37-
sessionFormData = () => {
38-
if (this.opts?.sessionStorage) {
39-
return sessionStorage.get(SESSION_FORMDATA_KEY)
40-
}
41-
}
42-
43-
load = (formDataArg, opts = this.opts || Object.create(null)) => {
44-
let formData = formDataArg
50+
load = (formDataArg, opts) => {
4551
this.empty()
46-
if (typeof formDataArg === 'string') {
47-
formData = JSON.parse(formDataArg)
48-
}
52+
const formData = getFormData(formDataArg, opts.sessionStorage)
53+
4954
this.opts = opts
50-
const { stages = { [uuid()]: {} }, rows, columns, fields, id = uuid() } = { ...this.sessionFormData(), ...formData }
51-
this.set('id', id)
52-
this.add('stages', Stages.load(stages))
53-
this.add('rows', Rows.load(rows))
54-
this.add('columns', Columns.load(columns))
55-
this.add('fields', Fields.load(fields))
56-
this.add('externals', Externals.load(opts.external))
55+
56+
this.set('id', formData.id)
57+
this.add('stages', Stages.load(formData.stages))
58+
this.add('rows', Rows.load(formData.rows))
59+
this.add('columns', Columns.load(formData.columns))
60+
this.add('fields', Fields.load(formData.fields))
61+
this.add('externals', Externals.load(this.opts.external))
5762

5863
for (const stage of Object.values(this.get('stages'))) {
5964
stage.loadChildren()

src/lib/js/renderer.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
import isEqual from 'lodash/isEqual'
22
import dom from './common/dom'
3-
import { uuid, isAddress, isExternalAddress, merge } from './common/utils'
3+
import { uuid, isAddress, isExternalAddress, merge, parseData, clone } from './common/utils/index.mjs'
44
import { STAGE_CLASSNAME, UUID_REGEXP } from './constants'
55
import { fetchDependencies } from './common/loaders'
6-
import { parseData } from './common/utils/index.mjs'
76

87
const RENDER_PREFIX = 'f-'
98

9+
const cleanFormData = formData => (formData ? clone(parseData(formData)) : {})
1010
const containerLookup = container => (typeof container === 'string' ? document.querySelector(container) : container)
1111
const processOptions = ({ editorContainer, renderContainer, formData, ...opts }) => {
1212
const processedOptions = {
1313
renderContainer: containerLookup(renderContainer),
1414
editorContainer: containerLookup(editorContainer),
15-
formData: parseData(formData) || {},
15+
formData: cleanFormData(formData),
1616
}
1717

1818
return { elements: {}, ...opts, ...processedOptions }
@@ -42,7 +42,7 @@ export default class FormeoRenderer {
4242
constructor(opts, formDataArg) {
4343
const { renderContainer, external, elements, formData } = processOptions(opts)
4444
this.container = renderContainer
45-
this.form = parseData(formDataArg || formData)
45+
this.form = cleanFormData(formDataArg || formData)
4646
this.external = external
4747
this.dom = dom
4848
this.components = Object.create(null)
@@ -54,7 +54,7 @@ export default class FormeoRenderer {
5454
* @param {Object} formData
5555
*/
5656
render = (formData = this.form) => {
57-
this.form = parseData(formData)
57+
this.form = cleanFormData(formData)
5858

5959
const renderCount = document.getElementsByClassName('formeo-render').length
6060
const config = {

0 commit comments

Comments
 (0)