@ketvietlab/ketsuite 0.1.25 → 0.1.30

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 (1557) hide show
  1. package/dist/cache.d.ts +23 -0
  2. package/dist/cache.d.ts.map +1 -0
  3. package/dist/cache.js +71 -0
  4. package/dist/cache.js.map +1 -0
  5. package/dist/cli-watch.d.ts +4 -0
  6. package/dist/cli-watch.d.ts.map +1 -0
  7. package/dist/cli-watch.js +52 -0
  8. package/dist/cli-watch.js.map +1 -0
  9. package/dist/cli.js +45 -17
  10. package/dist/cli.js.map +1 -1
  11. package/dist/deployment.d.ts +11 -0
  12. package/dist/deployment.d.ts.map +1 -1
  13. package/dist/deployment.js +49 -39
  14. package/dist/deployment.js.map +1 -1
  15. package/dist/deployments/commerce.d.ts +4 -0
  16. package/dist/deployments/commerce.d.ts.map +1 -0
  17. package/dist/deployments/commerce.js +34 -0
  18. package/dist/deployments/commerce.js.map +1 -0
  19. package/dist/deployments/common.d.ts +54 -0
  20. package/dist/deployments/common.d.ts.map +1 -0
  21. package/dist/deployments/common.js +112 -0
  22. package/dist/deployments/common.js.map +1 -0
  23. package/dist/deployments/hospitality.d.ts +4 -0
  24. package/dist/deployments/hospitality.d.ts.map +1 -0
  25. package/dist/deployments/hospitality.js +103 -0
  26. package/dist/deployments/hospitality.js.map +1 -0
  27. package/dist/deployments/office.d.ts +4 -0
  28. package/dist/deployments/office.d.ts.map +1 -0
  29. package/dist/deployments/office.js +31 -0
  30. package/dist/deployments/office.js.map +1 -0
  31. package/dist/development.d.ts +16 -0
  32. package/dist/development.d.ts.map +1 -1
  33. package/dist/development.js +31 -0
  34. package/dist/development.js.map +1 -1
  35. package/dist/index.d.ts +3 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +3 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/modules/account_backend/index.js +364 -877
  40. package/dist/modules/account_backend/index.js.map +1 -1
  41. package/dist/modules/account_backend/screens/account-defaults.d.ts.map +1 -1
  42. package/dist/modules/account_backend/screens/account-defaults.js +1 -1
  43. package/dist/modules/account_backend/screens/account-defaults.js.map +1 -1
  44. package/dist/modules/account_backend/screens/account-form.d.ts.map +1 -1
  45. package/dist/modules/account_backend/screens/account-form.js +3 -1
  46. package/dist/modules/account_backend/screens/account-form.js.map +1 -1
  47. package/dist/modules/account_backend/screens/accounts-list.d.ts.map +1 -1
  48. package/dist/modules/account_backend/screens/accounts-list.js +5 -15
  49. package/dist/modules/account_backend/screens/accounts-list.js.map +1 -1
  50. package/dist/modules/account_backend/screens/customer-invoice-form.d.ts.map +1 -1
  51. package/dist/modules/account_backend/screens/customer-invoice-form.js +1 -1
  52. package/dist/modules/account_backend/screens/customer-invoice-form.js.map +1 -1
  53. package/dist/modules/account_backend/screens/customer-invoices-list.d.ts.map +1 -1
  54. package/dist/modules/account_backend/screens/customer-invoices-list.js +5 -15
  55. package/dist/modules/account_backend/screens/customer-invoices-list.js.map +1 -1
  56. package/dist/modules/account_backend/screens/journal-entries-list.d.ts.map +1 -1
  57. package/dist/modules/account_backend/screens/journal-entries-list.js +5 -15
  58. package/dist/modules/account_backend/screens/journal-entries-list.js.map +1 -1
  59. package/dist/modules/account_backend/screens/journal-entry-create.d.ts.map +1 -1
  60. package/dist/modules/account_backend/screens/journal-entry-create.js +1 -1
  61. package/dist/modules/account_backend/screens/journal-entry-create.js.map +1 -1
  62. package/dist/modules/account_backend/screens/journal-form.d.ts.map +1 -1
  63. package/dist/modules/account_backend/screens/journal-form.js +3 -3
  64. package/dist/modules/account_backend/screens/journal-form.js.map +1 -1
  65. package/dist/modules/account_backend/screens/journals-list.d.ts.map +1 -1
  66. package/dist/modules/account_backend/screens/journals-list.js +5 -15
  67. package/dist/modules/account_backend/screens/journals-list.js.map +1 -1
  68. package/dist/modules/account_backend/screens/move-detail.d.ts.map +1 -1
  69. package/dist/modules/account_backend/screens/move-detail.js +3 -1
  70. package/dist/modules/account_backend/screens/move-detail.js.map +1 -1
  71. package/dist/modules/account_backend/screens/opening-balances.d.ts +3 -1
  72. package/dist/modules/account_backend/screens/opening-balances.d.ts.map +1 -1
  73. package/dist/modules/account_backend/screens/opening-balances.js +12 -6
  74. package/dist/modules/account_backend/screens/opening-balances.js.map +1 -1
  75. package/dist/modules/account_backend/screens/overview.js +4 -2
  76. package/dist/modules/account_backend/screens/overview.js.map +1 -1
  77. package/dist/modules/account_backend/screens/payment-form.d.ts.map +1 -1
  78. package/dist/modules/account_backend/screens/payment-form.js +1 -1
  79. package/dist/modules/account_backend/screens/payment-form.js.map +1 -1
  80. package/dist/modules/account_backend/screens/payment-term-form.d.ts.map +1 -1
  81. package/dist/modules/account_backend/screens/payment-term-form.js +4 -2
  82. package/dist/modules/account_backend/screens/payment-term-form.js.map +1 -1
  83. package/dist/modules/account_backend/screens/payment-terms-list.d.ts.map +1 -1
  84. package/dist/modules/account_backend/screens/payment-terms-list.js +6 -17
  85. package/dist/modules/account_backend/screens/payment-terms-list.js.map +1 -1
  86. package/dist/modules/account_backend/screens/payments-list.d.ts.map +1 -1
  87. package/dist/modules/account_backend/screens/payments-list.js +5 -15
  88. package/dist/modules/account_backend/screens/payments-list.js.map +1 -1
  89. package/dist/modules/account_backend/screens/period-closes.d.ts +3 -1
  90. package/dist/modules/account_backend/screens/period-closes.d.ts.map +1 -1
  91. package/dist/modules/account_backend/screens/period-closes.js +40 -36
  92. package/dist/modules/account_backend/screens/period-closes.js.map +1 -1
  93. package/dist/modules/account_backend/screens/tax-form.d.ts.map +1 -1
  94. package/dist/modules/account_backend/screens/tax-form.js +3 -1
  95. package/dist/modules/account_backend/screens/tax-form.js.map +1 -1
  96. package/dist/modules/account_backend/screens/taxes-list.d.ts.map +1 -1
  97. package/dist/modules/account_backend/screens/taxes-list.js +5 -15
  98. package/dist/modules/account_backend/screens/taxes-list.js.map +1 -1
  99. package/dist/modules/account_backend/screens/vendor-bill-form.d.ts.map +1 -1
  100. package/dist/modules/account_backend/screens/vendor-bill-form.js +1 -1
  101. package/dist/modules/account_backend/screens/vendor-bill-form.js.map +1 -1
  102. package/dist/modules/account_backend/screens/vendor-bills-list.d.ts.map +1 -1
  103. package/dist/modules/account_backend/screens/vendor-bills-list.js +5 -15
  104. package/dist/modules/account_backend/screens/vendor-bills-list.js.map +1 -1
  105. package/dist/modules/account_backend/search-functions.d.ts +4 -0
  106. package/dist/modules/account_backend/search-functions.d.ts.map +1 -0
  107. package/dist/modules/account_backend/search-functions.js +5 -0
  108. package/dist/modules/account_backend/search-functions.js.map +1 -0
  109. package/dist/modules/account_backend/search.d.ts +774 -0
  110. package/dist/modules/account_backend/search.d.ts.map +1 -0
  111. package/dist/modules/account_backend/search.js +312 -0
  112. package/dist/modules/account_backend/search.js.map +1 -0
  113. package/dist/modules/account_partner_backend/screens/accounting-terms.d.ts.map +1 -1
  114. package/dist/modules/account_partner_backend/screens/accounting-terms.js +1 -1
  115. package/dist/modules/account_partner_backend/screens/accounting-terms.js.map +1 -1
  116. package/dist/modules/activity_backend/index.d.ts.map +1 -1
  117. package/dist/modules/activity_backend/index.js +0 -2
  118. package/dist/modules/activity_backend/index.js.map +1 -1
  119. package/dist/modules/activity_backend/screens/activities-list.d.ts.map +1 -1
  120. package/dist/modules/activity_backend/screens/activities-list.js +1 -1
  121. package/dist/modules/activity_backend/screens/activities-list.js.map +1 -1
  122. package/dist/modules/address_backend/index.js +2 -2
  123. package/dist/modules/address_backend/index.js.map +1 -1
  124. package/dist/modules/address_backend/routes.d.ts.map +1 -1
  125. package/dist/modules/address_backend/routes.js +32 -7
  126. package/dist/modules/address_backend/routes.js.map +1 -1
  127. package/dist/modules/address_backend/screens/catalogs-list.d.ts +3 -1
  128. package/dist/modules/address_backend/screens/catalogs-list.d.ts.map +1 -1
  129. package/dist/modules/address_backend/screens/catalogs-list.js +15 -9
  130. package/dist/modules/address_backend/screens/catalogs-list.js.map +1 -1
  131. package/dist/modules/address_backend/screens/country-browser.d.ts.map +1 -1
  132. package/dist/modules/address_backend/screens/country-browser.js +7 -15
  133. package/dist/modules/address_backend/screens/country-browser.js.map +1 -1
  134. package/dist/modules/address_backend/search-functions.d.ts +4 -0
  135. package/dist/modules/address_backend/search-functions.d.ts.map +1 -0
  136. package/dist/modules/address_backend/search-functions.js +7 -0
  137. package/dist/modules/address_backend/search-functions.js.map +1 -0
  138. package/dist/modules/address_backend/search.d.ts +38 -0
  139. package/dist/modules/address_backend/search.d.ts.map +1 -0
  140. package/dist/modules/address_backend/search.js +40 -0
  141. package/dist/modules/address_backend/search.js.map +1 -0
  142. package/dist/modules/attendance_backend/screens/credentials.d.ts.map +1 -1
  143. package/dist/modules/attendance_backend/screens/credentials.js +1 -1
  144. package/dist/modules/attendance_backend/screens/credentials.js.map +1 -1
  145. package/dist/modules/attendance_backend/screens/period.d.ts.map +1 -1
  146. package/dist/modules/attendance_backend/screens/period.js +1 -1
  147. package/dist/modules/attendance_backend/screens/period.js.map +1 -1
  148. package/dist/modules/backend/catalogue.d.ts.map +1 -1
  149. package/dist/modules/backend/catalogue.js +16 -13
  150. package/dist/modules/backend/catalogue.js.map +1 -1
  151. package/dist/modules/backend/collection-search.d.ts +16 -0
  152. package/dist/modules/backend/collection-search.d.ts.map +1 -0
  153. package/dist/modules/backend/collection-search.js +43 -0
  154. package/dist/modules/backend/collection-search.js.map +1 -0
  155. package/dist/modules/backend/current-company.d.ts +4 -0
  156. package/dist/modules/backend/current-company.d.ts.map +1 -0
  157. package/dist/modules/backend/current-company.js +27 -0
  158. package/dist/modules/backend/current-company.js.map +1 -0
  159. package/dist/modules/backend/design/HANDOFF.md +1 -1
  160. package/dist/modules/backend/design/auth.css +61 -0
  161. package/dist/modules/backend/design/brand/logo-dark.png +0 -0
  162. package/dist/modules/backend/design/brand/logo-light.png +0 -0
  163. package/dist/modules/backend/design/client/backend-shell.d.mts +2 -2
  164. package/dist/modules/backend/design/client/backend-shell.d.mts.map +1 -1
  165. package/dist/modules/backend/design/client/backend-shell.mjs +1 -1
  166. package/dist/modules/backend/design/client/backend-shell.mjs.map +4 -4
  167. package/dist/modules/backend/design/client/ket-table.d.mts +10 -0
  168. package/dist/modules/backend/design/client/ket-table.d.mts.map +1 -0
  169. package/dist/modules/backend/design/client/ket-table.mjs +2 -0
  170. package/dist/modules/backend/design/client/ket-table.mjs.map +7 -0
  171. package/dist/modules/backend/design/client/lightbox.d.mts +22 -0
  172. package/dist/modules/backend/design/client/lightbox.d.mts.map +1 -0
  173. package/dist/modules/backend/design/client/lightbox.mjs +2 -0
  174. package/dist/modules/backend/design/client/lightbox.mjs.map +7 -0
  175. package/dist/modules/backend/design/client/relation-select.d.mts +12 -3
  176. package/dist/modules/backend/design/client/relation-select.d.mts.map +1 -1
  177. package/dist/modules/backend/design/client/relation-select.mjs +1 -1
  178. package/dist/modules/backend/design/client/relation-select.mjs.map +4 -4
  179. package/dist/modules/backend/design/client/search-filter.d.mts +10 -0
  180. package/dist/modules/backend/design/client/search-filter.d.mts.map +1 -0
  181. package/dist/modules/backend/design/client/search-filter.mjs +2 -0
  182. package/dist/modules/backend/design/client/search-filter.mjs.map +7 -0
  183. package/dist/modules/backend/design/content.css +43 -5
  184. package/dist/modules/backend/design/forms.css +130 -229
  185. package/dist/modules/backend/design/foundation.css +0 -51
  186. package/dist/modules/backend/design/lists.css +79 -7
  187. package/dist/modules/backend/design/user-workflow.css +0 -20
  188. package/dist/modules/backend/global-search.d.ts +3 -0
  189. package/dist/modules/backend/global-search.d.ts.map +1 -0
  190. package/dist/modules/backend/global-search.js +82 -0
  191. package/dist/modules/backend/global-search.js.map +1 -0
  192. package/dist/modules/backend/index.d.ts +27 -0
  193. package/dist/modules/backend/index.d.ts.map +1 -1
  194. package/dist/modules/backend/index.js +24 -0
  195. package/dist/modules/backend/index.js.map +1 -1
  196. package/dist/modules/backend/islands.d.ts +44 -1
  197. package/dist/modules/backend/islands.d.ts.map +1 -1
  198. package/dist/modules/backend/islands.js +25 -1
  199. package/dist/modules/backend/islands.js.map +1 -1
  200. package/dist/modules/backend/joints.d.ts.map +1 -1
  201. package/dist/modules/backend/joints.js +12 -0
  202. package/dist/modules/backend/joints.js.map +1 -1
  203. package/dist/modules/backend/ket-table.d.ts +7 -0
  204. package/dist/modules/backend/ket-table.d.ts.map +1 -0
  205. package/dist/modules/backend/ket-table.js +2 -0
  206. package/dist/modules/backend/ket-table.js.map +1 -0
  207. package/dist/modules/backend/messages.d.ts.map +1 -1
  208. package/dist/modules/backend/messages.js +144 -0
  209. package/dist/modules/backend/messages.js.map +1 -1
  210. package/dist/modules/backend/optional-read.d.ts +4 -0
  211. package/dist/modules/backend/optional-read.d.ts.map +1 -0
  212. package/dist/modules/backend/optional-read.js +7 -0
  213. package/dist/modules/backend/optional-read.js.map +1 -0
  214. package/dist/modules/backend/paging.d.ts.map +1 -1
  215. package/dist/modules/backend/paging.js +2 -1
  216. package/dist/modules/backend/paging.js.map +1 -1
  217. package/dist/modules/backend/relation-select.d.ts +2 -2
  218. package/dist/modules/backend/relation-select.d.ts.map +1 -1
  219. package/dist/modules/backend/routes.d.ts.map +1 -1
  220. package/dist/modules/backend/routes.js +2 -0
  221. package/dist/modules/backend/routes.js.map +1 -1
  222. package/dist/modules/backend/row-list.d.ts +63 -0
  223. package/dist/modules/backend/row-list.d.ts.map +1 -0
  224. package/dist/modules/backend/row-list.js +252 -0
  225. package/dist/modules/backend/row-list.js.map +1 -0
  226. package/dist/modules/backend/screen.d.ts +3 -3
  227. package/dist/modules/backend/screen.d.ts.map +1 -1
  228. package/dist/modules/backend/screen.js +6 -7
  229. package/dist/modules/backend/screen.js.map +1 -1
  230. package/dist/modules/backend/search-filter-state.d.ts +42 -0
  231. package/dist/modules/backend/search-filter-state.d.ts.map +1 -0
  232. package/dist/modules/backend/search-filter-state.js +277 -0
  233. package/dist/modules/backend/search-filter-state.js.map +1 -0
  234. package/dist/modules/backend/search-filter.d.ts +77 -0
  235. package/dist/modules/backend/search-filter.d.ts.map +1 -0
  236. package/dist/modules/backend/search-filter.js +259 -0
  237. package/dist/modules/backend/search-filter.js.map +1 -0
  238. package/dist/modules/channel_api/core.d.ts +1 -0
  239. package/dist/modules/channel_api/core.d.ts.map +1 -1
  240. package/dist/modules/channel_api/core.js.map +1 -1
  241. package/dist/modules/channel_api/customer.d.ts.map +1 -1
  242. package/dist/modules/channel_api/customer.js +4 -5
  243. package/dist/modules/channel_api/customer.js.map +1 -1
  244. package/dist/modules/company_backend/index.d.ts.map +1 -1
  245. package/dist/modules/company_backend/index.js +2 -2
  246. package/dist/modules/company_backend/index.js.map +1 -1
  247. package/dist/modules/company_backend/routes.d.ts.map +1 -1
  248. package/dist/modules/company_backend/routes.js +33 -27
  249. package/dist/modules/company_backend/routes.js.map +1 -1
  250. package/dist/modules/company_backend/screens/branch-form.d.ts.map +1 -1
  251. package/dist/modules/company_backend/screens/branch-form.js +3 -1
  252. package/dist/modules/company_backend/screens/branch-form.js.map +1 -1
  253. package/dist/modules/company_backend/screens/companies-list.d.ts +3 -3
  254. package/dist/modules/company_backend/screens/companies-list.d.ts.map +1 -1
  255. package/dist/modules/company_backend/screens/companies-list.js +18 -18
  256. package/dist/modules/company_backend/screens/companies-list.js.map +1 -1
  257. package/dist/modules/company_backend/screens/company-form.d.ts.map +1 -1
  258. package/dist/modules/company_backend/screens/company-form.js +1 -3
  259. package/dist/modules/company_backend/screens/company-form.js.map +1 -1
  260. package/dist/modules/company_backend/screens/context.d.ts.map +1 -1
  261. package/dist/modules/company_backend/screens/context.js +1 -1
  262. package/dist/modules/company_backend/screens/context.js.map +1 -1
  263. package/dist/modules/company_backend/screens/hierarchy.d.ts.map +1 -1
  264. package/dist/modules/company_backend/screens/hierarchy.js +1 -2
  265. package/dist/modules/company_backend/screens/hierarchy.js.map +1 -1
  266. package/dist/modules/company_backend/search-functions.d.ts +4 -0
  267. package/dist/modules/company_backend/search-functions.d.ts.map +1 -0
  268. package/dist/modules/company_backend/search-functions.js +7 -0
  269. package/dist/modules/company_backend/search-functions.js.map +1 -0
  270. package/dist/modules/company_backend/search.d.ts +24 -0
  271. package/dist/modules/company_backend/search.d.ts.map +1 -0
  272. package/dist/modules/company_backend/search.js +24 -0
  273. package/dist/modules/company_backend/search.js.map +1 -0
  274. package/dist/modules/crm/functions/activities.js +7 -10
  275. package/dist/modules/crm/functions/activities.js.map +1 -1
  276. package/dist/modules/crm/functions/case-modal-context.d.ts +3 -0
  277. package/dist/modules/crm/functions/case-modal-context.d.ts.map +1 -0
  278. package/dist/modules/crm/functions/case-modal-context.js +156 -0
  279. package/dist/modules/crm/functions/case-modal-context.js.map +1 -0
  280. package/dist/modules/crm/functions/cases.d.ts.map +1 -1
  281. package/dist/modules/crm/functions/cases.js +35 -2
  282. package/dist/modules/crm/functions/cases.js.map +1 -1
  283. package/dist/modules/crm/functions/configuration.js +1 -1
  284. package/dist/modules/crm/functions/configuration.js.map +1 -1
  285. package/dist/modules/crm/functions/gamification.d.ts.map +1 -1
  286. package/dist/modules/crm/functions/gamification.js +11 -7
  287. package/dist/modules/crm/functions/gamification.js.map +1 -1
  288. package/dist/modules/crm/functions/index.d.ts.map +1 -1
  289. package/dist/modules/crm/functions/index.js +4 -0
  290. package/dist/modules/crm/functions/index.js.map +1 -1
  291. package/dist/modules/crm/functions/reporting.d.ts +3 -0
  292. package/dist/modules/crm/functions/reporting.d.ts.map +1 -0
  293. package/dist/modules/crm/functions/reporting.js +140 -0
  294. package/dist/modules/crm/functions/reporting.js.map +1 -0
  295. package/dist/modules/crm/functions/shared.d.ts +1 -0
  296. package/dist/modules/crm/functions/shared.d.ts.map +1 -1
  297. package/dist/modules/crm/functions/shared.js +17 -9
  298. package/dist/modules/crm/functions/shared.js.map +1 -1
  299. package/dist/modules/crm/messages.d.ts +8 -1
  300. package/dist/modules/crm/messages.d.ts.map +1 -1
  301. package/dist/modules/crm/messages.js +14 -0
  302. package/dist/modules/crm/messages.js.map +1 -1
  303. package/dist/modules/crm/models.d.ts.map +1 -1
  304. package/dist/modules/crm/models.js +7 -0
  305. package/dist/modules/crm/models.js.map +1 -1
  306. package/dist/modules/crm/operations.d.ts +4 -1
  307. package/dist/modules/crm/operations.d.ts.map +1 -1
  308. package/dist/modules/crm/operations.js +39 -7
  309. package/dist/modules/crm/operations.js.map +1 -1
  310. package/dist/modules/crm/reporting.d.ts +115 -0
  311. package/dist/modules/crm/reporting.d.ts.map +1 -0
  312. package/dist/modules/crm/reporting.js +241 -0
  313. package/dist/modules/crm/reporting.js.map +1 -0
  314. package/dist/modules/crm_backend/client/crm-case-modal.d.mts +302 -0
  315. package/dist/modules/crm_backend/client/crm-case-modal.d.mts.map +1 -0
  316. package/dist/modules/crm_backend/client/crm-case-modal.mjs +2 -0
  317. package/dist/modules/crm_backend/client/crm-case-modal.mjs.map +7 -0
  318. package/dist/modules/crm_backend/client/crm-configuration-modal.d.mts +55 -55
  319. package/dist/modules/crm_backend/client/crm-configuration-modal.d.mts.map +1 -1
  320. package/dist/modules/crm_backend/client/crm-configuration-modal.mjs +1 -1
  321. package/dist/modules/crm_backend/client/crm-configuration-modal.mjs.map +4 -4
  322. package/dist/modules/crm_backend/client/crm-kanban-view.mjs +1 -1
  323. package/dist/modules/crm_backend/client/crm-kanban-view.mjs.map +1 -1
  324. package/dist/modules/crm_backend/collection-rows.d.ts +6 -0
  325. package/dist/modules/crm_backend/collection-rows.d.ts.map +1 -0
  326. package/dist/modules/crm_backend/collection-rows.js +15 -0
  327. package/dist/modules/crm_backend/collection-rows.js.map +1 -0
  328. package/dist/modules/crm_backend/index.d.ts.map +1 -1
  329. package/dist/modules/crm_backend/index.js +2 -15
  330. package/dist/modules/crm_backend/index.js.map +1 -1
  331. package/dist/modules/crm_backend/islands.d.ts +1 -0
  332. package/dist/modules/crm_backend/islands.d.ts.map +1 -1
  333. package/dist/modules/crm_backend/islands.js +5 -0
  334. package/dist/modules/crm_backend/islands.js.map +1 -1
  335. package/dist/modules/crm_backend/messages.d.ts +34 -10
  336. package/dist/modules/crm_backend/messages.d.ts.map +1 -1
  337. package/dist/modules/crm_backend/messages.js +34 -10
  338. package/dist/modules/crm_backend/messages.js.map +1 -1
  339. package/dist/modules/crm_backend/modal/case-modal-view.d.ts +23 -0
  340. package/dist/modules/crm_backend/modal/case-modal-view.d.ts.map +1 -0
  341. package/dist/modules/crm_backend/modal/case-modal-view.js +640 -0
  342. package/dist/modules/crm_backend/modal/case-modal-view.js.map +1 -0
  343. package/dist/modules/crm_backend/routes.d.ts.map +1 -1
  344. package/dist/modules/crm_backend/routes.js +71 -15
  345. package/dist/modules/crm_backend/routes.js.map +1 -1
  346. package/dist/modules/crm_backend/screens/activity-planner.d.ts +1 -0
  347. package/dist/modules/crm_backend/screens/activity-planner.d.ts.map +1 -1
  348. package/dist/modules/crm_backend/screens/activity-planner.js +15 -11
  349. package/dist/modules/crm_backend/screens/activity-planner.js.map +1 -1
  350. package/dist/modules/crm_backend/screens/case-create.d.ts.map +1 -1
  351. package/dist/modules/crm_backend/screens/case-create.js +1 -1
  352. package/dist/modules/crm_backend/screens/case-create.js.map +1 -1
  353. package/dist/modules/crm_backend/screens/case-detail.d.ts.map +1 -1
  354. package/dist/modules/crm_backend/screens/case-detail.js +2 -2
  355. package/dist/modules/crm_backend/screens/case-detail.js.map +1 -1
  356. package/dist/modules/crm_backend/screens/cases-list.d.ts +1 -0
  357. package/dist/modules/crm_backend/screens/cases-list.d.ts.map +1 -1
  358. package/dist/modules/crm_backend/screens/cases-list.js +17 -26
  359. package/dist/modules/crm_backend/screens/cases-list.js.map +1 -1
  360. package/dist/modules/crm_backend/screens/configuration.d.ts.map +1 -1
  361. package/dist/modules/crm_backend/screens/configuration.js +18 -16
  362. package/dist/modules/crm_backend/screens/configuration.js.map +1 -1
  363. package/dist/modules/crm_backend/screens/leaderboard.d.ts +2 -0
  364. package/dist/modules/crm_backend/screens/leaderboard.d.ts.map +1 -1
  365. package/dist/modules/crm_backend/screens/leaderboard.js +12 -18
  366. package/dist/modules/crm_backend/screens/leaderboard.js.map +1 -1
  367. package/dist/modules/crm_backend/screens/pipeline.d.ts.map +1 -1
  368. package/dist/modules/crm_backend/screens/pipeline.js +1 -1
  369. package/dist/modules/crm_backend/screens/pipeline.js.map +1 -1
  370. package/dist/modules/flow/domain/command-check.d.ts +3 -0
  371. package/dist/modules/flow/domain/command-check.d.ts.map +1 -0
  372. package/dist/modules/flow/domain/command-check.js +9 -0
  373. package/dist/modules/flow/domain/command-check.js.map +1 -0
  374. package/dist/modules/flow/domain/command.d.ts +33 -0
  375. package/dist/modules/flow/domain/command.d.ts.map +1 -0
  376. package/dist/modules/flow/domain/command.js +35 -0
  377. package/dist/modules/flow/domain/command.js.map +1 -0
  378. package/dist/modules/flow/domain/issue-bulk.d.ts +50 -0
  379. package/dist/modules/flow/domain/issue-bulk.d.ts.map +1 -0
  380. package/dist/modules/flow/domain/issue-bulk.js +97 -0
  381. package/dist/modules/flow/domain/issue-bulk.js.map +1 -0
  382. package/dist/modules/flow/domain/issue-dependency.d.ts +19 -0
  383. package/dist/modules/flow/domain/issue-dependency.d.ts.map +1 -0
  384. package/dist/modules/flow/domain/issue-dependency.js +59 -0
  385. package/dist/modules/flow/domain/issue-dependency.js.map +1 -0
  386. package/dist/modules/flow/domain/issue-discussion.d.ts +52 -0
  387. package/dist/modules/flow/domain/issue-discussion.d.ts.map +1 -0
  388. package/dist/modules/flow/domain/issue-discussion.js +114 -0
  389. package/dist/modules/flow/domain/issue-discussion.js.map +1 -0
  390. package/dist/modules/flow/domain/issue-transfer.d.ts +62 -0
  391. package/dist/modules/flow/domain/issue-transfer.d.ts.map +1 -0
  392. package/dist/modules/flow/domain/issue-transfer.js +171 -0
  393. package/dist/modules/flow/domain/issue-transfer.js.map +1 -0
  394. package/dist/modules/flow/domain/issue-validation.d.ts +68 -0
  395. package/dist/modules/flow/domain/issue-validation.d.ts.map +1 -0
  396. package/dist/modules/flow/domain/issue-validation.js +136 -0
  397. package/dist/modules/flow/domain/issue-validation.js.map +1 -0
  398. package/dist/modules/flow/domain/issue-write.d.ts +118 -0
  399. package/dist/modules/flow/domain/issue-write.d.ts.map +1 -0
  400. package/dist/modules/flow/domain/issue-write.js +372 -0
  401. package/dist/modules/flow/domain/issue-write.js.map +1 -0
  402. package/dist/modules/flow/domain/sprint-lifecycle.d.ts +61 -0
  403. package/dist/modules/flow/domain/sprint-lifecycle.d.ts.map +1 -0
  404. package/dist/modules/flow/domain/sprint-lifecycle.js +145 -0
  405. package/dist/modules/flow/domain/sprint-lifecycle.js.map +1 -0
  406. package/dist/modules/flow/functions/board.d.ts +7 -0
  407. package/dist/modules/flow/functions/board.d.ts.map +1 -0
  408. package/dist/modules/flow/functions/board.js +59 -0
  409. package/dist/modules/flow/functions/board.js.map +1 -0
  410. package/dist/modules/flow/functions/column.d.ts +8 -0
  411. package/dist/modules/flow/functions/column.d.ts.map +1 -0
  412. package/dist/modules/flow/functions/column.js +64 -0
  413. package/dist/modules/flow/functions/column.js.map +1 -0
  414. package/dist/modules/flow/functions/effects.d.ts +21 -0
  415. package/dist/modules/flow/functions/effects.d.ts.map +1 -0
  416. package/dist/modules/flow/functions/effects.js +96 -0
  417. package/dist/modules/flow/functions/effects.js.map +1 -0
  418. package/dist/modules/flow/functions/entity-save.d.ts +4 -0
  419. package/dist/modules/flow/functions/entity-save.d.ts.map +1 -0
  420. package/dist/modules/flow/functions/entity-save.js +60 -0
  421. package/dist/modules/flow/functions/entity-save.js.map +1 -0
  422. package/dist/modules/flow/functions/epic.d.ts +26 -0
  423. package/dist/modules/flow/functions/epic.d.ts.map +1 -0
  424. package/dist/modules/flow/functions/epic.js +151 -0
  425. package/dist/modules/flow/functions/epic.js.map +1 -0
  426. package/dist/modules/flow/functions/field.d.ts +9 -0
  427. package/dist/modules/flow/functions/field.d.ts.map +1 -0
  428. package/dist/modules/flow/functions/field.js +117 -0
  429. package/dist/modules/flow/functions/field.js.map +1 -0
  430. package/dist/modules/flow/functions/index.d.ts +5 -0
  431. package/dist/modules/flow/functions/index.d.ts.map +1 -0
  432. package/dist/modules/flow/functions/index.js +42 -0
  433. package/dist/modules/flow/functions/index.js.map +1 -0
  434. package/dist/modules/flow/functions/issue-batch.d.ts +6 -0
  435. package/dist/modules/flow/functions/issue-batch.d.ts.map +1 -0
  436. package/dist/modules/flow/functions/issue-batch.js +149 -0
  437. package/dist/modules/flow/functions/issue-batch.js.map +1 -0
  438. package/dist/modules/flow/functions/issue-dependency.d.ts +8 -0
  439. package/dist/modules/flow/functions/issue-dependency.d.ts.map +1 -0
  440. package/dist/modules/flow/functions/issue-dependency.js +54 -0
  441. package/dist/modules/flow/functions/issue-dependency.js.map +1 -0
  442. package/dist/modules/flow/functions/issue-discussion.d.ts +6 -0
  443. package/dist/modules/flow/functions/issue-discussion.d.ts.map +1 -0
  444. package/dist/modules/flow/functions/issue-discussion.js +86 -0
  445. package/dist/modules/flow/functions/issue-discussion.js.map +1 -0
  446. package/dist/modules/flow/functions/issue-read.d.ts +18 -0
  447. package/dist/modules/flow/functions/issue-read.d.ts.map +1 -0
  448. package/dist/modules/flow/functions/issue-read.js +159 -0
  449. package/dist/modules/flow/functions/issue-read.js.map +1 -0
  450. package/dist/modules/flow/functions/issue-write.d.ts +9 -0
  451. package/dist/modules/flow/functions/issue-write.d.ts.map +1 -0
  452. package/dist/modules/flow/functions/issue-write.js +149 -0
  453. package/dist/modules/flow/functions/issue-write.js.map +1 -0
  454. package/dist/modules/flow/functions/issueType.d.ts +8 -0
  455. package/dist/modules/flow/functions/issueType.d.ts.map +1 -0
  456. package/dist/modules/flow/functions/issueType.js +66 -0
  457. package/dist/modules/flow/functions/issueType.js.map +1 -0
  458. package/dist/modules/flow/functions/page.d.ts +22 -0
  459. package/dist/modules/flow/functions/page.d.ts.map +1 -0
  460. package/dist/modules/flow/functions/page.js +202 -0
  461. package/dist/modules/flow/functions/page.js.map +1 -0
  462. package/dist/modules/flow/functions/project.d.ts +26 -0
  463. package/dist/modules/flow/functions/project.d.ts.map +1 -0
  464. package/dist/modules/flow/functions/project.js +381 -0
  465. package/dist/modules/flow/functions/project.js.map +1 -0
  466. package/dist/modules/flow/functions/sprint.d.ts +17 -0
  467. package/dist/modules/flow/functions/sprint.d.ts.map +1 -0
  468. package/dist/modules/flow/functions/sprint.js +173 -0
  469. package/dist/modules/flow/functions/sprint.js.map +1 -0
  470. package/dist/modules/flow/functions/tag.d.ts +14 -0
  471. package/dist/modules/flow/functions/tag.d.ts.map +1 -0
  472. package/dist/modules/flow/functions/tag.js +88 -0
  473. package/dist/modules/flow/functions/tag.js.map +1 -0
  474. package/dist/modules/flow/index.d.ts +8 -2
  475. package/dist/modules/flow/index.d.ts.map +1 -1
  476. package/dist/modules/flow/index.js +7 -2
  477. package/dist/modules/flow/index.js.map +1 -1
  478. package/dist/modules/flow/pages.d.ts +1 -1
  479. package/dist/modules/flow/pages.d.ts.map +1 -1
  480. package/dist/modules/flow/pages.js +1 -1
  481. package/dist/modules/flow/pages.js.map +1 -1
  482. package/dist/modules/flow/queries/calendar.d.ts +21 -0
  483. package/dist/modules/flow/queries/calendar.d.ts.map +1 -0
  484. package/dist/modules/flow/queries/calendar.js +31 -0
  485. package/dist/modules/flow/queries/calendar.js.map +1 -0
  486. package/dist/modules/flow/queries/issue-dependencies.d.ts +17 -0
  487. package/dist/modules/flow/queries/issue-dependencies.d.ts.map +1 -0
  488. package/dist/modules/flow/queries/issue-dependencies.js +46 -0
  489. package/dist/modules/flow/queries/issue-dependencies.js.map +1 -0
  490. package/dist/modules/flow/queries/issue-followers.d.ts +6 -0
  491. package/dist/modules/flow/queries/issue-followers.d.ts.map +1 -0
  492. package/dist/modules/flow/queries/issue-followers.js +18 -0
  493. package/dist/modules/flow/queries/issue-followers.js.map +1 -0
  494. package/dist/modules/flow/queries/issue-list.d.ts +153 -0
  495. package/dist/modules/flow/queries/issue-list.d.ts.map +1 -0
  496. package/dist/modules/flow/queries/issue-list.js +439 -0
  497. package/dist/modules/flow/queries/issue-list.js.map +1 -0
  498. package/dist/modules/flow/queries/options.d.ts +4 -0
  499. package/dist/modules/flow/queries/options.d.ts.map +1 -0
  500. package/dist/modules/flow/queries/options.js +13 -0
  501. package/dist/modules/flow/queries/options.js.map +1 -0
  502. package/dist/modules/flow/queries/progress.d.ts +24 -0
  503. package/dist/modules/flow/queries/progress.d.ts.map +1 -0
  504. package/dist/modules/flow/queries/progress.js +54 -0
  505. package/dist/modules/flow/queries/progress.js.map +1 -0
  506. package/dist/modules/flow/queries/project-list.d.ts +4 -0
  507. package/dist/modules/flow/queries/project-list.d.ts.map +1 -0
  508. package/dist/modules/flow/queries/project-list.js +19 -0
  509. package/dist/modules/flow/queries/project-list.js.map +1 -0
  510. package/dist/modules/flow_backend/index.js +2 -1
  511. package/dist/modules/flow_backend/index.js.map +1 -1
  512. package/dist/modules/flow_backend/messages.d.ts +1 -2
  513. package/dist/modules/flow_backend/messages.d.ts.map +1 -1
  514. package/dist/modules/flow_backend/messages.js +0 -2
  515. package/dist/modules/flow_backend/messages.js.map +1 -1
  516. package/dist/modules/flow_backend/routes.d.ts.map +1 -1
  517. package/dist/modules/flow_backend/routes.js +182 -127
  518. package/dist/modules/flow_backend/routes.js.map +1 -1
  519. package/dist/modules/flow_backend/screens/all-epics.d.ts.map +1 -1
  520. package/dist/modules/flow_backend/screens/all-epics.js +37 -45
  521. package/dist/modules/flow_backend/screens/all-epics.js.map +1 -1
  522. package/dist/modules/flow_backend/screens/all-pages.d.ts.map +1 -1
  523. package/dist/modules/flow_backend/screens/all-pages.js +43 -51
  524. package/dist/modules/flow_backend/screens/all-pages.js.map +1 -1
  525. package/dist/modules/flow_backend/screens/epic-detail.js +1 -1
  526. package/dist/modules/flow_backend/screens/epic-detail.js.map +1 -1
  527. package/dist/modules/flow_backend/screens/gantt.d.ts.map +1 -1
  528. package/dist/modules/flow_backend/screens/gantt.js +1 -1
  529. package/dist/modules/flow_backend/screens/gantt.js.map +1 -1
  530. package/dist/modules/flow_backend/screens/issue-detail.js +2 -1
  531. package/dist/modules/flow_backend/screens/issue-detail.js.map +1 -1
  532. package/dist/modules/flow_backend/screens/issues.d.ts.map +1 -1
  533. package/dist/modules/flow_backend/screens/issues.js +68 -82
  534. package/dist/modules/flow_backend/screens/issues.js.map +1 -1
  535. package/dist/modules/flow_backend/screens/map.js +1 -1
  536. package/dist/modules/flow_backend/screens/map.js.map +1 -1
  537. package/dist/modules/flow_backend/screens/my-work.d.ts.map +1 -1
  538. package/dist/modules/flow_backend/screens/my-work.js +63 -69
  539. package/dist/modules/flow_backend/screens/my-work.js.map +1 -1
  540. package/dist/modules/flow_backend/screens/page-detail.js +1 -1
  541. package/dist/modules/flow_backend/screens/page-detail.js.map +1 -1
  542. package/dist/modules/flow_backend/screens/project-create.d.ts.map +1 -1
  543. package/dist/modules/flow_backend/screens/project-create.js +1 -1
  544. package/dist/modules/flow_backend/screens/project-create.js.map +1 -1
  545. package/dist/modules/flow_backend/screens/project-pages.d.ts.map +1 -1
  546. package/dist/modules/flow_backend/screens/project-pages.js +1 -2
  547. package/dist/modules/flow_backend/screens/project-pages.js.map +1 -1
  548. package/dist/modules/flow_backend/screens/projects-list.d.ts.map +1 -1
  549. package/dist/modules/flow_backend/screens/projects-list.js +41 -64
  550. package/dist/modules/flow_backend/screens/projects-list.js.map +1 -1
  551. package/dist/modules/flow_backend/screens/sprints.d.ts +3 -1
  552. package/dist/modules/flow_backend/screens/sprints.d.ts.map +1 -1
  553. package/dist/modules/flow_backend/screens/sprints.js +77 -73
  554. package/dist/modules/flow_backend/screens/sprints.js.map +1 -1
  555. package/dist/modules/flow_backend/search-functions.d.ts +13 -0
  556. package/dist/modules/flow_backend/search-functions.d.ts.map +1 -0
  557. package/dist/modules/flow_backend/search-functions.js +40 -0
  558. package/dist/modules/flow_backend/search-functions.js.map +1 -0
  559. package/dist/modules/flow_backend/search.d.ts +48 -0
  560. package/dist/modules/flow_backend/search.d.ts.map +1 -0
  561. package/dist/modules/flow_backend/search.js +57 -0
  562. package/dist/modules/flow_backend/search.js.map +1 -0
  563. package/dist/modules/flow_staff_channel/channel-routes.js +1 -1
  564. package/dist/modules/flow_staff_channel/channel-routes.js.map +1 -1
  565. package/dist/modules/hospitality_billing/index.js +2 -1
  566. package/dist/modules/hospitality_billing/index.js.map +1 -1
  567. package/dist/modules/hospitality_billing/menus.js +2 -2
  568. package/dist/modules/hospitality_billing/menus.js.map +1 -1
  569. package/dist/modules/hospitality_billing/messages.js +2 -2
  570. package/dist/modules/hospitality_billing/messages.js.map +1 -1
  571. package/dist/modules/hospitality_billing/routes.d.ts.map +1 -1
  572. package/dist/modules/hospitality_billing/routes.js +39 -5
  573. package/dist/modules/hospitality_billing/routes.js.map +1 -1
  574. package/dist/modules/hospitality_billing/screens/billing.d.ts.map +1 -1
  575. package/dist/modules/hospitality_billing/screens/billing.js +21 -17
  576. package/dist/modules/hospitality_billing/screens/billing.js.map +1 -1
  577. package/dist/modules/hospitality_billing/screens/charge-rules.d.ts +4 -2
  578. package/dist/modules/hospitality_billing/screens/charge-rules.d.ts.map +1 -1
  579. package/dist/modules/hospitality_billing/screens/charge-rules.js +14 -9
  580. package/dist/modules/hospitality_billing/screens/charge-rules.js.map +1 -1
  581. package/dist/modules/hospitality_billing/screens/page-frame.d.ts +3 -2
  582. package/dist/modules/hospitality_billing/screens/page-frame.d.ts.map +1 -1
  583. package/dist/modules/hospitality_billing/screens/page-frame.js +2 -4
  584. package/dist/modules/hospitality_billing/screens/page-frame.js.map +1 -1
  585. package/dist/modules/hospitality_billing/screens/shared.d.ts +4 -4
  586. package/dist/modules/hospitality_billing/screens/shared.d.ts.map +1 -1
  587. package/dist/modules/hospitality_billing/screens/shared.js +2 -2
  588. package/dist/modules/hospitality_billing/screens/shared.js.map +1 -1
  589. package/dist/modules/hospitality_billing/search-functions.d.ts +4 -0
  590. package/dist/modules/hospitality_billing/search-functions.d.ts.map +1 -0
  591. package/dist/modules/hospitality_billing/search-functions.js +16 -0
  592. package/dist/modules/hospitality_billing/search-functions.js.map +1 -0
  593. package/dist/modules/hospitality_billing/search.d.ts +66 -0
  594. package/dist/modules/hospitality_billing/search.d.ts.map +1 -0
  595. package/dist/modules/hospitality_billing/search.js +92 -0
  596. package/dist/modules/hospitality_billing/search.js.map +1 -0
  597. package/dist/modules/hospitality_core/content.d.ts.map +1 -1
  598. package/dist/modules/hospitality_core/content.js +3 -0
  599. package/dist/modules/hospitality_core/content.js.map +1 -1
  600. package/dist/modules/hospitality_core/housekeeping.d.ts.map +1 -1
  601. package/dist/modules/hospitality_core/housekeeping.js +13 -4
  602. package/dist/modules/hospitality_core/housekeeping.js.map +1 -1
  603. package/dist/modules/hospitality_core/index.d.ts.map +1 -1
  604. package/dist/modules/hospitality_core/index.js +2 -0
  605. package/dist/modules/hospitality_core/index.js.map +1 -1
  606. package/dist/modules/hospitality_core/menus.d.ts.map +1 -1
  607. package/dist/modules/hospitality_core/menus.js +27 -30
  608. package/dist/modules/hospitality_core/menus.js.map +1 -1
  609. package/dist/modules/hospitality_core/messages.d.ts.map +1 -1
  610. package/dist/modules/hospitality_core/messages.js +6 -2
  611. package/dist/modules/hospitality_core/messages.js.map +1 -1
  612. package/dist/modules/hospitality_core/routes.d.ts.map +1 -1
  613. package/dist/modules/hospitality_core/routes.js +135 -47
  614. package/dist/modules/hospitality_core/routes.js.map +1 -1
  615. package/dist/modules/hospitality_core/screens/amenities.d.ts +4 -2
  616. package/dist/modules/hospitality_core/screens/amenities.d.ts.map +1 -1
  617. package/dist/modules/hospitality_core/screens/amenities.js +9 -5
  618. package/dist/modules/hospitality_core/screens/amenities.js.map +1 -1
  619. package/dist/modules/hospitality_core/screens/check-out-prep.d.ts.map +1 -1
  620. package/dist/modules/hospitality_core/screens/check-out-prep.js +1 -1
  621. package/dist/modules/hospitality_core/screens/check-out-prep.js.map +1 -1
  622. package/dist/modules/hospitality_core/screens/cleaning-tasks.d.ts.map +1 -1
  623. package/dist/modules/hospitality_core/screens/cleaning-tasks.js +45 -30
  624. package/dist/modules/hospitality_core/screens/cleaning-tasks.js.map +1 -1
  625. package/dist/modules/hospitality_core/screens/folios.d.ts +4 -2
  626. package/dist/modules/hospitality_core/screens/folios.d.ts.map +1 -1
  627. package/dist/modules/hospitality_core/screens/folios.js +10 -4
  628. package/dist/modules/hospitality_core/screens/folios.js.map +1 -1
  629. package/dist/modules/hospitality_core/screens/front-desk.d.ts.map +1 -1
  630. package/dist/modules/hospitality_core/screens/front-desk.js +40 -40
  631. package/dist/modules/hospitality_core/screens/front-desk.js.map +1 -1
  632. package/dist/modules/hospitality_core/screens/page-frame.d.ts +4 -3
  633. package/dist/modules/hospitality_core/screens/page-frame.d.ts.map +1 -1
  634. package/dist/modules/hospitality_core/screens/page-frame.js +4 -7
  635. package/dist/modules/hospitality_core/screens/page-frame.js.map +1 -1
  636. package/dist/modules/hospitality_core/screens/policies.d.ts +4 -2
  637. package/dist/modules/hospitality_core/screens/policies.d.ts.map +1 -1
  638. package/dist/modules/hospitality_core/screens/policies.js +9 -5
  639. package/dist/modules/hospitality_core/screens/policies.js.map +1 -1
  640. package/dist/modules/hospitality_core/screens/properties.d.ts +4 -2
  641. package/dist/modules/hospitality_core/screens/properties.d.ts.map +1 -1
  642. package/dist/modules/hospitality_core/screens/properties.js +49 -42
  643. package/dist/modules/hospitality_core/screens/properties.js.map +1 -1
  644. package/dist/modules/hospitality_core/screens/rate-plans.d.ts.map +1 -1
  645. package/dist/modules/hospitality_core/screens/rate-plans.js +19 -15
  646. package/dist/modules/hospitality_core/screens/rate-plans.js.map +1 -1
  647. package/dist/modules/hospitality_core/screens/reservations.d.ts.map +1 -1
  648. package/dist/modules/hospitality_core/screens/reservations.js +26 -19
  649. package/dist/modules/hospitality_core/screens/reservations.js.map +1 -1
  650. package/dist/modules/hospitality_core/screens/room-types.d.ts.map +1 -1
  651. package/dist/modules/hospitality_core/screens/room-types.js +23 -19
  652. package/dist/modules/hospitality_core/screens/room-types.js.map +1 -1
  653. package/dist/modules/hospitality_core/screens/rooms.d.ts.map +1 -1
  654. package/dist/modules/hospitality_core/screens/rooms.js +26 -19
  655. package/dist/modules/hospitality_core/screens/rooms.js.map +1 -1
  656. package/dist/modules/hospitality_core/screens/shared.d.ts +4 -4
  657. package/dist/modules/hospitality_core/screens/shared.d.ts.map +1 -1
  658. package/dist/modules/hospitality_core/screens/shared.js +2 -2
  659. package/dist/modules/hospitality_core/screens/shared.js.map +1 -1
  660. package/dist/modules/hospitality_core/screens/stays.d.ts +4 -2
  661. package/dist/modules/hospitality_core/screens/stays.d.ts.map +1 -1
  662. package/dist/modules/hospitality_core/screens/stays.js +10 -4
  663. package/dist/modules/hospitality_core/screens/stays.js.map +1 -1
  664. package/dist/modules/hospitality_core/screens/tape-chart.d.ts.map +1 -1
  665. package/dist/modules/hospitality_core/screens/tape-chart.js +3 -12
  666. package/dist/modules/hospitality_core/screens/tape-chart.js.map +1 -1
  667. package/dist/modules/hospitality_core/search-functions.d.ts +10 -0
  668. package/dist/modules/hospitality_core/search-functions.d.ts.map +1 -0
  669. package/dist/modules/hospitality_core/search-functions.js +17 -0
  670. package/dist/modules/hospitality_core/search-functions.js.map +1 -0
  671. package/dist/modules/hospitality_core/search.d.ts +218 -0
  672. package/dist/modules/hospitality_core/search.d.ts.map +1 -0
  673. package/dist/modules/hospitality_core/search.js +201 -0
  674. package/dist/modules/hospitality_core/search.js.map +1 -0
  675. package/dist/modules/hr_backend/index.d.ts.map +1 -1
  676. package/dist/modules/hr_backend/index.js +2 -0
  677. package/dist/modules/hr_backend/index.js.map +1 -1
  678. package/dist/modules/hr_backend/routes.d.ts.map +1 -1
  679. package/dist/modules/hr_backend/routes.js +55 -71
  680. package/dist/modules/hr_backend/routes.js.map +1 -1
  681. package/dist/modules/hr_backend/screens/employee-form.d.ts.map +1 -1
  682. package/dist/modules/hr_backend/screens/employee-form.js +1 -1
  683. package/dist/modules/hr_backend/screens/employee-form.js.map +1 -1
  684. package/dist/modules/hr_backend/screens/employees-list.d.ts +3 -1
  685. package/dist/modules/hr_backend/screens/employees-list.d.ts.map +1 -1
  686. package/dist/modules/hr_backend/screens/employees-list.js +14 -12
  687. package/dist/modules/hr_backend/screens/employees-list.js.map +1 -1
  688. package/dist/modules/hr_backend/screens/leaves-list.d.ts +3 -1
  689. package/dist/modules/hr_backend/screens/leaves-list.d.ts.map +1 -1
  690. package/dist/modules/hr_backend/screens/leaves-list.js +11 -10
  691. package/dist/modules/hr_backend/screens/leaves-list.js.map +1 -1
  692. package/dist/modules/hr_backend/search-functions.d.ts +4 -0
  693. package/dist/modules/hr_backend/search-functions.d.ts.map +1 -0
  694. package/dist/modules/hr_backend/search-functions.js +8 -0
  695. package/dist/modules/hr_backend/search-functions.js.map +1 -0
  696. package/dist/modules/hr_backend/search.d.ts +73 -0
  697. package/dist/modules/hr_backend/search.d.ts.map +1 -0
  698. package/dist/modules/hr_backend/search.js +67 -0
  699. package/dist/modules/hr_backend/search.js.map +1 -0
  700. package/dist/modules/livedoc/islands.d.ts +10 -0
  701. package/dist/modules/livedoc/islands.d.ts.map +1 -1
  702. package/dist/modules/loyalty_backend/index.js +176 -215
  703. package/dist/modules/loyalty_backend/index.js.map +1 -1
  704. package/dist/modules/loyalty_backend/messages.d.ts +0 -10
  705. package/dist/modules/loyalty_backend/messages.d.ts.map +1 -1
  706. package/dist/modules/loyalty_backend/messages.js +0 -10
  707. package/dist/modules/loyalty_backend/messages.js.map +1 -1
  708. package/dist/modules/loyalty_backend/screens/index.d.ts.map +1 -1
  709. package/dist/modules/loyalty_backend/screens/index.js +321 -326
  710. package/dist/modules/loyalty_backend/screens/index.js.map +1 -1
  711. package/dist/modules/loyalty_backend/screens/page-frame.d.ts +7 -5
  712. package/dist/modules/loyalty_backend/screens/page-frame.d.ts.map +1 -1
  713. package/dist/modules/loyalty_backend/screens/page-frame.js +3 -3
  714. package/dist/modules/loyalty_backend/screens/page-frame.js.map +1 -1
  715. package/dist/modules/loyalty_backend/search-functions.d.ts +4 -0
  716. package/dist/modules/loyalty_backend/search-functions.d.ts.map +1 -0
  717. package/dist/modules/loyalty_backend/search-functions.js +11 -0
  718. package/dist/modules/loyalty_backend/search-functions.js.map +1 -0
  719. package/dist/modules/loyalty_backend/search.d.ts +33 -0
  720. package/dist/modules/loyalty_backend/search.d.ts.map +1 -0
  721. package/dist/modules/loyalty_backend/search.js +85 -0
  722. package/dist/modules/loyalty_backend/search.js.map +1 -0
  723. package/dist/modules/mail_backend/index.d.ts.map +1 -1
  724. package/dist/modules/mail_backend/index.js +0 -2
  725. package/dist/modules/mail_backend/index.js.map +1 -1
  726. package/dist/modules/mail_backend/screens/inbox-list.d.ts.map +1 -1
  727. package/dist/modules/mail_backend/screens/inbox-list.js +1 -1
  728. package/dist/modules/mail_backend/screens/inbox-list.js.map +1 -1
  729. package/dist/modules/mail_inbound_backend/index.d.ts.map +1 -1
  730. package/dist/modules/mail_inbound_backend/index.js +0 -2
  731. package/dist/modules/mail_inbound_backend/index.js.map +1 -1
  732. package/dist/modules/mail_inbound_backend/screens/inbound-list.d.ts.map +1 -1
  733. package/dist/modules/mail_inbound_backend/screens/inbound-list.js +1 -1
  734. package/dist/modules/mail_inbound_backend/screens/inbound-list.js.map +1 -1
  735. package/dist/modules/mail_transport_backend/index.d.ts.map +1 -1
  736. package/dist/modules/mail_transport_backend/index.js +0 -2
  737. package/dist/modules/mail_transport_backend/index.js.map +1 -1
  738. package/dist/modules/mail_transport_backend/screens/outbox-list.d.ts.map +1 -1
  739. package/dist/modules/mail_transport_backend/screens/outbox-list.js +1 -1
  740. package/dist/modules/mail_transport_backend/screens/outbox-list.js.map +1 -1
  741. package/dist/modules/manufacturing_backend/index.d.ts.map +1 -1
  742. package/dist/modules/manufacturing_backend/index.js +14 -0
  743. package/dist/modules/manufacturing_backend/index.js.map +1 -1
  744. package/dist/modules/manufacturing_backend/routes.d.ts.map +1 -1
  745. package/dist/modules/manufacturing_backend/routes.js +74 -20
  746. package/dist/modules/manufacturing_backend/routes.js.map +1 -1
  747. package/dist/modules/manufacturing_backend/screens/boms-list.d.ts +3 -1
  748. package/dist/modules/manufacturing_backend/screens/boms-list.d.ts.map +1 -1
  749. package/dist/modules/manufacturing_backend/screens/boms-list.js +12 -11
  750. package/dist/modules/manufacturing_backend/screens/boms-list.js.map +1 -1
  751. package/dist/modules/manufacturing_backend/screens/order-execution.d.ts.map +1 -1
  752. package/dist/modules/manufacturing_backend/screens/order-execution.js +1 -1
  753. package/dist/modules/manufacturing_backend/screens/order-execution.js.map +1 -1
  754. package/dist/modules/manufacturing_backend/screens/orders-list.d.ts +3 -1
  755. package/dist/modules/manufacturing_backend/screens/orders-list.d.ts.map +1 -1
  756. package/dist/modules/manufacturing_backend/screens/orders-list.js +13 -12
  757. package/dist/modules/manufacturing_backend/screens/orders-list.js.map +1 -1
  758. package/dist/modules/manufacturing_backend/screens/work-centers-list.d.ts +3 -1
  759. package/dist/modules/manufacturing_backend/screens/work-centers-list.d.ts.map +1 -1
  760. package/dist/modules/manufacturing_backend/screens/work-centers-list.js +13 -12
  761. package/dist/modules/manufacturing_backend/screens/work-centers-list.js.map +1 -1
  762. package/dist/modules/manufacturing_backend/search-functions.d.ts +4 -0
  763. package/dist/modules/manufacturing_backend/search-functions.d.ts.map +1 -0
  764. package/dist/modules/manufacturing_backend/search-functions.js +9 -0
  765. package/dist/modules/manufacturing_backend/search-functions.js.map +1 -0
  766. package/dist/modules/manufacturing_backend/search.d.ts +99 -0
  767. package/dist/modules/manufacturing_backend/search.d.ts.map +1 -0
  768. package/dist/modules/manufacturing_backend/search.js +75 -0
  769. package/dist/modules/manufacturing_backend/search.js.map +1 -0
  770. package/dist/modules/oauth_backend/index.d.ts.map +1 -1
  771. package/dist/modules/oauth_backend/index.js +2 -0
  772. package/dist/modules/oauth_backend/index.js.map +1 -1
  773. package/dist/modules/oauth_backend/messages.d.ts +0 -4
  774. package/dist/modules/oauth_backend/messages.d.ts.map +1 -1
  775. package/dist/modules/oauth_backend/messages.js +0 -4
  776. package/dist/modules/oauth_backend/messages.js.map +1 -1
  777. package/dist/modules/oauth_backend/routes.d.ts.map +1 -1
  778. package/dist/modules/oauth_backend/routes.js +33 -2
  779. package/dist/modules/oauth_backend/routes.js.map +1 -1
  780. package/dist/modules/oauth_backend/screens/index.d.ts +7 -3
  781. package/dist/modules/oauth_backend/screens/index.d.ts.map +1 -1
  782. package/dist/modules/oauth_backend/screens/index.js +114 -104
  783. package/dist/modules/oauth_backend/screens/index.js.map +1 -1
  784. package/dist/modules/oauth_backend/search-functions.d.ts +4 -0
  785. package/dist/modules/oauth_backend/search-functions.d.ts.map +1 -0
  786. package/dist/modules/oauth_backend/search-functions.js +8 -0
  787. package/dist/modules/oauth_backend/search-functions.js.map +1 -0
  788. package/dist/modules/oauth_backend/search.d.ts +68 -0
  789. package/dist/modules/oauth_backend/search.d.ts.map +1 -0
  790. package/dist/modules/oauth_backend/search.js +69 -0
  791. package/dist/modules/oauth_backend/search.js.map +1 -0
  792. package/dist/modules/partner/functions.d.ts.map +1 -1
  793. package/dist/modules/partner/functions.js +121 -23
  794. package/dist/modules/partner/functions.js.map +1 -1
  795. package/dist/modules/partner_backend/functions.d.ts +13 -0
  796. package/dist/modules/partner_backend/functions.d.ts.map +1 -0
  797. package/dist/modules/partner_backend/functions.js +56 -0
  798. package/dist/modules/partner_backend/functions.js.map +1 -0
  799. package/dist/modules/partner_backend/index.d.ts.map +1 -1
  800. package/dist/modules/partner_backend/index.js +28 -6
  801. package/dist/modules/partner_backend/index.js.map +1 -1
  802. package/dist/modules/partner_backend/routes.d.ts.map +1 -1
  803. package/dist/modules/partner_backend/routes.js +269 -86
  804. package/dist/modules/partner_backend/routes.js.map +1 -1
  805. package/dist/modules/partner_backend/screens/form.d.ts.map +1 -1
  806. package/dist/modules/partner_backend/screens/form.js +3 -1
  807. package/dist/modules/partner_backend/screens/form.js.map +1 -1
  808. package/dist/modules/partner_backend/screens/index.d.ts +1 -1
  809. package/dist/modules/partner_backend/screens/index.d.ts.map +1 -1
  810. package/dist/modules/partner_backend/screens/list.d.ts +3 -4
  811. package/dist/modules/partner_backend/screens/list.d.ts.map +1 -1
  812. package/dist/modules/partner_backend/screens/list.js +13 -92
  813. package/dist/modules/partner_backend/screens/list.js.map +1 -1
  814. package/dist/modules/partner_backend/screens/new.d.ts.map +1 -1
  815. package/dist/modules/partner_backend/screens/new.js +1 -1
  816. package/dist/modules/partner_backend/screens/new.js.map +1 -1
  817. package/dist/modules/partner_backend/screens/types.d.ts +0 -11
  818. package/dist/modules/partner_backend/screens/types.d.ts.map +1 -1
  819. package/dist/modules/pos_backend/index.js +34 -9
  820. package/dist/modules/pos_backend/index.js.map +1 -1
  821. package/dist/modules/pos_backend/screens.d.ts +4 -2
  822. package/dist/modules/pos_backend/screens.d.ts.map +1 -1
  823. package/dist/modules/pos_backend/screens.js +105 -96
  824. package/dist/modules/pos_backend/screens.js.map +1 -1
  825. package/dist/modules/pos_backend/search-functions.d.ts +4 -0
  826. package/dist/modules/pos_backend/search-functions.d.ts.map +1 -0
  827. package/dist/modules/pos_backend/search-functions.js +7 -0
  828. package/dist/modules/pos_backend/search-functions.js.map +1 -0
  829. package/dist/modules/pos_backend/search.d.ts +41 -0
  830. package/dist/modules/pos_backend/search.d.ts.map +1 -0
  831. package/dist/modules/pos_backend/search.js +33 -0
  832. package/dist/modules/pos_backend/search.js.map +1 -0
  833. package/dist/modules/pricing_backend/index.js +31 -4
  834. package/dist/modules/pricing_backend/index.js.map +1 -1
  835. package/dist/modules/pricing_backend/screens/pricelist-detail.d.ts.map +1 -1
  836. package/dist/modules/pricing_backend/screens/pricelist-detail.js +1 -1
  837. package/dist/modules/pricing_backend/screens/pricelist-detail.js.map +1 -1
  838. package/dist/modules/pricing_backend/screens/pricelists-list.d.ts +3 -1
  839. package/dist/modules/pricing_backend/screens/pricelists-list.d.ts.map +1 -1
  840. package/dist/modules/pricing_backend/screens/pricelists-list.js +14 -12
  841. package/dist/modules/pricing_backend/screens/pricelists-list.js.map +1 -1
  842. package/dist/modules/pricing_backend/search-functions.d.ts +4 -0
  843. package/dist/modules/pricing_backend/search-functions.d.ts.map +1 -0
  844. package/dist/modules/pricing_backend/search-functions.js +11 -0
  845. package/dist/modules/pricing_backend/search-functions.js.map +1 -0
  846. package/dist/modules/pricing_backend/search.d.ts +41 -0
  847. package/dist/modules/pricing_backend/search.d.ts.map +1 -0
  848. package/dist/modules/pricing_backend/search.js +34 -0
  849. package/dist/modules/pricing_backend/search.js.map +1 -0
  850. package/dist/modules/product/attribute-draft.d.ts +3 -0
  851. package/dist/modules/product/attribute-draft.d.ts.map +1 -0
  852. package/dist/modules/product/attribute-draft.js +126 -0
  853. package/dist/modules/product/attribute-draft.js.map +1 -0
  854. package/dist/modules/product/attribute-modal-context.d.ts +4 -0
  855. package/dist/modules/product/attribute-modal-context.d.ts.map +1 -0
  856. package/dist/modules/product/attribute-modal-context.js +57 -0
  857. package/dist/modules/product/attribute-modal-context.js.map +1 -0
  858. package/dist/modules/product/attribute-modal-labels.d.ts +3 -0
  859. package/dist/modules/product/attribute-modal-labels.d.ts.map +1 -0
  860. package/dist/modules/product/attribute-modal-labels.js +30 -0
  861. package/dist/modules/product/attribute-modal-labels.js.map +1 -0
  862. package/dist/modules/product/functions.d.ts.map +1 -1
  863. package/dist/modules/product/functions.js +7 -1
  864. package/dist/modules/product/functions.js.map +1 -1
  865. package/dist/modules/product/messages.d.ts.map +1 -1
  866. package/dist/modules/product/messages.js +24 -0
  867. package/dist/modules/product/messages.js.map +1 -1
  868. package/dist/modules/product/models.d.ts.map +1 -1
  869. package/dist/modules/product/models.js +14 -2
  870. package/dist/modules/product/models.js.map +1 -1
  871. package/dist/modules/product/product-modal-context.d.ts.map +1 -1
  872. package/dist/modules/product/product-modal-context.js +20 -30
  873. package/dist/modules/product/product-modal-context.js.map +1 -1
  874. package/dist/modules/product/record-images.d.ts +12 -0
  875. package/dist/modules/product/record-images.d.ts.map +1 -0
  876. package/dist/modules/product/record-images.js +37 -0
  877. package/dist/modules/product/record-images.js.map +1 -0
  878. package/dist/modules/product/search.d.ts +3 -0
  879. package/dist/modules/product/search.d.ts.map +1 -1
  880. package/dist/modules/product/search.js +4 -0
  881. package/dist/modules/product/search.js.map +1 -1
  882. package/dist/modules/product/variant-setup.d.ts +46 -0
  883. package/dist/modules/product/variant-setup.d.ts.map +1 -0
  884. package/dist/modules/product/variant-setup.js +444 -0
  885. package/dist/modules/product/variant-setup.js.map +1 -0
  886. package/dist/modules/product_backend/attribute-search-state.d.ts +22 -0
  887. package/dist/modules/product_backend/attribute-search-state.d.ts.map +1 -0
  888. package/dist/modules/product_backend/attribute-search-state.js +62 -0
  889. package/dist/modules/product_backend/attribute-search-state.js.map +1 -0
  890. package/dist/modules/product_backend/attributes-search.d.ts +10 -0
  891. package/dist/modules/product_backend/attributes-search.d.ts.map +1 -0
  892. package/dist/modules/product_backend/attributes-search.js +67 -0
  893. package/dist/modules/product_backend/attributes-search.js.map +1 -0
  894. package/dist/modules/product_backend/client/attribute-modal.d.mts +62 -0
  895. package/dist/modules/product_backend/client/attribute-modal.d.mts.map +1 -0
  896. package/dist/modules/product_backend/client/attribute-modal.mjs +2 -0
  897. package/dist/modules/product_backend/client/attribute-modal.mjs.map +7 -0
  898. package/dist/modules/product_backend/client/product-modal.d.mts +45 -44
  899. package/dist/modules/product_backend/client/product-modal.d.mts.map +1 -1
  900. package/dist/modules/product_backend/client/product-modal.mjs +1 -1
  901. package/dist/modules/product_backend/client/product-modal.mjs.map +4 -4
  902. package/dist/modules/product_backend/client/product.css +262 -0
  903. package/dist/modules/product_backend/client/variant-editor.d.mts +16 -0
  904. package/dist/modules/product_backend/client/variant-editor.d.mts.map +1 -0
  905. package/dist/modules/product_backend/client/variant-editor.mjs +2 -0
  906. package/dist/modules/product_backend/client/variant-editor.mjs.map +7 -0
  907. package/dist/modules/product_backend/functions.d.ts.map +1 -0
  908. package/dist/modules/product_backend/functions.js +29 -0
  909. package/dist/modules/product_backend/functions.js.map +1 -0
  910. package/dist/modules/product_backend/index.d.ts.map +1 -1
  911. package/dist/modules/product_backend/index.js +227 -5
  912. package/dist/modules/product_backend/index.js.map +1 -1
  913. package/dist/modules/product_backend/islands.d.ts +20 -0
  914. package/dist/modules/product_backend/islands.d.ts.map +1 -1
  915. package/dist/modules/product_backend/islands.js +25 -0
  916. package/dist/modules/product_backend/islands.js.map +1 -1
  917. package/dist/modules/product_backend/menus.d.ts.map +1 -1
  918. package/dist/modules/product_backend/menus.js +4 -5
  919. package/dist/modules/product_backend/menus.js.map +1 -1
  920. package/dist/modules/product_backend/modal/attribute-modal-view.d.ts +25 -0
  921. package/dist/modules/product_backend/modal/attribute-modal-view.d.ts.map +1 -0
  922. package/dist/modules/product_backend/modal/attribute-modal-view.js +180 -0
  923. package/dist/modules/product_backend/modal/attribute-modal-view.js.map +1 -0
  924. package/dist/modules/product_backend/modal/product-modal-view.d.ts +25 -6
  925. package/dist/modules/product_backend/modal/product-modal-view.d.ts.map +1 -1
  926. package/dist/modules/product_backend/modal/product-modal-view.js +334 -251
  927. package/dist/modules/product_backend/modal/product-modal-view.js.map +1 -1
  928. package/dist/modules/product_backend/routes.d.ts.map +1 -1
  929. package/dist/modules/product_backend/routes.js +159 -200
  930. package/dist/modules/product_backend/routes.js.map +1 -1
  931. package/dist/modules/product_backend/screens/attributes.d.ts +18 -4
  932. package/dist/modules/product_backend/screens/attributes.d.ts.map +1 -1
  933. package/dist/modules/product_backend/screens/attributes.js +71 -63
  934. package/dist/modules/product_backend/screens/attributes.js.map +1 -1
  935. package/dist/modules/product_backend/screens/detail.d.ts.map +1 -1
  936. package/dist/modules/product_backend/screens/detail.js +3 -2
  937. package/dist/modules/product_backend/screens/detail.js.map +1 -1
  938. package/dist/modules/product_backend/screens/list.d.ts +13 -7
  939. package/dist/modules/product_backend/screens/list.d.ts.map +1 -1
  940. package/dist/modules/product_backend/screens/list.js +38 -57
  941. package/dist/modules/product_backend/screens/list.js.map +1 -1
  942. package/dist/modules/product_backend/screens/variant.d.ts.map +1 -1
  943. package/dist/modules/product_backend/screens/variant.js +3 -2
  944. package/dist/modules/product_backend/screens/variant.js.map +1 -1
  945. package/dist/modules/product_media/functions.d.ts.map +1 -1
  946. package/dist/modules/product_media/functions.js +2 -0
  947. package/dist/modules/product_media/functions.js.map +1 -1
  948. package/dist/modules/purchase_backend/client/purchase-order-modal.d.mts +185 -0
  949. package/dist/modules/purchase_backend/client/purchase-order-modal.d.mts.map +1 -0
  950. package/dist/modules/purchase_backend/client/purchase-order-modal.mjs +2 -0
  951. package/dist/modules/purchase_backend/client/purchase-order-modal.mjs.map +7 -0
  952. package/dist/modules/purchase_backend/client/vendor-pricelist-modal.d.mts +52 -0
  953. package/dist/modules/purchase_backend/client/vendor-pricelist-modal.d.mts.map +1 -0
  954. package/dist/modules/purchase_backend/client/vendor-pricelist-modal.mjs +2 -0
  955. package/dist/modules/purchase_backend/client/vendor-pricelist-modal.mjs.map +7 -0
  956. package/dist/modules/purchase_backend/index.js +192 -215
  957. package/dist/modules/purchase_backend/index.js.map +1 -1
  958. package/dist/modules/purchase_backend/modal/context.d.ts +4 -0
  959. package/dist/modules/purchase_backend/modal/context.d.ts.map +1 -0
  960. package/dist/modules/purchase_backend/modal/context.js +94 -0
  961. package/dist/modules/purchase_backend/modal/context.js.map +1 -0
  962. package/dist/modules/purchase_backend/modal/order-modal-view.d.ts +18 -0
  963. package/dist/modules/purchase_backend/modal/order-modal-view.d.ts.map +1 -0
  964. package/dist/modules/purchase_backend/modal/order-modal-view.js +290 -0
  965. package/dist/modules/purchase_backend/modal/order-modal-view.js.map +1 -0
  966. package/dist/modules/purchase_backend/modal/pricelist-context.d.ts +3 -0
  967. package/dist/modules/purchase_backend/modal/pricelist-context.d.ts.map +1 -0
  968. package/dist/modules/purchase_backend/modal/pricelist-context.js +36 -0
  969. package/dist/modules/purchase_backend/modal/pricelist-context.js.map +1 -0
  970. package/dist/modules/purchase_backend/modal/pricelist-view.d.ts +12 -0
  971. package/dist/modules/purchase_backend/modal/pricelist-view.d.ts.map +1 -0
  972. package/dist/modules/purchase_backend/modal/pricelist-view.js +78 -0
  973. package/dist/modules/purchase_backend/modal/pricelist-view.js.map +1 -0
  974. package/dist/modules/purchase_backend/screens/order-detail.d.ts.map +1 -1
  975. package/dist/modules/purchase_backend/screens/order-detail.js +4 -2
  976. package/dist/modules/purchase_backend/screens/order-detail.js.map +1 -1
  977. package/dist/modules/purchase_backend/screens/order-list-shared.js +2 -2
  978. package/dist/modules/purchase_backend/screens/order-list-shared.js.map +1 -1
  979. package/dist/modules/purchase_backend/screens/overview.d.ts +5 -0
  980. package/dist/modules/purchase_backend/screens/overview.d.ts.map +1 -1
  981. package/dist/modules/purchase_backend/screens/overview.js +27 -6
  982. package/dist/modules/purchase_backend/screens/overview.js.map +1 -1
  983. package/dist/modules/purchase_backend/screens/purchase-orders-list.d.ts.map +1 -1
  984. package/dist/modules/purchase_backend/screens/purchase-orders-list.js +11 -13
  985. package/dist/modules/purchase_backend/screens/purchase-orders-list.js.map +1 -1
  986. package/dist/modules/purchase_backend/screens/rfq-create.d.ts.map +1 -1
  987. package/dist/modules/purchase_backend/screens/rfq-create.js +1 -1
  988. package/dist/modules/purchase_backend/screens/rfq-create.js.map +1 -1
  989. package/dist/modules/purchase_backend/screens/rfqs-list.d.ts +1 -1
  990. package/dist/modules/purchase_backend/screens/rfqs-list.d.ts.map +1 -1
  991. package/dist/modules/purchase_backend/screens/rfqs-list.js +10 -15
  992. package/dist/modules/purchase_backend/screens/rfqs-list.js.map +1 -1
  993. package/dist/modules/purchase_backend/screens/vendor-pricelist-create.d.ts.map +1 -1
  994. package/dist/modules/purchase_backend/screens/vendor-pricelist-create.js +1 -1
  995. package/dist/modules/purchase_backend/screens/vendor-pricelist-create.js.map +1 -1
  996. package/dist/modules/purchase_backend/screens/vendor-pricelists-list.d.ts +2 -1
  997. package/dist/modules/purchase_backend/screens/vendor-pricelists-list.d.ts.map +1 -1
  998. package/dist/modules/purchase_backend/screens/vendor-pricelists-list.js +11 -21
  999. package/dist/modules/purchase_backend/screens/vendor-pricelists-list.js.map +1 -1
  1000. package/dist/modules/purchase_backend/search-functions.d.ts +4 -0
  1001. package/dist/modules/purchase_backend/search-functions.d.ts.map +1 -0
  1002. package/dist/modules/purchase_backend/search-functions.js +9 -0
  1003. package/dist/modules/purchase_backend/search-functions.js.map +1 -0
  1004. package/dist/modules/purchase_backend/search.d.ts +128 -0
  1005. package/dist/modules/purchase_backend/search.d.ts.map +1 -0
  1006. package/dist/modules/purchase_backend/search.js +106 -0
  1007. package/dist/modules/purchase_backend/search.js.map +1 -0
  1008. package/dist/modules/sale/functions/line-edit.d.ts +4 -0
  1009. package/dist/modules/sale/functions/line-edit.d.ts.map +1 -0
  1010. package/dist/modules/sale/functions/line-edit.js +120 -0
  1011. package/dist/modules/sale/functions/line-edit.js.map +1 -0
  1012. package/dist/modules/sale/index.d.ts.map +1 -1
  1013. package/dist/modules/sale/index.js +16 -1
  1014. package/dist/modules/sale/index.js.map +1 -1
  1015. package/dist/modules/sale_backend/client/invoicing-policy-modal.d.mts +53 -0
  1016. package/dist/modules/sale_backend/client/invoicing-policy-modal.d.mts.map +1 -0
  1017. package/dist/modules/sale_backend/client/invoicing-policy-modal.mjs +2 -0
  1018. package/dist/modules/sale_backend/client/invoicing-policy-modal.mjs.map +7 -0
  1019. package/dist/modules/sale_backend/client/sale-order-modal.d.mts +161 -0
  1020. package/dist/modules/sale_backend/client/sale-order-modal.d.mts.map +1 -0
  1021. package/dist/modules/sale_backend/client/sale-order-modal.mjs +2 -0
  1022. package/dist/modules/sale_backend/client/sale-order-modal.mjs.map +7 -0
  1023. package/dist/modules/sale_backend/index.js +160 -48
  1024. package/dist/modules/sale_backend/index.js.map +1 -1
  1025. package/dist/modules/sale_backend/modal/context.d.ts +4 -0
  1026. package/dist/modules/sale_backend/modal/context.d.ts.map +1 -0
  1027. package/dist/modules/sale_backend/modal/context.js +94 -0
  1028. package/dist/modules/sale_backend/modal/context.js.map +1 -0
  1029. package/dist/modules/sale_backend/modal/order-modal-view.d.ts +18 -0
  1030. package/dist/modules/sale_backend/modal/order-modal-view.d.ts.map +1 -0
  1031. package/dist/modules/sale_backend/modal/order-modal-view.js +289 -0
  1032. package/dist/modules/sale_backend/modal/order-modal-view.js.map +1 -0
  1033. package/dist/modules/sale_backend/modal/policy-context.d.ts +3 -0
  1034. package/dist/modules/sale_backend/modal/policy-context.d.ts.map +1 -0
  1035. package/dist/modules/sale_backend/modal/policy-context.js +26 -0
  1036. package/dist/modules/sale_backend/modal/policy-context.js.map +1 -0
  1037. package/dist/modules/sale_backend/modal/policy-view.d.ts +11 -0
  1038. package/dist/modules/sale_backend/modal/policy-view.d.ts.map +1 -0
  1039. package/dist/modules/sale_backend/modal/policy-view.js +70 -0
  1040. package/dist/modules/sale_backend/modal/policy-view.js.map +1 -0
  1041. package/dist/modules/sale_backend/order-collection.d.ts +7 -0
  1042. package/dist/modules/sale_backend/order-collection.d.ts.map +1 -0
  1043. package/dist/modules/sale_backend/order-collection.js +27 -0
  1044. package/dist/modules/sale_backend/order-collection.js.map +1 -0
  1045. package/dist/modules/sale_backend/screens/invoicing-policies-list.d.ts +1 -1
  1046. package/dist/modules/sale_backend/screens/invoicing-policies-list.d.ts.map +1 -1
  1047. package/dist/modules/sale_backend/screens/invoicing-policies-list.js +10 -14
  1048. package/dist/modules/sale_backend/screens/invoicing-policies-list.js.map +1 -1
  1049. package/dist/modules/sale_backend/screens/invoicing-policy-create.d.ts.map +1 -1
  1050. package/dist/modules/sale_backend/screens/invoicing-policy-create.js +1 -1
  1051. package/dist/modules/sale_backend/screens/invoicing-policy-create.js.map +1 -1
  1052. package/dist/modules/sale_backend/screens/order-detail.d.ts.map +1 -1
  1053. package/dist/modules/sale_backend/screens/order-detail.js +3 -1
  1054. package/dist/modules/sale_backend/screens/order-detail.js.map +1 -1
  1055. package/dist/modules/sale_backend/screens/overview.d.ts +3 -0
  1056. package/dist/modules/sale_backend/screens/overview.d.ts.map +1 -1
  1057. package/dist/modules/sale_backend/screens/overview.js +24 -16
  1058. package/dist/modules/sale_backend/screens/overview.js.map +1 -1
  1059. package/dist/modules/sale_backend/screens/quotation-create.d.ts.map +1 -1
  1060. package/dist/modules/sale_backend/screens/quotation-create.js +1 -1
  1061. package/dist/modules/sale_backend/screens/quotation-create.js.map +1 -1
  1062. package/dist/modules/sale_backend/screens/quotations-list.d.ts +1 -1
  1063. package/dist/modules/sale_backend/screens/quotations-list.d.ts.map +1 -1
  1064. package/dist/modules/sale_backend/screens/quotations-list.js +12 -23
  1065. package/dist/modules/sale_backend/screens/quotations-list.js.map +1 -1
  1066. package/dist/modules/sale_backend/screens/sales-orders-list.d.ts.map +1 -1
  1067. package/dist/modules/sale_backend/screens/sales-orders-list.js +11 -20
  1068. package/dist/modules/sale_backend/screens/sales-orders-list.js.map +1 -1
  1069. package/dist/modules/sale_backend/search-functions.d.ts +4 -0
  1070. package/dist/modules/sale_backend/search-functions.d.ts.map +1 -0
  1071. package/dist/modules/sale_backend/search-functions.js +9 -0
  1072. package/dist/modules/sale_backend/search-functions.js.map +1 -0
  1073. package/dist/modules/sale_backend/search.d.ts +146 -0
  1074. package/dist/modules/sale_backend/search.d.ts.map +1 -0
  1075. package/dist/modules/sale_backend/search.js +112 -0
  1076. package/dist/modules/sale_backend/search.js.map +1 -0
  1077. package/dist/modules/stock/functions/inventory-preview.d.ts +4 -0
  1078. package/dist/modules/stock/functions/inventory-preview.d.ts.map +1 -0
  1079. package/dist/modules/stock/functions/inventory-preview.js +68 -0
  1080. package/dist/modules/stock/functions/inventory-preview.js.map +1 -0
  1081. package/dist/modules/stock/index.d.ts.map +1 -1
  1082. package/dist/modules/stock/index.js +14 -1
  1083. package/dist/modules/stock/index.js.map +1 -1
  1084. package/dist/modules/stock_backend/client/inventory-count-modal.d.mts +60 -0
  1085. package/dist/modules/stock_backend/client/inventory-count-modal.d.mts.map +1 -0
  1086. package/dist/modules/stock_backend/client/inventory-count-modal.mjs +2 -0
  1087. package/dist/modules/stock_backend/client/inventory-count-modal.mjs.map +7 -0
  1088. package/dist/modules/stock_backend/client/stock-configuration-modal.d.mts +105 -0
  1089. package/dist/modules/stock_backend/client/stock-configuration-modal.d.mts.map +1 -0
  1090. package/dist/modules/stock_backend/client/stock-configuration-modal.mjs +2 -0
  1091. package/dist/modules/stock_backend/client/stock-configuration-modal.mjs.map +7 -0
  1092. package/dist/modules/stock_backend/client/stock-transfer-modal.d.mts +130 -0
  1093. package/dist/modules/stock_backend/client/stock-transfer-modal.d.mts.map +1 -0
  1094. package/dist/modules/stock_backend/client/stock-transfer-modal.mjs +2 -0
  1095. package/dist/modules/stock_backend/client/stock-transfer-modal.mjs.map +7 -0
  1096. package/dist/modules/stock_backend/functions/index.d.ts +10 -0
  1097. package/dist/modules/stock_backend/functions/index.d.ts.map +1 -0
  1098. package/dist/modules/stock_backend/functions/index.js +20 -0
  1099. package/dist/modules/stock_backend/functions/index.js.map +1 -0
  1100. package/dist/modules/stock_backend/functions.d.ts +2 -0
  1101. package/dist/modules/stock_backend/functions.d.ts.map +1 -0
  1102. package/dist/modules/stock_backend/functions.js +2 -0
  1103. package/dist/modules/stock_backend/functions.js.map +1 -0
  1104. package/dist/modules/stock_backend/index.js +85 -10
  1105. package/dist/modules/stock_backend/index.js.map +1 -1
  1106. package/dist/modules/stock_backend/islands.d.ts +8 -0
  1107. package/dist/modules/stock_backend/islands.d.ts.map +1 -1
  1108. package/dist/modules/stock_backend/islands.js +41 -0
  1109. package/dist/modules/stock_backend/islands.js.map +1 -1
  1110. package/dist/modules/stock_backend/modal/configuration-context.d.ts +3 -0
  1111. package/dist/modules/stock_backend/modal/configuration-context.d.ts.map +1 -0
  1112. package/dist/modules/stock_backend/modal/configuration-context.js +65 -0
  1113. package/dist/modules/stock_backend/modal/configuration-context.js.map +1 -0
  1114. package/dist/modules/stock_backend/modal/configuration-view.d.ts +21 -0
  1115. package/dist/modules/stock_backend/modal/configuration-view.d.ts.map +1 -0
  1116. package/dist/modules/stock_backend/modal/configuration-view.js +201 -0
  1117. package/dist/modules/stock_backend/modal/configuration-view.js.map +1 -0
  1118. package/dist/modules/stock_backend/modal/configuration.d.ts +20 -0
  1119. package/dist/modules/stock_backend/modal/configuration.d.ts.map +1 -0
  1120. package/dist/modules/stock_backend/modal/configuration.js +117 -0
  1121. package/dist/modules/stock_backend/modal/configuration.js.map +1 -0
  1122. package/dist/modules/stock_backend/modal/inventory-context.d.ts +3 -0
  1123. package/dist/modules/stock_backend/modal/inventory-context.d.ts.map +1 -0
  1124. package/dist/modules/stock_backend/modal/inventory-context.js +37 -0
  1125. package/dist/modules/stock_backend/modal/inventory-context.js.map +1 -0
  1126. package/dist/modules/stock_backend/modal/inventory-view.d.ts +14 -0
  1127. package/dist/modules/stock_backend/modal/inventory-view.d.ts.map +1 -0
  1128. package/dist/modules/stock_backend/modal/inventory-view.js +142 -0
  1129. package/dist/modules/stock_backend/modal/inventory-view.js.map +1 -0
  1130. package/dist/modules/stock_backend/modal/transfer-context.d.ts +3 -0
  1131. package/dist/modules/stock_backend/modal/transfer-context.d.ts.map +1 -0
  1132. package/dist/modules/stock_backend/modal/transfer-context.js +54 -0
  1133. package/dist/modules/stock_backend/modal/transfer-context.js.map +1 -0
  1134. package/dist/modules/stock_backend/modal/transfer-view.d.ts +15 -0
  1135. package/dist/modules/stock_backend/modal/transfer-view.d.ts.map +1 -0
  1136. package/dist/modules/stock_backend/modal/transfer-view.js +252 -0
  1137. package/dist/modules/stock_backend/modal/transfer-view.js.map +1 -0
  1138. package/dist/modules/stock_backend/routes.d.ts.map +1 -1
  1139. package/dist/modules/stock_backend/routes.js +274 -82
  1140. package/dist/modules/stock_backend/routes.js.map +1 -1
  1141. package/dist/modules/stock_backend/screens/forecast.d.ts.map +1 -1
  1142. package/dist/modules/stock_backend/screens/forecast.js +5 -32
  1143. package/dist/modules/stock_backend/screens/forecast.js.map +1 -1
  1144. package/dist/modules/stock_backend/screens/inventory.d.ts +3 -1
  1145. package/dist/modules/stock_backend/screens/inventory.d.ts.map +1 -1
  1146. package/dist/modules/stock_backend/screens/inventory.js +27 -74
  1147. package/dist/modules/stock_backend/screens/inventory.js.map +1 -1
  1148. package/dist/modules/stock_backend/screens/location-create.d.ts.map +1 -1
  1149. package/dist/modules/stock_backend/screens/location-create.js +1 -1
  1150. package/dist/modules/stock_backend/screens/location-create.js.map +1 -1
  1151. package/dist/modules/stock_backend/screens/locations-list.d.ts +1 -1
  1152. package/dist/modules/stock_backend/screens/locations-list.d.ts.map +1 -1
  1153. package/dist/modules/stock_backend/screens/locations-list.js +11 -22
  1154. package/dist/modules/stock_backend/screens/locations-list.js.map +1 -1
  1155. package/dist/modules/stock_backend/screens/lot-create.d.ts.map +1 -1
  1156. package/dist/modules/stock_backend/screens/lot-create.js +1 -1
  1157. package/dist/modules/stock_backend/screens/lot-create.js.map +1 -1
  1158. package/dist/modules/stock_backend/screens/lot-detail.d.ts.map +1 -1
  1159. package/dist/modules/stock_backend/screens/lot-detail.js +3 -2
  1160. package/dist/modules/stock_backend/screens/lot-detail.js.map +1 -1
  1161. package/dist/modules/stock_backend/screens/lots-list.d.ts +1 -1
  1162. package/dist/modules/stock_backend/screens/lots-list.d.ts.map +1 -1
  1163. package/dist/modules/stock_backend/screens/lots-list.js +11 -13
  1164. package/dist/modules/stock_backend/screens/lots-list.js.map +1 -1
  1165. package/dist/modules/stock_backend/screens/overview.d.ts +9 -0
  1166. package/dist/modules/stock_backend/screens/overview.d.ts.map +1 -0
  1167. package/dist/modules/stock_backend/screens/overview.js +38 -0
  1168. package/dist/modules/stock_backend/screens/overview.js.map +1 -0
  1169. package/dist/modules/stock_backend/screens/picking-type-create.d.ts.map +1 -1
  1170. package/dist/modules/stock_backend/screens/picking-type-create.js +1 -1
  1171. package/dist/modules/stock_backend/screens/picking-type-create.js.map +1 -1
  1172. package/dist/modules/stock_backend/screens/picking-types-list.d.ts +1 -1
  1173. package/dist/modules/stock_backend/screens/picking-types-list.d.ts.map +1 -1
  1174. package/dist/modules/stock_backend/screens/picking-types-list.js +11 -22
  1175. package/dist/modules/stock_backend/screens/picking-types-list.js.map +1 -1
  1176. package/dist/modules/stock_backend/screens/replenishment-create.d.ts.map +1 -1
  1177. package/dist/modules/stock_backend/screens/replenishment-create.js +1 -1
  1178. package/dist/modules/stock_backend/screens/replenishment-create.js.map +1 -1
  1179. package/dist/modules/stock_backend/screens/replenishment-list.d.ts +2 -2
  1180. package/dist/modules/stock_backend/screens/replenishment-list.d.ts.map +1 -1
  1181. package/dist/modules/stock_backend/screens/replenishment-list.js +12 -23
  1182. package/dist/modules/stock_backend/screens/replenishment-list.js.map +1 -1
  1183. package/dist/modules/stock_backend/screens/stock-route-create.d.ts.map +1 -1
  1184. package/dist/modules/stock_backend/screens/stock-route-create.js +1 -1
  1185. package/dist/modules/stock_backend/screens/stock-route-create.js.map +1 -1
  1186. package/dist/modules/stock_backend/screens/stock-route-detail.js +2 -1
  1187. package/dist/modules/stock_backend/screens/stock-route-detail.js.map +1 -1
  1188. package/dist/modules/stock_backend/screens/stock-routes-list.d.ts +1 -1
  1189. package/dist/modules/stock_backend/screens/stock-routes-list.d.ts.map +1 -1
  1190. package/dist/modules/stock_backend/screens/stock-routes-list.js +12 -23
  1191. package/dist/modules/stock_backend/screens/stock-routes-list.js.map +1 -1
  1192. package/dist/modules/stock_backend/screens/transfer-create.d.ts.map +1 -1
  1193. package/dist/modules/stock_backend/screens/transfer-create.js +1 -1
  1194. package/dist/modules/stock_backend/screens/transfer-create.js.map +1 -1
  1195. package/dist/modules/stock_backend/screens/transfer-detail.d.ts.map +1 -1
  1196. package/dist/modules/stock_backend/screens/transfer-detail.js +3 -2
  1197. package/dist/modules/stock_backend/screens/transfer-detail.js.map +1 -1
  1198. package/dist/modules/stock_backend/screens/transfers-list.d.ts +1 -1
  1199. package/dist/modules/stock_backend/screens/transfers-list.d.ts.map +1 -1
  1200. package/dist/modules/stock_backend/screens/transfers-list.js +12 -23
  1201. package/dist/modules/stock_backend/screens/transfers-list.js.map +1 -1
  1202. package/dist/modules/stock_backend/screens/warehouse-create.d.ts.map +1 -1
  1203. package/dist/modules/stock_backend/screens/warehouse-create.js +1 -1
  1204. package/dist/modules/stock_backend/screens/warehouse-create.js.map +1 -1
  1205. package/dist/modules/stock_backend/screens/warehouses-list.d.ts +1 -1
  1206. package/dist/modules/stock_backend/screens/warehouses-list.d.ts.map +1 -1
  1207. package/dist/modules/stock_backend/screens/warehouses-list.js +11 -22
  1208. package/dist/modules/stock_backend/screens/warehouses-list.js.map +1 -1
  1209. package/dist/modules/stock_backend/search.d.ts +286 -0
  1210. package/dist/modules/stock_backend/search.d.ts.map +1 -0
  1211. package/dist/modules/stock_backend/search.js +371 -0
  1212. package/dist/modules/stock_backend/search.js.map +1 -0
  1213. package/dist/modules/storage/functions.d.ts.map +1 -1
  1214. package/dist/modules/storage/functions.js +28 -5
  1215. package/dist/modules/storage/functions.js.map +1 -1
  1216. package/dist/modules/storage/jobs.d.ts.map +1 -1
  1217. package/dist/modules/storage/jobs.js +120 -2
  1218. package/dist/modules/storage/jobs.js.map +1 -1
  1219. package/dist/modules/storage/models.d.ts.map +1 -1
  1220. package/dist/modules/storage/models.js +21 -0
  1221. package/dist/modules/storage/models.js.map +1 -1
  1222. package/dist/modules/storage/policy.d.ts +27 -0
  1223. package/dist/modules/storage/policy.d.ts.map +1 -1
  1224. package/dist/modules/storage/policy.js +14 -0
  1225. package/dist/modules/storage/policy.js.map +1 -1
  1226. package/dist/modules/storage/routes.d.ts +1 -0
  1227. package/dist/modules/storage/routes.d.ts.map +1 -1
  1228. package/dist/modules/storage/routes.js +36 -10
  1229. package/dist/modules/storage/routes.js.map +1 -1
  1230. package/dist/modules/user/access-denial.d.ts +3 -0
  1231. package/dist/modules/user/access-denial.d.ts.map +1 -0
  1232. package/dist/modules/user/access-denial.js +34 -0
  1233. package/dist/modules/user/access-denial.js.map +1 -0
  1234. package/dist/modules/user/access-policy.d.ts +16 -0
  1235. package/dist/modules/user/access-policy.d.ts.map +1 -0
  1236. package/dist/modules/user/access-policy.js +455 -0
  1237. package/dist/modules/user/access-policy.js.map +1 -0
  1238. package/dist/modules/user/access-surfaces.d.ts +26 -0
  1239. package/dist/modules/user/access-surfaces.d.ts.map +1 -0
  1240. package/dist/modules/user/access-surfaces.js +76 -0
  1241. package/dist/modules/user/access-surfaces.js.map +1 -0
  1242. package/dist/modules/user/authorization.d.ts +12 -1
  1243. package/dist/modules/user/authorization.d.ts.map +1 -1
  1244. package/dist/modules/user/authorization.js +342 -36
  1245. package/dist/modules/user/authorization.js.map +1 -1
  1246. package/dist/modules/user/functions.d.ts.map +1 -1
  1247. package/dist/modules/user/functions.js +26 -3
  1248. package/dist/modules/user/functions.js.map +1 -1
  1249. package/dist/modules/user/index.d.ts.map +1 -1
  1250. package/dist/modules/user/index.js +13 -1
  1251. package/dist/modules/user/index.js.map +1 -1
  1252. package/dist/modules/user/modal-labels.d.ts +3 -0
  1253. package/dist/modules/user/modal-labels.d.ts.map +1 -0
  1254. package/dist/modules/user/modal-labels.js +30 -0
  1255. package/dist/modules/user/modal-labels.js.map +1 -0
  1256. package/dist/modules/user/modal-messages.d.ts +4 -0
  1257. package/dist/modules/user/modal-messages.d.ts.map +1 -0
  1258. package/dist/modules/user/modal-messages.js +15 -0
  1259. package/dist/modules/user/modal-messages.js.map +1 -0
  1260. package/dist/modules/user/models.d.ts.map +1 -1
  1261. package/dist/modules/user/models.js +48 -0
  1262. package/dist/modules/user/models.js.map +1 -1
  1263. package/dist/modules/user/permission-areas.d.ts +20 -0
  1264. package/dist/modules/user/permission-areas.d.ts.map +1 -0
  1265. package/dist/modules/user/permission-areas.js +89 -0
  1266. package/dist/modules/user/permission-areas.js.map +1 -0
  1267. package/dist/modules/user/policy-jobs.d.ts +4 -0
  1268. package/dist/modules/user/policy-jobs.d.ts.map +1 -0
  1269. package/dist/modules/user/policy-jobs.js +15 -0
  1270. package/dist/modules/user/policy-jobs.js.map +1 -0
  1271. package/dist/modules/user/role-modal-context.d.ts +3 -0
  1272. package/dist/modules/user/role-modal-context.d.ts.map +1 -0
  1273. package/dist/modules/user/role-modal-context.js +264 -0
  1274. package/dist/modules/user/role-modal-context.js.map +1 -0
  1275. package/dist/modules/user/roles.d.ts.map +1 -1
  1276. package/dist/modules/user/roles.js +2 -0
  1277. package/dist/modules/user/roles.js.map +1 -1
  1278. package/dist/modules/user/user-modal-context.d.ts +5 -1
  1279. package/dist/modules/user/user-modal-context.d.ts.map +1 -1
  1280. package/dist/modules/user/user-modal-context.js +227 -31
  1281. package/dist/modules/user/user-modal-context.js.map +1 -1
  1282. package/dist/modules/user_backend/access-options.d.ts +25 -0
  1283. package/dist/modules/user_backend/access-options.d.ts.map +1 -0
  1284. package/dist/modules/user_backend/access-options.js +38 -0
  1285. package/dist/modules/user_backend/access-options.js.map +1 -0
  1286. package/dist/modules/user_backend/access-policy-routes.d.ts +3 -0
  1287. package/dist/modules/user_backend/access-policy-routes.d.ts.map +1 -0
  1288. package/dist/modules/user_backend/access-policy-routes.js +76 -0
  1289. package/dist/modules/user_backend/access-policy-routes.js.map +1 -0
  1290. package/dist/modules/user_backend/client/access-policy-modal.d.mts +123 -0
  1291. package/dist/modules/user_backend/client/access-policy-modal.d.mts.map +1 -0
  1292. package/dist/modules/user_backend/client/access-policy-modal.mjs +2 -0
  1293. package/dist/modules/user_backend/client/access-policy-modal.mjs.map +7 -0
  1294. package/dist/modules/user_backend/client/role-modal.d.mts +103 -0
  1295. package/dist/modules/user_backend/client/role-modal.d.mts.map +1 -0
  1296. package/dist/modules/user_backend/client/role-modal.mjs +2 -0
  1297. package/dist/modules/user_backend/client/role-modal.mjs.map +7 -0
  1298. package/dist/modules/user_backend/client/user-modal.d.mts +160 -7
  1299. package/dist/modules/user_backend/client/user-modal.d.mts.map +1 -1
  1300. package/dist/modules/user_backend/client/user-modal.mjs +1 -1
  1301. package/dist/modules/user_backend/client/user-modal.mjs.map +4 -4
  1302. package/dist/modules/user_backend/index.d.ts +2 -2
  1303. package/dist/modules/user_backend/index.d.ts.map +1 -1
  1304. package/dist/modules/user_backend/index.js +4 -2
  1305. package/dist/modules/user_backend/index.js.map +1 -1
  1306. package/dist/modules/user_backend/islands.d.ts +14 -1
  1307. package/dist/modules/user_backend/islands.d.ts.map +1 -1
  1308. package/dist/modules/user_backend/islands.js +11 -3
  1309. package/dist/modules/user_backend/islands.js.map +1 -1
  1310. package/dist/modules/user_backend/managed-role-routes.d.ts +3 -0
  1311. package/dist/modules/user_backend/managed-role-routes.d.ts.map +1 -0
  1312. package/dist/modules/user_backend/managed-role-routes.js +44 -0
  1313. package/dist/modules/user_backend/managed-role-routes.js.map +1 -0
  1314. package/dist/modules/user_backend/menus.d.ts.map +1 -1
  1315. package/dist/modules/user_backend/menus.js +9 -7
  1316. package/dist/modules/user_backend/menus.js.map +1 -1
  1317. package/dist/modules/user_backend/messages.d.ts +508 -6
  1318. package/dist/modules/user_backend/messages.d.ts.map +1 -1
  1319. package/dist/modules/user_backend/messages.js +546 -44
  1320. package/dist/modules/user_backend/messages.js.map +1 -1
  1321. package/dist/modules/user_backend/modal/access-policy-modal-view.d.ts +43 -0
  1322. package/dist/modules/user_backend/modal/access-policy-modal-view.d.ts.map +1 -0
  1323. package/dist/modules/user_backend/modal/access-policy-modal-view.js +384 -0
  1324. package/dist/modules/user_backend/modal/access-policy-modal-view.js.map +1 -0
  1325. package/dist/modules/user_backend/modal/access-surfaces.d.ts +51 -0
  1326. package/dist/modules/user_backend/modal/access-surfaces.d.ts.map +1 -0
  1327. package/dist/modules/user_backend/modal/access-surfaces.js +138 -0
  1328. package/dist/modules/user_backend/modal/access-surfaces.js.map +1 -0
  1329. package/dist/modules/user_backend/modal/role-modal-view.d.ts +48 -0
  1330. package/dist/modules/user_backend/modal/role-modal-view.d.ts.map +1 -0
  1331. package/dist/modules/user_backend/modal/role-modal-view.js +488 -0
  1332. package/dist/modules/user_backend/modal/role-modal-view.js.map +1 -0
  1333. package/dist/modules/user_backend/modal/user-modal-view.d.ts +45 -0
  1334. package/dist/modules/user_backend/modal/user-modal-view.d.ts.map +1 -1
  1335. package/dist/modules/user_backend/modal/user-modal-view.js +1317 -71
  1336. package/dist/modules/user_backend/modal/user-modal-view.js.map +1 -1
  1337. package/dist/modules/user_backend/routes.d.ts.map +1 -1
  1338. package/dist/modules/user_backend/routes.js +109 -571
  1339. package/dist/modules/user_backend/routes.js.map +1 -1
  1340. package/dist/modules/user_backend/screens/access-policies-list.d.ts +31 -0
  1341. package/dist/modules/user_backend/screens/access-policies-list.d.ts.map +1 -0
  1342. package/dist/modules/user_backend/screens/access-policies-list.js +54 -0
  1343. package/dist/modules/user_backend/screens/access-policies-list.js.map +1 -0
  1344. package/dist/modules/user_backend/screens/index.d.ts +1 -3
  1345. package/dist/modules/user_backend/screens/index.d.ts.map +1 -1
  1346. package/dist/modules/user_backend/screens/index.js +2 -3
  1347. package/dist/modules/user_backend/screens/index.js.map +1 -1
  1348. package/dist/modules/user_backend/screens/profile-form.d.ts.map +1 -1
  1349. package/dist/modules/user_backend/screens/profile-form.js +1 -1
  1350. package/dist/modules/user_backend/screens/profile-form.js.map +1 -1
  1351. package/dist/modules/user_backend/screens/roles-list.d.ts +9 -3
  1352. package/dist/modules/user_backend/screens/roles-list.d.ts.map +1 -1
  1353. package/dist/modules/user_backend/screens/roles-list.js +15 -23
  1354. package/dist/modules/user_backend/screens/roles-list.js.map +1 -1
  1355. package/dist/modules/user_backend/screens/users-list.d.ts +7 -5
  1356. package/dist/modules/user_backend/screens/users-list.d.ts.map +1 -1
  1357. package/dist/modules/user_backend/screens/users-list.js +29 -21
  1358. package/dist/modules/user_backend/screens/users-list.js.map +1 -1
  1359. package/dist/modules/user_backend/search-functions.d.ts +4 -0
  1360. package/dist/modules/user_backend/search-functions.d.ts.map +1 -0
  1361. package/dist/modules/user_backend/search-functions.js +13 -0
  1362. package/dist/modules/user_backend/search-functions.js.map +1 -0
  1363. package/dist/modules/user_backend/search.d.ts +128 -0
  1364. package/dist/modules/user_backend/search.d.ts.map +1 -0
  1365. package/dist/modules/user_backend/search.js +131 -0
  1366. package/dist/modules/user_backend/search.js.map +1 -0
  1367. package/dist/modules/website/cms.d.ts.map +1 -1
  1368. package/dist/modules/website/cms.js +17 -7
  1369. package/dist/modules/website/cms.js.map +1 -1
  1370. package/dist/modules/website/customer.d.ts +61 -1
  1371. package/dist/modules/website/customer.d.ts.map +1 -1
  1372. package/dist/modules/website/customer.js +197 -15
  1373. package/dist/modules/website/customer.js.map +1 -1
  1374. package/dist/modules/website/index.d.ts.map +1 -1
  1375. package/dist/modules/website/index.js +16 -2
  1376. package/dist/modules/website/index.js.map +1 -1
  1377. package/dist/modules/website/models.d.ts.map +1 -1
  1378. package/dist/modules/website/models.js +15 -0
  1379. package/dist/modules/website/models.js.map +1 -1
  1380. package/dist/modules/website/publication.d.ts.map +1 -1
  1381. package/dist/modules/website/publication.js +11 -5
  1382. package/dist/modules/website/publication.js.map +1 -1
  1383. package/dist/modules/website_backend/collection.d.ts +12 -0
  1384. package/dist/modules/website_backend/collection.d.ts.map +1 -0
  1385. package/dist/modules/website_backend/collection.js +17 -0
  1386. package/dist/modules/website_backend/collection.js.map +1 -0
  1387. package/dist/modules/website_backend/functions.d.ts +10 -0
  1388. package/dist/modules/website_backend/functions.d.ts.map +1 -0
  1389. package/dist/modules/website_backend/functions.js +37 -0
  1390. package/dist/modules/website_backend/functions.js.map +1 -0
  1391. package/dist/modules/website_backend/index.js +2 -0
  1392. package/dist/modules/website_backend/index.js.map +1 -1
  1393. package/dist/modules/website_backend/routes.d.ts.map +1 -1
  1394. package/dist/modules/website_backend/routes.js +124 -29
  1395. package/dist/modules/website_backend/routes.js.map +1 -1
  1396. package/dist/modules/website_backend/screens/index.d.ts +4 -8
  1397. package/dist/modules/website_backend/screens/index.d.ts.map +1 -1
  1398. package/dist/modules/website_backend/screens/index.js +685 -666
  1399. package/dist/modules/website_backend/screens/index.js.map +1 -1
  1400. package/dist/modules/website_backend/screens/page-frame.d.ts +7 -5
  1401. package/dist/modules/website_backend/screens/page-frame.d.ts.map +1 -1
  1402. package/dist/modules/website_backend/screens/page-frame.js +3 -3
  1403. package/dist/modules/website_backend/screens/page-frame.js.map +1 -1
  1404. package/dist/modules/website_backend/search.d.ts +125 -0
  1405. package/dist/modules/website_backend/search.d.ts.map +1 -0
  1406. package/dist/modules/website_backend/search.js +135 -0
  1407. package/dist/modules/website_backend/search.js.map +1 -0
  1408. package/dist/permission-catalogue.d.ts.map +1 -1
  1409. package/dist/permission-catalogue.js +180 -24
  1410. package/dist/permission-catalogue.js.map +1 -1
  1411. package/dist/phone.d.ts +32 -0
  1412. package/dist/phone.d.ts.map +1 -0
  1413. package/dist/phone.js +101 -0
  1414. package/dist/phone.js.map +1 -0
  1415. package/dist/role-templates.d.ts +79 -0
  1416. package/dist/role-templates.d.ts.map +1 -0
  1417. package/dist/role-templates.js +212 -0
  1418. package/dist/role-templates.js.map +1 -0
  1419. package/dist/scaffold/index.d.ts +1 -1
  1420. package/dist/scaffold/index.d.ts.map +1 -1
  1421. package/dist/scaffold/index.js +10 -5
  1422. package/dist/scaffold/index.js.map +1 -1
  1423. package/dist/scaffold/templates/README.md.tmpl +2 -1
  1424. package/dist/scaffold/templates/ket.workspace.mjs.tmpl +4 -1
  1425. package/dist/scaffold/templates/package.json.tmpl +2 -2
  1426. package/dist/ui/actions.d.ts +2 -0
  1427. package/dist/ui/actions.d.ts.map +1 -1
  1428. package/dist/ui/actions.js +1 -1
  1429. package/dist/ui/actions.js.map +1 -1
  1430. package/dist/ui/chrome.d.ts +19 -6
  1431. package/dist/ui/chrome.d.ts.map +1 -1
  1432. package/dist/ui/chrome.js +12 -7
  1433. package/dist/ui/chrome.js.map +1 -1
  1434. package/dist/ui/client/bulk-selection.d.ts +7 -0
  1435. package/dist/ui/client/bulk-selection.d.ts.map +1 -0
  1436. package/dist/ui/client/bulk-selection.js +67 -0
  1437. package/dist/ui/client/bulk-selection.js.map +1 -0
  1438. package/dist/ui/client/ket-table-view.d.ts +3 -0
  1439. package/dist/ui/client/ket-table-view.d.ts.map +1 -0
  1440. package/dist/ui/client/ket-table-view.js +27 -0
  1441. package/dist/ui/client/ket-table-view.js.map +1 -0
  1442. package/dist/ui/client/live-doc-shell.d.ts +66 -2
  1443. package/dist/ui/client/live-doc-shell.d.ts.map +1 -1
  1444. package/dist/ui/client/live-doc-shell.js +83 -6
  1445. package/dist/ui/client/live-doc-shell.js.map +1 -1
  1446. package/dist/ui/client/live-doc-tail.d.ts +4 -0
  1447. package/dist/ui/client/live-doc-tail.d.ts.map +1 -0
  1448. package/dist/ui/client/live-doc-tail.js +21 -0
  1449. package/dist/ui/client/live-doc-tail.js.map +1 -0
  1450. package/dist/ui/client/live-doc-view.d.ts +47 -1
  1451. package/dist/ui/client/live-doc-view.d.ts.map +1 -1
  1452. package/dist/ui/client/live-doc-view.js +318 -5
  1453. package/dist/ui/client/live-doc-view.js.map +1 -1
  1454. package/dist/ui/client/live-doc.css +81 -0
  1455. package/dist/ui/client/live-doc.d.mts +11 -4
  1456. package/dist/ui/client/live-doc.d.mts.map +1 -1
  1457. package/dist/ui/client/live-doc.mjs +14 -10
  1458. package/dist/ui/client/live-doc.mjs.map +4 -4
  1459. package/dist/ui/client/record-modal-form.d.ts +34 -0
  1460. package/dist/ui/client/record-modal-form.d.ts.map +1 -1
  1461. package/dist/ui/client/record-modal-form.js +17 -1
  1462. package/dist/ui/client/record-modal-form.js.map +1 -1
  1463. package/dist/ui/client/record-modal.d.ts +56 -6
  1464. package/dist/ui/client/record-modal.d.ts.map +1 -1
  1465. package/dist/ui/client/record-modal.js +235 -39
  1466. package/dist/ui/client/record-modal.js.map +1 -1
  1467. package/dist/ui/client/search-filter-view.d.ts +2 -0
  1468. package/dist/ui/client/search-filter-view.d.ts.map +1 -0
  1469. package/dist/ui/client/search-filter-view.js +6 -0
  1470. package/dist/ui/client/search-filter-view.js.map +1 -0
  1471. package/dist/ui/client/table-selection-view.d.ts.map +1 -1
  1472. package/dist/ui/client/table-selection-view.js +33 -16
  1473. package/dist/ui/client/table-selection-view.js.map +1 -1
  1474. package/dist/ui/client/user-modal-client.d.ts +6 -0
  1475. package/dist/ui/client/user-modal-client.d.ts.map +1 -0
  1476. package/dist/ui/client/user-modal-client.js +4 -0
  1477. package/dist/ui/client/user-modal-client.js.map +1 -0
  1478. package/dist/ui/client/user-workflow.d.ts.map +1 -1
  1479. package/dist/ui/client/user-workflow.js +4 -3
  1480. package/dist/ui/client/user-workflow.js.map +1 -1
  1481. package/dist/ui/client/variant-attribute-create.d.ts +19 -0
  1482. package/dist/ui/client/variant-attribute-create.d.ts.map +1 -0
  1483. package/dist/ui/client/variant-attribute-create.js +177 -0
  1484. package/dist/ui/client/variant-attribute-create.js.map +1 -0
  1485. package/dist/ui/client/variant-editor-view.d.ts +72 -0
  1486. package/dist/ui/client/variant-editor-view.d.ts.map +1 -0
  1487. package/dist/ui/client/variant-editor-view.js +943 -0
  1488. package/dist/ui/client/variant-editor-view.js.map +1 -0
  1489. package/dist/ui/collection-state.d.ts +11 -0
  1490. package/dist/ui/collection-state.d.ts.map +1 -0
  1491. package/dist/ui/collection-state.js +45 -0
  1492. package/dist/ui/collection-state.js.map +1 -0
  1493. package/dist/ui/collection.d.ts +23 -0
  1494. package/dist/ui/collection.d.ts.map +1 -0
  1495. package/dist/ui/collection.js +118 -0
  1496. package/dist/ui/collection.js.map +1 -0
  1497. package/dist/ui/form.d.ts +1 -1
  1498. package/dist/ui/form.d.ts.map +1 -1
  1499. package/dist/ui/form.js +1 -1
  1500. package/dist/ui/form.js.map +1 -1
  1501. package/dist/ui/index.d.ts +3 -1
  1502. package/dist/ui/index.d.ts.map +1 -1
  1503. package/dist/ui/index.js +3 -1
  1504. package/dist/ui/index.js.map +1 -1
  1505. package/dist/ui/layout.d.ts +8 -9
  1506. package/dist/ui/layout.d.ts.map +1 -1
  1507. package/dist/ui/layout.js +27 -12
  1508. package/dist/ui/layout.js.map +1 -1
  1509. package/dist/ui/list-page.d.ts +4 -2
  1510. package/dist/ui/list-page.d.ts.map +1 -1
  1511. package/dist/ui/list-page.js +29 -4
  1512. package/dist/ui/list-page.js.map +1 -1
  1513. package/dist/ui/nav.d.ts +2 -3
  1514. package/dist/ui/nav.d.ts.map +1 -1
  1515. package/dist/ui/nav.js +4 -8
  1516. package/dist/ui/nav.js.map +1 -1
  1517. package/dist/ui/navigation.d.ts +1 -0
  1518. package/dist/ui/navigation.d.ts.map +1 -1
  1519. package/dist/ui/navigation.js +3 -3
  1520. package/dist/ui/navigation.js.map +1 -1
  1521. package/dist/ui/table.d.ts +2 -0
  1522. package/dist/ui/table.d.ts.map +1 -1
  1523. package/dist/ui/table.js +24 -0
  1524. package/dist/ui/table.js.map +1 -1
  1525. package/dist/ui/user-workflow.d.ts +2 -1
  1526. package/dist/ui/user-workflow.d.ts.map +1 -1
  1527. package/dist/ui/user-workflow.js +44 -29
  1528. package/dist/ui/user-workflow.js.map +1 -1
  1529. package/package.json +14 -4
  1530. package/dist/modules/flow/functions.d.ts.map +0 -1
  1531. package/dist/modules/flow/functions.js +0 -1876
  1532. package/dist/modules/flow/functions.js.map +0 -1
  1533. package/dist/modules/flow/operations.d.ts +0 -414
  1534. package/dist/modules/flow/operations.d.ts.map +0 -1
  1535. package/dist/modules/flow/operations.js +0 -1671
  1536. package/dist/modules/flow/operations.js.map +0 -1
  1537. package/dist/modules/user_backend/access-routes.d.ts +0 -31
  1538. package/dist/modules/user_backend/access-routes.d.ts.map +0 -1
  1539. package/dist/modules/user_backend/access-routes.js +0 -447
  1540. package/dist/modules/user_backend/access-routes.js.map +0 -1
  1541. package/dist/modules/user_backend/screens/presets-form.d.ts +0 -16
  1542. package/dist/modules/user_backend/screens/presets-form.d.ts.map +0 -1
  1543. package/dist/modules/user_backend/screens/presets-form.js +0 -37
  1544. package/dist/modules/user_backend/screens/presets-form.js.map +0 -1
  1545. package/dist/modules/user_backend/screens/role-form.d.ts +0 -21
  1546. package/dist/modules/user_backend/screens/role-form.d.ts.map +0 -1
  1547. package/dist/modules/user_backend/screens/role-form.js +0 -93
  1548. package/dist/modules/user_backend/screens/role-form.js.map +0 -1
  1549. package/dist/modules/user_backend/screens/user-form.d.ts +0 -56
  1550. package/dist/modules/user_backend/screens/user-form.d.ts.map +0 -1
  1551. package/dist/modules/user_backend/screens/user-form.js +0 -202
  1552. package/dist/modules/user_backend/screens/user-form.js.map +0 -1
  1553. package/dist/ui/client/relation-select-view.d.ts +0 -77
  1554. package/dist/ui/client/relation-select-view.d.ts.map +0 -1
  1555. package/dist/ui/client/relation-select-view.js +0 -216
  1556. package/dist/ui/client/relation-select-view.js.map +0 -1
  1557. /package/dist/modules/{flow → product_backend}/functions.d.ts +0 -0
