@elaraai/e3-ui 1.0.86 → 1.0.88

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 (385) hide show
  1. package/dist/src/bind/data-indexed.d.ts +159 -0
  2. package/dist/src/bind/data-indexed.d.ts.map +1 -0
  3. package/dist/src/bind/data-indexed.js +105 -0
  4. package/dist/src/bind/data-indexed.js.map +1 -0
  5. package/dist/src/bind/data.d.ts +5 -3
  6. package/dist/src/bind/data.d.ts.map +1 -1
  7. package/dist/src/bind/data.js +6 -0
  8. package/dist/src/bind/data.js.map +1 -1
  9. package/dist/src/bind/record.d.ts +34 -23
  10. package/dist/src/bind/record.d.ts.map +1 -1
  11. package/dist/src/bind/record.js +46 -19
  12. package/dist/src/bind/record.js.map +1 -1
  13. package/dist/src/calendar/index.d.ts +2923 -0
  14. package/dist/src/calendar/index.d.ts.map +1 -0
  15. package/dist/src/calendar/index.js +135 -0
  16. package/dist/src/calendar/index.js.map +1 -0
  17. package/dist/src/decision/queue.d.ts +3 -3
  18. package/dist/src/decision/queue.d.ts.map +1 -1
  19. package/dist/src/decision/queue.js +2 -2
  20. package/dist/src/decision/queue.js.map +1 -1
  21. package/dist/src/decision/types.d.ts +4 -0
  22. package/dist/src/decision/types.d.ts.map +1 -1
  23. package/dist/src/decision/types.js +4 -0
  24. package/dist/src/decision/types.js.map +1 -1
  25. package/dist/src/flowchart/canvas.d.ts +114 -0
  26. package/dist/src/flowchart/canvas.d.ts.map +1 -0
  27. package/dist/src/flowchart/canvas.js +84 -0
  28. package/dist/src/flowchart/canvas.js.map +1 -0
  29. package/dist/src/flowchart/flowchart.d.ts +79 -0
  30. package/dist/src/flowchart/flowchart.d.ts.map +1 -0
  31. package/dist/src/flowchart/flowchart.js +9 -0
  32. package/dist/src/flowchart/flowchart.js.map +1 -0
  33. package/dist/src/flowchart/index.d.ts +305 -0
  34. package/dist/src/flowchart/index.d.ts.map +1 -0
  35. package/dist/src/flowchart/index.js +267 -0
  36. package/dist/src/flowchart/index.js.map +1 -0
  37. package/dist/src/flowchart/library.d.ts +720 -0
  38. package/dist/src/flowchart/library.d.ts.map +1 -0
  39. package/dist/src/flowchart/library.js +611 -0
  40. package/dist/src/flowchart/library.js.map +1 -0
  41. package/dist/src/flowchart/over.d.ts +234 -0
  42. package/dist/src/flowchart/over.d.ts.map +1 -0
  43. package/dist/src/flowchart/over.js +220 -0
  44. package/dist/src/flowchart/over.js.map +1 -0
  45. package/dist/src/flowchart/patch.d.ts +64 -0
  46. package/dist/src/flowchart/patch.d.ts.map +1 -0
  47. package/dist/src/flowchart/patch.js +67 -0
  48. package/dist/src/flowchart/patch.js.map +1 -0
  49. package/dist/src/flowchart/payload.d.ts +8220 -0
  50. package/dist/src/flowchart/payload.d.ts.map +1 -0
  51. package/dist/src/flowchart/payload.js +521 -0
  52. package/dist/src/flowchart/payload.js.map +1 -0
  53. package/dist/src/flowchart/types.d.ts +393 -0
  54. package/dist/src/flowchart/types.d.ts.map +1 -0
  55. package/dist/src/flowchart/types.js +216 -0
  56. package/dist/src/flowchart/types.js.map +1 -0
  57. package/dist/src/flowchart/values.d.ts +267 -0
  58. package/dist/src/flowchart/values.d.ts.map +1 -0
  59. package/dist/src/flowchart/values.js +216 -0
  60. package/dist/src/flowchart/values.js.map +1 -0
  61. package/dist/src/flowchart/window.d.ts +521 -0
  62. package/dist/src/flowchart/window.d.ts.map +1 -0
  63. package/dist/src/flowchart/window.js +69 -0
  64. package/dist/src/flowchart/window.js.map +1 -0
  65. package/dist/src/index.d.ts +25 -1
  66. package/dist/src/index.d.ts.map +1 -1
  67. package/dist/src/index.js +48 -1
  68. package/dist/src/index.js.map +1 -1
  69. package/dist/src/internal.d.ts +35 -3
  70. package/dist/src/internal.d.ts.map +1 -1
  71. package/dist/src/internal.js +72 -3
  72. package/dist/src/internal.js.map +1 -1
  73. package/dist/src/plan/assemble.d.ts +2224 -0
  74. package/dist/src/plan/assemble.d.ts.map +1 -0
  75. package/dist/src/plan/assemble.js +210 -0
  76. package/dist/src/plan/assemble.js.map +1 -0
  77. package/dist/src/plan/builders.d.ts +790 -0
  78. package/dist/src/plan/builders.d.ts.map +1 -0
  79. package/dist/src/plan/builders.js +749 -0
  80. package/dist/src/plan/builders.js.map +1 -0
  81. package/dist/src/plan/event-rows.d.ts +2565 -0
  82. package/dist/src/plan/event-rows.d.ts.map +1 -0
  83. package/dist/src/plan/event-rows.js +689 -0
  84. package/dist/src/plan/event-rows.js.map +1 -0
  85. package/dist/src/plan/factories.d.ts +458 -0
  86. package/dist/src/plan/factories.d.ts.map +1 -0
  87. package/dist/src/plan/factories.js +484 -0
  88. package/dist/src/plan/factories.js.map +1 -0
  89. package/dist/src/plan/index.d.ts +672 -0
  90. package/dist/src/plan/index.d.ts.map +1 -0
  91. package/dist/src/plan/index.js +532 -0
  92. package/dist/src/plan/index.js.map +1 -0
  93. package/dist/src/plan/ir.d.ts +2594 -0
  94. package/dist/src/plan/ir.d.ts.map +1 -0
  95. package/dist/src/plan/ir.js +78 -0
  96. package/dist/src/plan/ir.js.map +1 -0
  97. package/dist/src/plan/library.d.ts +772 -0
  98. package/dist/src/plan/library.d.ts.map +1 -0
  99. package/dist/src/plan/library.js +424 -0
  100. package/dist/src/plan/library.js.map +1 -0
  101. package/dist/src/plan/ordered-source.d.ts +27 -0
  102. package/dist/src/plan/ordered-source.d.ts.map +1 -0
  103. package/dist/src/plan/ordered-source.js +48 -0
  104. package/dist/src/plan/ordered-source.js.map +1 -0
  105. package/dist/src/plan/over.d.ts +247 -0
  106. package/dist/src/plan/over.d.ts.map +1 -0
  107. package/dist/src/plan/over.js +266 -0
  108. package/dist/src/plan/over.js.map +1 -0
  109. package/dist/src/plan/pick.d.ts +78 -0
  110. package/dist/src/plan/pick.d.ts.map +1 -0
  111. package/dist/src/plan/pick.js +146 -0
  112. package/dist/src/plan/pick.js.map +1 -0
  113. package/dist/src/plan/plan.d.ts +11611 -0
  114. package/dist/src/plan/plan.d.ts.map +1 -0
  115. package/dist/src/plan/plan.js +428 -0
  116. package/dist/src/plan/plan.js.map +1 -0
  117. package/dist/src/plan/refs.d.ts +218 -0
  118. package/dist/src/plan/refs.d.ts.map +1 -0
  119. package/dist/src/plan/refs.js +226 -0
  120. package/dist/src/plan/refs.js.map +1 -0
  121. package/dist/src/plan/root.d.ts +290 -0
  122. package/dist/src/plan/root.d.ts.map +1 -0
  123. package/dist/src/plan/root.js +463 -0
  124. package/dist/src/plan/root.js.map +1 -0
  125. package/dist/src/plan/series.d.ts +13554 -0
  126. package/dist/src/plan/series.d.ts.map +1 -0
  127. package/dist/src/plan/series.js +1921 -0
  128. package/dist/src/plan/series.js.map +1 -0
  129. package/dist/src/plan/types.d.ts +12400 -0
  130. package/dist/src/plan/types.d.ts.map +1 -0
  131. package/dist/src/plan/types.js +1335 -0
  132. package/dist/src/plan/types.js.map +1 -0
  133. package/dist/src/roster/coverage.d.ts +240 -0
  134. package/dist/src/roster/coverage.d.ts.map +1 -0
  135. package/dist/src/roster/coverage.js +109 -0
  136. package/dist/src/roster/coverage.js.map +1 -0
  137. package/dist/src/roster/index.d.ts +4028 -0
  138. package/dist/src/roster/index.d.ts.map +1 -0
  139. package/dist/src/roster/index.js +115 -0
  140. package/dist/src/roster/index.js.map +1 -0
  141. package/dist/src/roster/library.d.ts +106 -0
  142. package/dist/src/roster/library.d.ts.map +1 -0
  143. package/dist/src/roster/library.js +78 -0
  144. package/dist/src/roster/library.js.map +1 -0
  145. package/dist/src/roster/people.d.ts +50 -0
  146. package/dist/src/roster/people.d.ts.map +1 -0
  147. package/dist/src/roster/people.js +32 -0
  148. package/dist/src/roster/people.js.map +1 -0
  149. package/dist/src/roster/rules.d.ts +275 -0
  150. package/dist/src/roster/rules.d.ts.map +1 -0
  151. package/dist/src/roster/rules.js +162 -0
  152. package/dist/src/roster/rules.js.map +1 -0
  153. package/dist/src/roster/types.d.ts +672 -0
  154. package/dist/src/roster/types.d.ts.map +1 -0
  155. package/dist/src/roster/types.js +248 -0
  156. package/dist/src/roster/types.js.map +1 -0
  157. package/dist/src/roster/visibility.d.ts +66 -0
  158. package/dist/src/roster/visibility.d.ts.map +1 -0
  159. package/dist/src/roster/visibility.js +25 -0
  160. package/dist/src/roster/visibility.js.map +1 -0
  161. package/dist/src/schedule/days.d.ts +54 -0
  162. package/dist/src/schedule/days.d.ts.map +1 -0
  163. package/dist/src/schedule/days.js +68 -0
  164. package/dist/src/schedule/days.js.map +1 -0
  165. package/dist/src/schedule/events.d.ts +433 -0
  166. package/dist/src/schedule/events.d.ts.map +1 -0
  167. package/dist/src/schedule/events.js +851 -0
  168. package/dist/src/schedule/events.js.map +1 -0
  169. package/dist/src/schedule/index.d.ts +150 -0
  170. package/dist/src/schedule/index.d.ts.map +1 -0
  171. package/dist/src/schedule/index.js +132 -0
  172. package/dist/src/schedule/index.js.map +1 -0
  173. package/dist/src/schedule/library.d.ts +70 -0
  174. package/dist/src/schedule/library.d.ts.map +1 -0
  175. package/dist/src/schedule/library.js +102 -0
  176. package/dist/src/schedule/library.js.map +1 -0
  177. package/dist/src/schedule/patch.d.ts +74 -0
  178. package/dist/src/schedule/patch.d.ts.map +1 -0
  179. package/dist/src/schedule/patch.js +68 -0
  180. package/dist/src/schedule/patch.js.map +1 -0
  181. package/dist/src/schedule/record-window.d.ts +189 -0
  182. package/dist/src/schedule/record-window.d.ts.map +1 -0
  183. package/dist/src/schedule/record-window.js +95 -0
  184. package/dist/src/schedule/record-window.js.map +1 -0
  185. package/dist/src/schedule/resources.d.ts +165 -0
  186. package/dist/src/schedule/resources.d.ts.map +1 -0
  187. package/dist/src/schedule/resources.js +234 -0
  188. package/dist/src/schedule/resources.js.map +1 -0
  189. package/dist/src/schedule/templates.d.ts +47 -0
  190. package/dist/src/schedule/templates.d.ts.map +1 -0
  191. package/dist/src/schedule/templates.js +61 -0
  192. package/dist/src/schedule/templates.js.map +1 -0
  193. package/dist/src/schedule/types.d.ts +1677 -0
  194. package/dist/src/schedule/types.d.ts.map +1 -0
  195. package/dist/src/schedule/types.js +374 -0
  196. package/dist/src/schedule/types.js.map +1 -0
  197. package/dist/src/schedule/window.d.ts +154 -0
  198. package/dist/src/schedule/window.d.ts.map +1 -0
  199. package/dist/src/schedule/window.js +363 -0
  200. package/dist/src/schedule/window.js.map +1 -0
  201. package/dist/src/sheet/bridge.d.ts +385 -0
  202. package/dist/src/sheet/bridge.d.ts.map +1 -0
  203. package/dist/src/sheet/bridge.js +809 -0
  204. package/dist/src/sheet/bridge.js.map +1 -0
  205. package/dist/src/sheet/columns.d.ts +410 -0
  206. package/dist/src/sheet/columns.d.ts.map +1 -0
  207. package/dist/src/sheet/columns.js +99 -0
  208. package/dist/src/sheet/columns.js.map +1 -0
  209. package/dist/src/sheet/context-bridge.d.ts +48 -0
  210. package/dist/src/sheet/context-bridge.d.ts.map +1 -0
  211. package/dist/src/sheet/context-bridge.js +216 -0
  212. package/dist/src/sheet/context-bridge.js.map +1 -0
  213. package/dist/src/sheet/draft-bridge.d.ts +37 -0
  214. package/dist/src/sheet/draft-bridge.d.ts.map +1 -0
  215. package/dist/src/sheet/draft-bridge.js +153 -0
  216. package/dist/src/sheet/draft-bridge.js.map +1 -0
  217. package/dist/src/sheet/drafts.d.ts +14 -0
  218. package/dist/src/sheet/drafts.d.ts.map +1 -0
  219. package/dist/src/sheet/drafts.js +14 -0
  220. package/dist/src/sheet/drafts.js.map +1 -0
  221. package/dist/src/sheet/editing-bridge.d.ts +40 -0
  222. package/dist/src/sheet/editing-bridge.d.ts.map +1 -0
  223. package/dist/src/sheet/editing-bridge.js +231 -0
  224. package/dist/src/sheet/editing-bridge.js.map +1 -0
  225. package/dist/src/sheet/editing-types.d.ts +268 -0
  226. package/dist/src/sheet/editing-types.d.ts.map +1 -0
  227. package/dist/src/sheet/editing-types.js +34 -0
  228. package/dist/src/sheet/editing-types.js.map +1 -0
  229. package/dist/src/sheet/edits.d.ts +37 -0
  230. package/dist/src/sheet/edits.d.ts.map +1 -0
  231. package/dist/src/sheet/edits.js +31 -0
  232. package/dist/src/sheet/edits.js.map +1 -0
  233. package/dist/src/sheet/fields.d.ts +693 -0
  234. package/dist/src/sheet/fields.d.ts.map +1 -0
  235. package/dist/src/sheet/fields.js +280 -0
  236. package/dist/src/sheet/fields.js.map +1 -0
  237. package/dist/src/sheet/group.d.ts +165 -0
  238. package/dist/src/sheet/group.d.ts.map +1 -0
  239. package/dist/src/sheet/group.js +52 -0
  240. package/dist/src/sheet/group.js.map +1 -0
  241. package/dist/src/sheet/index.d.ts +542 -0
  242. package/dist/src/sheet/index.d.ts.map +1 -0
  243. package/dist/src/sheet/index.js +387 -0
  244. package/dist/src/sheet/index.js.map +1 -0
  245. package/dist/src/sheet/library.d.ts +284 -0
  246. package/dist/src/sheet/library.d.ts.map +1 -0
  247. package/dist/src/sheet/library.js +259 -0
  248. package/dist/src/sheet/library.js.map +1 -0
  249. package/dist/src/sheet/link.d.ts +398 -0
  250. package/dist/src/sheet/link.d.ts.map +1 -0
  251. package/dist/src/sheet/link.js +228 -0
  252. package/dist/src/sheet/link.js.map +1 -0
  253. package/dist/src/sheet/record.d.ts +75 -0
  254. package/dist/src/sheet/record.d.ts.map +1 -0
  255. package/dist/src/sheet/record.js +128 -0
  256. package/dist/src/sheet/record.js.map +1 -0
  257. package/dist/src/sheet/registers.d.ts +681 -0
  258. package/dist/src/sheet/registers.d.ts.map +1 -0
  259. package/dist/src/sheet/registers.js +671 -0
  260. package/dist/src/sheet/registers.js.map +1 -0
  261. package/dist/src/sheet/root.d.ts +329 -0
  262. package/dist/src/sheet/root.d.ts.map +1 -0
  263. package/dist/src/sheet/root.js +511 -0
  264. package/dist/src/sheet/root.js.map +1 -0
  265. package/dist/src/sheet/seed-bridge.d.ts +14 -0
  266. package/dist/src/sheet/seed-bridge.d.ts.map +1 -0
  267. package/dist/src/sheet/seed-bridge.js +51 -0
  268. package/dist/src/sheet/seed-bridge.js.map +1 -0
  269. package/dist/src/sheet/sheet.d.ts +11819 -0
  270. package/dist/src/sheet/sheet.d.ts.map +1 -0
  271. package/dist/src/sheet/sheet.js +236 -0
  272. package/dist/src/sheet/sheet.js.map +1 -0
  273. package/dist/src/sheet/sub-rows.d.ts +299 -0
  274. package/dist/src/sheet/sub-rows.d.ts.map +1 -0
  275. package/dist/src/sheet/sub-rows.js +272 -0
  276. package/dist/src/sheet/sub-rows.js.map +1 -0
  277. package/dist/src/sheet/templates.d.ts +161 -0
  278. package/dist/src/sheet/templates.d.ts.map +1 -0
  279. package/dist/src/sheet/templates.js +122 -0
  280. package/dist/src/sheet/templates.js.map +1 -0
  281. package/dist/src/sheet/transactions.d.ts +76 -0
  282. package/dist/src/sheet/transactions.d.ts.map +1 -0
  283. package/dist/src/sheet/transactions.js +40 -0
  284. package/dist/src/sheet/transactions.js.map +1 -0
  285. package/dist/src/sheet/types.d.ts +15226 -0
  286. package/dist/src/sheet/types.d.ts.map +1 -0
  287. package/dist/src/sheet/types.js +1070 -0
  288. package/dist/src/sheet/types.js.map +1 -0
  289. package/dist/src/sheet/views.d.ts +29 -0
  290. package/dist/src/sheet/views.d.ts.map +1 -0
  291. package/dist/src/sheet/views.js +43 -0
  292. package/dist/src/sheet/views.js.map +1 -0
  293. package/dist/src/studio/component.d.ts.map +1 -1
  294. package/dist/src/studio/component.js +11 -8
  295. package/dist/src/studio/component.js.map +1 -1
  296. package/dist/src/utils/derive.d.ts +134 -8
  297. package/dist/src/utils/derive.d.ts.map +1 -1
  298. package/dist/src/utils/derive.js +409 -7
  299. package/dist/src/utils/derive.js.map +1 -1
  300. package/dist/src/utils/ordered-source.d.ts +38 -0
  301. package/dist/src/utils/ordered-source.d.ts.map +1 -0
  302. package/dist/src/utils/ordered-source.js +45 -0
  303. package/dist/src/utils/ordered-source.js.map +1 -0
  304. package/dist/src/utils/row-inspector.d.ts +36 -0
  305. package/dist/src/utils/row-inspector.d.ts.map +1 -0
  306. package/dist/src/utils/row-inspector.js +49 -0
  307. package/dist/src/utils/row-inspector.js.map +1 -0
  308. package/dist/test/bind/data/data.examples.d.ts +21 -19
  309. package/dist/test/bind/data/data.examples.d.ts.map +1 -1
  310. package/dist/test/bind/data/data.examples.js +122 -122
  311. package/dist/test/bind/data/data.examples.js.map +1 -1
  312. package/dist/test/bind/record/record.examples.d.ts.map +1 -1
  313. package/dist/test/bind/record/record.examples.js +9 -9
  314. package/dist/test/bind/record/record.examples.js.map +1 -1
  315. package/dist/test/calendar/calendar-records.examples.d.ts +228 -0
  316. package/dist/test/calendar/calendar-records.examples.d.ts.map +1 -0
  317. package/dist/test/calendar/calendar-records.examples.js +91 -0
  318. package/dist/test/calendar/calendar-records.examples.js.map +1 -0
  319. package/dist/test/calendar/calendar.examples.d.ts +776 -0
  320. package/dist/test/calendar/calendar.examples.d.ts.map +1 -0
  321. package/dist/test/calendar/calendar.examples.js +336 -0
  322. package/dist/test/calendar/calendar.examples.js.map +1 -0
  323. package/dist/test/decision/journal.examples.d.ts +28 -28
  324. package/dist/test/decision/journal.examples.d.ts.map +1 -1
  325. package/dist/test/decision/journal.examples.js +4 -4
  326. package/dist/test/decision/journal.examples.js.map +1 -1
  327. package/dist/test/decision/queue.examples.d.ts.map +1 -1
  328. package/dist/test/decision/queue.examples.js +5 -7
  329. package/dist/test/decision/queue.examples.js.map +1 -1
  330. package/dist/test/flowchart/flowchart.examples.d.ts +3713 -0
  331. package/dist/test/flowchart/flowchart.examples.d.ts.map +1 -0
  332. package/dist/test/flowchart/flowchart.examples.js +465 -0
  333. package/dist/test/flowchart/flowchart.examples.js.map +1 -0
  334. package/dist/test/plan/plan-events.examples.d.ts +3666 -0
  335. package/dist/test/plan/plan-events.examples.d.ts.map +1 -0
  336. package/dist/test/plan/plan-events.examples.js +773 -0
  337. package/dist/test/plan/plan-events.examples.js.map +1 -0
  338. package/dist/test/plan/plan-records.examples.d.ts +3 -0
  339. package/dist/test/plan/plan-records.examples.d.ts.map +1 -0
  340. package/dist/test/plan/plan-records.examples.js +45 -0
  341. package/dist/test/plan/plan-records.examples.js.map +1 -0
  342. package/dist/test/plan/plan-windows.examples.d.ts +588 -0
  343. package/dist/test/plan/plan-windows.examples.d.ts.map +1 -0
  344. package/dist/test/plan/plan-windows.examples.js +170 -0
  345. package/dist/test/plan/plan-windows.examples.js.map +1 -0
  346. package/dist/test/plan/plan.examples.d.ts +8095 -0
  347. package/dist/test/plan/plan.examples.d.ts.map +1 -0
  348. package/dist/test/plan/plan.examples.js +2500 -0
  349. package/dist/test/plan/plan.examples.js.map +1 -0
  350. package/dist/test/roster/domain.examples.d.ts +367 -0
  351. package/dist/test/roster/domain.examples.d.ts.map +1 -0
  352. package/dist/test/roster/domain.examples.js +72 -0
  353. package/dist/test/roster/domain.examples.js.map +1 -0
  354. package/dist/test/roster/roster-records.examples.d.ts +729 -0
  355. package/dist/test/roster/roster-records.examples.d.ts.map +1 -0
  356. package/dist/test/roster/roster-records.examples.js +86 -0
  357. package/dist/test/roster/roster-records.examples.js.map +1 -0
  358. package/dist/test/roster/roster.examples.d.ts +750 -0
  359. package/dist/test/roster/roster.examples.d.ts.map +1 -0
  360. package/dist/test/roster/roster.examples.js +198 -0
  361. package/dist/test/roster/roster.examples.js.map +1 -0
  362. package/dist/test/roster/warehouse.d.ts +87 -0
  363. package/dist/test/roster/warehouse.d.ts.map +1 -0
  364. package/dist/test/roster/warehouse.js +883 -0
  365. package/dist/test/roster/warehouse.js.map +1 -0
  366. package/dist/test/sheet/sheet-link.examples.d.ts +7 -0
  367. package/dist/test/sheet/sheet-link.examples.d.ts.map +1 -0
  368. package/dist/test/sheet/sheet-link.examples.js +41 -0
  369. package/dist/test/sheet/sheet-link.examples.js.map +1 -0
  370. package/dist/test/sheet/sheet-records.examples.d.ts +421 -0
  371. package/dist/test/sheet/sheet-records.examples.d.ts.map +1 -0
  372. package/dist/test/sheet/sheet-records.examples.js +79 -0
  373. package/dist/test/sheet/sheet-records.examples.js.map +1 -0
  374. package/dist/test/sheet/sheet-transactions.examples.d.ts +7 -0
  375. package/dist/test/sheet/sheet-transactions.examples.d.ts.map +1 -0
  376. package/dist/test/sheet/sheet-transactions.examples.js +58 -0
  377. package/dist/test/sheet/sheet-transactions.examples.js.map +1 -0
  378. package/dist/test/sheet/sheet.examples.d.ts +5562 -0
  379. package/dist/test/sheet/sheet.examples.d.ts.map +1 -0
  380. package/dist/test/sheet/sheet.examples.js +1178 -0
  381. package/dist/test/sheet/sheet.examples.js.map +1 -0
  382. package/dist/test/studio/studio.examples.d.ts.map +1 -1
  383. package/dist/test/studio/studio.examples.js +11 -11
  384. package/dist/test/studio/studio.examples.js.map +1 -1
  385. package/package.json +12 -9
