@fieldia/designer 0.26.1 → 0.27.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 (386) hide show
  1. package/README.md +75 -0
  2. package/package.json +4 -4
  3. package/src/lib/answer-picker.d.mts +22 -0
  4. package/src/lib/answer-picker.d.ts +22 -0
  5. package/src/lib/answer-picker.js +104 -0
  6. package/src/lib/answer-picker.js.map +1 -0
  7. package/src/lib/answer-picker.mjs +99 -0
  8. package/src/lib/answer-picker.mjs.map +1 -0
  9. package/src/lib/canvas-form.js +2 -1
  10. package/src/lib/canvas-form.js.map +1 -1
  11. package/src/lib/canvas-form.mjs +2 -1
  12. package/src/lib/canvas-form.mjs.map +1 -1
  13. package/src/lib/chrome.js +15 -4
  14. package/src/lib/chrome.js.map +1 -1
  15. package/src/lib/chrome.mjs +15 -4
  16. package/src/lib/chrome.mjs.map +1 -1
  17. package/src/lib/clipboard-names.d.mts +1 -1
  18. package/src/lib/clipboard-names.d.ts +1 -1
  19. package/src/lib/clipboard-names.js +25 -4
  20. package/src/lib/clipboard-names.js.map +1 -1
  21. package/src/lib/clipboard-names.mjs +25 -4
  22. package/src/lib/clipboard-names.mjs.map +1 -1
  23. package/src/lib/columns-editor.d.mts +5 -2
  24. package/src/lib/columns-editor.d.ts +5 -2
  25. package/src/lib/columns-editor.js +144 -3
  26. package/src/lib/columns-editor.js.map +1 -1
  27. package/src/lib/columns-editor.mjs +144 -3
  28. package/src/lib/columns-editor.mjs.map +1 -1
  29. package/src/lib/condition-editor.d.mts +5 -1
  30. package/src/lib/condition-editor.d.ts +5 -1
  31. package/src/lib/condition-editor.js +5 -2
  32. package/src/lib/condition-editor.js.map +1 -1
  33. package/src/lib/condition-editor.mjs +5 -2
  34. package/src/lib/condition-editor.mjs.map +1 -1
  35. package/src/lib/conditions.d.mts +6 -2
  36. package/src/lib/conditions.d.ts +6 -2
  37. package/src/lib/conditions.js +9 -3
  38. package/src/lib/conditions.js.map +1 -1
  39. package/src/lib/conditions.mjs +9 -3
  40. package/src/lib/conditions.mjs.map +1 -1
  41. package/src/lib/designer.d.mts +43 -2
  42. package/src/lib/designer.d.ts +43 -2
  43. package/src/lib/designer.js +111 -14
  44. package/src/lib/designer.js.map +1 -1
  45. package/src/lib/designer.mjs +113 -16
  46. package/src/lib/designer.mjs.map +1 -1
  47. package/src/lib/endings-commands.d.mts +27 -0
  48. package/src/lib/endings-commands.d.ts +27 -0
  49. package/src/lib/endings-commands.js +58 -0
  50. package/src/lib/endings-commands.js.map +1 -0
  51. package/src/lib/endings-commands.mjs +55 -0
  52. package/src/lib/endings-commands.mjs.map +1 -0
  53. package/src/lib/endings-editor.d.mts +14 -0
  54. package/src/lib/endings-editor.d.ts +14 -0
  55. package/src/lib/endings-editor.js +131 -0
  56. package/src/lib/endings-editor.js.map +1 -0
  57. package/src/lib/endings-editor.mjs +128 -0
  58. package/src/lib/endings-editor.mjs.map +1 -0
  59. package/src/lib/head-parts.js +1 -1
  60. package/src/lib/head-parts.js.map +1 -1
  61. package/src/lib/head-parts.mjs +2 -2
  62. package/src/lib/head-parts.mjs.map +1 -1
  63. package/src/lib/json-checks.d.mts +2 -1
  64. package/src/lib/json-checks.d.ts +2 -1
  65. package/src/lib/json-checks.js +3 -3
  66. package/src/lib/json-checks.js.map +1 -1
  67. package/src/lib/json-checks.mjs +3 -3
  68. package/src/lib/json-checks.mjs.map +1 -1
  69. package/src/lib/json-view.js +1 -1
  70. package/src/lib/json-view.js.map +1 -1
  71. package/src/lib/json-view.mjs +1 -1
  72. package/src/lib/json-view.mjs.map +1 -1
  73. package/src/lib/kind-commands.d.mts +4 -0
  74. package/src/lib/kind-commands.d.ts +4 -0
  75. package/src/lib/kind-commands.js +19 -0
  76. package/src/lib/kind-commands.js.map +1 -1
  77. package/src/lib/kind-commands.mjs +19 -0
  78. package/src/lib/kind-commands.mjs.map +1 -1
  79. package/src/lib/kind-settings-structures.js +50 -3
  80. package/src/lib/kind-settings-structures.js.map +1 -1
  81. package/src/lib/kind-settings-structures.mjs +50 -3
  82. package/src/lib/kind-settings-structures.mjs.map +1 -1
  83. package/src/lib/kind-settings.js +48 -0
  84. package/src/lib/kind-settings.js.map +1 -1
  85. package/src/lib/kind-settings.mjs +48 -0
  86. package/src/lib/kind-settings.mjs.map +1 -1
  87. package/src/lib/kinds.d.mts +3 -2
  88. package/src/lib/kinds.d.ts +3 -2
  89. package/src/lib/kinds.js +3 -1
  90. package/src/lib/kinds.js.map +1 -1
  91. package/src/lib/kinds.mjs +3 -1
  92. package/src/lib/kinds.mjs.map +1 -1
  93. package/src/lib/limits-settings.d.mts +14 -0
  94. package/src/lib/limits-settings.d.ts +14 -0
  95. package/src/lib/limits-settings.js +66 -0
  96. package/src/lib/limits-settings.js.map +1 -0
  97. package/src/lib/limits-settings.mjs +63 -0
  98. package/src/lib/limits-settings.mjs.map +1 -0
  99. package/src/lib/list-commands.d.mts +21 -3
  100. package/src/lib/list-commands.d.ts +21 -3
  101. package/src/lib/list-commands.js +61 -9
  102. package/src/lib/list-commands.js.map +1 -1
  103. package/src/lib/list-commands.mjs +60 -8
  104. package/src/lib/list-commands.mjs.map +1 -1
  105. package/src/lib/list-properties.js +51 -4
  106. package/src/lib/list-properties.js.map +1 -1
  107. package/src/lib/list-properties.mjs +53 -6
  108. package/src/lib/list-properties.mjs.map +1 -1
  109. package/src/lib/list-rows-settings.js +1 -1
  110. package/src/lib/list-rows-settings.js.map +1 -1
  111. package/src/lib/list-rows-settings.mjs +1 -1
  112. package/src/lib/list-rows-settings.mjs.map +1 -1
  113. package/src/lib/list-source.d.mts +2 -2
  114. package/src/lib/list-source.d.ts +2 -2
  115. package/src/lib/list-source.js +55 -9
  116. package/src/lib/list-source.js.map +1 -1
  117. package/src/lib/list-source.mjs +55 -9
  118. package/src/lib/list-source.mjs.map +1 -1
  119. package/src/lib/locales/ar/changes.js +2 -0
  120. package/src/lib/locales/ar/changes.js.map +1 -1
  121. package/src/lib/locales/ar/changes.mjs +2 -0
  122. package/src/lib/locales/ar/changes.mjs.map +1 -1
  123. package/src/lib/locales/ar/checks.js +1 -0
  124. package/src/lib/locales/ar/checks.js.map +1 -1
  125. package/src/lib/locales/ar/checks.mjs +1 -0
  126. package/src/lib/locales/ar/checks.mjs.map +1 -1
  127. package/src/lib/locales/ar/endings.d.mts +3 -0
  128. package/src/lib/locales/ar/endings.d.ts +3 -0
  129. package/src/lib/locales/ar/endings.js +40 -0
  130. package/src/lib/locales/ar/endings.js.map +1 -0
  131. package/src/lib/locales/ar/endings.mjs +37 -0
  132. package/src/lib/locales/ar/endings.mjs.map +1 -0
  133. package/src/lib/locales/ar/index.js +2 -1
  134. package/src/lib/locales/ar/index.js.map +1 -1
  135. package/src/lib/locales/ar/index.mjs +2 -1
  136. package/src/lib/locales/ar/index.mjs.map +1 -1
  137. package/src/lib/locales/ar/list.js +9 -1
  138. package/src/lib/locales/ar/list.js.map +1 -1
  139. package/src/lib/locales/ar/list.mjs +9 -1
  140. package/src/lib/locales/ar/list.mjs.map +1 -1
  141. package/src/lib/locales/ar/options.js +4 -0
  142. package/src/lib/locales/ar/options.js.map +1 -1
  143. package/src/lib/locales/ar/options.mjs +4 -0
  144. package/src/lib/locales/ar/options.mjs.map +1 -1
  145. package/src/lib/locales/ar/panel.js +20 -0
  146. package/src/lib/locales/ar/panel.js.map +1 -1
  147. package/src/lib/locales/ar/panel.mjs +20 -0
  148. package/src/lib/locales/ar/panel.mjs.map +1 -1
  149. package/src/lib/locales/ar/questions.js +24 -1
  150. package/src/lib/locales/ar/questions.js.map +1 -1
  151. package/src/lib/locales/ar/questions.mjs +24 -1
  152. package/src/lib/locales/ar/questions.mjs.map +1 -1
  153. package/src/lib/locales/ar/refusals.js +15 -2
  154. package/src/lib/locales/ar/refusals.js.map +1 -1
  155. package/src/lib/locales/ar/refusals.mjs +15 -2
  156. package/src/lib/locales/ar/refusals.mjs.map +1 -1
  157. package/src/lib/locales/ar/rules-ui.js +21 -1
  158. package/src/lib/locales/ar/rules-ui.js.map +1 -1
  159. package/src/lib/locales/ar/rules-ui.mjs +21 -1
  160. package/src/lib/locales/ar/rules-ui.mjs.map +1 -1
  161. package/src/lib/locales/ar/rules.js +4 -0
  162. package/src/lib/locales/ar/rules.js.map +1 -1
  163. package/src/lib/locales/ar/rules.mjs +4 -0
  164. package/src/lib/locales/ar/rules.mjs.map +1 -1
  165. package/src/lib/locales/en/changes.d.mts +2 -0
  166. package/src/lib/locales/en/changes.d.ts +2 -0
  167. package/src/lib/locales/en/changes.js +2 -0
  168. package/src/lib/locales/en/changes.js.map +1 -1
  169. package/src/lib/locales/en/changes.mjs +2 -0
  170. package/src/lib/locales/en/changes.mjs.map +1 -1
  171. package/src/lib/locales/en/checks.d.mts +2 -0
  172. package/src/lib/locales/en/checks.d.ts +2 -0
  173. package/src/lib/locales/en/checks.js +2 -0
  174. package/src/lib/locales/en/checks.js.map +1 -1
  175. package/src/lib/locales/en/checks.mjs +2 -0
  176. package/src/lib/locales/en/checks.mjs.map +1 -1
  177. package/src/lib/locales/en/endings.d.mts +38 -0
  178. package/src/lib/locales/en/endings.d.ts +38 -0
  179. package/src/lib/locales/en/endings.js +44 -0
  180. package/src/lib/locales/en/endings.js.map +1 -0
  181. package/src/lib/locales/en/endings.mjs +41 -0
  182. package/src/lib/locales/en/endings.mjs.map +1 -0
  183. package/src/lib/locales/en/index.d.mts +127 -1
  184. package/src/lib/locales/en/index.d.ts +127 -1
  185. package/src/lib/locales/en/index.js +2 -1
  186. package/src/lib/locales/en/index.js.map +1 -1
  187. package/src/lib/locales/en/index.mjs +2 -1
  188. package/src/lib/locales/en/index.mjs.map +1 -1
  189. package/src/lib/locales/en/list.d.mts +8 -0
  190. package/src/lib/locales/en/list.d.ts +8 -0
  191. package/src/lib/locales/en/list.js +9 -1
  192. package/src/lib/locales/en/list.js.map +1 -1
  193. package/src/lib/locales/en/list.mjs +9 -1
  194. package/src/lib/locales/en/list.mjs.map +1 -1
  195. package/src/lib/locales/en/options.d.mts +6 -0
  196. package/src/lib/locales/en/options.d.ts +6 -0
  197. package/src/lib/locales/en/options.js +6 -0
  198. package/src/lib/locales/en/options.js.map +1 -1
  199. package/src/lib/locales/en/options.mjs +6 -0
  200. package/src/lib/locales/en/options.mjs.map +1 -1
  201. package/src/lib/locales/en/panel.d.mts +13 -0
  202. package/src/lib/locales/en/panel.d.ts +13 -0
  203. package/src/lib/locales/en/panel.js +13 -0
  204. package/src/lib/locales/en/panel.js.map +1 -1
  205. package/src/lib/locales/en/panel.mjs +13 -0
  206. package/src/lib/locales/en/panel.mjs.map +1 -1
  207. package/src/lib/locales/en/questions.d.mts +25 -0
  208. package/src/lib/locales/en/questions.d.ts +25 -0
  209. package/src/lib/locales/en/questions.js +25 -1
  210. package/src/lib/locales/en/questions.js.map +1 -1
  211. package/src/lib/locales/en/questions.mjs +25 -1
  212. package/src/lib/locales/en/questions.mjs.map +1 -1
  213. package/src/lib/locales/en/refusals.d.mts +13 -0
  214. package/src/lib/locales/en/refusals.d.ts +13 -0
  215. package/src/lib/locales/en/refusals.js +15 -2
  216. package/src/lib/locales/en/refusals.js.map +1 -1
  217. package/src/lib/locales/en/refusals.mjs +15 -2
  218. package/src/lib/locales/en/refusals.mjs.map +1 -1
  219. package/src/lib/locales/en/rules-ui.d.mts +29 -1
  220. package/src/lib/locales/en/rules-ui.d.ts +29 -1
  221. package/src/lib/locales/en/rules-ui.js +23 -1
  222. package/src/lib/locales/en/rules-ui.js.map +1 -1
  223. package/src/lib/locales/en/rules-ui.mjs +23 -1
  224. package/src/lib/locales/en/rules-ui.mjs.map +1 -1
  225. package/src/lib/locales/en/rules.d.mts +3 -0
  226. package/src/lib/locales/en/rules.d.ts +3 -0
  227. package/src/lib/locales/en/rules.js +4 -0
  228. package/src/lib/locales/en/rules.js.map +1 -1
  229. package/src/lib/locales/en/rules.mjs +4 -0
  230. package/src/lib/locales/en/rules.mjs.map +1 -1
  231. package/src/lib/option-when.d.mts +32 -0
  232. package/src/lib/option-when.d.ts +32 -0
  233. package/src/lib/option-when.js +110 -0
  234. package/src/lib/option-when.js.map +1 -0
  235. package/src/lib/option-when.mjs +106 -0
  236. package/src/lib/option-when.mjs.map +1 -0
  237. package/src/lib/page-checks.d.mts +2 -1
  238. package/src/lib/page-checks.d.ts +2 -1
  239. package/src/lib/page-checks.js +14 -2
  240. package/src/lib/page-checks.js.map +1 -1
  241. package/src/lib/page-checks.mjs +15 -3
  242. package/src/lib/page-checks.mjs.map +1 -1
  243. package/src/lib/page-json.d.mts +5 -3
  244. package/src/lib/page-json.d.ts +5 -3
  245. package/src/lib/page-json.js +4 -4
  246. package/src/lib/page-json.js.map +1 -1
  247. package/src/lib/page-json.mjs +4 -4
  248. package/src/lib/page-json.mjs.map +1 -1
  249. package/src/lib/page-tree.js +3 -3
  250. package/src/lib/page-tree.js.map +1 -1
  251. package/src/lib/page-tree.mjs +4 -4
  252. package/src/lib/page-tree.mjs.map +1 -1
  253. package/src/lib/panel-block.js +3 -1
  254. package/src/lib/panel-block.js.map +1 -1
  255. package/src/lib/panel-block.mjs +3 -1
  256. package/src/lib/panel-block.mjs.map +1 -1
  257. package/src/lib/panel-field.js +4 -1
  258. package/src/lib/panel-field.js.map +1 -1
  259. package/src/lib/panel-field.mjs +4 -1
  260. package/src/lib/panel-field.mjs.map +1 -1
  261. package/src/lib/panel-page.js +16 -2
  262. package/src/lib/panel-page.js.map +1 -1
  263. package/src/lib/panel-page.mjs +16 -2
  264. package/src/lib/panel-page.mjs.map +1 -1
  265. package/src/lib/placeholder-when.js +2 -2
  266. package/src/lib/placeholder-when.js.map +1 -1
  267. package/src/lib/placeholder-when.mjs +2 -2
  268. package/src/lib/placeholder-when.mjs.map +1 -1
  269. package/src/lib/rules-answers.js +10 -4
  270. package/src/lib/rules-answers.js.map +1 -1
  271. package/src/lib/rules-answers.mjs +11 -5
  272. package/src/lib/rules-answers.mjs.map +1 -1
  273. package/src/lib/rules-checks.d.mts +2 -2
  274. package/src/lib/rules-checks.d.ts +2 -2
  275. package/src/lib/rules-checks.js +23 -3
  276. package/src/lib/rules-checks.js.map +1 -1
  277. package/src/lib/rules-checks.mjs +24 -4
  278. package/src/lib/rules-checks.mjs.map +1 -1
  279. package/src/lib/rules-commands.d.mts +5 -3
  280. package/src/lib/rules-commands.d.ts +5 -3
  281. package/src/lib/rules-commands.js +17 -17
  282. package/src/lib/rules-commands.js.map +1 -1
  283. package/src/lib/rules-commands.mjs +17 -17
  284. package/src/lib/rules-commands.mjs.map +1 -1
  285. package/src/lib/rules-defaults.js +3 -1
  286. package/src/lib/rules-defaults.js.map +1 -1
  287. package/src/lib/rules-defaults.mjs +3 -1
  288. package/src/lib/rules-defaults.mjs.map +1 -1
  289. package/src/lib/rules-formula-box.d.mts +4 -2
  290. package/src/lib/rules-formula-box.d.ts +4 -2
  291. package/src/lib/rules-formula-box.js +3 -1
  292. package/src/lib/rules-formula-box.js.map +1 -1
  293. package/src/lib/rules-formula-box.mjs +3 -1
  294. package/src/lib/rules-formula-box.mjs.map +1 -1
  295. package/src/lib/rules-formula.d.mts +13 -6
  296. package/src/lib/rules-formula.d.ts +13 -6
  297. package/src/lib/rules-formula.js +65 -24
  298. package/src/lib/rules-formula.js.map +1 -1
  299. package/src/lib/rules-formula.mjs +65 -25
  300. package/src/lib/rules-formula.mjs.map +1 -1
  301. package/src/lib/rules-sample.d.mts +4 -2
  302. package/src/lib/rules-sample.d.ts +4 -2
  303. package/src/lib/rules-sample.js +5 -4
  304. package/src/lib/rules-sample.js.map +1 -1
  305. package/src/lib/rules-sample.mjs +5 -4
  306. package/src/lib/rules-sample.mjs.map +1 -1
  307. package/src/lib/rules-worked-out.js +72 -17
  308. package/src/lib/rules-worked-out.js.map +1 -1
  309. package/src/lib/rules-worked-out.mjs +73 -18
  310. package/src/lib/rules-worked-out.mjs.map +1 -1
  311. package/src/lib/screen-canvas.js +3 -1
  312. package/src/lib/screen-canvas.js.map +1 -1
  313. package/src/lib/screen-canvas.mjs +3 -1
  314. package/src/lib/screen-canvas.mjs.map +1 -1
  315. package/src/lib/steps-commands.d.mts +5 -3
  316. package/src/lib/steps-commands.d.ts +5 -3
  317. package/src/lib/steps-commands.js +5 -5
  318. package/src/lib/steps-commands.js.map +1 -1
  319. package/src/lib/steps-commands.mjs +5 -5
  320. package/src/lib/steps-commands.mjs.map +1 -1
  321. package/src/lib/steps-editor.js +3 -2
  322. package/src/lib/steps-editor.js.map +1 -1
  323. package/src/lib/steps-editor.mjs +3 -2
  324. package/src/lib/steps-editor.mjs.map +1 -1
  325. package/src/lib/steps-map.d.mts +3 -1
  326. package/src/lib/steps-map.d.ts +3 -1
  327. package/src/lib/steps-map.js +1 -1
  328. package/src/lib/steps-map.js.map +1 -1
  329. package/src/lib/steps-map.mjs +1 -1
  330. package/src/lib/steps-map.mjs.map +1 -1
  331. package/src/lib/steps-settings.d.mts +3 -1
  332. package/src/lib/steps-settings.d.ts +3 -1
  333. package/src/lib/steps-settings.js +5 -2
  334. package/src/lib/steps-settings.js.map +1 -1
  335. package/src/lib/steps-settings.mjs +5 -2
  336. package/src/lib/steps-settings.mjs.map +1 -1
  337. package/src/lib/styles-endings.d.mts +6 -0
  338. package/src/lib/styles-endings.d.ts +6 -0
  339. package/src/lib/styles-endings.js +42 -0
  340. package/src/lib/styles-endings.js.map +1 -0
  341. package/src/lib/styles-endings.mjs +39 -0
  342. package/src/lib/styles-endings.mjs.map +1 -0
  343. package/src/lib/styles-kinds.d.mts +1 -1
  344. package/src/lib/styles-kinds.d.ts +1 -1
  345. package/src/lib/styles-kinds.js +1 -0
  346. package/src/lib/styles-kinds.js.map +1 -1
  347. package/src/lib/styles-kinds.mjs +1 -0
  348. package/src/lib/styles-kinds.mjs.map +1 -1
  349. package/src/lib/styles-rules.d.mts +1 -1
  350. package/src/lib/styles-rules.d.ts +1 -1
  351. package/src/lib/styles-rules.js +6 -1
  352. package/src/lib/styles-rules.js.map +1 -1
  353. package/src/lib/styles-rules.mjs +6 -1
  354. package/src/lib/styles-rules.mjs.map +1 -1
  355. package/src/lib/styles.d.mts +1 -1
  356. package/src/lib/styles.d.ts +1 -1
  357. package/src/lib/styles.js +18 -2
  358. package/src/lib/styles.js.map +1 -1
  359. package/src/lib/styles.mjs +18 -2
  360. package/src/lib/styles.mjs.map +1 -1
  361. package/src/lib/survey-editor.js +14 -4
  362. package/src/lib/survey-editor.js.map +1 -1
  363. package/src/lib/survey-editor.mjs +14 -4
  364. package/src/lib/survey-editor.mjs.map +1 -1
  365. package/src/lib/table-commands.d.mts +4 -2
  366. package/src/lib/table-commands.d.ts +4 -2
  367. package/src/lib/table-commands.js +4 -3
  368. package/src/lib/table-commands.js.map +1 -1
  369. package/src/lib/table-commands.mjs +4 -3
  370. package/src/lib/table-commands.mjs.map +1 -1
  371. package/src/lib/try-it.js +2 -0
  372. package/src/lib/try-it.js.map +1 -1
  373. package/src/lib/try-it.mjs +2 -0
  374. package/src/lib/try-it.mjs.map +1 -1
  375. package/src/lib/uncalled.d.mts +7 -0
  376. package/src/lib/uncalled.d.ts +7 -0
  377. package/src/lib/uncalled.js +21 -0
  378. package/src/lib/uncalled.js.map +1 -0
  379. package/src/lib/uncalled.mjs +18 -0
  380. package/src/lib/uncalled.mjs.map +1 -0
  381. package/src/lib/validate-edit.d.mts +3 -2
  382. package/src/lib/validate-edit.d.ts +3 -2
  383. package/src/lib/validate-edit.js +4 -3
  384. package/src/lib/validate-edit.js.map +1 -1
  385. package/src/lib/validate-edit.mjs +4 -3
  386. package/src/lib/validate-edit.mjs.map +1 -1
