@sealcode/sealgen 0.18.8 → 0.19.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 (374) hide show
  1. package/.eslintrc.cjs +7 -2
  2. package/.xunit +75 -0
  3. package/@types/add-crud.d.sync-conflict-20250918-184311-TFDLWFG.ts +1 -0
  4. package/@types/builders/colors-builder.d.sync-conflict-20250918-184323-TFDLWFG.ts +10 -0
  5. package/@types/builders/colors-builder.d.ts +1 -1
  6. package/@types/builders/fonts-builder.d.sync-conflict-20250918-184322-TFDLWFG.ts +7 -0
  7. package/@types/builders/fonts-builder.d.ts +1 -1
  8. package/@types/controllers/table-add-button.d.ts +6 -0
  9. package/@types/controllers/table-add-button.stimulus.d.ts +6 -0
  10. package/@types/crud-field-snippets.d.sync-conflict-20250918-184323-TFDLWFG.ts +1 -0
  11. package/@types/crud-field-snippets.d.ts +1 -3
  12. package/@types/forms/controls/array.d.sync-conflict-20250918-184306-TFDLWFG.ts +33 -0
  13. package/@types/forms/controls/array.d.ts +1 -2
  14. package/@types/forms/controls/array.sync-conflict-20250918-222045-TFDLWFG.d.ts +33 -0
  15. package/@types/forms/controls/autocomplete.d.sync-conflict-20250918-222042-TFDLWFG.ts +22 -0
  16. package/@types/forms/controls/autocomplete.d.ts +1 -1
  17. package/@types/forms/controls/checkbox-group.d.sync-conflict-20250918-184319-TFDLWFG.ts +21 -0
  18. package/@types/forms/controls/checkbox-group.d.ts +3 -3
  19. package/@types/forms/controls/checkboxed-list-input.d.sync-conflict-20250918-184323-TFDLWFG.ts +21 -0
  20. package/@types/forms/controls/checkboxed-list-input.d.ts +3 -3
  21. package/@types/forms/controls/controls.d.ts +2 -2
  22. package/@types/forms/controls/derived-frame.d.sync-conflict-20250918-184314-TFDLWFG.ts +19 -0
  23. package/@types/forms/controls/derived-frame.d.ts +0 -1
  24. package/@types/forms/controls/dropdown.d.sync-conflict-20250918-222044-TFDLWFG.ts +30 -0
  25. package/@types/forms/controls/dropdown.d.ts +1 -1
  26. package/@types/forms/controls/file.d.sync-conflict-20250918-222045-TFDLWFG.ts +13 -0
  27. package/@types/forms/controls/file.d.ts +1 -2
  28. package/@types/forms/controls/form-control.d.sync-conflict-20250918-184322-TFDLWFG.ts +19 -0
  29. package/@types/forms/controls/form-control.d.sync-conflict-20250918-222046-TFDLWFG.ts +19 -0
  30. package/@types/forms/controls/form-control.d.ts +7 -3
  31. package/@types/forms/controls/image.d.ts +19 -0
  32. package/@types/forms/controls/image.test.d.ts +1 -0
  33. package/@types/forms/controls/multiple-files.d.sync-conflict-20250918-184318-TFDLWFG.ts +42 -0
  34. package/@types/forms/controls/multiple-files.d.ts +3 -0
  35. package/@types/forms/controls/multiple-images.d.ts +19 -0
  36. package/@types/forms/controls/number.d.sync-conflict-20250918-222046-TFDLWFG.ts +13 -0
  37. package/@types/forms/controls/number.d.ts +1 -1
  38. package/@types/forms/controls/photo.d.sync-conflict-20250918-184321-TFDLWFG.ts +19 -0
  39. package/@types/forms/controls/photo.d.ts +3 -5
  40. package/@types/forms/controls/simple-input.d.sync-conflict-20250918-184310-TFDLWFG.ts +33 -0
  41. package/@types/forms/controls/simple-input.d.sync-conflict-20250918-222042-TFDLWFG.ts +33 -0
  42. package/@types/forms/controls/simple-input.d.ts +5 -4
  43. package/@types/forms/controls/simple-input.sync-conflict-20250918-222045-TFDLWFG.d.ts +33 -0
  44. package/@types/forms/controls/single-reference.d.ts +3 -2
  45. package/@types/forms/controls/table.d.sync-conflict-20250918-184302-TFDLWFG.ts +39 -0
  46. package/@types/forms/controls/table.d.ts +8 -2
  47. package/@types/forms/controls/table.sync-conflict-20250918-222042-TFDLWFG.d.ts +39 -0
  48. package/@types/forms/controls/textarea.d.sync-conflict-20250918-222045-TFDLWFG.ts +25 -0
  49. package/@types/forms/controls/textarea.d.ts +3 -3
  50. package/@types/forms/fields/boolean.d.sync-conflict-20250918-184325-TFDLWFG.ts +22 -0
  51. package/@types/forms/fields/boolean.d.ts +6 -1
  52. package/@types/forms/fields/boolean.sync-conflict-20250918-222042-TFDLWFG.d.ts +22 -0
  53. package/@types/forms/fields/checkboxed-list.d.sync-conflict-20250918-184325-TFDLWFG.ts +23 -0
  54. package/@types/forms/fields/checkboxed-list.d.ts +3 -1
  55. package/@types/forms/fields/collection-field.d.sync-conflict-20250918-184319-TFDLWFG.ts +22 -0
  56. package/@types/forms/fields/collection-field.d.sync-conflict-20250918-222047-TFDLWFG.ts +22 -0
  57. package/@types/forms/fields/collection-field.d.ts +8 -1
  58. package/@types/forms/fields/color.d.ts +4 -0
  59. package/@types/forms/fields/coordinates.d.sync-conflict-20250918-222044-TFDLWFG.ts +14 -0
  60. package/@types/forms/fields/coordinates.d.ts +14 -0
  61. package/@types/forms/fields/date.d.ts +13 -0
  62. package/@types/forms/fields/datetime.d.sync-conflict-20250918-222050-TFDLWFG.ts +4 -0
  63. package/@types/forms/fields/datetime.d.ts +14 -0
  64. package/@types/forms/fields/deep-reverse-single-reference-list.d.ts +24 -0
  65. package/@types/forms/fields/deep-reverse-single-reference-table.d.ts +16 -0
  66. package/@types/forms/fields/email.d.sync-conflict-20250918-184303-TFDLWFG.ts +8 -0
  67. package/@types/forms/fields/email.d.ts +3 -0
  68. package/@types/forms/fields/enum-multiple-sealious.d.ts +16 -0
  69. package/@types/forms/fields/enum-multiple-sealious.sync-conflict-20250918-222047-TFDLWFG.d.ts +16 -0
  70. package/@types/forms/fields/field.d.sync-conflict-20250918-184306-TFDLWFG.ts +70 -0
  71. package/@types/forms/fields/field.d.ts +37 -5
  72. package/@types/forms/fields/fields.d.sync-conflict-20250918-184314-TFDLWFG.ts +29 -0
  73. package/@types/forms/fields/fields.d.ts +23 -8
  74. package/@types/forms/fields/file.d.sync-conflict-20250918-184310-TFDLWFG.ts +23 -0
  75. package/@types/forms/fields/file.d.sync-conflict-20250918-222046-TFDLWFG.ts +23 -0
  76. package/@types/forms/fields/file.d.ts +11 -5
  77. package/@types/forms/fields/file.sync-conflict-20250918-222049-TFDLWFG.d.ts +23 -0
  78. package/@types/forms/fields/float.d.ts +4 -0
  79. package/@types/forms/fields/get-field-for-sealious.d.sync-conflict-20250918-222046-TFDLWFG.ts +29 -0
  80. package/@types/forms/fields/get-field-for-sealious.d.ts +31 -0
  81. package/@types/forms/fields/get-field-for-sealious.sync-conflict-20250918-222042-TFDLWFG.d.ts +29 -0
  82. package/@types/forms/fields/html.d.ts +6 -0
  83. package/@types/forms/fields/image.d.sync-conflict-20250918-222042-TFDLWFG.ts +5 -0
  84. package/@types/forms/fields/image.d.ts +5 -0
  85. package/@types/forms/fields/int.d.ts +6 -0
  86. package/@types/forms/fields/json.d.ts +13 -0
  87. package/@types/forms/fields/markdown.d.ts +6 -0
  88. package/@types/forms/fields/multiple-files.d.sync-conflict-20250918-184304-TFDLWFG.ts +16 -0
  89. package/@types/forms/fields/multiple-files.d.ts +3 -1
  90. package/@types/forms/fields/number.d.sync-conflict-20250918-184317-TFDLWFG.ts +25 -0
  91. package/@types/forms/fields/number.d.sync-conflict-20250918-222047-TFDLWFG.ts +25 -0
  92. package/@types/forms/fields/number.d.ts +3 -1
  93. package/@types/forms/fields/password.d.ts +6 -0
  94. package/@types/forms/fields/pick-from-list-sealious.d.ts +11 -0
  95. package/@types/forms/fields/pick-from-list.d.sync-conflict-20250918-184322-TFDLWFG.ts +15 -0
  96. package/@types/forms/fields/pick-from-list.d.ts +4 -3
  97. package/@types/forms/fields/proxy-field.d.sync-conflict-20250918-184307-TFDLWFG.ts +15 -0
  98. package/@types/forms/fields/proxy-field.d.ts +3 -1
  99. package/@types/forms/fields/regexp.d.sync-conflict-20250918-184305-TFDLWFG.ts +21 -0
  100. package/@types/forms/fields/regexp.d.sync-conflict-20250918-222045-TFDLWFG.ts +21 -0
  101. package/@types/forms/fields/regexp.d.ts +6 -1
  102. package/@types/forms/fields/regexp.sync-conflict-20250918-222047-TFDLWFG.d.ts +21 -0
  103. package/@types/forms/fields/simple-form-field.d.sync-conflict-20250918-184309-TFDLWFG.ts +29 -0
  104. package/@types/forms/fields/simple-form-field.d.sync-conflict-20250918-222044-TFDLWFG.ts +29 -0
  105. package/@types/forms/fields/simple-form-field.d.ts +23 -3
  106. package/@types/forms/fields/simple-form-field.sync-conflict-20250918-222049-TFDLWFG.d.ts +29 -0
  107. package/@types/forms/fields/single-reference.d.ts +19 -0
  108. package/@types/forms/fields/single-reference.sync-conflict-20250918-222043-TFDLWFG.d.ts +10 -0
  109. package/@types/forms/fields/structured-array.d.sync-conflict-20250918-184302-TFDLWFG.ts +27 -0
  110. package/@types/forms/fields/structured-array.d.sync-conflict-20250918-222049-TFDLWFG.ts +27 -0
  111. package/@types/forms/fields/structured-array.d.ts +19 -10
  112. package/@types/forms/fields/structured-array.sync-conflict-20250918-222047-TFDLWFG.d.ts +27 -0
  113. package/@types/forms/fields/table.d.sync-conflict-20250918-184303-TFDLWFG.ts +16 -0
  114. package/@types/forms/fields/table.d.ts +3 -0
  115. package/@types/forms/fields/text.d.ts +6 -0
  116. package/@types/forms/fields/url.d.ts +6 -0
  117. package/@types/forms/form-types.d.sync-conflict-20250918-222045-TFDLWFG.ts +26 -0
  118. package/@types/forms/form-types.d.ts +2 -0
  119. package/@types/forms/form.d.sync-conflict-20250918-184315-TFDLWFG.ts +32 -0
  120. package/@types/forms/form.d.sync-conflict-20250918-222049-TFDLWFG.ts +32 -0
  121. package/@types/forms/form.d.ts +10 -7
  122. package/@types/forms/form.sync-conflict-20250918-222049-TFDLWFG.d.ts +33 -0
  123. package/@types/forms/form.test.d.sync-conflict-20250918-184318-TFDLWFG.ts +6 -0
  124. package/@types/forms/form.test.d.sync-conflict-20250918-222047-TFDLWFG.ts +6 -0
  125. package/@types/forms/form.test.d.ts +2 -2
  126. package/@types/forms/multiform.d.sync-conflict-20250918-184308-TFDLWFG.ts +23 -0
  127. package/@types/forms/multiform.d.ts +1 -1
  128. package/@types/forms/multiform.sync-conflict-20250918-222044-TFDLWFG.d.ts +23 -0
  129. package/@types/index.d.sync-conflict-20250918-184316-TFDLWFG.ts +46 -0
  130. package/@types/index.d.ts +2 -2
  131. package/@types/mount.d.sync-conflict-20250918-184320-TFDLWFG.ts +6 -0
  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/page.d.sync-conflict-20250918-184320-TFDLWFG.ts +18 -0
  142. package/@types/page/props-parser.d.sync-conflict-20250918-184305-TFDLWFG.ts +15 -0
  143. package/@types/page/props-parser.d.ts +0 -1
  144. package/@types/page/stateful-page.d.sync-conflict-20250918-184326-TFDLWFG.ts +62 -0
  145. package/@types/templates/shared/shared-crud-form-fields.d.sync-conflict-20250918-184306-TFDLWFG.ts +1 -0
  146. package/@types/templates/shared/shared-crud-form-fields.d.ts +0 -67
  147. package/@types/test_utils/test-on-real-app.d.sync-conflict-20250918-184320-TFDLWFG.ts +26 -0
  148. package/@types/test_utils/test-on-real-app.d.ts +0 -1
  149. package/@types/utils/extract-fields-from-collection.d.sync-conflict-20250918-184312-TFDLWFG.ts +18 -0
  150. package/@types/utils/extract-fields-from-collection.d.ts +5 -1
  151. package/@types/utils/extract-fields-from-collection.sync-conflict-20250918-222045-TFDLWFG.d.ts +18 -0
  152. package/@types/utils/wrap-attributes.d.ts +3 -0
  153. package/README.md +5 -0
  154. package/assets/file-icon.svg +5 -0
  155. package/lib/add-crud.js +80 -89
  156. package/lib/add-list-route.test.js +1 -1
  157. package/lib/add-route.js +0 -7
  158. package/lib/build.js +3 -1
  159. package/lib/cli.js +2 -5
  160. package/lib/controllers/table-add-button.stimulus.js +35 -0
  161. package/lib/forms/controls/array.js +20 -16
  162. package/lib/forms/controls/big-radio-group.js +2 -2
  163. package/lib/forms/controls/checkbox-group.js +7 -7
  164. package/lib/forms/controls/checkboxed-list-input.js +9 -2
  165. package/lib/forms/controls/controls.js +2 -2
  166. package/lib/forms/controls/derived-frame.js +5 -1
  167. package/lib/forms/controls/derived.js +1 -1
  168. package/lib/forms/controls/dropdown.js +4 -1
  169. package/lib/forms/controls/editable-collection-subset.js +2 -2
  170. package/lib/forms/controls/file.js +26 -2
  171. package/lib/forms/controls/file.test.js +2 -2
  172. package/lib/forms/controls/hidden-input.js +4 -1
  173. package/lib/forms/controls/{photo.js → image.js} +6 -7
  174. package/lib/forms/controls/{photo.test.js → image.test.js} +6 -21
  175. package/lib/forms/controls/multiple-files.js +10 -1
  176. package/lib/forms/controls/{multiple-photos.js → multiple-images.js} +3 -3
  177. package/lib/forms/controls/simple-input.js +13 -12
  178. package/lib/forms/controls/single-reference.js +4 -0
  179. package/lib/forms/controls/table.js +66 -24
  180. package/lib/forms/controls/textarea.js +4 -2
  181. package/lib/forms/controls/tickable.js +13 -5
  182. package/lib/forms/fields/boolean.js +14 -0
  183. package/lib/forms/fields/checkboxed-list.js +4 -0
  184. package/lib/forms/fields/collection-field.js +9 -0
  185. package/lib/forms/fields/color.js +10 -0
  186. package/lib/forms/fields/coordinates.js +49 -0
  187. package/lib/forms/fields/date.js +34 -0
  188. package/lib/forms/fields/datetime.js +46 -0
  189. package/lib/forms/fields/deep-reverse-single-reference-list.js +81 -0
  190. package/lib/forms/fields/deep-reverse-single-reference-table.js +122 -0
  191. package/lib/forms/fields/email.js +7 -0
  192. package/lib/forms/fields/enum-multiple-sealious.js +32 -0
  193. package/lib/forms/fields/field.js +32 -4
  194. package/lib/forms/fields/field.test.js +5 -5
  195. package/lib/forms/fields/fields.js +23 -8
  196. package/lib/forms/fields/file.js +33 -9
  197. package/lib/forms/fields/file.test.js +4 -16
  198. package/lib/forms/fields/float.js +10 -0
  199. package/lib/forms/fields/get-field-for-sealious.js +213 -0
  200. package/lib/forms/fields/html.js +14 -0
  201. package/lib/forms/fields/image.js +13 -0
  202. package/lib/forms/fields/int.js +23 -0
  203. package/lib/forms/fields/json.js +31 -0
  204. package/lib/forms/fields/markdown.js +14 -0
  205. package/lib/forms/fields/multiple-files.js +4 -0
  206. package/lib/forms/fields/number.js +6 -0
  207. package/lib/forms/fields/password.js +13 -0
  208. package/lib/forms/fields/pick-from-list-sealious.js +17 -0
  209. package/lib/forms/fields/pick-from-list.js +6 -2
  210. package/lib/forms/fields/proxy-field.js +3 -0
  211. package/lib/forms/fields/regexp.js +14 -0
  212. package/lib/forms/fields/simple-form-field.js +60 -2
  213. package/lib/forms/fields/single-reference.js +44 -0
  214. package/lib/forms/fields/structured-array.js +63 -12
  215. package/lib/forms/fields/table.js +28 -1
  216. package/lib/forms/fields/text.js +17 -0
  217. package/lib/forms/fields/url.js +17 -0
  218. package/lib/forms/form.js +30 -13
  219. package/lib/forms/form.test.js +3 -4
  220. package/lib/forms/multiform.js +4 -2
  221. package/lib/forms/multiform.test.js +3 -3
  222. package/lib/generate-stimulus.js +1 -0
  223. package/lib/index.js +1 -0
  224. package/lib/make-hidden-inputs.js +1 -1
  225. package/lib/mount.js +11 -0
  226. package/lib/notifier.js +0 -1
  227. package/lib/page/list.js +15 -8
  228. package/lib/page/mountable-with-fields.js +14 -6
  229. package/lib/page/mountable-with-fields.test.js +1 -1
  230. package/lib/templates/form.js +8 -9
  231. package/lib/templates/multiform.js +4 -4
  232. package/lib/templates/page.js +0 -2
  233. package/lib/templates/shared/collection-create-form.js +28 -40
  234. package/lib/templates/shared/collection-edit-form.js +40 -77
  235. package/lib/templates/shared/collection-list.js +12 -20
  236. package/lib/templates/shared/shared-crud-form-fields.js +27 -95
  237. package/lib/test_utils/test-on-real-app.js +3 -3
  238. package/lib/utils/extract-fields-from-collection.js +60 -20
  239. package/lib/utils/make-slug.js +1 -1
  240. package/lib/utils/wrap-attributes.js +20 -0
  241. package/package.json +5 -4
  242. package/src/add-crud.ts +86 -97
  243. package/src/add-list-route.test.ts +1 -1
  244. package/src/add-route.ts +0 -7
  245. package/src/build.ts +3 -1
  246. package/src/cli.ts +3 -5
  247. package/src/controllers/table-add-button.stimulus.ts +35 -0
  248. package/src/forms/controls/array.ts +23 -20
  249. package/src/forms/controls/autocomplete.ts +1 -1
  250. package/src/forms/controls/big-radio-group.ts +2 -2
  251. package/src/forms/controls/checkbox-group.ts +9 -9
  252. package/src/forms/controls/checkboxed-list-input.ts +27 -15
  253. package/src/forms/controls/controls.ts +2 -2
  254. package/src/forms/controls/derived-frame.ts +5 -1
  255. package/src/forms/controls/derived.ts +1 -1
  256. package/src/forms/controls/dropdown.ts +5 -2
  257. package/src/forms/controls/editable-collection-subset.ts +2 -2
  258. package/src/forms/controls/file.test.ts +4 -2
  259. package/src/forms/controls/file.ts +31 -5
  260. package/src/forms/controls/form-control.ts +7 -2
  261. package/src/forms/controls/hidden-input.ts +4 -1
  262. package/src/forms/controls/{photo.test.ts → image.test.ts} +5 -22
  263. package/src/forms/controls/{photo.ts → image.ts} +3 -5
  264. package/src/forms/controls/multiple-files.ts +18 -1
  265. package/src/forms/controls/{multiple-photos.ts → multiple-images.ts} +1 -1
  266. package/src/forms/controls/number.ts +1 -1
  267. package/src/forms/controls/simple-input.ts +18 -34
  268. package/src/forms/controls/single-reference.ts +10 -2
  269. package/src/forms/controls/table.ts +90 -31
  270. package/src/forms/controls/textarea.ts +6 -4
  271. package/src/forms/controls/tickable.ts +13 -5
  272. package/src/forms/fields/boolean.ts +23 -1
  273. package/src/forms/fields/checkboxed-list.ts +11 -2
  274. package/src/forms/fields/collection-field.ts +16 -1
  275. package/src/forms/fields/color.ts +9 -0
  276. package/src/forms/fields/coordinates.ts +66 -0
  277. package/src/forms/fields/date.ts +50 -0
  278. package/src/forms/fields/datetime.ts +66 -0
  279. package/src/forms/fields/deep-reverse-single-reference-list.ts +136 -0
  280. package/src/forms/fields/deep-reverse-single-reference-table.ts +213 -0
  281. package/src/forms/fields/email.ts +9 -0
  282. package/src/forms/fields/enum-multiple-sealious.ts +48 -0
  283. package/src/forms/fields/field.test.ts +5 -5
  284. package/src/forms/fields/field.ts +94 -8
  285. package/src/forms/fields/fields.ts +23 -8
  286. package/src/forms/fields/file.test.ts +4 -16
  287. package/src/forms/fields/file.ts +43 -15
  288. package/src/forms/fields/float.ts +9 -0
  289. package/src/forms/fields/get-field-for-sealious.ts +304 -0
  290. package/src/forms/fields/html.ts +15 -0
  291. package/src/forms/fields/image.ts +12 -0
  292. package/src/forms/fields/int.ts +25 -0
  293. package/src/forms/fields/json.ts +48 -0
  294. package/src/forms/fields/markdown.ts +15 -0
  295. package/src/forms/fields/multiple-files.ts +10 -1
  296. package/src/forms/fields/number.ts +8 -1
  297. package/src/forms/fields/password.ts +17 -0
  298. package/src/forms/fields/pick-from-list-sealious.ts +22 -0
  299. package/src/forms/fields/pick-from-list.ts +7 -3
  300. package/src/forms/fields/proxy-field.ts +6 -1
  301. package/src/forms/fields/regexp.ts +27 -1
  302. package/src/forms/fields/simple-form-field.ts +95 -7
  303. package/src/forms/fields/single-reference.ts +62 -0
  304. package/src/forms/fields/structured-array.ts +115 -18
  305. package/src/forms/fields/table.ts +32 -1
  306. package/src/forms/fields/text.ts +18 -0
  307. package/src/forms/fields/url.ts +20 -0
  308. package/src/forms/form-types.ts +2 -0
  309. package/src/forms/form.test.ts +3 -4
  310. package/src/forms/form.ts +37 -16
  311. package/src/forms/forms.css +0 -85
  312. package/src/forms/multiform.test.ts +3 -3
  313. package/src/forms/multiform.ts +2 -0
  314. package/src/generate-stimulus.ts +1 -0
  315. package/src/index.ts +2 -1
  316. package/src/make-hidden-inputs.ts +1 -1
  317. package/src/mount.ts +14 -0
  318. package/src/notifier.ts +0 -1
  319. package/src/page/list.ts +15 -8
  320. package/src/page/mountable-with-fields.test.ts +1 -1
  321. package/src/page/mountable-with-fields.ts +18 -9
  322. package/src/register-external.ts +1 -1
  323. package/src/templates/form.ts +8 -9
  324. package/src/templates/multiform.ts +4 -4
  325. package/src/templates/page.ts +0 -2
  326. package/src/templates/shared/collection-create-form.ts +30 -66
  327. package/src/templates/shared/collection-edit-form.ts +41 -102
  328. package/src/templates/shared/collection-list.ts +12 -20
  329. package/src/templates/shared/item-delete.ts +0 -1
  330. package/src/templates/shared/shared-crud-form-fields.ts +37 -171
  331. package/src/test_utils/test-on-real-app.ts +4 -3
  332. package/src/utils/extract-fields-from-collection.ts +76 -25
  333. package/src/utils/make-slug.ts +1 -1
  334. package/src/utils/wrap-attributes.ts +17 -0
  335. package/lib/add-verbose-crud.js +0 -119
  336. package/lib/crud-field-snippets.js +0 -52
  337. package/lib/find-css-includes.js +0 -3
  338. package/lib/forms/controls/reverse-single-reference.js +0 -1
  339. package/lib/forms/fields/enum-multiple.js +0 -47
  340. package/lib/forms/fields/enum-multiple.test.js +0 -27
  341. package/lib/forms/fields/enum.js +0 -41
  342. package/lib/forms/fields/enum.test.js +0 -21
  343. package/lib/forms/fields/reverse-single-reference.js +0 -17
  344. package/lib/templates/shared/handlers/boolean.js +0 -14
  345. package/lib/templates/shared/handlers/date.js +0 -8
  346. package/lib/templates/shared/handlers/deep-reverse-single-reference.js +0 -209
  347. package/lib/templates/shared/handlers/default.js +0 -49
  348. package/lib/templates/shared/handlers/enum.js +0 -19
  349. package/lib/templates/shared/handlers/file.js +0 -23
  350. package/lib/templates/shared/handlers/image.js +0 -32
  351. package/lib/templates/shared/handlers/int.js +0 -11
  352. package/lib/templates/shared/handlers/jdd.js +0 -10
  353. package/lib/templates/shared/handlers/single-reference.js +0 -12
  354. package/lib/templates/shared/handlers/structured-array.js +0 -33
  355. package/src/add-verbose-crud.ts +0 -138
  356. package/src/crud-field-snippets.ts +0 -57
  357. package/src/find-css-includes.ts +0 -3
  358. package/src/forms/controls/reverse-single-reference.ts +0 -50
  359. package/src/forms/fields/enum-multiple.test.ts +0 -31
  360. package/src/forms/fields/enum-multiple.ts +0 -62
  361. package/src/forms/fields/enum.test.ts +0 -25
  362. package/src/forms/fields/enum.ts +0 -56
  363. package/src/forms/fields/reverse-single-reference.ts +0 -20
  364. package/src/templates/shared/handlers/boolean.ts +0 -18
  365. package/src/templates/shared/handlers/date.ts +0 -12
  366. package/src/templates/shared/handlers/deep-reverse-single-reference.ts +0 -244
  367. package/src/templates/shared/handlers/default.ts +0 -64
  368. package/src/templates/shared/handlers/enum.ts +0 -23
  369. package/src/templates/shared/handlers/file.ts +0 -27
  370. package/src/templates/shared/handlers/image.ts +0 -45
  371. package/src/templates/shared/handlers/int.ts +0 -15
  372. package/src/templates/shared/handlers/jdd.ts +0 -14
  373. package/src/templates/shared/handlers/single-reference.ts +0 -16
  374. package/src/templates/shared/handlers/structured-array.ts +0 -42
