@worksafevictoria/wcl7.5 1.1.11 → 1.1.12
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/jest.config.js +9 -7
- package/package.json +6 -5
- package/src/components/Paragraphs/Directory/Records/CJ/index.vue +3 -3
- package/src/components/Paragraphs/Directory/Records/ISP/index.vue +3 -3
- package/src/components/Paragraphs/Directory/Records/PRS/index.vue +2 -2
- package/src/components/Paragraphs/Directory/Records/PRS/recordContent.vue +3 -3
- package/src/components/Paragraphs/Directory/Records/PRS/recordDetails.vue +3 -3
- package/src/components/Paragraphs/Directory/Records/index.vue +3 -3
- package/src/components/Paragraphs/Directory/index.vue +4 -4
- package/src/components/Paragraphs/Webform/index.stories.js +30 -29
- package/src/components/Paragraphs/Webform/index.vue +10 -7
- package/src/components/SubComponents/FormInstance/components/alert/index.vue +129 -0
- package/src/components/SubComponents/FormInstance/components/custom/base-formio.js +77 -0
- package/src/components/SubComponents/FormInstance/components/custom/code-formio.js +35 -0
- package/src/components/SubComponents/FormInstance/components/custom/custom-formio-registry.js +30 -0
- package/src/components/SubComponents/FormInstance/components/custom/range-formio.js +121 -0
- package/src/components/SubComponents/FormInstance/components/custom/rating-formio.js +121 -0
- package/src/components/SubComponents/FormInstance/components/custom/scale-formio.js +99 -0
- package/src/components/SubComponents/FormInstance/components/custom/tableselect-formio.js +200 -0
- package/src/components/SubComponents/FormInstance/components/handler/index.vue +208 -0
- package/src/components/SubComponents/FormInstance/components/renderer/index.vue +282 -0
- package/src/components/SubComponents/FormInstance/index.test.js +65 -0
- package/src/components/SubComponents/FormInstance/index.vue +55 -6
- package/src/components/SubComponents/FormInstance/models/base-form-element.js +338 -0
- package/src/components/SubComponents/FormInstance/models/form-callback-queue.js +45 -0
- package/src/components/SubComponents/FormInstance/models/form-utils.js +50 -0
- package/src/components/SubComponents/FormInstance/models/overrides/address.js +132 -0
- package/src/components/SubComponents/FormInstance/models/overrides/autocomplete.js +41 -0
- package/src/components/SubComponents/FormInstance/models/overrides/checkbox.js +14 -0
- package/src/components/SubComponents/FormInstance/models/overrides/checkboxes.js +49 -0
- package/src/components/SubComponents/FormInstance/models/overrides/code.js +27 -0
- package/src/components/SubComponents/FormInstance/models/overrides/composite.js +57 -0
- package/src/components/SubComponents/FormInstance/models/overrides/container.js +65 -0
- package/src/components/SubComponents/FormInstance/models/overrides/currency.js +17 -0
- package/src/components/SubComponents/FormInstance/models/overrides/customcomposite.js +41 -0
- package/src/components/SubComponents/FormInstance/models/overrides/date.js +126 -0
- package/src/components/SubComponents/FormInstance/models/overrides/datelist.js +73 -0
- package/src/components/SubComponents/FormInstance/models/overrides/detail.js +38 -0
- package/src/components/SubComponents/FormInstance/models/overrides/email-confirm.js +12 -0
- package/src/components/SubComponents/FormInstance/models/overrides/email.js +7 -0
- package/src/components/SubComponents/FormInstance/models/overrides/file.js +56 -0
- package/src/components/SubComponents/FormInstance/models/overrides/flexbox.js +33 -0
- package/src/components/SubComponents/FormInstance/models/overrides/hidden.js +24 -0
- package/src/components/SubComponents/FormInstance/models/overrides/likert.js +40 -0
- package/src/components/SubComponents/FormInstance/models/overrides/markup.js +47 -0
- package/src/components/SubComponents/FormInstance/models/overrides/message.js +53 -0
- package/src/components/SubComponents/FormInstance/models/overrides/moretext.js +64 -0
- package/src/components/SubComponents/FormInstance/models/overrides/multiple.js +51 -0
- package/src/components/SubComponents/FormInstance/models/overrides/number.js +22 -0
- package/src/components/SubComponents/FormInstance/models/overrides/options-other.js +34 -0
- package/src/components/SubComponents/FormInstance/models/overrides/page.js +7 -0
- package/src/components/SubComponents/FormInstance/models/overrides/phonenumber.js +13 -0
- package/src/components/SubComponents/FormInstance/models/overrides/radio.js +31 -0
- package/src/components/SubComponents/FormInstance/models/overrides/range.js +19 -0
- package/src/components/SubComponents/FormInstance/models/overrides/rating.js +47 -0
- package/src/components/SubComponents/FormInstance/models/overrides/scale.js +33 -0
- package/src/components/SubComponents/FormInstance/models/overrides/section.js +39 -0
- package/src/components/SubComponents/FormInstance/models/overrides/select.js +28 -0
- package/src/components/SubComponents/FormInstance/models/overrides/signature.js +7 -0
- package/src/components/SubComponents/FormInstance/models/overrides/submit.js +23 -0
- package/src/components/SubComponents/FormInstance/models/overrides/table.js +48 -0
- package/src/components/SubComponents/FormInstance/models/overrides/tablerow.js +20 -0
- package/src/components/SubComponents/FormInstance/models/overrides/tableselect.js +66 -0
- package/src/components/SubComponents/FormInstance/models/overrides/testing.js +47 -0
- package/src/components/SubComponents/FormInstance/models/overrides/text.js +7 -0
- package/src/components/SubComponents/FormInstance/models/overrides/textarea.js +26 -0
- package/src/components/SubComponents/FormInstance/models/overrides/textformat.js +13 -0
- package/src/components/SubComponents/FormInstance/models/overrides/time.js +13 -0
- package/src/components/SubComponents/FormInstance/models/overrides/twig.js +118 -0
- package/src/components/SubComponents/FormInstance/models/overrides/unknown.js +24 -0
- package/src/components/SubComponents/FormInstance/models/overrides/url.js +13 -0
- package/src/components/SubComponents/FormInstance/services/convert-form-element.js +49 -0
- package/src/components/SubComponents/FormInstance/services/form-api.js +47 -0
- package/src/components/SubComponents/FormInstance/services/form-render-parser.js +156 -0
- package/src/components/SubComponents/FormInstance/services/form-submit-parser.js +61 -0
- package/src/components/SubComponents/FormInstance/services/logic-linker.js +73 -0
- package/src/components/SubComponents/FormInstance/services/logic-parser.js +173 -0
- package/src/components/SubComponents/FormInstance/services/registry-factory.js +284 -0
- package/src/components/SubComponents/FormInstance/stories/Documentation.mdx +234 -0
- package/src/components/SubComponents/FormInstance/stories/advanced.stories.js +109 -0
- package/src/components/SubComponents/FormInstance/stories/basic.stories.js +73 -0
- package/src/components/SubComponents/FormInstance/stories/build.stories.js +27 -0
- package/src/components/SubComponents/FormInstance/stories/composite.stories.js +90 -0
- package/src/components/SubComponents/FormInstance/stories/condition.stories.js +83 -0
- package/src/components/SubComponents/FormInstance/stories/custom.stories.js +69 -0
- package/src/components/SubComponents/FormInstance/stories/date.stories.js +76 -0
- package/src/components/SubComponents/FormInstance/stories/form-alert.stories.js +93 -0
- package/src/components/SubComponents/FormInstance/stories/index.stories.js +63 -0
- package/src/components/SubComponents/FormInstance/stories/layout.stories.js +85 -0
- package/src/components/SubComponents/FormInstance/stories/markup.stories.js +91 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/address.json +298 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/advancedhtml.json +23 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/autocomplete.json +34 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/basichtml.json +15 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/checkboxes.json +102 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/checkboxesother.json +197 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/container.json +134 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/customcomposite.json +469 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/date.json +19 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/datelist.json +752 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/datetime.json +89 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/details.json +63 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/email.json +18 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/emailconfirm.json +110 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/fieldset.json +62 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/flexbox.json +58 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/hidden.json +35 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/horizontalrule.json +14 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/jahd.json +1359 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/label.json +14 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/likert.json +375 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/message.json +86 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/more.json +19 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/multiple.json +142 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/number.json +35 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/quad.json +249 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/radios.json +70 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/radiosother.json +176 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/range.json +58 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/rating.json +42 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/rule-disabled-value.json +66 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/rule-enabled-value.json +43 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/rule-hidden-value.json +68 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/rule-required-value.json +69 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/rule-visible-value.json +157 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/sameas.json +66 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/scale.json +200 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/section.json +63 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/select.json +41 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/selectother.json +115 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/signature.json +25 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/styles.json +81 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/table-select.json +472 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/table.json +154 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/telephone.json +18 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/textarea.json +22 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/textfield.json +66 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/time.json +20 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/token.json +260 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/twig.json +154 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/url.json +18 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/value.json +17 -0
- package/src/components/SubComponents/FormInstance/stories/mocks/wizard.json +353 -0
- package/src/components/SubComponents/FormInstance/stories/options.stories.js +98 -0
- package/src/components/SubComponents/FormInstance/stories/style.stories.js +55 -0
- package/src/components/SubComponents/FormInstance/stories/wizard.stories.js +55 -0
- package/src/components/SubComponents/FormInstance/style.scss +173 -0
- package/src/components/SubComponents/FormInstance/tests/address.test.js +255 -0
- package/src/components/SubComponents/FormInstance/tests/advancedhtml.test.js +31 -0
- package/src/components/SubComponents/FormInstance/tests/autocomplete.test.js +38 -0
- package/src/components/SubComponents/FormInstance/tests/basichtml.test.js +31 -0
- package/src/components/SubComponents/FormInstance/tests/checkbox.test.js +29 -0
- package/src/components/SubComponents/FormInstance/tests/checkboxes.test.js +44 -0
- package/src/components/SubComponents/FormInstance/tests/checkboxesother.test.js +91 -0
- package/src/components/SubComponents/FormInstance/tests/container.test.js +66 -0
- package/src/components/SubComponents/FormInstance/tests/customcomposite.test.js +86 -0
- package/src/components/SubComponents/FormInstance/tests/date.test.js +63 -0
- package/src/components/SubComponents/FormInstance/tests/datelist.test.js +136 -0
- package/src/components/SubComponents/FormInstance/tests/datetime.test.js +54 -0
- package/src/components/SubComponents/FormInstance/tests/details.test.js +58 -0
- package/src/components/SubComponents/FormInstance/tests/email.test.js +28 -0
- package/src/components/SubComponents/FormInstance/tests/emailconfirm.test.js +79 -0
- package/src/components/SubComponents/FormInstance/tests/fieldset.test.js +63 -0
- package/src/components/SubComponents/FormInstance/tests/flexbox.test.js +71 -0
- package/src/components/SubComponents/FormInstance/tests/form-test-utils.js +120 -0
- package/src/components/SubComponents/FormInstance/tests/form.test.js +26 -0
- package/src/components/SubComponents/FormInstance/tests/hidden.test.js +52 -0
- package/src/components/SubComponents/FormInstance/tests/horizontalrule.test.js +31 -0
- package/src/components/SubComponents/FormInstance/tests/label.test.js +31 -0
- package/src/components/SubComponents/FormInstance/tests/likert.test.js +38 -0
- package/src/components/SubComponents/FormInstance/tests/message.test.js +89 -0
- package/src/components/SubComponents/FormInstance/tests/more.test.js +32 -0
- package/src/components/SubComponents/FormInstance/tests/multiple.test.js +71 -0
- package/src/components/SubComponents/FormInstance/tests/number.test.js +51 -0
- package/src/components/SubComponents/FormInstance/tests/radios.test.js +34 -0
- package/src/components/SubComponents/FormInstance/tests/radiosother.test.js +79 -0
- package/src/components/SubComponents/FormInstance/tests/range.test.js +32 -0
- package/src/components/SubComponents/FormInstance/tests/rating.test.js +38 -0
- package/src/components/SubComponents/FormInstance/tests/rule-disabled.test.js +128 -0
- package/src/components/SubComponents/FormInstance/tests/rule-enabled-value.test.js +78 -0
- package/src/components/SubComponents/FormInstance/tests/rule-hidden.test.js +131 -0
- package/src/components/SubComponents/FormInstance/tests/rule-required-value.test.js +144 -0
- package/src/components/SubComponents/FormInstance/tests/rule-visible.test.js +619 -0
- package/src/components/SubComponents/FormInstance/tests/sameas.test.js +94 -0
- package/src/components/SubComponents/FormInstance/tests/scale.test.js +43 -0
- package/src/components/SubComponents/FormInstance/tests/section.test.js +63 -0
- package/src/components/SubComponents/FormInstance/tests/select.test.js +45 -0
- package/src/components/SubComponents/FormInstance/tests/selectother.test.js +82 -0
- package/src/components/SubComponents/FormInstance/tests/signature.test.js +32 -0
- package/src/components/SubComponents/FormInstance/tests/styles.test.js +73 -0
- package/src/components/SubComponents/FormInstance/tests/table-select.test.js +93 -0
- package/src/components/SubComponents/FormInstance/tests/table.test.js +97 -0
- package/src/components/SubComponents/FormInstance/tests/telephone.test.js +29 -0
- package/src/components/SubComponents/FormInstance/tests/textarea.test.js +29 -0
- package/src/components/SubComponents/FormInstance/tests/textfield.test.js +48 -0
- package/src/components/SubComponents/FormInstance/tests/time.test.js +29 -0
- package/src/components/SubComponents/FormInstance/tests/token.test.js +33 -0
- package/src/components/SubComponents/FormInstance/tests/twig.test.js +74 -0
- package/src/components/SubComponents/FormInstance/tests/url.test.js +45 -0
- package/src/components/SubComponents/FormInstance/tests/value.test.js +31 -0
- package/src/components/SubComponents/FormInstance/tests/wizard.test.js +145 -0
- package/src/mock/jest.fileMock.js +1 -0
- package/src/components/SubComponents/FormInstance/index.stories.js +0 -8
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { BaseFormElement } from '../base-form-element'
|
|
2
|
+
import { htmlDecode } from '../form-utils'
|
|
3
|
+
|
|
4
|
+
export class TextAreaFormElement extends BaseFormElement {
|
|
5
|
+
getType() {
|
|
6
|
+
return 'textarea'
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
getCustomProperties() {
|
|
10
|
+
if (this.webformElement['#type'] === 'value') {
|
|
11
|
+
let defaultValue
|
|
12
|
+
if (!this.isEmpty(this.webformElement['#value'])) {
|
|
13
|
+
defaultValue = htmlDecode(this.webformElement['#value'])
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
editor: 'quill',
|
|
17
|
+
isUploadEnabled: false,
|
|
18
|
+
defaultValue
|
|
19
|
+
}
|
|
20
|
+
} else {
|
|
21
|
+
return {
|
|
22
|
+
autoExpand: true
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { BaseFormElement } from '../base-form-element'
|
|
2
|
+
import { generateUniqueId, htmlDecode } from '../form-utils'
|
|
3
|
+
|
|
4
|
+
export class TwigFormElement extends BaseFormElement {
|
|
5
|
+
getContent() {
|
|
6
|
+
let content = ''
|
|
7
|
+
const id = generateUniqueId('xxxxx')
|
|
8
|
+
const shouldHideLabel = this.shouldHideLabel()
|
|
9
|
+
if (!shouldHideLabel) {
|
|
10
|
+
content += `<label for="${id}" class="col-form-label">${this.getLabel()}</label>`
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const tpl = this.showTokens()
|
|
14
|
+
? this.getTokenContent()
|
|
15
|
+
: this.webformElement['#template']
|
|
16
|
+
if (!this.isEmpty(tpl)) {
|
|
17
|
+
content += htmlDecode(`<div id="${id}">${tpl}</div>`)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return content
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
isInput() {
|
|
24
|
+
return false
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
printTokens(form, data) {
|
|
28
|
+
form.components
|
|
29
|
+
.filter((el) => el.key !== 'action')
|
|
30
|
+
.reduce((prev, element) => {
|
|
31
|
+
const add = (cmp, parents) => {
|
|
32
|
+
if (!Array.isArray(cmp.components)) {
|
|
33
|
+
parents.push(cmp)
|
|
34
|
+
cmp.compositekey = parents
|
|
35
|
+
.filter((parent) => parent.type !== 'datagrid')
|
|
36
|
+
.map((parent) => parent.key)
|
|
37
|
+
.join('.')
|
|
38
|
+
|
|
39
|
+
prev.push(cmp)
|
|
40
|
+
} else {
|
|
41
|
+
if (cmp.type !== 'panel') {
|
|
42
|
+
parents.push(cmp)
|
|
43
|
+
}
|
|
44
|
+
cmp.components.forEach((subElement) =>
|
|
45
|
+
add(subElement, JSON.parse(JSON.stringify(parents)))
|
|
46
|
+
)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
add(element, [])
|
|
50
|
+
return prev
|
|
51
|
+
}, [])
|
|
52
|
+
.filter((element) => element.input)
|
|
53
|
+
.map((element) => {
|
|
54
|
+
const index = function(obj, is, value) {
|
|
55
|
+
if (typeof is == 'string') return index(obj, is.split('.'), value)
|
|
56
|
+
else if (is.length == 1 && value !== undefined)
|
|
57
|
+
return (obj[is[0]] = value)
|
|
58
|
+
else if (is.length == 0) return obj
|
|
59
|
+
else return index(obj[is[0]], is.slice(1), value)
|
|
60
|
+
}
|
|
61
|
+
const dataElement = index(data, element.compositekey)
|
|
62
|
+
if (
|
|
63
|
+
dataElement !== null &&
|
|
64
|
+
dataElement !== undefined &&
|
|
65
|
+
dataElement !== ''
|
|
66
|
+
) {
|
|
67
|
+
let value = dataElement
|
|
68
|
+
if (value === true || value === false) {
|
|
69
|
+
value = value === true ? 'Yes' : 'No'
|
|
70
|
+
} else if (Array.isArray(value)) {
|
|
71
|
+
value = value
|
|
72
|
+
.map((item) => {
|
|
73
|
+
if (!!item && item.constructor === Object) {
|
|
74
|
+
return Object.values(item).join(', ')
|
|
75
|
+
} else {
|
|
76
|
+
return item
|
|
77
|
+
}
|
|
78
|
+
})
|
|
79
|
+
.join(', ')
|
|
80
|
+
}
|
|
81
|
+
return element.label + ': ' + value
|
|
82
|
+
}
|
|
83
|
+
return undefined
|
|
84
|
+
})
|
|
85
|
+
.filter((tag) => !!tag)
|
|
86
|
+
.join('<br/>')
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
getTokenContent() {
|
|
90
|
+
const printFn = this.printTokens.toString()
|
|
91
|
+
const printFnBody = printFn.slice(
|
|
92
|
+
printFn.indexOf('{') + 1,
|
|
93
|
+
printFn.lastIndexOf(';')
|
|
94
|
+
)
|
|
95
|
+
return `
|
|
96
|
+
{{
|
|
97
|
+
${printFnBody}
|
|
98
|
+
}} <br/><br/>`
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
showTokens() {
|
|
102
|
+
return (
|
|
103
|
+
this.webformElement['#webform_plugin_id'] === 'webform_computed_token'
|
|
104
|
+
)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
getType() {
|
|
108
|
+
return 'htmlelement'
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
getCustomProperties() {
|
|
112
|
+
return {
|
|
113
|
+
tag: 'div',
|
|
114
|
+
content: this.getContent(),
|
|
115
|
+
refreshOnChange: true
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { BaseFormElement } from '../base-form-element'
|
|
2
|
+
|
|
3
|
+
export class UnknownFormElement extends BaseFormElement {
|
|
4
|
+
getType() {
|
|
5
|
+
return 'htmlelement'
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
isInput() {
|
|
9
|
+
return false
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
getLogic() {
|
|
13
|
+
return undefined
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
getCustomProperties() {
|
|
17
|
+
return {
|
|
18
|
+
content: `<span style="color: red">** Error: unhandled form element ${
|
|
19
|
+
this.webformElement['#type']
|
|
20
|
+
} >> ${this.getLabel() || this.getName()} **<s/pan>`,
|
|
21
|
+
refreshOnChange: false
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BaseFormElement } from '../base-form-element'
|
|
2
|
+
|
|
3
|
+
export class URLFormElement extends BaseFormElement {
|
|
4
|
+
transformSubmissionValue(url) {
|
|
5
|
+
if (url) {
|
|
6
|
+
const pattern = /^((http|https|ftp):\/\/)/
|
|
7
|
+
if (!pattern.test(url)) {
|
|
8
|
+
url = 'http://' + url
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return url
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export const converFormIOElementToJSON = (formioElement, formlogicList) => {
|
|
2
|
+
let formioElementJSON
|
|
3
|
+
if (formioElement.isCustomPropertiesAnArray()) {
|
|
4
|
+
formioElementJSON = formioElement.getCustomProperties()
|
|
5
|
+
} else {
|
|
6
|
+
formioElementJSON = Object.assign(
|
|
7
|
+
{
|
|
8
|
+
label: formioElement.getLabel(),
|
|
9
|
+
labelPosition: formioElement.getLabelPosition(),
|
|
10
|
+
autocomplete: formioElement.getAutoComplete(),
|
|
11
|
+
key: formioElement.getKey(),
|
|
12
|
+
id: formioElement.getId(),
|
|
13
|
+
type: formioElement.getType(),
|
|
14
|
+
input: formioElement.isInput(),
|
|
15
|
+
inputMask: formioElement.getInputMask(),
|
|
16
|
+
mask: formioElement.shouldHideInputText(),
|
|
17
|
+
description: formioElement.getDescription(),
|
|
18
|
+
tooltip: formioElement.getTooltip(),
|
|
19
|
+
placeholder: formioElement.getPlaceholder(),
|
|
20
|
+
prefix: formioElement.getPrefix(),
|
|
21
|
+
suffix: formioElement.getSuffix(),
|
|
22
|
+
validate: formioElement.getValidation(),
|
|
23
|
+
case: formioElement.getCasing(),
|
|
24
|
+
disabled: formioElement.isDisabled(),
|
|
25
|
+
hideLabel: formioElement.shouldHideLabel(),
|
|
26
|
+
clearOnHide: formioElement.shouldClearValuesWhenHidden(),
|
|
27
|
+
defaultValue: formioElement.getDefaultValue(),
|
|
28
|
+
customClass: formioElement.getCustomClass(),
|
|
29
|
+
attributes: {
|
|
30
|
+
instance: () => formioElement,
|
|
31
|
+
counter: formioElement.counter
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
formioElement.getCustomProperties()
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
Object.keys(formioElementJSON)
|
|
38
|
+
.filter((key) => formioElementJSON[key] === undefined)
|
|
39
|
+
.forEach((key) => delete formioElementJSON[key])
|
|
40
|
+
}
|
|
41
|
+
const logicList = formioElement.getLogic()
|
|
42
|
+
if (logicList && Array.isArray(logicList) && logicList.length > 0) {
|
|
43
|
+
formlogicList.push({
|
|
44
|
+
logicList,
|
|
45
|
+
sourceElement: formioElement
|
|
46
|
+
})
|
|
47
|
+
}
|
|
48
|
+
return { json: formioElementJSON, formlogicList }
|
|
49
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export class FormApi {
|
|
2
|
+
initialise(baseUrl, formId, axios) {
|
|
3
|
+
this.baseUrl = baseUrl
|
|
4
|
+
this.formId = formId
|
|
5
|
+
this.axios = axios
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
fetchFormSchema = async () => {
|
|
9
|
+
try {
|
|
10
|
+
const formRestPath = `${this.baseUrl}/webform_rest/${this.formId}/fields`
|
|
11
|
+
const response = await this.axios.get(formRestPath)
|
|
12
|
+
return response?.data
|
|
13
|
+
} catch (e) {
|
|
14
|
+
return null
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
submitForm = async (payload, isPreview, tree) => {
|
|
19
|
+
if (isPreview) {
|
|
20
|
+
console.log('submission payload', payload)
|
|
21
|
+
return { submitted: true }
|
|
22
|
+
}
|
|
23
|
+
if (!payload) {
|
|
24
|
+
return { submitted: false }
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
const formRestPath = `${this.baseUrl}/webform_rest/submit?_format=json`
|
|
28
|
+
let res = await this.axios.post(formRestPath, payload)
|
|
29
|
+
return { submitted: true, sid: res.data.sid }
|
|
30
|
+
} catch (e) {
|
|
31
|
+
const isValidationError =
|
|
32
|
+
typeof e === 'object' && e.response?.status === 400
|
|
33
|
+
if (isValidationError) {
|
|
34
|
+
return {
|
|
35
|
+
submitted: false,
|
|
36
|
+
message: e.response.data.error.message,
|
|
37
|
+
fields: Object.keys(e.response.data.error || {}).map((key) => ({
|
|
38
|
+
label: tree[key]?.getLabel() || key,
|
|
39
|
+
elementClass: tree[key]?.getCustomClass(),
|
|
40
|
+
error: e.response.data.error[key]
|
|
41
|
+
}))
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { submitted: false }
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { isEmpty } from '../models/form-utils'
|
|
2
|
+
import { converFormIOElementToJSON } from './convert-form-element'
|
|
3
|
+
import { updateConditionWithFormReferences } from './logic-linker'
|
|
4
|
+
import { RegisterFactory } from './registry-factory'
|
|
5
|
+
|
|
6
|
+
export class FormRenderParser {
|
|
7
|
+
initialise(contentApiUrl, isPreview) {
|
|
8
|
+
this.formSettingsMeta = { contentApiUrl }
|
|
9
|
+
this.isPreview = isPreview
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
parse = (webform, options) => {
|
|
13
|
+
if (!webform) {
|
|
14
|
+
return null
|
|
15
|
+
}
|
|
16
|
+
const webFormElementTree = {}
|
|
17
|
+
const formlogicList = []
|
|
18
|
+
try {
|
|
19
|
+
webform = this.preProcessWebForm(webform)
|
|
20
|
+
const formiodefinition = {
|
|
21
|
+
id: webform['#id'],
|
|
22
|
+
components: this.parseFormContainerComponents(
|
|
23
|
+
webform,
|
|
24
|
+
webFormElementTree,
|
|
25
|
+
null,
|
|
26
|
+
formlogicList
|
|
27
|
+
)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
options.breadcrumbSettings = { clickable: false }
|
|
31
|
+
options.buttonSettings = { showCancel: false }
|
|
32
|
+
|
|
33
|
+
this.applyConditionsToForm(webFormElementTree, formlogicList)
|
|
34
|
+
const css = this.applyStylesToForm(webFormElementTree)
|
|
35
|
+
|
|
36
|
+
formiodefinition.display = this.getDisplay(webFormElementTree)
|
|
37
|
+
if (this.isPreview) {
|
|
38
|
+
console.log('drupal webform', webform)
|
|
39
|
+
console.log('formio definition', formiodefinition)
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
definition: formiodefinition,
|
|
43
|
+
tree: webFormElementTree,
|
|
44
|
+
options,
|
|
45
|
+
css
|
|
46
|
+
}
|
|
47
|
+
} catch (e) {
|
|
48
|
+
console.error(e)
|
|
49
|
+
return null
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
parseFormContainerComponents = (
|
|
54
|
+
container,
|
|
55
|
+
webFormElementTree,
|
|
56
|
+
parent,
|
|
57
|
+
formlogicList
|
|
58
|
+
) => {
|
|
59
|
+
return Object.keys(container)
|
|
60
|
+
.filter((i) => !i.startsWith('#'))
|
|
61
|
+
.map((i) => container[i])
|
|
62
|
+
.map((webFormElement) => {
|
|
63
|
+
return RegisterFactory.getFormIOElement(
|
|
64
|
+
webFormElement,
|
|
65
|
+
this.formSettingsMeta,
|
|
66
|
+
parent
|
|
67
|
+
)
|
|
68
|
+
})
|
|
69
|
+
.filter(
|
|
70
|
+
(formIOElement) => !!formIOElement && formIOElement.isRenderable()
|
|
71
|
+
)
|
|
72
|
+
.map((formIOElement) => {
|
|
73
|
+
// nested form logic
|
|
74
|
+
if (formIOElement.isLayoutComponent()) {
|
|
75
|
+
const subContainer = formIOElement.getContainerChildElements()
|
|
76
|
+
formIOElement.setComponents(
|
|
77
|
+
this.parseFormContainerComponents(
|
|
78
|
+
subContainer,
|
|
79
|
+
webFormElementTree,
|
|
80
|
+
formIOElement,
|
|
81
|
+
formlogicList
|
|
82
|
+
)
|
|
83
|
+
)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return formIOElement
|
|
87
|
+
})
|
|
88
|
+
.map((formIOElement) => {
|
|
89
|
+
// conversion logic
|
|
90
|
+
webFormElementTree[formIOElement.getKey()] = formIOElement
|
|
91
|
+
const formioElementJSON = converFormIOElementToJSON(
|
|
92
|
+
formIOElement,
|
|
93
|
+
formlogicList
|
|
94
|
+
).json
|
|
95
|
+
formIOElement.setFormIOdefinitionForElement(formioElementJSON)
|
|
96
|
+
return formioElementJSON
|
|
97
|
+
})
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
preProcessWebForm = (webform) => {
|
|
101
|
+
const hasSubmitButton = !!webform.actions
|
|
102
|
+
if (!hasSubmitButton) {
|
|
103
|
+
webform.actions = {
|
|
104
|
+
'#type': 'webform_actions',
|
|
105
|
+
'#webform_id': 'form--actions',
|
|
106
|
+
'#webform_key': 'actions'
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return webform
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
applyConditionsToForm = (webFormElementTree, formlogicList) => {
|
|
113
|
+
formlogicList.forEach(({ logicList, sourceElement }) => {
|
|
114
|
+
logicList.forEach((logic) =>
|
|
115
|
+
updateConditionWithFormReferences(
|
|
116
|
+
logic,
|
|
117
|
+
sourceElement,
|
|
118
|
+
webFormElementTree
|
|
119
|
+
)
|
|
120
|
+
)
|
|
121
|
+
})
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
applyStylesToForm = (webFormElementTree) => {
|
|
125
|
+
let css = ''
|
|
126
|
+
Object.values(webFormElementTree).forEach((element) => {
|
|
127
|
+
const overrides = element.getCustomCSS()
|
|
128
|
+
|
|
129
|
+
if (overrides) {
|
|
130
|
+
const addStyle = (style, selector) => {
|
|
131
|
+
if (!isEmpty(style)) {
|
|
132
|
+
css += `.${element.getCustomClass()} ${selector}{${style}}`
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
addStyle(overrides.label, 'label ')
|
|
136
|
+
addStyle(overrides.wrapper, '')
|
|
137
|
+
addStyle(overrides.element, '[ref=element] > *')
|
|
138
|
+
|
|
139
|
+
if (!isEmpty(overrides.additional)) {
|
|
140
|
+
css += overrides.additional
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
})
|
|
144
|
+
return css
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
getDisplay(webFormElementTree) {
|
|
148
|
+
const pageKeys = Object.keys(webFormElementTree).filter((elementKey) =>
|
|
149
|
+
webFormElementTree[elementKey].isPageComponent()
|
|
150
|
+
)
|
|
151
|
+
if (pageKeys.length > 0) {
|
|
152
|
+
return 'wizard'
|
|
153
|
+
}
|
|
154
|
+
return 'form'
|
|
155
|
+
}
|
|
156
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export class FormSubmitParser {
|
|
2
|
+
initialise(formId, axios) {
|
|
3
|
+
this.formId = formId
|
|
4
|
+
this.axios = axios
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
parse = (submission, form, formioinstance) => {
|
|
8
|
+
try {
|
|
9
|
+
return {
|
|
10
|
+
webform_id: this.formId,
|
|
11
|
+
...this.parseFormInstance(submission.data, form, formioinstance)
|
|
12
|
+
}
|
|
13
|
+
} catch (e) {
|
|
14
|
+
console.error(e)
|
|
15
|
+
return null
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
parseFormInstance = (formSubmissionMap, form, formioinstance) => {
|
|
20
|
+
return Object.keys(formSubmissionMap)
|
|
21
|
+
.filter((key) => key !== 'actions')
|
|
22
|
+
.filter((key) => !!form.tree[key])
|
|
23
|
+
.reduce((previous, key) => {
|
|
24
|
+
const formTreeElement = form.tree[key]
|
|
25
|
+
const value = formSubmissionMap[key]
|
|
26
|
+
const component = formioinstance.components.find(
|
|
27
|
+
(component) => component.originalComponent?.key === key
|
|
28
|
+
)
|
|
29
|
+
const isDisabled = component?.disabled
|
|
30
|
+
const ignore =
|
|
31
|
+
isDisabled || formTreeElement.shouldIgnoreSubmissionValue()
|
|
32
|
+
if (formTreeElement.isLayoutComponent() && ignore) {
|
|
33
|
+
const containerSubmissions = this.parseFormInstance(
|
|
34
|
+
value,
|
|
35
|
+
form,
|
|
36
|
+
formioinstance
|
|
37
|
+
)
|
|
38
|
+
previous = {
|
|
39
|
+
...previous,
|
|
40
|
+
...containerSubmissions
|
|
41
|
+
}
|
|
42
|
+
} else if (!ignore) {
|
|
43
|
+
const returnValue = formTreeElement.transformSubmissionValue(
|
|
44
|
+
value,
|
|
45
|
+
this.axios,
|
|
46
|
+
previous
|
|
47
|
+
)
|
|
48
|
+
if (typeof returnValue === 'object' && !Array.isArray(returnValue)) {
|
|
49
|
+
previous = {
|
|
50
|
+
...previous,
|
|
51
|
+
...returnValue
|
|
52
|
+
}
|
|
53
|
+
} else {
|
|
54
|
+
previous[key] = returnValue
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return previous
|
|
59
|
+
}, {})
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export function updateConditionWithFormReferences(
|
|
2
|
+
logic,
|
|
3
|
+
sourceElement,
|
|
4
|
+
webFormElementTree
|
|
5
|
+
) {
|
|
6
|
+
const condition = logic.trigger.javascript
|
|
7
|
+
// check if condition references elements with nested parents
|
|
8
|
+
let match = getElementToReplace(condition)
|
|
9
|
+
updateSourceElement(sourceElement, logic)
|
|
10
|
+
|
|
11
|
+
if (match) {
|
|
12
|
+
// if yes then replace condition data.{text1} with data.container1.text1
|
|
13
|
+
const conditionReferenceToElement = webFormElementTree[match.to]
|
|
14
|
+
if (conditionReferenceToElement) {
|
|
15
|
+
const updatedCondition = updateConditionWithReference(
|
|
16
|
+
condition,
|
|
17
|
+
conditionReferenceToElement,
|
|
18
|
+
match.from
|
|
19
|
+
)
|
|
20
|
+
logic.trigger.javascript = updatedCondition
|
|
21
|
+
match = getElementToReplace(condition)
|
|
22
|
+
return match
|
|
23
|
+
? updateConditionWithFormReferences(
|
|
24
|
+
logic,
|
|
25
|
+
sourceElement,
|
|
26
|
+
webFormElementTree
|
|
27
|
+
)
|
|
28
|
+
: updatedCondition
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return condition
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function updateSourceElement(sourceElement, logic) {
|
|
35
|
+
const formioElement = sourceElement.formIOdefinitionForElement
|
|
36
|
+
formioElement.logic = formioElement.logic || []
|
|
37
|
+
formioElement.logic.push(logic)
|
|
38
|
+
for (const key in logic.defaultProps) {
|
|
39
|
+
const defaults = logic.defaultProps[key]
|
|
40
|
+
if (typeof defaults === 'object') {
|
|
41
|
+
for (const defaultkey in defaults) {
|
|
42
|
+
formioElement[key] = formioElement[key] || {}
|
|
43
|
+
formioElement[key][defaultkey] = defaults[defaultkey]
|
|
44
|
+
}
|
|
45
|
+
} else {
|
|
46
|
+
formioElement[key] = defaults
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function updateConditionWithReference(
|
|
52
|
+
condition,
|
|
53
|
+
elementToReplace,
|
|
54
|
+
elementKeyToReplace
|
|
55
|
+
) {
|
|
56
|
+
const elementToReplaceParent = elementToReplace.getParent()
|
|
57
|
+
const formReferenceParentKey = elementToReplaceParent
|
|
58
|
+
? elementToReplaceParent.getKey() + '.'
|
|
59
|
+
: ''
|
|
60
|
+
let updatedCondition = condition.replace(
|
|
61
|
+
elementKeyToReplace,
|
|
62
|
+
formReferenceParentKey + elementToReplace.getKey()
|
|
63
|
+
)
|
|
64
|
+
return updatedCondition
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function getElementToReplace(condition) {
|
|
68
|
+
const match = condition.match(/{([^}]+)}/)
|
|
69
|
+
if (match) {
|
|
70
|
+
return { from: match[0], to: match[1] }
|
|
71
|
+
}
|
|
72
|
+
return null
|
|
73
|
+
}
|