@sealcode/sealgen 0.18.10 → 0.19.2

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 (444) hide show
  1. package/.xunit +74 -69
  2. package/@types/add-crud.d.sync-conflict-20250918-184311-TFDLWFG.ts +1 -0
  3. package/@types/builders/colors-builder.d.sync-conflict-20250918-184323-TFDLWFG.ts +10 -0
  4. package/@types/builders/colors-builder.d.ts +1 -1
  5. package/@types/builders/fonts-builder.d.sync-conflict-20250918-184322-TFDLWFG.ts +7 -0
  6. package/@types/builders/fonts-builder.d.ts +1 -1
  7. package/@types/controllers/table-add-button.d.ts +6 -0
  8. package/@types/controllers/table-add-button.stimulus.d.ts +6 -0
  9. package/@types/crud-field-snippets.d.sync-conflict-20250918-184323-TFDLWFG.ts +1 -0
  10. package/@types/crud-field-snippets.d.ts +1 -3
  11. package/@types/forms/controls/array.d.sync-conflict-20250918-184306-TFDLWFG.ts +33 -0
  12. package/@types/forms/controls/array.d.ts +1 -3
  13. package/@types/forms/controls/array.sync-conflict-20250918-222045-TFDLWFG.d.ts +33 -0
  14. package/@types/forms/controls/autocomplete.d.sync-conflict-20250918-222042-TFDLWFG.ts +22 -0
  15. package/@types/forms/controls/autocomplete.d.ts +1 -1
  16. package/@types/forms/controls/checkbox-group.d.sync-conflict-20250918-184319-TFDLWFG.ts +21 -0
  17. package/@types/forms/controls/checkbox-group.d.ts +3 -3
  18. package/@types/forms/controls/checkboxed-list-input.d.sync-conflict-20250918-184323-TFDLWFG.ts +21 -0
  19. package/@types/forms/controls/checkboxed-list-input.d.ts +3 -3
  20. package/@types/forms/controls/controls.d.ts +2 -2
  21. package/@types/forms/controls/derived-frame.d.sync-conflict-20250918-184314-TFDLWFG.ts +19 -0
  22. package/@types/forms/controls/derived-frame.d.ts +0 -2
  23. package/@types/forms/controls/dropdown.d.sync-conflict-20250918-222044-TFDLWFG.ts +30 -0
  24. package/@types/forms/controls/dropdown.d.ts +1 -1
  25. package/@types/forms/controls/file.d.sync-conflict-20250918-222045-TFDLWFG.ts +13 -0
  26. package/@types/forms/controls/file.d.ts +1 -2
  27. package/@types/forms/controls/form-control.d.sync-conflict-20250918-184322-TFDLWFG.ts +19 -0
  28. package/@types/forms/controls/form-control.d.sync-conflict-20250918-222046-TFDLWFG.ts +19 -0
  29. package/@types/forms/controls/form-control.d.ts +7 -4
  30. package/@types/forms/controls/image.d.ts +19 -0
  31. package/@types/forms/controls/image.test.d.ts +1 -0
  32. package/@types/forms/controls/multiple-files.d.sync-conflict-20250918-184318-TFDLWFG.ts +42 -0
  33. package/@types/forms/controls/multiple-files.d.ts +3 -1
  34. package/@types/forms/controls/multiple-images.d.ts +19 -0
  35. package/@types/forms/controls/number.d.sync-conflict-20250918-222046-TFDLWFG.ts +13 -0
  36. package/@types/forms/controls/number.d.ts +1 -1
  37. package/@types/forms/controls/photo.d.sync-conflict-20250918-184321-TFDLWFG.ts +19 -0
  38. package/@types/forms/controls/photo.d.ts +3 -5
  39. package/@types/forms/controls/simple-input.d.sync-conflict-20250918-184310-TFDLWFG.ts +33 -0
  40. package/@types/forms/controls/simple-input.d.sync-conflict-20250918-222042-TFDLWFG.ts +33 -0
  41. package/@types/forms/controls/simple-input.d.ts +5 -4
  42. package/@types/forms/controls/simple-input.sync-conflict-20250918-222045-TFDLWFG.d.ts +33 -0
  43. package/@types/forms/controls/single-reference.d.ts +3 -2
  44. package/@types/forms/controls/table.d.sync-conflict-20250918-184302-TFDLWFG.ts +39 -0
  45. package/@types/forms/controls/table.d.ts +8 -3
  46. package/@types/forms/controls/table.sync-conflict-20250918-222042-TFDLWFG.d.ts +39 -0
  47. package/@types/forms/controls/textarea.d.sync-conflict-20250918-222045-TFDLWFG.ts +25 -0
  48. package/@types/forms/controls/textarea.d.ts +3 -3
  49. package/@types/forms/fields/boolean.d.sync-conflict-20250918-184325-TFDLWFG.ts +22 -0
  50. package/@types/forms/fields/boolean.d.ts +6 -1
  51. package/@types/forms/fields/boolean.sync-conflict-20250918-222042-TFDLWFG.d.ts +22 -0
  52. package/@types/forms/fields/checkboxed-list.d.sync-conflict-20250918-184325-TFDLWFG.ts +23 -0
  53. package/@types/forms/fields/checkboxed-list.d.ts +3 -1
  54. package/@types/forms/fields/collection-field.d.sync-conflict-20250918-184319-TFDLWFG.ts +22 -0
  55. package/@types/forms/fields/collection-field.d.sync-conflict-20250918-222047-TFDLWFG.ts +22 -0
  56. package/@types/forms/fields/collection-field.d.ts +8 -1
  57. package/@types/forms/fields/color.d.ts +4 -0
  58. package/@types/forms/fields/coordinates.d.sync-conflict-20250918-222044-TFDLWFG.ts +14 -0
  59. package/@types/forms/fields/coordinates.d.ts +14 -0
  60. package/@types/forms/fields/date.d.ts +13 -0
  61. package/@types/forms/fields/datetime.d.sync-conflict-20250918-222050-TFDLWFG.ts +4 -0
  62. package/@types/forms/fields/datetime.d.ts +14 -0
  63. package/@types/forms/fields/deep-reverse-single-reference-list.d.ts +20 -0
  64. package/@types/forms/fields/deep-reverse-single-reference-table.d.ts +16 -0
  65. package/@types/forms/fields/email.d.sync-conflict-20250918-184303-TFDLWFG.ts +8 -0
  66. package/@types/forms/fields/email.d.ts +3 -0
  67. package/@types/forms/fields/enum-multiple-sealious.d.ts +16 -0
  68. package/@types/forms/fields/enum-multiple-sealious.sync-conflict-20250918-222047-TFDLWFG.d.ts +16 -0
  69. package/@types/forms/fields/field.d.sync-conflict-20250918-184306-TFDLWFG.ts +70 -0
  70. package/@types/forms/fields/field.d.ts +37 -5
  71. package/@types/forms/fields/fields.d.sync-conflict-20250918-184314-TFDLWFG.ts +29 -0
  72. package/@types/forms/fields/fields.d.ts +23 -8
  73. package/@types/forms/fields/file.d.sync-conflict-20250918-184310-TFDLWFG.ts +23 -0
  74. package/@types/forms/fields/file.d.sync-conflict-20250918-222046-TFDLWFG.ts +23 -0
  75. package/@types/forms/fields/file.d.ts +11 -5
  76. package/@types/forms/fields/file.sync-conflict-20250918-222049-TFDLWFG.d.ts +23 -0
  77. package/@types/forms/fields/float.d.ts +4 -0
  78. package/@types/forms/fields/get-field-for-sealious.d.sync-conflict-20250918-222046-TFDLWFG.ts +29 -0
  79. package/@types/forms/fields/get-field-for-sealious.d.ts +31 -0
  80. package/@types/forms/fields/get-field-for-sealious.sync-conflict-20250918-222042-TFDLWFG.d.ts +29 -0
  81. package/@types/forms/fields/html.d.ts +6 -0
  82. package/@types/forms/fields/image.d.sync-conflict-20250918-222042-TFDLWFG.ts +5 -0
  83. package/@types/forms/fields/image.d.ts +5 -0
  84. package/@types/forms/fields/int.d.ts +6 -0
  85. package/@types/forms/fields/json.d.ts +13 -0
  86. package/@types/forms/fields/markdown.d.ts +6 -0
  87. package/@types/forms/fields/multiple-files.d.sync-conflict-20250918-184304-TFDLWFG.ts +16 -0
  88. package/@types/forms/fields/multiple-files.d.ts +3 -1
  89. package/@types/forms/fields/number.d.sync-conflict-20250918-184317-TFDLWFG.ts +25 -0
  90. package/@types/forms/fields/number.d.sync-conflict-20250918-222047-TFDLWFG.ts +25 -0
  91. package/@types/forms/fields/number.d.ts +3 -1
  92. package/@types/forms/fields/password.d.ts +5 -0
  93. package/@types/forms/fields/pick-from-list-sealious.d.ts +11 -0
  94. package/@types/forms/fields/pick-from-list.d.sync-conflict-20250918-184322-TFDLWFG.ts +15 -0
  95. package/@types/forms/fields/pick-from-list.d.ts +4 -3
  96. package/@types/forms/fields/proxy-field.d.sync-conflict-20250918-184307-TFDLWFG.ts +15 -0
  97. package/@types/forms/fields/proxy-field.d.ts +3 -1
  98. package/@types/forms/fields/regexp.d.sync-conflict-20250918-184305-TFDLWFG.ts +21 -0
  99. package/@types/forms/fields/regexp.d.sync-conflict-20250918-222045-TFDLWFG.ts +21 -0
  100. package/@types/forms/fields/regexp.d.ts +6 -1
  101. package/@types/forms/fields/regexp.sync-conflict-20250918-222047-TFDLWFG.d.ts +21 -0
  102. package/@types/forms/fields/simple-form-field.d.sync-conflict-20250918-184309-TFDLWFG.ts +29 -0
  103. package/@types/forms/fields/simple-form-field.d.sync-conflict-20250918-222044-TFDLWFG.ts +29 -0
  104. package/@types/forms/fields/simple-form-field.d.ts +23 -3
  105. package/@types/forms/fields/simple-form-field.sync-conflict-20250918-222049-TFDLWFG.d.ts +29 -0
  106. package/@types/forms/fields/single-reference.d.ts +19 -0
  107. package/@types/forms/fields/single-reference.sync-conflict-20250918-222043-TFDLWFG.d.ts +10 -0
  108. package/@types/forms/fields/structured-array.d.sync-conflict-20250918-184302-TFDLWFG.ts +27 -0
  109. package/@types/forms/fields/structured-array.d.sync-conflict-20250918-222049-TFDLWFG.ts +27 -0
  110. package/@types/forms/fields/structured-array.d.ts +19 -10
  111. package/@types/forms/fields/structured-array.sync-conflict-20250918-222047-TFDLWFG.d.ts +27 -0
  112. package/@types/forms/fields/table.d.sync-conflict-20250918-184303-TFDLWFG.ts +16 -0
  113. package/@types/forms/fields/table.d.ts +3 -0
  114. package/@types/forms/fields/text.d.ts +6 -0
  115. package/@types/forms/fields/url.d.ts +6 -0
  116. package/@types/forms/form-types.d.sync-conflict-20250918-222045-TFDLWFG.ts +26 -0
  117. package/@types/forms/form-types.d.ts +2 -0
  118. package/@types/forms/form.d.sync-conflict-20250918-184315-TFDLWFG.ts +32 -0
  119. package/@types/forms/form.d.sync-conflict-20250918-222049-TFDLWFG.ts +32 -0
  120. package/@types/forms/form.d.ts +10 -8
  121. package/@types/forms/form.sync-conflict-20250918-222049-TFDLWFG.d.ts +33 -0
  122. package/@types/forms/form.test.d.sync-conflict-20250918-184318-TFDLWFG.ts +6 -0
  123. package/@types/forms/form.test.d.sync-conflict-20250918-222047-TFDLWFG.ts +6 -0
  124. package/@types/forms/form.test.d.ts +2 -2
  125. package/@types/forms/multiform.d.sync-conflict-20250918-184308-TFDLWFG.ts +23 -0
  126. package/@types/forms/multiform.d.ts +1 -2
  127. package/@types/forms/multiform.sync-conflict-20250918-222044-TFDLWFG.d.ts +23 -0
  128. package/@types/index.d.sync-conflict-20250918-184316-TFDLWFG.ts +46 -0
  129. package/@types/index.d.ts +2 -2
  130. package/@types/mount.d.sync-conflict-20250918-184320-TFDLWFG.ts +6 -0
  131. package/@types/mount.d.ts +0 -1
  132. package/@types/page/list.d.sync-conflict-20250918-184318-TFDLWFG.ts +48 -0
  133. package/@types/page/list.d.sync-conflict-20250918-222046-TFDLWFG.ts +48 -0
  134. package/@types/page/list.d.ts +2 -2
  135. package/@types/page/list.sync-conflict-20250918-222048-TFDLWFG.d.ts +48 -0
  136. package/@types/page/mountable-with-fields.d.sync-conflict-20250918-184321-TFDLWFG.ts +42 -0
  137. package/@types/page/mountable-with-fields.d.sync-conflict-20250918-222046-TFDLWFG.ts +42 -0
  138. package/@types/page/mountable-with-fields.d.ts +3 -3
  139. package/@types/page/mountable-with-fields.sync-conflict-20250918-222044-TFDLWFG.d.ts +42 -0
  140. package/@types/page/mountable.d.sync-conflict-20250918-184306-TFDLWFG.ts +10 -0
  141. package/@types/page/mountable.d.ts +0 -1
  142. package/@types/page/page.d.sync-conflict-20250918-184320-TFDLWFG.ts +18 -0
  143. package/@types/page/page.d.ts +0 -1
  144. package/@types/page/props-parser.d.sync-conflict-20250918-184305-TFDLWFG.ts +15 -0
  145. package/@types/page/props-parser.d.ts +0 -1
  146. package/@types/page/stateful-page.d.sync-conflict-20250918-184326-TFDLWFG.ts +62 -0
  147. package/@types/page/stateful-page.d.ts +0 -1
  148. package/@types/register-external.d.ts +2 -2
  149. package/@types/templates/form.d.ts +1 -3
  150. package/@types/templates/jdd-component.d.ts +1 -1
  151. package/@types/templates/page.d.ts +1 -1
  152. package/@types/templates/shared/shared-crud-form-fields.d.sync-conflict-20250918-184306-TFDLWFG.ts +1 -0
  153. package/@types/templates/shared/shared-crud-form-fields.d.ts +1 -68
  154. package/@types/templates/templates.d.ts +1 -21
  155. package/@types/test_utils/test-on-real-app.d.sync-conflict-20250918-184320-TFDLWFG.ts +26 -0
  156. package/@types/test_utils/test-on-real-app.d.ts +0 -1
  157. package/@types/utils/extract-fields-from-collection.d.sync-conflict-20250918-184312-TFDLWFG.ts +18 -0
  158. package/@types/utils/extract-fields-from-collection.d.ts +5 -1
  159. package/@types/utils/extract-fields-from-collection.sync-conflict-20250918-222045-TFDLWFG.d.ts +18 -0
  160. package/@types/utils/wrap-attributes.d.ts +3 -0
  161. package/README.md +5 -0
  162. package/assets/file-icon.svg +5 -0
  163. package/eslint.config.mjs +56 -0
  164. package/lib/add-crud.js +77 -89
  165. package/lib/add-jdd-component.js +3 -3
  166. package/lib/add-list-route.test.js +1 -1
  167. package/lib/add-route.js +2 -9
  168. package/lib/build.js +6 -4
  169. package/lib/builders/backend-ts-builder.js +0 -1
  170. package/lib/builders/colors-builder.js +11 -8
  171. package/lib/builders/fonts-builder.js +0 -1
  172. package/lib/builders/frontend-ts-builder.js +0 -1
  173. package/lib/cli.js +4 -7
  174. package/lib/components/tabs.js +36 -36
  175. package/lib/controllers/table-add-button.stimulus.js +35 -0
  176. package/lib/esbuild-plugins/rewrite-asset-imports.js +7 -10
  177. package/lib/forms/controls/array.js +25 -22
  178. package/lib/forms/controls/big-radio-group.js +2 -2
  179. package/lib/forms/controls/checkbox-group.js +7 -7
  180. package/lib/forms/controls/checkboxed-list-input.js +7 -1
  181. package/lib/forms/controls/checkboxed-list-input.test.js +6 -6
  182. package/lib/forms/controls/controls.js +2 -2
  183. package/lib/forms/controls/derived-frame.js +8 -4
  184. package/lib/forms/controls/derived.js +1 -1
  185. package/lib/forms/controls/dropdown.js +5 -3
  186. package/lib/forms/controls/editable-collection-subset.js +2 -2
  187. package/lib/forms/controls/file.js +26 -2
  188. package/lib/forms/controls/file.test.js +2 -2
  189. package/lib/forms/controls/form-control.js +1 -1
  190. package/lib/forms/controls/hidden-input.js +4 -1
  191. package/lib/forms/controls/{photo.js → image.js} +6 -7
  192. package/lib/forms/controls/{photo.test.js → image.test.js} +8 -23
  193. package/lib/forms/controls/multiple-files.js +10 -1
  194. package/lib/forms/controls/{multiple-photos.js → multiple-images.js} +3 -3
  195. package/lib/forms/controls/simple-input.js +13 -12
  196. package/lib/forms/controls/single-reference.js +4 -0
  197. package/lib/forms/controls/single-reference.test.js +1 -1
  198. package/lib/forms/controls/table.js +62 -25
  199. package/lib/forms/controls/textarea.js +5 -3
  200. package/lib/forms/controls/tickable.js +13 -5
  201. package/lib/forms/fields/boolean.js +14 -0
  202. package/lib/forms/fields/checkboxed-list.js +4 -0
  203. package/lib/forms/fields/collection-field.js +9 -0
  204. package/lib/forms/fields/color.js +10 -0
  205. package/lib/forms/fields/coordinates.js +49 -0
  206. package/lib/forms/fields/date.js +34 -0
  207. package/lib/forms/fields/datetime.js +46 -0
  208. package/lib/forms/fields/deep-reverse-single-reference-list.js +81 -0
  209. package/lib/forms/fields/deep-reverse-single-reference-table.js +122 -0
  210. package/lib/forms/fields/email.js +7 -0
  211. package/lib/forms/fields/enum-multiple-sealious.js +32 -0
  212. package/lib/forms/fields/field.js +32 -4
  213. package/lib/forms/fields/field.test.js +8 -8
  214. package/lib/forms/fields/fields.js +23 -8
  215. package/lib/forms/fields/file.js +33 -9
  216. package/lib/forms/fields/file.test.js +5 -17
  217. package/lib/forms/fields/float.js +10 -0
  218. package/lib/forms/fields/get-field-for-sealious.js +213 -0
  219. package/lib/forms/fields/html.js +14 -0
  220. package/lib/forms/fields/image.js +13 -0
  221. package/lib/forms/fields/int.js +23 -0
  222. package/lib/forms/fields/json.js +31 -0
  223. package/lib/forms/fields/markdown.js +14 -0
  224. package/lib/forms/fields/multiple-files.js +4 -0
  225. package/lib/forms/fields/number.js +6 -0
  226. package/lib/forms/fields/password.js +13 -0
  227. package/lib/forms/fields/pick-from-list-sealious.js +17 -0
  228. package/lib/forms/fields/pick-from-list.js +6 -2
  229. package/lib/forms/fields/proxy-field.js +3 -0
  230. package/lib/forms/fields/regexp.js +14 -0
  231. package/lib/forms/fields/simple-form-field.js +61 -2
  232. package/lib/forms/fields/single-reference.js +44 -0
  233. package/lib/forms/fields/structured-array.js +61 -12
  234. package/lib/forms/fields/table.js +29 -2
  235. package/lib/forms/fields/text.js +17 -0
  236. package/lib/forms/fields/url.js +17 -0
  237. package/lib/forms/form.js +30 -14
  238. package/lib/forms/form.test.js +5 -7
  239. package/lib/forms/multiform.js +10 -9
  240. package/lib/forms/multiform.test.js +5 -5
  241. package/lib/generate-collections.js +2 -3
  242. package/lib/generate-components.js +2 -3
  243. package/lib/generate-routes.js +3 -5
  244. package/lib/generate-routes.test.js +7 -16
  245. package/lib/generate-stimulus.js +4 -4
  246. package/lib/get-fonts.js +29 -27
  247. package/lib/index.js +1 -0
  248. package/lib/make-env.js +1 -1
  249. package/lib/make-hidden-inputs.js +4 -4
  250. package/lib/mount.js +11 -1
  251. package/lib/notifier.js +3 -4
  252. package/lib/page/list.js +20 -15
  253. package/lib/page/mountable-with-fields.js +14 -6
  254. package/lib/page/mountable-with-fields.test.js +1 -1
  255. package/lib/page/mountable.js +0 -1
  256. package/lib/page/page.js +0 -1
  257. package/lib/register-external.js +4 -4
  258. package/lib/templates/form.js +9 -10
  259. package/lib/templates/jdd-component.js +1 -1
  260. package/lib/templates/jdd-editor.js +1 -1
  261. package/lib/templates/multiform.js +4 -4
  262. package/lib/templates/page.js +1 -3
  263. package/lib/templates/shared/collection-create-form.js +31 -44
  264. package/lib/templates/shared/collection-edit-form.js +43 -81
  265. package/lib/templates/shared/collection-list.js +13 -21
  266. package/lib/templates/shared/shared-crud-form-fields.js +28 -98
  267. package/lib/test_utils/exec_async.js +3 -3
  268. package/lib/test_utils/test-on-real-app.js +12 -14
  269. package/lib/utils/extract-fields-from-collection.js +60 -20
  270. package/lib/utils/make-slug.js +1 -1
  271. package/lib/utils/wrap-attributes.js +20 -0
  272. package/lib/utils/write-file.js +1 -1
  273. package/package.json +11 -9
  274. package/src/add-collection.ts +1 -3
  275. package/src/add-crud.ts +84 -100
  276. package/src/add-jdd-component.ts +4 -5
  277. package/src/add-list-route.test.ts +1 -1
  278. package/src/add-route.ts +3 -13
  279. package/src/build.ts +6 -4
  280. package/src/builders/backend-ts-builder.ts +0 -1
  281. package/src/builders/builder.ts +4 -1
  282. package/src/builders/colors-builder.ts +11 -9
  283. package/src/builders/css-builder.ts +4 -1
  284. package/src/builders/fonts-builder.ts +0 -1
  285. package/src/builders/frontend-ts-builder.ts +0 -1
  286. package/src/cli.ts +5 -7
  287. package/src/components/tabs.ts +38 -37
  288. package/src/components/toggle-modal.ts +1 -1
  289. package/src/controllers/table-add-button.stimulus.ts +35 -0
  290. package/src/esbuild-plugins/rewrite-asset-imports.ts +7 -10
  291. package/src/forms/controls/array.ts +35 -36
  292. package/src/forms/controls/autocomplete.ts +2 -2
  293. package/src/forms/controls/big-radio-group.ts +4 -4
  294. package/src/forms/controls/checkbox-group.ts +10 -10
  295. package/src/forms/controls/checkboxed-list-input.test.ts +6 -6
  296. package/src/forms/controls/checkboxed-list-input.ts +16 -8
  297. package/src/forms/controls/controls.ts +2 -2
  298. package/src/forms/controls/derived-frame.ts +16 -11
  299. package/src/forms/controls/derived.ts +7 -6
  300. package/src/forms/controls/dropdown.ts +13 -13
  301. package/src/forms/controls/editable-collection-subset.ts +4 -3
  302. package/src/forms/controls/field-group.ts +1 -1
  303. package/src/forms/controls/file.test.ts +4 -2
  304. package/src/forms/controls/file.ts +30 -7
  305. package/src/forms/controls/form-control.ts +8 -3
  306. package/src/forms/controls/hidden-input.ts +5 -1
  307. package/src/forms/controls/html.ts +1 -0
  308. package/src/forms/controls/{photo.test.ts → image.test.ts} +7 -24
  309. package/src/forms/controls/{photo.ts → image.ts} +4 -6
  310. package/src/forms/controls/multiple-files.ts +23 -8
  311. package/src/forms/controls/{multiple-photos.ts → multiple-images.ts} +2 -2
  312. package/src/forms/controls/number.ts +1 -1
  313. package/src/forms/controls/simple-input.ts +21 -33
  314. package/src/forms/controls/single-reference.test.ts +1 -1
  315. package/src/forms/controls/single-reference.ts +11 -3
  316. package/src/forms/controls/table.ts +87 -33
  317. package/src/forms/controls/textarea.ts +7 -5
  318. package/src/forms/controls/tickable.ts +13 -7
  319. package/src/forms/fields/boolean.ts +27 -2
  320. package/src/forms/fields/checkboxed-list.ts +11 -2
  321. package/src/forms/fields/collection-field.ts +21 -3
  322. package/src/forms/fields/color.ts +9 -0
  323. package/src/forms/fields/coordinates.ts +66 -0
  324. package/src/forms/fields/date.ts +50 -0
  325. package/src/forms/fields/datetime.ts +66 -0
  326. package/src/forms/fields/deep-reverse-single-reference-list.ts +130 -0
  327. package/src/forms/fields/deep-reverse-single-reference-table.ts +213 -0
  328. package/src/forms/fields/email.ts +10 -1
  329. package/src/forms/fields/enum-multiple-sealious.ts +48 -0
  330. package/src/forms/fields/existing-sealious-value.ts +1 -1
  331. package/src/forms/fields/field.test.ts +8 -8
  332. package/src/forms/fields/field.ts +98 -11
  333. package/src/forms/fields/fields.ts +23 -8
  334. package/src/forms/fields/file.test.ts +5 -17
  335. package/src/forms/fields/file.ts +44 -16
  336. package/src/forms/fields/float.ts +9 -0
  337. package/src/forms/fields/get-field-for-sealious.ts +337 -0
  338. package/src/forms/fields/html.ts +15 -0
  339. package/src/forms/fields/image.ts +12 -0
  340. package/src/forms/fields/int.ts +25 -0
  341. package/src/forms/fields/json.ts +48 -0
  342. package/src/forms/fields/markdown.ts +15 -0
  343. package/src/forms/fields/multiple-files.ts +10 -1
  344. package/src/forms/fields/number.ts +10 -3
  345. package/src/forms/fields/password.ts +13 -0
  346. package/src/forms/fields/pick-from-list-sealious.ts +22 -0
  347. package/src/forms/fields/pick-from-list.ts +8 -4
  348. package/src/forms/fields/proxy-field.ts +7 -1
  349. package/src/forms/fields/regexp.ts +27 -1
  350. package/src/forms/fields/simple-form-field.ts +103 -7
  351. package/src/forms/fields/single-reference.ts +62 -0
  352. package/src/forms/fields/structured-array.ts +111 -18
  353. package/src/forms/fields/table.ts +39 -16
  354. package/src/forms/fields/text.ts +18 -0
  355. package/src/forms/fields/url.ts +20 -0
  356. package/src/forms/form-types.ts +5 -4
  357. package/src/forms/form.test.ts +5 -7
  358. package/src/forms/form.ts +42 -23
  359. package/src/forms/forms.css +0 -85
  360. package/src/forms/multiform.test.ts +9 -9
  361. package/src/forms/multiform.ts +12 -10
  362. package/src/generate-collections.ts +2 -3
  363. package/src/generate-components.ts +2 -3
  364. package/src/generate-routes.test.ts +7 -16
  365. package/src/generate-routes.ts +6 -10
  366. package/src/generate-stimulus.ts +4 -5
  367. package/src/get-fonts.ts +32 -30
  368. package/src/index.ts +2 -1
  369. package/src/make-env.ts +1 -1
  370. package/src/make-hidden-inputs.ts +8 -7
  371. package/src/mount.ts +16 -7
  372. package/src/notifier.ts +4 -7
  373. package/src/page/default-list-filters.ts +1 -0
  374. package/src/page/list.ts +33 -28
  375. package/src/page/mountable-with-fields.test.ts +1 -1
  376. package/src/page/mountable-with-fields.ts +21 -12
  377. package/src/page/mountable.ts +0 -1
  378. package/src/page/page.ts +2 -3
  379. package/src/page/props-parser.ts +1 -1
  380. package/src/page/sealious-list.ts +1 -1
  381. package/src/page/stateful-page.ts +6 -10
  382. package/src/register-external.ts +5 -5
  383. package/src/templates/form.ts +9 -11
  384. package/src/templates/jdd-component.ts +1 -1
  385. package/src/templates/jdd-editor.ts +2 -4
  386. package/src/templates/list.ts +0 -1
  387. package/src/templates/multiform.ts +4 -4
  388. package/src/templates/page.ts +1 -6
  389. package/src/templates/shared/collection-create-form.ts +34 -71
  390. package/src/templates/shared/collection-edit-form.ts +46 -108
  391. package/src/templates/shared/collection-list.ts +13 -21
  392. package/src/templates/shared/item-delete.ts +0 -1
  393. package/src/templates/shared/shared-crud-form-fields.ts +38 -177
  394. package/src/templates/templates.ts +5 -1
  395. package/src/test_utils/exec_async.ts +3 -4
  396. package/src/test_utils/test-on-real-app.ts +13 -14
  397. package/src/utils/browser-creator.js +0 -1
  398. package/src/utils/exec.ts +0 -1
  399. package/src/utils/extract-fields-from-collection.ts +76 -25
  400. package/src/utils/input-wrapper.ts +1 -1
  401. package/src/utils/make-slug.ts +1 -1
  402. package/src/utils/wrap-attributes.ts +17 -0
  403. package/src/utils/write-file.ts +1 -1
  404. package/.eslintrc.cjs +0 -39
  405. package/lib/add-verbose-crud.js +0 -119
  406. package/lib/crud-field-snippets.js +0 -52
  407. package/lib/find-css-includes.js +0 -3
  408. package/lib/forms/controls/reverse-single-reference.js +0 -1
  409. package/lib/forms/fields/enum-multiple.js +0 -47
  410. package/lib/forms/fields/enum-multiple.test.js +0 -27
  411. package/lib/forms/fields/enum.js +0 -41
  412. package/lib/forms/fields/enum.test.js +0 -21
  413. package/lib/forms/fields/reverse-single-reference.js +0 -17
  414. package/lib/templates/shared/handlers/boolean.js +0 -14
  415. package/lib/templates/shared/handlers/date.js +0 -8
  416. package/lib/templates/shared/handlers/deep-reverse-single-reference.js +0 -209
  417. package/lib/templates/shared/handlers/default.js +0 -49
  418. package/lib/templates/shared/handlers/enum.js +0 -19
  419. package/lib/templates/shared/handlers/file.js +0 -23
  420. package/lib/templates/shared/handlers/image.js +0 -32
  421. package/lib/templates/shared/handlers/int.js +0 -11
  422. package/lib/templates/shared/handlers/jdd.js +0 -10
  423. package/lib/templates/shared/handlers/single-reference.js +0 -12
  424. package/lib/templates/shared/handlers/structured-array.js +0 -33
  425. package/src/add-verbose-crud.ts +0 -138
  426. package/src/crud-field-snippets.ts +0 -57
  427. package/src/find-css-includes.ts +0 -3
  428. package/src/forms/controls/reverse-single-reference.ts +0 -50
  429. package/src/forms/fields/enum-multiple.test.ts +0 -31
  430. package/src/forms/fields/enum-multiple.ts +0 -62
  431. package/src/forms/fields/enum.test.ts +0 -25
  432. package/src/forms/fields/enum.ts +0 -56
  433. package/src/forms/fields/reverse-single-reference.ts +0 -20
  434. package/src/templates/shared/handlers/boolean.ts +0 -18
  435. package/src/templates/shared/handlers/date.ts +0 -12
  436. package/src/templates/shared/handlers/deep-reverse-single-reference.ts +0 -244
  437. package/src/templates/shared/handlers/default.ts +0 -64
  438. package/src/templates/shared/handlers/enum.ts +0 -23
  439. package/src/templates/shared/handlers/file.ts +0 -27
  440. package/src/templates/shared/handlers/image.ts +0 -45
  441. package/src/templates/shared/handlers/int.ts +0 -15
  442. package/src/templates/shared/handlers/jdd.ts +0 -14
  443. package/src/templates/shared/handlers/single-reference.ts +0 -16
  444. package/src/templates/shared/handlers/structured-array.ts +0 -42