@@ -1,1876 +0,0 @@
1
- import { randomUUID } from 'node:crypto';
2
- import { deleteFrom, defineFn, desc, eq, from, inArray } from '@ketvietlab/ketjs';
3
- import { FIELD_KINDS } from './types.js';
4
- import { actorRequired, addComment, bulkIssues, copyIssue, epicTotals, sprintTotals, archiveIssue, restoreIssue, startFollowing, stopFollowing, addDependency, assignSprint, closeSprint, deleteSprint, commandKey, dependenciesFor, groupIssues, issueBuckets, issue, invalid, issueDetail, listIssues, moveIssue, n, normalized, saveIssue, startSprint, transferIssue, } from './operations.js';
5
- import { emptyIssueListState } from './search.js';
6
- import { addMember, canReadProject, membersOf, readableProject, readableRow, removeMember, visibleProjects, visibleRows, } from './membership.js';
7
- import { projectsWithMyWork, projectStateOf, projectStats } from './projects.js';
8
- import { archivePage, listAllPages, listPages, movePage, pageDetail, reorderPage, restorePage, savePage, } from './pages.js';
9
- /**
10
- * What passing the membership gate costs in effects.
11
- *
12
- * Spread into every command that touches a project's data. Named because it is
13
- * not a capability one function happens to need — it is the condition all of
14
- * them read under, and a list copied at thirty call sites is a list that will
15
- * disagree with itself.
16
- */
17
- const membershipEffects = [
18
- 'read:flow.Project',
19
- 'read:flow.ProjectMember',
20
- 'read:flow.ProjectAccessGrant',
21
- 'read:user.User',
22
- ];
23
- const flowReadEffects = [
24
- 'read:flow.Project',
25
- // The membership gate every Flow read now passes through — see membership.ts.
26
- // Named here rather than at each call site because it is not a capability one
27
- // function happens to need; it is the condition all of them read under.
28
- 'read:flow.ProjectMember',
29
- 'read:flow.ProjectAccessGrant',
30
- 'read:flow.Column',
31
- 'read:flow.IssueType',
32
- 'read:flow.FieldDef',
33
- 'read:mail.Follower',
34
- 'read:flow.IssueFieldValue',
35
- 'read:flow.Epic',
36
- 'read:flow.Sprint',
37
- 'read:flow.Issue',
38
- 'read:flow.IssueDependency',
39
- 'read:flow.Tag',
40
- 'read:flow.IssueTag',
41
- 'read:user.User',
42
- 'read:mail.Thread',
43
- 'read:mail.Message',
44
- ];
45
- /**
46
- * What writing one system entry to an issue's thread costs in effects.
47
- *
48
- * `postMessage` resolves the author, addresses the followers and writes the
49
- * notification, so a command that leaves a timeline entry touches the same mail
50
- * tables a comment does. Named here because three commands now do it.
51
- */
52
- const timelineEntryEffects = [
53
- 'read:mail.Thread',
54
- 'read:mail.Follower',
55
- 'write:mail.Follower',
56
- 'read:mail.FollowerSubtype',
57
- 'write:mail.FollowerSubtype',
58
- 'read:mail.Subtype',
59
- 'write:mail.Message',
60
- 'write:mail.TrackingValue',
61
- 'write:mail.Notification',
62
- 'read:user.User',
63
- 'read:partner.Partner',
64
- ];
65
- const issueWriteEffects = [
66
- ...flowReadEffects,
67
- 'write:flow.Issue',
68
- 'write:flow.IssueTag',
69
- 'write:flow.IssueFieldValue',
70
- 'write:mail.Thread',
71
- // Saving an issue now subscribes its author and its assignee to the thread,
72
- // and writes a system entry when it changes hands — so it touches the same
73
- // mail tables a comment does.
74
- 'read:mail.Follower',
75
- 'write:mail.Follower',
76
- 'read:mail.FollowerSubtype',
77
- 'write:mail.FollowerSubtype',
78
- 'read:mail.Subtype',
79
- 'write:mail.Message',
80
- 'write:mail.Mention',
81
- 'write:mail.MessageAttachment',
82
- 'write:mail.TrackingValue',
83
- 'write:mail.Notification',
84
- 'read:partner.Partner',
85
- ];
86
- const commentEffects = [
87
- 'read:flow.Issue',
88
- 'read:mail.Thread',
89
- 'write:mail.Thread',
90
- 'read:mail.Message',
91
- 'write:mail.Message',
92
- 'read:mail.Follower',
93
- 'read:mail.FollowerSubtype',
94
- 'read:mail.Subtype',
95
- 'write:mail.Mention',
96
- 'write:mail.MessageAttachment',
97
- 'write:mail.TrackingValue',
98
- 'write:mail.Notification',
99
- 'write:mail.Follower',
100
- 'write:mail.FollowerSubtype',
101
- 'read:user.User',
102
- 'read:partner.Partner',
103
- ];
104
- const command = (ctx, key) => {
105
- if (!actorRequired(ctx))
106
- return invalid(issue('actor', 'flow.error.actorRequired'));
107
- if (!commandKey(key))
108
- return invalid(issue('idempotencyKey', 'flow.error.idempotencyRequired'));
109
- return null;
110
- };
111
- /** Small pickers read this shape: active first, filtered by name, capped to a page. */
112
- const optionRows = async (ctx, model, args, order) => {
113
- const rows = await ctx.db.select(model, args.includeArchived === true ? {} : { active: true });
114
- const needle = normalized(args.search);
115
- return rows
116
- .filter((row) => !needle || normalized(row.name).includes(needle) || normalized(row.code).includes(needle))
117
- .sort((a, b) => (order ? order(a, b) : 0) ||
118
- String(a.name ?? '').localeCompare(String(b.name ?? '')) ||
119
- String(a.id).localeCompare(String(b.id)))
120
- .slice(Math.max(0, n(args.cursor ?? 0)), Math.max(0, n(args.cursor ?? 0)) + Math.max(1, Math.min(200, n(args.limit ?? 80))));
121
- };
122
- /**
123
- * How many rows `optionRows` would have to choose from, before the page.
124
- *
125
- * The same read and the same filter, stopping short of the slice. Separate
126
- * rather than folded into `optionRows` because every caller of that wants an
127
- * array and only the list screens want a figure — and a screen that shows the
128
- * length of its own page as the total is a screen that lies the moment there
129
- * is a second page (FLW-039).
130
- */
131
- const optionCount = async (ctx, model, args, keep = () => true) => {
132
- const rows = await ctx.db.select(model, args.includeArchived === true ? {} : { active: true });
133
- const needle = normalized(args.search);
134
- return rows.filter((row) => keep(row) &&
135
- (!needle || normalized(row.name).includes(needle) || normalized(row.code).includes(needle))).length;
136
- };
137
- /** Plain upsert for the entities with no CAS field — no concurrent editor to race against. */
138
- const saveEntity = (model, fields, required, defaults) => defineFn({
139
- input: { values: 'json', idempotencyKey: 'text' },
140
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
141
- effects: [
142
- `read:${model}`,
143
- `write:${model}`,
144
- 'read:flow.Project',
145
- 'write:flow.ProjectMember',
146
- 'read:flow.ProjectMember',
147
- 'read:flow.ProjectAccessGrant',
148
- 'read:user.User',
149
- ],
150
- idempotent: true,
151
- agent: true,
152
- handler: async (ctx, args) => {
153
- const error = command(ctx, args.idempotencyKey);
154
- if (error)
155
- return error;
156
- if (!args.values || typeof args.values !== 'object')
157
- return invalid(issue('values', 'flow.error.required'));
158
- const values = args.values;
159
- const id = String(values.id ?? '');
160
- if (!id)
161
- return invalid(issue('id', 'flow.error.required'));
162
- // Two shapes, one rule. A project's own row is named by its id; everything
163
- // else this builds — columns, issue types, epics — names its project in a
164
- // column. Either way, writing into a project a caller cannot see is the
165
- // thing this refuses, and it refuses it as "not found".
166
- const target = model === 'flow.Project' ? id : String(values.projectId ?? '');
167
- const existing = (await ctx.db.select(model, { id }))[0];
168
- const known = model === 'flow.Project' ? Boolean(existing) : true;
169
- if (known && target && !(await canReadProject(ctx, target)))
170
- return invalid(issue('id', 'flow.error.notFound'));
171
- const cs = ctx
172
- .change(model, { ...defaults(values, existing), ...values }, existing ?? null)
173
- .cast(fields);
174
- const withRequired = required.length ? cs.required(required) : cs;
175
- if (!withRequired.valid)
176
- return { ok: false, errors: withRequired.errors };
177
- await ctx.db.commit(withRequired, existing ? { id } : undefined);
178
- // A project nobody can see is not a project anybody asked for, and there
179
- // is no other door: membership is what makes it visible, so the person
180
- // who created it has to walk through first.
181
- if (model === 'flow.Project' && !existing && ctx.actor)
182
- await addMember(ctx, {
183
- projectId: id,
184
- userId: ctx.actor,
185
- addedByUserId: ctx.actor,
186
- at: new Date().toISOString(),
187
- });
188
- return { ok: true, id };
189
- },
190
- });
191
- export const functions = {
192
- 'project.list': defineFn({
193
- input: {
194
- search: 'text?',
195
- limit: 'int?',
196
- includeArchived: 'bool?',
197
- /** Where in the ordered list this page starts — see project.count. */
198
- cursor: 'int?',
199
- /** Only projects the caller has an issue in — see the note on projectsWithMyWork. */
200
- mine: 'bool?',
201
- },
202
- output: { id: 'id', key: 'text', name: 'text', description: 'text?', active: 'bool' },
203
- effects: [
204
- 'read:flow.Project',
205
- 'read:flow.Issue',
206
- 'read:flow.ProjectMember',
207
- 'read:flow.ProjectAccessGrant',
208
- 'read:user.User',
209
- ],
210
- agent: true,
211
- handler: async (ctx, args) => {
212
- // Membership first, then the caller's own `mine` filter. They answer
213
- // different questions — "which projects exist for me" and "which of those
214
- // am I carrying work in" — and only the first one is a rule.
215
- const visible = await visibleProjects(ctx);
216
- const rows = (await optionRows(ctx, 'flow.Project', args)).filter((row) => visible === null || visible.includes(String(row.id)));
217
- if (args.mine !== true)
218
- return rows;
219
- const mine = await projectsWithMyWork(ctx);
220
- return rows.filter((row) => mine.has(String(row.id)));
221
- },
222
- }),
223
- /**
224
- * Who is on a project.
225
- *
226
- * Reading the membership of a project is reading the project, so it is gated
227
- * the same way: somebody who cannot see the project cannot see who is on it,
228
- * and finds out nothing by asking.
229
- */
230
- 'project.member.list': defineFn({
231
- input: { projectId: 'id' },
232
- output: { id: 'id', projectId: 'id', userId: 'id', userName: 'text', addedAt: 'datetime' },
233
- effects: [...membershipEffects],
234
- agent: true,
235
- handler: async (ctx, args) => {
236
- if (!(await canReadProject(ctx, args.projectId)))
237
- return [];
238
- return membersOf(ctx, String(args.projectId));
239
- },
240
- }),
241
- /**
242
- * Put somebody on a project, or take them off.
243
- *
244
- * Configuration rather than everyday work: adding a person decides what they
245
- * may read, which is a different act from moving their cards around. The
246
- * caller has to be able to see the project first — you cannot staff a project
247
- * you are not on unless you hold the company-wide grant.
248
- */
249
- 'project.member.add': defineFn({
250
- input: { projectId: 'id', userId: 'id', idempotencyKey: 'text' },
251
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
252
- effects: [...membershipEffects, 'write:flow.ProjectMember'],
253
- idempotent: true,
254
- agent: true,
255
- handler: async (ctx, args) => {
256
- const error = command(ctx, args.idempotencyKey);
257
- if (error)
258
- return error;
259
- if (!(await canReadProject(ctx, args.projectId)))
260
- return invalid(issue('projectId', 'flow.error.notFound'));
261
- const user = (await ctx.db.select('user.User', { id: args.userId, active: true }))[0];
262
- if (!user)
263
- return invalid(issue('userId', 'flow.error.notFound'));
264
- await addMember(ctx, {
265
- projectId: String(args.projectId),
266
- userId: String(args.userId),
267
- addedByUserId: ctx.actor,
268
- at: new Date().toISOString(),
269
- });
270
- return { ok: true, id: `${String(args.projectId)}:${String(args.userId)}` };
271
- },
272
- }),
273
- 'project.member.remove': defineFn({
274
- input: { projectId: 'id', userId: 'id', idempotencyKey: 'text' },
275
- output: { ok: 'bool', errors: 'json?' },
276
- effects: [...membershipEffects, 'write:flow.ProjectMember'],
277
- idempotent: true,
278
- agent: true,
279
- handler: async (ctx, args) => {
280
- const error = command(ctx, args.idempotencyKey);
281
- if (error)
282
- return error;
283
- if (!(await canReadProject(ctx, args.projectId)))
284
- return invalid(issue('projectId', 'flow.error.notFound'));
285
- // Removing the last member is allowed and is not an accident to guard
286
- // against: a project with nobody on it is closed, which is what somebody
287
- // clearing out a project wants. The company-wide grant is how it is
288
- // reopened, and that is the point of having one.
289
- const removed = await removeMember(ctx, String(args.projectId), String(args.userId));
290
- return removed ? { ok: true } : invalid(issue('userId', 'flow.error.notFound'));
291
- },
292
- }),
293
- /**
294
- * Who reads every project in the company, and the two commands that decide it.
295
- *
296
- * The widest reach Flow grants, so it is `security` risk with an authority of
297
- * its own: this is the row that makes somebody able to read a project nobody
298
- * added them to. It exists so membership can be administered at all, and so a
299
- * project whose members have left is not unreachable.
300
- */
301
- 'project.access.list': defineFn({
302
- input: {},
303
- output: { id: 'id', userId: 'id', addedAt: 'datetime' },
304
- effects: ['read:flow.ProjectAccessGrant'],
305
- agent: true,
306
- handler: (ctx) => ctx.db.select('flow.ProjectAccessGrant', {}),
307
- }),
308
- 'project.access.grant': defineFn({
309
- input: { userId: 'id', idempotencyKey: 'text' },
310
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
311
- effects: ['read:flow.ProjectAccessGrant', 'write:flow.ProjectAccessGrant', 'read:user.User'],
312
- idempotent: true,
313
- agent: true,
314
- handler: async (ctx, args) => {
315
- const error = command(ctx, args.idempotencyKey);
316
- if (error)
317
- return error;
318
- const user = (await ctx.db.select('user.User', { id: args.userId, active: true }))[0];
319
- if (!user)
320
- return invalid(issue('userId', 'flow.error.notFound'));
321
- await ctx.db.insertIfAbsent('flow.ProjectAccessGrant', {
322
- id: String(args.userId),
323
- userId: args.userId,
324
- addedAt: new Date().toISOString(),
325
- addedByUserId: ctx.actor,
326
- });
327
- return { ok: true, id: String(args.userId) };
328
- },
329
- }),
330
- 'project.access.revoke': defineFn({
331
- input: { userId: 'id', idempotencyKey: 'text' },
332
- output: { ok: 'bool', errors: 'json?' },
333
- effects: ['read:flow.ProjectAccessGrant', 'write:flow.ProjectAccessGrant'],
334
- idempotent: true,
335
- agent: true,
336
- handler: async (ctx, args) => {
337
- const error = command(ctx, args.idempotencyKey);
338
- if (error)
339
- return error;
340
- const held = (await ctx.db.select('flow.ProjectAccessGrant', { userId: args.userId }))[0];
341
- if (!held)
342
- return invalid(issue('userId', 'flow.error.notFound'));
343
- const G = ctx.table('flow.ProjectAccessGrant');
344
- await ctx.db.del(deleteFrom(G).where(eq(G.id, held.id)));
345
- return { ok: true };
346
- },
347
- }),
348
- /**
349
- * How many projects there are to page through.
350
- *
351
- * The list screen used to show the length of the page it had — capped at two
352
- * hundred — as though it were the total, so a company with more projects was
353
- * told a number that was simply wrong, and the rest were unreachable. This
354
- * answers the real figure, through the same membership filter the list uses
355
- * (FLW-039).
356
- */
357
- 'project.count': defineFn({
358
- input: { search: 'text?', includeArchived: 'bool?', mine: 'bool?' },
359
- output: { total: 'int' },
360
- effects: [
361
- 'read:flow.Project',
362
- 'read:flow.Issue',
363
- 'read:flow.ProjectMember',
364
- 'read:flow.ProjectAccessGrant',
365
- 'read:user.User',
366
- ],
367
- agent: true,
368
- handler: async (ctx, args) => {
369
- const visible = await visibleProjects(ctx);
370
- if (visible !== null && !visible.length)
371
- return { total: 0 };
372
- // Counted over the rows themselves rather than with a SQL count, because
373
- // `optionRows` matches a normalised name in JS: a count in the database
374
- // would answer a different, larger question for exactly the searches
375
- // people type. Reading every project is what the list already does.
376
- const rows = await optionCount(ctx, 'flow.Project', args, (row) => visible === null || visible.includes(String(row.id)));
377
- if (args.mine !== true)
378
- return { total: rows };
379
- const mine = await projectsWithMyWork(ctx);
380
- return {
381
- total: await optionCount(ctx, 'flow.Project', args, (row) => (visible === null || visible.includes(String(row.id))) && mine.has(String(row.id))),
382
- };
383
- },
384
- }),
385
- /**
386
- * The issue counts behind a list of projects, in two reads rather than one
387
- * per project — see `projectStats`.
388
- */
389
- 'project.stats': defineFn({
390
- input: { projectIds: 'json' },
391
- output: { id: 'id', total: 'int', done: 'int', state: 'text' },
392
- effects: [
393
- 'read:flow.Issue',
394
- 'read:flow.Column',
395
- 'read:flow.Project',
396
- 'read:flow.ProjectMember',
397
- 'read:flow.ProjectAccessGrant',
398
- 'read:user.User',
399
- ],
400
- agent: true,
401
- handler: async (ctx, args) => {
402
- const asked = Array.isArray(args.projectIds) ? args.projectIds.map(String) : [];
403
- // A count is a reading. Asking for the totals of a project you are not on
404
- // would answer "how much work is in there", which is most of what the
405
- // project is.
406
- const visible = await visibleProjects(ctx);
407
- const ids = visible === null ? asked : asked.filter((id) => visible.includes(id));
408
- const stats = await projectStats(ctx, ids);
409
- return [...stats].map(([id, counted]) => ({
410
- id,
411
- total: counted.total,
412
- done: counted.done,
413
- state: projectStateOf(counted),
414
- }));
415
- },
416
- }),
417
- /**
418
- * One project by id, the way `issue.get` answers one issue.
419
- *
420
- * Every project-scoped screen needs the project behind the id in its URL.
421
- * Resolving that through `project.list` means listing and filtering, and
422
- * `optionRows` caps at 200 rows sorted by name — so the 201st project by
423
- * name would answer "not found" on its own board.
424
- */
425
- 'project.get': defineFn({
426
- input: { id: 'id' },
427
- output: {
428
- id: 'id',
429
- key: 'text',
430
- name: 'text',
431
- description: 'text?',
432
- previewText: 'text?',
433
- contentAttachmentId: 'id?',
434
- active: 'bool',
435
- },
436
- effects: [
437
- 'read:flow.Project',
438
- 'read:flow.ProjectMember',
439
- 'read:flow.ProjectAccessGrant',
440
- 'read:user.User',
441
- ],
442
- agent: true,
443
- // Nothing rather than a refusal: that a project exists is itself the half of
444
- // the answer a hidden project must not give away — see readableProject.
445
- handler: async (ctx, args) => (await readableProject(ctx, args.id)) ?? null,
446
- }),
447
- /**
448
- * Rewriting a project's brief, as a permission key of its own — separate
449
- * from `project.save`, which renames the project and archives it.
450
- */
451
- 'project.editContent': defineFn({
452
- input: { id: 'id' },
453
- // The fields as they are actually returned, not a `value` wrapper the
454
- // handler never builds: output is projected against these keys, so
455
- // declaring `value` and answering `{ id, contentAttachmentId }` threw both
456
- // away and handed the caller `{}`. Live Doc reads `contentAttachmentId`
457
- // off this to find the stored snapshot, so an empty answer read as "never
458
- // written" — and the next push started from a blank document and flattened
459
- // it over the real one.
460
- output: { id: 'id?', contentAttachmentId: 'id?' },
461
- effects: ['read:flow.Project', ...membershipEffects],
462
- agent: true,
463
- handler: async (ctx, args) => {
464
- const row = await readableProject(ctx, args.id);
465
- return row ? { id: row.id, contentAttachmentId: row.contentAttachmentId ?? null } : null;
466
- },
467
- }),
468
- /**
469
- * Destroy a project and everything in it.
470
- *
471
- * Archiving is the default and stays the default — this is the other thing,
472
- * for when somebody has asked for the data to be gone rather than hidden
473
- * (FLW-DEC-018). It is not `flow.configure`: configuring a project and
474
- * ending one are not the same act, and a role that does the first every week
475
- * should not be able to do the second by accident.
476
- *
477
- * Three things happen here and the order is the point. The name typed by the
478
- * caller has to match the project's own, so that destroying the wrong
479
- * project takes more than a mis-click on a list. The record of the request
480
- * is written **before** anything else, because a record that appears only on
481
- * success misses the case worth auditing. Only then is the work queued —
482
- * fifteen tables, every thread, and the bytes behind every document do not
483
- * fit in a request, and the blob store is reachable only from a job.
484
- */
485
- 'project.delete': defineFn({
486
- input: { projectId: 'id', confirmName: 'text', reason: 'text?', idempotencyKey: 'text' },
487
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
488
- effects: [
489
- ...membershipEffects,
490
- 'read:flow.ProjectDeletion',
491
- 'write:flow.ProjectDeletion',
492
- 'enqueue:flow.purgeProject',
493
- ],
494
- idempotent: true,
495
- agent: true,
496
- handler: async (ctx, args) => {
497
- const error = command(ctx, args.idempotencyKey);
498
- if (error)
499
- return error;
500
- // Through the membership gate like everything else: a project you cannot
501
- // see is a project you cannot end, and it answers the same "not found" a
502
- // project that was never there would.
503
- const project = await readableProject(ctx, args.projectId);
504
- if (!project)
505
- return invalid(issue('projectId', 'flow.error.notFound'));
506
- // Exactly the name, untrimmed of meaning: a confirmation that accepts a
507
- // near-match is a confirmation that will be typed without reading.
508
- if (String(args.confirmName ?? '').trim() !== String(project.name ?? ''))
509
- return invalid(issue('confirmName', 'flow.error.confirmNameMismatch'));
510
- const id = randomUUID();
511
- await ctx.db.insert('flow.ProjectDeletion', {
512
- id,
513
- projectId: String(project.id),
514
- // Copied, not referenced. After the purge there is nowhere left to
515
- // read these from, and an audit row naming an id nobody recognises
516
- // answers no question anybody will ask of it.
517
- projectKey: String(project.key ?? ''),
518
- projectName: String(project.name ?? ''),
519
- requestedAt: new Date().toISOString(),
520
- requestedByUserId: ctx.actor,
521
- reason: args.reason ? String(args.reason) : null,
522
- state: 'requested',
523
- completedAt: null,
524
- removed: null,
525
- });
526
- await ctx.jobs.enqueue('flow.purgeProject', { projectId: String(project.id), deletionId: id },
527
- // One purge per project. Asking twice while the first is still running
528
- // is the same request, and running two at once over the same rows is
529
- // two jobs racing to delete what the other is reading.
530
- { uniqueKey: `flow.purgeProject:${String(project.id)}` });
531
- return { ok: true, id };
532
- },
533
- }),
534
- /** What was asked to be deleted, and what became of it. */
535
- 'project.deletion.list': defineFn({
536
- input: { limit: 'int?' },
537
- output: {
538
- id: 'id',
539
- projectId: 'id',
540
- projectKey: 'text',
541
- projectName: 'text',
542
- requestedAt: 'datetime',
543
- requestedByUserId: 'id?',
544
- reason: 'text?',
545
- state: 'text',
546
- completedAt: 'datetime?',
547
- },
548
- effects: ['read:flow.ProjectDeletion'],
549
- agent: true,
550
- handler: async (ctx, args) => {
551
- const D = ctx.table('flow.ProjectDeletion');
552
- // No membership filter, and it cannot have one: the projects these rows
553
- // name do not exist any more, so there is nothing left to be a member of.
554
- // That is why reading this list is its own authority rather than `view`.
555
- return ctx.db.all(from(D)
556
- .orderBy(desc(D.requestedAt), desc(D.id))
557
- .limit(Math.max(1, Math.min(200, n(args.limit ?? 50)))));
558
- },
559
- }),
560
- 'project.save': saveEntity('flow.Project', ['id', 'key', 'name', 'description', 'active'], ['key', 'name'], (args, existing) => ({ active: existing?.active ?? true, ...args })),
561
- 'column.list': defineFn({
562
- input: { projectId: 'id', includeArchived: 'bool?' },
563
- output: {
564
- id: 'id',
565
- projectId: 'id',
566
- code: 'text',
567
- name: 'text',
568
- sequence: 'int',
569
- terminalState: 'bool',
570
- active: 'bool',
571
- },
572
- effects: [
573
- 'read:flow.Column',
574
- 'read:flow.Project',
575
- 'read:flow.ProjectMember',
576
- 'read:flow.ProjectAccessGrant',
577
- 'read:user.User',
578
- ...membershipEffects,
579
- ],
580
- agent: true,
581
- handler: async (ctx, args) => {
582
- // A project's configuration is the project. Answering with its columns
583
- // for somebody who cannot see the project describes it to them.
584
- if (!(await canReadProject(ctx, args.projectId)))
585
- return [];
586
- const rows = await ctx.db.select('flow.Column', args.includeArchived === true
587
- ? { projectId: args.projectId }
588
- : { projectId: args.projectId, active: true });
589
- return rows.sort((a, b) => n(a.sequence) - n(b.sequence) || String(a.id).localeCompare(String(b.id)));
590
- },
591
- }),
592
- 'column.save': saveEntity('flow.Column', ['id', 'projectId', 'code', 'name', 'sequence', 'terminalState', 'active'], ['projectId', 'code', 'name'], (args, existing) => ({
593
- sequence: existing?.sequence ?? 10,
594
- terminalState: existing?.terminalState ?? false,
595
- active: existing?.active ?? true,
596
- ...args,
597
- })),
598
- 'column.archive': defineFn({
599
- input: { id: 'id' },
600
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
601
- effects: ['read:flow.Column', 'write:flow.Column', 'read:flow.Issue', ...membershipEffects],
602
- idempotent: true,
603
- agent: true,
604
- handler: async (ctx, args) => {
605
- const existing = await readableRow(ctx, 'flow.Column', args.id);
606
- if (!existing)
607
- return invalid(issue('id', 'flow.error.notFound'));
608
- const held = await ctx.db.select('flow.Issue', { columnId: args.id, active: true });
609
- if (held.length)
610
- return invalid(issue('id', 'flow.error.columnHasIssues'));
611
- await ctx.db.update('flow.Column', { id: args.id }, { active: false });
612
- return { ok: true, id: args.id };
613
- },
614
- }),
615
- 'issueType.list': defineFn({
616
- input: { projectId: 'id', includeArchived: 'bool?' },
617
- output: {
618
- id: 'id',
619
- projectId: 'id',
620
- code: 'text',
621
- name: 'text',
622
- color: 'text?',
623
- sequence: 'int',
624
- active: 'bool',
625
- },
626
- effects: [
627
- 'read:flow.IssueType',
628
- 'read:flow.Project',
629
- 'read:flow.ProjectMember',
630
- 'read:flow.ProjectAccessGrant',
631
- 'read:user.User',
632
- ...membershipEffects,
633
- ],
634
- agent: true,
635
- handler: async (ctx, args) => {
636
- if (!(await canReadProject(ctx, args.projectId)))
637
- return [];
638
- const rows = await ctx.db.select('flow.IssueType', args.includeArchived === true
639
- ? { projectId: args.projectId }
640
- : { projectId: args.projectId, active: true });
641
- return rows.sort((a, b) => n(a.sequence) - n(b.sequence) || String(a.id).localeCompare(String(b.id)));
642
- },
643
- }),
644
- 'issueType.save': saveEntity('flow.IssueType', ['id', 'projectId', 'code', 'name', 'color', 'sequence', 'active'], ['projectId', 'code', 'name'], (args, existing) => ({
645
- sequence: existing?.sequence ?? 10,
646
- active: existing?.active ?? true,
647
- ...args,
648
- })),
649
- /**
650
- * Archiving a type in use would leave those issues pointing at a row no
651
- * screen lists any more, so they would read as untyped while still carrying
652
- * it — the same refusal `column.archive` makes, for the same reason.
653
- */
654
- 'issueType.archive': defineFn({
655
- input: { id: 'id' },
656
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
657
- effects: ['read:flow.IssueType', 'write:flow.IssueType', 'read:flow.Issue', ...membershipEffects],
658
- idempotent: true,
659
- agent: true,
660
- handler: async (ctx, args) => {
661
- const existing = await readableRow(ctx, 'flow.IssueType', args.id);
662
- if (!existing)
663
- return invalid(issue('id', 'flow.error.notFound'));
664
- const held = await ctx.db.select('flow.Issue', { typeId: args.id, active: true });
665
- if (held.length)
666
- return invalid(issue('id', 'flow.error.typeHasIssues'));
667
- await ctx.db.update('flow.IssueType', { id: args.id }, { active: false });
668
- return { ok: true, id: args.id };
669
- },
670
- }),
671
- /**
672
- * The project this reader's board last showed, if any.
673
- *
674
- * Answers null rather than guessing a project: the board asks them to pick
675
- * once, and a wrong guess would show one team's work to somebody who wanted
676
- * another's.
677
- */
678
- 'board.scope': defineFn({
679
- input: {},
680
- output: { projectId: 'id?' },
681
- effects: ['read:flow.BoardScope', ...membershipEffects],
682
- agent: true,
683
- handler: async (ctx) => {
684
- if (!ctx.actor)
685
- return { projectId: null };
686
- const held = (await ctx.db.select('flow.BoardScope', { userId: ctx.actor }))[0];
687
- if (!held)
688
- return { projectId: null };
689
- // Where they were last is not where they may still go: somebody taken off
690
- // a project keeps the row that remembers it, and answering with it would
691
- // send the screen to a board that is no longer theirs — and would name a
692
- // project they can no longer be told exists.
693
- return (await canReadProject(ctx, held.projectId)) ? { projectId: held.projectId } : { projectId: null };
694
- },
695
- }),
696
- 'board.remember': defineFn({
697
- input: { projectId: 'id' },
698
- output: { ok: 'bool', errors: 'json?' },
699
- effects: ['read:flow.BoardScope', 'write:flow.BoardScope', 'read:flow.Project', ...membershipEffects],
700
- idempotent: true,
701
- agent: true,
702
- handler: async (ctx, args) => {
703
- if (!ctx.actor)
704
- return invalid(issue('actor', 'flow.error.actorRequired'));
705
- const project = await readableProject(ctx, args.projectId);
706
- if (!project || project.active !== true)
707
- return invalid(issue('projectId', 'flow.error.notFound'));
708
- // One row per reader **per company**. The id used to be the user id
709
- // alone, which read as "one row per reader" and was not: the primary key
710
- // is not company-scoped, so somebody who works in two companies got one
711
- // row in whichever they opened first, and every later company answered
712
- // `ok: true` and remembered nothing. Silent, and only visible as a board
713
- // that would not stay where you left it (FLW-023).
714
- const id = `${String(ctx.scope.company)}:${String(ctx.actor)}`;
715
- const row = { id, userId: ctx.actor, projectId: args.projectId, updatedAt: new Date().toISOString() };
716
- await ctx.db.insertIfAbsent('flow.BoardScope', row);
717
- await ctx.db.update('flow.BoardScope', { id }, row);
718
- return { ok: true };
719
- },
720
- }),
721
- 'field.list': defineFn({
722
- input: { projectId: 'id', includeArchived: 'bool?' },
723
- output: {
724
- id: 'id',
725
- projectId: 'id',
726
- code: 'text',
727
- name: 'text',
728
- kind: 'text',
729
- config: 'json?',
730
- sequence: 'int',
731
- active: 'bool',
732
- },
733
- effects: [
734
- 'read:flow.FieldDef',
735
- 'read:flow.Project',
736
- 'read:flow.ProjectMember',
737
- 'read:flow.ProjectAccessGrant',
738
- 'read:user.User',
739
- ...membershipEffects,
740
- ],
741
- agent: true,
742
- handler: async (ctx, args) => {
743
- if (!(await canReadProject(ctx, args.projectId)))
744
- return [];
745
- const rows = await ctx.db.select('flow.FieldDef', args.includeArchived === true
746
- ? { projectId: args.projectId }
747
- : { projectId: args.projectId, active: true });
748
- return rows.sort((a, b) => n(a.sequence) - n(b.sequence) || String(a.id).localeCompare(String(b.id)));
749
- },
750
- }),
751
- /**
752
- * `kind` is checked here rather than left to the changeset: it is what
753
- * `saveIssue` branches on to decide whether a value is well-formed, so a
754
- * kind nothing knows how to check would be a field that accepts anything.
755
- */
756
- 'field.save': defineFn({
757
- input: {
758
- id: 'id',
759
- projectId: 'id',
760
- code: 'text',
761
- name: 'text',
762
- kind: 'text',
763
- config: 'json?',
764
- sequence: 'int?',
765
- idempotencyKey: 'text',
766
- },
767
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
768
- effects: ['read:flow.FieldDef', 'write:flow.FieldDef', ...membershipEffects],
769
- idempotent: true,
770
- agent: true,
771
- handler: async (ctx, args) => {
772
- const error = command(ctx, args.idempotencyKey);
773
- if (error)
774
- return error;
775
- const kind = String(args.kind);
776
- if (!FIELD_KINDS.includes(kind))
777
- return invalid(issue('kind', 'flow.error.fieldKind'));
778
- // A select with no options is a control nobody can answer.
779
- const options = args.config?.options;
780
- if (kind === 'select' && (!Array.isArray(options) || options.length === 0))
781
- return invalid(issue('config', 'flow.error.fieldOptionsRequired'));
782
- const id = String(args.id);
783
- const existing = (await ctx.db.select('flow.FieldDef', { id }))[0];
784
- const row = {
785
- id,
786
- projectId: args.projectId,
787
- code: String(args.code),
788
- name: String(args.name),
789
- kind,
790
- config: args.config ?? null,
791
- sequence: args.sequence == null ? (existing?.sequence ?? 10) : Number(args.sequence),
792
- active: existing?.active ?? true,
793
- };
794
- if (existing)
795
- await ctx.db.update('flow.FieldDef', { id }, row);
796
- else {
797
- const inserted = await ctx.db.insertIfAbsent('flow.FieldDef', row);
798
- if (!('inserted' in inserted) || !inserted.inserted)
799
- return invalid(issue('code', 'flow.error.fieldCodeUnique'));
800
- }
801
- return { ok: true, id };
802
- },
803
- }),
804
- /**
805
- * Archiving a field keeps the values already recorded against it.
806
- *
807
- * Unlike a column or a type, nothing points *at* a field from a row anyone
808
- * reads — the values point the other way. So the answers stay, unlisted, and
809
- * come back if the field is ever restored. Deleting them would be the one
810
- * irreversible thing on this screen.
811
- */
812
- 'field.archive': defineFn({
813
- input: { id: 'id' },
814
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
815
- effects: ['read:flow.FieldDef', 'write:flow.FieldDef', ...membershipEffects],
816
- idempotent: true,
817
- agent: true,
818
- handler: async (ctx, args) => {
819
- const existing = (await ctx.db.select('flow.FieldDef', { id: args.id }))[0];
820
- if (!existing)
821
- return invalid(issue('id', 'flow.error.notFound'));
822
- await ctx.db.update('flow.FieldDef', { id: args.id }, { active: false });
823
- return { ok: true, id: args.id };
824
- },
825
- }),
826
- 'epic.list': defineFn({
827
- input: { projectId: 'id', id: 'id?', search: 'text?', limit: 'int?', includeArchived: 'bool?' },
828
- output: {
829
- id: 'id',
830
- projectId: 'id',
831
- title: 'text',
832
- color: 'text?',
833
- previewText: 'text?',
834
- contentAttachmentId: 'id?',
835
- active: 'bool',
836
- total: 'int',
837
- done: 'int',
838
- estimate: 'decimal',
839
- estimateDone: 'decimal',
840
- },
841
- effects: ['read:flow.Epic', 'read:flow.Issue', 'read:flow.Column', ...membershipEffects],
842
- agent: true,
843
- handler: async (ctx, args) => {
844
- if (!(await canReadProject(ctx, args.projectId)))
845
- return [];
846
- const where = { projectId: args.projectId };
847
- if (args.id)
848
- where.id = args.id;
849
- if (args.includeArchived !== true)
850
- where.active = true;
851
- const [rows, totals] = await Promise.all([
852
- ctx.db.select('flow.Epic', where),
853
- epicTotals(ctx, String(args.projectId)),
854
- ]);
855
- const needle = normalized(args.search);
856
- const filtered = rows
857
- .filter((row) => !needle || normalized(row.title).includes(needle))
858
- .map((row) => ({
859
- ...row,
860
- ...(totals.get(String(row.id)) ?? { total: 0, done: 0, estimate: 0, estimateDone: 0 }),
861
- }));
862
- return args.id ? filtered : filtered.slice(0, Math.max(1, Math.min(200, n(args.limit ?? 80))));
863
- },
864
- }),
865
- /**
866
- * The menu-level epic collection, paged after one company-scoped read.
867
- *
868
- * `epic.list` remains project-scoped for relation controls and project
869
- * screens. Folding those calls together in the backend inherited both its
870
- * 80-row default and `project.list`'s 200-row cap, so an "all" screen could
871
- * silently omit valid records.
872
- */
873
- 'epic.listAll': defineFn({
874
- input: { search: 'text?', cursor: 'int?', limit: 'int?' },
875
- output: { rows: 'json', total: 'int' },
876
- effects: [
877
- 'read:flow.Epic',
878
- 'read:flow.Project',
879
- 'read:flow.ProjectMember',
880
- 'read:flow.ProjectAccessGrant',
881
- 'read:user.User',
882
- ],
883
- agent: true,
884
- handler: async (ctx, args) => {
885
- // Every project's epics means every project this caller may see. The
886
- // screen behind it is the cross-project one, so nothing else narrows it.
887
- const [epics, projects] = await Promise.all([
888
- visibleRows(ctx, 'flow.Epic', { active: true }),
889
- ctx.db.select('flow.Project', { active: true }),
890
- ]);
891
- const named = new Map(projects.map((project) => [String(project.id), String(project.name ?? '')]));
892
- const needle = normalized(args.search);
893
- const rows = epics
894
- .filter((epic) => named.has(String(epic.projectId)) && (!needle || normalized(epic.title).includes(needle)))
895
- .map((epic) => ({
896
- ...epic,
897
- projectName: named.get(String(epic.projectId)) ?? '',
898
- }))
899
- .sort((a, b) => String(a.projectName).localeCompare(String(b.projectName)) ||
900
- String(a.title ?? '').localeCompare(String(b.title ?? '')) ||
901
- String(a.id).localeCompare(String(b.id)));
902
- const cursor = Math.max(0, n(args.cursor ?? 0));
903
- const limit = Math.max(1, Math.min(200, n(args.limit ?? 50)));
904
- return { rows: rows.slice(cursor, cursor + limit), total: rows.length };
905
- },
906
- }),
907
- /**
908
- * One epic by id — what Live Doc reads to find its stored document, and what
909
- * the epic's own screen is built from.
910
- */
911
- 'epic.get': defineFn({
912
- input: { id: 'id' },
913
- output: { value: 'json?' },
914
- effects: [
915
- 'read:flow.Epic',
916
- 'read:flow.Project',
917
- 'read:flow.ProjectMember',
918
- 'read:flow.ProjectAccessGrant',
919
- 'read:user.User',
920
- ],
921
- agent: true,
922
- handler: async (ctx, args) => {
923
- const held = (await ctx.db.select('flow.Epic', { id: args.id }))[0] ?? null;
924
- return { value: held && (await canReadProject(ctx, held.projectId)) ? held : null };
925
- },
926
- }),
927
- /**
928
- * Rewriting an epic's document, as a permission key of its own — the same
929
- * split `page.editContent` makes, and for the same reason.
930
- */
931
- 'epic.editContent': defineFn({
932
- input: { id: 'id' },
933
- // The fields as they are actually returned, not a `value` wrapper the
934
- // handler never builds: output is projected against these keys, so
935
- // declaring `value` and answering `{ id, contentAttachmentId }` threw both
936
- // away and handed the caller `{}`. Live Doc reads `contentAttachmentId`
937
- // off this to find the stored snapshot, so an empty answer read as "never
938
- // written" — and the next push started from a blank document and flattened
939
- // it over the real one.
940
- output: { id: 'id?', contentAttachmentId: 'id?' },
941
- effects: ['read:flow.Epic', ...membershipEffects],
942
- agent: true,
943
- handler: async (ctx, args) => {
944
- const row = await readableRow(ctx, 'flow.Epic', args.id);
945
- return row ? { id: row.id, contentAttachmentId: row.contentAttachmentId ?? null } : null;
946
- },
947
- }),
948
- 'epic.save': saveEntity('flow.Epic', ['id', 'projectId', 'title', 'color', 'active'], ['projectId', 'title'], (args, existing) => ({ active: existing?.active ?? true, ...args })),
949
- 'epic.archive': defineFn({
950
- input: { id: 'id' },
951
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
952
- effects: ['read:flow.Epic', 'write:flow.Epic', ...membershipEffects],
953
- idempotent: true,
954
- agent: true,
955
- handler: async (ctx, args) => {
956
- const existing = await readableRow(ctx, 'flow.Epic', args.id);
957
- if (!existing)
958
- return invalid(issue('id', 'flow.error.notFound'));
959
- await ctx.db.update('flow.Epic', { id: args.id }, { active: false });
960
- return { ok: true, id: args.id };
961
- },
962
- }),
963
- /**
964
- * Every page in a project, flat — the screen assembles the tree.
965
- *
966
- * See listPages for why the whole project comes back at once rather than a
967
- * level per request.
968
- */
969
- 'page.list': defineFn({
970
- input: { projectId: 'id?', search: 'text?', includeArchived: 'bool?', limit: 'int?' },
971
- output: {
972
- id: 'id',
973
- projectId: 'id',
974
- parentPageId: 'id?',
975
- title: 'text',
976
- previewText: 'text?',
977
- contentAttachmentId: 'id?',
978
- contentUpdatedAt: 'datetime?',
979
- sequence: 'int',
980
- active: 'bool',
981
- version: 'int',
982
- updatedAt: 'datetime',
983
- childCount: 'int',
984
- },
985
- effects: [
986
- 'read:flow.Page',
987
- 'read:flow.Project',
988
- 'read:flow.ProjectMember',
989
- 'read:flow.ProjectAccessGrant',
990
- 'read:user.User',
991
- ...membershipEffects,
992
- ],
993
- agent: true,
994
- handler: async (ctx, args) => {
995
- // Without a project this is the cross-project search, which listPages
996
- // filters itself; with one it is that project's tree.
997
- if (args.projectId != null && !(await canReadProject(ctx, args.projectId)))
998
- return [];
999
- return listPages(ctx, {
1000
- projectId: args.projectId == null ? null : String(args.projectId),
1001
- search: args.search == null ? null : String(args.search),
1002
- includeArchived: args.includeArchived === true,
1003
- limit: args.limit == null ? undefined : n(args.limit),
1004
- });
1005
- },
1006
- }),
1007
- /**
1008
- * Every project's pages, paged and counted — see listAllPages.
1009
- *
1010
- * `page.list` answers "this project's tree" and stays that. This answers
1011
- * "every document there is", a different question needing a different shape:
1012
- * a total the pager can trust, and the project name beside each row.
1013
- */
1014
- 'page.listAll': defineFn({
1015
- input: { search: 'text?', cursor: 'int?', limit: 'int?' },
1016
- output: { rows: 'json', total: 'int' },
1017
- effects: ['read:flow.Page', ...membershipEffects],
1018
- agent: true,
1019
- handler: (ctx, args) => listAllPages(ctx, {
1020
- search: args.search == null ? null : String(args.search),
1021
- cursor: args.cursor == null ? undefined : n(args.cursor),
1022
- limit: args.limit == null ? undefined : n(args.limit),
1023
- }),
1024
- }),
1025
- 'page.get': defineFn({
1026
- input: { id: 'id' },
1027
- output: { value: 'json?' },
1028
- effects: [
1029
- 'read:flow.Page',
1030
- 'read:flow.Project',
1031
- 'read:flow.ProjectMember',
1032
- 'read:flow.ProjectAccessGrant',
1033
- 'read:user.User',
1034
- ],
1035
- agent: true,
1036
- handler: async (ctx, args) => {
1037
- const held = await pageDetail(ctx, String(args.id));
1038
- return { value: held && (await canReadProject(ctx, held.projectId)) ? held : null };
1039
- },
1040
- }),
1041
- 'page.save': defineFn({
1042
- input: {
1043
- id: 'id',
1044
- projectId: 'id',
1045
- title: 'text',
1046
- parentPageId: 'id?',
1047
- sequence: 'int?',
1048
- expectedVersion: 'int?',
1049
- idempotencyKey: 'text',
1050
- },
1051
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
1052
- effects: ['read:flow.Page', 'write:flow.Page', 'read:flow.Project', ...membershipEffects],
1053
- idempotent: true,
1054
- agent: true,
1055
- handler: (ctx, args) => savePage(ctx, {
1056
- id: String(args.id),
1057
- projectId: String(args.projectId),
1058
- title: String(args.title),
1059
- parentPageId: args.parentPageId === undefined ? undefined : args.parentPageId,
1060
- sequence: args.sequence == null ? null : n(args.sequence),
1061
- expectedVersion: args.expectedVersion == null ? undefined : n(args.expectedVersion),
1062
- idempotencyKey: String(args.idempotencyKey),
1063
- }),
1064
- }),
1065
- /**
1066
- * Re-parenting, as its own key.
1067
- *
1068
- * A hierarchy is only useful if it can be rearranged, and rearranging is a
1069
- * different right from writing: someone may be trusted to edit a page
1070
- * without being trusted to move a whole branch of the wiki.
1071
- */
1072
- 'page.move': defineFn({
1073
- input: { id: 'id', parentPageId: 'id?', sequence: 'int?' },
1074
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
1075
- effects: ['read:flow.Page', 'write:flow.Page', ...membershipEffects],
1076
- idempotent: true,
1077
- agent: true,
1078
- handler: (ctx, args) => movePage(ctx, {
1079
- id: String(args.id),
1080
- parentPageId: args.parentPageId ?? null,
1081
- sequence: args.sequence == null ? null : n(args.sequence),
1082
- }),
1083
- }),
1084
- 'page.reorder': defineFn({
1085
- input: { id: 'id', direction: 'text' },
1086
- output: { ok: 'bool', id: 'id?', moved: 'bool?', errors: 'json?' },
1087
- effects: ['read:flow.Page', 'write:flow.Page', ...membershipEffects],
1088
- idempotent: true,
1089
- agent: true,
1090
- handler: (ctx, args) => reorderPage(ctx, {
1091
- id: String(args.id),
1092
- direction: String(args.direction) === 'up' ? 'up' : 'down',
1093
- }),
1094
- }),
1095
- 'page.archive': defineFn({
1096
- input: { id: 'id' },
1097
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
1098
- effects: ['read:flow.Page', 'write:flow.Page', ...membershipEffects],
1099
- idempotent: true,
1100
- agent: true,
1101
- handler: (ctx, args) => archivePage(ctx, String(args.id)),
1102
- }),
1103
- 'page.restore': defineFn({
1104
- input: { id: 'id' },
1105
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
1106
- effects: ['read:flow.Page', 'write:flow.Page', ...membershipEffects],
1107
- idempotent: true,
1108
- agent: true,
1109
- handler: (ctx, args) => restorePage(ctx, String(args.id)),
1110
- }),
1111
- /**
1112
- * Rewriting a page's document, as a permission key of its own.
1113
- *
1114
- * It grants nothing by itself — Live Doc calls it only to ask whether this
1115
- * caller may write, and hands back the row it returns (documents.ts). It is
1116
- * separate from `page.save` because writing prose and renaming a page are
1117
- * different rights: a reviewer may hold one without the other.
1118
- */
1119
- 'page.editContent': defineFn({
1120
- input: { id: 'id' },
1121
- // The fields as they are actually returned, not a `value` wrapper the
1122
- // handler never builds: output is projected against these keys, so
1123
- // declaring `value` and answering `{ id, contentAttachmentId }` threw both
1124
- // away and handed the caller `{}`. Live Doc reads `contentAttachmentId`
1125
- // off this to find the stored snapshot, so an empty answer read as "never
1126
- // written" — and the next push started from a blank document and flattened
1127
- // it over the real one.
1128
- output: { id: 'id?', contentAttachmentId: 'id?' },
1129
- effects: ['read:flow.Page', ...membershipEffects],
1130
- agent: true,
1131
- handler: async (ctx, args) => {
1132
- const row = await readableRow(ctx, 'flow.Page', args.id);
1133
- return row ? { id: row.id, contentAttachmentId: row.contentAttachmentId ?? null } : null;
1134
- },
1135
- }),
1136
- /**
1137
- * The project's sprints with what each is carrying — see sprintTotals.
1138
- *
1139
- * The totals live here rather than behind a key of their own because every
1140
- * caller that wants a sprint wants to know how big it is, and the screen that
1141
- * closes one needs the unfinished count before it can offer anywhere to put it.
1142
- */
1143
- 'sprint.list': defineFn({
1144
- input: { projectId: 'id' },
1145
- output: {
1146
- id: 'id',
1147
- projectId: 'id',
1148
- name: 'text',
1149
- startDate: 'date?',
1150
- endDate: 'date?',
1151
- state: 'text',
1152
- total: 'int',
1153
- done: 'int',
1154
- unfinished: 'int',
1155
- estimate: 'decimal',
1156
- estimateDone: 'decimal',
1157
- },
1158
- effects: [
1159
- 'read:flow.Sprint',
1160
- 'read:flow.Issue',
1161
- 'read:flow.Column',
1162
- 'read:flow.Project',
1163
- 'read:flow.ProjectMember',
1164
- 'read:flow.ProjectAccessGrant',
1165
- 'read:user.User',
1166
- ...membershipEffects,
1167
- ],
1168
- agent: true,
1169
- handler: async (ctx, args) => {
1170
- if (!(await canReadProject(ctx, args.projectId)))
1171
- return [];
1172
- const [rows, totals] = await Promise.all([
1173
- ctx.db.select('flow.Sprint', { projectId: args.projectId }),
1174
- sprintTotals(ctx, String(args.projectId)),
1175
- ]);
1176
- return rows.map((row) => ({
1177
- ...row,
1178
- ...(totals.get(String(row.id)) ?? {
1179
- total: 0,
1180
- done: 0,
1181
- unfinished: 0,
1182
- estimate: 0,
1183
- estimateDone: 0,
1184
- }),
1185
- }));
1186
- },
1187
- }),
1188
- 'sprint.save': defineFn({
1189
- input: {
1190
- id: 'id',
1191
- projectId: 'id',
1192
- name: 'text',
1193
- startDate: 'date?',
1194
- endDate: 'date?',
1195
- idempotencyKey: 'text',
1196
- },
1197
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
1198
- effects: ['read:flow.Sprint', 'write:flow.Sprint', ...membershipEffects],
1199
- idempotent: true,
1200
- agent: true,
1201
- handler: async (ctx, args) => {
1202
- const error = command(ctx, args.idempotencyKey);
1203
- if (error)
1204
- return error;
1205
- const existing = await readableRow(ctx, 'flow.Sprint', args.id);
1206
- if (existing && existing.state !== 'planned')
1207
- return invalid(issue('id', 'flow.error.invalidSprintState'));
1208
- if (!(await canReadProject(ctx, args.projectId)))
1209
- return invalid(issue('projectId', 'flow.error.notFound'));
1210
- const name = String(args.name ?? '').trim();
1211
- if (!name)
1212
- return invalid(issue('name', 'flow.error.required'));
1213
- const values = {
1214
- projectId: args.projectId,
1215
- name,
1216
- startDate: args.startDate ?? null,
1217
- endDate: args.endDate ?? null,
1218
- state: 'planned',
1219
- };
1220
- if (existing)
1221
- await ctx.db.update('flow.Sprint', { id: args.id }, values);
1222
- else
1223
- await ctx.db.insert('flow.Sprint', { id: args.id, ...values });
1224
- return { ok: true, id: args.id };
1225
- },
1226
- }),
1227
- 'sprint.start': defineFn({
1228
- input: { id: 'id', idempotencyKey: 'text' },
1229
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
1230
- effects: [
1231
- 'read:flow.Sprint',
1232
- 'write:flow.Sprint',
1233
- // The guard row this contends on, so two callers cannot both be told
1234
- // they started a sprint — see flow.ProjectGuard.
1235
- 'read:flow.ProjectGuard',
1236
- 'write:flow.ProjectGuard',
1237
- ...membershipEffects,
1238
- ],
1239
- idempotent: true,
1240
- agent: true,
1241
- handler: (ctx, args) => startSprint(ctx, { id: String(args.id), idempotencyKey: String(args.idempotencyKey) }),
1242
- }),
1243
- /**
1244
- * Close it, and decide what happens to the work that did not finish.
1245
- *
1246
- * `carryTo` is absent by default, which is exactly what closing used to do —
1247
- * so nothing that calls this today behaves differently.
1248
- */
1249
- /**
1250
- * Delete a sprint nobody ever started — see deleteSprint for why only those.
1251
- */
1252
- 'sprint.delete': defineFn({
1253
- input: { id: 'id', idempotencyKey: 'text' },
1254
- output: { ok: 'bool', id: 'id?', released: 'int?', errors: 'json?' },
1255
- effects: [
1256
- 'read:flow.Sprint',
1257
- 'write:flow.Sprint',
1258
- 'read:flow.Issue',
1259
- 'write:flow.Issue',
1260
- ...membershipEffects,
1261
- ],
1262
- idempotent: true,
1263
- agent: true,
1264
- handler: (ctx, args) => deleteSprint(ctx, { id: String(args.id), idempotencyKey: String(args.idempotencyKey) }),
1265
- }),
1266
- 'sprint.close': defineFn({
1267
- input: { id: 'id', carryTo: 'id?', carry: 'bool?', idempotencyKey: 'text' },
1268
- output: { ok: 'bool', id: 'id?', carried: 'int?', errors: 'json?' },
1269
- effects: [
1270
- 'read:flow.Sprint',
1271
- 'write:flow.Sprint',
1272
- 'read:flow.Issue',
1273
- 'write:flow.Issue',
1274
- 'read:flow.Column',
1275
- ...timelineEntryEffects,
1276
- ...membershipEffects,
1277
- ],
1278
- idempotent: true,
1279
- agent: true,
1280
- handler: (ctx, args) => closeSprint(ctx, {
1281
- id: String(args.id),
1282
- // Three answers, not two: leave it (omit), move it (an id), or take it
1283
- // out of every sprint (`carry: true` with no target).
1284
- ...(args.carryTo || args.carry === true
1285
- ? { carryTo: args.carryTo ? String(args.carryTo) : null }
1286
- : {}),
1287
- idempotencyKey: String(args.idempotencyKey),
1288
- }),
1289
- }),
1290
- /**
1291
- * Every tag, with how much work in the company carries it.
1292
- *
1293
- * The count is here rather than on the screen because of what archiving a tag
1294
- * does: it deletes every `IssueTag` row for it, across every project, and
1295
- * cannot be undone. The block that offers that button sits inside a *project's*
1296
- * settings — so the number is the only thing that says how far the button
1297
- * reaches. One grouped query, not one count per tag.
1298
- */
1299
- 'tag.list': defineFn({
1300
- input: { search: 'text?', limit: 'int?', includeArchived: 'bool?' },
1301
- output: { id: 'id', name: 'text', color: 'text?', active: 'bool', usage: 'int' },
1302
- effects: ['read:flow.Tag', 'read:flow.IssueTag'],
1303
- agent: true,
1304
- handler: async (ctx, args) => {
1305
- const rows = await optionRows(ctx, 'flow.Tag', args);
1306
- if (!rows.length)
1307
- return rows;
1308
- const IT = ctx.table('flow.IssueTag');
1309
- // Every row, archived issues included, because that is what `tag.archive`
1310
- // deletes. A count that quietly skipped archived work would understate
1311
- // exactly the thing the reader is about to lose.
1312
- //
1313
- // Counted across every project on purpose, membership notwithstanding.
1314
- // The figure exists to answer "what will archiving this destroy", and
1315
- // archiving a tag clears it from every project at once (FLW-DEC-006) — a
1316
- // count narrowed to the reader's own projects would understate the damage
1317
- // and make the warning a lie. What it gives away is one number about work
1318
- // the reader cannot otherwise see, which is the price of the warning
1319
- // being true. See the exception list in flow-membership.test.ts.
1320
- const groups = await ctx.db.group(from(IT)
1321
- .where(inArray(IT.tagId, rows.map((row) => String(row.id))))
1322
- .groupBy({ col: IT.tagId }));
1323
- const counted = new Map(groups.map((group) => [String(group.key[0] ?? ''), n(group.count)]));
1324
- return rows.map((row) => ({ ...row, usage: counted.get(String(row.id)) ?? 0 }));
1325
- },
1326
- }),
1327
- 'tag.save': defineFn({
1328
- input: { id: 'id', name: 'text', color: 'text?', active: 'bool?' },
1329
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
1330
- effects: ['read:flow.Tag', 'write:flow.Tag'],
1331
- idempotent: true,
1332
- agent: true,
1333
- handler: async (ctx, args) => {
1334
- const name = String(args.name ?? '').trim();
1335
- if (!name)
1336
- return invalid(issue('name', 'flow.error.required'));
1337
- const existing = (await ctx.db.select('flow.Tag', { id: args.id }))[0];
1338
- const clash = (await ctx.db.select('flow.Tag', { name })).find((row) => row.id !== args.id);
1339
- if (clash)
1340
- return invalid(issue('name', 'flow.error.duplicateName'));
1341
- const values = {
1342
- name,
1343
- color: args.color ? String(args.color) : (existing?.color ?? null),
1344
- active: args.active ?? existing?.active ?? true,
1345
- };
1346
- if (existing)
1347
- await ctx.db.update('flow.Tag', { id: args.id }, values);
1348
- else
1349
- await ctx.db.insert('flow.Tag', { id: args.id, ...values });
1350
- return { ok: true, id: args.id };
1351
- },
1352
- }),
1353
- 'tag.archive': defineFn({
1354
- input: { id: 'id' },
1355
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
1356
- effects: ['read:flow.Tag', 'write:flow.Tag', 'read:flow.IssueTag', 'write:flow.IssueTag'],
1357
- idempotent: true,
1358
- agent: true,
1359
- handler: async (ctx, args) => {
1360
- const existing = (await ctx.db.select('flow.Tag', { id: args.id }))[0];
1361
- if (!existing)
1362
- return invalid(issue('id', 'flow.error.notFound'));
1363
- await ctx.db.update('flow.Tag', { id: args.id }, { active: false });
1364
- const IT = ctx.table('flow.IssueTag');
1365
- await ctx.db.del(deleteFrom(IT).where(eq(IT.tagId, args.id)));
1366
- return { ok: true, id: args.id };
1367
- },
1368
- }),
1369
- 'issue.list': defineFn({
1370
- input: {
1371
- /** A day; narrows to issues due before it that are not finished. */
1372
- overdueOn: 'text?',
1373
- projectId: 'id?',
1374
- columnId: 'id?',
1375
- epicId: 'id?',
1376
- sprintId: 'id?',
1377
- assigneeUserId: 'id?',
1378
- /** Assigned to whoever is asking; resolved from the actor, not the caller. */
1379
- mine: 'bool?',
1380
- includeArchived: 'bool?',
1381
- cursor: 'text?',
1382
- limit: 'int?',
1383
- listState: 'json?',
1384
- path: 'json?',
1385
- timezone: 'text?',
1386
- },
1387
- output: { rows: 'json', total: 'int', nextCursor: 'text?', fieldFilterTruncated: 'bool?' },
1388
- effects: [...flowReadEffects, 'read:company.Company'],
1389
- agent: true,
1390
- handler: (ctx, args) => listIssues(ctx, args),
1391
- }),
1392
- /**
1393
- * How the issues under the same filter divide up — see `issueBuckets`.
1394
- *
1395
- * Four counts, not a page of rows, so the figures beside a list of a
1396
- * thousand issues cost four queries.
1397
- */
1398
- 'issue.buckets': defineFn({
1399
- input: {
1400
- projectId: 'id?',
1401
- epicId: 'id?',
1402
- sprintId: 'id?',
1403
- assigneeUserId: 'id?',
1404
- mine: 'bool?',
1405
- includeArchived: 'bool?',
1406
- listState: 'json',
1407
- /** Optional: the company's own civil date when the caller names none. */
1408
- today: 'text?',
1409
- },
1410
- output: {
1411
- total: 'int',
1412
- done: 'int',
1413
- overdue: 'int',
1414
- waiting: 'int',
1415
- working: 'int',
1416
- today: 'text',
1417
- },
1418
- // The same `issueQuery` `issue.list` and `issue.group` run, so the same
1419
- // `flow.IssueFieldValue` read whenever the state carries a `field:<code>`
1420
- // rule — see resolveFieldFilters. A capability nobody declares is one
1421
- // nobody reviewed, and this one was missing while the other two had it.
1422
- effects: [
1423
- 'read:flow.Issue',
1424
- 'read:flow.Column',
1425
- 'read:flow.FieldDef',
1426
- 'read:flow.IssueFieldValue',
1427
- // Where the company keeps its calendar — see businessTimezone.
1428
- 'read:company.Company',
1429
- ...membershipEffects,
1430
- ],
1431
- agent: true,
1432
- handler: (ctx, args) => issueBuckets(ctx, args, args.today == null ? undefined : String(args.today)),
1433
- }),
1434
- 'issue.group': defineFn({
1435
- input: {
1436
- projectId: 'id?',
1437
- columnId: 'id?',
1438
- epicId: 'id?',
1439
- sprintId: 'id?',
1440
- assigneeUserId: 'id?',
1441
- mine: 'bool?',
1442
- includeArchived: 'bool?',
1443
- listState: 'json',
1444
- path: 'json?',
1445
- timezone: 'text?',
1446
- limit: 'int?',
1447
- offset: 'int?',
1448
- },
1449
- effects: [...flowReadEffects, 'read:company.Company'],
1450
- agent: true,
1451
- handler: (ctx, args) => groupIssues(ctx, args),
1452
- }),
1453
- 'issue.get': defineFn({
1454
- input: { id: 'id' },
1455
- effects: [
1456
- ...flowReadEffects,
1457
- 'read:flow.Project',
1458
- 'read:flow.ProjectMember',
1459
- 'read:flow.ProjectAccessGrant',
1460
- 'read:user.User',
1461
- ],
1462
- agent: true,
1463
- // Not found rather than forbidden: that an issue exists in a project this
1464
- // caller cannot see is itself the half of the answer to withhold.
1465
- handler: async (ctx, args) => {
1466
- const held = await issueDetail(ctx, String(args.id));
1467
- return held && (await canReadProject(ctx, held.projectId)) ? held : null;
1468
- },
1469
- }),
1470
- /**
1471
- * The permission that guards the collaborative description.
1472
- *
1473
- * The description is a Yjs document edited over flow_backend's `/push` and
1474
- * `/leave` routes, not through `issue.save`, so it needs its own grantable
1475
- * key — those routes used to authorize with `issue.get`, which made a
1476
- * read-only role able to rewrite any issue's text. It answers with the
1477
- * issue so the caller does not read it twice.
1478
- */
1479
- 'issue.editDescription': defineFn({
1480
- input: { id: 'id' },
1481
- effects: ['read:flow.Issue', ...membershipEffects],
1482
- agent: true,
1483
- handler: async (ctx, args) => (await readableRow(ctx, 'flow.Issue', args.id)) ?? null,
1484
- }),
1485
- 'issue.save': defineFn({
1486
- input: {
1487
- id: 'id',
1488
- projectId: 'id',
1489
- columnId: 'id',
1490
- typeId: 'id?',
1491
- epicId: 'id?',
1492
- sprintId: 'id?',
1493
- parentIssueId: 'id?',
1494
- title: 'text',
1495
- assigneeUserId: 'id?',
1496
- priority: 'text?',
1497
- startDate: 'date?',
1498
- dueDate: 'date?',
1499
- estimate: 'decimal?',
1500
- tagIds: 'json?',
1501
- /** Custom field values, keyed by field id or by field code. */
1502
- fields: 'json?',
1503
- expectedVersion: 'int?',
1504
- idempotencyKey: 'text',
1505
- },
1506
- output: { ok: 'bool', id: 'id?', version: 'int?', errors: 'json?' },
1507
- effects: [...issueWriteEffects],
1508
- idempotent: true,
1509
- agent: true,
1510
- handler: (ctx, args) => saveIssue(ctx, {
1511
- ...args,
1512
- id: String(args.id),
1513
- projectId: String(args.projectId),
1514
- columnId: String(args.columnId),
1515
- title: String(args.title),
1516
- idempotencyKey: String(args.idempotencyKey),
1517
- tagIds: Array.isArray(args.tagIds) ? args.tagIds.map(String) : undefined,
1518
- fields: args.fields && typeof args.fields === 'object'
1519
- ? args.fields
1520
- : undefined,
1521
- }),
1522
- }),
1523
- 'issue.move': defineFn({
1524
- input: { id: 'id', columnId: 'id', expectedVersion: 'int', idempotencyKey: 'text' },
1525
- output: { ok: 'bool', id: 'id?', version: 'int?', errors: 'json?' },
1526
- // The move leaves a timeline entry now — "who put this in Done, and when"
1527
- // is the question the cluster could not answer — so it writes to the thread.
1528
- effects: [
1529
- 'read:flow.Issue',
1530
- 'write:flow.Issue',
1531
- 'read:flow.Column',
1532
- 'read:flow.IssueDependency',
1533
- ...timelineEntryEffects,
1534
- ...membershipEffects,
1535
- ],
1536
- idempotent: true,
1537
- agent: true,
1538
- handler: (ctx, args) => moveIssue(ctx, {
1539
- id: String(args.id),
1540
- columnId: String(args.columnId),
1541
- expectedVersion: Number(args.expectedVersion),
1542
- idempotencyKey: String(args.idempotencyKey),
1543
- }),
1544
- }),
1545
- /**
1546
- * One action over many issues — see bulkIssues, and read the note there
1547
- * about what it deliberately does not guarantee.
1548
- */
1549
- 'issue.bulk': defineFn({
1550
- input: { ids: 'json', action: 'text', value: 'id?', idempotencyKey: 'text' },
1551
- output: { ok: 'bool', applied: 'int?', refused: 'json?', errors: 'json?' },
1552
- effects: [
1553
- 'read:flow.Issue',
1554
- 'write:flow.Issue',
1555
- 'read:flow.Column',
1556
- 'write:flow.IssueFieldValue',
1557
- 'write:flow.IssueTag',
1558
- 'read:flow.Tag',
1559
- 'read:flow.IssueTag',
1560
- 'read:flow.FieldDef',
1561
- 'read:flow.IssueType',
1562
- 'read:flow.Sprint',
1563
- 'read:mail.Thread',
1564
- 'write:mail.Thread',
1565
- 'read:mail.Message',
1566
- 'write:mail.Message',
1567
- 'read:mail.Follower',
1568
- 'write:mail.Follower',
1569
- 'read:mail.Subtype',
1570
- 'write:mail.Notification',
1571
- 'write:mail.TrackingValue',
1572
- 'read:user.User',
1573
- ...membershipEffects,
1574
- ],
1575
- idempotent: true,
1576
- agent: true,
1577
- handler: (ctx, args) => bulkIssues(ctx, {
1578
- ids: Array.isArray(args.ids) ? args.ids.map(String) : [],
1579
- action: String(args.action),
1580
- value: args.value ? String(args.value) : null,
1581
- idempotencyKey: String(args.idempotencyKey),
1582
- }),
1583
- }),
1584
- /** A copy of an issue in another project — see copyIssue for what it brings. */
1585
- 'issue.copyTo': defineFn({
1586
- input: { id: 'id', projectId: 'id', columnId: 'id?', title: 'text?', idempotencyKey: 'text' },
1587
- output: {
1588
- ok: 'bool',
1589
- id: 'id?',
1590
- columnId: 'id?',
1591
- fieldsCarried: 'int?',
1592
- fieldsDropped: 'int?',
1593
- typeCleared: 'bool?',
1594
- errors: 'json?',
1595
- },
1596
- effects: [
1597
- 'read:flow.Issue',
1598
- 'write:flow.Issue',
1599
- 'read:flow.Column',
1600
- 'read:flow.IssueType',
1601
- 'read:flow.FieldDef',
1602
- 'read:flow.IssueFieldValue',
1603
- 'write:flow.IssueFieldValue',
1604
- 'read:flow.Tag',
1605
- 'read:flow.IssueTag',
1606
- 'write:flow.IssueTag',
1607
- 'read:flow.Sprint',
1608
- 'read:mail.Thread',
1609
- 'write:mail.Thread',
1610
- 'read:mail.Message',
1611
- 'write:mail.Message',
1612
- 'read:mail.Follower',
1613
- 'write:mail.Follower',
1614
- 'read:mail.Subtype',
1615
- 'write:mail.Notification',
1616
- 'write:mail.TrackingValue',
1617
- 'read:user.User',
1618
- ...membershipEffects,
1619
- ],
1620
- idempotent: true,
1621
- agent: true,
1622
- handler: (ctx, args) => copyIssue(ctx, {
1623
- id: String(args.id),
1624
- projectId: String(args.projectId),
1625
- columnId: args.columnId ? String(args.columnId) : null,
1626
- title: args.title ? String(args.title) : null,
1627
- idempotencyKey: String(args.idempotencyKey),
1628
- }),
1629
- }),
1630
- /**
1631
- * Take an issue to another project — see transferIssue for what travels.
1632
- *
1633
- * Its own key rather than a shape of `issue.save`, which refuses to change
1634
- * a project at all: moving work between projects touches columns, types,
1635
- * epics, sprints and custom fields, and priced as an edit it would look like
1636
- * renaming a title.
1637
- */
1638
- 'issue.transfer': defineFn({
1639
- input: {
1640
- id: 'id',
1641
- projectId: 'id',
1642
- columnId: 'id?',
1643
- expectedVersion: 'int',
1644
- idempotencyKey: 'text',
1645
- },
1646
- output: {
1647
- ok: 'bool',
1648
- id: 'id?',
1649
- version: 'int?',
1650
- columnId: 'id?',
1651
- fieldsCarried: 'int?',
1652
- fieldsDropped: 'int?',
1653
- typeCleared: 'bool?',
1654
- epicCleared: 'bool?',
1655
- sprintCleared: 'bool?',
1656
- errors: 'json?',
1657
- },
1658
- effects: [
1659
- 'read:flow.Issue',
1660
- 'write:flow.Issue',
1661
- 'read:flow.Column',
1662
- 'read:flow.IssueType',
1663
- 'read:flow.FieldDef',
1664
- 'read:flow.IssueFieldValue',
1665
- 'write:flow.IssueFieldValue',
1666
- ...membershipEffects,
1667
- ],
1668
- idempotent: true,
1669
- agent: true,
1670
- handler: (ctx, args) => transferIssue(ctx, {
1671
- id: String(args.id),
1672
- projectId: String(args.projectId),
1673
- columnId: args.columnId ? String(args.columnId) : null,
1674
- expectedVersion: Number(args.expectedVersion),
1675
- idempotencyKey: String(args.idempotencyKey),
1676
- }),
1677
- }),
1678
- 'issue.assignSprint': defineFn({
1679
- input: { id: 'id', sprintId: 'id?', expectedVersion: 'int', idempotencyKey: 'text' },
1680
- output: { ok: 'bool', id: 'id?', version: 'int?', errors: 'json?' },
1681
- effects: [
1682
- 'read:flow.Issue',
1683
- 'write:flow.Issue',
1684
- 'read:flow.Sprint',
1685
- ...timelineEntryEffects,
1686
- ...membershipEffects,
1687
- ],
1688
- idempotent: true,
1689
- agent: true,
1690
- handler: (ctx, args) => assignSprint(ctx, {
1691
- id: String(args.id),
1692
- sprintId: args.sprintId ? String(args.sprintId) : null,
1693
- expectedVersion: Number(args.expectedVersion),
1694
- idempotencyKey: String(args.idempotencyKey),
1695
- }),
1696
- }),
1697
- 'issue.comment': defineFn({
1698
- input: {
1699
- id: 'id',
1700
- issueId: 'id',
1701
- body: 'text',
1702
- kind: 'text?',
1703
- /** Users this comment is addressed to, beyond whoever already follows. */
1704
- mentionUserIds: 'json?',
1705
- idempotencyKey: 'text',
1706
- },
1707
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
1708
- effects: [...commentEffects, 'read:user.User', 'write:mail.Mention', ...membershipEffects],
1709
- idempotent: true,
1710
- agent: true,
1711
- handler: (ctx, args) => addComment(ctx, {
1712
- id: String(args.id),
1713
- issueId: String(args.issueId),
1714
- body: String(args.body),
1715
- kind: args.kind === 'note' ? 'note' : 'comment',
1716
- mentionUserIds: Array.isArray(args.mentionUserIds) ? args.mentionUserIds.map(String) : [],
1717
- idempotencyKey: String(args.idempotencyKey),
1718
- }),
1719
- }),
1720
- /**
1721
- * Off the board, without claiming it was finished — see archiveIssue.
1722
- *
1723
- * Its own key rather than a flag on `issue.save`: taking work out of every
1724
- * figure the project reports is a different act from editing a field, and the
1725
- * catalogue can price it separately.
1726
- */
1727
- 'issue.archive': defineFn({
1728
- input: { id: 'id', expectedVersion: 'int', idempotencyKey: 'text' },
1729
- output: { ok: 'bool', id: 'id?', version: 'int?', errors: 'json?' },
1730
- effects: ['read:flow.Issue', 'write:flow.Issue', ...membershipEffects],
1731
- idempotent: true,
1732
- agent: true,
1733
- handler: (ctx, args) => archiveIssue(ctx, {
1734
- id: String(args.id),
1735
- expectedVersion: n(args.expectedVersion),
1736
- idempotencyKey: String(args.idempotencyKey),
1737
- }),
1738
- }),
1739
- 'issue.restore': defineFn({
1740
- input: { id: 'id', expectedVersion: 'int', idempotencyKey: 'text' },
1741
- output: { ok: 'bool', id: 'id?', version: 'int?', errors: 'json?' },
1742
- effects: ['read:flow.Issue', 'write:flow.Issue', ...membershipEffects],
1743
- idempotent: true,
1744
- agent: true,
1745
- handler: (ctx, args) => restoreIssue(ctx, {
1746
- id: String(args.id),
1747
- expectedVersion: n(args.expectedVersion),
1748
- idempotencyKey: String(args.idempotencyKey),
1749
- }),
1750
- }),
1751
- /** The door `issue.unfollow` never had a pair for — see startFollowing. */
1752
- 'issue.follow': defineFn({
1753
- input: { issueId: 'id', idempotencyKey: 'text' },
1754
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
1755
- effects: [
1756
- 'read:flow.Issue',
1757
- 'read:user.User',
1758
- 'read:mail.Thread',
1759
- 'read:partner.Partner',
1760
- 'read:mail.Follower',
1761
- 'write:mail.Follower',
1762
- ...membershipEffects,
1763
- ],
1764
- idempotent: true,
1765
- agent: true,
1766
- handler: (ctx, args) => startFollowing(ctx, {
1767
- issueId: String(args.issueId),
1768
- idempotencyKey: String(args.idempotencyKey),
1769
- }),
1770
- }),
1771
- /**
1772
- * Leaves an issue's thread.
1773
- *
1774
- * A separate key from commenting, because it is the opposite act: everything
1775
- * else in this module hands out subscriptions, and this is the only way to
1776
- * give one back.
1777
- */
1778
- 'issue.unfollow': defineFn({
1779
- input: { issueId: 'id', idempotencyKey: 'text' },
1780
- output: { ok: 'bool', removed: 'int?', errors: 'json?' },
1781
- // `unfollowThread` clears the follower's per-subtype rows too, which the
1782
- // effect system refused until it was said out loud — which is the point of
1783
- // it: a capability nobody declared is one nobody reviewed.
1784
- effects: [
1785
- 'read:flow.Issue',
1786
- 'read:user.User',
1787
- 'read:mail.Follower',
1788
- 'write:mail.Follower',
1789
- 'write:mail.FollowerSubtype',
1790
- ...membershipEffects,
1791
- ],
1792
- idempotent: true,
1793
- agent: true,
1794
- handler: (ctx, args) => stopFollowing(ctx, {
1795
- issueId: String(args.issueId),
1796
- idempotencyKey: String(args.idempotencyKey),
1797
- }),
1798
- }),
1799
- 'issue.dependency.add': defineFn({
1800
- input: { id: 'id', issueId: 'id', dependsOnIssueId: 'id', relation: 'text', idempotencyKey: 'text' },
1801
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
1802
- effects: [
1803
- 'read:flow.Issue',
1804
- 'read:flow.IssueDependency',
1805
- 'write:flow.IssueDependency',
1806
- ...membershipEffects,
1807
- ],
1808
- idempotent: true,
1809
- agent: true,
1810
- handler: (ctx, args) => addDependency(ctx, {
1811
- id: String(args.id),
1812
- issueId: String(args.issueId),
1813
- dependsOnIssueId: String(args.dependsOnIssueId),
1814
- relation: String(args.relation),
1815
- idempotencyKey: String(args.idempotencyKey),
1816
- }),
1817
- }),
1818
- 'issue.dependency.remove': defineFn({
1819
- input: { id: 'id' },
1820
- output: { ok: 'bool', id: 'id?', errors: 'json?' },
1821
- effects: [
1822
- 'read:flow.IssueDependency',
1823
- 'write:flow.IssueDependency',
1824
- 'read:flow.Issue',
1825
- ...membershipEffects,
1826
- ],
1827
- idempotent: true,
1828
- agent: true,
1829
- handler: async (ctx, args) => {
1830
- const existing = (await ctx.db.select('flow.IssueDependency', { id: args.id }))[0];
1831
- // The edge carries no project of its own, so it is read through the issue
1832
- // it hangs off — cutting a link between two issues is editing the project
1833
- // they are in, and needs the same standing as anything else there.
1834
- if (!existing || !(await readableRow(ctx, 'flow.Issue', existing.issueId)))
1835
- return invalid(issue('id', 'flow.error.notFound'));
1836
- const D = ctx.table('flow.IssueDependency');
1837
- await ctx.db.del(deleteFrom(D).where(eq(D.id, args.id)));
1838
- return { ok: true, id: args.id };
1839
- },
1840
- }),
1841
- /**
1842
- * Issues as picker rows, for the one field that points at another issue —
1843
- * the dependency target. `issue.list` answers a paged envelope the picker
1844
- * cannot read, and its search only takes a `listState`, so this wraps that
1845
- * the same way `crm.case.options` wraps `listCases`.
1846
- */
1847
- 'issue.options': defineFn({
1848
- input: { search: 'text?', limit: 'int?', projectId: 'id?', excludeId: 'id?' },
1849
- output: { id: 'id', title: 'text', columnName: 'text?' },
1850
- effects: [...flowReadEffects, 'read:company.Company'],
1851
- agent: true,
1852
- handler: async (ctx, args) => {
1853
- const found = await listIssues(ctx, {
1854
- ...(args.projectId ? { projectId: args.projectId } : {}),
1855
- listState: args.search ? { ...emptyIssueListState(), q: String(args.search) } : undefined,
1856
- limit: Math.max(1, Math.min(100, n(args.limit ?? 40))),
1857
- });
1858
- return found.rows
1859
- .filter((row) => !args.excludeId || row.id !== args.excludeId)
1860
- .map((row) => ({ id: row.id, title: row.title, columnName: row.columnName ?? null }));
1861
- },
1862
- }),
1863
- /** Blocking edges among a node set — the map view's one batch read, see dependenciesFor. */
1864
- 'issue.dependencies': defineFn({
1865
- input: { issueIds: 'json', includeExternalTargets: 'bool?' },
1866
- output: { issueId: 'id', dependsOnIssueId: 'id', relation: 'text' },
1867
- effects: ['read:flow.IssueDependency', 'read:flow.Issue', ...membershipEffects],
1868
- agent: true,
1869
- // The ids come from the caller, so this answered about any issue anybody
1870
- // named — including whether an issue in a project they cannot see has
1871
- // blockers, which is an existence answer about a hidden project. The map
1872
- // view passes ids it just read, so filtering costs it nothing (FLW-018).
1873
- handler: (ctx, args) => dependenciesFor(ctx, Array.isArray(args.issueIds) ? args.issueIds.map(String) : [], args.includeExternalTargets === true),
1874
- }),
1875
- };
1876
- //# sourceMappingURL=functions.js.map