@@ -0,0 +1,681 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * `Sheet.register` and `Sheet.driver` — registers are the grammar's
7
+ * vocabulary, projected from the host's rows through accessors reified once
8
+ * (Plan's `derive` move, `Sheet Spec.md` §3.3). There is no attribute bag:
9
+ * a value another declaration needs is read off a TYPED row by an accessor.
10
+ *
11
+ * @packageDocumentation
12
+ */
13
+ import { type EastType, type ExprType, type SubtypeExprOrValue, ArrayType, DictType, FunctionType, OptionType, StringType, StructType } from "@elaraai/east";
14
+ import { StatusValueType } from "@elaraai/east-ui";
15
+ import { SheetRegisterMemberType } from "./types.js";
16
+ /** A built register — its members, as an expression. What `Sheet.register.*` returns and `registers={…}` takes. */
17
+ export type SheetRegisterValue = ExprType<ArrayType<SheetRegisterMemberType>>;
18
+ /**
19
+ * The accessors `Sheet.register.members` reifies over one data ENTRY — its
20
+ * value and its key (`(_v, k) => k` is the normal spelling over a `Dict`;
21
+ * over an `Array` the key is the index, printed).
22
+ *
23
+ * @typeParam T - The data's element type
24
+ * @property kind - The member kind (`"machine"`, `"bay"`, `"family"`)
25
+ * @property key - What the grammar resolves — accessor
26
+ * @property label - What a chip prints — accessor
27
+ * @property aliases - Alternative spellings — accessor returning the field's array
28
+ * @property meta - Chip meta — accessor returning the field's `Option`
29
+ * @property parent - The parent key — accessor returning the field's `Option`
30
+ * @property tone - An `enum` member's valence — accessor returning the field's `Option`
31
+ */
32
+ export interface SheetMembersConfig<T extends EastType> {
33
+ /** The member kind. */
34
+ kind: string;
35
+ /** What the grammar resolves. */
36
+ key: (value: ExprType<T>, key: ExprType<StringType>) => SubtypeExprOrValue<StringType>;
37
+ /** What a chip prints. */
38
+ label: (value: ExprType<T>, key: ExprType<StringType>) => SubtypeExprOrValue<StringType>;
39
+ /** Alternative spellings the grammar also resolves. */
40
+ aliases?: (value: ExprType<T>, key: ExprType<StringType>) => SubtypeExprOrValue<ArrayType<StringType>>;
41
+ /** Chip meta — return the field's `Option`. */
42
+ meta?: (value: ExprType<T>, key: ExprType<StringType>) => SubtypeExprOrValue<OptionType<StringType>>;
43
+ /** The parent key — return the field's `Option`. */
44
+ parent?: (value: ExprType<T>, key: ExprType<StringType>) => SubtypeExprOrValue<OptionType<StringType>>;
45
+ /** The valence dot — return the field's `Option`. */
46
+ tone?: (value: ExprType<T>, key: ExprType<StringType>) => SubtypeExprOrValue<OptionType<StatusValueType>>;
47
+ }
48
+ /**
49
+ * Projects the host's rows into register members — `Sheet.register.members`.
50
+ *
51
+ * @remarks
52
+ * The accessors are reified ONCE into a describe function which the map
53
+ * then CALLS (`shared/reify.ts`, `EAST_UI_PROP_PATTERNS.md`). Duplicate keys
54
+ * fold, first occurrence wins — a countable-by-attribute kind (`"CNC router"`
55
+ * from every machine of that family) declares one member per distinct value.
56
+ *
57
+ * @typeParam T - The data's element type
58
+ * @param data - The rows — an `Array<T>` or a `Dict<String, T>` value or expression
59
+ * @param config - The accessors ({@link SheetMembersConfig})
60
+ * @returns The members, as an expression
61
+ *
62
+ * @example
63
+ * ```tsx
64
+ * // .tsx file with the `@jsxImportSource @elaraai/e3-ui` pragma
65
+ * import { ArrayType, DateTimeType, East, FloatType, IntegerType, OptionType, StringType, StructType, none, some, variant } from "@elaraai/east";
66
+ * import { Box, Format, Reactive, Slice, State, UIComponentType } from "@elaraai/east-ui";
67
+ * import { Data, Sheet } from "@elaraai/e3-ui";
68
+ * import e3 from "@elaraai/e3";
69
+ *
70
+ * export const StressJob = StructType({
71
+ * id: StringType, start: OptionType(DateTimeType), activity: StringType, notes: StringType,
72
+ * stations: Sheet.Types.Link, status: StringType, qty: OptionType(FloatType),
73
+ * });
74
+ * export const sheetStressJobCount = e3.input("sheet_stress_job_count", IntegerType, variant("value", 2000n));
75
+ * export const generateStressJobs = East.function([IntegerType], ArrayType(StressJob), ($, count) => {
76
+ * const activities = $.const(["Routing", "Spraying", "Wrapping", "Set-up", "Maintenance"], ArrayType(StringType));
77
+ * const words = $.const(["PLANNED", "RELEASED", "COMPLETE"], ArrayType(StringType));
78
+ * const codes = $.const(["R2140", "R2141", "R2145", "P3210", "A7301"], ArrayType(StringType));
79
+ * const first = $.const(new Date("2026-01-05T00:00:00Z"), DateTimeType);
80
+ * const noMembers = $.const([], ArrayType(Sheet.Types.Member));
81
+ * const blank = $.const(none, OptionType(FloatType));
82
+ * return East.Array.generate(count, StressJob, (_$, i) => ({
83
+ * id: East.str`S${i}`,
84
+ * start: some(first.addDays(i.divide(4n))),
85
+ * activity: activities.get(i.remainder(5n)),
86
+ * notes: i.remainder(7n).equal(0n).ifElse((_$2) => "urgent — inspect before delivery", (_$2) => East.str`batch ${i.add(100n)}`),
87
+ * // Routing runs name a count of routers; the rest a machine by code.
88
+ * stations: i.remainder(5n).equal(0n).ifElse(
89
+ * (_$2) => East.value({ from: noMembers, to: [variant("counted", { n: i.remainder(3n).add(2n), key: "CNC router" })] }, Sheet.Types.Link),
90
+ * (_$2) => East.value({ from: noMembers, to: [variant("identified", { key: codes.get(i.remainder(5n)) })] }, Sheet.Types.Link)),
91
+ * status: words.get(i.remainder(3n)),
92
+ * qty: i.remainder(11n).equal(0n).ifElse((_$2) => blank, (_$2) => East.value(some(i.multiply(7n).toFloat().add(50.0)), OptionType(FloatType))),
93
+ * }));
94
+ * });
95
+ * export const sheetStressJobs = e3.task("sheet_stress_jobs", [sheetStressJobCount], generateStressJobs);
96
+ *
97
+ * const sheet = East.function([], UIComponentType, (_$) => (
98
+ * <Reactive>{$ => {
99
+ * const MachineType = StructType({ code: StringType, family: StringType });
100
+ * // Two thousand jobs an e3 task generates — made where data is made.
101
+ * const jobs = $.let(Data.bind(sheetStressJobs));
102
+ * const count = $.let(jobs.read().length());
103
+ * const machines = $.const([
104
+ * { code: "R2140", family: "CNC router" }, { code: "R2141", family: "CNC router" }, { code: "R2145", family: "CNC router" },
105
+ * { code: "P3210", family: "4-side planer" }, { code: "A7301", family: "assembly bench" },
106
+ * ], ArrayType(MachineType));
107
+ * // The work centres are searched through their display form — `3 x CNC router`, `A7301` — not their `.east` text.
108
+ * const slice = $.let(Slice.bind("sheet_stress_slice", jobs.read(), {
109
+ * fields: {
110
+ * activity: { label: "Activity", hints: ["Routing", "Spraying", "Wrapping", "Set-up", "Maintenance"] },
111
+ * notes: { label: "Notes" },
112
+ * stations: { label: "Work centres", text: r => Sheet.link.print(r.stations) },
113
+ * status: { label: "Status" },
114
+ * },
115
+ * search: ["activity", "notes", "stations"],
116
+ * }));
117
+ * const views = $.let(State.bind([ArrayType(Sheet.Types.View)], "sheet_stress_views", [
118
+ * { id: "spraying", name: "SPRAYING", narrowing: Slice.state({ search: some("spraying") }), context: 1n, reveals: [], folds: new Map() },
119
+ * { id: "routers", name: "ROUTERS", narrowing: Slice.state({ search: some("router") }), context: 0n, reveals: [], folds: new Map() },
120
+ * { id: "urgent", name: "URGENT", narrowing: Slice.state({ search: some("urgent") }), context: 0n, reveals: [], folds: new Map() },
121
+ * ]));
122
+ * return (
123
+ * <Box height="480px">
124
+ * <Sheet
125
+ * data={jobs}
126
+ * id="id"
127
+ * name="stress"
128
+ * registers={{
129
+ * stations: Sheet.register.concat([
130
+ * Sheet.register.members(machines, { kind: "machine", key: m => m.code, label: m => m.code, meta: m => some(m.family) }),
131
+ * Sheet.register.members(machines, { kind: "family", key: m => m.family, label: m => m.family, meta: _m => some("family") }),
132
+ * ]),
133
+ * }}
134
+ * columns={{
135
+ * start: Sheet.column.date(StressJob, { header: "Start", width: "96px" }),
136
+ * activity: Sheet.column.text(StressJob, { header: "Activity", width: "160px" }),
137
+ * notes: Sheet.column.text(StressJob, { header: "Notes", sub: "free text", width: "240px" }),
138
+ * stations: Sheet.column.set(StressJob, "stations", { header: "Work centres", sub: "3 x router · machine", width: "220px",
139
+ * members: [{ kind: "machine", identified: true }, { kind: "family", countable: true, resolvesTo: "machine" }] }),
140
+ * status: Sheet.column.text(StressJob, { header: "Status", width: "120px" }),
141
+ * qty: Sheet.column.quantity(StressJob, { header: "Qty", width: "112px", format: Format.Number({ maximumFractionDigits: 0n }) }),
142
+ * }}
143
+ * slice={slice} affordances={["search", "filter"]}
144
+ * views={views} activeView={some("spraying")}
145
+ * readOnly
146
+ * footer={[{ text: East.str`${count} rows · virtualised` }]}
147
+ * />
148
+ * </Box>
149
+ * );
150
+ * }}</Reactive>
151
+ * ));
152
+ * ```
153
+ */
154
+ export declare function createMembers<T extends EastType>(data: SubtypeExprOrValue<ArrayType<T>> | SubtypeExprOrValue<DictType<StringType, T>>, config: SheetMembersConfig<T>): SheetRegisterValue;
155
+ /**
156
+ * Joins member sets of different kinds into one register — `Sheet.register.concat`.
157
+ *
158
+ * @param parts - The member sets, in order
159
+ * @returns The concatenated members
160
+ */
161
+ export declare function concatMembers(parts: SheetRegisterValue[]): SheetRegisterValue;
162
+ /**
163
+ * The accessors `Sheet.driver` reifies over one driver row.
164
+ *
165
+ * @typeParam D - The driver's row type
166
+ */
167
+ export interface SheetDriverConfig<D extends StructType> {
168
+ /** The member key — what the driver column's cell stores. */
169
+ key: (row: ExprType<D>) => SubtypeExprOrValue<StringType>;
170
+ /** What a chip / candidate prints. */
171
+ label: (row: ExprType<D>) => SubtypeExprOrValue<StringType>;
172
+ /** Alternative spellings. */
173
+ aliases?: (row: ExprType<D>) => SubtypeExprOrValue<ArrayType<StringType>>;
174
+ /** Chip meta — return the field's `Option`. */
175
+ meta?: (row: ExprType<D>) => SubtypeExprOrValue<OptionType<StringType>>;
176
+ }
177
+ /**
178
+ * The driver declaration — the column, its data, the row type `D` every
179
+ * driver-reading accessor is typed by, and the reified key lookup.
180
+ *
181
+ * @remarks
182
+ * The typed parts (`rowType`, `data`, `keyFn`) never reach the IR: the root
183
+ * applies a column's `uom` / `sides` accessors over `data` and the bridge
184
+ * folds `data` into the `ctx.driver` lookup. Only `column` and `members`
185
+ * ride ({@link SheetDriverType}).
186
+ *
187
+ */
188
+ export interface SheetDriverValue {
189
+ /** The driver column's key — must be a `lookup` column on a `String` field. */
190
+ readonly column: string;
191
+ /** The driver's row type (erased here; the builders that read the driver's row take it explicitly). */
192
+ readonly rowType: StructType;
193
+ /** The driver rows. */
194
+ readonly data: ExprType<ArrayType<StructType>>;
195
+ /** The reified key accessor. */
196
+ readonly keyFn: ExprType<FunctionType<[StructType], StringType>>;
197
+ /** The driver's register members. */
198
+ readonly members: SheetRegisterValue;
199
+ }
200
+ /**
201
+ * Declares the driver — `Sheet.driver(column, data, { key, label })`: the
202
+ * `lookup` column whose member decides what the row does, with its data,
203
+ * so `D` reaches every `uom` / `sides` accessor and `ctx.driver` (§3.3).
204
+ *
205
+ * @typeParam D - The driver's row type (inferred from `data`)
206
+ * @param column - The driver column's key
207
+ * @param data - The driver rows — an `Array<D>` value or expression
208
+ * @param config - The accessors ({@link SheetDriverConfig})
209
+ * @returns The driver declaration the `driver` prop takes
210
+ *
211
+ * @example
212
+ * ```tsx
213
+ * // .tsx file with the `@jsxImportSource @elaraai/e3-ui` pragma
214
+ * import { ArrayType, DateTimeType, DictType, East, FloatType, IntegerType, OptionType, StringType, StructType, none, some, variant } from "@elaraai/east";
215
+ * import { Box, Format, Reactive, Slice, State, StatusValueType, UIComponentType } from "@elaraai/east-ui";
216
+ * import { Data, Record, Sheet } from "@elaraai/e3-ui";
217
+ * import e3 from "@elaraai/e3";
218
+ *
219
+ * export const WorkshopActivity = StructType({
220
+ * name: StringType, uom: StringType, days: IntegerType, rate: FloatType, family: StringType, sides: Sheet.Types.Sides,
221
+ * });
222
+ * export const WorkshopMachine = StructType({ family: StringType, bay: StringType });
223
+ * export const WorkshopStatus = StructType({ word: StringType, tone: StatusValueType });
224
+ * export const WorkshopOperation = StructType({
225
+ * activity: StringType, // the driver: an activity's name
226
+ * start: OptionType(DateTimeType),
227
+ * end: OptionType(DateTimeType),
228
+ * qty: OptionType(FloatType), // in the activity's unit
229
+ * machines: Sheet.Types.Link, // work centres, from → to
230
+ * notes: StringType,
231
+ * created_by: StringType, // no column: the inspector shows it
232
+ * });
233
+ * export const WorkshopOrder = StructType({
234
+ * name: StringType,
235
+ * customer: StringType,
236
+ * due: OptionType(DateTimeType),
237
+ * status: StringType, // a word of the statuses register
238
+ * ops: ArrayType(WorkshopOperation),
239
+ * });
240
+ * export const sheetWorkshopActivities = e3.input("sheet_workshop_activities", ArrayType(WorkshopActivity), variant("value", [
241
+ * { name: "Panel cutting", uom: "panels", days: 1n, rate: 12.0, family: "beam saw", sides: variant("both", null) },
242
+ * { name: "Edge banding", uom: "metres", days: 1n, rate: 60.0, family: "edge bander", sides: variant("both", null) },
243
+ * { name: "CNC routing", uom: "panels", days: 2n, rate: 6.0, family: "CNC router", sides: variant("both", null) },
244
+ * { name: "Drilling", uom: "panels", days: 1n, rate: 10.0, family: "CNC router", sides: variant("both", null) },
245
+ * { name: "Sanding", uom: "panels", days: 1n, rate: 20.0, family: "", sides: variant("in", null) },
246
+ * { name: "Assembly", uom: "units", days: 2n, rate: 2.0, family: "assembly bench", sides: variant("both", null) },
247
+ * { name: "Spray finish", uom: "doors", days: 3n, rate: 8.0, family: "spray booth", sides: variant("both", null) },
248
+ * { name: "Wrapping", uom: "units", days: 1n, rate: 10.0, family: "", sides: variant("in", null) },
249
+ * { name: "Delivery", uom: "loads", days: 1n, rate: 1.0, family: "", sides: variant("from", null) },
250
+ * ]));
251
+ * export const sheetWorkshopMachines = e3.record("sheet_workshop_machines", DictType(StringType, WorkshopMachine), new Map([
252
+ * ["S101", { family: "beam saw", bay: "Bay 1" }],
253
+ * ["S102", { family: "beam saw", bay: "Bay 1" }],
254
+ * ["S103", { family: "beam saw", bay: "Bay 1" }],
255
+ * ["E201", { family: "edge bander", bay: "Bay 2" }],
256
+ * ["E202", { family: "edge bander", bay: "Bay 2" }],
257
+ * ["R301", { family: "CNC router", bay: "Bay 3" }],
258
+ * ["R302", { family: "CNC router", bay: "Bay 3" }],
259
+ * ["R303", { family: "CNC router", bay: "Bay 3" }],
260
+ * ["F401", { family: "spray booth", bay: "Bay 4" }],
261
+ * ["F402", { family: "spray booth", bay: "Bay 4" }],
262
+ * ["A701", { family: "assembly bench", bay: "Bay 7" }],
263
+ * ["A702", { family: "assembly bench", bay: "Bay 7" }],
264
+ * ]));
265
+ * export const sheetWorkshopOrders = e3.record("sheet_workshop_orders", DictType(StringType, WorkshopOrder), new Map([
266
+ * ["WO-2201", { name: "WO-2201 · Kitchen, oak", customer: "Quillfeather Interiors", due: some(new Date("2026-10-23T00:00:00Z")), status: "RELEASED", ops: [
267
+ * { activity: "Panel cutting", start: some(new Date("2026-10-12T00:00:00Z")), end: some(new Date("2026-10-13T00:00:00Z")), qty: some(48.0),
268
+ * machines: { from: [variant("identified", { key: "S101" })], to: [variant("identified", { key: "E201" })] }, notes: "Oak veneered board", created_by: "planner" },
269
+ * { activity: "Edge banding", start: some(new Date("2026-10-14T00:00:00Z")), end: some(new Date("2026-10-15T00:00:00Z")), qty: some(120.0),
270
+ * machines: { from: [variant("identified", { key: "E201" })], to: [variant("identified", { key: "R301" })] }, notes: "", created_by: "planner" },
271
+ * { activity: "CNC routing", start: some(new Date("2026-10-15T00:00:00Z")), end: some(new Date("2026-10-17T00:00:00Z")), qty: some(48.0),
272
+ * machines: { from: [variant("identified", { key: "R301" })], to: [variant("identified", { key: "A701" })] }, notes: "Hinge cups and handle slots", created_by: "planner" },
273
+ * { activity: "Assembly", start: none, end: none, qty: some(12.0),
274
+ * machines: { from: [], to: [variant("identified", { key: "A701" })] }, notes: "Twelve carcasses", created_by: "planner" },
275
+ * { activity: "Spray finish", start: none, end: none, qty: some(24.0),
276
+ * machines: { from: [], to: [variant("identified", { key: "F401" })] }, notes: "Matt lacquer", created_by: "planner" },
277
+ * ] }],
278
+ * ["WO-2202", { name: "WO-2202 · Wardrobes, ash", customer: "Marrowby Lettings", due: some(new Date("2026-10-30T00:00:00Z")), status: "PLANNED", ops: [
279
+ * { activity: "Panel cutting", start: some(new Date("2026-10-13T00:00:00Z")), end: some(new Date("2026-10-14T00:00:00Z")), qty: some(36.0),
280
+ * machines: { from: [variant("identified", { key: "S102" })], to: [variant("identified", { key: "E202" })] }, notes: "", created_by: "planner" },
281
+ * { activity: "Edge banding", start: none, end: none, qty: some(90.0),
282
+ * machines: { from: [variant("identified", { key: "E202" })], to: [] }, notes: "", created_by: "planner" },
283
+ * { activity: "Drilling", start: none, end: none, qty: some(36.0),
284
+ * machines: { from: [], to: [variant("identified", { key: "R302" })] }, notes: "Hinge and shelf pins", created_by: "planner" },
285
+ * { activity: "Assembly", start: none, end: none, qty: some(6.0),
286
+ * machines: { from: [], to: [variant("identified", { key: "A702" })] }, notes: "", created_by: "planner" },
287
+ * ] }],
288
+ * ["WO-2203", { name: "WO-2203 · Vanity unit, walnut", customer: "Tallowmere Homes", due: some(new Date("2026-11-02T00:00:00Z")), status: "PLANNED", ops: [
289
+ * { activity: "Panel cutting", start: none, end: none, qty: some(12.0),
290
+ * machines: { from: [], to: [variant("identified", { key: "S101" })] }, notes: "", created_by: "planner" },
291
+ * { activity: "CNC routing", start: none, end: none, qty: some(12.0),
292
+ * machines: { from: [], to: [variant("counted", { n: 1n, key: "CNC router" })] }, notes: "Basin cut-out", created_by: "planner" },
293
+ * { activity: "Spray finish", start: none, end: none, qty: some(4.0),
294
+ * machines: { from: [], to: [variant("identified", { key: "F402" })] }, notes: "", created_by: "planner" },
295
+ * { activity: "Assembly", start: none, end: none, qty: some(2.0),
296
+ * machines: { from: [], to: [] }, notes: "", created_by: "planner" },
297
+ * ] }],
298
+ * ["WO-2204", { name: "WO-2204 · Shelving, birch", customer: "Pebblecombe School", due: some(new Date("2026-10-20T00:00:00Z")), status: "ON HOLD", ops: [
299
+ * { activity: "Panel cutting", start: none, end: none, qty: some(60.0),
300
+ * machines: { from: [], to: [variant("counted", { n: 2n, key: "beam saw" })] }, notes: "Awaiting board delivery", created_by: "planner" },
301
+ * { activity: "Edge banding", start: none, end: none, qty: some(150.0),
302
+ * machines: { from: [], to: [] }, notes: "", created_by: "planner" },
303
+ * { activity: "Sanding", start: none, end: none, qty: some(60.0),
304
+ * machines: { from: [], to: [] }, notes: "", created_by: "planner" },
305
+ * ] }],
306
+ * ["WO-2205", { name: "WO-2205 · Office fit-out, maple", customer: "", due: none, status: "PLANNED", ops: [
307
+ * { activity: "Panel cutting", start: none, end: none, qty: some(80.0),
308
+ * machines: { from: [], to: [] }, notes: "", created_by: "planner" },
309
+ * { activity: "CNC routing", start: none, end: none, qty: some(40.0),
310
+ * machines: { from: [], to: [] }, notes: "Cable ports", created_by: "planner" },
311
+ * { activity: "Assembly", start: none, end: none, qty: some(10.0),
312
+ * machines: { from: [], to: [] }, notes: "", created_by: "planner" },
313
+ * { activity: "Wrapping", start: none, end: none, qty: some(10.0),
314
+ * machines: { from: [], to: [] }, notes: "", created_by: "planner" },
315
+ * { activity: "Delivery", start: none, end: none, qty: some(2.0),
316
+ * machines: { from: [], to: [] }, notes: "", created_by: "planner" },
317
+ * ] }],
318
+ * ["WO-2206", { name: "WO-2206 · Kitchen, painted", customer: "Orrisdale Cottages", due: some(new Date("2026-11-06T00:00:00Z")), status: "PLANNED", ops: [
319
+ * { activity: "Panel cutting", start: none, end: none, qty: some(30.0),
320
+ * machines: { from: [], to: [variant("identified", { key: "S103" })] }, notes: "", created_by: "planner" },
321
+ * { activity: "Edge banding", start: none, end: none, qty: some(70.0),
322
+ * machines: { from: [], to: [variant("counted", { n: 1n, key: "edge bander" })] }, notes: "", created_by: "planner" },
323
+ * { activity: "Spray finish", start: none, end: none, qty: some(18.0),
324
+ * machines: { from: [], to: [variant("identified", { key: "F401" })] }, notes: "Primer, then two coats", created_by: "planner" },
325
+ * { activity: "Assembly", start: none, end: none, qty: some(8.0),
326
+ * machines: { from: [], to: [] }, notes: "", created_by: "planner" },
327
+ * { activity: "Wrapping", start: none, end: none, qty: some(8.0),
328
+ * machines: { from: [], to: [] }, notes: "", created_by: "planner" },
329
+ * { activity: "Delivery", start: none, end: none, qty: some(1.0),
330
+ * machines: { from: [], to: [] }, notes: "", created_by: "planner" },
331
+ * ] }],
332
+ * ]));
333
+ * export const sheetWorkshopOrdersPatch = e3.mutation.patch(sheetWorkshopOrders);
334
+ * const workshopRecommend = East.asyncPlatform(
335
+ * "sheet_workshop_recommend",
336
+ * [Sheet.Types.DraftContext(WorkshopOrder, "ops", WorkshopActivity)],
337
+ * ArrayType(Sheet.Types.Proposal(WorkshopOperation)),
338
+ * { optional: true },
339
+ * );
340
+ *
341
+ * const sheet = East.function([], UIComponentType, (_$) => (
342
+ * <Reactive>{$ => {
343
+ * const orders = $.let(Record.bind(sheetWorkshopOrders, [sheetWorkshopOrdersPatch]));
344
+ * const machines = $.let(Record.bind(sheetWorkshopMachines, []));
345
+ * const activities = $.let(Data.bind(sheetWorkshopActivities));
346
+ * const views = $.let(State.bind([ArrayType(Sheet.Types.View)], "sheet.workshop.views", []));
347
+ * const statuses = $.let([
348
+ * { word: "PLANNED", tone: variant("neutral", null) },
349
+ * { word: "RELEASED", tone: variant("info", null) },
350
+ * { word: "ON HOLD", tone: variant("warning", null) },
351
+ * ], ArrayType(WorkshopStatus));
352
+ * const BayType = StructType({ name: StringType, aliases: ArrayType(StringType) });
353
+ * const bays = $.let([
354
+ * { name: "Bay 1", aliases: ["b1", "saw bay"] },
355
+ * { name: "Bay 2", aliases: ["b2", "banding bay"] },
356
+ * { name: "Bay 3", aliases: ["b3", "router bay"] },
357
+ * { name: "Bay 4", aliases: ["b4", "spray bay"] },
358
+ * { name: "Bay 7", aliases: ["b7", "assembly bay"] },
359
+ * ], ArrayType(BayType));
360
+ * // Every operation of every order: what the slice searches and filters — the work centres by their display text.
361
+ * const operations = $.let(orders.read().toArray((_$, o) => o.ops).flatMap((_$, ops) => ops));
362
+ * const slice = $.let(Slice.bind("sheet_workshop", operations, {
363
+ * fields: {
364
+ * activity: { label: "Activity", hints: ["Panel cutting", "Edge banding", "CNC routing", "Drilling", "Sanding", "Assembly", "Spray finish", "Wrapping", "Delivery"] },
365
+ * notes: { label: "Notes" },
366
+ * machines: { label: "Work centres", text: o => Sheet.link.print(o.machines) },
367
+ * },
368
+ * search: ["activity", "notes", "machines"],
369
+ * }));
370
+ * const Ctx = Sheet.Types.DraftContext(WorkshopOrder, "ops", WorkshopActivity);
371
+ * const DateFill = OptionType(Sheet.Types.Fill(DateTimeType));
372
+ * const FloatFill = OptionType(Sheet.Types.Fill(FloatType));
373
+ * const TextFill = OptionType(Sheet.Types.Fill(StringType));
374
+ * const LinkFill = OptionType(Sheet.Types.Fill(Sheet.Types.Link));
375
+ * const Counted = OptionType(Sheet.Types.Counted);
376
+ * const Proposals = ArrayType(Sheet.Types.Proposal(WorkshopOperation));
377
+ * // derive — End = start + the activity's days.
378
+ * const endFromStart = $.const(East.function([Ctx], DateFill, ($, ctx) => {
379
+ * const noFill = $.const(none, DateFill);
380
+ * return ctx.row.start.match({
381
+ * value: (_$, supplied) => supplied.match({
382
+ * none: () => noFill,
383
+ * some: (_$, start) => ctx.driver.match({
384
+ * none: () => noFill,
385
+ * some: (_$, a) => some({ value: start.addDays(a.days), meta: East.str`+${a.days}d · ${a.name}` }),
386
+ * }),
387
+ * }),
388
+ * }, () => noFill);
389
+ * }));
390
+ * // sequence — the day after the last dated line above; else next Monday.
391
+ * const nextSlot = $.const(East.function([Ctx], DateFill, ($, ctx) => {
392
+ * const dated = $.let(ctx.rows.slice(0n, ctx.rowIndex).filter((_$, r) => r.start.hasTag("value").and(() => r.start.unwrap("value").hasTag("some"))));
393
+ * return dated.length().greater(0n).ifElse(
394
+ * ($2) => {
395
+ * const last = $2.let(dated.get(dated.length().subtract(1n)));
396
+ * return East.value(some({ value: last.start.unwrap("value").unwrap("some").addDays(1n), meta: "the day after the line above" }), DateFill);
397
+ * },
398
+ * ($2) => {
399
+ * const daysToMonday = $2.let(East.value(8n, IntegerType).subtract(ctx.today.getDayOfWeek()).remainder(7n));
400
+ * const monday = $2.let(ctx.today.addDays(daysToMonday.equal(0n).ifElse((_$) => 7n, (_$) => daysToMonday)));
401
+ * return East.value(some({ value: monday, meta: "next Monday" }), DateFill);
402
+ * });
403
+ * }));
404
+ * // history — the quantity of the last like operation in the order.
405
+ * const lastQuantity = $.const(East.function([Ctx], FloatFill, ($, ctx) => {
406
+ * const noFill = $.const(none, FloatFill);
407
+ * return ctx.row.activity.match({
408
+ * value: ($, activity) => {
409
+ * const similar = $.let(ctx.rows.slice(0n, ctx.rowIndex).filter((_$, r) =>
410
+ * r.activity.hasTag("value").and(() => r.activity.unwrap("value").equal(activity))
411
+ * .and(() => r.qty.hasTag("value")).and(() => r.qty.unwrap("value").hasTag("some"))));
412
+ * return similar.size().equal(0n).ifElse(() => noFill, ($) => {
413
+ * const row = $.let(similar.get(similar.size().subtract(1n)));
414
+ * return some({ value: row.qty.unwrap("value").unwrap("some"), meta: "the last like operation's quantity" });
415
+ * });
416
+ * },
417
+ * }, () => noFill);
418
+ * }));
419
+ * // default — a shift's worth at the activity's rate.
420
+ * const shiftQuantity = $.const(East.function([Ctx], FloatFill, ($, ctx) => {
421
+ * const noFill = $.const(none, FloatFill);
422
+ * return ctx.driver.match({
423
+ * none: (_$) => noFill,
424
+ * some: (_$, a) => East.value(some({ value: a.rate.multiply(8.0), meta: East.str`${a.rate}/h × 8 h` }), FloatFill),
425
+ * });
426
+ * }));
427
+ * // phrase — the notes, from the supplied quantity and the activity's unit.
428
+ * const phrase = $.const(East.function([Ctx], TextFill, ($, ctx) => {
429
+ * const noFill = $.const(none, TextFill);
430
+ * return ctx.row.qty.hasTag("value").and(() => ctx.row.qty.unwrap("value").hasTag("some")).ifElse(($) => {
431
+ * const qty = $.const(ctx.row.qty.unwrap("value").unwrap("some"));
432
+ * return ctx.driver.match({
433
+ * none: (_$) => noFill,
434
+ * some: (_$, a) => East.value(some({ value: East.str`${qty} ${a.uom} · ${a.name}`, meta: "phrasing from the supplied activity and quantity" }), TextFill),
435
+ * });
436
+ * }, () => noFill);
437
+ * }));
438
+ * // The arity rule — one machine of the activity's family for every sixty units.
439
+ * const impliedMachines = $.const(East.function([Ctx], Counted, ($, ctx) => {
440
+ * const noCount = $.const(none, Counted);
441
+ * $.if(ctx.row.qty.hasTag("value").not(), ($) => { $.return(noCount); });
442
+ * const supplied = $.const(ctx.row.qty.unwrap("value"));
443
+ * $.if(supplied.hasTag("some").not(), ($) => { $.return(noCount); });
444
+ * const qty = $.const(supplied.unwrap("some"));
445
+ * // ⌈qty ÷ 60⌉ by hand — `toInteger` refuses a fraction.
446
+ * const share = $.let(qty.divide(60.0));
447
+ * const frac = $.let(share.remainder(1.0));
448
+ * const needed = $.let(frac.equal(0.0).ifElse((_$) => share, (_$) => share.subtract(frac).add(1.0)).toInteger());
449
+ * return ctx.driver.match({
450
+ * none: (_$) => noCount,
451
+ * some: (_$, a) => a.family.equal("").or(() => qty.greater(0.0).not()).ifElse(
452
+ * (_$2) => noCount,
453
+ * (_$2) => East.value(some({ n: needed, key: a.family }), Counted)),
454
+ * });
455
+ * }));
456
+ * // capacity — the machines the quantity implies, counted.
457
+ * const capacity = $.const(East.function([Ctx], LinkFill, ($, ctx) => {
458
+ * const noFill = $.const(none, LinkFill);
459
+ * const noMembers = $.const([], ArrayType(Sheet.Types.Member));
460
+ * const implied = $.const(impliedMachines);
461
+ * return implied(ctx).match({
462
+ * none: (_$) => noFill,
463
+ * some: (_$, c) => East.value(some({ value: { from: [variant("counted", { n: c.n, key: c.key })], to: noMembers }, meta: "capacity · from the quantity" }), LinkFill),
464
+ * });
465
+ * }));
466
+ * // history — the work centres of the last like operation in the order.
467
+ * const lastMachines = $.const(East.function([Ctx], LinkFill, ($, ctx) => {
468
+ * const noFill = $.const(none, LinkFill);
469
+ * return ctx.row.activity.match({
470
+ * value: ($, activity) => {
471
+ * const similar = $.let(ctx.rows.slice(0n, ctx.rowIndex).filter((_$, r) =>
472
+ * r.activity.hasTag("value").and(() => r.activity.unwrap("value").equal(activity)).and(() => r.machines.hasTag("value"))));
473
+ * return similar.size().equal(0n).ifElse(() => noFill, ($) => {
474
+ * const link = $.let(similar.get(similar.size().subtract(1n)).machines.unwrap("value"));
475
+ * return link.from.size().add(link.to.size()).equal(0n).ifElse(
476
+ * () => noFill, () => some({ value: link, meta: "the work centres of the last like operation" }));
477
+ * });
478
+ * },
479
+ * }, () => noFill);
480
+ * }));
481
+ * // A member check — a machine on the From half runs the operation, so it is of the activity's family.
482
+ * const familyOf = $.let(activities.read().toDict((_$, a) => a.name, (_$, a) => a.family));
483
+ * const machineDict = $.let(machines.read());
484
+ * const familyFits = $.const(East.function([Sheet.Types.CheckContext(WorkshopOrder, "ops")], OptionType(StringType), ($, c) => {
485
+ * const noFlag = $.const(none, OptionType(StringType));
486
+ * return c.half.match({
487
+ * to: (_$) => noFlag,
488
+ * from: (_$) => c.member.match({
489
+ * identified: (_$2, m) => c.row.activity.match({
490
+ * value: (_$3, activity) => familyOf.has(activity)
491
+ * .and(() => familyOf.get(activity).equal("").not())
492
+ * .and(() => machineDict.has(m.key))
493
+ * .and(() => machineDict.get(m.key).family.equal(familyOf.get(activity)).not())
494
+ * .ifElse(
495
+ * (_$4) => East.value(some(East.str`${m.key} is a ${machineDict.get(m.key).family}, not a ${familyOf.get(activity)}`), OptionType(StringType)),
496
+ * (_$4) => noFlag),
497
+ * }, (_$3) => noFlag),
498
+ * }, (_$2) => noFlag),
499
+ * });
500
+ * }));
501
+ * // A pattern — panels cut are banded, then routed.
502
+ * const followUps = $.const(East.function([Ctx], Proposals, ($, ctx) => {
503
+ * const empty = $.const([], Proposals);
504
+ * return ctx.row.activity.hasTag("value")
505
+ * .and(() => ctx.row.activity.unwrap("value").equal("Panel cutting"))
506
+ * .and(() => ctx.row.end.hasTag("value"))
507
+ * .and(() => ctx.row.end.unwrap("value").hasTag("some")).ifElse(($) => {
508
+ * const end = $.const(ctx.row.end.unwrap("value").unwrap("some"));
509
+ * return $.const([
510
+ * { patch: Sheet.patch(WorkshopOperation, { activity: "Edge banding", start: some(end), end: some(end.addDays(1n)), notes: "Band the cut panels" }), meta: "edge banding after the cut" },
511
+ * { patch: Sheet.patch(WorkshopOperation, { activity: "CNC routing", start: some(end.addDays(1n)), end: some(end.addDays(3n)), notes: "Route the banded panels" }), meta: "routing · end +1…+3 d" },
512
+ * ], Proposals);
513
+ * }, () => empty);
514
+ * }));
515
+ * // Learned from the order — what followed this activity in it, after how long.
516
+ * const lastFollower = $.const(East.function([Ctx], Proposals, ($, ctx) => {
517
+ * const empty = $.const([], Proposals);
518
+ * return ctx.row.activity.hasTag("value")
519
+ * .and(() => ctx.row.start.hasTag("value"))
520
+ * .and(() => ctx.row.start.unwrap("value").hasTag("some")).ifElse(($) => {
521
+ * const activity = $.const(ctx.row.activity.unwrap("value"));
522
+ * const start = $.const(ctx.row.start.unwrap("value").unwrap("some"));
523
+ * const dated = $.const(ctx.rows.filter((_$, r) => r.start.hasTag("value")
524
+ * .and(() => r.start.unwrap("value").hasTag("some"))
525
+ * .and(() => r.activity.hasTag("value"))));
526
+ * const upper = $.const(dated.size().greater(1n).ifElse(() => dated.size().subtract(1n), () => 0n));
527
+ * const pairs = $.const(East.Array.range(0n, upper).filter((_$, i) =>
528
+ * dated.get(i).activity.unwrap("value").equal(activity)
529
+ * .and(() => dated.get(i.add(1n)).activity.unwrap("value").equal(activity).not())));
530
+ * return pairs.size().equal(0n).ifElse(() => empty, ($) => {
531
+ * const index = $.const(pairs.get(pairs.size().subtract(1n)));
532
+ * const from = $.const(dated.get(index));
533
+ * const next = $.const(dated.get(index.add(1n)));
534
+ * const gap = $.const(next.start.unwrap("value").unwrap("some").toEpochMilliseconds()
535
+ * .subtract(from.start.unwrap("value").unwrap("some").toEpochMilliseconds()));
536
+ * return $.const([{ patch: Sheet.patch(WorkshopOperation, { activity: next.activity.unwrap("value"), start: some(start.addMilliseconds(gap)) }),
537
+ * meta: "follower learned from the order" }], Proposals);
538
+ * });
539
+ * }, () => empty);
540
+ * }));
541
+ * // A model — an ASYNC proposer; the strip shows a pending chip, and a newer context cancels the wait.
542
+ * const modelProposals = $.const(East.asyncFunction([Ctx], Proposals, ($, ctx) => {
543
+ * const result = $.let([], Proposals);
544
+ * $.try(($) => { $.assign(result, workshopRecommend(ctx)); }).catch(($, message) => {
545
+ * // The showcase has no model behind it; any other failure still reaches the sheet's provider diagnostic.
546
+ * $.if(message.notEqual("Platform function 'sheet_workshop_recommend' is not available"), ($) => { $.error(message); });
547
+ * });
548
+ * return result;
549
+ * }));
550
+ * // The operations each kind of order starts with: the group templates' lines.
551
+ * const kitchen = $.let([
552
+ * { activity: "Panel cutting", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
553
+ * { activity: "Edge banding", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
554
+ * { activity: "Assembly", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
555
+ * { activity: "Spray finish", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
556
+ * ], ArrayType(WorkshopOperation));
557
+ * const wardrobe = $.let([
558
+ * { activity: "Panel cutting", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
559
+ * { activity: "Edge banding", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
560
+ * { activity: "Drilling", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
561
+ * { activity: "Assembly", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
562
+ * ], ArrayType(WorkshopOperation));
563
+ * const vanity = $.let([
564
+ * { activity: "Panel cutting", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
565
+ * { activity: "CNC routing", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
566
+ * { activity: "Spray finish", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
567
+ * { activity: "Assembly", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
568
+ * ], ArrayType(WorkshopOperation));
569
+ * // A new operation's and a new order's defaults, and the check every order passes before Save.
570
+ * const newRow = $.const(East.function([Sheet.Types.NewRow], Sheet.Types.Patch(WorkshopOperation), () =>
571
+ * Sheet.patch(WorkshopOperation, { start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "planner" })));
572
+ * const newGroup = $.const(East.function([Sheet.Types.NewGroup], Sheet.Types.Patch(WorkshopOrder), () =>
573
+ * Sheet.patch(WorkshopOrder, { status: "PLANNED", due: none, ops: [] })));
574
+ * const readyOrder = $.const(East.function([Sheet.Types.DraftGroup(WorkshopOrder, "ops")], Sheet.Types.Readiness, ($, order) => {
575
+ * $.if(order.customer.hasTag("value").and(() => order.customer.unwrap("value").length().equal(0n)), $ => {
576
+ * $.return(East.value(variant("incomplete", [{ field: "customer", message: "Name the customer" }]), Sheet.Types.Readiness));
577
+ * });
578
+ * return East.value(variant("ready", null), Sheet.Types.Readiness);
579
+ * }));
580
+ * return (
581
+ * <Box height="760px">
582
+ * <Sheet
583
+ * record={orders}
584
+ * group={Sheet.group(WorkshopOrder, "ops", {
585
+ * title: "name", sub: o => o.customer, noun: { singular: "order", plural: "orders" },
586
+ * cells: { activity: Sheet.group.cell.enum(WorkshopOrder, "statuses", "status"),
587
+ * end: Sheet.group.cell.date(WorkshopOrder, "due") },
588
+ * })}
589
+ * driver={Sheet.driver("activity", activities.read(), { key: a => a.name, label: a => a.name, meta: a => some(a.uom) })}
590
+ * registers={{
591
+ * machines: Sheet.register.concat([
592
+ * // A Dict's key rides as the accessors' second argument.
593
+ * Sheet.register.members(machines.read(), { kind: "machine", key: (_m, code) => code, label: (_m, code) => code,
594
+ * meta: m => some(m.family), parent: m => some(m.bay) }),
595
+ * Sheet.register.members(bays, { kind: "bay", key: b => b.name, label: b => b.name, aliases: b => b.aliases,
596
+ * meta: _b => some("bay") }),
597
+ * // Every machine names a family — duplicate keys fold, the first wins.
598
+ * Sheet.register.members(machines.read(), { kind: "family", key: m => m.family, label: m => m.family,
599
+ * meta: _m => some("family") }),
600
+ * ]),
601
+ * statuses: Sheet.register.members(statuses, { kind: "status", key: s => s.word, label: s => s.word, tone: s => some(s.tone) }),
602
+ * }}
603
+ * columns={{
604
+ * activity: Sheet.column.lookup(WorkshopOperation, { header: "Activity", width: "160px" }),
605
+ * start: Sheet.column.date(WorkshopOperation, { header: "Start", width: "96px", fill: [nextSlot] }),
606
+ * end: Sheet.column.date(WorkshopOperation, { header: "End", sub: "start + days", width: "96px",
607
+ * base: "start", fill: [endFromStart] }),
608
+ * qty: Sheet.column.quantity(WorkshopOperation, WorkshopActivity, { header: "Qty", sub: "unit per activity",
609
+ * width: "104px", uom: a => a.uom, format: Format.Number({ maximumFractionDigits: 0n }), fill: [lastQuantity, shiftQuantity] }),
610
+ * machines: Sheet.column.link(WorkshopOperation, WorkshopActivity, "machines", {
611
+ * header: "Work centres", sub: "from → to · 2 x edge bander", width: "300px",
612
+ * members: [{ kind: "machine", identified: true },
613
+ * { kind: "bay", countable: true, resolvesTo: "machine" },
614
+ * { kind: "family", countable: true, resolvesTo: "machine" }],
615
+ * multiple: { forms: ["N x kind", "kind x N"], ops: ["x", "X", "*", "×"], appliesTo: "countable" },
616
+ * sides: { value: a => a.sides, locks: { from: { to: "external", in: "in place" }, to: { from: "external" } } },
617
+ * arity: Sheet.link.arity("from", impliedMachines),
618
+ * check: [Sheet.link.check.exists(), familyFits],
619
+ * fill: [lastMachines, capacity] }),
620
+ * notes: Sheet.column.text(WorkshopOperation, { header: "Notes", width: "240px", fill: [phrase] }),
621
+ * }}
622
+ * suggest={{ ahead: 2n, triggers: ["activity", "start", "end", "qty", "notes", "machines"],
623
+ * propose: [followUps, modelProposals, lastFollower] }}
624
+ * // The inspector pane: every field of an operation; created_by, which no column shows, read only.
625
+ * inspector
626
+ * fields={{ created_by: Sheet.field.readonly() }}
627
+ * templates={{
628
+ * groups: [
629
+ * { key: "kitchen", name: "Kitchen order", group: "Orders",
630
+ * values: Sheet.patch(WorkshopOrder, { status: "PLANNED", due: none, ops: kitchen }) },
631
+ * { key: "wardrobe", name: "Wardrobe order", group: "Orders",
632
+ * values: Sheet.patch(WorkshopOrder, { status: "PLANNED", due: none, ops: wardrobe }) },
633
+ * { key: "vanity", name: "Vanity unit", group: "Orders",
634
+ * values: Sheet.patch(WorkshopOrder, { status: "PLANNED", due: none, ops: vanity }) },
635
+ * ],
636
+ * rows: [
637
+ * { key: "cut", name: "Panel cutting", group: "Operations",
638
+ * values: Sheet.patch(WorkshopOperation, { activity: "Panel cutting",
639
+ * machines: { from: [], to: [variant("counted", { n: 1n, key: "beam saw" })] } }) },
640
+ * { key: "edge", name: "Edge banding", group: "Operations",
641
+ * values: Sheet.patch(WorkshopOperation, { activity: "Edge banding",
642
+ * machines: { from: [], to: [variant("counted", { n: 1n, key: "edge bander" })] } }) },
643
+ * { key: "route", name: "CNC routing", group: "Operations",
644
+ * values: Sheet.patch(WorkshopOperation, { activity: "CNC routing",
645
+ * machines: { from: [], to: [variant("counted", { n: 1n, key: "CNC router" })] } }) },
646
+ * { key: "sand", name: "Sanding", group: "Operations",
647
+ * values: Sheet.patch(WorkshopOperation, { activity: "Sanding" }) },
648
+ * { key: "spray", name: "Spray finish", group: "Operations",
649
+ * values: Sheet.patch(WorkshopOperation, { activity: "Spray finish",
650
+ * machines: { from: [], to: [variant("counted", { n: 1n, key: "spray booth" })] } }) },
651
+ * { key: "assemble", name: "Assembly", group: "Operations",
652
+ * values: Sheet.patch(WorkshopOperation, { activity: "Assembly" }) },
653
+ * { key: "wrap", name: "Wrapping", group: "Dispatch",
654
+ * values: Sheet.patch(WorkshopOperation, { activity: "Wrapping" }) },
655
+ * { key: "deliver", name: "Delivery", group: "Dispatch",
656
+ * values: Sheet.patch(WorkshopOperation, { activity: "Delivery" }) },
657
+ * ],
658
+ * }}
659
+ * library={[
660
+ * Sheet.library.rows(),
661
+ * // The statuses an order takes: a card dropped on an order's band sets its status.
662
+ * Sheet.library.tab(statuses, { name: "Statuses", icon: "flag",
663
+ * key: s => s.word, label: s => s.word, drop: s => Sheet.patch(WorkshopOrder, { status: s.word }) }),
664
+ * Sheet.library.columns(),
665
+ * ]}
666
+ * newRow={newRow}
667
+ * newGroup={newGroup}
668
+ * ready={{ group: readyOrder }}
669
+ * slice={slice} affordances={["search", "filter"]}
670
+ * views={views}
671
+ * footer={[{ text: East.str`${operations.size()} operations` }]}
672
+ * name="workshop"
673
+ * />
674
+ * </Box>
675
+ * );
676
+ * }}</Reactive>
677
+ * ));
678
+ * ```
679
+ */
680
+ export declare function createDriver<D extends StructType>(column: string, data: SubtypeExprOrValue<ArrayType<D>>, config: SheetDriverConfig<D>): SheetDriverValue;
681
+ //# sourceMappingURL=registers.d.ts.map