@@ -7,9 +7,9 @@ class BigRadioGroup extends FormFieldControl {
7
7
  this.options = options;
8
8
  }
9
9
  async render(fctx) {
10
- const { raw: current_value } = await this.field.getValue(
10
+ const { raw: current_value } = await this.field.getParsedValue(
11
11
  fctx.ctx,
12
- fctx.data
12
+ fctx.data.raw_values
13
13
  );
14
14
  return tempstream`<div class="bigradios">
15
15
  ${Object.entries(this.options).map(([key, { description }]) => {
@@ -18,24 +18,24 @@ class CheckboxGroup extends FormFieldControl {
18
18
  }).render(fctx);
19
19
  }
20
20
  async render(fctx) {
21
- const { parsed: values } = await this.field.getValue(
21
+ const { parsed: values } = await this.field.getParsedValue(
22
22
  fctx.ctx,
23
- fctx.data
23
+ fctx.data.raw_values
24
24
  );
25
- const checkboxes = this.field.options.map(
25
+ const checkboxes = (await this.field.generateOptions(fctx.ctx)).map(
26
26
  (option) => new CheckboxWithValue(
27
27
  new ProxyFormField(
28
28
  false,
29
29
  this.field.name,
30
30
  false,
31
- (values || []).includes(option)
31
+ Object.keys(values || {}).includes(option.value)
32
32
  ),
33
33
  {
34
- id: this.field.name + "__" + option,
35
- label: (this.options.checkboxNameToLabel || ((s) => s))(option),
34
+ id: this.field.name + "__" + option.value,
35
+ label: (this.options.checkboxNameToLabel || ((s) => s))(option.value),
36
36
  default_value: false
37
37
  },
38
- option
38
+ option.value
39
39
  )
40
40
  );
41
41
  return this.wrapGroup(fctx, checkboxes);
@@ -21,7 +21,11 @@ class CheckboxedListInput extends FormFieldControl {
21
21
  valid,
22
22
  message,
23
23
  parsed: currentValue
24
- } = await this.field.getValue(fctx.ctx, fctx.data, true);
24
+ } = await this.field.getParsedValue(
25
+ fctx.ctx,
26
+ fctx.data.raw_values,
27
+ true
28
+ );
25
29
  const pickedValues = Object.entries(currentValue || {}).filter(([, is_on]) => is_on).map(([key]) => key);
26
30
  const [options, isVisible] = await Promise.all([
27
31
  this.field.generateOptions(fctx.ctx),
@@ -56,6 +60,7 @@ class CheckboxedListInput extends FormFieldControl {
56
60
  ([group_label, options2]) => tempstream` <h3>
57
61
  ${group_label}
58
62
  </h3>
63
+
59
64
  ${options2.map(
60
65
  ({ value, label }) => this.renderOption({
61
66
  name,
@@ -99,6 +104,7 @@ class CheckboxedListInput extends FormFieldControl {
99
104
  name="${name}.${value}"
100
105
  ${checked ? "checked" : ""}
101
106
  form=${form_id}
107
+ autocomplete="off"
102
108
  />
103
109
  <label for="${name}.${value}">${label || value}</label>
104
110
  `
@@ -18,7 +18,7 @@ describe("checkboxed-list", () => {
18
18
  });
19
19
  it("sends the values", async () => {
20
20
  const port = await getPort();
21
- console.log(`Using port ${port} form checkboxed-list-input.test.ts`);
21
+ console.info(`Using port ${port} form checkboxed-list-input.test.ts`);
22
22
  const app = new Koa();
23
23
  const router = new Router();
24
24
  const fields = {
@@ -62,7 +62,7 @@ describe("checkboxed-list", () => {
62
62
  describe("behavior with (non)required", () => {
63
63
  it("allows to send a form when no value is selected and fiels is not required", async () => {
64
64
  const port = await getPort();
65
- console.log(`Using port ${port} form checkboxed-list-input.test.ts`);
65
+ console.info(`Using port ${port} form checkboxed-list-input.test.ts`);
66
66
  const app = new Koa();
67
67
  const router = new Router();
68
68
  const fields = {
@@ -105,7 +105,7 @@ describe("checkboxed-list", () => {
105
105
  });
106
106
  it("does not allow to send a form when no value is selected and field IS required", async () => {
107
107
  const port = await getPort();
108
- console.log(`Using port ${port} form checkboxed-list-input.test.ts`);
108
+ console.info(`Using port ${port} form checkboxed-list-input.test.ts`);
109
109
  const app = new Koa();
110
110
  const router = new Router();
111
111
  const fields = {
@@ -149,7 +149,7 @@ describe("checkboxed-list", () => {
149
149
  });
150
150
  it("allows to send a form when no value is selected and field IS required", async () => {
151
151
  const port = await getPort();
152
- console.log(`Using port ${port} form checkboxed-list-input.test.ts`);
152
+ console.info(`Using port ${port} form checkboxed-list-input.test.ts`);
153
153
  const app = new Koa();
154
154
  const router = new Router();
155
155
  const fields = {
@@ -194,7 +194,7 @@ describe("checkboxed-list", () => {
194
194
  });
195
195
  it("renders the label", async () => {
196
196
  const port = await getPort();
197
- console.log(`Using port ${port} form checkboxed-list-input.test.ts`);
197
+ console.info(`Using port ${port} form checkboxed-list-input.test.ts`);
198
198
  const app = new Koa();
199
199
  const router = new Router();
200
200
  const fields = {
@@ -233,7 +233,7 @@ describe("checkboxed-list", () => {
233
233
  });
234
234
  it("groups checkboxes based on the value of the 'group' attribute", async () => {
235
235
  const port = await getPort();
236
- console.log(`Using port ${port} form checkboxed-list-input.test.ts`);
236
+ console.info(`Using port ${port} form checkboxed-list-input.test.ts`);
237
237
  const app = new Koa();
238
238
  const router = new Router();
239
239
  const fields = {
@@ -23,10 +23,10 @@ export * from "./collapsible-field-group.js";
23
23
  export * from "./collapsible-checkbox-group.js";
24
24
  export * from "./autocomplete.js";
25
25
  export * from "./file.js";
26
- export * from "./photo.js";
26
+ export * from "./image.js";
27
27
  export * from "./multiple-files.js";
28
28
  export * from "./number.js";
29
- export * from "./multiple-photos.js";
29
+ export * from "./multiple-images.js";
30
30
  export * from "./array.js";
31
31
  export * from "./table.js";
32
32
  export {
@@ -10,12 +10,12 @@ class DerivedFrame extends Derived {
10
10
  async (values, consts) => (
11
11
  /* HTML */
12
12
  `<turbo-frame
13
- id="${consts.frame_id}"
14
- src="./${consts.frame_id}?${Object.entries({
13
+ id="${consts.frame_id}"
14
+ src="./${consts.frame_id}?${Object.entries({
15
15
  ...consts,
16
16
  ...values || {}
17
17
  }).map(([key, value]) => `${key}=${value}`).join("&")}"
18
- ></turbo-frame>`
18
+ ></turbo-frame>`
19
19
  ),
20
20
  async (fctx) => ({
21
21
  form_id: fctx.form_id,
@@ -58,7 +58,11 @@ class DerivedFrame extends Derived {
58
58
  await this.generateFrameContent(
59
59
  new FormControlContext(
60
60
  ctx,
61
- ctx.query,
61
+ {
62
+ messages: [],
63
+ field_messages: {},
64
+ raw_values: ctx.query
65
+ },
62
66
  [],
63
67
  query.field_name_prefix,
64
68
  query.form_id,
@@ -12,7 +12,7 @@ class Derived extends FormControl {
12
12
  async getBackendValues(fctx) {
13
13
  const fieldnames = this.fields.map((f) => f.name);
14
14
  const result = Object.fromEntries(
15
- Object.entries(fctx.data).filter(
15
+ Object.entries(fctx.data.raw_values).filter(
16
16
  ([key]) => fieldnames.includes(key)
17
17
  )
18
18
  );
@@ -30,12 +30,14 @@ class FreeformDropdown extends SimpleInput {
30
30
  };
31
31
  }
32
32
  async renderInput(ctx, attributes_str, data) {
33
- const { parsed: picked_value } = await this.field.getValue(ctx, data);
33
+ const { parsed: picked_value } = await this.field.getParsedValue(
34
+ ctx,
35
+ data
36
+ );
34
37
  return (
35
38
  /* HTML */
36
39
  tempstream`<select ${attributes_str}>
37
- ${// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
38
- Promise.resolve(this.generateOptions(ctx)).then(
40
+ ${Promise.resolve(this.generateOptions(ctx)).then(
39
41
  (options) => options.map(
40
42
  ({ value, label }) => `<option value="${attribute(value)}" ${(value || "") == picked_value ? "selected" : ""}>${label}</option>`
41
43
  )
@@ -11,9 +11,9 @@ class EditableCollectionSubset extends FormFieldControl {
11
11
  this.role = "input";
12
12
  }
13
13
  async render(fctx) {
14
- const { parsed: values } = await this.field.getValue(
14
+ const { parsed: values } = await this.field.getParsedValue(
15
15
  fctx.ctx,
16
- fctx.data
16
+ fctx.data.raw_values
17
17
  );
18
18
  return tempstream`<div>
19
19
  <ul>
@@ -1,6 +1,8 @@
1
+ import { PathFilePointer } from "@sealcode/file-manager";
1
2
  import { tempstream } from "tempstream";
2
3
  import { SimpleInput } from "./simple-input.js";
3
4
  import { htmlEscape } from "escape-goat";
5
+ import { extname } from "node:path";
4
6
  class File extends SimpleInput {
5
7
  getType() {
6
8
  return "file";
@@ -11,12 +13,31 @@ class File extends SimpleInput {
11
13
  if (!file) {
12
14
  return empty_container;
13
15
  }
16
+ if (file instanceof PathFilePointer) {
17
+ const filename = await file.getOriginalFilename();
18
+ return tempstream`<div class="${class_name}">
19
+ <div class="${class_name}__icon">
20
+ <picture>
21
+ <img
22
+ src="/dist/sealgen/file-icon.svg"
23
+ width="80"
24
+ height="80"
25
+ alt=""
26
+ />
27
+ <span class="${class_name}__icon__extension"
28
+ >${extname(filename)}</span
29
+ >
30
+ </picture>
31
+ <a href="${file.getURL()}" download>${filename}</a>
32
+ </div>
33
+ </div>`;
34
+ }
14
35
  return tempstream`<div class="${class_name}">
15
36
  ${file.getOriginalFilename()}
16
37
  </div>`;
17
38
  }
18
39
  async preInput(fctx, data) {
19
- let { parsed } = await this.field.getValue(fctx.ctx, data);
40
+ let { parsed } = await this.field.getParsedValue(fctx.ctx, data);
20
41
  if (parsed === null) {
21
42
  parsed = { old: null, new: null };
22
43
  }
@@ -35,7 +56,10 @@ class File extends SimpleInput {
35
56
  }
36
57
  async getInputAttributes(fctx) {
37
58
  const original = await super.getInputAttributes(fctx);
38
- const { parsed } = await this.field.getValue(fctx.ctx, fctx.data);
59
+ const { parsed } = await this.field.getParsedValue(
60
+ fctx.ctx,
61
+ fctx.data.raw_values
62
+ );
39
63
  return {
40
64
  ...original,
41
65
  name: this.field.name + "[new]",
@@ -20,11 +20,11 @@ describe("file-control", () => {
20
20
  });
21
21
  it("doesn't require image input if it already has old-value", async () => {
22
22
  const port = await getPort();
23
- console.log(`Using port ${port} for photo.test.ts`);
23
+ console.info(`Using port ${port} for image.test.ts`);
24
24
  const app = new Koa();
25
25
  const router = new Router();
26
26
  const fields = {
27
- file: new Fields.File(true, new FileManager("/tmp", "/uploaded_files"))
27
+ file: new Fields.File(true)
28
28
  };
29
29
  let submit_called = false;
30
30
  mount(
@@ -9,7 +9,7 @@ class FormControlContext {
9
9
  }
10
10
  }
11
11
  class FormControl {
12
- // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any
12
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
13
  mount(_router, _form) {
14
14
  }
15
15
  }
@@ -7,7 +7,10 @@ class HiddenInput extends FormFieldControl {
7
7
  this.field = field;
8
8
  }
9
9
  async render(fctx) {
10
- const { raw } = await this.field.getValue(fctx.ctx, fctx.data);
10
+ const { raw } = await this.field.getParsedValue(
11
+ fctx.ctx,
12
+ fctx.data.raw_values
13
+ );
11
14
  return tempstream`<input type="hidden" name="${this.field.name}" value="${attribute((raw || "").toString())}" form="${fctx.form_id}">`;
12
15
  }
13
16
  }
@@ -1,22 +1,21 @@
1
1
  import { tempstream } from "tempstream";
2
2
  import { File } from "./file.js";
3
- class Photo extends File {
4
- constructor(field, imageRouter, options) {
3
+ class Image extends File {
4
+ constructor(field, options) {
5
5
  super(field, options);
6
6
  this.field = field;
7
- this.imageRouter = imageRouter;
8
7
  }
9
8
  async getImgStyle() {
10
9
  return "width: 100px; height: 100px; object-fit: contain";
11
10
  }
12
- async renderFilePreview(_ctx, file) {
11
+ async renderFilePreview(ctx, file) {
13
12
  const class_name = "file_preview";
14
13
  const empty_container = `<div class="${class_name}"></div>`;
15
14
  if (!file) {
16
15
  return empty_container;
17
16
  }
18
17
  return tempstream`<div class="${class_name}">
19
- ${this.imageRouter.image(await file.getPath(), {
18
+ ${ctx.$app.imageRouter.image(await file.getPath(), {
20
19
  resolutions: [100, 200],
21
20
  sizesAttr: "100px",
22
21
  crop: { width: 100, height: 100 },
@@ -54,6 +53,6 @@ class Photo extends File {
54
53
  }
55
54
  }
56
55
  export {
57
- Photo
56
+ Image
58
57
  };
59
- //# sourceMappingURL=photo.js.map
58
+ //# sourceMappingURL=image.js.map
@@ -5,8 +5,7 @@ import { mount } from "../../mount.js";
5
5
  import { Form } from "../form.js";
6
6
  import { getBrowser } from "../../utils/browser-creator.js";
7
7
  import { Fields } from "../../index.js";
8
- import { Photo } from "./photo.js";
9
- import { KoaResponsiveImageRouter } from "koa-responsive-image-router";
8
+ import { Image } from "./image.js";
10
9
  import _locreq from "locreq";
11
10
  import { module_dirname } from "../../utils/module-dirname.js";
12
11
  import { FileManager, PathFilePointer } from "@sealcode/file-manager";
@@ -22,20 +21,13 @@ describe("photo-control", () => {
22
21
  });
23
22
  it("sends the old photo if it wasn't changed and it has an initial value", async () => {
24
23
  const port = await getPort();
25
- console.log(`Using port ${port} for photo.test.ts`);
24
+ console.info(`Using port ${port} for photo.test.ts`);
26
25
  const app = new Koa();
27
26
  const router = new Router();
28
27
  const fields = {
29
- photo: new Fields.File(false, new FileManager("/tmp", "/uploaded_files"))
28
+ photo: new Fields.File(false)
30
29
  };
31
30
  let received_photo;
32
- const imageRouter = new KoaResponsiveImageRouter({
33
- staticPath: "/images",
34
- thumbnailSize: 20,
35
- cacheManagerResolutionThreshold: 50,
36
- imageStoragePath: `/tmp/image-cache-${port}`,
37
- smartCropStoragePath: `/tmp/smartcrop-storage-${port}`
38
- });
39
31
  mount(
40
32
  router,
41
33
  "/",
@@ -43,7 +35,7 @@ describe("photo-control", () => {
43
35
  constructor() {
44
36
  super(...arguments);
45
37
  this.fields = fields;
46
- this.controls = [new Photo(fields.photo, imageRouter)];
38
+ this.controls = [new Image(fields.photo)];
47
39
  }
48
40
  async onSubmit(ctx) {
49
41
  const data = await this.getParsedValues(ctx);
@@ -76,20 +68,13 @@ describe("photo-control", () => {
76
68
  });
77
69
  it("doesn't require image input if it already has old-value", async () => {
78
70
  const port = await getPort();
79
- console.log(`Using port ${port} for photo.test.ts`);
71
+ console.info(`Using port ${port} for photo.test.ts`);
80
72
  const app = new Koa();
81
73
  const router = new Router();
82
74
  const fields = {
83
- photo: new Fields.File(true, new FileManager("/tmp", "/uploaded_files"))
75
+ photo: new Fields.File(true)
84
76
  };
85
77
  let received_photo;
86
- const imageRouter = new KoaResponsiveImageRouter({
87
- staticPath: "/images",
88
- thumbnailSize: 20,
89
- cacheManagerResolutionThreshold: 50,
90
- imageStoragePath: `/tmp/image-cache-${port}`,
91
- smartCropStoragePath: `/tmp/smartcrop-storage-${port}`
92
- });
93
78
  let submit_called = false;
94
79
  mount(
95
80
  router,
@@ -98,7 +83,7 @@ describe("photo-control", () => {
98
83
  constructor() {
99
84
  super(...arguments);
100
85
  this.fields = fields;
101
- this.controls = [new Photo(fields.photo, imageRouter)];
86
+ this.controls = [new Image(fields.photo)];
102
87
  }
103
88
  async onSubmit(ctx) {
104
89
  submit_called = true;
@@ -132,4 +117,4 @@ describe("photo-control", () => {
132
117
  });
133
118
  }).timeout(1e4);
134
119
  });
135
- //# sourceMappingURL=photo.test.js.map
120
+ //# sourceMappingURL=image.test.js.map
@@ -107,7 +107,7 @@ class MultipleFiles extends FormFieldControl {
107
107
  if (!token) {
108
108
  return null;
109
109
  }
110
- return await item.collection.app.FileManager.fromToken(token);
110
+ return await item.collection.app.fileManager.fromToken(token);
111
111
  }
112
112
  async renderFileItemPreview(_fileItem, file) {
113
113
  return file.getOriginalFilename();
@@ -186,6 +186,15 @@ class MultipleFiles extends FormFieldControl {
186
186
  `
187
187
  );
188
188
  }
189
+ setLabel(label) {
190
+ this.options.label = label;
191
+ }
192
+ setUploadLabel(label) {
193
+ this.options.uploadLabel = label;
194
+ }
195
+ setAdditionalFieldsGetter(fn) {
196
+ this.options.getAdditionalFields = fn;
197
+ }
189
198
  }
190
199
  export {
191
200
  MultipleFiles
@@ -1,7 +1,7 @@
1
1
  import { PathFilePointer } from "@sealcode/file-manager";
2
2
  import { tempstream } from "tempstream";
3
3
  import { MultipleFiles } from "./multiple-files.js";
4
- class MultiplePhotos extends MultipleFiles {
4
+ class MultipleImages extends MultipleFiles {
5
5
  constructor(field, imageRouter, options) {
6
6
  super(field, options);
7
7
  this.field = field;
@@ -37,6 +37,6 @@ class MultiplePhotos extends MultipleFiles {
37
37
  }
38
38
  }
39
39
  export {
40
- MultiplePhotos
40
+ MultipleImages
41
41
  };
42
- //# sourceMappingURL=multiple-photos.js.map
42
+ //# sourceMappingURL=multiple-images.js.map
@@ -26,25 +26,23 @@ class SimpleInput extends FormFieldControl {
26
26
  async getInputAttributes(fctx) {
27
27
  const readonly = this.options.readonly || false;
28
28
  const required = this.field.required;
29
- const { parsed, raw, valid } = await this.field.getValue(
29
+ const { raw, valid } = await this.field.getParsedValue(
30
30
  fctx.ctx,
31
- fctx.data,
31
+ fctx.data.raw_values,
32
32
  true
33
33
  );
34
34
  return Object.fromEntries([
35
35
  ["id", this.getID()],
36
36
  ["type", this.getType()],
37
37
  ["name", `${fctx.field_name_prefix}${this.field.name}`],
38
- [
39
- "value",
40
- !valid && raw ? raw.toString() : parsed !== void 0 && parsed !== null ? parsed?.toString() || "" : ""
41
- ],
38
+ ["value", raw],
42
39
  ...fctx.form_id ? [["form", fctx.form_id]] : [],
43
40
  ["placeholder", this.getPlaceholder()],
44
41
  ...readonly ? [["readonly", true]] : [],
45
42
  ...required ? [["required", true]] : [],
46
43
  ...!this.options.autocomplete ? [["autocomplete", "off"]] : [],
47
- ...this.options.step ? [["step", this.options.step]] : []
44
+ ...this.options.step ? [["step", this.options.step]] : [],
45
+ ["aria-invalid", String(!valid)]
48
46
  ]);
49
47
  }
50
48
  async postInput(_) {
@@ -67,9 +65,9 @@ class SimpleInput extends FormFieldControl {
67
65
  async render(fctx) {
68
66
  const id = this.getID();
69
67
  const label = this.getLabel();
70
- const { valid, message } = await this.field.getValue(
68
+ const { valid, message } = await this.field.getParsedValue(
71
69
  fctx.ctx,
72
- fctx.data,
70
+ fctx.data.raw_values,
73
71
  true
74
72
  );
75
73
  return inputWrapper(
@@ -77,14 +75,17 @@ class SimpleInput extends FormFieldControl {
77
75
  this.getWrapperModifiers(),
78
76
  tempstream`
79
77
  ${label ? `<label for="${id}">${label}</label>` : ""}
80
- ${await this.preInput(fctx, fctx.data)}
78
+ ${await this.preInput(fctx, fctx.data.raw_values)}
81
79
  ${this.renderInput(
82
80
  fctx.ctx,
83
81
  renderAttributes(await this.getInputAttributes(fctx)),
84
- fctx.data
82
+ fctx.data.raw_values
85
83
  )}
86
84
  ${this.postInput(fctx.ctx)}
87
- ${~valid && !this.options.hide_errors && fctx.validate ? `<div class="input__error">${message}</div>` : ""}
85
+ ${~valid && !this.options.hide_errors && fctx.validate ? `<div class="input__error">${[
86
+ message,
87
+ fctx.data.field_messages?.[this.field.name]?.message
88
+ ].filter((e) => !!e).join(" \xB7 ")}</div>` : ""}
88
89
  `
89
90
  );
90
91
  }
@@ -22,6 +22,10 @@ class SingleReferenceDropdown extends FreeformDropdown {
22
22
  this.field = field;
23
23
  this.options = options;
24
24
  }
25
+ setOptionLabelGetter(getter) {
26
+ this.options.getLabel = getter;
27
+ return this;
28
+ }
25
29
  }
26
30
  export {
27
31
  SingleReferenceDropdown
@@ -30,7 +30,7 @@ describe("single-reference.test", () => {
30
30
  const form_file_path = "src/back/routes/some-form.form.ts";
31
31
  await test_app.addFile(
32
32
  form_file_path,
33
- await formTemplate("SomeForm", form_file_path, {
33
+ await formTemplate("SomeForm", {
34
34
  postimport: `import {Comments} from "../collections/collections.js"; import {Fields} from "@sealcode/sealgen";`,
35
35
  fields: `article: new Fields.CollectionField(true, Comments.fields.article),`,
36
36
  controls: `new Controls.SingleReferenceDropdown(fields.article, {getLabel: item=>item.get("title")}),`,