@fieldia/designer 0.24.0 → 0.26.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 (346) hide show
  1. package/README.md +15 -0
  2. package/package.json +4 -4
  3. package/src/lib/canvas-blocks.d.mts +4 -3
  4. package/src/lib/canvas-blocks.d.ts +4 -3
  5. package/src/lib/canvas-blocks.js +27 -1
  6. package/src/lib/canvas-blocks.js.map +1 -1
  7. package/src/lib/canvas-blocks.mjs +27 -1
  8. package/src/lib/canvas-blocks.mjs.map +1 -1
  9. package/src/lib/canvas-header.js +3 -3
  10. package/src/lib/canvas-header.js.map +1 -1
  11. package/src/lib/canvas-header.mjs +4 -4
  12. package/src/lib/canvas-header.mjs.map +1 -1
  13. package/src/lib/designer.d.mts +55 -2
  14. package/src/lib/designer.d.ts +55 -2
  15. package/src/lib/designer.js +185 -0
  16. package/src/lib/designer.js.map +1 -1
  17. package/src/lib/designer.mjs +188 -3
  18. package/src/lib/designer.mjs.map +1 -1
  19. package/src/lib/head-commands.d.mts +3 -3
  20. package/src/lib/head-commands.d.ts +3 -3
  21. package/src/lib/head-commands.js +6 -0
  22. package/src/lib/head-commands.js.map +1 -1
  23. package/src/lib/head-commands.mjs +7 -1
  24. package/src/lib/head-commands.mjs.map +1 -1
  25. package/src/lib/head-parts.d.mts +6 -1
  26. package/src/lib/head-parts.d.ts +6 -1
  27. package/src/lib/head-parts.js +30 -2
  28. package/src/lib/head-parts.js.map +1 -1
  29. package/src/lib/head-parts.mjs +30 -3
  30. package/src/lib/head-parts.mjs.map +1 -1
  31. package/src/lib/head-properties.d.mts +4 -1
  32. package/src/lib/head-properties.d.ts +4 -1
  33. package/src/lib/head-properties.js +14 -3
  34. package/src/lib/head-properties.js.map +1 -1
  35. package/src/lib/head-properties.mjs +14 -3
  36. package/src/lib/head-properties.mjs.map +1 -1
  37. package/src/lib/header-commands.d.mts +7 -2
  38. package/src/lib/header-commands.d.ts +7 -2
  39. package/src/lib/header-commands.js +11 -5
  40. package/src/lib/header-commands.js.map +1 -1
  41. package/src/lib/header-commands.mjs +9 -4
  42. package/src/lib/header-commands.mjs.map +1 -1
  43. package/src/lib/header-properties.js +3 -3
  44. package/src/lib/header-properties.js.map +1 -1
  45. package/src/lib/header-properties.mjs +4 -4
  46. package/src/lib/header-properties.mjs.map +1 -1
  47. package/src/lib/json-checks.js +10 -0
  48. package/src/lib/json-checks.js.map +1 -1
  49. package/src/lib/json-checks.mjs +10 -0
  50. package/src/lib/json-checks.mjs.map +1 -1
  51. package/src/lib/layout-changes.js +5 -0
  52. package/src/lib/layout-changes.js.map +1 -1
  53. package/src/lib/layout-changes.mjs +5 -0
  54. package/src/lib/layout-changes.mjs.map +1 -1
  55. package/src/lib/layout-ops.d.mts +3 -3
  56. package/src/lib/layout-ops.d.ts +3 -3
  57. package/src/lib/layout-ops.js +16 -5
  58. package/src/lib/layout-ops.js.map +1 -1
  59. package/src/lib/layout-ops.mjs +16 -5
  60. package/src/lib/layout-ops.mjs.map +1 -1
  61. package/src/lib/layout-tree.js +3 -1
  62. package/src/lib/layout-tree.js.map +1 -1
  63. package/src/lib/layout-tree.mjs +3 -1
  64. package/src/lib/layout-tree.mjs.map +1 -1
  65. package/src/lib/list-canvas.js +3 -1
  66. package/src/lib/list-canvas.js.map +1 -1
  67. package/src/lib/list-canvas.mjs +3 -1
  68. package/src/lib/list-canvas.mjs.map +1 -1
  69. package/src/lib/list-cards-settings.d.mts +30 -0
  70. package/src/lib/list-cards-settings.d.ts +30 -0
  71. package/src/lib/list-cards-settings.js +136 -0
  72. package/src/lib/list-cards-settings.js.map +1 -0
  73. package/src/lib/list-cards-settings.mjs +132 -0
  74. package/src/lib/list-cards-settings.mjs.map +1 -0
  75. package/src/lib/list-commands.d.mts +39 -2
  76. package/src/lib/list-commands.d.ts +39 -2
  77. package/src/lib/list-commands.js +133 -0
  78. package/src/lib/list-commands.js.map +1 -1
  79. package/src/lib/list-commands.mjs +134 -2
  80. package/src/lib/list-commands.mjs.map +1 -1
  81. package/src/lib/list-properties.js +80 -9
  82. package/src/lib/list-properties.js.map +1 -1
  83. package/src/lib/list-properties.mjs +80 -9
  84. package/src/lib/list-properties.mjs.map +1 -1
  85. package/src/lib/list-rows-settings.d.mts +31 -0
  86. package/src/lib/list-rows-settings.d.ts +31 -0
  87. package/src/lib/list-rows-settings.js +154 -0
  88. package/src/lib/list-rows-settings.js.map +1 -0
  89. package/src/lib/list-rows-settings.mjs +150 -0
  90. package/src/lib/list-rows-settings.mjs.map +1 -0
  91. package/src/lib/locales/ar/bar.js +1 -0
  92. package/src/lib/locales/ar/bar.js.map +1 -1
  93. package/src/lib/locales/ar/bar.mjs +1 -0
  94. package/src/lib/locales/ar/bar.mjs.map +1 -1
  95. package/src/lib/locales/ar/canvas.js +1 -1
  96. package/src/lib/locales/ar/canvas.js.map +1 -1
  97. package/src/lib/locales/ar/canvas.mjs +1 -1
  98. package/src/lib/locales/ar/canvas.mjs.map +1 -1
  99. package/src/lib/locales/ar/changes.js +5 -0
  100. package/src/lib/locales/ar/changes.js.map +1 -1
  101. package/src/lib/locales/ar/changes.mjs +5 -0
  102. package/src/lib/locales/ar/changes.mjs.map +1 -1
  103. package/src/lib/locales/ar/checks.js +2 -0
  104. package/src/lib/locales/ar/checks.js.map +1 -1
  105. package/src/lib/locales/ar/checks.mjs +2 -0
  106. package/src/lib/locales/ar/checks.mjs.map +1 -1
  107. package/src/lib/locales/ar/head.js +2 -0
  108. package/src/lib/locales/ar/head.js.map +1 -1
  109. package/src/lib/locales/ar/head.mjs +2 -0
  110. package/src/lib/locales/ar/head.mjs.map +1 -1
  111. package/src/lib/locales/ar/index.js +2 -1
  112. package/src/lib/locales/ar/index.js.map +1 -1
  113. package/src/lib/locales/ar/index.mjs +2 -1
  114. package/src/lib/locales/ar/index.mjs.map +1 -1
  115. package/src/lib/locales/ar/list.js +47 -1
  116. package/src/lib/locales/ar/list.js.map +1 -1
  117. package/src/lib/locales/ar/list.mjs +47 -1
  118. package/src/lib/locales/ar/list.mjs.map +1 -1
  119. package/src/lib/locales/ar/outline.js +1 -0
  120. package/src/lib/locales/ar/outline.js.map +1 -1
  121. package/src/lib/locales/ar/outline.mjs +1 -0
  122. package/src/lib/locales/ar/outline.mjs.map +1 -1
  123. package/src/lib/locales/ar/panel.js +46 -2
  124. package/src/lib/locales/ar/panel.js.map +1 -1
  125. package/src/lib/locales/ar/panel.mjs +46 -2
  126. package/src/lib/locales/ar/panel.mjs.map +1 -1
  127. package/src/lib/locales/ar/parts.js +1 -0
  128. package/src/lib/locales/ar/parts.js.map +1 -1
  129. package/src/lib/locales/ar/parts.mjs +1 -0
  130. package/src/lib/locales/ar/parts.mjs.map +1 -1
  131. package/src/lib/locales/ar/refusals.js +5 -0
  132. package/src/lib/locales/ar/refusals.js.map +1 -1
  133. package/src/lib/locales/ar/refusals.mjs +5 -0
  134. package/src/lib/locales/ar/refusals.mjs.map +1 -1
  135. package/src/lib/locales/ar/related-part.d.mts +2 -0
  136. package/src/lib/locales/ar/related-part.d.ts +2 -0
  137. package/src/lib/locales/ar/related-part.js +44 -0
  138. package/src/lib/locales/ar/related-part.js.map +1 -0
  139. package/src/lib/locales/ar/related-part.mjs +41 -0
  140. package/src/lib/locales/ar/related-part.mjs.map +1 -0
  141. package/src/lib/locales/ar/rules-ui.js +2 -0
  142. package/src/lib/locales/ar/rules-ui.js.map +1 -1
  143. package/src/lib/locales/ar/rules-ui.mjs +2 -0
  144. package/src/lib/locales/ar/rules-ui.mjs.map +1 -1
  145. package/src/lib/locales/ar/steps.js +3 -0
  146. package/src/lib/locales/ar/steps.js.map +1 -1
  147. package/src/lib/locales/ar/steps.mjs +3 -0
  148. package/src/lib/locales/ar/steps.mjs.map +1 -1
  149. package/src/lib/locales/en/bar.d.mts +2 -0
  150. package/src/lib/locales/en/bar.d.ts +2 -0
  151. package/src/lib/locales/en/bar.js +2 -0
  152. package/src/lib/locales/en/bar.js.map +1 -1
  153. package/src/lib/locales/en/bar.mjs +2 -0
  154. package/src/lib/locales/en/bar.mjs.map +1 -1
  155. package/src/lib/locales/en/canvas.d.mts +1 -0
  156. package/src/lib/locales/en/canvas.d.ts +1 -0
  157. package/src/lib/locales/en/canvas.js +1 -1
  158. package/src/lib/locales/en/canvas.js.map +1 -1
  159. package/src/lib/locales/en/canvas.mjs +1 -1
  160. package/src/lib/locales/en/canvas.mjs.map +1 -1
  161. package/src/lib/locales/en/changes.d.mts +5 -0
  162. package/src/lib/locales/en/changes.d.ts +5 -0
  163. package/src/lib/locales/en/changes.js +5 -0
  164. package/src/lib/locales/en/changes.js.map +1 -1
  165. package/src/lib/locales/en/changes.mjs +5 -0
  166. package/src/lib/locales/en/changes.mjs.map +1 -1
  167. package/src/lib/locales/en/checks.d.mts +2 -0
  168. package/src/lib/locales/en/checks.d.ts +2 -0
  169. package/src/lib/locales/en/checks.js +2 -0
  170. package/src/lib/locales/en/checks.js.map +1 -1
  171. package/src/lib/locales/en/checks.mjs +2 -0
  172. package/src/lib/locales/en/checks.mjs.map +1 -1
  173. package/src/lib/locales/en/head.d.mts +2 -0
  174. package/src/lib/locales/en/head.d.ts +2 -0
  175. package/src/lib/locales/en/head.js +2 -0
  176. package/src/lib/locales/en/head.js.map +1 -1
  177. package/src/lib/locales/en/head.mjs +2 -0
  178. package/src/lib/locales/en/head.mjs.map +1 -1
  179. package/src/lib/locales/en/index.d.mts +161 -0
  180. package/src/lib/locales/en/index.d.ts +161 -0
  181. package/src/lib/locales/en/index.js +2 -1
  182. package/src/lib/locales/en/index.js.map +1 -1
  183. package/src/lib/locales/en/index.mjs +2 -1
  184. package/src/lib/locales/en/index.mjs.map +1 -1
  185. package/src/lib/locales/en/list.d.mts +51 -0
  186. package/src/lib/locales/en/list.d.ts +51 -0
  187. package/src/lib/locales/en/list.js +49 -1
  188. package/src/lib/locales/en/list.js.map +1 -1
  189. package/src/lib/locales/en/list.mjs +49 -1
  190. package/src/lib/locales/en/list.mjs.map +1 -1
  191. package/src/lib/locales/en/outline.d.mts +1 -0
  192. package/src/lib/locales/en/outline.d.ts +1 -0
  193. package/src/lib/locales/en/outline.js +1 -0
  194. package/src/lib/locales/en/outline.js.map +1 -1
  195. package/src/lib/locales/en/outline.mjs +1 -0
  196. package/src/lib/locales/en/outline.mjs.map +1 -1
  197. package/src/lib/locales/en/panel.d.mts +29 -0
  198. package/src/lib/locales/en/panel.d.ts +29 -0
  199. package/src/lib/locales/en/panel.js +30 -2
  200. package/src/lib/locales/en/panel.js.map +1 -1
  201. package/src/lib/locales/en/panel.mjs +30 -2
  202. package/src/lib/locales/en/panel.mjs.map +1 -1
  203. package/src/lib/locales/en/parts.d.mts +1 -0
  204. package/src/lib/locales/en/parts.d.ts +1 -0
  205. package/src/lib/locales/en/parts.js +1 -0
  206. package/src/lib/locales/en/parts.js.map +1 -1
  207. package/src/lib/locales/en/parts.mjs +1 -0
  208. package/src/lib/locales/en/parts.mjs.map +1 -1
  209. package/src/lib/locales/en/refusals.d.mts +5 -0
  210. package/src/lib/locales/en/refusals.d.ts +5 -0
  211. package/src/lib/locales/en/refusals.js +5 -0
  212. package/src/lib/locales/en/refusals.js.map +1 -1
  213. package/src/lib/locales/en/refusals.mjs +5 -0
  214. package/src/lib/locales/en/refusals.mjs.map +1 -1
  215. package/src/lib/locales/en/related-part.d.mts +63 -0
  216. package/src/lib/locales/en/related-part.d.ts +63 -0
  217. package/src/lib/locales/en/related-part.js +49 -0
  218. package/src/lib/locales/en/related-part.js.map +1 -0
  219. package/src/lib/locales/en/related-part.mjs +46 -0
  220. package/src/lib/locales/en/related-part.mjs.map +1 -0
  221. package/src/lib/locales/en/rules-ui.d.mts +2 -0
  222. package/src/lib/locales/en/rules-ui.d.ts +2 -0
  223. package/src/lib/locales/en/rules-ui.js +2 -0
  224. package/src/lib/locales/en/rules-ui.js.map +1 -1
  225. package/src/lib/locales/en/rules-ui.mjs +2 -0
  226. package/src/lib/locales/en/rules-ui.mjs.map +1 -1
  227. package/src/lib/locales/en/steps.d.mts +3 -0
  228. package/src/lib/locales/en/steps.d.ts +3 -0
  229. package/src/lib/locales/en/steps.js +3 -0
  230. package/src/lib/locales/en/steps.js.map +1 -1
  231. package/src/lib/locales/en/steps.mjs +3 -0
  232. package/src/lib/locales/en/steps.mjs.map +1 -1
  233. package/src/lib/outline-rows.js +1 -0
  234. package/src/lib/outline-rows.js.map +1 -1
  235. package/src/lib/outline-rows.mjs +1 -0
  236. package/src/lib/outline-rows.mjs.map +1 -1
  237. package/src/lib/page-checks.d.mts +9 -0
  238. package/src/lib/page-checks.d.ts +9 -0
  239. package/src/lib/page-checks.js +20 -1
  240. package/src/lib/page-checks.js.map +1 -1
  241. package/src/lib/page-checks.mjs +20 -1
  242. package/src/lib/page-checks.mjs.map +1 -1
  243. package/src/lib/page-tree.d.mts +3 -1
  244. package/src/lib/page-tree.d.ts +3 -1
  245. package/src/lib/page-tree.js +31 -2
  246. package/src/lib/page-tree.js.map +1 -1
  247. package/src/lib/page-tree.mjs +30 -2
  248. package/src/lib/page-tree.mjs.map +1 -1
  249. package/src/lib/panel-block.js +4 -0
  250. package/src/lib/panel-block.js.map +1 -1
  251. package/src/lib/panel-block.mjs +4 -0
  252. package/src/lib/panel-block.mjs.map +1 -1
  253. package/src/lib/panel-field.js +4 -1
  254. package/src/lib/panel-field.js.map +1 -1
  255. package/src/lib/panel-field.mjs +4 -1
  256. package/src/lib/panel-field.mjs.map +1 -1
  257. package/src/lib/panel-group.js +4 -1
  258. package/src/lib/panel-group.js.map +1 -1
  259. package/src/lib/panel-group.mjs +4 -1
  260. package/src/lib/panel-group.mjs.map +1 -1
  261. package/src/lib/panel-page.js +51 -1
  262. package/src/lib/panel-page.js.map +1 -1
  263. package/src/lib/panel-page.mjs +51 -1
  264. package/src/lib/panel-page.mjs.map +1 -1
  265. package/src/lib/panel-parts.js +5 -1
  266. package/src/lib/panel-parts.js.map +1 -1
  267. package/src/lib/panel-parts.mjs +5 -1
  268. package/src/lib/panel-parts.mjs.map +1 -1
  269. package/src/lib/panel-related.d.mts +4 -0
  270. package/src/lib/panel-related.d.ts +4 -0
  271. package/src/lib/panel-related.js +206 -0
  272. package/src/lib/panel-related.js.map +1 -0
  273. package/src/lib/panel-related.mjs +203 -0
  274. package/src/lib/panel-related.mjs.map +1 -0
  275. package/src/lib/panel-screen.js +1 -0
  276. package/src/lib/panel-screen.js.map +1 -1
  277. package/src/lib/panel-screen.mjs +1 -0
  278. package/src/lib/panel-screen.mjs.map +1 -1
  279. package/src/lib/print-setting.d.mts +16 -0
  280. package/src/lib/print-setting.d.ts +16 -0
  281. package/src/lib/print-setting.js +33 -0
  282. package/src/lib/print-setting.js.map +1 -0
  283. package/src/lib/print-setting.mjs +29 -0
  284. package/src/lib/print-setting.mjs.map +1 -0
  285. package/src/lib/publish-ui.js +6 -3
  286. package/src/lib/publish-ui.js.map +1 -1
  287. package/src/lib/publish-ui.mjs +6 -3
  288. package/src/lib/publish-ui.mjs.map +1 -1
  289. package/src/lib/records-settings.d.mts +14 -0
  290. package/src/lib/records-settings.d.ts +14 -0
  291. package/src/lib/records-settings.js +54 -0
  292. package/src/lib/records-settings.js.map +1 -0
  293. package/src/lib/records-settings.mjs +51 -0
  294. package/src/lib/records-settings.mjs.map +1 -0
  295. package/src/lib/screen-editor.js +3 -0
  296. package/src/lib/screen-editor.js.map +1 -1
  297. package/src/lib/screen-editor.mjs +3 -0
  298. package/src/lib/screen-editor.mjs.map +1 -1
  299. package/src/lib/screen-properties.js +5 -1
  300. package/src/lib/screen-properties.js.map +1 -1
  301. package/src/lib/screen-properties.mjs +5 -1
  302. package/src/lib/screen-properties.mjs.map +1 -1
  303. package/src/lib/steps-checks.js +6 -2
  304. package/src/lib/steps-checks.js.map +1 -1
  305. package/src/lib/steps-checks.mjs +6 -2
  306. package/src/lib/steps-checks.mjs.map +1 -1
  307. package/src/lib/steps-editor.js +1 -1
  308. package/src/lib/steps-editor.js.map +1 -1
  309. package/src/lib/steps-editor.mjs +1 -1
  310. package/src/lib/steps-editor.mjs.map +1 -1
  311. package/src/lib/steps-settings.js +3 -0
  312. package/src/lib/steps-settings.js.map +1 -1
  313. package/src/lib/steps-settings.mjs +3 -0
  314. package/src/lib/steps-settings.mjs.map +1 -1
  315. package/src/lib/steps-words.js +5 -1
  316. package/src/lib/steps-words.js.map +1 -1
  317. package/src/lib/steps-words.mjs +5 -1
  318. package/src/lib/steps-words.mjs.map +1 -1
  319. package/src/lib/styles-json.d.mts +1 -1
  320. package/src/lib/styles-json.d.ts +1 -1
  321. package/src/lib/styles-json.js +3 -0
  322. package/src/lib/styles-json.js.map +1 -1
  323. package/src/lib/styles-json.mjs +3 -0
  324. package/src/lib/styles-json.mjs.map +1 -1
  325. package/src/lib/styles-kinds.d.mts +1 -1
  326. package/src/lib/styles-kinds.d.ts +1 -1
  327. package/src/lib/styles-kinds.js +12 -0
  328. package/src/lib/styles-kinds.js.map +1 -1
  329. package/src/lib/styles-kinds.mjs +12 -0
  330. package/src/lib/styles-kinds.mjs.map +1 -1
  331. package/src/lib/styles.d.mts +1 -1
  332. package/src/lib/styles.d.ts +1 -1
  333. package/src/lib/styles.js +1 -0
  334. package/src/lib/styles.js.map +1 -1
  335. package/src/lib/styles.mjs +1 -0
  336. package/src/lib/styles.mjs.map +1 -1
  337. package/src/lib/toolbox.d.mts +3 -0
  338. package/src/lib/toolbox.d.ts +3 -0
  339. package/src/lib/toolbox.js +13 -3
  340. package/src/lib/toolbox.js.map +1 -1
  341. package/src/lib/toolbox.mjs +13 -3
  342. package/src/lib/toolbox.mjs.map +1 -1
  343. package/src/lib/try-drawer.js +7 -1
  344. package/src/lib/try-drawer.js.map +1 -1
  345. package/src/lib/try-drawer.mjs +7 -1
  346. package/src/lib/try-drawer.mjs.map +1 -1
