@evanschleret/formforgeclient 1.2.4 → 2.0.1

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 (83) hide show
  1. package/README.md +10 -0
  2. package/dist/module.cjs +1 -0
  3. package/dist/module.d.cts +1 -0
  4. package/dist/module.d.mts +1 -0
  5. package/dist/module.d.ts +1 -0
  6. package/dist/module.json +1 -1
  7. package/dist/module.mjs +1 -0
  8. package/dist/runtime/api/client.js +4 -2
  9. package/dist/runtime/api/request.d.ts +1 -0
  10. package/dist/runtime/api/schema.js +4 -4
  11. package/dist/runtime/assets/formforge.css +1 -0
  12. package/dist/runtime/composables/index.d.ts +1 -1
  13. package/dist/runtime/composables/useFormForgeBuilder.d.ts +24 -2
  14. package/dist/runtime/composables/useFormForgeBuilder.js +299 -43
  15. package/dist/runtime/composables/useFormForgeForm.js +15 -5
  16. package/dist/runtime/composables/useFormForgeI18n.d.ts +299 -19
  17. package/dist/runtime/composables/useFormForgeI18n.js +299 -19
  18. package/dist/runtime/composables/useFormForgeSubmit.js +31 -9
  19. package/dist/runtime/index.d.ts +1 -0
  20. package/dist/runtime/renderers/default/FormForgeBuilder.d.vue.ts +21 -2
  21. package/dist/runtime/renderers/default/FormForgeBuilder.vue +689 -738
  22. package/dist/runtime/renderers/default/FormForgeBuilder.vue.d.ts +21 -2
  23. package/dist/runtime/renderers/default/FormForgeBuilderBlockSettingsModal.d.vue.ts +17 -0
  24. package/dist/runtime/renderers/default/FormForgeBuilderBlockSettingsModal.vue +32 -0
  25. package/dist/runtime/renderers/default/FormForgeBuilderBlockSettingsModal.vue.d.ts +17 -0
  26. package/dist/runtime/renderers/default/FormForgeRenderer.d.vue.ts +3 -4
  27. package/dist/runtime/renderers/default/FormForgeRenderer.vue +344 -294
  28. package/dist/runtime/renderers/default/FormForgeRenderer.vue.d.ts +3 -4
  29. package/dist/runtime/renderers/default/FormForgeRendererField.d.vue.ts +22 -0
  30. package/dist/runtime/renderers/default/FormForgeRendererField.vue +237 -0
  31. package/dist/runtime/renderers/default/FormForgeRendererField.vue.d.ts +22 -0
  32. package/dist/runtime/renderers/default/FormForgeRendererPage.d.vue.ts +18 -0
  33. package/dist/runtime/renderers/default/FormForgeRendererPage.vue +31 -0
  34. package/dist/runtime/renderers/default/FormForgeRendererPage.vue.d.ts +18 -0
  35. package/dist/runtime/renderers/default/FormForgeResponse.vue +4 -3
  36. package/dist/runtime/renderers/default/builder/FormForgeBuilderAddressFieldsCard.d.vue.ts +11 -0
  37. package/dist/runtime/renderers/default/builder/FormForgeBuilderAddressFieldsCard.vue +118 -0
  38. package/dist/runtime/renderers/default/builder/FormForgeBuilderAddressFieldsCard.vue.d.ts +11 -0
  39. package/dist/runtime/renderers/default/builder/FormForgeBuilderBlockCard.d.vue.ts +46 -0
  40. package/dist/runtime/renderers/default/builder/FormForgeBuilderBlockCard.vue +205 -0
  41. package/dist/runtime/renderers/default/builder/FormForgeBuilderBlockCard.vue.d.ts +46 -0
  42. package/dist/runtime/renderers/default/builder/FormForgeBuilderChoiceDisplayField.d.vue.ts +11 -0
  43. package/dist/runtime/renderers/default/builder/FormForgeBuilderChoiceDisplayField.vue +37 -0
  44. package/dist/runtime/renderers/default/builder/FormForgeBuilderChoiceDisplayField.vue.d.ts +11 -0
  45. package/dist/runtime/renderers/default/builder/FormForgeBuilderChoiceOptionsField.d.vue.ts +11 -0
  46. package/dist/runtime/renderers/default/builder/FormForgeBuilderChoiceOptionsField.vue +195 -0
  47. package/dist/runtime/renderers/default/builder/FormForgeBuilderChoiceOptionsField.vue.d.ts +11 -0
  48. package/dist/runtime/renderers/default/builder/FormForgeBuilderDescriptionField.d.vue.ts +14 -0
  49. package/dist/runtime/renderers/default/builder/FormForgeBuilderDescriptionField.vue +91 -0
  50. package/dist/runtime/renderers/default/builder/FormForgeBuilderDescriptionField.vue.d.ts +14 -0
  51. package/dist/runtime/renderers/default/builder/FormForgeBuilderLogicPanel.d.vue.ts +13 -0
  52. package/dist/runtime/renderers/default/builder/FormForgeBuilderLogicPanel.vue +387 -0
  53. package/dist/runtime/renderers/default/builder/FormForgeBuilderLogicPanel.vue.d.ts +13 -0
  54. package/dist/runtime/renderers/default/builder/FormForgeBuilderQuestionRow.d.vue.ts +44 -0
  55. package/dist/runtime/renderers/default/builder/FormForgeBuilderQuestionRow.vue +328 -0
  56. package/dist/runtime/renderers/default/builder/FormForgeBuilderQuestionRow.vue.d.ts +44 -0
  57. package/dist/runtime/renderers/default/builder/FormForgeBuilderTemporalModeField.d.vue.ts +11 -0
  58. package/dist/runtime/renderers/default/builder/FormForgeBuilderTemporalModeField.vue +47 -0
  59. package/dist/runtime/renderers/default/builder/FormForgeBuilderTemporalModeField.vue.d.ts +11 -0
  60. package/dist/runtime/renderers/default/builder/FormForgeBuilderValidationRulesSection.d.vue.ts +14 -0
  61. package/dist/runtime/renderers/default/builder/FormForgeBuilderValidationRulesSection.vue +595 -0
  62. package/dist/runtime/renderers/default/builder/FormForgeBuilderValidationRulesSection.vue.d.ts +14 -0
  63. package/dist/runtime/renderers/default/builder/builderFieldHelpers.d.ts +3 -0
  64. package/dist/runtime/renderers/default/builder/builderFieldHelpers.js +4 -0
  65. package/dist/runtime/types/index.d.ts +1 -1
  66. package/dist/runtime/types/management.d.ts +12 -0
  67. package/dist/runtime/types/schema.d.ts +72 -4
  68. package/dist/runtime/utils/defaults.d.ts +7 -0
  69. package/dist/runtime/utils/defaults.js +86 -0
  70. package/dist/runtime/utils/page-logic.d.ts +24 -0
  71. package/dist/runtime/utils/page-logic.js +351 -0
  72. package/dist/runtime/utils/rich-text.d.ts +3 -0
  73. package/dist/runtime/utils/rich-text.js +72 -0
  74. package/dist/runtime/utils/schema.d.ts +1 -1
  75. package/dist/runtime/utils/schema.js +70 -16
  76. package/dist/runtime/utils/temporal.d.ts +10 -0
  77. package/dist/runtime/utils/temporal.js +28 -0
  78. package/dist/runtime/utils/validation.d.ts +5 -0
  79. package/dist/runtime/utils/validation.js +36 -0
  80. package/dist/runtime/validation/zod.d.ts +5 -2
  81. package/dist/runtime/validation/zod.js +563 -54
  82. package/dist/types.d.mts +2 -0
  83. package/package.json +18 -14