@@ -0,0 +1,136 @@
1
+ import { Context } from "koa";
2
+ import { CollectionItem, FieldTypes as SealiousFieldTypes } from "sealious";
3
+ import { FormDataValue, FormData } from "../form-types.js";
4
+ import { CheckboxedListField } from "./checkboxed-list.js";
5
+ import { ExtractedFieldInfo } from "../../utils/extract-fields-from-collection.js";
6
+ import { wrapKeyName } from "../../utils/wrap-attributes.js";
7
+
8
+ export class DeepReverseSingleReferenceList extends CheckboxedListField<
9
+ false,
10
+ string
11
+ > {
12
+ public item_label_getter: (item: CollectionItem<any>) => string = (item) =>
13
+ item.get("name") as string;
14
+
15
+ constructor(
16
+ public sealious_field: SealiousFieldTypes.DeepReverseSingleReference
17
+ ) {
18
+ super(false, async (ctx: Context) => {
19
+ const { items } = await ctx.$app.collections[
20
+ sealious_field.target_collection
21
+ ]
22
+ .list(ctx.$context)
23
+ .fetch();
24
+
25
+ return items.map((s) => ({
26
+ label: this.item_label_getter(s),
27
+ value: s.id,
28
+ }));
29
+ });
30
+ }
31
+
32
+ setItemLabelGetter(getter: (item: CollectionItem<any>) => string) {
33
+ this.item_label_getter = getter;
34
+ }
35
+
36
+ getSealiousCreateValue(): never {
37
+ throw new Error(
38
+ "This field is not set directly through field value, but instead relies on postSealiousCreate and postSealiousEdit"
39
+ );
40
+ }
41
+
42
+ async postSealiousCreate(
43
+ ctx: Context,
44
+ created_item: CollectionItem<any>,
45
+ form_data: FormData
46
+ ) {
47
+ // First, we remove links refering to current item
48
+ const { items: existing_links } = await ctx.$app.collections[
49
+ this.sealious_field.intermediary_collection
50
+ ]
51
+ .list(ctx.$context)
52
+ .filter({
53
+ [this.sealious_field.referencing_field]: created_item.id,
54
+ })
55
+ .fetch();
56
+ const { parsed: value } = await this.getParsedValue(
57
+ ctx,
58
+ form_data.raw_values,
59
+ false
60
+ );
61
+ const should_exist_ids = Object.entries(value || {})
62
+ .filter(([, value]) => value === "on")
63
+ .map(([key]) => key);
64
+ const to_delete = existing_links.filter(
65
+ (link) =>
66
+ !should_exist_ids.includes(
67
+ link.get(
68
+ this.sealious_field.intermediary_field_that_points_there
69
+ ) as string
70
+ )
71
+ );
72
+ const to_create_ids = should_exist_ids.filter(
73
+ (id) =>
74
+ !existing_links
75
+ .map((link) =>
76
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
77
+ link.get(
78
+ this.sealious_field
79
+ .intermediary_field_that_points_there
80
+ )
81
+ )
82
+ .includes(id)
83
+ );
84
+ await Promise.all(
85
+ to_delete.map((item) => {
86
+ return item.remove(ctx.$context);
87
+ })
88
+ );
89
+ // Then, we iterate over all selected values and insert appropriate missing links
90
+ const promises = to_create_ids.map(async (id) => {
91
+ await this.sealious_field
92
+ .getReferencingCollection()
93
+ .create(ctx.$context, {
94
+ [this.sealious_field.referencing_field]: created_item.id,
95
+ [this.sealious_field.intermediary_field_that_points_there]:
96
+ id,
97
+ });
98
+ });
99
+ await Promise.all(promises);
100
+ }
101
+
102
+ async postSealiousEdit(
103
+ ctx: Context,
104
+ edited_item: CollectionItem<any>,
105
+ value: FormData
106
+ ) {
107
+ return this.postSealiousCreate(ctx, edited_item, value);
108
+ }
109
+
110
+ async sealiousValueToForm(
111
+ _ctx: Context,
112
+ value: string[] | null
113
+ ): Promise<FormDataValue> {
114
+ return Object.fromEntries((value || []).map((id) => [id, "on"]));
115
+ }
116
+
117
+ generateFieldDeclaration(
118
+ _field_info: ExtractedFieldInfo,
119
+ vars: { form_field_types: string; sealious_field: string }
120
+ ): string {
121
+ return `new ${vars.form_field_types}.${this.constructor.name}(${vars.sealious_field})`;
122
+ }
123
+
124
+ generateCreateValueGetter(
125
+ field_info: ExtractedFieldInfo,
126
+ vars: {
127
+ form_field_types: string;
128
+ sealious_field: string;
129
+ form_fields: string;
130
+ }
131
+ ): string {
132
+ return `${wrapKeyName(
133
+ field_info.name
134
+ )}: undefined /* handled below in postSealiousCreate */`;
135
+ }
136
+ }
@@ -0,0 +1,213 @@
1
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
2
+ import {
3
+ FieldTypes as SealiousFieldTypes,
4
+ Field as SealiousField,
5
+ CollectionItem,
6
+ } from "sealious";
7
+ import { Boolean, TextBasedSimpleField } from "./fields.js";
8
+ import { sealiousToFormField } from "./get-field-for-sealious.js";
9
+ import { Table } from "./table.js";
10
+ import { Table as TableControl } from "../controls/table.js";
11
+ import { Context } from "koa";
12
+ import { FormDataValue, FormData } from "../form-types.js";
13
+ import { FormControlContext } from "../controls/form-control.js";
14
+ import { HiddenInput } from "../controls/hidden-input.js";
15
+ import { FormField } from "./field.js";
16
+
17
+ function getReferencingFields(
18
+ sealious_field: SealiousFieldTypes.DeepReverseSingleReference
19
+ ): Record<string, SealiousField<unknown>> {
20
+ const referencing_collection =
21
+ sealious_field.collection.app.collections[
22
+ sealious_field.referencing_collection
23
+ ];
24
+ if (!referencing_collection) {
25
+ throw new Error(
26
+ "Unknown collection: " + sealious_field.referencing_collection
27
+ );
28
+ }
29
+ return referencing_collection.fields;
30
+ }
31
+
32
+ export class DeepReverseSingleReferenceTable extends Table<
33
+ Record<string, FormField>
34
+ > {
35
+ constructor(
36
+ public sealious_field: SealiousFieldTypes.DeepReverseSingleReference
37
+ ) {
38
+ super({
39
+ selected: new Boolean(false),
40
+ [sealious_field.referencing_field]: new TextBasedSimpleField(true),
41
+ [sealious_field.intermediary_field_that_points_there]:
42
+ new TextBasedSimpleField(true),
43
+ ...Object.fromEntries(
44
+ Object.values(getReferencingFields(sealious_field))
45
+ .filter(
46
+ (field) =>
47
+ !(
48
+ field instanceof
49
+ SealiousFieldTypes.SingleReference
50
+ )
51
+ )
52
+ .map((field) => [field.name, sealiousToFormField(field)])
53
+ ),
54
+ });
55
+ }
56
+
57
+ getControl(): TableControl<any> {
58
+ return new TableControl(this, {
59
+ label: this.name,
60
+ allow_adding: false,
61
+ subfield_controls: {
62
+ selected: this.columns.selected.getControl(),
63
+ [this.sealious_field.referencing_field]: new HiddenInput(
64
+ this.columns[this.sealious_field.referencing_field]
65
+ ),
66
+ [this.sealious_field.intermediary_field_that_points_there]:
67
+ new HiddenInput(
68
+ this.columns[
69
+ this.sealious_field.intermediary_field_that_points_there
70
+ ]
71
+ ),
72
+ ...Object.fromEntries(
73
+ Object.values(getReferencingFields(this.sealious_field))
74
+ .filter(
75
+ (field) =>
76
+ !(
77
+ field instanceof
78
+ SealiousFieldTypes.SingleReference
79
+ )
80
+ )
81
+ .map((field) => [
82
+ field.name,
83
+ this.columns[field.name].getControl(),
84
+ ])
85
+ ),
86
+ },
87
+ });
88
+ }
89
+
90
+ getSealiousCreateValue(_fctx: FormControlContext): Promise<unknown> {
91
+ throw new Error("Method not implemented.");
92
+ }
93
+
94
+ async postSealiousCreate(
95
+ ctx: Context,
96
+ created_item: CollectionItem<any>,
97
+ form_data: FormData
98
+ ): Promise<void> {
99
+ // First, we remove links refering to current item
100
+ const { items: to_delete } = await ctx.$app.collections[
101
+ "${toKebabCase(referencing_collection)}"
102
+ ]
103
+ .list(ctx.$context)
104
+ .filter({ "${referencing_field}": created_item.id })
105
+ .fetch();
106
+ await Promise.all(to_delete.map((item) => item.remove(ctx.$context)));
107
+
108
+ // Then, we iterate over all selected values and insert appropriate entries for the subcategories relation
109
+
110
+ const referencing_fields = getReferencingFields(this.sealious_field);
111
+
112
+ const { parsed: value } = await this.getParsedValue(
113
+ ctx,
114
+ form_data.raw_values,
115
+ false
116
+ );
117
+ const promises = (value || [])
118
+ .filter((s) => s.selected == true)
119
+ .map(async (link_info) => {
120
+ await ctx.$app.collections[
121
+ "${toKebabCase(referencing_collection)}"
122
+ ].create(ctx.$context, {
123
+ "${referencing_field}": created_item.id,
124
+ "${intermediary_field_that_points_there}": String(
125
+ link_info["${intermediary_field_that_points_there}"]
126
+ ),
127
+ ...Object.fromEntries(
128
+ Object.values(referencing_fields)
129
+ .filter(
130
+ (field) =>
131
+ !(
132
+ field instanceof
133
+ SealiousFieldTypes.SingleReference
134
+ )
135
+ )
136
+ .map((field) => [field.name, link_info[field.name]])
137
+ ),
138
+ });
139
+ });
140
+
141
+ await Promise.all(promises);
142
+ }
143
+
144
+ postSealiousEdit(
145
+ ctx: Context,
146
+ edited_item: CollectionItem<any>,
147
+ form_data: FormData
148
+ ): Promise<void> {
149
+ return this.postSealiousCreate(ctx, edited_item, form_data);
150
+ }
151
+
152
+ async sealiousValueToForm(
153
+ ctx: Context,
154
+ _value: string[],
155
+ item: CollectionItem<any>
156
+ ): Promise<FormDataValue> {
157
+ // convert from an array to array-like object
158
+ const referencing_fields = getReferencingFields(this.sealious_field);
159
+ return Object.fromEntries(
160
+ await Promise.all([
161
+ this.sealious_field.collection.list(ctx.$context).fetch(),
162
+ this.sealious_field
163
+ .getReferencingCollection()
164
+ .list(ctx.$context)
165
+ .fetch(),
166
+ ]).then(([{ items: targets }, { items: links }]) =>
167
+ targets
168
+ .map((target) => {
169
+ return {
170
+ selected: (
171
+ (item.get(
172
+ this.sealious_field.name
173
+ ) as string[]) || []
174
+ ).includes(target.id)
175
+ ? "on"
176
+ : "off",
177
+ [this.sealious_field.referencing_field]: item.id,
178
+ [this.sealious_field
179
+ .intermediary_field_that_points_there]:
180
+ target.id,
181
+ ...Object.fromEntries(
182
+ Object.values(referencing_fields)
183
+ .filter(
184
+ (field) =>
185
+ !(
186
+ field instanceof
187
+ SealiousFieldTypes.SingleReference
188
+ )
189
+ )
190
+ .map((field) => [
191
+ field.name,
192
+ links
193
+ .find(
194
+ (e) =>
195
+ e.get(
196
+ this.sealious_field
197
+ .intermediary_field_that_points_there
198
+ ) == target.id &&
199
+ e.get(
200
+ this.sealious_field
201
+ .referencing_field
202
+ ) == item.id
203
+ )
204
+ ?.get("rank") || 0,
205
+ ])
206
+ ),
207
+ };
208
+ })
209
+ .entries()
210
+ )
211
+ ) as FormDataValue;
212
+ }
213
+ }
@@ -1,5 +1,6 @@
1
1
  import { predicates } from "@sealcode/ts-predicates";