@@ -1,7 +1,7 @@
1
- import { type AnswerRule, type BotCheck, type ColumnCount, type ColumnsByWidth, type Field, type LabelPlace, type OptionsFrom, type PartLookKind, type HelpShown, type InputMode, type JsonValue, type MapFence, type MapLayer, type MapNode, type Page, type PageLook, type SetWhen } from '@fieldia/core';
1
+ import { type AnswerRule, type BotCheck, type ColumnCount, type ColumnsByWidth, type Field, type LabelPlace, type OptionsFrom, type PartLookKind, type HelpShown, type InputMode, type JsonValue, type MapFence, type MapLayer, type MapNode, type LinkedField, type ListCard, type Page, type PageLook, type RelatedNode, type SetWhen } from '@fieldia/core';
2
2
  import { type Condition, type ShownWhile } from './conditions';
3
3
  import { type HeaderCommands } from './header-commands';
4
- import { type ListCommands } from './list-commands';
4
+ import { type ListCommands, type RowRulesPatch } from './list-commands';
5
5
  import { type OptionDetails } from './kind-commands';
6
6
  import { type ChoiceCommands } from './choice-commands';
7
7
  import { type InputCommands } from './input-commands';
@@ -207,6 +207,8 @@ export interface Designer extends HeaderCommands, ListCommands, ChoiceCommands,
207
207
  } | null): boolean;