@@ -1,54 +1,127 @@
1
1
  import { computed, useNuxtApp, useRuntimeConfig } from "#imports";
2
2
  const TRANSLATIONS = {
3
3
  en: {
4
- "builder.fieldType.text": "Short 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": "Select",
9
- "builder.fieldType.select_menu": "Select menu",
10
- "builder.fieldType.radio": "Multiple choice",
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.checkbox_group": "Checkbox group",
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
+ "builder.tabs.builder": "Builder",
21
+ "builder.tabs.settings": "Settings",
20
22
  "builder.targetType.page": "Page",
21
23
  "builder.targetType.field": "Field",
22
24
  "builder.formTitlePlaceholder": "Form title",
23
25
  "builder.categoryPlaceholder": "Category",
24
26
  "builder.categoryNone": "No category",
27
+ "builder.blockLabel": "Block",
28
+ "builder.blockCounter": "Block {current} / {total}",
29
+ "builder.block.addNewBlock": "Add new block",
30
+ "builder.block.addNewBlockDescription": "Start a new block with its first question",
31
+ "builder.questionLabel": "Question",
32
+ "builder.questionCount": "{count} questions",
25
33
  "builder.loadingForm": "Loading form...",
26
34
  "builder.lastSave": "Last save: {value}",
27
35
  "builder.save": "Save",
28
36
  "builder.publish": "Publish",
29
37
  "builder.unpublish": "Unpublish",
38
+ "builder.optional": "Optional",
30
39
  "builder.pageCounter": "Page {current} / {total}",
31
40
  "builder.pageTitlePlaceholder": "Page title",
32
41
  "builder.pageDescriptionPlaceholder": "Page description (optional)",
42
+ "builder.descriptionButton": "Add description",
43
+ "builder.descriptionPlaceholder": "Description (optional)",
44
+ "builder.removeDescription": "Remove description",
45
+ "builder.longResponse": "Long answer",
46
+ "builder.longResponseDescription": "Allow respondents to write longer responses over multiple lines.",
47
+ "builder.validationRules": "Validation rules",
48
+ "builder.validationRulesDescription": "Accept only responses that meet the following criteria.",
49
+ "builder.validation.match.all": "All are true",
50
+ "builder.validation.match.any": "At least one is true",
51
+ "builder.validation.operator.min": "Minimum",
52
+ "builder.validation.operator.max": "Maximum",
53
+ "builder.validation.operator.after": "Is after",
54
+ "builder.validation.operator.before": "Is before",
55
+ "builder.validation.operator.between": "Is between",
56
+ "builder.validation.operator.notBetween": "Is not between",
57
+ "builder.validation.operator.regex": "Matches regular expression",
58
+ "builder.validation.operator.eq": "Is",
59
+ "builder.validation.operator.neq": "Is not",
60
+ "builder.validation.operator.contains": "Contains",
61
+ "builder.validation.operator.notContains": "Does not contain",
62
+ "builder.validation.target.text": "Text",
63
+ "builder.validation.target.number": "Number",
64
+ "builder.validation.target.date": "Date",
65
+ "builder.validation.unit.characters": "Characters",
66
+ "builder.validation.valuePlaceholder": "Value",
67
+ "builder.validation.datePlaceholder": "YYYY-MM-DD",
68
+ "builder.validation.rangeStart": "Start date",
69
+ "builder.validation.rangeEnd": "End date",
70
+ "builder.validation.dateDescription": "Set the allowed date or time range.",
71
+ "builder.answerPlaceholder": "Enter your answer here ...",
72
+ "builder.choiceDisplay": "Display",
73
+ "builder.choiceDisplay.list": "List",
74
+ "builder.choiceDisplay.menu": "Dropdown",
75
+ "builder.consentLabel": "Checkbox label",
76
+ "builder.optionsLabel": "Options",
77
+ "builder.optionPlaceholder": "Option {index}",
78
+ "builder.optionOther": "Other",
79
+ "builder.optionNone": "None of the above",
80
+ "builder.addressFields": "Address fields",
81
+ "builder.address.show": "Show",
82
+ "builder.address.required": "Required",
83
+ "builder.address.label": "Label",
84
+ "builder.address.line1": "Address line 1",
85
+ "builder.address.line2": "Address line 2",
86
+ "builder.address.city": "City",
87
+ "builder.address.state": "State",
88
+ "builder.address.zip": "Zip",
89
+ "builder.address.country": "Country",
90
+ "builder.addOtherOption": 'Add "Other"',
91
+ "builder.addNoneOption": 'Add "None of the above"',
33
92
  "builder.tooltip.mergePage": "Merge with previous page",
34
93
  "builder.tooltip.deletePage": "Delete page",
35
94
  "builder.questionPlaceholder": "Question",
36
95
  "builder.tooltip.duplicateQuestion": "Duplicate question",
37
96
  "builder.tooltip.deleteQuestion": "Delete question",
38
97
  "builder.tooltip.addCategory": "Add category",
98
+ "builder.block.addQuestion": "Add question to block",
39
99
  "builder.required": "Required",
100
+ "builder.questionMenu.changeType": "Change question type",
101
+ "builder.questionMenu.addBelow": "Add question below",
102
+ "builder.questionMenu.moveToBlock": "Move question to block",
103
+ "builder.questionMenu.moveUp": "Move up",
104
+ "builder.questionMenu.moveDown": "Move down",
105
+ "builder.questionMenu.duplicate": "Duplicate",
106
+ "builder.questionMenu.delete": "Delete",
107
+ "builder.questionMenu.noBlockAfter": "No following block",
40
108
  "builder.optionLabelPlaceholder": "Option label",
41
109
  "builder.addOption": "Add option",
42
110
  "builder.advancedSettings": "Advanced settings",
43
111
  "builder.placeholderPlaceholder": "Placeholder",
44
112
  "builder.helpTextPlaceholder": "Help text",
113
+ "builder.temporalMode.label": "Date mode",
114
+ "builder.temporalMode.date": "Date",
115
+ "builder.temporalMode.time": "Time",
116
+ "builder.temporalHourCycle.label": "24-hour time format",
117
+ "builder.temporalHourCycle.description": "Use AM/PM only when this is disabled.",
45
118
  "builder.minPlaceholder": "Min",
46
119
  "builder.maxPlaceholder": "Max",
47
120
  "builder.stepPlaceholder": "Step",
48
121
  "builder.multiple": "Multiple",
49
122
  "builder.acceptedExtensionsPlaceholder": "Accepted extensions (.pdf,.png)",
50
- "builder.conditions": "Conditions",
51
- "builder.addCondition": "Add condition",
123
+ "builder.conditions": "Conditional logic",
124
+ "builder.addCondition": "Add logic rule",
52
125
  "builder.condition.action.show": "Show",
53
126
  "builder.condition.action.hide": "Hide",
54
127
  "builder.condition.action.skip": "Skip",
@@ -85,6 +158,69 @@ const TRANSLATIONS = {
85
158
  "builder.toast.unpublishSuccess": "Form unpublished",
86
159
  "builder.optionDefaultLabel": "Option",
87
160
  "builder.optionsCount": "{count} options",
161
+ "builder.settings.title": "Settings",
162
+ "builder.settings.description": "Configure the lifecycle, access, and publication settings for this form.",
163
+ "builder.settings.formTitlePlaceholder": "Form title",
164
+ "builder.settings.categoryPlaceholder": "Category",
165
+ "builder.settings.opening.title": "Survey opening",
166
+ "builder.settings.opening.description": "Choose when the form becomes available.",
167
+ "builder.settings.opening.date": "Opening date",
168
+ "builder.settings.opening.time": "Opening time",
169
+ "builder.settings.closing.title": "Survey closing",
170
+ "builder.settings.closing.description": "Choose when the form stops accepting responses.",
171
+ "builder.settings.closing.date": "Closing date",
172
+ "builder.settings.closing.time": "Closing time",
173
+ "builder.settings.submissionLimit.title": "Submission limit",
174
+ "builder.settings.submissionLimit.description": "The form closes automatically after this many responses.",
175
+ "builder.settings.submissionLimit.maximumResponses": "Maximum responses",
176
+ "builder.settings.access.title": "Access",
177
+ "builder.settings.access.description": "Control who can submit the form and whether a PIN is required.",
178
+ "builder.settings.access.publicForm.title": "Public form",
179
+ "builder.settings.access.publicForm.description": "Allow anyone with the link to submit responses.",
180
+ "builder.settings.access.publicLink": "Public link",
181
+ "builder.settings.access.publicLinkPlaceholder": "Save the form to generate a link",
182
+ "builder.settings.access.pinProtection.title": "PIN protection",
183
+ "builder.settings.access.pinProtection.description": "Require a PIN before the form can be submitted.",
184
+ "builder.settings.access.pin": "PIN",
185
+ "builder.settings.access.pinPlaceholder": "Enter PIN",
186
+ "builder.logic.title": "Conditional logic",
187
+ "builder.logic.empty": "No logic rule yet",
188
+ "builder.logic.rulesCount": "{count} logic rules",
189
+ "builder.logic.addRule": "Add logic rule",
190
+ "builder.logic.rule": "When",
191
+ "builder.logic.addClause": "Add clause",
192
+ "builder.logic.then.addAction": "Add action",
193
+ "builder.logic.match.all": "All are true",
194
+ "builder.logic.match.any": "At least one is true",
195
+ "builder.logic.then": "Then",
196
+ "builder.logic.then.require": "Required answer",
197
+ "builder.logic.then.goto": "Go to block",
198
+ "builder.logic.fallback": "All other responses will continue to",
199
+ "builder.logic.fallback.next": "Next block",
200
+ "builder.logic.fallback.goto": "Destination block",
201
+ "builder.logic.requireQuestionPlaceholder": "Future question",
202
+ "builder.logic.gotoBlockPlaceholder": "Destination block",
203
+ "builder.logic.gotoBlockPlaceholderAfter": "Block {index}",
204
+ "builder.logic.destinationBlockLabel": "Block {index}",
205
+ "builder.logic.valuePlaceholder": "Value",
206
+ "builder.logic.operator.eq": "Equals",
207
+ "builder.logic.operator.neq": "Does not equal",
208
+ "builder.logic.operator.contains": "Contains",
209
+ "builder.logic.operator.not_contains": "Does not contain",
210
+ "builder.logic.operator.starts_with": "Starts with",
211
+ "builder.logic.operator.not_starts_with": "Does not start with",
212
+ "builder.logic.operator.ends_with": "Ends with",
213
+ "builder.logic.operator.not_ends_with": "Does not end with",
214
+ "builder.logic.operator.is_submitted": "Is submitted",
215
+ "builder.logic.operator.is_not_submitted": "Is not submitted",
216
+ "builder.logic.operator.accepted": "Is accepted",
217
+ "builder.logic.operator.ignored": "Is ignored",
218
+ "builder.block.showSettings": "Show block settings",
219
+ "builder.block.hideSettings": "Hide block settings",
220
+ "builder.block.collapse": "Collapse block",
221
+ "builder.block.expand": "Expand block",
222
+ "builder.logic.consent.accepted": "Is accepted",
223
+ "builder.logic.consent.ignored": "Is ignored",
88
224
  "builder.categoryModal.title": "Create category",
89
225
  "builder.categoryModal.description": "Add a category and assign it to this form.",
90
226
  "builder.categoryModal.nameLabel": "Name",
@@ -100,6 +236,10 @@ const TRANSLATIONS = {
100
236
  "renderer.error.loadForm": "Unable to load form",
101
237
  "renderer.error.submit": "Submission failed",
102
238
  "renderer.error.missingFormKey": "Missing form key",
239
+ "renderer.submissionCodeLabel": "Access code",
240
+ "renderer.submissionCodePlaceholder": "Enter the access code",
241
+ "renderer.formNotAvailableYet": "This form is not available yet",
242
+ "renderer.formPaused": "This form is paused",
103
243
  "renderer.alert.fixFields": "Please fix the following fields",
104
244
  "renderer.alert.submitted": "Form submitted",
105
245
  "renderer.pageTitle": "Page {index}",
@@ -122,54 +262,127 @@ const TRANSLATIONS = {
122
262
  "response.file.missingUrlHint": "File URL is unavailable. Enable FORMFORGE_HTTP_FILE_URLS_ENABLED in FormForge config."
123
263
  },
124
264
  fr: {
125
- "builder.fieldType.text": "R\xE9ponse courte",
265
+ "builder.fieldType.text": "Texte libre",
126
266
  "builder.fieldType.textarea": "R\xE9ponse longue",
127
267
  "builder.fieldType.email": "E-mail",
128
268
  "builder.fieldType.number": "Nombre",
129
269
  "builder.fieldType.select": "S\xE9lection",
130
- "builder.fieldType.select_menu": "Menu de s\xE9lection",
131
- "builder.fieldType.radio": "Choix multiples",
270
+ "builder.fieldType.select_menu": "Menu d\xE9roulant",
271
+ "builder.fieldType.radio": "Choix unique",
132
272
  "builder.fieldType.checkbox": "Case \xE0 cocher",
133
- "builder.fieldType.checkbox_group": "Groupe de cases",
273
+ "builder.fieldType.consent": "Consentement",
274
+ "builder.fieldType.checkbox_group": "Choix multiples",
275
+ "builder.fieldType.address": "Adresse",
134
276
  "builder.fieldType.switch": "Interrupteur",
277
+ "builder.fieldType.temporal": "Date / heure",
135
278
  "builder.fieldType.date": "Date",
136
279
  "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
280
  "builder.fieldType.file": "T\xE9l\xE9versement de fichier",
281
+ "builder.tabs.builder": "Constructeur",
282
+ "builder.tabs.settings": "Param\xE8tres",
141
283
  "builder.targetType.page": "Page",
142
284
  "builder.targetType.field": "Champ",
143
285
  "builder.formTitlePlaceholder": "Titre du formulaire",
144
286
  "builder.categoryPlaceholder": "Cat\xE9gorie",
145
287
  "builder.categoryNone": "Aucune cat\xE9gorie",
288
+ "builder.blockLabel": "Bloc",
289
+ "builder.blockCounter": "Bloc {current} / {total}",
290
+ "builder.block.addNewBlock": "Ajouter un nouveau bloc",
291
+ "builder.block.addNewBlockDescription": "Commencez un bloc avec sa premi\xE8re question",
292
+ "builder.questionLabel": "Question",
293
+ "builder.questionCount": "{count} questions",
146
294
  "builder.loadingForm": "Chargement du formulaire...",
147
295
  "builder.lastSave": "Derni\xE8re sauvegarde : {value}",
148
296
  "builder.save": "Sauvegarder",
149
297
  "builder.publish": "Publier",
150
298
  "builder.unpublish": "D\xE9publier",
299
+ "builder.optional": "Optionnel",
151
300
  "builder.pageCounter": "Page {current} / {total}",
152
301
  "builder.pageTitlePlaceholder": "Titre de la page",
153
302
  "builder.pageDescriptionPlaceholder": "Description de la page (optionnel)",
303
+ "builder.descriptionButton": "Ajouter une description",
304
+ "builder.descriptionPlaceholder": "Description (optionnelle)",
305
+ "builder.removeDescription": "Retirer la description",
306
+ "builder.longResponse": "Longue r\xE9ponse",
307
+ "builder.longResponseDescription": "Permettre aux r\xE9pondants d'\xE9crire des r\xE9ponses plus longues et sur plusieurs lignes.",
308
+ "builder.validationRules": "R\xE8gles de validation",
309
+ "builder.validationRulesDescription": "Accepter uniquement les r\xE9ponses qui r\xE9pondent aux crit\xE8res suivants",
310
+ "builder.validation.match.all": "Toutes sont vraies",
311
+ "builder.validation.match.any": "Au moins une est vraie",
312
+ "builder.validation.operator.min": "Au minimum",
313
+ "builder.validation.operator.max": "Au maximum",
314
+ "builder.validation.operator.after": "Est post\xE9rieur \xE0",
315
+ "builder.validation.operator.before": "Est ant\xE9rieur \xE0",
316
+ "builder.validation.operator.between": "Est entre",
317
+ "builder.validation.operator.notBetween": "N'est pas entre",
318
+ "builder.validation.operator.regex": "Correspond au mod\xE8le d'expression r\xE9guli\xE8re",
319
+ "builder.validation.operator.eq": "Est",
320
+ "builder.validation.operator.neq": "N'est pas",
321
+ "builder.validation.operator.contains": "Contient",
322
+ "builder.validation.operator.notContains": "Ne contient pas",
323
+ "builder.validation.target.text": "Texte",
324
+ "builder.validation.target.number": "Nombre",
325
+ "builder.validation.target.date": "Date",
326
+ "builder.validation.unit.characters": "Caract\xE8res",
327
+ "builder.validation.valuePlaceholder": "Valeur",
328
+ "builder.validation.datePlaceholder": "AAAA-MM-JJ",
329
+ "builder.validation.rangeStart": "Date de d\xE9but",
330
+ "builder.validation.rangeEnd": "Date de fin",
331
+ "builder.validation.dateDescription": "D\xE9finir l'intervalle de dates ou d'heures autoris\xE9.",
332
+ "builder.answerPlaceholder": "Entrez votre r\xE9ponse ici ...",
333
+ "builder.choiceDisplay": "Affichage",
334
+ "builder.choiceDisplay.list": "Liste",
335
+ "builder.choiceDisplay.menu": "Menu d\xE9roulant",
336
+ "builder.consentLabel": "Libell\xE9 de la case \xE0 cocher",
337
+ "builder.optionsLabel": "Options",
338
+ "builder.optionPlaceholder": "Option {index}",
339
+ "builder.optionOther": "Autre",
340
+ "builder.optionNone": "Aucun des \xE9l\xE9ments ci-dessus",
341
+ "builder.addressFields": "Champs d'adresse",
342
+ "builder.address.show": "Montrer",
343
+ "builder.address.required": "Requis",
344
+ "builder.address.label": "\xC9tiquette",
345
+ "builder.address.line1": "Ligne d'adresse 1",
346
+ "builder.address.line2": "Ligne d'adresse 2",
347
+ "builder.address.city": "Ville",
348
+ "builder.address.state": "\xC9tat",
349
+ "builder.address.zip": "Code postal",
350
+ "builder.address.country": "Pays",
351
+ "builder.addOtherOption": 'Ajouter "Autre"',
352
+ "builder.addNoneOption": 'Ajouter "Aucun des \xE9l\xE9ments ci-dessus"',
154
353
  "builder.tooltip.mergePage": "Fusionner avec la page pr\xE9c\xE9dente",
155
354
  "builder.tooltip.deletePage": "Supprimer la page",
156
355
  "builder.questionPlaceholder": "Question",
157
356
  "builder.tooltip.duplicateQuestion": "Dupliquer la question",
158
357
  "builder.tooltip.deleteQuestion": "Supprimer la question",
159
358
  "builder.tooltip.addCategory": "Ajouter une cat\xE9gorie",
359
+ "builder.block.addQuestion": "Ajouter une question au bloc",
160
360
  "builder.required": "Obligatoire",
361
+ "builder.questionMenu.changeType": "Changer le type de question",
362
+ "builder.questionMenu.addBelow": "Ajouter une question ci-dessous",
363
+ "builder.questionMenu.moveToBlock": "D\xE9placer la question vers le bloc",
364
+ "builder.questionMenu.moveUp": "D\xE9placer vers le haut",
365
+ "builder.questionMenu.moveDown": "D\xE9placer vers le bas",
366
+ "builder.questionMenu.duplicate": "Dupliquer",
367
+ "builder.questionMenu.delete": "Supprimer",
368
+ "builder.questionMenu.noBlockAfter": "Aucun bloc suivant",
161
369
  "builder.optionLabelPlaceholder": "Libell\xE9 de l\u2019option",
162
370
  "builder.addOption": "Ajouter une option",
163
371
  "builder.advancedSettings": "Param\xE8tres avanc\xE9s",
164
372
  "builder.placeholderPlaceholder": "Placeholder",
165
373
  "builder.helpTextPlaceholder": "Texte d\u2019aide",
374
+ "builder.temporalMode.label": "Mode de date",
375
+ "builder.temporalMode.date": "Date",
376
+ "builder.temporalMode.time": "Heure",
377
+ "builder.temporalHourCycle.label": "Format horaire 24 h",
378
+ "builder.temporalHourCycle.description": "Afficher AM/PM uniquement lorsque ce r\xE9glage est d\xE9sactiv\xE9.",
166
379
  "builder.minPlaceholder": "Min",
167
380
  "builder.maxPlaceholder": "Max",
168
381
  "builder.stepPlaceholder": "Pas",
169
382
  "builder.multiple": "Multiple",
170
383
  "builder.acceptedExtensionsPlaceholder": "Extensions accept\xE9es (.pdf,.png)",
171
- "builder.conditions": "Conditions",
172
- "builder.addCondition": "Ajouter une condition",
384
+ "builder.conditions": "Logique conditionnelle",
385
+ "builder.addCondition": "Ajouter une r\xE8gle de logique",
173
386
  "builder.condition.action.show": "Afficher",
174
387
  "builder.condition.action.hide": "Masquer",
175
388
  "builder.condition.action.skip": "Passer",
@@ -206,6 +419,69 @@ const TRANSLATIONS = {
206
419
  "builder.toast.unpublishSuccess": "Formulaire d\xE9publi\xE9",
207
420
  "builder.optionDefaultLabel": "Option",
208
421
  "builder.optionsCount": "{count} options",
422
+ "builder.settings.title": "Param\xE8tres",
423
+ "builder.settings.description": "Configurez le cycle de vie, l\u2019acc\xE8s et les param\xE8tres de publication de ce formulaire.",
424
+ "builder.settings.formTitlePlaceholder": "Titre du formulaire",
425
+ "builder.settings.categoryPlaceholder": "Cat\xE9gorie",
426
+ "builder.settings.opening.title": "Ouverture du sondage",
427
+ "builder.settings.opening.description": "Choisissez quand le formulaire devient disponible.",
428
+ "builder.settings.opening.date": "Date d\u2019ouverture",
429
+ "builder.settings.opening.time": "Heure d\u2019ouverture",
430
+ "builder.settings.closing.title": "Fermeture du sondage",
431
+ "builder.settings.closing.description": "Choisissez quand le formulaire cesse d\u2019accepter des r\xE9ponses.",
432
+ "builder.settings.closing.date": "Date de fermeture",
433
+ "builder.settings.closing.time": "Heure de fermeture",
434
+ "builder.settings.submissionLimit.title": "Limite de r\xE9ponses",
435
+ "builder.settings.submissionLimit.description": "Le formulaire se ferme automatiquement apr\xE8s ce nombre de r\xE9ponses.",
436
+ "builder.settings.submissionLimit.maximumResponses": "Nombre maximal de r\xE9ponses",
437
+ "builder.settings.access.title": "Acc\xE8s",
438
+ "builder.settings.access.description": "Contr\xF4lez qui peut r\xE9pondre au formulaire et si un code PIN est requis.",
439
+ "builder.settings.access.publicForm.title": "Formulaire public",
440
+ "builder.settings.access.publicForm.description": "Autorisez toute personne ayant le lien \xE0 envoyer des r\xE9ponses.",
441
+ "builder.settings.access.publicLink": "Lien public",
442
+ "builder.settings.access.publicLinkPlaceholder": "Enregistrez le formulaire pour g\xE9n\xE9rer un lien",
443
+ "builder.settings.access.pinProtection.title": "Protection par PIN",
444
+ "builder.settings.access.pinProtection.description": "Exiger un code PIN avant l\u2019envoi du formulaire.",
445
+ "builder.settings.access.pin": "PIN",
446
+ "builder.settings.access.pinPlaceholder": "Saisissez le PIN",
447
+ "builder.logic.title": "Logique conditionnelle",
448
+ "builder.logic.empty": "Aucune r\xE8gle de logique",
449
+ "builder.logic.rulesCount": "{count} r\xE8gles de logique",
450
+ "builder.logic.addRule": "Ajouter une r\xE8gle de logique",
451
+ "builder.logic.rule": "Quand",
452
+ "builder.logic.addClause": "Ajouter une clause",
453
+ "builder.logic.then.addAction": "Ajouter une action",
454
+ "builder.logic.match.all": "Toutes sont vraies",
455
+ "builder.logic.match.any": "Au moins une est vraie",
456
+ "builder.logic.then": "Alors",
457
+ "builder.logic.then.require": "R\xE9ponse requise",
458
+ "builder.logic.then.goto": "Aller au bloc",
459
+ "builder.logic.fallback": "Toutes les autres r\xE9ponses continueront \xE0",
460
+ "builder.logic.fallback.next": "Bloc suivant",
461
+ "builder.logic.fallback.goto": "Bloc de destination",
462
+ "builder.logic.requireQuestionPlaceholder": "Question future",
463
+ "builder.logic.gotoBlockPlaceholder": "Bloc de destination",
464
+ "builder.logic.gotoBlockPlaceholderAfter": "Bloc {index}",
465
+ "builder.logic.destinationBlockLabel": "Bloc {index}",
466
+ "builder.logic.valuePlaceholder": "Valeur",
467
+ "builder.logic.operator.eq": "\xC9gal \xE0",
468
+ "builder.logic.operator.neq": "Diff\xE9rent de",
469
+ "builder.logic.operator.contains": "Contient",
470
+ "builder.logic.operator.not_contains": "Ne contient pas",
471
+ "builder.logic.operator.starts_with": "Commence par",
472
+ "builder.logic.operator.not_starts_with": "Ne commence pas par",
473
+ "builder.logic.operator.ends_with": "Se termine par",
474
+ "builder.logic.operator.not_ends_with": "Ne se termine pas par",
475
+ "builder.logic.operator.is_submitted": "Est soumis",
476
+ "builder.logic.operator.is_not_submitted": "N\u2019est pas soumis",
477
+ "builder.logic.operator.accepted": "C\u2019est accept\xE9",
478
+ "builder.logic.operator.ignored": "Est ignor\xE9",
479
+ "builder.logic.consent.accepted": "C\u2019est accept\xE9",
480
+ "builder.logic.consent.ignored": "Est ignor\xE9",
481
+ "builder.block.showSettings": "Afficher les param\xE8tres du bloc",
482
+ "builder.block.hideSettings": "Masquer les param\xE8tres du bloc",
483
+ "builder.block.collapse": "R\xE9duire le bloc",
484
+ "builder.block.expand": "D\xE9plier le bloc",
209
485
  "builder.categoryModal.title": "Cr\xE9er une cat\xE9gorie",
210
486
  "builder.categoryModal.description": "Ajoutez une cat\xE9gorie et assignez-la \xE0 ce formulaire.",
211
487
  "builder.categoryModal.nameLabel": "Nom",
@@ -221,6 +497,10 @@ const TRANSLATIONS = {
221
497
  "renderer.error.loadForm": "Impossible de charger le formulaire",
222
498
  "renderer.error.submit": "\xC9chec de l\u2019envoi",
223
499
  "renderer.error.missingFormKey": "Cl\xE9 du formulaire manquante",
500
+ "renderer.submissionCodeLabel": "Code d\u2019acc\xE8s",
501
+ "renderer.submissionCodePlaceholder": "Entrez le code d\u2019acc\xE8s",
502
+ "renderer.formNotAvailableYet": "Ce formulaire n\u2019est pas encore disponible",
503
+ "renderer.formPaused": "Ce formulaire est en pause",
224
504
  "renderer.alert.fixFields": "Veuillez corriger les champs suivants",
225
505
  "renderer.alert.submitted": "Formulaire envoy\xE9",
226
506
  "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 ((field.type === "date_range" || field.type === "datetime_range") && isPlainObject(value)) {
95
- const start = value.start;
96
- const end = value.end;
97
- const startEmpty = start === void 0 || start === null || start === "";
98
- const endEmpty = end === void 0 || end === null || end === "";
99
- return startEmpty && endEmpty;
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
- const localErrors = validateFormForgePayload(localSchema, payload);
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
  }
@@ -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 const __VLS_export: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
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;