2
2
  import { RegExpField } from "./regexp.js";
3
+ import { SimpleInput } from "../controls/controls.js";
3
4
 
4
5
  export class EmailField<
5
6
  Required extends boolean
@@ -17,4 +18,12 @@ export class EmailField<
17
18
  default_value
18
19
  );
19
20
  }
21
+
22
+ setErrorMessage(message: string) {
23
+ this.error_message = message;
24
+ }
25
+
26
+ public getControl(): SimpleInput {
27
+ return new SimpleInput(this, { label: this.name, type: "email" });
28
+ }
20
29
  }
@@ -0,0 +1,48 @@
1
+ import { FieldTypes as SealiousFieldTypes } from "sealious";
2
+ import { Context } from "koa";
3
+ import { ExtractedFieldInfo } from "../../utils/extract-fields-from-collection.js";
4
+ import { CheckboxedListField } from "./checkboxed-list.js";
5
+ import { FormControlContext } from "../controls/form-control.js";
6
+ import { FormDataValue } from "../form-types.js";
7
+
8
+ export class EnumMultipleSealious<
9
+ Values extends string
10
+ > extends CheckboxedListField<boolean, Values> {
11
+ public sealious_field: SealiousFieldTypes.EnumMultiple<Values>;
12
+
13
+ constructor(sealious_field: SealiousFieldTypes.EnumMultiple<Values>) {
14
+ super(sealious_field.required, async (ctx: Context) =>
15
+ (await sealious_field.getAllowedValues(ctx.$context)).map(
16
+ (value: Values) => ({ value, label: value })
17
+ )
18
+ );
19
+ this.sealious_field = sealious_field;
20
+ }
21
+
22
+ generateFieldDeclaration(
23
+ field_info: ExtractedFieldInfo,
24
+ vars: { form_field_types: string; sealious_field: string }
25
+ ): string {
26
+ return `new ${vars.form_field_types}.${this.constructor.name}(${vars.sealious_field})`;
27
+ }
28
+
29
+ async getSealiousCreateValue(fctx: FormControlContext): Promise<Values[]> {
30
+ const { parsed } = await this.getParsedValue(
31
+ fctx.ctx,
32
+ fctx.data.raw_values
33
+ );
34
+ const result = Object.entries(parsed || {})
35
+ .filter(([, value]) => value == "on")
36
+ .map(([key]) => key as Values);
37
+ return result;
38
+ }
39
+
40
+ async sealiousValueToForm(
41
+ ctx: Context,
42
+ sealious_value: Values[] | null
43
+ ): Promise<FormDataValue> {
44
+ return Object.fromEntries(
45
+ (sealious_value || []).map((key) => [key, "on"])
46
+ );
47
+ }
48
+ }
@@ -7,7 +7,7 @@ import { mount } from "../../mount.js";
7
7
  import { Form } from "../form.js";