208
208
  /** The roles a part shows to (Flectra's groups=), `!` before one hiding it from people holding it; null shows it to everyone. */
209
209
  setRoles(id: string, roles: string[] | null): boolean;
210
+ /** Whether a field, a group, a tab or a related list prints with its record; false leaves it off paper (`"print": false`). */
211
+ setPrinted(id: string, printed: boolean): boolean;
210
212
  /** A part shown only while the record is edited, only while it is read, or always: Flectra's oe_edit_only and oe_read_only. */
211
213
  setShownWhile(id: string, mode: ShownWhile): boolean;
212
214
  /**
@@ -233,6 +235,33 @@ export interface Designer extends HeaderCommands, ListCommands, ChoiceCommands,
233
235
  }): boolean;
234
236
  /** A public page's bot check (`botCheck`): a hidden box, the fewest seconds, the slot its captcha is drawn in; null takes it off. A page of responses only. */
235
237
  setBotCheck(check: BotCheck | null): boolean;
238
+ /** What a printout of the page carries (`print`): its header and footer words, the app's logo by its address; empty or null takes one away. */
239
+ setPrint(patch: {
240
+ header?: string | null;
241
+ footer?: string | null;
242
+ logo?: string | null;
243
+ }): boolean;
244
+ /**
245
+ * A record page's possible duplicates (`duplicates`): the fields records like the one typed are found by — `null`
246
+ * or none takes the setting away — and when they are asked for, as typed (`type`, the default: `null`) or only as
247
+ * the record is saved (`save`).
248
+ */
249
+ setDuplicates(patch: {
250
+ fields?: string[] | null;
251
+ on?: 'type' | 'save' | null;
252
+ }): boolean;
253
+ /**
254
+ * What the page's records are called (`records`), so Fieldia's sentences name them: the words for one and for more
255
+ * — both, or neither (`null`, or both empty, takes the setting away) — and for one with its article (`a`, empty takes
256
+ * it away). Each kept as typed, its ends trimmed. Refused with only one of the two words.
257
+ */
258
+ setRecords(records: {
259
+ one: string;
260
+ other: string;
261
+ a?: string;
262
+ } | null): boolean;
263
+ /** A field's label written small inside Fieldia's sentences (`lowerLabels`), the page's own setting; false takes it away. */
264
+ setLowerLabels(on: boolean): boolean;
236
265
  /**
237
266
  * The page's phone numbers (`phone`): read the world over (`on`), or text boxes as typed (`on: false` takes the
238
267
  * setting away); the country a number typed without its + is read in, and whether a number shows abroad's way or at
@@ -386,6 +415,12 @@ export interface Designer extends HeaderCommands, ListCommands, ChoiceCommands,
386
415
  tools?: NonNullable<MapNode['tools']> | null;
387
416
  fences?: MapFence[] | null;
388
417
  }): boolean;
418
+ /**
419
+ * A related list's title, the model of its records and their link to this record, its columns (each a field of
420
+ * theirs, by name, with its definition: a column taken away takes its cells, order and search with it), its rows a
421
+ * page, New, and View all's page and where it opens; `null` takes the rows or View all away.
422
+ */
423
+ updateRelated(id: string, patch: RelatedPatch): boolean;
389
424
  /**
390
425
  * Several parts' widths as one edit: two trading width across the gutter
391
426
  * between them. With `twelfths`, widths are twelfths of their row, and a
@@ -542,3 +577,21 @@ export interface RegionSet {
542
577
  nameKey?: string;
543
578
  numbers?: readonly string[];
544
579
  }
580
+ /** What a related list's panel changes (`updateRelated`). */
581
+ export interface RelatedPatch extends RowRulesPatch {
582
+ title?: string;
583
+ model?: string;
584
+ field?: string;
585
+ /** Its columns, in order: each a field of its records, by name, with its definition. */
586
+ columns?: {
587
+ name: string;
588
+ field: LinkedField;
589
+ }[];
590
+ limit?: number | null;
591
+ create?: boolean;
592
+ /** Where a row's record and New's open: a dialog (the default, not written), or the app's own way. */
593
+ open?: NonNullable<RelatedNode['open']>;
594
+ viewAll?: NonNullable<RelatedNode['viewAll']> | null;
595
+ /** Its records as cards on a phone, as a list's: what a card shows ({} for the columns'); null for none. */
596
+ card?: ListCard | null;
597
+ }
@@ -21,6 +21,7 @@ const ops = require("./layout-ops");
21
21
  const settings = require("./layout-settings");
