@mistriwork/mistri 1.0.0-rc.12 → 1.0.0-rc.13

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 (221) hide show
  1. package/README.md +4 -3
  2. package/dist/client/assets/LayoutBuilder-MPzkVU2e.js.map +1 -1
  3. package/dist/client/assets/index-D2dHI6hR.js.map +1 -1
  4. package/dist/client/assets/shell-TreN_uLs.js.map +1 -1
  5. package/dist/docs/access-model.md +1 -1
  6. package/dist/docs/build-and-deploy.md +0 -1
  7. package/dist/docs/cli.md +1 -1
  8. package/dist/docs/glossary.md +3 -3
  9. package/dist/docs/query.md +9 -21
  10. package/dist/docs/status.md +3 -3
  11. package/dist/embed/react/chunks/LayoutBuilder-Cbxa_wve.js.map +1 -1
  12. package/dist/embed/react/chunks/app-0UZ1Re1k.js.map +1 -1
  13. package/dist/embed/react/chunks/page-Bx4o1kpQ.js.map +1 -1
  14. package/dist/embed/react/chunks/palette-Bb7Lf6eo.js.map +1 -1
  15. package/dist/embed/react/chunks/shell-DZRACiB9.js.map +1 -1
  16. package/dist/embed/react/chunks/write-BQO4CFc9.js.map +1 -1
  17. package/dist/embed/react/index.js +1 -1
  18. package/dist/server/build/dockerfile.js +1 -1
  19. package/dist/server/cli/usage.js +2 -2
  20. package/dist/ui/index.js +2 -2
  21. package/dist/ui/page.js +2 -2
  22. package/dist/ui/{shared-N4Ej8yRD.js → shared-1PD7TOTJ.js} +5 -5
  23. package/dist/ui/{shared-N4Ej8yRD.js.map → shared-1PD7TOTJ.js.map} +1 -1
  24. package/dist/ui/{shared-D5m86-4o.js → shared-1gMnOu9J.js} +6 -6
  25. package/dist/ui/{shared-D5m86-4o.js.map → shared-1gMnOu9J.js.map} +1 -1
  26. package/dist/ui/{shared-Ctaj8mR2.js → shared-5RQMi4BR.js} +3 -3
  27. package/dist/ui/{shared-Ctaj8mR2.js.map → shared-5RQMi4BR.js.map} +1 -1
  28. package/dist/ui/{shared-DpLeIATZ.js → shared-B-BUF9fx.js} +2 -2
  29. package/dist/ui/{shared-DpLeIATZ.js.map → shared-B-BUF9fx.js.map} +1 -1
  30. package/dist/ui/{shared-DWYnjItP.js → shared-B-MhiPIN.js} +9 -9
  31. package/dist/ui/{shared-DWYnjItP.js.map → shared-B-MhiPIN.js.map} +1 -1
  32. package/dist/ui/{shared-0fNuhSbG.js → shared-B07qIMlE.js} +5 -5
  33. package/dist/ui/{shared-0fNuhSbG.js.map → shared-B07qIMlE.js.map} +1 -1
  34. package/dist/ui/{shared-lYtMadRU.js → shared-B1SAS_J-.js} +3 -3
  35. package/dist/ui/{shared-lYtMadRU.js.map → shared-B1SAS_J-.js.map} +1 -1
  36. package/dist/ui/{shared-CpI0Y8M5.js → shared-B4jgU8h9.js} +6 -6
  37. package/dist/ui/{shared-CpI0Y8M5.js.map → shared-B4jgU8h9.js.map} +1 -1
  38. package/dist/ui/{shared-Cxu1c35l.js → shared-B5aBCUi7.js} +30 -30
  39. package/dist/ui/{shared-Cxu1c35l.js.map → shared-B5aBCUi7.js.map} +1 -1
  40. package/dist/ui/{shared-CAe-US1q.js → shared-B9H7_Pji.js} +5 -5
  41. package/dist/ui/{shared-CAe-US1q.js.map → shared-B9H7_Pji.js.map} +1 -1
  42. package/dist/ui/{shared-Q2bgBaYo.js → shared-BAXr20S-.js} +4 -4
  43. package/dist/ui/{shared-Q2bgBaYo.js.map → shared-BAXr20S-.js.map} +1 -1
  44. package/dist/ui/{shared-CyEefFFb.js → shared-BDDUzH-f.js} +19 -19
  45. package/dist/ui/{shared-CyEefFFb.js.map → shared-BDDUzH-f.js.map} +1 -1
  46. package/dist/ui/{shared-BdhPI6dq.js → shared-BGmkeDeW.js} +3 -3
  47. package/dist/ui/{shared-BdhPI6dq.js.map → shared-BGmkeDeW.js.map} +1 -1
  48. package/dist/ui/{shared-DONIpq2q.js → shared-BHCQ60yN.js} +2 -2
  49. package/dist/ui/{shared-DONIpq2q.js.map → shared-BHCQ60yN.js.map} +1 -1
  50. package/dist/ui/{shared-CNmaAv64.js → shared-BHsjawAG.js} +8 -8
  51. package/dist/ui/{shared-CNmaAv64.js.map → shared-BHsjawAG.js.map} +1 -1
  52. package/dist/ui/{shared-DgjU9kOy.js → shared-BIQuK_nq.js} +4 -4
  53. package/dist/ui/{shared-DgjU9kOy.js.map → shared-BIQuK_nq.js.map} +1 -1
  54. package/dist/ui/{shared-icSQAj21.js → shared-BOe4W2FI.js} +3 -3
  55. package/dist/ui/{shared-icSQAj21.js.map → shared-BOe4W2FI.js.map} +1 -1
  56. package/dist/ui/{shared-BlxoOJSk.js → shared-BPpC08ip.js} +3 -3
  57. package/dist/ui/{shared-BlxoOJSk.js.map → shared-BPpC08ip.js.map} +1 -1
  58. package/dist/ui/{shared-BtiFL37J.js → shared-BdA3LPCB.js} +2 -2
  59. package/dist/ui/{shared-BtiFL37J.js.map → shared-BdA3LPCB.js.map} +1 -1
  60. package/dist/ui/{shared-CvR94vn4.js → shared-Be3nbWsd.js} +11 -11
  61. package/dist/ui/{shared-CvR94vn4.js.map → shared-Be3nbWsd.js.map} +1 -1
  62. package/dist/ui/{shared-Bl_nF_IH.js → shared-Bf30ZLoS.js} +8 -4
  63. package/dist/ui/shared-Bf30ZLoS.js.map +1 -0
  64. package/dist/ui/{shared-DijrJ_V-.js → shared-BguP_BaR.js} +7 -7
  65. package/dist/ui/{shared-DijrJ_V-.js.map → shared-BguP_BaR.js.map} +1 -1
  66. package/dist/ui/{shared-DPAVoWY0.js → shared-BoLbc2WD.js} +17 -2
  67. package/dist/ui/{shared-DPAVoWY0.js.map → shared-BoLbc2WD.js.map} +1 -1
  68. package/dist/ui/{shared-BkdBTYwx.js → shared-BttyOW4W.js} +3 -3
  69. package/dist/ui/{shared-BkdBTYwx.js.map → shared-BttyOW4W.js.map} +1 -1
  70. package/dist/ui/{shared-CQWLz8uT.js → shared-BumxsBlA.js} +10 -10
  71. package/dist/ui/{shared-CQWLz8uT.js.map → shared-BumxsBlA.js.map} +1 -1
  72. package/dist/ui/{shared-Dzu7tFiC.js → shared-Bw73ktBk.js} +3 -3
  73. package/dist/ui/{shared-Dzu7tFiC.js.map → shared-Bw73ktBk.js.map} +1 -1
  74. package/dist/ui/{shared-BhAYErSx.js → shared-C1B0GH0e.js} +4 -4
  75. package/dist/ui/{shared-BhAYErSx.js.map → shared-C1B0GH0e.js.map} +1 -1
  76. package/dist/ui/{shared-BQJQcGgj.js → shared-C2FsyYr7.js} +4 -4
  77. package/dist/ui/{shared-BQJQcGgj.js.map → shared-C2FsyYr7.js.map} +1 -1
  78. package/dist/ui/{shared-B9lw2Ryh.js → shared-C2RU1qjv.js} +4 -4
  79. package/dist/ui/{shared-B9lw2Ryh.js.map → shared-C2RU1qjv.js.map} +1 -1
  80. package/dist/ui/{shared-DQYNI9wO.js → shared-C42f07hJ.js} +5 -5
  81. package/dist/ui/{shared-DQYNI9wO.js.map → shared-C42f07hJ.js.map} +1 -1
  82. package/dist/ui/{shared-CqCZ8wMY.js → shared-C4LkPCU4.js} +3 -3
  83. package/dist/ui/{shared-CqCZ8wMY.js.map → shared-C4LkPCU4.js.map} +1 -1
  84. package/dist/ui/{shared-BhtpgOpa.js → shared-C4wSfz6k.js} +9 -9
  85. package/dist/ui/{shared-BhtpgOpa.js.map → shared-C4wSfz6k.js.map} +1 -1
  86. package/dist/ui/{shared-BHc2Izkj.js → shared-C9DZtSFH.js} +2 -2
  87. package/dist/ui/{shared-BHc2Izkj.js.map → shared-C9DZtSFH.js.map} +1 -1
  88. package/dist/ui/{shared-DW1YuiNS.js → shared-CA52ClGo.js} +2 -2
  89. package/dist/ui/{shared-DW1YuiNS.js.map → shared-CA52ClGo.js.map} +1 -1
  90. package/dist/ui/{shared-BbSbilkh.js → shared-CBciTwm6.js} +9 -9
  91. package/dist/ui/{shared-BbSbilkh.js.map → shared-CBciTwm6.js.map} +1 -1
  92. package/dist/ui/{shared-C-J32eBn.js → shared-CL3RLKDA.js} +16 -16
  93. package/dist/ui/{shared-C-J32eBn.js.map → shared-CL3RLKDA.js.map} +1 -1
  94. package/dist/ui/{shared-Ck8S4OxW.js → shared-CLq3-_hW.js} +3 -3
  95. package/dist/ui/{shared-Ck8S4OxW.js.map → shared-CLq3-_hW.js.map} +1 -1
  96. package/dist/ui/{shared-Q5WefT7G.js → shared-CMjK-Ucd.js} +3 -3
  97. package/dist/ui/{shared-Q5WefT7G.js.map → shared-CMjK-Ucd.js.map} +1 -1
  98. package/dist/ui/{shared-D3MAuEA3.js → shared-CPjpSFGh.js} +2 -2
  99. package/dist/ui/{shared-D3MAuEA3.js.map → shared-CPjpSFGh.js.map} +1 -1
  100. package/dist/ui/{shared-VshXGwXP.js → shared-CSPhENq3.js} +2 -2
  101. package/dist/ui/{shared-VshXGwXP.js.map → shared-CSPhENq3.js.map} +1 -1
  102. package/dist/ui/{shared-DJrJaE73.js → shared-CZJE4Bmp.js} +3 -3
  103. package/dist/ui/{shared-DJrJaE73.js.map → shared-CZJE4Bmp.js.map} +1 -1
  104. package/dist/ui/{shared-D7ONOwI7.js → shared-C_BhUL2I.js} +7 -7
  105. package/dist/ui/{shared-D7ONOwI7.js.map → shared-C_BhUL2I.js.map} +1 -1
  106. package/dist/ui/{shared-j-2peBIB.js → shared-CbeujwdU.js} +4 -4
  107. package/dist/ui/{shared-j-2peBIB.js.map → shared-CbeujwdU.js.map} +1 -1
  108. package/dist/ui/{shared-D5GrOEa2.js → shared-Cbf-o4Dt.js} +4 -4
  109. package/dist/ui/{shared-D5GrOEa2.js.map → shared-Cbf-o4Dt.js.map} +1 -1
  110. package/dist/ui/{shared-HwiPIajr.js → shared-CdNmeNHh.js} +3 -3
  111. package/dist/ui/{shared-HwiPIajr.js.map → shared-CdNmeNHh.js.map} +1 -1
  112. package/dist/ui/{shared-ZCFt-CPb.js → shared-CdQOMD8J.js} +3 -3
  113. package/dist/ui/{shared-ZCFt-CPb.js.map → shared-CdQOMD8J.js.map} +1 -1
  114. package/dist/ui/{shared-ClhXSGGK.js → shared-CdiPYlTh.js} +2 -2
  115. package/dist/ui/{shared-ClhXSGGK.js.map → shared-CdiPYlTh.js.map} +1 -1
  116. package/dist/ui/{shared-DA8_pVRZ.js → shared-CepLAhwm.js} +2 -2
  117. package/dist/ui/{shared-DA8_pVRZ.js.map → shared-CepLAhwm.js.map} +1 -1
  118. package/dist/ui/{shared-BrYKjrnM.js → shared-Ch82h_Fu.js} +6 -6
  119. package/dist/ui/{shared-BrYKjrnM.js.map → shared-Ch82h_Fu.js.map} +1 -1
  120. package/dist/ui/{shared-C4UrE8Fb.js → shared-Chp88all.js} +3 -3
  121. package/dist/ui/{shared-C4UrE8Fb.js.map → shared-Chp88all.js.map} +1 -1
  122. package/dist/ui/{shared-CWa80DTO.js → shared-Ci16s2rN.js} +9 -9
  123. package/dist/ui/{shared-CWa80DTO.js.map → shared-Ci16s2rN.js.map} +1 -1
  124. package/dist/ui/{shared-tksTLD6Q.js → shared-CiqNkoE1.js} +5 -5
  125. package/dist/ui/{shared-tksTLD6Q.js.map → shared-CiqNkoE1.js.map} +1 -1
  126. package/dist/ui/{shared-yt7DjSrq.js → shared-CpMhOq8F.js} +2 -2
  127. package/dist/ui/{shared-yt7DjSrq.js.map → shared-CpMhOq8F.js.map} +1 -1
  128. package/dist/ui/{shared-Dm0z5WUl.js → shared-CrWv5JKH.js} +6 -6
  129. package/dist/ui/{shared-Dm0z5WUl.js.map → shared-CrWv5JKH.js.map} +1 -1
  130. package/dist/ui/{shared-CQL3FGHc.js → shared-Csfi3Pti.js} +2 -2
  131. package/dist/ui/{shared-CQL3FGHc.js.map → shared-Csfi3Pti.js.map} +1 -1
  132. package/dist/ui/{shared-BKNRbm-V.js → shared-CuZt26rm.js} +2 -2
  133. package/dist/ui/{shared-BKNRbm-V.js.map → shared-CuZt26rm.js.map} +1 -1
  134. package/dist/ui/{shared-Guq3upiR.js → shared-Cws_z-TS.js} +2 -2
  135. package/dist/ui/{shared-Guq3upiR.js.map → shared-Cws_z-TS.js.map} +1 -1
  136. package/dist/ui/{shared-Bw_qZeIj.js → shared-D1KWuCg6.js} +2 -2
  137. package/dist/ui/{shared-Bw_qZeIj.js.map → shared-D1KWuCg6.js.map} +1 -1
  138. package/dist/ui/{shared-CuCZKwXW.js → shared-D66ju_Cb.js} +23 -23
  139. package/dist/ui/{shared-CuCZKwXW.js.map → shared-D66ju_Cb.js.map} +1 -1
  140. package/dist/ui/{shared-DYfX7NSM.js → shared-DGaQZXnw.js} +2 -2
  141. package/dist/ui/{shared-DYfX7NSM.js.map → shared-DGaQZXnw.js.map} +1 -1
  142. package/dist/ui/{shared-B3Hp8tOv.js → shared-DHy41sET.js} +6 -6
  143. package/dist/ui/{shared-B3Hp8tOv.js.map → shared-DHy41sET.js.map} +1 -1
  144. package/dist/ui/{shared-CXyd7IKi.js → shared-DKEOMQ6l.js} +2 -2
  145. package/dist/ui/{shared-CXyd7IKi.js.map → shared-DKEOMQ6l.js.map} +1 -1
  146. package/dist/ui/{shared-Ccmc8YO0.js → shared-DSUICuaJ.js} +33 -33
  147. package/dist/ui/{shared-Ccmc8YO0.js.map → shared-DSUICuaJ.js.map} +1 -1
  148. package/dist/ui/{shared-CL2iw_js.js → shared-DUPMRoO0.js} +13 -13
  149. package/dist/ui/{shared-CL2iw_js.js.map → shared-DUPMRoO0.js.map} +1 -1
  150. package/dist/ui/{shared-Dtp4eRul.js → shared-DVfdm6ah.js} +2 -2
  151. package/dist/ui/{shared-Dtp4eRul.js.map → shared-DVfdm6ah.js.map} +1 -1
  152. package/dist/ui/{shared-BJ5Ex32G.js → shared-DXM7d7lJ.js} +3 -3
  153. package/dist/ui/{shared-BJ5Ex32G.js.map → shared-DXM7d7lJ.js.map} +1 -1
  154. package/dist/ui/{shared-BFr6ld0e.js → shared-DXbMlcev.js} +2 -2
  155. package/dist/ui/{shared-BFr6ld0e.js.map → shared-DXbMlcev.js.map} +1 -1
  156. package/dist/ui/{shared-BUp3jv-N.js → shared-D_SkPtJ9.js} +6 -6
  157. package/dist/ui/{shared-BUp3jv-N.js.map → shared-D_SkPtJ9.js.map} +1 -1
  158. package/dist/ui/{shared-CdNomVzH.js → shared-Dd21k2ic.js} +4 -4
  159. package/dist/ui/{shared-CdNomVzH.js.map → shared-Dd21k2ic.js.map} +1 -1
  160. package/dist/ui/{shared-gRMbxmpu.js → shared-Dh0nHtLZ.js} +8 -8
  161. package/dist/ui/{shared-gRMbxmpu.js.map → shared-Dh0nHtLZ.js.map} +1 -1
  162. package/dist/ui/{shared-BKGJgjog.js → shared-DkOdSpSK.js} +3 -3
  163. package/dist/ui/{shared-BKGJgjog.js.map → shared-DkOdSpSK.js.map} +1 -1
  164. package/dist/ui/{shared-BMsh72Uq.js → shared-Dkph5ckT.js} +2 -2
  165. package/dist/ui/{shared-BMsh72Uq.js.map → shared-Dkph5ckT.js.map} +1 -1
  166. package/dist/ui/{shared-Be1HpDOB.js → shared-Dl1_Nx--.js} +3 -3
  167. package/dist/ui/{shared-Be1HpDOB.js.map → shared-Dl1_Nx--.js.map} +1 -1
  168. package/dist/ui/{shared-BQIZWOoJ.js → shared-Dm0IGbAf.js} +2 -2
  169. package/dist/ui/{shared-BQIZWOoJ.js.map → shared-Dm0IGbAf.js.map} +1 -1
  170. package/dist/ui/{shared-DSUtcU5S.js → shared-DnIkTpPr.js} +5 -5
  171. package/dist/ui/{shared-DSUtcU5S.js.map → shared-DnIkTpPr.js.map} +1 -1
  172. package/dist/ui/{shared-DsxGbYlV.js → shared-Docl_0tq.js} +3 -3
  173. package/dist/ui/{shared-DsxGbYlV.js.map → shared-Docl_0tq.js.map} +1 -1
  174. package/dist/ui/{shared-DZskrV26.js → shared-DprrHC72.js} +2 -2
  175. package/dist/ui/{shared-DZskrV26.js.map → shared-DprrHC72.js.map} +1 -1
  176. package/dist/ui/{shared-Bmw43Hwf.js → shared-DyKsJTZs.js} +2 -2
  177. package/dist/ui/{shared-Bmw43Hwf.js.map → shared-DyKsJTZs.js.map} +1 -1
  178. package/dist/ui/{shared-BLG88Pya.js → shared-FO7vfI3F.js} +4 -4
  179. package/dist/ui/{shared-BLG88Pya.js.map → shared-FO7vfI3F.js.map} +1 -1
  180. package/dist/ui/{shared-DLSd80D1.js → shared-HalAVHjv.js} +3 -3
  181. package/dist/ui/{shared-DLSd80D1.js.map → shared-HalAVHjv.js.map} +1 -1
  182. package/dist/ui/{shared-D1mMBLdj.js → shared-JvcI-LWp.js} +15 -15
  183. package/dist/ui/{shared-D1mMBLdj.js.map → shared-JvcI-LWp.js.map} +1 -1
  184. package/dist/ui/{shared-C6Hv_4O0.js → shared-K7Ym27yg.js} +2 -2
  185. package/dist/ui/{shared-C6Hv_4O0.js.map → shared-K7Ym27yg.js.map} +1 -1
  186. package/dist/ui/{shared-B39ln7oi.js → shared-SzlnwfJO.js} +3 -3
  187. package/dist/ui/{shared-B39ln7oi.js.map → shared-SzlnwfJO.js.map} +1 -1
  188. package/dist/ui/{shared-DgPn_Jll.js → shared-TrGbd1FY.js} +3 -3
  189. package/dist/ui/{shared-DgPn_Jll.js.map → shared-TrGbd1FY.js.map} +1 -1
  190. package/dist/ui/{shared-DrFb-XtA.js → shared-WhbuObEW.js} +2 -2
  191. package/dist/ui/{shared-DrFb-XtA.js.map → shared-WhbuObEW.js.map} +1 -1
  192. package/dist/ui/{shared-DiFQljcq.js → shared-XcSKDp6N.js} +11 -11
  193. package/dist/ui/{shared-DiFQljcq.js.map → shared-XcSKDp6N.js.map} +1 -1
  194. package/dist/ui/{shared-CMAg58rY.js → shared-Z4uBJU6I.js} +7 -6
  195. package/dist/ui/shared-Z4uBJU6I.js.map +1 -0
  196. package/dist/ui/{shared-BnUptuUp.js → shared-bAgeiRa5.js} +2 -2
  197. package/dist/ui/{shared-BnUptuUp.js.map → shared-bAgeiRa5.js.map} +1 -1
  198. package/dist/ui/{shared-BxMvSjey.js → shared-cgXG7OgZ.js} +5 -5
  199. package/dist/ui/{shared-BxMvSjey.js.map → shared-cgXG7OgZ.js.map} +1 -1
  200. package/dist/ui/{shared-u4CG2kQJ.js → shared-eZ0SB_zm.js} +2 -2
  201. package/dist/ui/{shared-u4CG2kQJ.js.map → shared-eZ0SB_zm.js.map} +1 -1
  202. package/dist/ui/{shared-L90bWW8e.js → shared-frKFb79C.js} +2 -2
  203. package/dist/ui/{shared-L90bWW8e.js.map → shared-frKFb79C.js.map} +1 -1
  204. package/dist/ui/{shared-Dd34nhkw.js → shared-hAayNSRA.js} +3 -3
  205. package/dist/ui/{shared-Dd34nhkw.js.map → shared-hAayNSRA.js.map} +1 -1
  206. package/dist/ui/{shared-DzC64cpp.js → shared-j_J16p2B.js} +2 -2
  207. package/dist/ui/{shared-DzC64cpp.js.map → shared-j_J16p2B.js.map} +1 -1
  208. package/dist/ui/{shared-DX7HRIV-.js → shared-tqpl5N3g.js} +6 -6
  209. package/dist/ui/{shared-DX7HRIV-.js.map → shared-tqpl5N3g.js.map} +1 -1
  210. package/dist/ui/{shared-BS5dBMpA.js → shared-y-6_ZDts.js} +2 -2
  211. package/dist/ui/{shared-BS5dBMpA.js.map → shared-y-6_ZDts.js.map} +1 -1
  212. package/dist/ui/{shared-Cv5v_MP1.js → shared-zG6e1Rhz.js} +13 -13
  213. package/dist/ui/{shared-Cv5v_MP1.js.map → shared-zG6e1Rhz.js.map} +1 -1
  214. package/dist/ui/testing.js +1 -1
  215. package/package.json +4 -4
  216. package/dist/docs/cli-browser.md +0 -232
  217. package/dist/docs/database-browser.md +0 -115
  218. package/dist/docs/keyboard.md +0 -63
  219. package/dist/docs/mcp.md +0 -86
  220. package/dist/ui/shared-Bl_nF_IH.js.map +0 -1
  221. package/dist/ui/shared-CMAg58rY.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"shared-DzC64cpp.js","names":[],"sources":["../../../kit/src/client/copy/record/components/PageFlows.ts","../../../kit/src/client/components/PageFlows.tsx"],"sourcesContent":["/** What PageFlows says, in the record page room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n notRunning: 'Flows run when the server is started with --jobs.',\n noRuns: 'No flows have run on this record.',\n flowsOnThisRecord: 'Flow runs on this record appear here.',\n waitingFor: 'Waiting for {what}',\n until: 'Until {when}',\n started: 'Started {when}',\n start: 'Start {name}',\n startAFlow: 'Start a flow',\n starting: 'Starting…',\n couldNotStart: 'Could not start {name}: {reason}',\n running: 'Running',\n waiting: 'Waiting',\n completed: 'Completed',\n failed: 'Failed',\n cancelled: 'Cancelled',\n diverged: 'Diverged',\n stepDone: 'done',\n steps: 'Steps',\n});\n","/**\n * A page's flows section: the record's row-driven flow runs,\n * newest first — each run's state, what it waits for, the problem a failed\n * one stopped on, and its steps — and a button for each manual flow this\n * reader may start. The server answers for this reader (server/recordFlows.ts):\n * a record they cannot read has no runs for them, and a flow or step they\n * cannot read is named by its number. This module only says what it was handed.\n *\n * `running: false` says the server has no `--jobs` host: the runs below\n * would never move, so the section says how to get one rather than an\n * empty list that reads as \"nothing happened\".\n *\n * The page hands it its reads and its frame (PageSections.tsx), as it does\n * the history, so this module does not join the page's import cycle.\n */\nimport { useState, type ReactNode } from 'react';\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { formatDateTime } from '../locale.js';\nimport type { TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport { Empty } from './Notes.js';\nimport { DropItem, DropMenu } from '@mistriwork/ui/DropMenu.js';\nimport { say } from '../copy/record/components/PageFlows.js';\nimport './PageFlows.css';\n\nexport interface FlowRunStep {\n label: string;\n status: string;\n at: string;\n /** Where it stands in its flow, where its name says: the position, and its lane where several share one. */\n position?: number;\n member?: number;\n}\nexport interface FlowRun {\n id: string;\n flow: string;\n name: string;\n state: string;\n waitingFor: string | null;\n wakeAt: string | null;\n problem: string | null;\n startedAt: string;\n updatedAt: string;\n steps: FlowRunStep[];\n}\ninterface FlowsReply {\n running: boolean;\n runs: FlowRun[];\n manual: Array<{ id: string; name: string }>;\n}\n/** A request through the page's connection, as `usePageApi` makes one. */\nexport type FlowsApi = (path: string, body: Record<string, unknown>) => Promise<unknown>;\ninterface FlowsProps {\n base: TableMeta;\n recordKey: Record<string, unknown>;\n api: FlowsApi;\n /** An authoring preview has no record to read: the section shows its shape. */\n preview?: boolean;\n /** The section's frame: its heading around `body`, or its heading and a problem where the read failed. */\n frame: (body: ReactNode, broken?: string) => ReactNode;\n /** What stands in the section while the first read is out. */\n loading: ReactNode;\n}\n\n/** A run's state in a word; a state this build does not know is said as the server named it. */\nfunction sayState(state: string): string {\n switch (state) {\n case 'running':\n return say('running');\n case 'waiting':\n return say('waiting');\n case 'completed':\n return say('completed');\n case 'failed':\n return say('failed');\n case 'cancelled':\n return say('cancelled');\n case 'diverged':\n return say('diverged');\n default:\n return state.charAt(0).toUpperCase() + state.slice(1);\n }\n}\n\nconst sayStatus = (status: string): string => (status === 'completed' ? say('stepDone') : status);\n\nfunction moment(iso: string): string {\n const when = new Date(iso);\n return Number.isNaN(when.getTime()) ? iso : formatDateTime(when);\n}\n\n/** The record's flow runs, with a Start for each manual flow the reader may begin. */\nexport function RecordFlows({ base, recordKey, api, preview, frame, loading }: FlowsProps) {\n const client = useQueryClient();\n const queryKey = ['page-flows', base.id, recordKey];\n const flows = useQuery({\n queryKey,\n queryFn: async () => (await api('/api/record-flows', { table: base.id, key: recordKey })) as FlowsReply,\n enabled: !preview,\n staleTime: 0,\n });\n const [refusal, setRefusal] = useState<string | undefined>();\n const start = useMutation({\n mutationFn: async (flow: { id: string; name: string }) => {\n setRefusal(undefined);\n try {\n await api('/api/record-flows/start', { table: base.id, key: recordKey, flow: flow.id });\n } catch (error) {\n setRefusal(say('couldNotStart', { name: flow.name, reason: (error as Error).message }));\n throw error;\n }\n },\n // The run appears a moment after the start: ask again once it is accepted.\n onSuccess: () => client.invalidateQueries({ queryKey }),\n });\n if (preview) return frame(<Empty text={say('flowsOnThisRecord')} />);\n if (flows.isPending) return loading;\n if (flows.isError) return frame(null, (flows.error as Error).message);\n const { running, runs, manual } = flows.data;\n const pending = start.isPending ? start.variables?.id : undefined;\n return frame(\n <div className=\"flows\">\n {!running && <p className=\"flows-note\">{say('notRunning')}</p>}\n {running && !runs.length && <p className=\"flows-note\">{say('noRuns')}</p>}\n {runs.length > 0 && (\n <ol className=\"flows-runs\">\n {runs.map((run, i) => (\n <FlowRunItem key={run.id} run={run} open={i === 0} />\n ))}\n </ol>\n )}\n {manual.length > 0 && (\n <div className=\"flows-start\">\n {manual.length > 2 ? (\n <DropMenu\n className=\"page-actions-menu\"\n triggerClassName=\"ghost page-action\"\n label={start.isPending ? say('starting') : say('startAFlow')}\n popupClassName=\"page-actions-popup\"\n align=\"start\"\n >\n {manual.map((flow) => (\n <DropItem key={flow.id} className=\"page-actions-item\" disabled={start.isPending} onClick={() => start.mutate(flow)}>\n {say('start', { name: flow.name })}\n </DropItem>\n ))}\n </DropMenu>\n ) : (\n manual.map((flow) => (\n <button\n key={flow.id}\n type=\"button\"\n className=\"ghost page-action\"\n disabled={start.isPending}\n onClick={() => start.mutate(flow)}\n >\n {pending === flow.id ? say('starting') : say('start', { name: flow.name })}\n </button>\n ))\n )}\n {refusal && (\n <p className=\"flows-problem\" role=\"alert\">\n {refusal}\n </p>\n )}\n </div>\n )}\n </div>,\n );\n}\n\nfunction FlowRunItem({ run, open }: { run: FlowRun; open: boolean }) {\n const waiting =\n run.state === 'waiting'\n ? run.waitingFor\n ? say('waitingFor', { what: run.waitingFor })\n : run.wakeAt\n ? say('until', { when: moment(run.wakeAt) })\n : null\n : null;\n return (\n <li className=\"flows-run\">\n <details open={open}>\n <summary className=\"flows-head\">\n <span className=\"flows-name\">{run.name}</span>\n <span className={`flows-state flows-state-${run.state}`}>{sayState(run.state)}</span>\n <time className=\"flows-when\" dateTime={run.startedAt} title={run.startedAt}>\n {say('started', { when: moment(run.startedAt) })}\n </time>\n </summary>\n {waiting && <p className=\"flows-wait\">{waiting}</p>}\n {run.problem && (\n <p className=\"flows-problem\" role=\"alert\">\n {run.problem}\n </p>\n )}\n {run.steps.length > 0 && (\n <ol className=\"flows-steps\" aria-label={say('steps')}>\n {run.steps.map((step, i) => (\n <li key={`${step.at}-${i}`} className=\"flows-step\">\n <span className=\"flows-step-label\">{step.label}</span>\n <span className={`flows-step-status flows-step-${step.status}`}>{sayStatus(step.status)}</span>\n </li>\n ))}\n </ol>\n )}\n </details>\n </li>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"shared-j_J16p2B.js","names":[],"sources":["../../../kit/src/client/copy/record/components/PageFlows.ts","../../../kit/src/client/components/PageFlows.tsx"],"sourcesContent":["/** What PageFlows says, in the record page room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n notRunning: 'Flows run when the server is started with --jobs.',\n noRuns: 'No flows have run on this record.',\n flowsOnThisRecord: 'Flow runs on this record appear here.',\n waitingFor: 'Waiting for {what}',\n until: 'Until {when}',\n started: 'Started {when}',\n start: 'Start {name}',\n startAFlow: 'Start a flow',\n starting: 'Starting…',\n couldNotStart: 'Could not start {name}: {reason}',\n running: 'Running',\n waiting: 'Waiting',\n completed: 'Completed',\n failed: 'Failed',\n cancelled: 'Cancelled',\n diverged: 'Diverged',\n stepDone: 'done',\n steps: 'Steps',\n});\n","/**\n * A page's flows section: the record's row-driven flow runs,\n * newest first — each run's state, what it waits for, the problem a failed\n * one stopped on, and its steps — and a button for each manual flow this\n * reader may start. The server answers for this reader (server/recordFlows.ts):\n * a record they cannot read has no runs for them, and a flow or step they\n * cannot read is named by its number. This module only says what it was handed.\n *\n * `running: false` says the server has no `--jobs` host: the runs below\n * would never move, so the section says how to get one rather than an\n * empty list that reads as \"nothing happened\".\n *\n * The page hands it its reads and its frame (PageSections.tsx), as it does\n * the history, so this module does not join the page's import cycle.\n */\nimport { useState, type ReactNode } from 'react';\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { formatDateTime } from '../locale.js';\nimport type { TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport { Empty } from './Notes.js';\nimport { DropItem, DropMenu } from '@mistriwork/ui/DropMenu.js';\nimport { say } from '../copy/record/components/PageFlows.js';\nimport './PageFlows.css';\n\nexport interface FlowRunStep {\n label: string;\n status: string;\n at: string;\n /** Where it stands in its flow, where its name says: the position, and its lane where several share one. */\n position?: number;\n member?: number;\n}\nexport interface FlowRun {\n id: string;\n flow: string;\n name: string;\n state: string;\n waitingFor: string | null;\n wakeAt: string | null;\n problem: string | null;\n startedAt: string;\n updatedAt: string;\n steps: FlowRunStep[];\n}\ninterface FlowsReply {\n running: boolean;\n runs: FlowRun[];\n manual: Array<{ id: string; name: string }>;\n}\n/** A request through the page's connection, as `usePageApi` makes one. */\nexport type FlowsApi = (path: string, body: Record<string, unknown>) => Promise<unknown>;\ninterface FlowsProps {\n base: TableMeta;\n recordKey: Record<string, unknown>;\n api: FlowsApi;\n /** An authoring preview has no record to read: the section shows its shape. */\n preview?: boolean;\n /** The section's frame: its heading around `body`, or its heading and a problem where the read failed. */\n frame: (body: ReactNode, broken?: string) => ReactNode;\n /** What stands in the section while the first read is out. */\n loading: ReactNode;\n}\n\n/** A run's state in a word; a state this build does not know is said as the server named it. */\nfunction sayState(state: string): string {\n switch (state) {\n case 'running':\n return say('running');\n case 'waiting':\n return say('waiting');\n case 'completed':\n return say('completed');\n case 'failed':\n return say('failed');\n case 'cancelled':\n return say('cancelled');\n case 'diverged':\n return say('diverged');\n default:\n return state.charAt(0).toUpperCase() + state.slice(1);\n }\n}\n\nconst sayStatus = (status: string): string => (status === 'completed' ? say('stepDone') : status);\n\nfunction moment(iso: string): string {\n const when = new Date(iso);\n return Number.isNaN(when.getTime()) ? iso : formatDateTime(when);\n}\n\n/** The record's flow runs, with a Start for each manual flow the reader may begin. */\nexport function RecordFlows({ base, recordKey, api, preview, frame, loading }: FlowsProps) {\n const client = useQueryClient();\n const queryKey = ['page-flows', base.id, recordKey];\n const flows = useQuery({\n queryKey,\n queryFn: async () => (await api('/api/record-flows', { table: base.id, key: recordKey })) as FlowsReply,\n enabled: !preview,\n staleTime: 0,\n });\n const [refusal, setRefusal] = useState<string | undefined>();\n const start = useMutation({\n mutationFn: async (flow: { id: string; name: string }) => {\n setRefusal(undefined);\n try {\n await api('/api/record-flows/start', { table: base.id, key: recordKey, flow: flow.id });\n } catch (error) {\n setRefusal(say('couldNotStart', { name: flow.name, reason: (error as Error).message }));\n throw error;\n }\n },\n // The run appears a moment after the start: ask again once it is accepted.\n onSuccess: () => client.invalidateQueries({ queryKey }),\n });\n if (preview) return frame(<Empty text={say('flowsOnThisRecord')} />);\n if (flows.isPending) return loading;\n if (flows.isError) return frame(null, (flows.error as Error).message);\n const { running, runs, manual } = flows.data;\n const pending = start.isPending ? start.variables?.id : undefined;\n return frame(\n <div className=\"flows\">\n {!running && <p className=\"flows-note\">{say('notRunning')}</p>}\n {running && !runs.length && <p className=\"flows-note\">{say('noRuns')}</p>}\n {runs.length > 0 && (\n <ol className=\"flows-runs\">\n {runs.map((run, i) => (\n <FlowRunItem key={run.id} run={run} open={i === 0} />\n ))}\n </ol>\n )}\n {manual.length > 0 && (\n <div className=\"flows-start\">\n {manual.length > 2 ? (\n <DropMenu\n className=\"page-actions-menu\"\n triggerClassName=\"ghost page-action\"\n label={start.isPending ? say('starting') : say('startAFlow')}\n popupClassName=\"page-actions-popup\"\n align=\"start\"\n >\n {manual.map((flow) => (\n <DropItem key={flow.id} className=\"page-actions-item\" disabled={start.isPending} onClick={() => start.mutate(flow)}>\n {say('start', { name: flow.name })}\n </DropItem>\n ))}\n </DropMenu>\n ) : (\n manual.map((flow) => (\n <button\n key={flow.id}\n type=\"button\"\n className=\"ghost page-action\"\n disabled={start.isPending}\n onClick={() => start.mutate(flow)}\n >\n {pending === flow.id ? say('starting') : say('start', { name: flow.name })}\n </button>\n ))\n )}\n {refusal && (\n <p className=\"flows-problem\" role=\"alert\">\n {refusal}\n </p>\n )}\n </div>\n )}\n </div>,\n );\n}\n\nfunction FlowRunItem({ run, open }: { run: FlowRun; open: boolean }) {\n const waiting =\n run.state === 'waiting'\n ? run.waitingFor\n ? say('waitingFor', { what: run.waitingFor })\n : run.wakeAt\n ? say('until', { when: moment(run.wakeAt) })\n : null\n : null;\n return (\n <li className=\"flows-run\">\n <details open={open}>\n <summary className=\"flows-head\">\n <span className=\"flows-name\">{run.name}</span>\n <span className={`flows-state flows-state-${run.state}`}>{sayState(run.state)}</span>\n <time className=\"flows-when\" dateTime={run.startedAt} title={run.startedAt}>\n {say('started', { when: moment(run.startedAt) })}\n </time>\n </summary>\n {waiting && <p className=\"flows-wait\">{waiting}</p>}\n {run.problem && (\n <p className=\"flows-problem\" role=\"alert\">\n {run.problem}\n </p>\n )}\n {run.steps.length > 0 && (\n <ol className=\"flows-steps\" aria-label={say('steps')}>\n {run.steps.map((step, i) => (\n <li key={`${step.at}-${i}`} className=\"flows-step\">\n <span className=\"flows-step-label\">{step.label}</span>\n <span className={`flows-step-status flows-step-${step.status}`}>{sayStatus(step.status)}</span>\n </li>\n ))}\n </ol>\n )}\n </details>\n </li>\n );\n}\n"],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  import { Q as Problem, Z as Empty, ht as Icon, it as useQuery } from "./shared-poc11xxo.js";
2
2
  import { Wt as formatDateTime, gt as defineMessages, ut as humanName, yn as keepPreviousData } from "./shared-DJZjSi3J.js";
3
- import { _ as openRecord, c as columnLabel, d as findTable, i as api } from "./shared-DPAVoWY0.js";
4
- import { f as Value } from "./shared-C4UrE8Fb.js";
3
+ import { _ as openRecord, c as columnLabel, d as findTable, i as api } from "./shared-BoLbc2WD.js";
4
+ import { f as Value } from "./shared-Chp88all.js";
5
5
  import { r as recordNoun, t as headingOf } from "./shared-BZ8KfT9k.js";
6
6
  import { u as resourceOf } from "./shared-DpVb48sM.js";
7
- import { whoWrote } from "./shared-Q2bgBaYo.js";
8
- import { t as activeApp } from "./shared-DYfX7NSM.js";
9
- import "./shared-C-J32eBn.js";
7
+ import { whoWrote } from "./shared-BAXr20S-.js";
8
+ import { t as activeApp } from "./shared-DGaQZXnw.js";
9
+ import "./shared-CL3RLKDA.js";
10
10
  import { useDeferredValue, useId, useState } from "react";
11
11
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
12
12
  // packages/mistri/src/client/copy/dashboards/components/DashboardActivity.ts
@@ -307,4 +307,4 @@ function ActivityFeed({ section, dashboard, at }) {
307
307
  }
308
308
  export { ActivityFeed };
309
309
 
310
- //# sourceMappingURL=shared-DX7HRIV-.js.map
310
+ //# sourceMappingURL=shared-tqpl5N3g.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared-DX7HRIV-.js","names":["_Fragment"],"sources":["../../src/client/copy/dashboards/components/DashboardActivity.ts","../../src/client/components/DashboardActivity.tsx"],"sourcesContent":["/** What DashboardActivity says, in the dashboards room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '@mistriwork/kit/client/messages.js';\n\nexport const say = defineMessages({\n yesterday: 'Yesterday',\n thisWeek: 'This week',\n new: 'New {noun}',\n to: 'to',\n noChangesMatch: 'No changes {said} match “{search}”.',\n noChanges: 'No changes {said}.',\n showFewer: 'Show fewer',\n showMore: 'Show {entriesCount} more',\n period: 'Period of {title}',\n theActivity: 'the activity',\n searchActivity: 'Search activity',\n edited: '{headingOf} edited',\n fieldsChanged: { one: '{count} field changed', other: '{count} fields changed' },\n changeNoun: 'change',\n changesNoun: 'changes',\n});\n","/**\n * A dashboard's activity feed (`activity()`): the newest changes across the\n * resources the section names, from their record history — each with its\n * resource's mark, what the write did, the record by its name, who made it\n * and when — under a segmented Today / Yesterday / This week and a search.\n *\n * The server answers for this reader (server/recordActivity.ts): a change is\n * said only about a record they can read now, and a field they may not read\n * says that it changed and nothing else, so this module only says what it\n * was handed. The period is the server's to bound, in the App's own day; the\n * search narrows the changes the period read, here, as a reader types.\n * Loaded the first time a dashboard holds a feed (onDemand.tsx).\n */\nimport { useDeferredValue, useId, useState, type ReactNode } from 'react';\nimport { keepPreviousData, useQuery } from '@tanstack/react-query';\nimport { api, columnLabel, findTable, openRecord } from '@mistriwork/kit/client/core.js';\nimport { activeApp } from '../appState.js';\nimport { formatDateTime } from '@mistriwork/kit/client/locale.js';\nimport { ACTIVITY_MAX } from '../../shared/appModel.js';\nimport { humanName } from '@mistriwork/engine/shared/model.js';\nimport { headingOf, recordNoun } from '@mistriwork/engine/shared/appNoun.js';\nimport type { ColumnMeta, TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport { resourceOf } from '@mistriwork/kit/client/components/appRooms.js';\nimport type { Section } from '@mistriwork/kit/client/components/dashboardModel.js';\nimport { whoWrote, type HistoryEntry, type HistoryField } from '@mistriwork/kit/client/components/PageHistory.js';\nimport { Empty, Problem } from '@mistriwork/kit/client/components/Notes.js';\nimport { Icon } from '@mistriwork/kit/client/components/Icon.js';\nimport { Value } from '@mistriwork/kit/client/components/Value.js';\nimport './DashboardActivity.css';\nimport { say } from '../copy/dashboards/components/DashboardActivity.js';\n\ninterface ActivityEntry extends HistoryEntry {\n table: string;\n key: Record<string, unknown>;\n label: string;\n}\ntype Period = 'today' | 'yesterday' | 'week';\nconst PERIODS: Array<{ value: Period; label: string; said: string }> = [\n { value: 'today', label: say('common.today'), said: 'today' },\n { value: 'yesterday', label: say('yesterday'), said: 'yesterday' },\n { value: 'week', label: say('thisWeek'), said: 'this week' },\n];\n\n/** What a change was, as its title: the action or command by its label, else a new record or an edit of one. */\nfunction titleOf(entry: ActivityEntry, noun: string): string {\n if (entry.action) return entry.action;\n return entry.kind === 'insert' ? say('new', { noun }) : say('edited', { headingOf: headingOf(noun) });\n}\n\n/* The fields a line can say whole: ones the reader may read, with a value to say, and not a reference, whose\n stored value is its key — the record's own page says those by name (PageHistory.tsx). */\nconst sayable = (table: TableMeta | undefined, field: HistoryField) =>\n !field.hidden && !field.redacted && !table?.columns.find((column) => column.name === field.column)?.references;\n\n/** A change's detail: its first field from what to what, in the column's own dress. */\nfunction Changed({ entry, table }: { entry: ActivityEntry; table: TableMeta | undefined }) {\n /* One line: the change's first field it can say, else how many changed. The record's own history says the rest. */\n const said = entry.fields.filter((field) => sayable(table, field)).slice(0, entry.kind === 'insert' ? 0 : 1);\n const rest = entry.kind === 'insert' || said.length ? 0 : entry.fields.length;\n if (!said.length && !rest) return null;\n const col = (name: string) => table?.columns.find((column) => column.name === name) as ColumnMeta | undefined;\n const caption = (field: HistoryField) =>\n (columnLabel(entry.table, field.column) as string | null) ?? field.label ?? humanName(field.column);\n const draw = (field: HistoryField, value: HistoryField['after']): ReactNode => (\n <Value col={col(field.column)} value={value ?? null} tableId={entry.table} compact />\n );\n return (\n <span className=\"activity-changed\">\n {said.map((field) => (\n <span key={field.column} className=\"activity-field\">\n <span className=\"activity-caption\">{caption(field)}</span>{' '}\n {field.before !== undefined && field.before !== null && (\n <>\n <span className=\"activity-before\">{draw(field, field.before)}</span>\n <span className=\"activity-arrow\" aria-label={say('to')}>\n {' '}\n →{' '}\n </span>\n </>\n )}\n <span className=\"activity-after\">{draw(field, field.after)}</span>\n </span>\n ))}\n {rest > 0 && <span className=\"activity-field activity-more-fields\">{say('fieldsChanged', { count: rest })}</span>}\n </span>\n );\n}\n\n/** When, as the period says it: a time today or yesterday, a weekday and a time this week. */\nfunction when(at: string, period: Period): string {\n const date = new Date(at);\n if (Number.isNaN(date.getTime())) return at;\n return formatDateTime(\n date,\n period === 'week' ? { weekday: 'short', hour: 'numeric', minute: '2-digit' } : { hour: 'numeric', minute: '2-digit' },\n );\n}\n\n/* The words a search looks through: what the change was, the record, who, and the fields' captions and values. */\nconst searched = (entry: ActivityEntry, title: string) =>\n [\n title,\n entry.label,\n whoWrote(entry),\n ...entry.fields.flatMap((field) => [field.column, field.label ?? '', String(field.before ?? ''), String(field.after ?? '')]),\n ]\n .join(' ')\n .toLowerCase();\n\nexport function ActivityFeed({ section, dashboard, at }: { section: Section; dashboard: string; at: number }) {\n const [period, setPeriod] = useState<Period>('today');\n const [search, setSearch] = useState('');\n const [all, setAll] = useState(false);\n const typed = useDeferredValue(search.trim().toLowerCase());\n const searchId = useId();\n const answer = useQuery<{ entries: ActivityEntry[] }>({\n queryKey: ['record-activity', dashboard, at, period],\n queryFn: () => api('/api/record-activity', { view: dashboard, section: at, period }),\n enabled: at >= 0,\n placeholderData: keepPreviousData,\n staleTime: 30_000,\n });\n const app = activeApp();\n const limit = section.limit ?? 8;\n const nounOf = (table: string) => {\n const meta = findTable(table) as TableMeta | undefined;\n return section.resources?.[table]?.label ?? recordNoun(resourceOf(app, table)?.noun, meta?.name ?? table);\n };\n const entries = (answer.data?.entries ?? [])\n .map((entry) => ({ entry, title: titleOf(entry, nounOf(entry.table)) }))\n .filter(({ entry, title }) => !typed || searched(entry, title).includes(typed));\n const shown = all ? entries : entries.slice(0, limit);\n const said = PERIODS.find((each) => each.value === period)!.said;\n let body: ReactNode;\n if (answer.isError) body = <Problem text={(answer.error as Error).message} />;\n else if (!answer.data) body = <div className=\"activity-list\" aria-busy=\"true\" />;\n else if (!entries.length) {\n body = <Empty text={typed ? say('noChangesMatch', { said, search: search.trim() }) : say('noChanges', { said })} />;\n } else {\n body = (\n <>\n <p className=\"activity-count\">\n <strong>\n {entries.length}\n {!typed && entries.length >= ACTIVITY_MAX ? '+' : ''}\n </strong>{' '}\n {say(entries.length === 1 ? 'changeNoun' : 'changesNoun')} {said}\n </p>\n <ol className=\"activity-list\">\n {shown.map(({ entry, title }, i) => {\n const table = findTable(entry.table) as TableMeta | undefined;\n const icon = section.resources?.[entry.table]?.icon;\n return (\n <li key={`${entry.table}-${entry.at}-${i}`} className=\"activity-entry\">\n <span className=\"activity-mark\" aria-hidden=\"true\">\n {icon ? <Icon name={icon} size={16} /> : null}\n </span>\n <span className=\"activity-text\">\n <span className=\"activity-head\">\n <span className=\"activity-what\">{title}</span>\n <time className=\"activity-when\" dateTime={entry.at} title={formatDateTime(new Date(entry.at))}>\n {when(entry.at, period)}\n </time>\n </span>\n <span className=\"activity-detail\">\n {/* The kind of record, unless the change's title already says it (\"Start a thread\"). */}\n {!title.toLowerCase().includes(nounOf(entry.table).toLowerCase()) && (\n <>\n <span className=\"activity-noun\">{headingOf(nounOf(entry.table))}</span>{' '}\n </>\n )}\n <button\n type=\"button\"\n className=\"activity-record\"\n onClick={() => void openRecord(entry.table, entry.key, entry.label, 'push')}\n >\n {entry.label}\n </button>{' '}\n <Changed entry={entry} table={table} />\n </span>\n <span className=\"activity-by\">{whoWrote(entry)}</span>\n </span>\n </li>\n );\n })}\n </ol>\n {entries.length > limit && (\n <button type=\"button\" className=\"ghost activity-show\" onClick={() => setAll(!all)}>\n {all ? say('showFewer') : say('showMore', { entriesCount: entries.length - limit })}\n </button>\n )}\n </>\n );\n }\n return (\n <div className=\"activity\">\n <div className=\"activity-periods\" role=\"group\" aria-label={say('period', { title: section.title ?? say('theActivity') })}>\n {PERIODS.map((each) => (\n <button\n key={each.value}\n type=\"button\"\n className=\"activity-period\"\n aria-pressed={period === each.value}\n onClick={() => {\n setPeriod(each.value);\n setAll(false);\n }}\n >\n {each.label}\n </button>\n ))}\n </div>\n <label className=\"activity-search\" htmlFor={searchId}>\n <Icon name=\"magnifying-glass\" size={16} />\n <span className=\"visually-hidden\">\n {say('navigation.search')} {section.title ?? say('theActivity')}\n </span>\n <input id={searchId} type=\"search\" value={search} placeholder={say('searchActivity')} onChange={(e) => setSearch(e.target.value)} />\n </label>\n {body}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"shared-tqpl5N3g.js","names":["_Fragment"],"sources":["../../src/client/copy/dashboards/components/DashboardActivity.ts","../../src/client/components/DashboardActivity.tsx"],"sourcesContent":["/** What DashboardActivity says, in the dashboards room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '@mistriwork/kit/client/messages.js';\n\nexport const say = defineMessages({\n yesterday: 'Yesterday',\n thisWeek: 'This week',\n new: 'New {noun}',\n to: 'to',\n noChangesMatch: 'No changes {said} match “{search}”.',\n noChanges: 'No changes {said}.',\n showFewer: 'Show fewer',\n showMore: 'Show {entriesCount} more',\n period: 'Period of {title}',\n theActivity: 'the activity',\n searchActivity: 'Search activity',\n edited: '{headingOf} edited',\n fieldsChanged: { one: '{count} field changed', other: '{count} fields changed' },\n changeNoun: 'change',\n changesNoun: 'changes',\n});\n","/**\n * A dashboard's activity feed (`activity()`): the newest changes across the\n * resources the section names, from their record history — each with its\n * resource's mark, what the write did, the record by its name, who made it\n * and when — under a segmented Today / Yesterday / This week and a search.\n *\n * The server answers for this reader (server/recordActivity.ts): a change is\n * said only about a record they can read now, and a field they may not read\n * says that it changed and nothing else, so this module only says what it\n * was handed. The period is the server's to bound, in the App's own day; the\n * search narrows the changes the period read, here, as a reader types.\n * Loaded the first time a dashboard holds a feed (onDemand.tsx).\n */\nimport { useDeferredValue, useId, useState, type ReactNode } from 'react';\nimport { keepPreviousData, useQuery } from '@tanstack/react-query';\nimport { api, columnLabel, findTable, openRecord } from '@mistriwork/kit/client/core.js';\nimport { activeApp } from '../appState.js';\nimport { formatDateTime } from '@mistriwork/kit/client/locale.js';\nimport { ACTIVITY_MAX } from '../../shared/appModel.js';\nimport { humanName } from '@mistriwork/engine/shared/model.js';\nimport { headingOf, recordNoun } from '@mistriwork/engine/shared/appNoun.js';\nimport type { ColumnMeta, TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport { resourceOf } from '@mistriwork/kit/client/components/appRooms.js';\nimport type { Section } from '@mistriwork/kit/client/components/dashboardModel.js';\nimport { whoWrote, type HistoryEntry, type HistoryField } from '@mistriwork/kit/client/components/PageHistory.js';\nimport { Empty, Problem } from '@mistriwork/kit/client/components/Notes.js';\nimport { Icon } from '@mistriwork/kit/client/components/Icon.js';\nimport { Value } from '@mistriwork/kit/client/components/Value.js';\nimport './DashboardActivity.css';\nimport { say } from '../copy/dashboards/components/DashboardActivity.js';\n\ninterface ActivityEntry extends HistoryEntry {\n table: string;\n key: Record<string, unknown>;\n label: string;\n}\ntype Period = 'today' | 'yesterday' | 'week';\nconst PERIODS: Array<{ value: Period; label: string; said: string }> = [\n { value: 'today', label: say('common.today'), said: 'today' },\n { value: 'yesterday', label: say('yesterday'), said: 'yesterday' },\n { value: 'week', label: say('thisWeek'), said: 'this week' },\n];\n\n/** What a change was, as its title: the action or command by its label, else a new record or an edit of one. */\nfunction titleOf(entry: ActivityEntry, noun: string): string {\n if (entry.action) return entry.action;\n return entry.kind === 'insert' ? say('new', { noun }) : say('edited', { headingOf: headingOf(noun) });\n}\n\n/* The fields a line can say whole: ones the reader may read, with a value to say, and not a reference, whose\n stored value is its key — the record's own page says those by name (PageHistory.tsx). */\nconst sayable = (table: TableMeta | undefined, field: HistoryField) =>\n !field.hidden && !field.redacted && !table?.columns.find((column) => column.name === field.column)?.references;\n\n/** A change's detail: its first field from what to what, in the column's own dress. */\nfunction Changed({ entry, table }: { entry: ActivityEntry; table: TableMeta | undefined }) {\n /* One line: the change's first field it can say, else how many changed. The record's own history says the rest. */\n const said = entry.fields.filter((field) => sayable(table, field)).slice(0, entry.kind === 'insert' ? 0 : 1);\n const rest = entry.kind === 'insert' || said.length ? 0 : entry.fields.length;\n if (!said.length && !rest) return null;\n const col = (name: string) => table?.columns.find((column) => column.name === name) as ColumnMeta | undefined;\n const caption = (field: HistoryField) =>\n (columnLabel(entry.table, field.column) as string | null) ?? field.label ?? humanName(field.column);\n const draw = (field: HistoryField, value: HistoryField['after']): ReactNode => (\n <Value col={col(field.column)} value={value ?? null} tableId={entry.table} compact />\n );\n return (\n <span className=\"activity-changed\">\n {said.map((field) => (\n <span key={field.column} className=\"activity-field\">\n <span className=\"activity-caption\">{caption(field)}</span>{' '}\n {field.before !== undefined && field.before !== null && (\n <>\n <span className=\"activity-before\">{draw(field, field.before)}</span>\n <span className=\"activity-arrow\" aria-label={say('to')}>\n {' '}\n →{' '}\n </span>\n </>\n )}\n <span className=\"activity-after\">{draw(field, field.after)}</span>\n </span>\n ))}\n {rest > 0 && <span className=\"activity-field activity-more-fields\">{say('fieldsChanged', { count: rest })}</span>}\n </span>\n );\n}\n\n/** When, as the period says it: a time today or yesterday, a weekday and a time this week. */\nfunction when(at: string, period: Period): string {\n const date = new Date(at);\n if (Number.isNaN(date.getTime())) return at;\n return formatDateTime(\n date,\n period === 'week' ? { weekday: 'short', hour: 'numeric', minute: '2-digit' } : { hour: 'numeric', minute: '2-digit' },\n );\n}\n\n/* The words a search looks through: what the change was, the record, who, and the fields' captions and values. */\nconst searched = (entry: ActivityEntry, title: string) =>\n [\n title,\n entry.label,\n whoWrote(entry),\n ...entry.fields.flatMap((field) => [field.column, field.label ?? '', String(field.before ?? ''), String(field.after ?? '')]),\n ]\n .join(' ')\n .toLowerCase();\n\nexport function ActivityFeed({ section, dashboard, at }: { section: Section; dashboard: string; at: number }) {\n const [period, setPeriod] = useState<Period>('today');\n const [search, setSearch] = useState('');\n const [all, setAll] = useState(false);\n const typed = useDeferredValue(search.trim().toLowerCase());\n const searchId = useId();\n const answer = useQuery<{ entries: ActivityEntry[] }>({\n queryKey: ['record-activity', dashboard, at, period],\n queryFn: () => api('/api/record-activity', { view: dashboard, section: at, period }),\n enabled: at >= 0,\n placeholderData: keepPreviousData,\n staleTime: 30_000,\n });\n const app = activeApp();\n const limit = section.limit ?? 8;\n const nounOf = (table: string) => {\n const meta = findTable(table) as TableMeta | undefined;\n return section.resources?.[table]?.label ?? recordNoun(resourceOf(app, table)?.noun, meta?.name ?? table);\n };\n const entries = (answer.data?.entries ?? [])\n .map((entry) => ({ entry, title: titleOf(entry, nounOf(entry.table)) }))\n .filter(({ entry, title }) => !typed || searched(entry, title).includes(typed));\n const shown = all ? entries : entries.slice(0, limit);\n const said = PERIODS.find((each) => each.value === period)!.said;\n let body: ReactNode;\n if (answer.isError) body = <Problem text={(answer.error as Error).message} />;\n else if (!answer.data) body = <div className=\"activity-list\" aria-busy=\"true\" />;\n else if (!entries.length) {\n body = <Empty text={typed ? say('noChangesMatch', { said, search: search.trim() }) : say('noChanges', { said })} />;\n } else {\n body = (\n <>\n <p className=\"activity-count\">\n <strong>\n {entries.length}\n {!typed && entries.length >= ACTIVITY_MAX ? '+' : ''}\n </strong>{' '}\n {say(entries.length === 1 ? 'changeNoun' : 'changesNoun')} {said}\n </p>\n <ol className=\"activity-list\">\n {shown.map(({ entry, title }, i) => {\n const table = findTable(entry.table) as TableMeta | undefined;\n const icon = section.resources?.[entry.table]?.icon;\n return (\n <li key={`${entry.table}-${entry.at}-${i}`} className=\"activity-entry\">\n <span className=\"activity-mark\" aria-hidden=\"true\">\n {icon ? <Icon name={icon} size={16} /> : null}\n </span>\n <span className=\"activity-text\">\n <span className=\"activity-head\">\n <span className=\"activity-what\">{title}</span>\n <time className=\"activity-when\" dateTime={entry.at} title={formatDateTime(new Date(entry.at))}>\n {when(entry.at, period)}\n </time>\n </span>\n <span className=\"activity-detail\">\n {/* The kind of record, unless the change's title already says it (\"Start a thread\"). */}\n {!title.toLowerCase().includes(nounOf(entry.table).toLowerCase()) && (\n <>\n <span className=\"activity-noun\">{headingOf(nounOf(entry.table))}</span>{' '}\n </>\n )}\n <button\n type=\"button\"\n className=\"activity-record\"\n onClick={() => void openRecord(entry.table, entry.key, entry.label, 'push')}\n >\n {entry.label}\n </button>{' '}\n <Changed entry={entry} table={table} />\n </span>\n <span className=\"activity-by\">{whoWrote(entry)}</span>\n </span>\n </li>\n );\n })}\n </ol>\n {entries.length > limit && (\n <button type=\"button\" className=\"ghost activity-show\" onClick={() => setAll(!all)}>\n {all ? say('showFewer') : say('showMore', { entriesCount: entries.length - limit })}\n </button>\n )}\n </>\n );\n }\n return (\n <div className=\"activity\">\n <div className=\"activity-periods\" role=\"group\" aria-label={say('period', { title: section.title ?? say('theActivity') })}>\n {PERIODS.map((each) => (\n <button\n key={each.value}\n type=\"button\"\n className=\"activity-period\"\n aria-pressed={period === each.value}\n onClick={() => {\n setPeriod(each.value);\n setAll(false);\n }}\n >\n {each.label}\n </button>\n ))}\n </div>\n <label className=\"activity-search\" htmlFor={searchId}>\n <Icon name=\"magnifying-glass\" size={16} />\n <span className=\"visually-hidden\">\n {say('navigation.search')} {section.title ?? say('theActivity')}\n </span>\n <input id={searchId} type=\"search\" value={search} placeholder={say('searchActivity')} onChange={(e) => setSearch(e.target.value)} />\n </label>\n {body}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { D as refsFrom } from "./shared-DPAVoWY0.js";
1
+ import { D as refsFrom } from "./shared-BoLbc2WD.js";
2
2
  // packages/kit/src/client/components/gridCellModel.ts
3
3
  /**
4
4
  * The cells of a list a reader may edit in place, each drawn column to the
@@ -30,4 +30,4 @@ function singleReference(table, column) {
30
30
  }
31
31
  export { singleReference as n, editableCells as t };
32
32
 
33
- //# sourceMappingURL=shared-BS5dBMpA.js.map
33
+ //# sourceMappingURL=shared-y-6_ZDts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared-BS5dBMpA.js","names":[],"sources":["../../../kit/src/client/components/gridCellModel.ts"],"sourcesContent":["/**\n * Which cells of a list are edited in place, and the shape a cell's editor\n * draws through. Apart from the editor (GridCellEditor.tsx), which is\n * loaded the first time a list that edits is drawn: every list asks which\n * of its cells edit, and most answer none.\n */\nimport type { ReactNode } from 'react';\nimport { refsFrom } from '../core.js';\nimport type { ColumnMeta, TableMeta } from '@mistriwork/engine/shared/schema.js';\n\n/** How a cell draws a value: with no argument, as the grid drew it; with one, another value in the same dress. */\nexport type CellDraw = (next?: { value: unknown; label?: unknown }) => ReactNode;\n\n/** A column as an editor sees it: the catalog's, with the vocabulary it pins. */\nexport type EditColumn = ColumnMeta & { allowed?: string[] };\n\n/**\n * The cells of a list a reader may edit in place, each drawn column to the\n * column it writes: the view's `editable` (every shown column, or those\n * named) narrowed to the table's own columns this reader's catalog says are\n * writable — never the key, never one the resource's transitions give to its\n * actions, never a document or bytes. A reference shown by its record's name\n * (`owner_id.name`) is edited as the reference (`owner_id`), with the picker\n * a record form uses, since the name is the other record's. The server\n * refuses the rest anyway; these are the ones worth offering.\n */\nexport function editableCells(\n table: TableMeta | undefined,\n editable: true | readonly string[] | undefined,\n shown: readonly string[],\n): Map<string, string> {\n const cells = new Map<string, string>();\n if (!table || !editable || table.isView) return cells;\n for (const drawn of shown) {\n const hop = drawn.indexOf('.');\n const local = hop < 0 ? drawn : drawn.slice(0, hop);\n const column = table.columns.find((c) => c.name === local);\n // A path edits only through a one-hop reference of one column: anything further is another record's value.\n if (!column || (hop >= 0 && (!column.references || drawn.indexOf('.', hop + 1) >= 0 || !singleReference(table, column)))) continue;\n if (editable !== true && !editable.includes(local)) continue;\n if (\n column.primaryKey ||\n column.writable === false ||\n column.changesBy === 'actions' ||\n /json|blob|bytea|binary/i.test(column.type ?? '')\n )\n continue;\n cells.set(drawn, local);\n }\n return cells;\n}\n\n/** The columns a list's cells write, once each, in the order drawn: what \"Set field…\" offers. */\nexport function editableColumns(\n table: TableMeta | undefined,\n editable: true | readonly string[] | undefined,\n shown: readonly string[],\n): string[] {\n return [...new Set(editableCells(table, editable, shown).values())];\n}\n\n/** A reference's only when it is one column: a composite key is not chosen by one picker. */\nexport function singleReference(table: TableMeta, column: EditColumn): boolean {\n return (\n Boolean(column.references) &&\n !refsFrom(table.id).some((fk: { from: { columns: string[] } }) => fk.from.columns.length > 1 && fk.from.columns.includes(column.name))\n );\n}\n"],"mappings":";;;;;;;;;;;;AA0BA,SAAgB,cACd,OACA,UACA,OACqB;CACrB,MAAM,wBAAQ,IAAI,IAAoB;CACtC,IAAI,CAAC,SAAS,CAAC,YAAY,MAAM,QAAQ,OAAO;CAChD,KAAK,MAAM,SAAS,OAAO;EACzB,MAAM,MAAM,MAAM,QAAQ,GAAG;EAC7B,MAAM,QAAQ,MAAM,IAAI,QAAQ,MAAM,MAAM,GAAG,GAAG;EAClD,MAAM,SAAS,MAAM,QAAQ,MAAM,MAAM,EAAE,SAAS,KAAK;EAEzD,IAAI,CAAC,UAAW,OAAO,MAAM,CAAC,OAAO,cAAc,MAAM,QAAQ,KAAK,MAAM,CAAC,KAAK,KAAK,CAAC,gBAAgB,OAAO,MAAM,IAAK;EAC1H,IAAI,aAAa,QAAQ,CAAC,SAAS,SAAS,KAAK,GAAG;EACpD,IACE,OAAO,cACP,OAAO,aAAa,SACpB,OAAO,cAAc,aACrB,0BAA0B,KAAK,OAAO,QAAQ,EAAE,GAEhD;EACF,MAAM,IAAI,OAAO,KAAK;CACxB;CACA,OAAO;AACT;;AAYA,SAAgB,gBAAgB,OAAkB,QAA6B;CAC7E,OACE,QAAQ,OAAO,UAAU,KACzB,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC,MAAM,OAAwC,GAAG,KAAK,QAAQ,SAAS,KAAK,GAAG,KAAK,QAAQ,SAAS,OAAO,IAAI,CAAC;AAEzI"}
1
+ {"version":3,"file":"shared-y-6_ZDts.js","names":[],"sources":["../../../kit/src/client/components/gridCellModel.ts"],"sourcesContent":["/**\n * Which cells of a list are edited in place, and the shape a cell's editor\n * draws through. Apart from the editor (GridCellEditor.tsx), which is\n * loaded the first time a list that edits is drawn: every list asks which\n * of its cells edit, and most answer none.\n */\nimport type { ReactNode } from 'react';\nimport { refsFrom } from '../core.js';\nimport type { ColumnMeta, TableMeta } from '@mistriwork/engine/shared/schema.js';\n\n/** How a cell draws a value: with no argument, as the grid drew it; with one, another value in the same dress. */\nexport type CellDraw = (next?: { value: unknown; label?: unknown }) => ReactNode;\n\n/** A column as an editor sees it: the catalog's, with the vocabulary it pins. */\nexport type EditColumn = ColumnMeta & { allowed?: string[] };\n\n/**\n * The cells of a list a reader may edit in place, each drawn column to the\n * column it writes: the view's `editable` (every shown column, or those\n * named) narrowed to the table's own columns this reader's catalog says are\n * writable — never the key, never one the resource's transitions give to its\n * actions, never a document or bytes. A reference shown by its record's name\n * (`owner_id.name`) is edited as the reference (`owner_id`), with the picker\n * a record form uses, since the name is the other record's. The server\n * refuses the rest anyway; these are the ones worth offering.\n */\nexport function editableCells(\n table: TableMeta | undefined,\n editable: true | readonly string[] | undefined,\n shown: readonly string[],\n): Map<string, string> {\n const cells = new Map<string, string>();\n if (!table || !editable || table.isView) return cells;\n for (const drawn of shown) {\n const hop = drawn.indexOf('.');\n const local = hop < 0 ? drawn : drawn.slice(0, hop);\n const column = table.columns.find((c) => c.name === local);\n // A path edits only through a one-hop reference of one column: anything further is another record's value.\n if (!column || (hop >= 0 && (!column.references || drawn.indexOf('.', hop + 1) >= 0 || !singleReference(table, column)))) continue;\n if (editable !== true && !editable.includes(local)) continue;\n if (\n column.primaryKey ||\n column.writable === false ||\n column.changesBy === 'actions' ||\n /json|blob|bytea|binary/i.test(column.type ?? '')\n )\n continue;\n cells.set(drawn, local);\n }\n return cells;\n}\n\n/** The columns a list's cells write, once each, in the order drawn: what \"Set field…\" offers. */\nexport function editableColumns(\n table: TableMeta | undefined,\n editable: true | readonly string[] | undefined,\n shown: readonly string[],\n): string[] {\n return [...new Set(editableCells(table, editable, shown).values())];\n}\n\n/** A reference's only when it is one column: a composite key is not chosen by one picker. */\nexport function singleReference(table: TableMeta, column: EditColumn): boolean {\n return (\n Boolean(column.references) &&\n !refsFrom(table.id).some((fk: { from: { columns: string[] } }) => fk.from.columns.length > 1 && fk.from.columns.includes(column.name))\n );\n}\n"],"mappings":";;;;;;;;;;;;AA0BA,SAAgB,cACd,OACA,UACA,OACqB;CACrB,MAAM,wBAAQ,IAAI,IAAoB;CACtC,IAAI,CAAC,SAAS,CAAC,YAAY,MAAM,QAAQ,OAAO;CAChD,KAAK,MAAM,SAAS,OAAO;EACzB,MAAM,MAAM,MAAM,QAAQ,GAAG;EAC7B,MAAM,QAAQ,MAAM,IAAI,QAAQ,MAAM,MAAM,GAAG,GAAG;EAClD,MAAM,SAAS,MAAM,QAAQ,MAAM,MAAM,EAAE,SAAS,KAAK;EAEzD,IAAI,CAAC,UAAW,OAAO,MAAM,CAAC,OAAO,cAAc,MAAM,QAAQ,KAAK,MAAM,CAAC,KAAK,KAAK,CAAC,gBAAgB,OAAO,MAAM,IAAK;EAC1H,IAAI,aAAa,QAAQ,CAAC,SAAS,SAAS,KAAK,GAAG;EACpD,IACE,OAAO,cACP,OAAO,aAAa,SACpB,OAAO,cAAc,aACrB,0BAA0B,KAAK,OAAO,QAAQ,EAAE,GAEhD;EACF,MAAM,IAAI,OAAO,KAAK;CACxB;CACA,OAAO;AACT;;AAYA,SAAgB,gBAAgB,OAAkB,QAA6B;CAC7E,OACE,QAAQ,OAAO,UAAU,KACzB,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC,MAAM,OAAwC,GAAG,KAAK,QAAQ,SAAS,KAAK,GAAG,KAAK,QAAQ,SAAS,OAAO,IAAI,CAAC;AAEzI"}
@@ -1,28 +1,28 @@
1
1
  import { L as splitClauseTail, N as andQuery, Z as Empty, it as useQuery, nt as Button, o as sameReads, tt as useMessageLanguage } from "./shared-poc11xxo.js";
2
2
  import { D as columnKind, F as primaryKey, Jt as formatNumber, Kt as formatLocale, M as labelColumn, Ot as popupContainer, Pn as useQueryClient, Qt as formatTimezone, Rt as defaultCurrency, _t as message, d as dressFor, ft as vocabularyWord, gt as defineMessages, q as minorToMajor, rn as shell, ut as humanName, x as wordFor, yn as keepPreviousData } from "./shared-DJZjSi3J.js";
3
3
  import { t as useMutation } from "./shared-BSPDIjPQ.js";
4
- import { $ as ownedTails, C as subtitleColumns, G as unquote, I as DropGroup, J as WHOLE, K as promptFor, L as DropItem, Q as mentionsColumn, R as DropMenu, S as shownTabs, T as wholeQuery, U as deriveFilterNames, X as conditionTail, Y as canonicalize, Z as holdsCondition, _ as listReferenceNames, b as residueOf, et as squeeze, g as editedReferences, h as appListQuery, nt as withCondition, tt as stripCondition, ut as useQueries, v as litTabFor, w as visibleQuestion, x as searchColumn } from "./shared-CNmaAv64.js";
5
- import { B as toast, L as state$1, T as recordLabel, b as pageSize, c as columnLabel, d as findTable, i as api, m as labelPath, s as columnDisplay } from "./shared-DPAVoWY0.js";
4
+ import { $ as ownedTails, C as subtitleColumns, G as unquote, I as DropGroup, J as WHOLE, K as promptFor, L as DropItem, Q as mentionsColumn, R as DropMenu, S as shownTabs, T as wholeQuery, U as deriveFilterNames, X as conditionTail, Y as canonicalize, Z as holdsCondition, _ as listReferenceNames, b as residueOf, et as squeeze, g as editedReferences, h as appListQuery, nt as withCondition, tt as stripCondition, ut as useQueries, v as litTabFor, w as visibleQuestion, x as searchColumn } from "./shared-BHsjawAG.js";
5
+ import { B as toast, L as state$1, T as recordLabel, b as pageSize, c as columnLabel, d as findTable, i as api, m as labelPath, s as columnDisplay } from "./shared-BoLbc2WD.js";
6
6
  import { i as zoomAnchor, r as layoutViewport, t as Modal } from "./shared-CRr4kJXB.js";
7
- import { n as useArrived, t as onDemand } from "./shared-DpLeIATZ.js";
7
+ import { n as useArrived, t as onDemand } from "./shared-B-BUF9fx.js";
8
8
  import { t as Dropdown } from "./shared-gtzTT5Z7.js";
9
- import { A as batchedBreakdown, O as AppColumnMenuContext, d as RowOpensContext, k as returnFocusTo, o as ListEmpty } from "./shared-DiFQljcq.js";
9
+ import { A as batchedBreakdown, O as AppColumnMenuContext, d as RowOpensContext, k as returnFocusTo, o as ListEmpty } from "./shared-XcSKDp6N.js";
10
10
  import { i as PopoverRoot, n as PopoverPositioner, r as PopoverPortal, t as PopoverPopup } from "./shared-QCeL-Jxu.js";
11
11
  import { o as PopoverTrigger, r as isPickerDate, t as DateField } from "./shared-D0FwuLNI.js";
12
12
  import { i as joinQuery, l as splitConditions, u as splitQuery } from "./shared-DOvMIC4W.js";
13
13
  import { t as Field } from "./shared-CERG8O1B.js";
14
- import { C as rangeOf, D as tagsTail, E as selectedValues, O as takesText, S as numberRangeTail, T as selectedTags, _ as hasValuesText, a as boxesFor, b as moreTail, c as MORE_LABELS, d as datePresets, f as facetActive, g as hasCountText, h as facetShapeText, i as boxText, k as valuesTail, l as autoShape, m as facetKind, n as RefBox, p as facetCountText, r as boxTail, s as wrongForNumber, u as clearFacets, v as moreConditions, w as rangeTail, x as numberRangeOf, y as moreOf } from "./shared-DgjU9kOy.js";
14
+ import { C as rangeOf, D as tagsTail, E as selectedValues, O as takesText, S as numberRangeTail, T as selectedTags, _ as hasValuesText, a as boxesFor, b as moreTail, c as MORE_LABELS, d as datePresets, f as facetActive, g as hasCountText, h as facetShapeText, i as boxText, k as valuesTail, l as autoShape, m as facetKind, n as RefBox, p as facetCountText, r as boxTail, s as wrongForNumber, u as clearFacets, v as moreConditions, w as rangeTail, x as numberRangeOf, y as moreOf } from "./shared-BIQuK_nq.js";
15
15
  import { n as filterLabel } from "./shared-DUlM0U0V.js";
16
- import { t as useConditionWords } from "./shared-Dm0z5WUl.js";
16
+ import { t as useConditionWords } from "./shared-CrWv5JKH.js";
17
17
  import { n as pluralOf, r as recordNoun } from "./shared-BZ8KfT9k.js";
18
18
  import { n as listHeadRef, r as useCrumbSlots, t as listControlsRef } from "./shared-yOrkqLkz.js";
19
- import { i as FavoriteStar, n as RAIL_QUERY, r as useMediaQuery, t as PHONE_QUERY } from "./shared-DrFb-XtA.js";
20
- import { n as mayRunAny } from "./shared-u4CG2kQJ.js";
19
+ import { i as FavoriteStar, n as RAIL_QUERY, r as useMediaQuery, t as PHONE_QUERY } from "./shared-WhbuObEW.js";
20
+ import { n as mayRunAny } from "./shared-eZ0SB_zm.js";
21
21
  import { t as exportOffered } from "./shared-QhJ3Hj3V.js";
22
22
  import { u as resourceOf } from "./shared-DpVb48sM.js";
23
- import { t as useTabFold } from "./shared-DA8_pVRZ.js";
23
+ import { t as useTabFold } from "./shared-CepLAhwm.js";
24
24
  import { t as majorToMinor } from "./shared-ZSlLmn9p.js";
25
- import { n as TableRoom, o as SuggestBox } from "./shared-Ccmc8YO0.js";
25
+ import { n as TableRoom, o as SuggestBox } from "./shared-DSUICuaJ.js";
26
26
  import { Fragment, createContext, useCallback, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from "react";
27
27
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
28
28
  import { createPortal } from "react-dom";
@@ -1734,7 +1734,7 @@ function SortMenu({ sorts, query, onPick, sort }) {
1734
1734
  * wait for that library to show their rows. The list imports QuickAdd from
1735
1735
  * here; the component and its props are QuickAdd.tsx's own.
1736
1736
  */
1737
- var QuickAdd = onDemand(() => import("./shared-BhAYErSx.js"), "QuickAdd", { quiet: true });
1737
+ var QuickAdd = onDemand(() => import("./shared-C1B0GH0e.js"), "QuickAdd", { quiet: true });
1738
1738
  // packages/kit/src/client/components/AppList.tsx
1739
1739
  /**
1740
1740
  * An app's list page: the table through the app's own words.
@@ -1757,7 +1757,7 @@ var QuickAdd = onDemand(() => import("./shared-BhAYErSx.js"), "QuickAdd", { quie
1757
1757
  * the list's question as text, so opening one is the ordinary list address.
1758
1758
  */
1759
1759
  var state = state$1;
1760
- var DefinedBoxes = onDemand(() => import("./shared-BxMvSjey.js"), "DefinedBoxes", { quiet: true });
1760
+ var DefinedBoxes = onDemand(() => import("./shared-cgXG7OgZ.js"), "DefinedBoxes", { quiet: true });
1761
1761
  function oneValue(tail) {
1762
1762
  const match = /^=\s*(?:"([^"]*)"|'([^']*)'|(\S+))$/.exec(tail.trim());
1763
1763
  return match ? match[1] ?? match[2] ?? match[3] : void 0;
@@ -2623,4 +2623,4 @@ function InteractiveList({ section, source, onTotal }) {
2623
2623
  }
2624
2624
  export { InteractiveList };
2625
2625
 
2626
- //# sourceMappingURL=shared-Cv5v_MP1.js.map
2626
+ //# sourceMappingURL=shared-zG6e1Rhz.js.map