8
8
  import { getBrowser } from "../../utils/browser-creator.js";
9
9
  import assert from "assert";
10
- import { SimpleFormField } from "./simple-form-field.js";
10
+ import { TextBasedSimpleField } from "./simple-form-field.js";
11
11
  import { SimpleInput } from "../controls/simple-input.js";
12
12
  import { FormData } from "../form-types.js";
13
13
  import { Boolean } from "./boolean.js";
@@ -30,7 +30,7 @@ describe("basic field", () => {
30
30
  const router = new Router();
31
31
 
32
32
  const fields = {
33
- text: new SimpleFormField(true),
33
+ text: new TextBasedSimpleField(true),
34
34
  };
35
35
 
36
36
  let received_values: unknown;
@@ -44,7 +44,7 @@ describe("basic field", () => {
44
44
 
45
45
  async onSubmit(ctx: Context, data: FormData) {
46
46
  received_values = await this.getParsedValues(ctx);
47
- const { parsed: email } = await this.fields.text.getValue(
47
+ const { parsed: email } = await this.fields.text.getParsedValue(
48
48
  ctx,
49
49
  data.raw_values
50
50
  );
@@ -76,7 +76,7 @@ describe("basic field", () => {
76
76
  let parse_called = false;
77
77
 
78
78
  const fields = {
79
- text: new (class MockField extends SimpleFormField<false> {
79
+ text: new (class MockField extends TextBasedSimpleField<false> {
80
80
  public async isValueValid() {
81
81
  is_value_valid_called = true;
82
82
  return true as any;
@@ -127,7 +127,7 @@ describe("basic field", () => {
127
127
  let submit_called = false;
128
128
 
129
129
  const fields = {
130
- text: new SimpleFormField(false),
130
+ text: new TextBasedSimpleField(false),
131
131
  checkbox: new Boolean(false),
132
132
  };
133
133
 
@@ -1,10 +1,21 @@
1
+ /* eslint-disable @typescript-eslint/no-empty-function */
1
2
  import { Predicate, predicates } from "@sealcode/ts-predicates";
2
3
  import { Context } from "koa";
4
+ import { Collection, CollectionItem } from "sealious";
3
5
  import { t } from "../../utils/translate.js";
4
- import { FormDataValue } from "../form-types.js";
6
+ import { FormControl, FormControlContext } from "../controls/form-control.js";
7
+ import { FormDataValue, FormData } from "../form-types.js";
8
+ import { ExtractedFieldInfo } from "../../utils/extract-fields-from-collection.js";
9
+ import { wrapAttribute, wrapKeyName } from "../../utils/wrap-attributes.js";
5
10
 
6
11
  export type FormFieldValidationResponse = { valid: boolean; message: string };
7
12
 
13
+ export type FormDisplayInfo<C extends Collection> = {
14
+ field: keyof C["fields"];
15
+ label: string;
16
+ format?: (value: unknown, item: CollectionItem<C>) => JSX.Element;
17
+ };
18
+
8
19
  export type FormFieldValidationFn<ValueType> = (
9
20
  ctx: Context,
10
21
  value: ValueType,
@@ -49,15 +60,20 @@ export type FieldParseResult<T> =
49
60
 
50
61
  export abstract class FormField<
51
62
  Required extends boolean = boolean,
52
- ParsedValue = unknown
63
+ ParsedValue = unknown,
64
+ DefaultFormControl extends FormControl = FormControl,
65
+ SealiousValue = any
53
66
  > {
54
67
  name: string;
55
68
  constructor(public readonly required: Required) {}
56
69
  predicate: Predicate = predicates.unknown;
57
70
  mapToFilter: (parsed: ParsedValue) => unknown = (value) => value;
58
71
 
59
- async init(fieldname: string): Promise<void> {
60
- this.name = fieldname;
72
+ async init(): Promise<void> {}
73
+
74
+ setName(name: string): this {
75
+ this.name = name;
76
+ return this;
61
77
  }
62
78
 
63
79
  public async _validate(
@@ -100,7 +116,7 @@ export abstract class FormField<
100
116
  raw_value: FormDataValue
101
117
  ): Promise<FieldParseResult<ParsedValue>>;
102
118
 
103
- async getValue(
119
+ async getParsedValue(
104
120
  ctx: Context,
105
121
  all_form_values: Record<string, FormDataValue>,
106
122
  validate: true
@@ -110,7 +126,7 @@ export abstract class FormField<
110
126
  parsed: ParsedValue | null;
111
127
  raw: FormDataValue;
112
128
  }>;
113
- async getValue(
129
+ async getParsedValue(
114
130
  ctx: Context,
115
131
  all_form_values: Record<string, FormDataValue>,
116
132
  validate?: false
@@ -119,7 +135,7 @@ export abstract class FormField<
119
135
  parsed: ParsedValue | null;
120
136
  raw: FormDataValue;
121
137
  }>;
122
- async getValue(
138
+ async getParsedValue(
123
139
  ctx: Context,
124
140
  all_form_values: Record<string, FormDataValue>,
125
141
  validate = false
@@ -176,7 +192,77 @@ export abstract class FormField<
176
192
  ctx: Context,
177
193
  data: Record<string, FormDataValue>
178
194
  ): Promise<unknown> {
179
- const { parsed } = await this.getValue(ctx, data);
195
+ const { parsed } = await this.getParsedValue(ctx, data);
180
196
  return parsed;
181
197
  }
198
+
199
+ abstract getControl(): DefaultFormControl;
200
+
201
+ getSealiousCreateValue(fctx: FormControlContext): Promise<SealiousValue> {
202
+ throw new Error("This field does not have a default sealious mapping");
203
+ }
204
+
205
+ sealiousValueToForm(
206
+ ctx: Context,
207
+ sealiousValue: SealiousValue | null,
208
+ item: CollectionItem<any>
209
+ ): Promise<FormDataValue> {
210
+ throw new Error("This field does not have a default sealious mapping");
211
+ }
212
+
213
+ async postSealiousCreate(
214
+ ctx: Context,
215
+ created_item: CollectionItem<any>,
216
+ form_data: FormData
217
+ ): Promise<void> {}
218
+
219
+ async postSealiousEdit(
220
+ ctx: Context,
221
+ edited_item: CollectionItem<any>,
222
+ form_data: FormData
223
+ ): Promise<void> {}
224
+
225
+ generateFieldDeclaration(
226
+ field_info: ExtractedFieldInfo,
227
+ vars: { form_field_types: string; sealious_field: string }
228
+ ): string {
229
+ return `new ${vars.form_field_types}.${this.constructor.name}(${String(
230
+ field_info.is_required
231
+ )})`;
232
+ }
233
+
234
+ generateCreateValueGetter(
235
+ field_info: ExtractedFieldInfo,
236
+ vars: {
237
+ form_field_types: string;
238
+ sealious_field: string;
239
+ form_fields: string;
240
+ }
241
+ ): string {
242
+ return `${wrapKeyName(field_info.name)}: await ${
243
+ vars.form_fields
244
+ }${wrapAttribute(field_info.name)}.getSealiousCreateValue(fctx)`;
245
+ }
246
+
247
+ generateInitialValue(
248
+ field_info: ExtractedFieldInfo,
249
+ vars: {
250
+ form_field_types: string;
251
+ form_fields: string;
252
+ }
253
+ ): string {
254
+ return `${wrapKeyName(field_info.name)}: await ${
255
+ vars.form_fields
256
+ }${wrapAttribute(field_info.name)}.sealiousValueToForm(ctx, item.get("${
257
+ field_info.name
258
+ }"))`;
259
+ }
260
+
261
+ generateImportsForFieldList(field_info: ExtractedFieldInfo): {
262
+ what: string;
263
+ from: string;
264
+ as?: string;
265
+ }[] {
266
+ return [];
267
+ }
182
268
  }
@@ -1,16 +1,31 @@
1
- export * from "./simple-form-field.js";
1
+ export * from "./boolean.js";
2
2
  export * from "./checkboxed-list.js";
3
3
  export * from "./collection-field.js";
4
- export * from "./number.js";
5
- export * from "./pick-from-list.js";
6
- export * from "./regexp.js";
4
+ export * from "./color.js";
5
+ export * from "./coordinates.js";
6
+ export * from "./date.js";
7
+ export * from "./datetime.js";
8
+ export * from "./deep-reverse-single-reference-list.js";
9
+ export * from "./deep-reverse-single-reference-table.js";
7
10
  export * from "./email.js";
8
- export * from "./enum.js";
9
- export * from "./boolean.js";
10
- export * from "./enum-multiple.js";
11
+ export * from "./enum-multiple-sealious.js";
11
12
  export * from "./existing-sealious-value.js";
12
13
  export * from "./file.js";
14
+ export * from "./float.js";
15
+ export * from "./html.js";
16
+ export * from "./image.js";
17
+ export * from "./int.js";
18
+ export * from "./json.js";
19
+ export * from "./markdown.js";
13
20
  export * from "./multiple-files.js";
14
- export * from "./reverse-single-reference.js";
21
+ export * from "./number.js";
22
+ export * from "./password.js";
23
+ export * from "./pick-from-list-sealious.js";
24
+ export * from "./pick-from-list.js";
25
+ export * from "./regexp.js";
26
+ export * from "./simple-form-field.js";
27
+ export * from "./single-reference.js";
15
28
  export * from "./structured-array.js";
16
29
  export * from "./table.js";
30
+ export * from "./text.js";
31
+ export * from "./url.js";
@@ -1,12 +1,11 @@
1
1
  import Router from "@koa/router";
2
2
  import { Context } from "koa";
3
- import { FileManager, FilePointer } from "@sealcode/file-manager";
3
+ import { FilePointer } from "@sealcode/file-manager";
4
4
  import getPort from "get-port";
5
5
  import Koa from "koa";
6
6
  import fs from "node:fs/promises";
7
- import { KoaResponsiveImageRouter } from "koa-responsive-image-router";
8
7
  import { mount } from "../../mount.js";
9
- import { Photo } from "../controls/photo.js";
8
+ import { Image } from "../controls/image.js";
10
9
  import { Form } from "../form.js";
11
10
  import { File as FileField } from "./file.js";
12
11
  import { getBrowser } from "../../utils/browser-creator.js";
@@ -33,7 +32,7 @@ describe("file field", () => {
33
32
  const router = new Router();
34
33
 
35
34
  const fields = {
36
- file: new FileField(true, new FileManager("/tmp", "/uploaded_files")),
35
+ file: new FileField(true),
37
36
  };
38
37
 
39
38
  let received_values: any;
@@ -43,18 +42,7 @@ describe("file field", () => {
43
42
  "/",
44
43
  new (class extends Form<typeof fields, unknown> {
45
44
  fields = fields;
46
- controls = [
47
- new Photo(
48
- fields.file,
49
- new KoaResponsiveImageRouter({
50
- staticPath: "/tmp",
51
- thumbnailSize: 10,
52
- cacheManagerResolutionThreshold: 10,
53
- imageStoragePath: "/tmp",
54
- smartCropStoragePath: "/tmp",
55
- })
56
- ),
57
- ];
45
+ controls = [new Image(fields.file)];
58
46
 
59
47
  async onSubmit(ctx: Context) {
60
48
  received_values = await this.getParsedValues(ctx);