@sealcode/sealgen 0.8.44 → 0.8.48

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 (423) hide show
  1. package/@types/index.d.ts +1 -0
  2. package/@types/page/stateful-page.d.ts +34 -0
  3. package/@types/templates/stateful-page.d.ts +1 -0
  4. package/@types/utils/base64.d.ts +2 -0
  5. package/@types/utils/utils.d.ts +3 -0
  6. package/lib/add-route.js +3 -0
  7. package/lib/generate-routes.js +2 -1
  8. package/lib/index.js +1 -0
  9. package/lib/make-env.js +1 -1
  10. package/lib/mount.js +1 -1
  11. package/lib/page/stateful-page.js +117 -0
  12. package/lib/templates/stateful-page.js +66 -0
  13. package/lib/utils/base64.js +12 -0
  14. package/lib/utils/utils.js +6 -1
  15. package/package.json +2 -1
  16. package/tsconfig.json +0 -1
  17. package/.arcconfig +0 -12
  18. package/.arclint +0 -18
  19. package/.eslintrc.js +0 -38
  20. package/.mocharc.js +0 -10
  21. package/.nyc_output/00b15432-2e8d-4b16-9dd6-7e23314363c9.json +0 -1
  22. package/.nyc_output/0190dc00-d309-48d0-a5db-e9484e3c7334.json +0 -1
  23. package/.nyc_output/04bfea78-9274-4d35-b7e4-d0bf42636911.json +0 -1
  24. package/.nyc_output/0d4efe84-14e0-4bf0-bf22-b95472fe2be4.json +0 -1
  25. package/.nyc_output/1faea508-9cb4-46f4-b7ad-94a816e1ee7d.json +0 -1
  26. package/.nyc_output/2b2df469-dc31-48c9-ab34-68a74266e2c2.json +0 -1
  27. package/.nyc_output/32b5e63b-c8f8-4d9d-a09b-d97656c0e3f6.json +0 -1
  28. package/.nyc_output/442ce939-4f43-496b-a8a9-2f1fb9cfa619.json +0 -1
  29. package/.nyc_output/4573bb03-90d4-4408-ba15-b6835c618b33.json +0 -1
  30. package/.nyc_output/468fbd9c-6a27-4e33-8423-dbaec01e62a9.json +0 -1
  31. package/.nyc_output/51894388-b88d-4f0b-8d5b-4a1dd71cf668.json +0 -1
  32. package/.nyc_output/56263b22-3ed5-4ce2-9bbb-f2c9575cdeee.json +0 -1
  33. package/.nyc_output/6934a9dd-6431-48aa-93f1-4eeef0095773.json +0 -1
  34. package/.nyc_output/70979008-f285-481b-bb09-ca48a1376f81.json +0 -1
  35. package/.nyc_output/817c9485-a0ef-486d-8dee-906456fe77fb.json +0 -1
  36. package/.nyc_output/9f725153-f783-4948-81d3-c4cc792738bf.json +0 -1
  37. package/.nyc_output/cd4d852c-f8fc-4cb1-807b-7d053a0ef8fc.json +0 -1
  38. package/.nyc_output/ec3011f0-8180-492e-8d85-4d92484ccb44.json +0 -1
  39. package/.nyc_output/f78b831a-65ca-497d-9f9e-001a3efa6f54.json +0 -1
  40. package/.nyc_output/processinfo/00b15432-2e8d-4b16-9dd6-7e23314363c9.json +0 -1
  41. package/.nyc_output/processinfo/0190dc00-d309-48d0-a5db-e9484e3c7334.json +0 -1
  42. package/.nyc_output/processinfo/04bfea78-9274-4d35-b7e4-d0bf42636911.json +0 -1
  43. package/.nyc_output/processinfo/0d4efe84-14e0-4bf0-bf22-b95472fe2be4.json +0 -1
  44. package/.nyc_output/processinfo/1faea508-9cb4-46f4-b7ad-94a816e1ee7d.json +0 -1
  45. package/.nyc_output/processinfo/2b2df469-dc31-48c9-ab34-68a74266e2c2.json +0 -1
  46. package/.nyc_output/processinfo/32b5e63b-c8f8-4d9d-a09b-d97656c0e3f6.json +0 -1
  47. package/.nyc_output/processinfo/442ce939-4f43-496b-a8a9-2f1fb9cfa619.json +0 -1
  48. package/.nyc_output/processinfo/4573bb03-90d4-4408-ba15-b6835c618b33.json +0 -1
  49. package/.nyc_output/processinfo/468fbd9c-6a27-4e33-8423-dbaec01e62a9.json +0 -1
  50. package/.nyc_output/processinfo/51894388-b88d-4f0b-8d5b-4a1dd71cf668.json +0 -1
  51. package/.nyc_output/processinfo/56263b22-3ed5-4ce2-9bbb-f2c9575cdeee.json +0 -1
  52. package/.nyc_output/processinfo/6934a9dd-6431-48aa-93f1-4eeef0095773.json +0 -1
  53. package/.nyc_output/processinfo/70979008-f285-481b-bb09-ca48a1376f81.json +0 -1
  54. package/.nyc_output/processinfo/817c9485-a0ef-486d-8dee-906456fe77fb.json +0 -1
  55. package/.nyc_output/processinfo/9f725153-f783-4948-81d3-c4cc792738bf.json +0 -1
  56. package/.nyc_output/processinfo/cd4d852c-f8fc-4cb1-807b-7d053a0ef8fc.json +0 -1
  57. package/.nyc_output/processinfo/ec3011f0-8180-492e-8d85-4d92484ccb44.json +0 -1
  58. package/.nyc_output/processinfo/f78b831a-65ca-497d-9f9e-001a3efa6f54.json +0 -1
  59. package/.nyc_output/processinfo/index.json +0 -1
  60. package/.nycrc +0 -6
  61. package/.prettierrc +0 -21
  62. package/.xunit +0 -47
  63. package/@types/forms/fields/files-multiple.d.ts +0 -12
  64. package/@types/sealgen-url.d.ts +0 -0
  65. package/@types/tests/manual/multiform.d.ts +0 -1
  66. package/coverage/clover.xml +0 -2240
  67. package/coverage/lcov-report/base.css +0 -224
  68. package/coverage/lcov-report/block-navigation.js +0 -79
  69. package/coverage/lcov-report/favicon.png +0 -0
  70. package/coverage/lcov-report/index.html +0 -231
  71. package/coverage/lcov-report/prettify.css +0 -1
  72. package/coverage/lcov-report/prettify.js +0 -2
  73. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  74. package/coverage/lcov-report/sorter.js +0 -170
  75. package/coverage/lcov-report/src/add-collection.ts.html +0 -173
  76. package/coverage/lcov-report/src/add-route.test.ts.html +0 -254
  77. package/coverage/lcov-report/src/add-route.ts.html +0 -338
  78. package/coverage/lcov-report/src/build.ts.html +0 -359
  79. package/coverage/lcov-report/src/cli.ts.html +0 -188
  80. package/coverage/lcov-report/src/components/components.ts.html +0 -86
  81. package/coverage/lcov-report/src/components/index.html +0 -141
  82. package/coverage/lcov-report/src/components/tabs.ts.html +0 -365
  83. package/coverage/lcov-report/src/components/toggle-modal.ts.html +0 -236
  84. package/coverage/lcov-report/src/example.test.ts.html +0 -89
  85. package/coverage/lcov-report/src/find-scss-includes.ts.html +0 -176
  86. package/coverage/lcov-report/src/forms/controls/array.ts.html +0 -758
  87. package/coverage/lcov-report/src/forms/controls/autocomplete.ts.html +0 -179
  88. package/coverage/lcov-report/src/forms/controls/big-radio-group.ts.html +0 -224
  89. package/coverage/lcov-report/src/forms/controls/checkbox-group.ts.html +0 -293
  90. package/coverage/lcov-report/src/forms/controls/checkbox.ts.html +0 -182
  91. package/coverage/lcov-report/src/forms/controls/checkboxed-list-input.ts.html +0 -230
  92. package/coverage/lcov-report/src/forms/controls/collapsible-checkbox-group.ts.html +0 -164
  93. package/coverage/lcov-report/src/forms/controls/collapsible-field-group.ts.html +0 -362
  94. package/coverage/lcov-report/src/forms/controls/controls.ts.html +0 -170
  95. package/coverage/lcov-report/src/forms/controls/derived-frame.ts.html +0 -353
  96. package/coverage/lcov-report/src/forms/controls/derived.ts.html +0 -404
  97. package/coverage/lcov-report/src/forms/controls/dropdown.ts.html +0 -341
  98. package/coverage/lcov-report/src/forms/controls/editable-collection-subset.ts.html +0 -371
  99. package/coverage/lcov-report/src/forms/controls/field-group.ts.html +0 -287
  100. package/coverage/lcov-report/src/forms/controls/file.ts.html +0 -221
  101. package/coverage/lcov-report/src/forms/controls/form-control.ts.html +0 -152
  102. package/coverage/lcov-report/src/forms/controls/form-field-control.ts.html +0 -146
  103. package/coverage/lcov-report/src/forms/controls/form-header.ts.html +0 -137
  104. package/coverage/lcov-report/src/forms/controls/form-paragraph.ts.html +0 -113
  105. package/coverage/lcov-report/src/forms/controls/frame.ts.html +0 -158
  106. package/coverage/lcov-report/src/forms/controls/hidden-input.ts.html +0 -146
  107. package/coverage/lcov-report/src/forms/controls/html.ts.html +0 -194
  108. package/coverage/lcov-report/src/forms/controls/index.html +0 -561
  109. package/coverage/lcov-report/src/forms/controls/multiple-files.ts.html +0 -848
  110. package/coverage/lcov-report/src/forms/controls/multiple-photos.ts.html +0 -212
  111. package/coverage/lcov-report/src/forms/controls/number.ts.html +0 -194
  112. package/coverage/lcov-report/src/forms/controls/photo.ts.html +0 -302
  113. package/coverage/lcov-report/src/forms/controls/radio.ts.html +0 -209
  114. package/coverage/lcov-report/src/forms/controls/reverse-single-reference.ts.html +0 -230
  115. package/coverage/lcov-report/src/forms/controls/simple-input.ts.html +0 -524
  116. package/coverage/lcov-report/src/forms/controls/textarea.ts.html +0 -260
  117. package/coverage/lcov-report/src/forms/controls/tickable.ts.html +0 -461
  118. package/coverage/lcov-report/src/forms/fields/boolean.test.ts.html +0 -188
  119. package/coverage/lcov-report/src/forms/fields/boolean.ts.html +0 -269
  120. package/coverage/lcov-report/src/forms/fields/checkboxed-list.ts.html +0 -278
  121. package/coverage/lcov-report/src/forms/fields/collection-field.ts.html +0 -266
  122. package/coverage/lcov-report/src/forms/fields/email.test.ts.html +0 -152
  123. package/coverage/lcov-report/src/forms/fields/email.ts.html +0 -140
  124. package/coverage/lcov-report/src/forms/fields/enum-multiple.test.ts.html +0 -173
  125. package/coverage/lcov-report/src/forms/fields/enum-multiple.ts.html +0 -266
  126. package/coverage/lcov-report/src/forms/fields/enum.test.ts.html +0 -155
  127. package/coverage/lcov-report/src/forms/fields/enum.ts.html +0 -248
  128. package/coverage/lcov-report/src/forms/fields/existing-sealious-value.ts.html +0 -146
  129. package/coverage/lcov-report/src/forms/fields/field.ts.html +0 -596
  130. package/coverage/lcov-report/src/forms/fields/file.ts.html +0 -347
  131. package/coverage/lcov-report/src/forms/fields/index.html +0 -456
  132. package/coverage/lcov-report/src/forms/fields/multiple-files.ts.html +0 -140
  133. package/coverage/lcov-report/src/forms/fields/number.test.ts.html +0 -182
  134. package/coverage/lcov-report/src/forms/fields/number.ts.html +0 -290
  135. package/coverage/lcov-report/src/forms/fields/pick-from-list.test.ts.html +0 -137
  136. package/coverage/lcov-report/src/forms/fields/pick-from-list.ts.html +0 -236
  137. package/coverage/lcov-report/src/forms/fields/proxy-field.ts.html +0 -152
  138. package/coverage/lcov-report/src/forms/fields/regexp.test.ts.html +0 -155
  139. package/coverage/lcov-report/src/forms/fields/regexp.ts.html +0 -239
  140. package/coverage/lcov-report/src/forms/fields/reverse-single-reference.ts.html +0 -140
  141. package/coverage/lcov-report/src/forms/fields/simple-form-field.ts.html +0 -170
  142. package/coverage/lcov-report/src/forms/fields/structured-array.ts.html +0 -161
  143. package/coverage/lcov-report/src/forms/form.test.ts.html +0 -1133
  144. package/coverage/lcov-report/src/forms/form.ts.html +0 -962
  145. package/coverage/lcov-report/src/forms/index.html +0 -156
  146. package/coverage/lcov-report/src/forms/multiform.test.ts.html +0 -1700
  147. package/coverage/lcov-report/src/forms/multiform.ts.html +0 -788
  148. package/coverage/lcov-report/src/generate-collections.ts.html +0 -311
  149. package/coverage/lcov-report/src/generate-routes.ts.html +0 -440
  150. package/coverage/lcov-report/src/index.html +0 -321
  151. package/coverage/lcov-report/src/index.ts.html +0 -152
  152. package/coverage/lcov-report/src/make-env.ts.html +0 -125
  153. package/coverage/lcov-report/src/make-hidden-inputs.ts.html +0 -152
  154. package/coverage/lcov-report/src/mount.ts.html +0 -335
  155. package/coverage/lcov-report/src/page/access-control.ts.html +0 -134
  156. package/coverage/lcov-report/src/page/index.html +0 -186
  157. package/coverage/lcov-report/src/page/list.ts.html +0 -800
  158. package/coverage/lcov-report/src/page/mountable-with-fields.ts.html +0 -554
  159. package/coverage/lcov-report/src/page/mountable.ts.html +0 -119
  160. package/coverage/lcov-report/src/page/page.ts.html +0 -218
  161. package/coverage/lcov-report/src/page/props-parser.ts.html +0 -194
  162. package/coverage/lcov-report/src/run.ts.html +0 -80
  163. package/coverage/lcov-report/src/sanitize.ts.html +0 -107
  164. package/coverage/lcov-report/src/templates/collection.ts.html +0 -113
  165. package/coverage/lcov-report/src/templates/form.ts.html +0 -260
  166. package/coverage/lcov-report/src/templates/index.html +0 -216
  167. package/coverage/lcov-report/src/templates/list.ts.html +0 -305
  168. package/coverage/lcov-report/src/templates/multiform.ts.html +0 -254
  169. package/coverage/lcov-report/src/templates/page.ts.html +0 -155
  170. package/coverage/lcov-report/src/templates/post.ts.html +0 -143
  171. package/coverage/lcov-report/src/templates/redirect.ts.html +0 -146
  172. package/coverage/lcov-report/src/templates/route-test.ts.html +0 -161
  173. package/coverage/lcov-report/src/test_utils/index.html +0 -111
  174. package/coverage/lcov-report/src/test_utils/locator_is_visible.ts.html +0 -131
  175. package/coverage/lcov-report/src/utils/assert-throws.ts.html +0 -134
  176. package/coverage/lcov-report/src/utils/browser-creator.js.html +0 -110
  177. package/coverage/lcov-report/src/utils/escape-url-params.ts.html +0 -122
  178. package/coverage/lcov-report/src/utils/exec.ts.html +0 -170
  179. package/coverage/lcov-report/src/utils/format-external-url.ts.html +0 -119
  180. package/coverage/lcov-report/src/utils/import-path.ts.html +0 -155
  181. package/coverage/lcov-report/src/utils/index.html +0 -366
  182. package/coverage/lcov-report/src/utils/input-wrapper.ts.html +0 -143
  183. package/coverage/lcov-report/src/utils/list-collections.ts.html +0 -128
  184. package/coverage/lcov-report/src/utils/make-slug.ts.html +0 -95
  185. package/coverage/lcov-report/src/utils/natural-numbers.ts.html +0 -95
  186. package/coverage/lcov-report/src/utils/prettier.ts.html +0 -119
  187. package/coverage/lcov-report/src/utils/question.ts.html +0 -149
  188. package/coverage/lcov-report/src/utils/render-attributes.ts.html +0 -131
  189. package/coverage/lcov-report/src/utils/sleep.ts.html +0 -89
  190. package/coverage/lcov-report/src/utils/translate.ts.html +0 -119
  191. package/coverage/lcov-report/src/utils/url-with-new-params.ts.html +0 -107
  192. package/coverage/lcov-report/src/utils/utils.ts.html +0 -122
  193. package/coverage/lcov-report/src/utils/walk.ts.html +0 -140
  194. package/coverage/lcov.info +0 -4697
  195. package/jenkins.sanity.sh +0 -3
  196. package/lib/add-collection.js.map +0 -1
  197. package/lib/add-route.js.map +0 -1
  198. package/lib/add-route.test.js.map +0 -1
  199. package/lib/build.js.map +0 -1
  200. package/lib/cli.js.map +0 -1
  201. package/lib/components/components.js.map +0 -1
  202. package/lib/components/tabs.js.map +0 -1
  203. package/lib/components/toggle-modal.js.map +0 -1
  204. package/lib/example.test.js.map +0 -1
  205. package/lib/find-scss-includes.js.map +0 -1
  206. package/lib/forms/controls/array.js.map +0 -1
  207. package/lib/forms/controls/autocomplete.js.map +0 -1
  208. package/lib/forms/controls/big-radio-group.js.map +0 -1
  209. package/lib/forms/controls/checkbox-group.js.map +0 -1
  210. package/lib/forms/controls/checkbox.js.map +0 -1
  211. package/lib/forms/controls/checkboxed-list-input.js.map +0 -1
  212. package/lib/forms/controls/collapsible-checkbox-group.js.map +0 -1
  213. package/lib/forms/controls/collapsible-field-group.js.map +0 -1
  214. package/lib/forms/controls/controls.js.map +0 -1
  215. package/lib/forms/controls/derived-frame.js.map +0 -1
  216. package/lib/forms/controls/derived.js.map +0 -1
  217. package/lib/forms/controls/dropdown.js.map +0 -1
  218. package/lib/forms/controls/editable-collection-subset.js.map +0 -1
  219. package/lib/forms/controls/field-group.js.map +0 -1
  220. package/lib/forms/controls/file.js.map +0 -1
  221. package/lib/forms/controls/form-control.js.map +0 -1
  222. package/lib/forms/controls/form-field-control.js.map +0 -1
  223. package/lib/forms/controls/form-header.js.map +0 -1
  224. package/lib/forms/controls/form-paragraph.js.map +0 -1
  225. package/lib/forms/controls/frame.js.map +0 -1
  226. package/lib/forms/controls/hidden-input.js.map +0 -1
  227. package/lib/forms/controls/html.js.map +0 -1
  228. package/lib/forms/controls/multiple-files.js.map +0 -1
  229. package/lib/forms/controls/multiple-photos.js.map +0 -1
  230. package/lib/forms/controls/number.js.map +0 -1
  231. package/lib/forms/controls/photo.js.map +0 -1
  232. package/lib/forms/controls/radio.js.map +0 -1
  233. package/lib/forms/controls/reverse-single-reference.js.map +0 -1
  234. package/lib/forms/controls/simple-input.js.map +0 -1
  235. package/lib/forms/controls/textarea.js.map +0 -1
  236. package/lib/forms/controls/tickable.js.map +0 -1
  237. package/lib/forms/fields/boolean.js.map +0 -1
  238. package/lib/forms/fields/boolean.test.js.map +0 -1
  239. package/lib/forms/fields/checkboxed-list.js.map +0 -1
  240. package/lib/forms/fields/collection-field.js.map +0 -1
  241. package/lib/forms/fields/email.js.map +0 -1
  242. package/lib/forms/fields/email.test.js.map +0 -1
  243. package/lib/forms/fields/enum-multiple.js.map +0 -1
  244. package/lib/forms/fields/enum-multiple.test.js.map +0 -1
  245. package/lib/forms/fields/enum.js.map +0 -1
  246. package/lib/forms/fields/enum.test.js.map +0 -1
  247. package/lib/forms/fields/existing-sealious-value.js.map +0 -1
  248. package/lib/forms/fields/field.js.map +0 -1
  249. package/lib/forms/fields/file.js.map +0 -1
  250. package/lib/forms/fields/files-multiple.js +0 -18
  251. package/lib/forms/fields/files-multiple.js.map +0 -1
  252. package/lib/forms/fields/multiple-files.js.map +0 -1
  253. package/lib/forms/fields/number.js.map +0 -1
  254. package/lib/forms/fields/number.test.js.map +0 -1
  255. package/lib/forms/fields/pick-from-list.js.map +0 -1
  256. package/lib/forms/fields/pick-from-list.test.js.map +0 -1
  257. package/lib/forms/fields/proxy-field.js.map +0 -1
  258. package/lib/forms/fields/regexp.js.map +0 -1
  259. package/lib/forms/fields/regexp.test.js.map +0 -1
  260. package/lib/forms/fields/reverse-single-reference.js.map +0 -1
  261. package/lib/forms/fields/simple-form-field.js.map +0 -1
  262. package/lib/forms/fields/structured-array.js.map +0 -1
  263. package/lib/forms/form.js.map +0 -1
  264. package/lib/forms/form.test.js.map +0 -1
  265. package/lib/forms/multiform.js.map +0 -1
  266. package/lib/forms/multiform.test.js.map +0 -1
  267. package/lib/generate-collections.js.map +0 -1
  268. package/lib/generate-routes.js.map +0 -1
  269. package/lib/index.js.map +0 -1
  270. package/lib/make-env.js.map +0 -1
  271. package/lib/make-hidden-inputs.js.map +0 -1
  272. package/lib/mount.js.map +0 -1
  273. package/lib/page/access-control.js.map +0 -1
  274. package/lib/page/list.js.map +0 -1
  275. package/lib/page/mountable-with-fields.js.map +0 -1
  276. package/lib/page/mountable.js.map +0 -1
  277. package/lib/page/page.js.map +0 -1
  278. package/lib/page/props-parser.js.map +0 -1
  279. package/lib/run.js.map +0 -1
  280. package/lib/sanitize.js.map +0 -1
  281. package/lib/sealgen-url.js +0 -1
  282. package/lib/sealgen-url.js.map +0 -1
  283. package/lib/templates/collection.js.map +0 -1
  284. package/lib/templates/form.js.map +0 -1
  285. package/lib/templates/list.js.map +0 -1
  286. package/lib/templates/multiform.js.map +0 -1
  287. package/lib/templates/page.js.map +0 -1
  288. package/lib/templates/post.js.map +0 -1
  289. package/lib/templates/redirect.js.map +0 -1
  290. package/lib/templates/route-test.js.map +0 -1
  291. package/lib/test_utils/locator_is_visible.js.map +0 -1
  292. package/lib/tests/manual/multiform.js +0 -95
  293. package/lib/tests/manual/multiform.js.map +0 -1
  294. package/lib/utils/assert-throws.js.map +0 -1
  295. package/lib/utils/browser-creator.js.map +0 -1
  296. package/lib/utils/escape-url-params.js.map +0 -1
  297. package/lib/utils/exec.js.map +0 -1
  298. package/lib/utils/format-external-url.js.map +0 -1
  299. package/lib/utils/import-path.js.map +0 -1
  300. package/lib/utils/input-wrapper.js.map +0 -1
  301. package/lib/utils/list-collections.js.map +0 -1
  302. package/lib/utils/make-slug.js.map +0 -1
  303. package/lib/utils/natural-numbers.js.map +0 -1
  304. package/lib/utils/prettier.js.map +0 -1
  305. package/lib/utils/question.js.map +0 -1
  306. package/lib/utils/render-attributes.js.map +0 -1
  307. package/lib/utils/sleep.js.map +0 -1
  308. package/lib/utils/translate.js.map +0 -1
  309. package/lib/utils/url-with-new-params.js.map +0 -1
  310. package/lib/utils/utils.js.map +0 -1
  311. package/lib/utils/walk.js.map +0 -1
  312. package/mocha_root_hooks.js +0 -6
  313. package/src/add-collection.ts +0 -31
  314. package/src/add-route.test.ts +0 -58
  315. package/src/add-route.ts +0 -86
  316. package/src/build.ts +0 -94
  317. package/src/cli.ts +0 -36
  318. package/src/components/components.ts +0 -2
  319. package/src/components/tabs.ts +0 -95
  320. package/src/components/toggle-modal.ts +0 -52
  321. package/src/example.test.ts +0 -3
  322. package/src/find-scss-includes.ts +0 -32
  323. package/src/forms/controls/array.ts +0 -226
  324. package/src/forms/controls/autocomplete.ts +0 -33
  325. package/src/forms/controls/big-radio-group.ts +0 -48
  326. package/src/forms/controls/checkbox-group.ts +0 -71
  327. package/src/forms/controls/checkbox.ts +0 -34
  328. package/src/forms/controls/checkboxed-list-input.ts +0 -50
  329. package/src/forms/controls/collapsible-checkbox-group.ts +0 -28
  330. package/src/forms/controls/collapsible-field-group.ts +0 -94
  331. package/src/forms/controls/controls.ts +0 -30
  332. package/src/forms/controls/derived-frame.ts +0 -91
  333. package/src/forms/controls/derived.ts +0 -108
  334. package/src/forms/controls/dropdown.ts +0 -87
  335. package/src/forms/controls/editable-collection-subset.ts +0 -97
  336. package/src/forms/controls/field-group.ts +0 -69
  337. package/src/forms/controls/file.ts +0 -47
  338. package/src/forms/controls/form-control.ts +0 -24
  339. package/src/forms/controls/form-field-control.ts +0 -22
  340. package/src/forms/controls/form-header.ts +0 -19
  341. package/src/forms/controls/form-paragraph.ts +0 -11
  342. package/src/forms/controls/frame.ts +0 -26
  343. package/src/forms/controls/hidden-input.ts +0 -22
  344. package/src/forms/controls/html.ts +0 -38
  345. package/src/forms/controls/multiple-files.ts +0 -256
  346. package/src/forms/controls/multiple-photos.ts +0 -44
  347. package/src/forms/controls/number.ts +0 -38
  348. package/src/forms/controls/photo.ts +0 -74
  349. package/src/forms/controls/radio.ts +0 -43
  350. package/src/forms/controls/reverse-single-reference.ts +0 -50
  351. package/src/forms/controls/simple-input.ts +0 -148
  352. package/src/forms/controls/textarea.ts +0 -60
  353. package/src/forms/controls/tickable.ts +0 -127
  354. package/src/forms/fields/boolean.test.ts +0 -36
  355. package/src/forms/fields/boolean.ts +0 -63
  356. package/src/forms/fields/checkboxed-list.ts +0 -66
  357. package/src/forms/fields/collection-field.ts +0 -62
  358. package/src/forms/fields/email.test.ts +0 -24
  359. package/src/forms/fields/email.ts +0 -20
  360. package/src/forms/fields/enum-multiple.test.ts +0 -31
  361. package/src/forms/fields/enum-multiple.ts +0 -62
  362. package/src/forms/fields/enum.test.ts +0 -25
  363. package/src/forms/fields/enum.ts +0 -56
  364. package/src/forms/fields/existing-sealious-value.ts +0 -22
  365. package/src/forms/fields/field.ts +0 -172
  366. package/src/forms/fields/file.ts +0 -89
  367. package/src/forms/fields/multiple-files.ts +0 -20
  368. package/src/forms/fields/number.test.ts +0 -34
  369. package/src/forms/fields/number.ts +0 -70
  370. package/src/forms/fields/pick-from-list.test.ts +0 -19
  371. package/src/forms/fields/pick-from-list.ts +0 -52
  372. package/src/forms/fields/proxy-field.ts +0 -24
  373. package/src/forms/fields/regexp.test.ts +0 -25
  374. package/src/forms/fields/regexp.ts +0 -53
  375. package/src/forms/fields/reverse-single-reference.ts +0 -20
  376. package/src/forms/fields/simple-form-field.ts +0 -30
  377. package/src/forms/fields/structured-array.ts +0 -27
  378. package/src/forms/form.test.ts +0 -351
  379. package/src/forms/form.ts +0 -294
  380. package/src/forms/forms.scss +0 -85
  381. package/src/forms/multiform.test.ts +0 -540
  382. package/src/forms/multiform.ts +0 -236
  383. package/src/generate-collections.ts +0 -77
  384. package/src/generate-routes.ts +0 -120
  385. package/src/index.ts +0 -24
  386. package/src/make-env.ts +0 -15
  387. package/src/make-hidden-inputs.ts +0 -24
  388. package/src/mount.ts +0 -85
  389. package/src/page/access-control.ts +0 -18
  390. package/src/page/list.ts +0 -240
  391. package/src/page/mountable-with-fields.ts +0 -158
  392. package/src/page/mountable.ts +0 -13
  393. package/src/page/page.ts +0 -46
  394. package/src/page/props-parser.ts +0 -38
  395. package/src/run.ts +0 -0
  396. package/src/sanitize.ts +0 -9
  397. package/src/templates/collection.ts +0 -11
  398. package/src/templates/form.ts +0 -60
  399. package/src/templates/list.ts +0 -75
  400. package/src/templates/multiform.ts +0 -58
  401. package/src/templates/page.ts +0 -25
  402. package/src/templates/post.ts +0 -21
  403. package/src/templates/redirect.ts +0 -22
  404. package/src/templates/route-test.ts +0 -27
  405. package/src/test_utils/locator_is_visible.ts +0 -17
  406. package/src/utils/assert-throws.ts +0 -18
  407. package/src/utils/browser-creator.js +0 -10
  408. package/src/utils/escape-url-params.ts +0 -14
  409. package/src/utils/exec.ts +0 -30
  410. package/src/utils/format-external-url.ts +0 -13
  411. package/src/utils/import-path.ts +0 -25
  412. package/src/utils/input-wrapper.ts +0 -21
  413. package/src/utils/list-collections.ts +0 -16
  414. package/src/utils/make-slug.ts +0 -5
  415. package/src/utils/natural-numbers.ts +0 -5
  416. package/src/utils/prettier.ts +0 -13
  417. package/src/utils/question.ts +0 -23
  418. package/src/utils/render-attributes.ts +0 -17
  419. package/src/utils/sleep.ts +0 -3
  420. package/src/utils/translate.ts +0 -13
  421. package/src/utils/url-with-new-params.ts +0 -9
  422. package/src/utils/utils.ts +0 -14
  423. package/src/utils/walk.ts +0 -20