22
22
  const twelfths = require("./layout-twelfths");
23
23
  const several = require("./layout-several");
24
+ const print_setting_1 = require("./print-setting");
24
25
  const page_tree_1 = require("./page-tree");
25
26
  const layout_tree_1 = require("./layout-tree");
26
27
  const refusal_1 = require("./refusal");
@@ -31,6 +32,7 @@ const head_commands_1 = require("./head-commands");
31
32
  const rules_reads_1 = require("./rules-reads");
32
33
  const steps_commands_1 = require("./steps-commands");
33
34
  const steps_places_1 = require("./steps-places");
35
+ const head_parts_1 = require("./head-parts");
34
36
  const clipboard = require("./clipboard-ops");
35
37
  const moves = require("./outline-moves");
36
38
  const outline_rows_1 = require("./outline-rows");
@@ -288,6 +290,10 @@ function createDesigner(options) {
288
290
  (0, rules_reads_1.keepWhatRulesRead)(page, draft);
289
291
  // steps lane: a tab or step taken away takes the steps that go to it, and its own, with it.
290
292
  (0, steps_places_1.forgetGoneTargets)(draft);
293
+ // A field taken away, or made a kind records are not compared by, is no longer one possible duplicates are found by.
294
+ forgetGoneDuplicates(draft);
295
+ // A related list taken out of a tab takes the tab's count of it with it.
296
+ (0, head_parts_1.forgetGoneCounts)(draft);
291
297
  const checked = checkEdit(page, draft);
292
298
  if (!checked.ok) {
293
299
  // A number setting the format refuses is said in its own words, in the designer's language: never a raw path.
@@ -913,6 +919,17 @@ function createDesigner(options) {
913
919
  delete target.roles;
914
920
  });
915
921
  },