@@ -1,9 +1,9 @@
1
- import { validatePage, wideColumns, } from '@fieldia/core';
1
+ import { functionTable, functionsPart, optionsField, optionsList, limitInstant, validatePage, wideColumns, } from '@fieldia/core';
2
2
  import { comparable, FIELD_NAME, FORMAT_VERSION, upgradePage } from '@fieldia/core';
3
3
  import { conditionToHide, conditionToHold, splitShownWhile, withShownWhile } from './conditions.mjs';
4
4
  import { findHeaderPart, headerCommands } from './header-commands.mjs';
5
5
  import { listCommands, setRowRules } from './list-commands.mjs';
6
- import { kindCommands } from './kind-commands.mjs';
6
+ import { kindCommands, relabel } from './kind-commands.mjs';
7
7
  import { choiceCommands } from './choice-commands.mjs';
8
8
  import { inputCommands } from './input-commands.mjs';
9
9
  import { structureCommands } from './structure-commands.mjs';
@@ -25,6 +25,7 @@ import { rulesCommands } from './rules-commands.mjs';
25
25
  import { headCommands } from './head-commands.mjs';
26
26
  import { keepWhatRulesRead } from './rules-reads.mjs';
27
27
  import { stepsCommands } from './steps-commands.mjs';
28
+ import { endingsCommands } from './endings-commands.mjs';
28
29
  import { forgetGoneTargets } from './steps-places.mjs';