@@ -1,94 +0,0 @@
1
- import { FlatTemplatable } from "tempstream";
2
- import { FieldGroup } from "./field-group";
3
- import { randomUUID } from "crypto";
4
- import { FormControl } from "./form-control";
5
-
6
- type CollapsibleFieldGroupOptions = {
7
- label?: string;
8
- classes?: string[];
9
- openOnStart?: boolean;
10
- textWhenOpen?: string;
11
- textWhenClosed?: string;
12
- groupID?: string;
13
- };
14
-
15
- export class CollapsibleFieldGroup extends FieldGroup {
16
- public collapseID: string;
17
- constructor(
18
- public controls: FormControl[],
19
- public options: CollapsibleFieldGroupOptions = {}
20
- ) {
21
- super([]);
22
- if (this.options.groupID == undefined) {
23
- this.options.groupID = "A" + randomUUID(); // "A" is needed as ids always have to start with a letter
24
- }
25
- this.collapseID = this.options.groupID + "collapse";
26
- }
27
-
28
- getGroupLabelProps() {
29
- return super.getGroupLabelProps() + ` for="${this.collapseID}"`;
30
- }
31
-
32
- preLabelContainer(): FlatTemplatable {
33
- return /* HTML */ `<style>
34
- input#${this.collapseID} {
35
- display: none;
36
- }
37
-
38
- input#${this.collapseID} ~ .field-group__fields {
39
- display: none;
40
- }
41
-
42
- input#${this.collapseID}:checked ~ .field-group__fields {
43
- display: block;
44
- }
45
-
46
- input#${this.collapseID}
47
- ~ .field-group__label-container
48
- .field-group__collapse-label-text--open {
49
- display: none;
50
- }
51
-
52
- input#${this.collapseID}:checked
53
- ~ .field-group__label-container
54
- .field-group__collapse-label-text--open {
55
- display: inline-block;
56
- }
57
-
58
- input#${this.collapseID}
59
- ~ .field-group__label-container
60
- .field-group__collapse-label-text--closed {
61
- display: inline-block;
62
- }
63
-
64
- input#${this.collapseID}:checked
65
- ~ .field-group__label-container
66
- .field-group__collapse-label-text--closed {
67
- display: none;
68
- }
69
- </style>
70
- <input
71
- type="checkbox"
72
- id="${this.collapseID}"
73
- ${this.options.openOnStart ? "checked" : ""}
74
- />`;
75
- }
76
-
77
- postLabel(): FlatTemplatable {
78
- return /* HTML */ `<label
79
- class="field-group__collapse-label"
80
- for="${this.collapseID}"
81
- >
82
- <span
83
- class="field-group__collapse-label-text field-group__collapse-label-text--open"
84
- >
85
- ${this.options.textWhenOpen || "close"}
86
- </span>
87
- <span
88
- class="field-group__collapse-label-text field-group__collapse-label-text--closed"
89
- >
90
- ${this.options.textWhenClosed || "open"}
91
- </span>
92
- </label>`;
93
- }
94
- }
@@ -1,30 +0,0 @@
1
- export { FormControl } from "./form-control";
2
- export { FormFieldControl } from "./form-field-control";
3
- export { EditableCollectionSubset } from "./editable-collection-subset";
4
- export { Frame } from "./frame";
5
- export { CheckboxedListInput } from "./checkboxed-list-input";
6
- export * from "./dropdown";
7
- export { SimpleInput } from "./simple-input";
8
- export { FormHeader } from "./form-header";
9
- export { FormParagraph } from "./form-paragraph";
10
- export { HTML } from "./html";
11
- export { HiddenInput } from "./hidden-input";
12
- export { Textarea } from "./textarea";
13
- export { FieldGroup } from "./field-group";
14
- export * from "./derived";
15
- export * from "./derived-frame";
16
- export * from "./tickable";
17
- export * from "./checkbox";
18
- export * from "./radio";
19
- export * from "./big-radio-group";
20
- export * from "./checkbox-group";
21
- export * from "./collapsible-field-group";
22
- export * from "./collapsible-checkbox-group";
23
- export * from "./autocomplete";
24
- export * from "./file";
25
- export * from "./photo";
26
- export * from "./multiple-files";
27
- export * from "./number";
28
- export * from "./multiple-photos";
29
- // export * from "./reverse-single-reference";
30
- export * from "./array";
@@ -1,91 +0,0 @@
1
- import Router from "@koa/router";
2
- import { hasShape, predicates } from "@sealcode/ts-predicates";
3
- import { Context } from "koa";
4
- import { ParsedUrlQuery } from "querystring";
5
- import { FlatTemplatable, tempstream } from "tempstream";
6
- import { makeSlug } from "../../utils/make-slug";
7
- import { FormField } from "../fields/field";
8
- import { Derived } from "./derived";
9
- import { FormControlContext } from "./form-control";
10
-
11
- export class DerivedFrame extends Derived<{
12
- frame_id: string;
13
- form_id: string;
14
- field_name_prefix: string;
15
- }> {
16
- constructor(
17
- public frame_name: string,
18
- fields: FormField[],
19
- public generateFrameContent: (
20
- ctx: FormControlContext,
21
- args: ParsedUrlQuery
22
- ) => Promise<FlatTemplatable>,
23
- // "a" is to make it a valid DOM id
24
- public frame_id = "a" + makeSlug(frame_name)
25
- ) {
26
- super(
27
- fields,
28
- async (values, consts) => /* HTML */ `<turbo-frame
29
- id="${consts.frame_id}"
30
- src="./${consts.frame_id}?${Object.entries({
31
- ...consts,
32
- ...(values || {}),
33
- })
34
- .map(([key, value]) => `${key}=${value}`)
35
- .join("&")}"
36
- ></turbo-frame>`,
37
- async (fctx) => ({
38
- form_id: fctx.form_id,
39
- field_name_prefix: fctx.field_name_prefix,
40
- frame_id,
41
- validate: fctx.validate,
42
- })
43
- );
44
- }
45
-
46
- renderBackendResponseFrame(_ctx: Context, content: FlatTemplatable) {
47
- return tempstream/* HTML */ `<turbo-frame
48
- id="${this.frame_id}"
49
- target="_top"
50
- >
51
- ${content || ""}
52
- </turbo-frame>`;
53
- }
54
-
55
- mount(router: Router) {
56
- router.get(this.frame_id, async (ctx) => {
57
- const query = ctx.query;
58
- if (
59
- !hasShape(
60
- {
61
- field_name_prefix: predicates.string,
62
- form_id: predicates.string,
63
- validate: predicates.string,
64
- },
65
- query
66
- )
67
- ) {
68
- ctx.body = this.renderBackendResponseFrame(
69
- ctx,
70
- "Missing query params"
71
- );
72
- return;
73
- }
74
- ctx.body = this.renderBackendResponseFrame(
75
- ctx,
76
- await this.generateFrameContent(
77
- new FormControlContext(
78
- ctx,
79
- ctx.query,
80
- [],
81
- query.field_name_prefix,
82
- query.form_id,
83
- query.validate === "true" ? true : false
84
- ),
85
- ctx.query
86
- )
87
- );
88
- });
89
- return;
90
- }
91
- }
@@ -1,108 +0,0 @@
1
- import { randomUUID } from "crypto";
2
- import { FlatTemplatable, tempstream } from "tempstream";
3
- import { FormField } from "../fields/field";
4
- import { FormDataValue } from "../form";
5
- import { FormControl, FormControlContext } from "./form-control";
6
-
7
- export class Derived<
8
- Consts extends Record<string, unknown | undefined>
9
- > extends FormControl {
10
- role = <const>"decoration";
11
-
12
- constructor(
13
- public fields: FormField[],
14
- public _render: (
15
- values: Record<string, string>,
16
- consts: Consts
17
- ) => Promise<FlatTemplatable>,
18
- public getConsts: (
19
- fctx: FormControlContext
20
- ) => Promise<Consts> = async () => ({} as Consts)
21
- ) {
22
- super();
23
- }
24
-
25
- async getBackendValues(
26
- fctx: FormControlContext
27
- ): Promise<Record<string, FormDataValue>> {
28
- const fieldnames = this.fields.map((f) => f.name);
29
- const result = Object.fromEntries(
30
- Object.entries(fctx.data).filter(([key]) =>
31
- fieldnames.includes(key)
32
- )
33
- );
34
- return result;
35
- }
36
-
37
- async render(fctx: FormControlContext): Promise<FlatTemplatable> {
38
- // the A makes it always a valid id, as it cannot start with a number
39
- const id = "A" + randomUUID();
40
-
41
- const consts = this.getConsts(fctx);
42
-
43
- const frontend_side_refresh_code = (values_code = "getValues()") =>
44
- `render(${values_code}, consts)
45
- .then(result=>document.querySelector("#${id}").innerHTML=result)`;
46
-
47
- return tempstream/* HTML */ `<div>
48
- <script>
49
- (function () {
50
- const consts = ${"{" +
51
- Object.entries((await consts) || {})
52
- .map(([key, value]) => {
53
- return `"${key}": ${
54
- typeof value === "object"
55
- ? JSON.stringify(value)
56
- : typeof value == "string"
57
- ? '"' + (value as string).toString() + '"'
58
- : (value as string).toString()
59
- }`;
60
- })
61
- .join(",") +
62
- "}"};
63
- const form_container =
64
- document.currentScript.closest(".form-container");
65
- const render = ${this._render.toString()};
66
- function getValues() {
67
- return Object.fromEntries(
68
- ${JSON.stringify(
69
- this.fields.map((field) => field.name)
70
- )}.map((field_name) => {
71
- let input = form_container.querySelector(
72
- \`input[name="\${field_name}"]\`
73
- );
74
- if (!input) {
75
- return [field_name, ""];
76
- }
77
- if (input.type === "radio") {
78
- input = form_container.querySelector(
79
- \`input[name="\${field_name}"]:checked\`
80
- );
81
- }
82
- return [field_name, input.value];
83
- })
84
- );
85
- }
86
- function setupWatcher(field_name) {
87
- form_container
88
- .querySelectorAll(\`input[name="\${field_name}"]\`)
89
- .forEach((input) => {
90
- input.addEventListener("change", () => {
91
- ${frontend_side_refresh_code()};
92
- });
93
- });
94
- }
95
- ${JSON.stringify(
96
- this.fields.map((field) => field.name)
97
- )}.forEach(setupWatcher);
98
- setTimeout(() => {
99
- ${frontend_side_refresh_code(
100
- JSON.stringify(await this.getBackendValues(fctx))
101
- )};
102
- }, 0);
103
- })();
104
- </script>
105
- <div id="${id}">${this._render({}, await consts)}</div>
106
- </div>`;
107
- }
108
- }
@@ -1,87 +0,0 @@
1
- import { Context } from "koa";
2
- import { FlatTemplatable, tempstream } from "tempstream";
3
- import { attribute } from "../../sanitize";
4
- import { FormField, PickFromListField } from "../fields/field";
5
- import { FormDataValue } from "../form";
6
- import { FormControlContext } from "./form-control";
7
- import { SimpleInput } from "./simple-input";
8
-
9
- export type DropdownOptions = {
10
- label: string;
11
- autosubmit?: boolean;
12
- autocomplete?: boolean;
13
- };
14
-
15
- export type DropdownOption = { value: string; label: string };
16
-
17
- export class FreeformDropdown extends SimpleInput<string | null> {
18
- constructor(
19
- public field: FormField<boolean, string | null>,
20
- public _generateOptions: (ctx: Context) => Promise<DropdownOption[]>,
21
- public options: DropdownOptions = {
22
- label: field.name,
23
- autosubmit: false,
24
- autocomplete: true,
25
- }
26
- ) {
27
- super(field, options);
28
- }
29
-
30
- async generateOptions(ctx: Context): Promise<DropdownOption[]> {
31
- return this._generateOptions(ctx);
32
- }
33
-
34
- async getInputAttributes(
35
- fctx: FormControlContext
36
- ): Promise<Record<string, string | boolean>> {
37
- const original = await super.getInputAttributes(fctx);
38
- return {
39
- ...original,
40
- ...Object.fromEntries([
41
- ...(this.options.autosubmit
42
- ? [
43
- [
44
- "onchange",
45
- (original.onchange || "") +
46
- ";this.form.submit();",
47
- ],
48
- ]
49
- : []),
50
- ]),
51
- };
52
- }
53
-
54
- async renderInput(
55
- ctx: Context,
56
- attributes_str: string,
57
- data: Record<string, FormDataValue>
58
- ): Promise<FlatTemplatable> {
59
- const { parsed: picked_value } = await this.field.getValue(ctx, data);
60
- return /* HTML */ tempstream`<select ${attributes_str}>
61
- ${
62
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
63
- Promise.resolve(this.generateOptions(ctx)).then((options) =>
64
- options.map(
65
- ({ value, label }) =>
66
- `<option value="${attribute(value)}" ${
67
- (value || "") == picked_value ? "selected" : ""
68
- }>${label}</option>`
69
- )
70
- )
71
- }
72
- </select>`;
73
- }
74
- }
75
-
76
- export class Dropdown extends FreeformDropdown {
77
- constructor(
78
- public field: PickFromListField<boolean>,
79
- public options: DropdownOptions = {
80
- label: field.name,
81
- autosubmit: false,
82
- autocomplete: true,
83
- }
84
- ) {
85
- super(field, (ctx) => field.generateOptions(ctx), options);
86
- }
87
- }
@@ -1,97 +0,0 @@
1
- import { FlatTemplatable, tempstream } from "tempstream";
2
- import { attribute } from "../../sanitize";
3
- import { PickFromListField } from "../fields/field";
4
- import { FormFieldControl } from "./controls";
5
- import { FormControlContext } from "./form-control";
6
-
7
- /**
8
- * This control has own forms in it so if you want to use it you
9
- * probably shouldn't use `await super.render(ctx, data, path)` in
10
- * render method of you from implementation and you should write
11
- * your own implementation of this method. See forms that uses
12
- * this control for reference.
13
- */
14
- export class EditableCollectionSubset extends FormFieldControl {
15
- constructor(
16
- public field: PickFromListField<false>,
17
- public actionname: string,
18
- public listLabel?: string,
19
- public selectLabel?: string
20
- ) {
21
- super([field]);
22
- }
23
-
24
- async render(fctx: FormControlContext): Promise<FlatTemplatable> {
25
- const { parsed: values } = await this.field.getValue(
26
- fctx.ctx,
27
- fctx.data
28
- );
29
-
30
- return tempstream/* HTML */ `<div>
31
- <ul>
32
- ${Promise.resolve(this.field.generateOptions(fctx.ctx)).then(
33
- (options) =>
34
- Object.entries(options)
35
- .filter(([value]) =>
36
- (values || ([] as string[])).includes(value)
37
- )
38
- .map(
39
- ([value, text]) => /* HTML */ `
40
- <li>
41
- <form
42
- method="POST"
43
- action="${fctx.ctx.path}"
44
- >
45
- <span>${text}</span>
46
- <input
47
- type="hidden"
48
- name="${this.field.name}"
49
- value="${attribute(value)}"
50
- />
51
- <input
52
- type="hidden"
53
- name="${this.actionname}"
54
- value="list"
55
- />
56
- <input
57
- type="submit"
58
- ${this.listLabel
59
- ? `value="${this.listLabel}"`
60
- : ""}
61
- />
62
- </form>
63
- </li>
64
- `
65
- )
66
- )}
67
- </ul>
68
- <form method="POST" action="${fctx.ctx.path}">
69
- <select name="${this.field.name}">
70
- ${Promise.resolve(
71
- this.field.generateOptions(fctx.ctx)
72
- ).then((options) =>
73
- Object.entries(options)
74
- .filter(
75
- ([value]) =>
76
- !(values || ([] as string[])).includes(
77
- value
78
- )
79
- )
80
- .map(
81
- ([value, text]) =>
82
- `<option value="${attribute(
83
- value
84
- )}">${text}</option>`
85
- )
86
- )}
87
- </select>
88
- <input type="hidden" name="${this.actionname}" value="select" />
89
- <input
90
- type="submit"
91
- ${this.selectLabel ? `value="${this.selectLabel}"` : ""}
92
- />
93
- </form>
94
- </div>`;
95
- }
96
- role = <const>"input";
97
- }
@@ -1,69 +0,0 @@
1
- import { Context } from "koa";
2
- import { FlatTemplatable, tempstream } from "tempstream";
3
- import { FormDataValue, FormMessage } from "../form";
4
- import { FormControl, FormControlContext } from "./form-control";
5
- import { FormFieldControl } from "./form-field-control";
6
-
7
- export class FieldGroup extends FormFieldControl {
8
- constructor(
9
- public controls: FormControl[],
10
- public options: {
11
- label?: string;
12
- classes?: string[];
13
- containerID?: string;
14
- } = {}
15
- ) {
16
- super([]);
17
- }
18
-
19
- preLabel(): FlatTemplatable {
20
- return "";
21
- }
22
-
23
- preLabelContainer(): FlatTemplatable {
24
- return "";
25
- }
26
-
27
- postLabel(): FlatTemplatable {
28
- return "";
29
- }
30
-
31
- preFields(): FlatTemplatable {
32
- return "";
33
- }
34
-
35
- postFields(): FlatTemplatable {
36
- return "";
37
- }
38
-
39
- getGroupLabelProps(): FlatTemplatable {
40
- return `class="field-group__label"`;
41
- }
42
-
43
- async render(fctx: FormControlContext): Promise<FlatTemplatable> {
44
- const { label, classes } = this.options;
45
-
46
- return tempstream/* HTML */ `
47
- <div
48
- class="field-group ${(classes || []).join(" ")}"
49
- ${this.options.containerID
50
- ? `id="${this.options.containerID}"`
51
- : ""}
52
- >
53
- ${this.preLabelContainer()}
54
- <div class="field-group__label-container">
55
- ${this.preLabel()}
56
- ${label
57
- ? `<label ${this.getGroupLabelProps()}>${label}</label>`
58
- : ""}
59
- ${this.postLabel()}
60
- </div>
61
- ${this.preFields()}
62
- <div class="field-group__fields">
63
- ${this.controls.map((control) => control.render(fctx))}
64
- </div>
65
- ${this.postFields()}
66
- </div>
67
- `;
68
- }
69
- }
@@ -1,47 +0,0 @@
1
- import { Context } from "koa";
2
- import { FlatTemplatable, tempstream } from "tempstream";
3
- import { FileContainer } from "../fields/file";
4
- import { FormDataValue } from "../form";
5
- import { FormControlContext } from "./form-control";
6
- import { SimpleInput } from "./simple-input";
7
-
8
- export class File extends SimpleInput<FileContainer> {
9
- getType() {
10
- return "file";
11
- }
12
-
13
- async renderFilePreview(
14
- _ctx: Context,
15
- file_data: { id?: string; filename?: string } | null
16
- ): Promise<FlatTemplatable> {
17
- return file_data?.filename || "";
18
- }
19
-
20
- async preInput(ctx: Context, data: Record<string, FormDataValue>) {
21
- const { parsed } = await this.field.getValue(ctx, data);
22
- return tempstream/* HTML */ `${this.renderFilePreview(ctx, parsed.old)}
23
- <input
24
- type="hidden"
25
- name="${this.field.name}[old][id]"
26
- value="${parsed.old?.id || ""}"
27
- />
28
- <input
29
- type="hidden"
30
- name="${this.field.name}[old][filename]"
31
- value="${parsed.old?.filename || ""}"
32
- />`;
33
- }
34
-
35
- async getInputAttributes(
36
- fctx: FormControlContext
37
- ): Promise<Record<string, string | boolean>> {
38
- const original = await super.getInputAttributes(fctx);
39
- const { parsed } = await this.field.getValue(fctx.ctx, fctx.data);
40
- return {
41
- ...original,
42
- name: this.field.name + "[new]",
43
- required: original.required && !parsed.old,
44
- value: false,
45
- };
46
- }
47
- }
@@ -1,24 +0,0 @@
1
- import Router from "@koa/router";
2
- import { Context } from "koa";
3
- import { FlatTemplatable } from "tempstream";
4
- import { FormDataValue, FormMessage } from "../form";
5
-
6
- export class FormControlContext {
7
- constructor(
8
- public ctx: Context,
9
- public data: Record<string, FormDataValue>,
10
- public messages: FormMessage[],
11
- public field_name_prefix: string,
12
- public form_id: string,
13
- public validate: boolean
14
- ) {}
15
- }
16
-
17
- export abstract class FormControl {
18
- abstract render(
19
- fctx: FormControlContext
20
- ): FlatTemplatable | Promise<FlatTemplatable>;
21
- abstract role: "input" | "decoration" | "messages" | "submit";
22
-
23
- mount(router: Router) {}
24
- }
@@ -1,22 +0,0 @@
1
- import { Context } from "koa";
2
- import { FlatTemplatable } from "tempstream";
3
- import { FormField } from "../fields/field";
4
- import { FieldValueType, FormDataValue } from "../form";
5
- import { FormControl, FormControlContext } from "./form-control";
6
-
7
- export type FormFieldsToTypes<FormFields extends readonly FormField[]> = {
8
- [Index in keyof FormFields]: FormFields[Index] extends FormField
9
- ? FieldValueType<FormFields[Index]>
10
- : never;
11
- };
12
-
13
- export abstract class FormFieldControl extends FormControl {
14
- role = <const>"input";
15
- constructor(public fields: FormField[]) {
16
- super();
17
- }
18
-
19
- abstract render(
20
- fctx: FormControlContext
21
- ): FlatTemplatable | Promise<FlatTemplatable>;
22
- }
@@ -1,19 +0,0 @@
1
- import { Context } from "koa";
2
- import { FormControl } from "./controls";
3
- import { FormControlContext } from "./form-control";
4
-
5
- export class FormHeader extends FormControl {
6
- role = <const>"decoration";
7
- constructor(
8
- public text: string,
9
- public isVisible: (
10
- fctx: FormControlContext
11
- ) => Promise<boolean> = async () => true
12
- ) {
13
- super();
14
- }
15
- async render(fctx: FormControlContext) {
16
- const isVsbl = await this.isVisible(fctx);
17
- return isVsbl ? `<h2>${this.text}</h2>` : "";
18
- }
19
- }