@stapel/forms-react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/MODULE.md +172 -0
  3. package/README.md +207 -0
  4. package/dist/api/export.d.ts +66 -0
  5. package/dist/api/export.d.ts.map +1 -0
  6. package/dist/api/export.js +138 -0
  7. package/dist/api/export.js.map +1 -0
  8. package/dist/api/extensions.d.ts +8 -0
  9. package/dist/api/extensions.d.ts.map +1 -0
  10. package/dist/api/extensions.js +8 -0
  11. package/dist/api/extensions.js.map +1 -0
  12. package/dist/api/formsApi.d.ts +113 -0
  13. package/dist/api/formsApi.d.ts.map +1 -0
  14. package/dist/api/formsApi.js +81 -0
  15. package/dist/api/formsApi.js.map +1 -0
  16. package/dist/api/generated/schema.d.ts +987 -0
  17. package/dist/api/generated/schema.d.ts.map +1 -0
  18. package/dist/api/generated/schema.js +2 -0
  19. package/dist/api/generated/schema.js.map +1 -0
  20. package/dist/api/types.d.ts +222 -0
  21. package/dist/api/types.d.ts.map +1 -0
  22. package/dist/api/types.js +14 -0
  23. package/dist/api/types.js.map +1 -0
  24. package/dist/default/ConfigField.d.ts +32 -0
  25. package/dist/default/ConfigField.d.ts.map +1 -0
  26. package/dist/default/ConfigField.js +101 -0
  27. package/dist/default/ConfigField.js.map +1 -0
  28. package/dist/default/ErrorAlert.d.ts +9 -0
  29. package/dist/default/ErrorAlert.d.ts.map +1 -0
  30. package/dist/default/ErrorAlert.js +27 -0
  31. package/dist/default/ErrorAlert.js.map +1 -0
  32. package/dist/default/FormBuilderPane.d.ts +36 -0
  33. package/dist/default/FormBuilderPane.d.ts.map +1 -0
  34. package/dist/default/FormBuilderPane.js +70 -0
  35. package/dist/default/FormBuilderPane.js.map +1 -0
  36. package/dist/default/FormsListPane.d.ts +18 -0
  37. package/dist/default/FormsListPane.d.ts.map +1 -0
  38. package/dist/default/FormsListPane.js +28 -0
  39. package/dist/default/FormsListPane.js.map +1 -0
  40. package/dist/default/ResponsesPane.d.ts +21 -0
  41. package/dist/default/ResponsesPane.d.ts.map +1 -0
  42. package/dist/default/ResponsesPane.js +118 -0
  43. package/dist/default/ResponsesPane.js.map +1 -0
  44. package/dist/default/StapelForm.d.ts +76 -0
  45. package/dist/default/StapelForm.d.ts.map +1 -0
  46. package/dist/default/StapelForm.js +118 -0
  47. package/dist/default/StapelForm.js.map +1 -0
  48. package/dist/default/fields.d.ts +11 -0
  49. package/dist/default/fields.d.ts.map +1 -0
  50. package/dist/default/fields.js +273 -0
  51. package/dist/default/fields.js.map +1 -0
  52. package/dist/default/index.d.ts +42 -0
  53. package/dist/default/index.d.ts.map +1 -0
  54. package/dist/default/index.js +37 -0
  55. package/dist/default/index.js.map +1 -0
  56. package/dist/default/slots.d.ts +59 -0
  57. package/dist/default/slots.d.ts.map +1 -0
  58. package/dist/default/slots.js +25 -0
  59. package/dist/default/slots.js.map +1 -0
  60. package/dist/default/theme.d.ts +23 -0
  61. package/dist/default/theme.d.ts.map +1 -0
  62. package/dist/default/theme.js +38 -0
  63. package/dist/default/theme.js.map +1 -0
  64. package/dist/default/types.d.ts +12 -0
  65. package/dist/default/types.d.ts.map +1 -0
  66. package/dist/default/types.js +2 -0
  67. package/dist/default/types.js.map +1 -0
  68. package/dist/flows/errors.d.ts +12 -0
  69. package/dist/flows/errors.d.ts.map +1 -0
  70. package/dist/flows/errors.js +13 -0
  71. package/dist/flows/errors.js.map +1 -0
  72. package/dist/flows/registry.d.ts +22 -0
  73. package/dist/flows/registry.d.ts.map +1 -0
  74. package/dist/flows/registry.js +20 -0
  75. package/dist/flows/registry.js.map +1 -0
  76. package/dist/headless/FormBuilder.d.ts +100 -0
  77. package/dist/headless/FormBuilder.d.ts.map +1 -0
  78. package/dist/headless/FormBuilder.js +278 -0
  79. package/dist/headless/FormBuilder.js.map +1 -0
  80. package/dist/headless/FormFill.d.ts +88 -0
  81. package/dist/headless/FormFill.d.ts.map +1 -0
  82. package/dist/headless/FormFill.js +279 -0
  83. package/dist/headless/FormFill.js.map +1 -0
  84. package/dist/headless/FormList.d.ts +34 -0
  85. package/dist/headless/FormList.d.ts.map +1 -0
  86. package/dist/headless/FormList.js +37 -0
  87. package/dist/headless/FormList.js.map +1 -0
  88. package/dist/headless/FormsProvider.d.ts +19 -0
  89. package/dist/headless/FormsProvider.d.ts.map +1 -0
  90. package/dist/headless/FormsProvider.js +15 -0
  91. package/dist/headless/FormsProvider.js.map +1 -0
  92. package/dist/headless/ResponsesTable.d.ts +82 -0
  93. package/dist/headless/ResponsesTable.d.ts.map +1 -0
  94. package/dist/headless/ResponsesTable.js +195 -0
  95. package/dist/headless/ResponsesTable.js.map +1 -0
  96. package/dist/i18n/errorsMap.d.ts +10 -0
  97. package/dist/i18n/errorsMap.d.ts.map +1 -0
  98. package/dist/i18n/errorsMap.js +20 -0
  99. package/dist/i18n/errorsMap.js.map +1 -0
  100. package/dist/i18n/es.d.ts +7 -0
  101. package/dist/i18n/es.d.ts.map +1 -0
  102. package/dist/i18n/es.js +118 -0
  103. package/dist/i18n/es.js.map +1 -0
  104. package/dist/i18n/generated/errors.es.gen.d.ts +16 -0
  105. package/dist/i18n/generated/errors.es.gen.d.ts.map +1 -0
  106. package/dist/i18n/generated/errors.es.gen.js +79 -0
  107. package/dist/i18n/generated/errors.es.gen.js.map +1 -0
  108. package/dist/i18n/generated/errors.gen.d.ts +485 -0
  109. package/dist/i18n/generated/errors.gen.d.ts.map +1 -0
  110. package/dist/i18n/generated/errors.gen.js +246 -0
  111. package/dist/i18n/generated/errors.gen.js.map +1 -0
  112. package/dist/i18n/generated/errors.ru.gen.d.ts +16 -0
  113. package/dist/i18n/generated/errors.ru.gen.d.ts.map +1 -0
  114. package/dist/i18n/generated/errors.ru.gen.js +79 -0
  115. package/dist/i18n/generated/errors.ru.gen.js.map +1 -0
  116. package/dist/i18n/keys.d.ts +141 -0
  117. package/dist/i18n/keys.d.ts.map +1 -0
  118. package/dist/i18n/keys.js +233 -0
  119. package/dist/i18n/keys.js.map +1 -0
  120. package/dist/i18n/ru.d.ts +7 -0
  121. package/dist/i18n/ru.d.ts.map +1 -0
  122. package/dist/i18n/ru.js +127 -0
  123. package/dist/i18n/ru.js.map +1 -0
  124. package/dist/index.d.ts +61 -0
  125. package/dist/index.d.ts.map +1 -0
  126. package/dist/index.js +55 -0
  127. package/dist/index.js.map +1 -0
  128. package/dist/model/context.d.ts +11 -0
  129. package/dist/model/context.d.ts.map +1 -0
  130. package/dist/model/context.js +16 -0
  131. package/dist/model/context.js.map +1 -0
  132. package/dist/model/mutations.d.ts +135 -0
  133. package/dist/model/mutations.d.ts.map +1 -0
  134. package/dist/model/mutations.js +223 -0
  135. package/dist/model/mutations.js.map +1 -0
  136. package/dist/model/queries.d.ts +59 -0
  137. package/dist/model/queries.d.ts.map +1 -0
  138. package/dist/model/queries.js +117 -0
  139. package/dist/model/queries.js.map +1 -0
  140. package/dist/model/queryKeys.d.ts +28 -0
  141. package/dist/model/queryKeys.d.ts.map +1 -0
  142. package/dist/model/queryKeys.js +23 -0
  143. package/dist/model/queryKeys.js.map +1 -0
  144. package/dist/model/runtime.d.ts +28 -0
  145. package/dist/model/runtime.d.ts.map +1 -0
  146. package/dist/model/runtime.js +14 -0
  147. package/dist/model/runtime.js.map +1 -0
  148. package/dist/widgets/configForms.d.ts +112 -0
  149. package/dist/widgets/configForms.d.ts.map +1 -0
  150. package/dist/widgets/configForms.js +211 -0
  151. package/dist/widgets/configForms.js.map +1 -0
  152. package/dist/widgets/registry.d.ts +83 -0
  153. package/dist/widgets/registry.d.ts.map +1 -0
  154. package/dist/widgets/registry.js +27 -0
  155. package/dist/widgets/registry.js.map +1 -0
  156. package/dist/widgets/validate.d.ts +57 -0
  157. package/dist/widgets/validate.d.ts.map +1 -0
  158. package/dist/widgets/validate.js +173 -0
  159. package/dist/widgets/validate.js.map +1 -0
  160. package/llms.txt +124 -0
  161. package/manifest.json +1038 -0
  162. package/package.json +108 -0
  163. package/src/analytics/generated/events.json +7 -0
  164. package/src/api/export.ts +195 -0
  165. package/src/api/extensions.ts +7 -0
  166. package/src/api/formsApi.ts +329 -0
  167. package/src/api/generated/schema.ts +989 -0
  168. package/src/api/types.ts +276 -0
  169. package/src/default/ConfigField.tsx +227 -0
  170. package/src/default/ErrorAlert.tsx +46 -0
  171. package/src/default/FormBuilderPane.tsx +414 -0
  172. package/src/default/FormsListPane.tsx +144 -0
  173. package/src/default/ResponsesPane.tsx +332 -0
  174. package/src/default/StapelForm.tsx +377 -0
  175. package/src/default/fields.tsx +454 -0
  176. package/src/default/index.ts +71 -0
  177. package/src/default/slots.ts +78 -0
  178. package/src/default/theme.tsx +65 -0
  179. package/src/default/types.ts +12 -0
  180. package/src/flows/errors.ts +16 -0
  181. package/src/flows/registry.ts +32 -0
  182. package/src/headless/FormBuilder.tsx +453 -0
  183. package/src/headless/FormFill.tsx +396 -0
  184. package/src/headless/FormList.tsx +74 -0
  185. package/src/headless/FormsProvider.tsx +20 -0
  186. package/src/headless/ResponsesTable.tsx +341 -0
  187. package/src/i18n/errorsMap.ts +31 -0
  188. package/src/i18n/es.ts +140 -0
  189. package/src/i18n/generated/errors.es.gen.ts +85 -0
  190. package/src/i18n/generated/errors.gen.ts +277 -0
  191. package/src/i18n/generated/errors.json +583 -0
  192. package/src/i18n/generated/errors.ru.gen.ts +85 -0
  193. package/src/i18n/keys.ts +264 -0
  194. package/src/i18n/ru.ts +150 -0
  195. package/src/index.ts +184 -0
  196. package/src/model/context.tsx +28 -0
  197. package/src/model/mutations.ts +387 -0
  198. package/src/model/queries.ts +154 -0
  199. package/src/model/queryKeys.ts +61 -0
  200. package/src/model/runtime.ts +48 -0
  201. package/src/widgets/registry.ts +101 -0
  202. package/src/widgets/validate.ts +224 -0
  203. package/tsconfig.json +26 -0
