@evanschleret/formforgeclient 1.2.4 → 2.0.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/README.md +10 -0
- package/dist/module.cjs +1 -0
- package/dist/module.d.cts +1 -0
- package/dist/module.d.mts +1 -0
- package/dist/module.d.ts +1 -0
- package/dist/module.json +1 -1
- package/dist/module.mjs +1 -0
- package/dist/runtime/api/client.js +4 -2
- package/dist/runtime/api/request.d.ts +1 -0
- package/dist/runtime/api/schema.js +4 -4
- package/dist/runtime/assets/formforge.css +1 -0
- package/dist/runtime/composables/index.d.ts +1 -1
- package/dist/runtime/composables/useFormForgeBuilder.d.ts +24 -2
- package/dist/runtime/composables/useFormForgeBuilder.js +299 -43
- package/dist/runtime/composables/useFormForgeForm.js +15 -5
- package/dist/runtime/composables/useFormForgeI18n.d.ts +245 -19
- package/dist/runtime/composables/useFormForgeI18n.js +245 -19
- package/dist/runtime/composables/useFormForgeSubmit.js +31 -9
- package/dist/runtime/index.d.ts +1 -0
- package/dist/runtime/renderers/default/FormForgeBuilder.d.vue.ts +21 -2
- package/dist/runtime/renderers/default/FormForgeBuilder.vue +689 -738
- package/dist/runtime/renderers/default/FormForgeBuilder.vue.d.ts +21 -2
- package/dist/runtime/renderers/default/FormForgeBuilderBlockSettingsModal.d.vue.ts +17 -0
- package/dist/runtime/renderers/default/FormForgeBuilderBlockSettingsModal.vue +32 -0
- package/dist/runtime/renderers/default/FormForgeBuilderBlockSettingsModal.vue.d.ts +17 -0
- package/dist/runtime/renderers/default/FormForgeRenderer.d.vue.ts +3 -4
- package/dist/runtime/renderers/default/FormForgeRenderer.vue +344 -294
- package/dist/runtime/renderers/default/FormForgeRenderer.vue.d.ts +3 -4
- package/dist/runtime/renderers/default/FormForgeRendererField.d.vue.ts +22 -0
- package/dist/runtime/renderers/default/FormForgeRendererField.vue +237 -0
- package/dist/runtime/renderers/default/FormForgeRendererField.vue.d.ts +22 -0
- package/dist/runtime/renderers/default/FormForgeRendererPage.d.vue.ts +18 -0
- package/dist/runtime/renderers/default/FormForgeRendererPage.vue +31 -0
- package/dist/runtime/renderers/default/FormForgeRendererPage.vue.d.ts +18 -0
- package/dist/runtime/renderers/default/FormForgeResponse.vue +4 -3
- package/dist/runtime/renderers/default/builder/FormForgeBuilderAddressFieldsCard.d.vue.ts +11 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderAddressFieldsCard.vue +118 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderAddressFieldsCard.vue.d.ts +11 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderBlockCard.d.vue.ts +46 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderBlockCard.vue +205 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderBlockCard.vue.d.ts +46 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderChoiceDisplayField.d.vue.ts +11 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderChoiceDisplayField.vue +37 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderChoiceDisplayField.vue.d.ts +11 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderChoiceOptionsField.d.vue.ts +11 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderChoiceOptionsField.vue +195 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderChoiceOptionsField.vue.d.ts +11 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderDescriptionField.d.vue.ts +14 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderDescriptionField.vue +91 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderDescriptionField.vue.d.ts +14 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderLogicPanel.d.vue.ts +13 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderLogicPanel.vue +387 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderLogicPanel.vue.d.ts +13 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderQuestionRow.d.vue.ts +44 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderQuestionRow.vue +328 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderQuestionRow.vue.d.ts +44 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderTemporalModeField.d.vue.ts +11 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderTemporalModeField.vue +47 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderTemporalModeField.vue.d.ts +11 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderValidationRulesSection.d.vue.ts +14 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderValidationRulesSection.vue +595 -0
- package/dist/runtime/renderers/default/builder/FormForgeBuilderValidationRulesSection.vue.d.ts +14 -0
- package/dist/runtime/renderers/default/builder/builderFieldHelpers.d.ts +3 -0
- package/dist/runtime/renderers/default/builder/builderFieldHelpers.js +4 -0
- package/dist/runtime/types/index.d.ts +1 -1
- package/dist/runtime/types/management.d.ts +12 -0
- package/dist/runtime/types/schema.d.ts +72 -4
- package/dist/runtime/utils/defaults.d.ts +7 -0
- package/dist/runtime/utils/defaults.js +86 -0
- package/dist/runtime/utils/page-logic.d.ts +24 -0
- package/dist/runtime/utils/page-logic.js +351 -0
- package/dist/runtime/utils/rich-text.d.ts +3 -0
- package/dist/runtime/utils/rich-text.js +72 -0
- package/dist/runtime/utils/schema.d.ts +1 -1
- package/dist/runtime/utils/schema.js +70 -16
- package/dist/runtime/utils/temporal.d.ts +10 -0
- package/dist/runtime/utils/temporal.js +28 -0
- package/dist/runtime/utils/validation.d.ts +5 -0
- package/dist/runtime/utils/validation.js +36 -0
- package/dist/runtime/validation/zod.d.ts +5 -2
- package/dist/runtime/validation/zod.js +563 -54
- package/dist/types.d.mts +2 -0
- package/package.json +18 -14
|
@@ -1,54 +1,125 @@
|
|
|
1
1
|
import { computed, useNuxtApp, useRuntimeConfig } from "#imports";
|
|
2
2
|
const TRANSLATIONS = {
|
|
3
3
|
en: {
|
|
4
|
-
"builder.fieldType.text": "
|
|
4
|
+
"builder.fieldType.text": "Free text",
|
|
5
5
|
"builder.fieldType.textarea": "Long text",
|
|
6
6
|
"builder.fieldType.email": "Email",
|
|
7
7
|
"builder.fieldType.number": "Number",
|
|
8
|
-
"builder.fieldType.select": "
|
|
9
|
-
"builder.fieldType.select_menu": "
|
|
10
|
-
"builder.fieldType.radio": "
|
|
8
|
+
"builder.fieldType.select": "Dropdown",
|
|
9
|
+
"builder.fieldType.select_menu": "Dropdown menu",
|
|
10
|
+
"builder.fieldType.radio": "Single choice",
|
|
11
11
|
"builder.fieldType.checkbox": "Checkbox",
|
|
12
|
-
"builder.fieldType.
|
|
12
|
+
"builder.fieldType.consent": "Consent",
|
|
13
|
+
"builder.fieldType.checkbox_group": "Multiple choice",
|
|
14
|
+
"builder.fieldType.address": "Address",
|
|
13
15
|
"builder.fieldType.switch": "Switch",
|
|
16
|
+
"builder.fieldType.temporal": "Date / time",
|
|
14
17
|
"builder.fieldType.date": "Date",
|
|
15
18
|
"builder.fieldType.time": "Time",
|
|
16
|
-
"builder.fieldType.datetime": "Date & time",
|
|
17
|
-
"builder.fieldType.date_range": "Date range",
|
|
18
|
-
"builder.fieldType.datetime_range": "Datetime range",
|
|
19
19
|
"builder.fieldType.file": "File upload",
|
|
20
20
|
"builder.targetType.page": "Page",
|
|
21
21
|
"builder.targetType.field": "Field",
|
|
22
22
|
"builder.formTitlePlaceholder": "Form title",
|
|
23
23
|
"builder.categoryPlaceholder": "Category",
|
|
24
24
|
"builder.categoryNone": "No category",
|
|
25
|
+
"builder.blockLabel": "Block",
|
|
26
|
+
"builder.blockCounter": "Block {current} / {total}",
|
|
27
|
+
"builder.block.addNewBlock": "Add new block",
|
|
28
|
+
"builder.block.addNewBlockDescription": "Start a new block with its first question",
|
|
29
|
+
"builder.questionLabel": "Question",
|
|
30
|
+
"builder.questionCount": "{count} questions",
|
|
25
31
|
"builder.loadingForm": "Loading form...",
|
|
26
32
|
"builder.lastSave": "Last save: {value}",
|
|
27
33
|
"builder.save": "Save",
|
|
28
34
|
"builder.publish": "Publish",
|
|
29
35
|
"builder.unpublish": "Unpublish",
|
|
36
|
+
"builder.optional": "Optional",
|
|
30
37
|
"builder.pageCounter": "Page {current} / {total}",
|
|
31
38
|
"builder.pageTitlePlaceholder": "Page title",
|
|
32
39
|
"builder.pageDescriptionPlaceholder": "Page description (optional)",
|
|
40
|
+
"builder.descriptionButton": "Add description",
|
|
41
|
+
"builder.descriptionPlaceholder": "Description (optional)",
|
|
42
|
+
"builder.removeDescription": "Remove description",
|
|
43
|
+
"builder.longResponse": "Long answer",
|
|
44
|
+
"builder.longResponseDescription": "Allow respondents to write longer responses over multiple lines.",
|
|
45
|
+
"builder.validationRules": "Validation rules",
|
|
46
|
+
"builder.validationRulesDescription": "Accept only responses that meet the following criteria.",
|
|
47
|
+
"builder.validation.match.all": "All are true",
|
|
48
|
+
"builder.validation.match.any": "At least one is true",
|
|
49
|
+
"builder.validation.operator.min": "Minimum",
|
|
50
|
+
"builder.validation.operator.max": "Maximum",
|
|
51
|
+
"builder.validation.operator.after": "Is after",
|
|
52
|
+
"builder.validation.operator.before": "Is before",
|
|
53
|
+
"builder.validation.operator.between": "Is between",
|
|
54
|
+
"builder.validation.operator.notBetween": "Is not between",
|
|
55
|
+
"builder.validation.operator.regex": "Matches regular expression",
|
|
56
|
+
"builder.validation.operator.eq": "Is",
|
|
57
|
+
"builder.validation.operator.neq": "Is not",
|
|
58
|
+
"builder.validation.operator.contains": "Contains",
|
|
59
|
+
"builder.validation.operator.notContains": "Does not contain",
|
|
60
|
+
"builder.validation.target.text": "Text",
|
|
61
|
+
"builder.validation.target.number": "Number",
|
|
62
|
+
"builder.validation.target.date": "Date",
|
|
63
|
+
"builder.validation.unit.characters": "Characters",
|
|
64
|
+
"builder.validation.valuePlaceholder": "Value",
|
|
65
|
+
"builder.validation.datePlaceholder": "YYYY-MM-DD",
|
|
66
|
+
"builder.validation.rangeStart": "Start date",
|
|
67
|
+
"builder.validation.rangeEnd": "End date",
|
|
68
|
+
"builder.validation.dateDescription": "Set the allowed date or time range.",
|
|
69
|
+
"builder.answerPlaceholder": "Enter your answer here ...",
|
|
70
|
+
"builder.choiceDisplay": "Display",
|
|
71
|
+
"builder.choiceDisplay.list": "List",
|
|
72
|
+
"builder.choiceDisplay.menu": "Dropdown",
|
|
73
|
+
"builder.consentLabel": "Checkbox label",
|
|
74
|
+
"builder.optionsLabel": "Options",
|
|
75
|
+
"builder.optionPlaceholder": "Option {index}",
|
|
76
|
+
"builder.optionOther": "Other",
|
|
77
|
+
"builder.optionNone": "None of the above",
|
|
78
|
+
"builder.addressFields": "Address fields",
|
|
79
|
+
"builder.address.show": "Show",
|
|
80
|
+
"builder.address.required": "Required",
|
|
81
|
+
"builder.address.label": "Label",
|
|
82
|
+
"builder.address.line1": "Address line 1",
|
|
83
|
+
"builder.address.line2": "Address line 2",
|
|
84
|
+
"builder.address.city": "City",
|
|
85
|
+
"builder.address.state": "State",
|
|
86
|
+
"builder.address.zip": "Zip",
|
|
87
|
+
"builder.address.country": "Country",
|
|
88
|
+
"builder.addOtherOption": 'Add "Other"',
|
|
89
|
+
"builder.addNoneOption": 'Add "None of the above"',
|
|
33
90
|
"builder.tooltip.mergePage": "Merge with previous page",
|
|
34
91
|
"builder.tooltip.deletePage": "Delete page",
|
|
35
92
|
"builder.questionPlaceholder": "Question",
|
|
36
93
|
"builder.tooltip.duplicateQuestion": "Duplicate question",
|
|
37
94
|
"builder.tooltip.deleteQuestion": "Delete question",
|
|
38
95
|
"builder.tooltip.addCategory": "Add category",
|
|
96
|
+
"builder.block.addQuestion": "Add question to block",
|
|
39
97
|
"builder.required": "Required",
|
|
98
|
+
"builder.questionMenu.changeType": "Change question type",
|
|
99
|
+
"builder.questionMenu.addBelow": "Add question below",
|
|
100
|
+
"builder.questionMenu.moveToBlock": "Move question to block",
|
|
101
|
+
"builder.questionMenu.moveUp": "Move up",
|
|
102
|
+
"builder.questionMenu.moveDown": "Move down",
|
|
103
|
+
"builder.questionMenu.duplicate": "Duplicate",
|
|
104
|
+
"builder.questionMenu.delete": "Delete",
|
|
105
|
+
"builder.questionMenu.noBlockAfter": "No following block",
|
|
40
106
|
"builder.optionLabelPlaceholder": "Option label",
|
|
41
107
|
"builder.addOption": "Add option",
|
|
42
108
|
"builder.advancedSettings": "Advanced settings",
|
|
43
109
|
"builder.placeholderPlaceholder": "Placeholder",
|
|
44
110
|
"builder.helpTextPlaceholder": "Help text",
|
|
111
|
+
"builder.temporalMode.label": "Date mode",
|
|
112
|
+
"builder.temporalMode.date": "Date",
|
|
113
|
+
"builder.temporalMode.time": "Time",
|
|
114
|
+
"builder.temporalHourCycle.label": "24-hour time format",
|
|
115
|
+
"builder.temporalHourCycle.description": "Use AM/PM only when this is disabled.",
|
|
45
116
|
"builder.minPlaceholder": "Min",
|
|
46
117
|
"builder.maxPlaceholder": "Max",
|
|
47
118
|
"builder.stepPlaceholder": "Step",
|
|
48
119
|
"builder.multiple": "Multiple",
|
|
49
120
|
"builder.acceptedExtensionsPlaceholder": "Accepted extensions (.pdf,.png)",
|
|
50
|
-
"builder.conditions": "
|
|
51
|
-
"builder.addCondition": "Add
|
|
121
|
+
"builder.conditions": "Conditional logic",
|
|
122
|
+
"builder.addCondition": "Add logic rule",
|
|
52
123
|
"builder.condition.action.show": "Show",
|
|
53
124
|
"builder.condition.action.hide": "Hide",
|
|
54
125
|
"builder.condition.action.skip": "Skip",
|
|
@@ -85,6 +156,44 @@ const TRANSLATIONS = {
|
|
|
85
156
|
"builder.toast.unpublishSuccess": "Form unpublished",
|
|
86
157
|
"builder.optionDefaultLabel": "Option",
|
|
87
158
|
"builder.optionsCount": "{count} options",
|
|
159
|
+
"builder.logic.title": "Conditional logic",
|
|
160
|
+
"builder.logic.empty": "No logic rule yet",
|
|
161
|
+
"builder.logic.rulesCount": "{count} logic rules",
|
|
162
|
+
"builder.logic.addRule": "Add logic rule",
|
|
163
|
+
"builder.logic.rule": "When",
|
|
164
|
+
"builder.logic.addClause": "Add clause",
|
|
165
|
+
"builder.logic.then.addAction": "Add action",
|
|
166
|
+
"builder.logic.match.all": "All are true",
|
|
167
|
+
"builder.logic.match.any": "At least one is true",
|
|
168
|
+
"builder.logic.then": "Then",
|
|
169
|
+
"builder.logic.then.require": "Required answer",
|
|
170
|
+
"builder.logic.then.goto": "Go to block",
|
|
171
|
+
"builder.logic.fallback": "All other responses will continue to",
|
|
172
|
+
"builder.logic.fallback.next": "Next block",
|
|
173
|
+
"builder.logic.fallback.goto": "Destination block",
|
|
174
|
+
"builder.logic.requireQuestionPlaceholder": "Future question",
|
|
175
|
+
"builder.logic.gotoBlockPlaceholder": "Destination block",
|
|
176
|
+
"builder.logic.gotoBlockPlaceholderAfter": "Block {index}",
|
|
177
|
+
"builder.logic.destinationBlockLabel": "Block {index}",
|
|
178
|
+
"builder.logic.valuePlaceholder": "Value",
|
|
179
|
+
"builder.logic.operator.eq": "Equals",
|
|
180
|
+
"builder.logic.operator.neq": "Does not equal",
|
|
181
|
+
"builder.logic.operator.contains": "Contains",
|
|
182
|
+
"builder.logic.operator.not_contains": "Does not contain",
|
|
183
|
+
"builder.logic.operator.starts_with": "Starts with",
|
|
184
|
+
"builder.logic.operator.not_starts_with": "Does not start with",
|
|
185
|
+
"builder.logic.operator.ends_with": "Ends with",
|
|
186
|
+
"builder.logic.operator.not_ends_with": "Does not end with",
|
|
187
|
+
"builder.logic.operator.is_submitted": "Is submitted",
|
|
188
|
+
"builder.logic.operator.is_not_submitted": "Is not submitted",
|
|
189
|
+
"builder.logic.operator.accepted": "Is accepted",
|
|
190
|
+
"builder.logic.operator.ignored": "Is ignored",
|
|
191
|
+
"builder.block.showSettings": "Show block settings",
|
|
192
|
+
"builder.block.hideSettings": "Hide block settings",
|
|
193
|
+
"builder.block.collapse": "Collapse block",
|
|
194
|
+
"builder.block.expand": "Expand block",
|
|
195
|
+
"builder.logic.consent.accepted": "Is accepted",
|
|
196
|
+
"builder.logic.consent.ignored": "Is ignored",
|
|
88
197
|
"builder.categoryModal.title": "Create category",
|
|
89
198
|
"builder.categoryModal.description": "Add a category and assign it to this form.",
|
|
90
199
|
"builder.categoryModal.nameLabel": "Name",
|
|
@@ -100,6 +209,10 @@ const TRANSLATIONS = {
|
|
|
100
209
|
"renderer.error.loadForm": "Unable to load form",
|
|
101
210
|
"renderer.error.submit": "Submission failed",
|
|
102
211
|
"renderer.error.missingFormKey": "Missing form key",
|
|
212
|
+
"renderer.submissionCodeLabel": "Access code",
|
|
213
|
+
"renderer.submissionCodePlaceholder": "Enter the access code",
|
|
214
|
+
"renderer.formNotAvailableYet": "This form is not available yet",
|
|
215
|
+
"renderer.formPaused": "This form is paused",
|
|
103
216
|
"renderer.alert.fixFields": "Please fix the following fields",
|
|
104
217
|
"renderer.alert.submitted": "Form submitted",
|
|
105
218
|
"renderer.pageTitle": "Page {index}",
|
|
@@ -122,54 +235,125 @@ const TRANSLATIONS = {
|
|
|
122
235
|
"response.file.missingUrlHint": "File URL is unavailable. Enable FORMFORGE_HTTP_FILE_URLS_ENABLED in FormForge config."
|
|
123
236
|
},
|
|
124
237
|
fr: {
|
|
125
|
-
"builder.fieldType.text": "
|
|
238
|
+
"builder.fieldType.text": "Texte libre",
|
|
126
239
|
"builder.fieldType.textarea": "R\xE9ponse longue",
|
|
127
240
|
"builder.fieldType.email": "E-mail",
|
|
128
241
|
"builder.fieldType.number": "Nombre",
|
|
129
242
|
"builder.fieldType.select": "S\xE9lection",
|
|
130
|
-
"builder.fieldType.select_menu": "Menu
|
|
131
|
-
"builder.fieldType.radio": "Choix
|
|
243
|
+
"builder.fieldType.select_menu": "Menu d\xE9roulant",
|
|
244
|
+
"builder.fieldType.radio": "Choix unique",
|
|
132
245
|
"builder.fieldType.checkbox": "Case \xE0 cocher",
|
|
133
|
-
"builder.fieldType.
|
|
246
|
+
"builder.fieldType.consent": "Consentement",
|
|
247
|
+
"builder.fieldType.checkbox_group": "Choix multiples",
|
|
248
|
+
"builder.fieldType.address": "Adresse",
|
|
134
249
|
"builder.fieldType.switch": "Interrupteur",
|
|
250
|
+
"builder.fieldType.temporal": "Date / heure",
|
|
135
251
|
"builder.fieldType.date": "Date",
|
|
136
252
|
"builder.fieldType.time": "Heure",
|
|
137
|
-
"builder.fieldType.datetime": "Date et heure",
|
|
138
|
-
"builder.fieldType.date_range": "Plage de dates",
|
|
139
|
-
"builder.fieldType.datetime_range": "Plage date/heure",
|
|
140
253
|
"builder.fieldType.file": "T\xE9l\xE9versement de fichier",
|
|
141
254
|
"builder.targetType.page": "Page",
|
|
142
255
|
"builder.targetType.field": "Champ",
|
|
143
256
|
"builder.formTitlePlaceholder": "Titre du formulaire",
|
|
144
257
|
"builder.categoryPlaceholder": "Cat\xE9gorie",
|
|
145
258
|
"builder.categoryNone": "Aucune cat\xE9gorie",
|
|
259
|
+
"builder.blockLabel": "Bloc",
|
|
260
|
+
"builder.blockCounter": "Bloc {current} / {total}",
|
|
261
|
+
"builder.block.addNewBlock": "Ajouter un nouveau bloc",
|
|
262
|
+
"builder.block.addNewBlockDescription": "Commencez un bloc avec sa premi\xE8re question",
|
|
263
|
+
"builder.questionLabel": "Question",
|
|
264
|
+
"builder.questionCount": "{count} questions",
|
|
146
265
|
"builder.loadingForm": "Chargement du formulaire...",
|
|
147
266
|
"builder.lastSave": "Derni\xE8re sauvegarde : {value}",
|
|
148
267
|
"builder.save": "Sauvegarder",
|
|
149
268
|
"builder.publish": "Publier",
|
|
150
269
|
"builder.unpublish": "D\xE9publier",
|
|
270
|
+
"builder.optional": "Optionnel",
|
|
151
271
|
"builder.pageCounter": "Page {current} / {total}",
|
|
152
272
|
"builder.pageTitlePlaceholder": "Titre de la page",
|
|
153
273
|
"builder.pageDescriptionPlaceholder": "Description de la page (optionnel)",
|
|
274
|
+
"builder.descriptionButton": "Ajouter une description",
|
|
275
|
+
"builder.descriptionPlaceholder": "Description (optionnelle)",
|
|
276
|
+
"builder.removeDescription": "Retirer la description",
|
|
277
|
+
"builder.longResponse": "Longue r\xE9ponse",
|
|
278
|
+
"builder.longResponseDescription": "Permettre aux r\xE9pondants d'\xE9crire des r\xE9ponses plus longues et sur plusieurs lignes.",
|
|
279
|
+
"builder.validationRules": "R\xE8gles de validation",
|
|
280
|
+
"builder.validationRulesDescription": "Accepter uniquement les r\xE9ponses qui r\xE9pondent aux crit\xE8res suivants",
|
|
281
|
+
"builder.validation.match.all": "Toutes sont vraies",
|
|
282
|
+
"builder.validation.match.any": "Au moins une est vraie",
|
|
283
|
+
"builder.validation.operator.min": "Au minimum",
|
|
284
|
+
"builder.validation.operator.max": "Au maximum",
|
|
285
|
+
"builder.validation.operator.after": "Est post\xE9rieur \xE0",
|
|
286
|
+
"builder.validation.operator.before": "Est ant\xE9rieur \xE0",
|
|
287
|
+
"builder.validation.operator.between": "Est entre",
|
|
288
|
+
"builder.validation.operator.notBetween": "N'est pas entre",
|
|
289
|
+
"builder.validation.operator.regex": "Correspond au mod\xE8le d'expression r\xE9guli\xE8re",
|
|
290
|
+
"builder.validation.operator.eq": "Est",
|
|
291
|
+
"builder.validation.operator.neq": "N'est pas",
|
|
292
|
+
"builder.validation.operator.contains": "Contient",
|
|
293
|
+
"builder.validation.operator.notContains": "Ne contient pas",
|
|
294
|
+
"builder.validation.target.text": "Texte",
|
|
295
|
+
"builder.validation.target.number": "Nombre",
|
|
296
|
+
"builder.validation.target.date": "Date",
|
|
297
|
+
"builder.validation.unit.characters": "Caract\xE8res",
|
|
298
|
+
"builder.validation.valuePlaceholder": "Valeur",
|
|
299
|
+
"builder.validation.datePlaceholder": "AAAA-MM-JJ",
|
|
300
|
+
"builder.validation.rangeStart": "Date de d\xE9but",
|
|
301
|
+
"builder.validation.rangeEnd": "Date de fin",
|
|
302
|
+
"builder.validation.dateDescription": "D\xE9finir l'intervalle de dates ou d'heures autoris\xE9.",
|
|
303
|
+
"builder.answerPlaceholder": "Entrez votre r\xE9ponse ici ...",
|
|
304
|
+
"builder.choiceDisplay": "Affichage",
|
|
305
|
+
"builder.choiceDisplay.list": "Liste",
|
|
306
|
+
"builder.choiceDisplay.menu": "Menu d\xE9roulant",
|
|
307
|
+
"builder.consentLabel": "Libell\xE9 de la case \xE0 cocher",
|
|
308
|
+
"builder.optionsLabel": "Options",
|
|
309
|
+
"builder.optionPlaceholder": "Option {index}",
|
|
310
|
+
"builder.optionOther": "Autre",
|
|
311
|
+
"builder.optionNone": "Aucun des \xE9l\xE9ments ci-dessus",
|
|
312
|
+
"builder.addressFields": "Champs d'adresse",
|
|
313
|
+
"builder.address.show": "Montrer",
|
|
314
|
+
"builder.address.required": "Requis",
|
|
315
|
+
"builder.address.label": "\xC9tiquette",
|
|
316
|
+
"builder.address.line1": "Ligne d'adresse 1",
|
|
317
|
+
"builder.address.line2": "Ligne d'adresse 2",
|
|
318
|
+
"builder.address.city": "Ville",
|
|
319
|
+
"builder.address.state": "\xC9tat",
|
|
320
|
+
"builder.address.zip": "Code postal",
|
|
321
|
+
"builder.address.country": "Pays",
|
|
322
|
+
"builder.addOtherOption": 'Ajouter "Autre"',
|
|
323
|
+
"builder.addNoneOption": 'Ajouter "Aucun des \xE9l\xE9ments ci-dessus"',
|
|
154
324
|
"builder.tooltip.mergePage": "Fusionner avec la page pr\xE9c\xE9dente",
|
|
155
325
|
"builder.tooltip.deletePage": "Supprimer la page",
|
|
156
326
|
"builder.questionPlaceholder": "Question",
|
|
157
327
|
"builder.tooltip.duplicateQuestion": "Dupliquer la question",
|
|
158
328
|
"builder.tooltip.deleteQuestion": "Supprimer la question",
|
|
159
329
|
"builder.tooltip.addCategory": "Ajouter une cat\xE9gorie",
|
|
330
|
+
"builder.block.addQuestion": "Ajouter une question au bloc",
|
|
160
331
|
"builder.required": "Obligatoire",
|
|
332
|
+
"builder.questionMenu.changeType": "Changer le type de question",
|
|
333
|
+
"builder.questionMenu.addBelow": "Ajouter une question ci-dessous",
|
|
334
|
+
"builder.questionMenu.moveToBlock": "D\xE9placer la question vers le bloc",
|
|
335
|
+
"builder.questionMenu.moveUp": "D\xE9placer vers le haut",
|
|
336
|
+
"builder.questionMenu.moveDown": "D\xE9placer vers le bas",
|
|
337
|
+
"builder.questionMenu.duplicate": "Dupliquer",
|
|
338
|
+
"builder.questionMenu.delete": "Supprimer",
|
|
339
|
+
"builder.questionMenu.noBlockAfter": "Aucun bloc suivant",
|
|
161
340
|
"builder.optionLabelPlaceholder": "Libell\xE9 de l\u2019option",
|
|
162
341
|
"builder.addOption": "Ajouter une option",
|
|
163
342
|
"builder.advancedSettings": "Param\xE8tres avanc\xE9s",
|
|
164
343
|
"builder.placeholderPlaceholder": "Placeholder",
|
|
165
344
|
"builder.helpTextPlaceholder": "Texte d\u2019aide",
|
|
345
|
+
"builder.temporalMode.label": "Mode de date",
|
|
346
|
+
"builder.temporalMode.date": "Date",
|
|
347
|
+
"builder.temporalMode.time": "Heure",
|
|
348
|
+
"builder.temporalHourCycle.label": "Format horaire 24 h",
|
|
349
|
+
"builder.temporalHourCycle.description": "Afficher AM/PM uniquement lorsque ce r\xE9glage est d\xE9sactiv\xE9.",
|
|
166
350
|
"builder.minPlaceholder": "Min",
|
|
167
351
|
"builder.maxPlaceholder": "Max",
|
|
168
352
|
"builder.stepPlaceholder": "Pas",
|
|
169
353
|
"builder.multiple": "Multiple",
|
|
170
354
|
"builder.acceptedExtensionsPlaceholder": "Extensions accept\xE9es (.pdf,.png)",
|
|
171
|
-
"builder.conditions": "
|
|
172
|
-
"builder.addCondition": "Ajouter une
|
|
355
|
+
"builder.conditions": "Logique conditionnelle",
|
|
356
|
+
"builder.addCondition": "Ajouter une r\xE8gle de logique",
|
|
173
357
|
"builder.condition.action.show": "Afficher",
|
|
174
358
|
"builder.condition.action.hide": "Masquer",
|
|
175
359
|
"builder.condition.action.skip": "Passer",
|
|
@@ -206,6 +390,44 @@ const TRANSLATIONS = {
|
|
|
206
390
|
"builder.toast.unpublishSuccess": "Formulaire d\xE9publi\xE9",
|
|
207
391
|
"builder.optionDefaultLabel": "Option",
|
|
208
392
|
"builder.optionsCount": "{count} options",
|
|
393
|
+
"builder.logic.title": "Logique conditionnelle",
|
|
394
|
+
"builder.logic.empty": "Aucune r\xE8gle de logique",
|
|
395
|
+
"builder.logic.rulesCount": "{count} r\xE8gles de logique",
|
|
396
|
+
"builder.logic.addRule": "Ajouter une r\xE8gle de logique",
|
|
397
|
+
"builder.logic.rule": "Quand",
|
|
398
|
+
"builder.logic.addClause": "Ajouter une clause",
|
|
399
|
+
"builder.logic.then.addAction": "Ajouter une action",
|
|
400
|
+
"builder.logic.match.all": "Toutes sont vraies",
|
|
401
|
+
"builder.logic.match.any": "Au moins une est vraie",
|
|
402
|
+
"builder.logic.then": "Alors",
|
|
403
|
+
"builder.logic.then.require": "R\xE9ponse requise",
|
|
404
|
+
"builder.logic.then.goto": "Aller au bloc",
|
|
405
|
+
"builder.logic.fallback": "Toutes les autres r\xE9ponses continueront \xE0",
|
|
406
|
+
"builder.logic.fallback.next": "Bloc suivant",
|
|
407
|
+
"builder.logic.fallback.goto": "Bloc de destination",
|
|
408
|
+
"builder.logic.requireQuestionPlaceholder": "Question future",
|
|
409
|
+
"builder.logic.gotoBlockPlaceholder": "Bloc de destination",
|
|
410
|
+
"builder.logic.gotoBlockPlaceholderAfter": "Bloc {index}",
|
|
411
|
+
"builder.logic.destinationBlockLabel": "Bloc {index}",
|
|
412
|
+
"builder.logic.valuePlaceholder": "Valeur",
|
|
413
|
+
"builder.logic.operator.eq": "\xC9gal \xE0",
|
|
414
|
+
"builder.logic.operator.neq": "Diff\xE9rent de",
|
|
415
|
+
"builder.logic.operator.contains": "Contient",
|
|
416
|
+
"builder.logic.operator.not_contains": "Ne contient pas",
|
|
417
|
+
"builder.logic.operator.starts_with": "Commence par",
|
|
418
|
+
"builder.logic.operator.not_starts_with": "Ne commence pas par",
|
|
419
|
+
"builder.logic.operator.ends_with": "Se termine par",
|
|
420
|
+
"builder.logic.operator.not_ends_with": "Ne se termine pas par",
|
|
421
|
+
"builder.logic.operator.is_submitted": "Est soumis",
|
|
422
|
+
"builder.logic.operator.is_not_submitted": "N\u2019est pas soumis",
|
|
423
|
+
"builder.logic.operator.accepted": "C\u2019est accept\xE9",
|
|
424
|
+
"builder.logic.operator.ignored": "Est ignor\xE9",
|
|
425
|
+
"builder.logic.consent.accepted": "C\u2019est accept\xE9",
|
|
426
|
+
"builder.logic.consent.ignored": "Est ignor\xE9",
|
|
427
|
+
"builder.block.showSettings": "Afficher les param\xE8tres du bloc",
|
|
428
|
+
"builder.block.hideSettings": "Masquer les param\xE8tres du bloc",
|
|
429
|
+
"builder.block.collapse": "R\xE9duire le bloc",
|
|
430
|
+
"builder.block.expand": "D\xE9plier le bloc",
|
|
209
431
|
"builder.categoryModal.title": "Cr\xE9er une cat\xE9gorie",
|
|
210
432
|
"builder.categoryModal.description": "Ajoutez une cat\xE9gorie et assignez-la \xE0 ce formulaire.",
|
|
211
433
|
"builder.categoryModal.nameLabel": "Nom",
|
|
@@ -221,6 +443,10 @@ const TRANSLATIONS = {
|
|
|
221
443
|
"renderer.error.loadForm": "Impossible de charger le formulaire",
|
|
222
444
|
"renderer.error.submit": "\xC9chec de l\u2019envoi",
|
|
223
445
|
"renderer.error.missingFormKey": "Cl\xE9 du formulaire manquante",
|
|
446
|
+
"renderer.submissionCodeLabel": "Code d\u2019acc\xE8s",
|
|
447
|
+
"renderer.submissionCodePlaceholder": "Entrez le code d\u2019acc\xE8s",
|
|
448
|
+
"renderer.formNotAvailableYet": "Ce formulaire n\u2019est pas encore disponible",
|
|
449
|
+
"renderer.formPaused": "Ce formulaire est en pause",
|
|
224
450
|
"renderer.alert.fixFields": "Veuillez corriger les champs suivants",
|
|
225
451
|
"renderer.alert.submitted": "Formulaire envoy\xE9",
|
|
226
452
|
"renderer.pageTitle": "Page {index}",
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { ref } from "#imports";
|
|
2
2
|
import { buildManagedFormData } from "../utils/form-data.js";
|
|
3
|
+
import { createDefaultAddressFields } from "../utils/defaults.js";
|
|
3
4
|
import { toFormForgeJsonSubmissionPayload } from "../utils/submission.js";
|
|
4
5
|
import { createFormForgeZodSchema, validateFormForgePayload } from "../validation/zod.js";
|
|
5
6
|
import { useFormForgeClient } from "./useFormForgeClient.js";
|
|
7
|
+
import { useFormForgeI18n } from "./useFormForgeI18n.js";
|
|
6
8
|
const RESERVED_SUBMISSION_FIELD_NAMES = [
|
|
7
9
|
"submitted_by_id",
|
|
8
10
|
"submitted_by_type",
|
|
@@ -91,12 +93,25 @@ function isOptionalFieldValueAbsent(field, value) {
|
|
|
91
93
|
if (field.type === "checkbox_group" && Array.isArray(value) && value.length === 0) {
|
|
92
94
|
return true;
|
|
93
95
|
}
|
|
94
|
-
if (
|
|
95
|
-
const
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
96
|
+
if (field.type === "address" && isPlainObject(value)) {
|
|
97
|
+
const addressValue = value;
|
|
98
|
+
const addressFields = Array.isArray(field.address_fields) && field.address_fields.length > 0 ? field.address_fields : createDefaultAddressFields().map((addressField) => ({
|
|
99
|
+
...addressField,
|
|
100
|
+
required: false
|
|
101
|
+
}));
|
|
102
|
+
const hasRequiredAddressField = addressFields.some((candidate) => candidate.visible !== false && (field.required || candidate.required));
|
|
103
|
+
if (hasRequiredAddressField) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
return Object.values(addressValue).every((item) => {
|
|
107
|
+
if (item === void 0 || item === null) {
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
if (typeof item === "string") {
|
|
111
|
+
return item.trim() === "";
|
|
112
|
+
}
|
|
113
|
+
return false;
|
|
114
|
+
});
|
|
100
115
|
}
|
|
101
116
|
if (Array.isArray(value) && value.length === 0) {
|
|
102
117
|
return true;
|
|
@@ -179,6 +194,9 @@ function pruneOptionalEmptyFields(payload, fields) {
|
|
|
179
194
|
}
|
|
180
195
|
export function useFormForgeSubmit(options) {
|
|
181
196
|
const client = options.client ?? useFormForgeClient(options.clientConfig);
|
|
197
|
+
const { locale } = useFormForgeI18n({
|
|
198
|
+
locale: () => options.clientConfig?.locale
|
|
199
|
+
});
|
|
182
200
|
const submitting = ref(false);
|
|
183
201
|
const fieldErrors = ref({});
|
|
184
202
|
const error = ref(null);
|
|
@@ -205,14 +223,18 @@ export function useFormForgeSubmit(options) {
|
|
|
205
223
|
try {
|
|
206
224
|
const shouldValidateLocal = submitOptions.validateLocal ?? options.validateLocal ?? true;
|
|
207
225
|
if (shouldValidateLocal) {
|
|
208
|
-
const localSchema = createFormForgeZodSchema(submittableSchema
|
|
209
|
-
|
|
226
|
+
const localSchema = createFormForgeZodSchema(submittableSchema, {
|
|
227
|
+
locale: locale.value
|
|
228
|
+
});
|
|
229
|
+
const localErrors = validateFormForgePayload(localSchema, payload, {
|
|
230
|
+
locale: locale.value
|
|
231
|
+
});
|
|
210
232
|
if (Object.keys(localErrors).length > 0) {
|
|
211
233
|
fieldErrors.value = localErrors;
|
|
212
234
|
throw {
|
|
213
235
|
status: 422,
|
|
214
236
|
code: "validation",
|
|
215
|
-
message: "Validation failed",
|
|
237
|
+
message: locale.value.startsWith("fr") ? "La validation a \xE9chou\xE9" : "Validation failed",
|
|
216
238
|
fieldErrors: localErrors
|
|
217
239
|
};
|
|
218
240
|
}
|
package/dist/runtime/index.d.ts
CHANGED
|
@@ -8,4 +8,5 @@ export { buildManagedFormData, buildJsonSubmitBody } from './utils/form-data.js'
|
|
|
8
8
|
export { toFormForgeJsonSubmissionPayload, toFormForgeJsonSubmissionValue } from './utils/submission.js';
|
|
9
9
|
export { normalizeFormForgeSchema } from './utils/schema.js';
|
|
10
10
|
export { normalizeFormForgeCategory, normalizeFormForgeCategoryListResponse, normalizeFormForgeCategoryOptions } from './utils/category.js';
|
|
11
|
+
export type { FormForgeBuilderExpose } from './composables/useFormForgeBuilder.js';
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -15,37 +15,56 @@ interface Props {
|
|
|
15
15
|
disableTitleInput?: boolean;
|
|
16
16
|
disableCategoryControl?: boolean;
|
|
17
17
|
disablePublishAction?: boolean;
|
|
18
|
+
disableSettingsTab?: boolean;
|
|
19
|
+
hideSettings?: boolean;
|
|
20
|
+
autoPublishOnSave?: boolean;
|
|
18
21
|
defaultPublished?: boolean;
|
|
22
|
+
standalone?: boolean;
|
|
19
23
|
}
|
|
20
|
-
declare
|
|
24
|
+
declare function save(): Promise<void>;
|
|
25
|
+
declare function publish(): Promise<void>;
|
|
26
|
+
declare function unpublish(): Promise<void>;
|
|
27
|
+
declare function togglePublishState(): Promise<void>;
|
|
28
|
+
declare const __VLS_export: import("vue").DefineComponent<Props, {
|
|
29
|
+
save: typeof save;
|
|
30
|
+
publish: typeof publish;
|
|
31
|
+
unpublish: typeof unpublish;
|
|
32
|
+
togglePublishState: typeof togglePublishState;
|
|
33
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
21
34
|
error: (value: string) => any;
|
|
22
35
|
"update:modelValue": (value: FormForgeBuilderDraft) => any;
|
|
23
36
|
save: (value: FormForgeBuilderDraft) => any;
|
|
24
37
|
publish: (value: FormForgeBuilderDraft) => any;
|
|
25
38
|
unpublish: (value: FormForgeBuilderDraft) => any;
|
|
39
|
+
"selection-change": (pageKey: string | null, fieldKey: string | null) => any;
|
|
26
40
|
}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{
|
|
27
41
|
onError?: ((value: string) => any) | undefined;
|
|
28
42
|
"onUpdate:modelValue"?: ((value: FormForgeBuilderDraft) => any) | undefined;
|
|
29
43
|
onSave?: ((value: FormForgeBuilderDraft) => any) | undefined;
|
|
30
44
|
onPublish?: ((value: FormForgeBuilderDraft) => any) | undefined;
|
|
31
45
|
onUnpublish?: ((value: FormForgeBuilderDraft) => any) | undefined;
|
|
46
|
+
"onSelection-change"?: ((pageKey: string | null, fieldKey: string | null) => any) | undefined;
|
|
32
47
|
}>, {
|
|
33
48
|
readonly: boolean;
|
|
34
49
|
locale: string;
|
|
35
50
|
endpoint: string;
|
|
36
51
|
categoryRouteKey: string;
|
|
52
|
+
modelValue: Partial<FormForgeBuilderDraft>;
|
|
37
53
|
formUuid: string;
|
|
38
54
|
formKey: string;
|
|
39
55
|
loadFormKey: string;
|
|
40
56
|
loadFormVersion: string;
|
|
41
57
|
formRouteKey: string;
|
|
42
|
-
modelValue: Partial<FormForgeBuilderDraft>;
|
|
43
58
|
autosave: boolean;
|
|
44
59
|
autosaveDelay: number;
|
|
45
60
|
disableTitleInput: boolean;
|
|
46
61
|
disableCategoryControl: boolean;
|
|
47
62
|
disablePublishAction: boolean;
|
|
63
|
+
disableSettingsTab: boolean;
|
|
64
|
+
hideSettings: boolean;
|
|
65
|
+
autoPublishOnSave: boolean;
|
|
48
66
|
defaultPublished: boolean;
|
|
67
|
+
standalone: boolean;
|
|
49
68
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
50
69
|
declare const _default: typeof __VLS_export;
|
|
51
70
|
export default _default;
|