29
30
  import { forgetGoneCounts } from './head-parts.mjs';
30
31
  import * as clipboard from './clipboard-ops.mjs';
@@ -153,6 +154,9 @@ export function createMemoryPageStore() {
153
154
  }
154
155
  const clone = (value) => JSON.parse(JSON.stringify(value));
155
156
  export function createDesigner(options) {
157
+ // The formula boxes work a formula out on made-up values with each of Fieldia's functions: their bodies beyond the
158
+ // plain ones are @fieldia/core's functions part, asked for at once.
159
+ functionsPart.load().catch(() => undefined);
156
160
  const store = options.store;
157
161
  /** How each editor reads a setting typed and not yet left (`settling`): publish runs them first. */
158
162
  const readers = new Set();
@@ -244,7 +248,10 @@ export function createDesigner(options) {
244
248
  })();
245
249
  }
246
250
  /** An edit's page checked as validatePage would, at the cost of what it changed. */
247
- const checkEdit = editChecker();
251
+ // The app's functions: a name no page may call is refused now, as a form refuses it.
252
+ const functions = options.functions;
253
+ functionTable(functions);
254
+ const checkEdit = editChecker(functions);
248
255
  /**
249
256
  * Apply an edit to a copy, validate it, and keep it — or refuse it, saying
250
257
  * why. `after` runs once it is kept, before anyone is told: what the edit
@@ -354,6 +361,7 @@ export function createDesigner(options) {
354
361
  });
355
362
  const list = listCommands({
356
363
  apply,
364
+ functions,
357
365
  select(id) {
358
366
  selected = id;
359
367
  notify();
@@ -372,7 +380,8 @@ export function createDesigner(options) {
372
380
  ...choices,
373
381
  ...inputs,
374
382
  ...structures,
375
- ...tableCommands({ apply }),
383
+ ...tableCommands({ apply, functions }),
384
+ ...endingsCommands({ apply }),
376
385
  words,
377
386
  locale,
378
387
  getPage: () => page,
@@ -1036,6 +1045,36 @@ export function createDesigner(options) {
1036
1045
  delete draft.lowerLabels;
1037
1046
  }, 'lowerLabels');
1038
1047
  },
1048
+ setPageLimits(patch) {
1049
+ return apply((draft) => {
1050
+ if (draft.data.kind !== 'responses')
1051
+ throw new Refusal((w) => w.refusals.limitsForResponses);
1052
+ const limits = { ...(draft.limits ?? {}) };
1053
+ for (const [key, value] of Object.entries(patch)) {
1054
+ if (value === null || value === undefined || value === false || (typeof value === 'string' && !value.trim()))
1055
+ delete limits[key];
1056
+ else
1057
+ limits[key] = value;
1058
+ }
1059
+ const opens = typeof limits['opens'] === 'string' ? limitInstant(limits['opens'], draft.timeZone) : null;
1060
+ const closes = typeof limits['closes'] === 'string' ? limitInstant(limits['closes'], draft.timeZone, true) : null;
1061
+ if (opens !== null && closes !== null && closes <= opens)
1062
+ throw new Refusal((w) => w.refusals.closesBeforeOpens);
1063
+ // Its words alone say nothing of when: they go with the last of the rest.
1064
+ if (Object.keys(limits).some((key) => key !== 'message'))
1065
+ draft.limits = limits;
1066
+ else
1067
+ delete draft.limits;
1068
+ }, `limits:${Object.keys(patch).join(',')}`);
1069
+ },
1070
+ setContinueLater(on) {
1071
+ return apply((draft) => {
1072
+ if (on)
1073
+ draft.continueLater = true;
1074
+ else
1075
+ delete draft.continueLater;
1076
+ }, 'continueLater');
1077
+ },
1039
1078
  setDuplicates(patch) {
1040
1079
  return apply((draft) => {
1041
1080
  if (patch.fields !== undefined && !patch.fields?.length)
@@ -1226,6 +1265,9 @@ export function createDesigner(options) {
1226
1265
  fields[name] = { ...kept, label: column.label };
1227
1266
  else if (column.kind === 'other')
1228
1267
  throw new Refusal((w) => w.refusals.newColumnKind);
1268
+ // A new choice starts with one option, to be written over.
1269
+ else if (column.kind === 'choice')
1270
+ fields[name] = { type: 'selection', label: column.label, options: [{ value: 'option_1', label: words.defaults.option(1) }] };
1229
1271
  else
1230
1272
  fields[name] = { type: COLUMN_TYPES[column.kind], label: column.label };
1231
1273
  }
@@ -1234,6 +1276,48 @@ export function createDesigner(options) {
1234
1276
  // Typing in a column's label is one undo step, as in an option.
1235
1277
  `columns:${id}:${columns.length}`);
1236
1278
  },
1279
+ setColumnChoices(id, column, choices) {
1280
+ return apply((draft) => {
1281
+ const lines = fieldOfType(draft, id, ['one2many'], (w) => w.refusals.onlyLinesColumns, (w, label) => w.refusals.columnsFromModel(label));
1282
+ const field = lines.fields[column];
1283
+ if (field?.type !== 'selection')
1284
+ throw new Refusal((w) => w.refusals.notAChoiceColumn(field?.label ?? column));
1285
+ if (choices.labels) {
1286
+ const options = relabel(field.options, choices.labels, 'option');
1287
+ if (!options.length && !field.optionsFrom)
1288
+ throw new Refusal((w) => w.refusals.columnNeedsOption(field.label));
1289
+ field.options = options;
1290
+ }
1291
+ if (choices.from === null) {
1292
+ delete field.optionsFrom;
1293
+ // Written again: one option to start from, when there were none.
1294
+ if (!field.options.length)
1295
+ field.options = [{ value: 'option_1', label: words.defaults.option(1) }];
1296
+ }
1297
+ else if (choices.from) {
1298
+ // What it changes with: the line's other columns, and the record's fields.
1299
+ const on = (choices.from.dependsOn ?? []).filter((name) => (name.startsWith('parent.') ? !!draft.fields[name.slice(7)] : name !== column && !!lines.fields[name]));
1300
+ field.optionsFrom = { list: choices.from.list, ...(on.length ? { dependsOn: on } : {}) };
1301
+ }
1302
+ },
1303
+ // Typing an option's words, or a list's name, is one step.
1304
+ choices.labels ? `column-options:${id}:${column}:${choices.labels.length}` : choices.from ? `column-list:${id}:${column}:${JSON.stringify(choices.from.dependsOn ?? [])}` : null);
1305
+ },
1306
+ setColumnOptionWhen(id, column, index, invisible) {
1307
+ return apply((draft) => {
1308
+ const lines = fieldOfType(draft, id, ['one2many'], (w) => w.refusals.onlyLinesColumns, (w, label) => w.refusals.columnsFromModel(label));
1309
+ const field = lines.fields[column];
1310
+ if (field?.type !== 'selection')
1311
+ throw new Refusal((w) => w.refusals.notAChoiceColumn(field?.label ?? column));
1312
+ const option = field.options[index];
1313
+ if (!option)
1314
+ throw new Refusal((w) => w.refusals.noOption(index + 1));
1315
+ if (invisible === null || !invisible.trim())
1316
+ delete option.invisible;
1317
+ else
1318
+ option.invisible = invisible.trim();
1319
+ });
1320
+ },
1237
1321
  undo() {
1238
1322
  const previous = past[past.length - 1];
1239
1323
  if (!previous)
@@ -1266,7 +1350,7 @@ export function createDesigner(options) {
1266
1350
  // A setting still typed is read first, as leaving its box reads it: what is published is what the boxes show.
1267
1351
  for (const read of [...readers])
1268
1352
  read();
1269
- const checked = validatePage(page);
1353
+ const checked = validatePage(page, { functions });
1270
1354
  if (!checked.ok)
1271
1355
  throw new Error(words.refusals.cannotPublish);
1272
1356
  const version = store ? await store.publish(clone(page)) : versions.length + 1;
@@ -1276,7 +1360,7 @@ export function createDesigner(options) {
1276
1360
  },
1277
1361
  checks() {
1278
1362
  if (checksOf?.page !== page || checksOf.forms !== formsCame)
1279
- checksOf = { page, forms: formsCame, checks: pageChecks(page, { valid: checkEdit.passed(page), forms, words }) };
1363
+ checksOf = { page, forms: formsCame, checks: pageChecks(page, { valid: checkEdit.passed(page), forms, words, functions }) };
1280
1364
  return [...checksOf.checks];
1281
1365
  },
1282
1366
  fixCheck: (check) => fixCheck(designer, check),
@@ -1299,13 +1383,15 @@ export function createDesigner(options) {
1299
1383
  // panel lane
1300
1384
  setEach: (ids, change) => apply((draft) => several.setEach(draft, ids, change, fromModel)),
1301
1385
  // json lane
1302
- ...pageJsonCommands({ getPage: () => page, apply, words }),
1386
+ ...pageJsonCommands({ getPage: () => page, apply, words, functions }),
1303
1387
  lists: () => clone(options.lists ?? []),
1388
+ functions: () => functions,
1304
1389
  setOptionsFrom(id, from) {
1305
1390
  const found = findNode(page, id);
1306
- const was = found?.node.type === 'field' ? page.fields[found.node.field]?.optionsFrom : undefined;
1391
+ const was = optionsList(found?.node.type === 'field' ? page.fields[found.node.field]?.optionsFrom : undefined);
1392
+ const list = optionsList(from ?? undefined);
1307
1393
  // Typing a list's name is one step, as typing a label is.
1308
- const naming = !!from && !!was && JSON.stringify(was.dependsOn ?? []) === JSON.stringify(from.dependsOn ?? []);
1394
+ const naming = !!list && !!was && JSON.stringify(was.dependsOn ?? []) === JSON.stringify(list.dependsOn ?? []);
1309
1395
  return apply((draft) => {
1310
1396
  const field = fieldOfType(draft, id, ['selection'], (w) => w.refusals.onlyChoiceFromList, (w, label) => w.refusals.choicesFromModel(label));
1311
1397
  if (!from) {
@@ -1315,7 +1401,18 @@ export function createDesigner(options) {
1315
1401
  field.options = [{ value: 'option_1', label: words.defaults.option(1) }];
1316
1402
  return;
1317
1403
  }
1318
- field.optionsFrom = { list: from.list, ...(from.dependsOn?.length ? { dependsOn: [...from.dependsOn] } : {}) };
1404
+ const carried = optionsField(from);
1405
+ if (carried) {
1406
+ const source = draft.fields[carried.field];
1407
+ if (carried.field === fieldNode(draft, id).field || source?.type !== 'selection')
1408
+ throw new Refusal((w) => w.refusals.carriedFromChoice);
1409
+ field.optionsFrom = { field: carried.field, ...(carried.picked === false ? { picked: false } : {}) };
1410
+ // Its own options follow those carried: none until some are written.
1411
+ field.options = field.options.filter((o) => !/^option_\d+$/.test(String(o.value)) || !isDefaultOption(o.label));
1412
+ return;
1413
+ }
1414
+ if (list)
1415
+ field.optionsFrom = { list: list.list, ...(list.dependsOn?.length ? { dependsOn: [...list.dependsOn] } : {}) };
1319
1416
  }, naming ? `list-name:${id}` : null);
1320
1417
  },
1321
1418
  // canvas lane
@@ -1353,11 +1450,11 @@ export function createDesigner(options) {
1353
1450
  const node = findNode(draft, id)?.node;
1354
1451
  if (!node || node.type !== 'related')
1355
1452
  throw new Refusal((w) => w.layout.noPart(id));
1356
- changeRelated(draft, node, patch);
1453
+ changeRelated(draft, node, patch, functions);
1357
1454
  }, `related:${id}:${Object.keys(patch).join(',')}`),
1358
1455
  setWidths: (widths, options) => apply((draft) => settings.setWidths(draft, widths, options?.twelfths)),
1359
1456
  // rules lane
1360
- ...rulesCommands({ apply, getPage: () => page, fromModel }),
1457
+ ...rulesCommands({ apply, getPage: () => page, fromModel, functions }),
1361
1458
  // A record's head, and the parts it brought: a button's icon alone, toggle and menu; a tab's count; a field's access key.
1362
1459
  ...headCommands({ apply, select: (id) => designer.select(id), model, words }),
1363
1460
  // extend lane
@@ -1444,7 +1541,7 @@ export function createDesigner(options) {
1444
1541
  canOpenForm: () => typeof options.openForm === 'function',
1445
1542
  openForm: (id) => options.openForm?.(id),
1446
1543
  // steps lane
1447
- ...stepsCommands({ apply, getPage: () => page }),
1544
+ ...stepsCommands({ apply, getPage: () => page, functions }),
1448
1545
  };
1449
1546
  return designer;
1450
1547
  }
@@ -1454,14 +1551,14 @@ createDesigner.open = async (id, store, options = {}) => {
1454
1551
  const page = draft ?? versions[versions.length - 1]?.page;
1455
1552
  if (!page)
1456
1553
  throw new Error(`The store has no page "${id}"`);
1457
- return createDesigner({ page, store, versions, model: options.model, lists: options.lists, kinds: options.kinds, looks: options.looks, openForm: options.openForm, locale: options.locale, regionSets: options.regionSets });
1554
+ return createDesigner({ page, store, versions, model: options.model, lists: options.lists, functions: options.functions, kinds: options.kinds, looks: options.looks, openForm: options.openForm, locale: options.locale, regionSets: options.regionSets });
1458
1555
  };
1459
1556
  /** A sheet's status steps, by the id the designer picks them by: they show for some records only, and to some roles, as any part. */
1460
1557
  function statusbarOf(page, id) {
1461
1558
  return id === '#statusbar' && page.layout.type === 'sheet' ? page.layout.statusbar : undefined;
1462
1559
  }
1463
1560
  /** A related list changed as asked: names that are no field's refused, and what named a column taken away gone with it. */
1464
- function changeRelated(draft, node, patch) {
1561
+ function changeRelated(draft, node, patch, functions) {
1465
1562
  const named = (name) => {
1466
1563
  if (!FIELD_NAME.test(name))
1467
1564
  throw new Refusal((w) => w.relatedPart.notAName(name));
@@ -1541,7 +1638,7 @@ function changeRelated(draft, node, patch) {
1541
1638
  node.card = JSON.parse(JSON.stringify(patch.card));
1542
1639
  }
1543
1640
  // Its rows' own rules, as a list's: each condition read on a row's record — its own fields, its id, the person.
1544
- setRowRules(node, patch, draft, { ...draft, fields: node.fields });
1641
+ setRowRules(node, patch, draft, { ...draft, fields: node.fields }, functions);
1545
1642
  // A field taken away with its column goes from the card too: its lines, its title, picture and status.
1546
1643
  if (patch.columns !== undefined && node.card) {
1547
1644
  const card = node.card;