@@ -0,0 +1,989 @@
1
+ // AUTO-GENERATED by scripts/gen-api.mjs — do not edit by hand.
2
+ // Source: the backend module's own docs/schema.json (§17-native per-module contract).
3
+ // Regenerate: pnpm gen:api · Drift gate: pnpm gen:api:check
4
+ export interface paths {
5
+ "/forms/api/v1/field-kinds": {
6
+ parameters: {
7
+ query?: never;
8
+ header?: never;
9
+ path?: never;
10
+ cookie?: never;
11
+ };
12
+ /**
13
+ * @description The field kinds a form may be built from, with their config forms.
14
+ *
15
+ * The builder is data-driven off stapel-attributes' ``config_form()``
16
+ * declarations (spec §8) — before this route existed the only way to read
17
+ * them was to mirror them in the client, which is a table that drifts
18
+ * silently. Serving the registry makes the declaration the single source
19
+ * of truth again: a type registered through ``EXTRA_TYPES`` shows up in
20
+ * the builder with no client release.
21
+ *
22
+ * Nothing here is per-form, but it is not public either: the catalogue
23
+ * tells a reader which kinds a deployment registered, including host types
24
+ * whose slugs are internal vocabulary. It carries the same capability as
25
+ * form management (``forms.manage``) — a principal who cannot build a
26
+ * form has no use for the builder's dictionary.
27
+ *
28
+ * **Permissions:** `IsNotAnonymousUser`
29
+ */
30
+ get: operations["forms_api_v1_field_kinds_retrieve"];
31
+ put?: never;
32
+ post?: never;
33
+ delete?: never;
34
+ options?: never;
35
+ head?: never;
36
+ patch?: never;
37
+ trace?: never;
38
+ };
39
+ "/forms/api/v1/forms": {
40
+ parameters: {
41
+ query?: never;
42
+ header?: never;
43
+ path?: never;
44
+ cookie?: never;
45
+ };
46
+ /**
47
+ * @description List the workspace's forms, or create one.
48
+ *
49
+ * **Permissions:** `IsNotAnonymousUser`
50
+ */
51
+ get: operations["forms_api_v1_forms_list"];
52
+ put?: never;
53
+ /**
54
+ * @description List the workspace's forms, or create one.
55
+ *
56
+ * **Permissions:** `IsNotAnonymousUser`
57
+ */
58
+ post: operations["forms_api_v1_forms_create"];
59
+ delete?: never;
60
+ options?: never;
61
+ head?: never;
62
+ patch?: never;
63
+ trace?: never;
64
+ };
65
+ "/forms/api/v1/forms/{form_id}": {
66
+ parameters: {
67
+ query?: never;
68
+ header?: never;
69
+ path?: never;
70
+ cookie?: never;
71
+ };
72
+ /**
73
+ * @description Read, rename or soft-delete one form.
74
+ *
75
+ * **Permissions:** `IsNotAnonymousUser`
76
+ */
77
+ get: operations["forms_api_v1_forms_retrieve"];
78
+ put?: never;
79
+ post?: never;
80
+ /**
81
+ * @description Read, rename or soft-delete one form.
82
+ *
83
+ * **Permissions:** `IsNotAnonymousUser`
84
+ */
85
+ delete: operations["forms_api_v1_forms_destroy"];
86
+ options?: never;
87
+ head?: never;
88
+ /**
89
+ * @description Read, rename or soft-delete one form.
90
+ *
91
+ * **Permissions:** `IsNotAnonymousUser`
92
+ */
93
+ patch: operations["forms_api_v1_forms_partial_update"];
94
+ trace?: never;
95
+ };
96
+ "/forms/api/v1/forms/{form_id}/draft": {
97
+ parameters: {
98
+ query?: never;
99
+ header?: never;
100
+ path?: never;
101
+ cookie?: never;
102
+ };
103
+ get?: never;
104
+ /**
105
+ * @description Replace the builder's scratchpad.
106
+ *
107
+ * **Permissions:** `IsNotAnonymousUser`
108
+ */
109
+ put: operations["forms_api_v1_forms_draft_update"];
110
+ post?: never;
111
+ delete?: never;
112
+ options?: never;
113
+ head?: never;
114
+ patch?: never;
115
+ trace?: never;
116
+ };
117
+ "/forms/api/v1/forms/{form_id}/publish": {
118
+ parameters: {
119
+ query?: never;
120
+ header?: never;
121
+ path?: never;
122
+ cookie?: never;
123
+ };
124
+ get?: never;
125
+ put?: never;
126
+ /**
127
+ * @description Freeze the draft as the next immutable version.
128
+ *
129
+ * **Permissions:** `IsNotAnonymousUser`
130
+ */
131
+ post: operations["forms_api_v1_forms_publish_create"];
132
+ delete?: never;
133
+ options?: never;
134
+ head?: never;
135
+ patch?: never;
136
+ trace?: never;
137
+ };
138
+ "/forms/api/v1/forms/{form_id}/rotate-link": {
139
+ parameters: {
140
+ query?: never;
141
+ header?: never;
142
+ path?: never;
143
+ cookie?: never;
144
+ };
145
+ get?: never;
146
+ put?: never;
147
+ /**
148
+ * @description Mint a new public handle, invalidating every distributed link.
149
+ *
150
+ * **Permissions:** `IsNotAnonymousUser`
151
+ */
152
+ post: operations["forms_api_v1_forms_rotate_link_create"];
153
+ delete?: never;
154
+ options?: never;
155
+ head?: never;
156
+ patch?: never;
157
+ trace?: never;
158
+ };
159
+ "/forms/api/v1/forms/{form_id}/state": {
160
+ parameters: {
161
+ query?: never;
162
+ header?: never;
163
+ path?: never;
164
+ cookie?: never;
165
+ };
166
+ get?: never;
167
+ put?: never;
168
+ /**
169
+ * @description Open or close the form for submissions.
170
+ *
171
+ * **Permissions:** `IsNotAnonymousUser`
172
+ */
173
+ post: operations["forms_api_v1_forms_state_create"];
174
+ delete?: never;
175
+ options?: never;
176
+ head?: never;
177
+ patch?: never;
178
+ trace?: never;
179
+ };
180
+ "/forms/api/v1/forms/{form_id}/submissions": {
181
+ parameters: {
182
+ query?: never;
183
+ header?: never;
184
+ path?: never;
185
+ cookie?: never;
186
+ };
187
+ /**
188
+ * @description Keyset page of a form's responses, newest first.
189
+ *
190
+ * **Permissions:** `IsNotAnonymousUser`
191
+ */
192
+ get: operations["forms_api_v1_forms_submissions_list"];
193
+ put?: never;
194
+ post?: never;
195
+ delete?: never;
196
+ options?: never;
197
+ head?: never;
198
+ patch?: never;
199
+ trace?: never;
200
+ };
201
+ "/forms/api/v1/forms/{form_id}/submissions/export": {
202
+ parameters: {
203
+ query?: never;
204
+ header?: never;
205
+ path?: never;
206
+ cookie?: never;
207
+ };
208
+ /**
209
+ * @description Stream responses as CSV.
210
+ *
211
+ * Streamed and page-capped rather than materialized: an export is the one
212
+ * read whose size is chosen by whoever filled the form in. The
213
+ * formula-injection escape lives in ``export.py`` so every consumer of
214
+ * the CSV inherits it.
215
+ *
216
+ * **Permissions:** `IsNotAnonymousUser`
217
+ */
218
+ get: operations["forms_api_v1_forms_submissions_export_retrieve"];
219
+ put?: never;
220
+ post?: never;
221
+ delete?: never;
222
+ options?: never;
223
+ head?: never;
224
+ patch?: never;
225
+ trace?: never;
226
+ };
227
+ "/forms/api/v1/forms/{form_id}/versions": {
228
+ parameters: {
229
+ query?: never;
230
+ header?: never;
231
+ path?: never;
232
+ cookie?: never;
233
+ };
234
+ /**
235
+ * @description The form's published versions, newest first.
236
+ *
237
+ * **Permissions:** `IsNotAnonymousUser`
238
+ */
239
+ get: operations["forms_api_v1_forms_versions_list"];
240
+ put?: never;
241
+ post?: never;
242
+ delete?: never;
243
+ options?: never;
244
+ head?: never;
245
+ patch?: never;
246
+ trace?: never;
247
+ };
248
+ "/forms/api/v1/public/{public_id}/": {
249
+ parameters: {
250
+ query?: never;
251
+ header?: never;
252
+ path?: never;
253
+ cookie?: never;
254
+ };
255
+ /**
256
+ * @description Fetch a form's active schema by its public handle.
257
+ *
258
+ * **Permissions:** `AllowAny`
259
+ */
260
+ get: operations["forms_api_v1_public_retrieve"];
261
+ put?: never;
262
+ post?: never;
263
+ delete?: never;
264
+ options?: never;
265
+ head?: never;
266
+ patch?: never;
267
+ trace?: never;
268
+ };
269
+ "/forms/api/v1/public/{public_id}/submissions/": {
270
+ parameters: {
271
+ query?: never;
272
+ header?: never;
273
+ path?: never;
274
+ cookie?: never;
275
+ };
276
+ get?: never;
277
+ put?: never;
278
+ /**
279
+ * @description Answer a form. The only public write in this module.
280
+ *
281
+ * **Permissions:** `AllowAny`
282
+ */
283
+ post: operations["forms_api_v1_public_submissions_create"];
284
+ delete?: never;
285
+ options?: never;
286
+ head?: never;
287
+ patch?: never;
288
+ trace?: never;
289
+ };
290
+ "/forms/api/v1/submissions/{submission_id}": {
291
+ parameters: {
292
+ query?: never;
293
+ header?: never;
294
+ path?: never;
295
+ cookie?: never;
296
+ };
297
+ /**
298
+ * @description Read or delete one response.
299
+ *
300
+ * **Permissions:** `IsNotAnonymousUser`
301
+ */
302
+ get: operations["forms_api_v1_submissions_retrieve"];
303
+ put?: never;
304
+ post?: never;
305
+ /**
306
+ * @description Read or delete one response.
307
+ *
308
+ * **Permissions:** `IsNotAnonymousUser`
309
+ */
310
+ delete: operations["forms_api_v1_submissions_destroy"];
311
+ options?: never;
312
+ head?: never;
313
+ patch?: never;
314
+ trace?: never;
315
+ };
316
+ "/forms/api/v1/submissions/{submission_id}/resend": {
317
+ parameters: {
318
+ query?: never;
319
+ header?: never;
320
+ path?: never;
321
+ cookie?: never;
322
+ };
323
+ get?: never;
324
+ put?: never;
325
+ /**
326
+ * @description Re-deliver one response to the form's notify targets.
327
+ *
328
+ * Admin-initiated and therefore cooldown-independent: the auto-notify
329
+ * cooldown suppresses a respondent-driven flood, and an operator asking
330
+ * for one letter is not one.
331
+ *
332
+ * **Permissions:** `IsNotAnonymousUser`
333
+ */
334
+ post: operations["forms_api_v1_submissions_resend_create"];
335
+ delete?: never;
336
+ options?: never;
337
+ head?: never;
338
+ patch?: never;
339
+ trace?: never;
340
+ };
341
+ }
342
+ export type webhooks = Record<string, never>;
343
+ export interface components {
344
+ schemas: {
345
+ Draft: {
346
+ schema: unknown;
347
+ };
348
+ /**
349
+ * @description One field kind the builder may offer, with its config form.
350
+ *
351
+ * ``fields`` is stapel-attributes' own ``config_form()`` declaration,
352
+ * passed through verbatim (``FormField.to_dict()`` shape: ``name``,
353
+ * ``kind``, ``label_key``, optional ``required`` / ``default`` /
354
+ * ``params``) — this module does not re-shape upstream's contract, so a
355
+ * kind gains config fields upstream without a release here.
356
+ *
357
+ * ``registered`` is FALSE for a kind the host allowlisted that the
358
+ * attributes registry does not carry. It is still listed, because a
359
+ * stored schema may already use it and a builder that silently drops the
360
+ * kind would silently drop the field.
361
+ */
362
+ FieldKindDTO: {
363
+ kind: string;
364
+ label_key: string;
365
+ allowed: boolean;
366
+ registered: boolean;
367
+ fields?: {
368
+ [key: string]: unknown;
369
+ }[];
370
+ };
371
+ /**
372
+ * @description The whole field-kind catalogue behind the builder.
373
+ *
374
+ * ``config_widgets`` is upstream's ``config_form.FIELD_KINDS``: the
375
+ * *widget* vocabulary a declaration's ``kind`` draws from, mapped to the
376
+ * params each widget understands. Named apart from ``kinds`` on purpose —
377
+ * forms' own ``FIELD_KINDS`` setting is the feature-type allowlist, and
378
+ * two different things called the same name is how a builder ends up
379
+ * rendering a ``number`` where a ``string`` belongs.
380
+ */
381
+ FieldKindsDTO: {
382
+ kinds?: components["schemas"]["FieldKindDTO"][];
383
+ config_widgets?: {
384
+ [key: string]: string[];
385
+ };
386
+ };
387
+ FormCreate: {
388
+ /** Format: uuid */
389
+ workspace_id: string;
390
+ title: string;
391
+ settings?: {
392
+ [key: string]: unknown;
393
+ };
394
+ draft_schema?: unknown;
395
+ };
396
+ /** @description Presents a Form row to its workspace's admins. */
397
+ FormPresenterDTO: {
398
+ /** @description title */
399
+ title: string;
400
+ /** @description state */
401
+ state: string;
402
+ /** @description public id */
403
+ public_id: string;
404
+ id: string;
405
+ workspace_id: string;
406
+ settings: {
407
+ [key: string]: unknown;
408
+ };
409
+ created_at: string;
410
+ updated_at: string;
411
+ /** @description Ordinal of the version currently served to respondents. */
412
+ active_version?: number | null;
413
+ active_version_id?: string | null;
414
+ /** @description The builder's scratchpad; null once published. */
415
+ draft_schema?: {
416
+ [key: string]: unknown;
417
+ } | null;
418
+ submission_count?: number;
419
+ deleted_at?: string | null;
420
+ };
421
+ /** @description Presents one published, immutable schema version. */
422
+ FormVersionPresenterDTO: {
423
+ /** @description version */
424
+ version: number;
425
+ id: string;
426
+ form_id: string;
427
+ schema: {
428
+ [key: string]: unknown;
429
+ };
430
+ published_at: string;
431
+ created_by?: string | null;
432
+ submission_count?: number;
433
+ };
434
+ PatchedFormPatch: {
435
+ title?: string;
436
+ settings?: {
437
+ [key: string]: unknown;
438
+ };
439
+ };
440
+ /** @description What an anonymous respondent is allowed to know about a form. */
441
+ PublicFormDTO: {
442
+ public_id: string;
443
+ version_id: string;
444
+ version: number;
445
+ fields?: {
446
+ [key: string]: unknown;
447
+ }[];
448
+ meta?: {
449
+ [key: string]: unknown;
450
+ };
451
+ };
452
+ /** @description PublishResultDTO(version_id: 'str', version: 'int', published_at: 'str') */
453
+ PublishResultDTO: {
454
+ version_id: string;
455
+ version: number;
456
+ published_at: string;
457
+ };
458
+ /**
459
+ * @description Optional destination override for a resend.
460
+ *
461
+ * Given either list, the form's own configured targets are replaced, not
462
+ * supplemented: "send this one to legal" must not also re-send it to
463
+ * everyone who already has it.
464
+ */
465
+ Resend: {
466
+ recipients?: string[];
467
+ telegram_chat_ids?: string[];
468
+ };
469
+ /** @description ResendResultDTO(sent: 'int') */
470
+ ResendResultDTO: {
471
+ sent: number;
472
+ };
473
+ State: {
474
+ state: components["schemas"]["StateEnum"];
475
+ };
476
+ /**
477
+ * @description * `draft` - draft
478
+ * * `open` - open
479
+ * * `closed` - closed
480
+ * @enum {string}
481
+ */
482
+ StateEnum: "draft" | "open" | "closed";
483
+ /**
484
+ * @description Presents one response to a workspace reviewer.
485
+ *
486
+ * ``answers`` is presented as ``{slug: value}`` rather than the raw DAO
487
+ * dicts: the DAO carries display metadata copied from the schema (name,
488
+ * order, badge flags), which the reviewer already has from the version
489
+ * and which would otherwise be repeated on every row.
490
+ */
491
+ SubmissionPresenterDTO: {
492
+ id: string;
493
+ form_id: string;
494
+ version: number;
495
+ version_id: string;
496
+ answers: {
497
+ [key: string]: unknown;
498
+ };
499
+ submitted_at: string;
500
+ /** @description Respondent user id, or null for an anonymous respondent. */
501
+ submitted_by?: string | null;
502
+ /** @description Only populated where the host turned STORE_CLIENT_META on. */
503
+ client_meta?: {
504
+ [key: string]: unknown;
505
+ } | null;
506
+ /** @description Set when the answers were erased; the row is kept so counts stay truthful. */
507
+ erased_at?: string | null;
508
+ };
509
+ /**
510
+ * @description The anonymous submit body.
511
+ *
512
+ * ``version_id`` is what the client echoes back from the schema it
513
+ * rendered — it is what makes a racing publish a clean 409 instead of a
514
+ * silent mis-validation. ``captcha_token`` is the seam the pair fills:
515
+ * the netintel tier decides whether a token is required at all, so it
516
+ * stays optional here and the captcha layer refuses on its own terms.
517
+ */
518
+ Submit: {
519
+ answers: unknown;
520
+ /** Format: uuid */
521
+ version_id?: string | null;
522
+ captcha_token?: string;
523
+ };
524
+ /**
525
+ * @description The whole answer to a successful submit.
526
+ *
527
+ * Deliberately not the submission id: there is no public read of
528
+ * submissions, and handing out an identifier for a resource nobody may
529
+ * fetch only invites people to try.
530
+ */
531
+ SubmitResultDTO: {
532
+ accepted?: boolean;
533
+ confirmation?: string;
534
+ };
535
+ };
536
+ responses: never;
537
+ parameters: never;
538
+ requestBodies: never;
539
+ headers: never;
540
+ pathItems: never;
541
+ }
542
+ export type $defs = Record<string, never>;
543
+ export interface operations {
544
+ forms_api_v1_field_kinds_retrieve: {
545
+ parameters: {
546
+ query: {
547
+ workspace_id: string;
548
+ };
549
+ header?: never;
550
+ path?: never;
551
+ cookie?: never;
552
+ };
553
+ requestBody?: never;
554
+ responses: {
555
+ 200: {
556
+ headers: {
557
+ [name: string]: unknown;
558
+ };
559
+ content: {
560
+ "application/json": components["schemas"]["FieldKindsDTO"];
561
+ };
562
+ };
563
+ };
564
+ };
565
+ forms_api_v1_forms_list: {
566
+ parameters: {
567
+ query: {
568
+ state?: string;
569
+ workspace_id: string;
570
+ };
571
+ header?: never;
572
+ path?: never;
573
+ cookie?: never;
574
+ };
575
+ requestBody?: never;
576
+ responses: {
577
+ 200: {
578
+ headers: {
579
+ [name: string]: unknown;
580
+ };
581
+ content: {
582
+ "application/json": components["schemas"]["FormPresenterDTO"][];
583
+ };
584
+ };
585
+ };
586
+ };
587
+ forms_api_v1_forms_create: {
588
+ parameters: {
589
+ query?: never;
590
+ header?: never;
591
+ path?: never;
592
+ cookie?: never;
593
+ };
594
+ requestBody: {
595
+ content: {
596
+ "application/json": components["schemas"]["FormCreate"];
597
+ "application/x-www-form-urlencoded": components["schemas"]["FormCreate"];
598
+ "multipart/form-data": components["schemas"]["FormCreate"];
599
+ };
600
+ };
601
+ responses: {
602
+ 201: {
603
+ headers: {
604
+ [name: string]: unknown;
605
+ };
606
+ content: {
607
+ "application/json": components["schemas"]["FormPresenterDTO"];
608
+ };
609
+ };
610
+ };
611
+ };
612
+ forms_api_v1_forms_retrieve: {
613
+ parameters: {
614
+ query: {
615
+ workspace_id: string;
616
+ };
617
+ header?: never;
618
+ path: {
619
+ form_id: string;
620
+ };
621
+ cookie?: never;
622
+ };
623
+ requestBody?: never;
624
+ responses: {
625
+ 200: {
626
+ headers: {
627
+ [name: string]: unknown;
628
+ };
629
+ content: {
630
+ "application/json": components["schemas"]["FormPresenterDTO"];
631
+ };
632
+ };
633
+ };
634
+ };
635
+ forms_api_v1_forms_destroy: {
636
+ parameters: {
637
+ query: {
638
+ workspace_id: string;
639
+ };
640
+ header?: never;
641
+ path: {
642
+ form_id: string;
643
+ };
644
+ cookie?: never;
645
+ };
646
+ requestBody?: never;
647
+ responses: {
648
+ /** @description No response body */
649
+ 204: {
650
+ headers: {
651
+ [name: string]: unknown;
652
+ };
653
+ content?: never;
654
+ };
655
+ };
656
+ };
657
+ forms_api_v1_forms_partial_update: {
658
+ parameters: {
659
+ query: {
660
+ workspace_id: string;
661
+ };
662
+ header?: never;
663
+ path: {
664
+ form_id: string;
665
+ };
666
+ cookie?: never;
667
+ };
668
+ requestBody?: {
669
+ content: {
670
+ "application/json": components["schemas"]["PatchedFormPatch"];
671
+ "application/x-www-form-urlencoded": components["schemas"]["PatchedFormPatch"];
672
+ "multipart/form-data": components["schemas"]["PatchedFormPatch"];
673
+ };
674
+ };
675
+ responses: {
676
+ 200: {
677
+ headers: {
678
+ [name: string]: unknown;
679
+ };
680
+ content: {
681
+ "application/json": components["schemas"]["FormPresenterDTO"];
682
+ };
683
+ };
684
+ };
685
+ };
686
+ forms_api_v1_forms_draft_update: {
687
+ parameters: {
688
+ query: {
689
+ workspace_id: string;
690
+ };
691
+ header?: never;
692
+ path: {
693
+ form_id: string;
694
+ };
695
+ cookie?: never;
696
+ };
697
+ requestBody: {
698
+ content: {
699
+ "application/json": components["schemas"]["Draft"];
700
+ "application/x-www-form-urlencoded": components["schemas"]["Draft"];
701
+ "multipart/form-data": components["schemas"]["Draft"];
702
+ };
703
+ };
704
+ responses: {
705
+ 200: {
706
+ headers: {
707
+ [name: string]: unknown;
708
+ };
709
+ content: {
710
+ "application/json": components["schemas"]["FormPresenterDTO"];
711
+ };
712
+ };
713
+ };
714
+ };
715
+ forms_api_v1_forms_publish_create: {
716
+ parameters: {
717
+ query: {
718
+ workspace_id: string;
719
+ };
720
+ header?: never;
721
+ path: {
722
+ form_id: string;
723
+ };
724
+ cookie?: never;
725
+ };
726
+ requestBody?: never;
727
+ responses: {
728
+ 201: {
729
+ headers: {
730
+ [name: string]: unknown;
731
+ };
732
+ content: {
733
+ "application/json": components["schemas"]["PublishResultDTO"];
734
+ };
735
+ };
736
+ };
737
+ };
738
+ forms_api_v1_forms_rotate_link_create: {
739
+ parameters: {
740
+ query: {
741
+ workspace_id: string;
742
+ };
743
+ header?: never;
744
+ path: {
745
+ form_id: string;
746
+ };
747
+ cookie?: never;
748
+ };
749
+ requestBody?: never;
750
+ responses: {
751
+ 200: {
752
+ headers: {
753
+ [name: string]: unknown;
754
+ };
755
+ content: {
756
+ "application/json": components["schemas"]["FormPresenterDTO"];
757
+ };
758
+ };
759
+ };
760
+ };
761
+ forms_api_v1_forms_state_create: {
762
+ parameters: {
763
+ query: {
764
+ workspace_id: string;
765
+ };
766
+ header?: never;
767
+ path: {
768
+ form_id: string;
769
+ };
770
+ cookie?: never;
771
+ };
772
+ requestBody: {
773
+ content: {
774
+ "application/json": components["schemas"]["State"];
775
+ "application/x-www-form-urlencoded": components["schemas"]["State"];
776
+ "multipart/form-data": components["schemas"]["State"];
777
+ };
778
+ };
779
+ responses: {
780
+ 200: {
781
+ headers: {
782
+ [name: string]: unknown;
783
+ };
784
+ content: {
785
+ "application/json": components["schemas"]["FormPresenterDTO"];
786
+ };
787
+ };
788
+ };
789
+ };
790
+ forms_api_v1_forms_submissions_list: {
791
+ parameters: {
792
+ query: {
793
+ /** @description Keyset cursor: return responses submitted strictly before this timestamp. */
794
+ before?: string;
795
+ limit?: number;
796
+ /** @description Restrict to responses answering this schema version. */
797
+ version?: number;
798
+ workspace_id: string;
799
+ };
800
+ header?: never;
801
+ path: {
802
+ form_id: string;
803
+ };
804
+ cookie?: never;
805
+ };
806
+ requestBody?: never;
807
+ responses: {
808
+ 200: {
809
+ headers: {
810
+ [name: string]: unknown;
811
+ };
812
+ content: {
813
+ "application/json": components["schemas"]["SubmissionPresenterDTO"][];
814
+ };
815
+ };
816
+ };
817
+ };
818
+ forms_api_v1_forms_submissions_export_retrieve: {
819
+ parameters: {
820
+ query: {
821
+ /** @description Keyset continuation, echoed back in the X-Forms-Next-Before header. */
822
+ before?: string;
823
+ /** @description Export one schema version's responses (its columns are the header row). */
824
+ version?: number;
825
+ workspace_id: string;
826
+ };
827
+ header?: never;
828
+ path: {
829
+ form_id: string;
830
+ };
831
+ cookie?: never;
832
+ };
833
+ requestBody?: never;
834
+ responses: {
835
+ /** @description No response body */
836
+ 200: {
837
+ headers: {
838
+ [name: string]: unknown;
839
+ };
840
+ content?: never;
841
+ };
842
+ };
843
+ };
844
+ forms_api_v1_forms_versions_list: {
845
+ parameters: {
846
+ query: {
847
+ workspace_id: string;
848
+ };
849
+ header?: never;
850
+ path: {
851
+ form_id: string;
852
+ };
853
+ cookie?: never;
854
+ };
855
+ requestBody?: never;
856
+ responses: {
857
+ 200: {
858
+ headers: {
859
+ [name: string]: unknown;
860
+ };
861
+ content: {
862
+ "application/json": components["schemas"]["FormVersionPresenterDTO"][];
863
+ };
864
+ };
865
+ };
866
+ };
867
+ forms_api_v1_public_retrieve: {
868
+ parameters: {
869
+ query?: never;
870
+ header?: never;
871
+ path: {
872
+ public_id: string;
873
+ };
874
+ cookie?: never;
875
+ };
876
+ requestBody?: never;
877
+ responses: {
878
+ 200: {
879
+ headers: {
880
+ [name: string]: unknown;
881
+ };
882
+ content: {
883
+ "application/json": components["schemas"]["PublicFormDTO"];
884
+ };
885
+ };
886
+ };
887
+ };
888
+ forms_api_v1_public_submissions_create: {
889
+ parameters: {
890
+ query?: never;
891
+ header?: never;
892
+ path: {
893
+ public_id: string;
894
+ };
895
+ cookie?: never;
896
+ };
897
+ requestBody: {
898
+ content: {
899
+ "application/json": components["schemas"]["Submit"];
900
+ "application/x-www-form-urlencoded": components["schemas"]["Submit"];
901
+ "multipart/form-data": components["schemas"]["Submit"];
902
+ };
903
+ };
904
+ responses: {
905
+ 201: {
906
+ headers: {
907
+ [name: string]: unknown;
908
+ };
909
+ content: {
910
+ "application/json": components["schemas"]["SubmitResultDTO"];
911
+ };
912
+ };
913
+ };
914
+ };
915
+ forms_api_v1_submissions_retrieve: {
916
+ parameters: {
917
+ query: {
918
+ workspace_id: string;
919
+ };
920
+ header?: never;
921
+ path: {
922
+ submission_id: string;
923
+ };
924
+ cookie?: never;
925
+ };
926
+ requestBody?: never;
927
+ responses: {
928
+ 200: {
929
+ headers: {
930
+ [name: string]: unknown;
931
+ };
932
+ content: {
933
+ "application/json": components["schemas"]["SubmissionPresenterDTO"];
934
+ };
935
+ };
936
+ };
937
+ };
938
+ forms_api_v1_submissions_destroy: {
939
+ parameters: {
940
+ query: {
941
+ workspace_id: string;
942
+ };
943
+ header?: never;
944
+ path: {
945
+ submission_id: string;
946
+ };
947
+ cookie?: never;
948
+ };
949
+ requestBody?: never;
950
+ responses: {
951
+ /** @description No response body */
952
+ 204: {
953
+ headers: {
954
+ [name: string]: unknown;
955
+ };
956
+ content?: never;
957
+ };
958
+ };
959
+ };
960
+ forms_api_v1_submissions_resend_create: {
961
+ parameters: {
962
+ query: {
963
+ workspace_id: string;
964
+ };
965
+ header?: never;
966
+ path: {
967
+ submission_id: string;
968
+ };
969
+ cookie?: never;
970
+ };
971
+ requestBody?: {
972
+ content: {
973
+ "application/json": components["schemas"]["Resend"];
974
+ "application/x-www-form-urlencoded": components["schemas"]["Resend"];
975
+ "multipart/form-data": components["schemas"]["Resend"];
976
+ };
977
+ };
978
+ responses: {
979
+ 200: {
980
+ headers: {
981
+ [name: string]: unknown;
982
+ };
983
+ content: {
984
+ "application/json": components["schemas"]["ResendResultDTO"];
985
+ };
986
+ };
987
+ };
988
+ };
989
+ }