922
+ setPrinted(id, printed) {
923
+ return apply((draft) => {
924
+ const target = (0, print_setting_1.printablePart)(draft, id);
925
+ if (!target)
926
+ throw new refusal_1.Refusal((w) => w.refusals.noElement(id));
927
+ if (printed)
928
+ delete target.print;
929
+ else
930
+ target.print = false;
931
+ });
932
+ },
916
933
  setRule(id, which, condition) {
917
934
  return apply((draft) => {
918
935
  const found = (0, page_tree_1.findNode)(draft, id);
@@ -1001,6 +1018,61 @@ function createDesigner(options) {
1001
1018
  }
1002
1019
  }, `page:${Object.keys(info).join(',')}`);
1003
1020
  },
1021
+ setPrint(patch) {
1022
+ return apply((draft) => {
1023
+ const print = { ...draft.print };
1024
+ for (const key of ['header', 'footer', 'logo']) {
1025
+ if (patch[key] === undefined)
1026
+ continue;
1027
+ const value = patch[key]?.trim() ?? '';
1028
+ if (!value)
1029
+ delete print[key];
1030
+ // An address an image is drawn from: never a script's, nor words.
1031
+ else if (key === 'logo' && !/^(https?:\/\/|data:image\/|\/|\.{0,2}\/?[^:\s]+$)/i.test(value))
1032
+ throw new refusal_1.Refusal((w) => w.refusals.logoAddress);
1033
+ else
1034
+ print[key] = key === 'logo' ? value : patch[key];
1035
+ }
1036
+ if (Object.keys(print).length)
1037
+ draft.print = print;
1038
+ else
1039
+ delete draft.print;
1040
+ }, `print:${Object.keys(patch).join(',')}`);
1041
+ },
1042
+ setRecords(records) {
1043
+ return apply((draft) => {
1044
+ const one = records?.one.trim() ?? '';
1045
+ const other = records?.other.trim() ?? '';
1046
+ // No words: the records unnamed, the labels small alone where asked.
1047
+ if (!one && !other)
1048
+ return void delete draft.records;
1049
+ if (!one || !other)
1050
+ throw new refusal_1.Refusal((w) => w.refusals.recordsBoth);
1051
+ const a = records?.a?.trim();
1052
+ draft.records = { one, other, ...(a ? { a } : {}) };
1053
+ }, 'records');
1054
+ },
1055
+ setLowerLabels(on) {
1056
+ return apply((draft) => {
1057
+ if (on)
1058
+ draft.lowerLabels = true;
1059
+ else
1060
+ delete draft.lowerLabels;
1061
+ }, 'lowerLabels');
1062
+ },
1063
+ setDuplicates(patch) {
1064
+ return apply((draft) => {
1065
+ if (patch.fields !== undefined && !patch.fields?.length)
1066
+ return void delete draft.duplicates;
1067
+ if (draft.data.kind !== 'record' || draft.layout.type === 'list')
1068
+ throw new refusal_1.Refusal((w) => w.refusals.duplicatesForRecords);
1069
+ const fields = patch.fields ?? draft.duplicates?.fields ?? [];
1070
+ if (!fields.length)
1071
+ return;
1072
+ const on = patch.on === undefined ? draft.duplicates?.on : (patch.on ?? undefined);
1073
+ draft.duplicates = { fields: [...new Set(fields)], ...(on === 'save' ? { on } : {}) };
1074
+ }, null);
1075
+ },
1004
1076
  setBotCheck(check) {
1005
1077
  return apply((draft) => {
1006
1078
  if (!check)
@@ -1301,6 +1373,12 @@ function createDesigner(options) {
1301
1373
  if (!draft.fields[name] && model[name])
1302
1374
  draft.fields[name] = model[name];
1303
1375
  }, `map:${id}:${Object.keys(patch).join(',')}`),
1376
+ updateRelated: (id, patch) => apply((draft) => {
1377
+ const node = (0, page_tree_1.findNode)(draft, id)?.node;
1378
+ if (!node || node.type !== 'related')
1379
+ throw new refusal_1.Refusal((w) => w.layout.noPart(id));
1380
+ changeRelated(draft, node, patch);
1381
+ }, `related:${id}:${Object.keys(patch).join(',')}`),
1304
1382
  setWidths: (widths, options) => apply((draft) => settings.setWidths(draft, widths, options?.twelfths)),
1305
1383
  // rules lane
1306
1384
  ...(0, rules_commands_1.rulesCommands)({ apply, getPage: () => page, fromModel }),
@@ -1406,4 +1484,111 @@ createDesigner.open = async (id, store, options = {}) => {
1406
1484
  function statusbarOf(page, id) {
1407
1485
  return id === '#statusbar' && page.layout.type === 'sheet' ? page.layout.statusbar : undefined;
1408
1486
  }
1487
+ /** A related list changed as asked: names that are no field's refused, and what named a column taken away gone with it. */
1488
+ function changeRelated(draft, node, patch) {
1489
+ const named = (name) => {
1490
+ if (!core_2.FIELD_NAME.test(name))
1491
+ throw new refusal_1.Refusal((w) => w.relatedPart.notAName(name));
1492
+ };
1493
+ if (patch.title !== undefined) {
1494
+ if (patch.title.trim())
1495
+ node.title = patch.title;
1496
+ else
1497
+ delete node.title;
1498
+ }
1499
+ if (patch.model !== undefined) {
1500
+ if (!patch.model.trim())
1501
+ throw new refusal_1.Refusal((w) => w.relatedPart.noModel);
1502
+ node.model = patch.model.trim();
1503
+ }
1504
+ if (patch.field !== undefined) {
1505
+ named(patch.field);
1506
+ node.field = patch.field;
1507
+ }
1508
+ if (patch.columns !== undefined) {
1509
+ if (!patch.columns.length)
1510
+ throw new refusal_1.Refusal((w) => w.relatedPart.lastColumn);
1511
+ const names = patch.columns.map((column) => column.name);
1512
+ names.forEach(named);
1513
+ const twice = names.find((name, i) => names.indexOf(name) !== i);
1514
+ if (twice)
1515
+ throw new refusal_1.Refusal((w) => w.relatedPart.columnTwice(twice));
1516
+ // Fields shown in no column stay (the link, an amount's currency); a column taken away goes, and what named it.
1517
+ const fields = Object.fromEntries(Object.entries(node.fields).filter(([name]) => !node.columns.includes(name) || names.includes(name)));
1518
+ for (const column of patch.columns)
1519
+ fields[column.name] = JSON.parse(JSON.stringify(column.field));
1520
+ node.fields = fields;
1521
+ node.columns = names;
1522
+ if (node.cells) {
1523
+ for (const name of Object.keys(node.cells))
1524
+ if (!names.includes(name))
1525
+ delete node.cells[name];
1526
+ if (!Object.keys(node.cells).length)
1527
+ delete node.cells;
1528
+ }
1529
+ if (node.sort) {
1530
+ node.sort = node.sort.filter((order) => Object.prototype.hasOwnProperty.call(fields, order.field));
1531
+ if (!node.sort.length)
1532
+ delete node.sort;
1533
+ }
1534
+ if (node.searchFields) {
1535
+ node.searchFields = node.searchFields.filter((name) => Object.prototype.hasOwnProperty.call(fields, name));
1536
+ if (!node.searchFields.length)
1537
+ delete node.searchFields;
1538
+ }
1539
+ }
1540
+ if (patch.limit === null)
1541
+ delete node.limit;
1542
+ else if (patch.limit !== undefined)
1543
+ node.limit = patch.limit;
1544
+ if (patch.create === true)
1545
+ delete node.create;
1546
+ else if (patch.create === false)
1547
+ node.create = false;
1548
+ if (patch.open === 'app')
1549
+ node.open = 'app';
1550
+ else if (patch.open === 'dialog')
1551
+ delete node.open;
1552
+ if (patch.viewAll === null)
1553
+ delete node.viewAll;
1554
+ else if (patch.viewAll !== undefined)
1555
+ node.viewAll = { page: patch.viewAll.page, ...(patch.viewAll.as && patch.viewAll.as !== 'dialog' ? { as: patch.viewAll.as } : {}) };
1556
+ if (patch.card === null)
1557
+ delete node.card;
1558
+ else if (patch.card !== undefined) {
1559
+ // Its card shows its own records' fields: one that is not theirs is refused, as a column's name is.
1560
+ for (const name of (0, page_tree_1.listCardFields)(patch.card)) {
1561
+ named(name);
1562
+ if (!Object.prototype.hasOwnProperty.call(node.fields, name))
1563
+ throw new refusal_1.Refusal((w) => w.relatedPart.notTheirs(name));
1564
+ }
1565
+ node.card = JSON.parse(JSON.stringify(patch.card));
1566
+ }
1567
+ // Its rows' own rules, as a list's: each condition read on a row's record — its own fields, its id, the person.
1568
+ (0, list_commands_1.setRowRules)(node, patch, draft, { ...draft, fields: node.fields });
1569
+ // A field taken away with its column goes from the card too: its lines, its title, picture and status.
1570
+ if (patch.columns !== undefined && node.card) {
1571
+ const card = node.card;
1572
+ for (const key of ['title', 'subtitle', 'image', 'status'])
1573
+ if (card[key] !== undefined && !Object.prototype.hasOwnProperty.call(node.fields, card[key]))
1574
+ delete card[key];
1575
+ if (card.fields) {
1576
+ const kept = card.fields.filter((line) => (Array.isArray(line) ? line : [line]).every((part) => Object.prototype.hasOwnProperty.call(node.fields, typeof part === 'string' ? part : part.field)));
1577
+ if (kept.length)
1578
+ card.fields = kept;
1579
+ else
1580
+ delete card.fields;
1581
+ }
1582
+ }
1583
+ }
1584
+ /** The fields possible duplicates are found by (`duplicates`) that are still on the page and of a kind to compare: none left, the setting goes. */
1585
+ function forgetGoneDuplicates(page) {
1586
+ if (!page.duplicates)
1587
+ return;
1588
+ const fields = page.duplicates.fields.filter((name) => (0, core_2.comparable)(page.fields[name]));
1589
+ if (!fields.length)
1590
+ delete page.duplicates;
1591
+ else if (fields.length !== page.duplicates.fields.length)
1592
+ page.duplicates = { ...page.duplicates, fields };
1593
+ }
1409
1594
  //# sourceMappingURL=designer.js.map