@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-Cv5v_MP1.js","names":["say","say","say","state","say","say","_Fragment","Popover.Root","Popover.Trigger","Popover.Portal","Popover.Positioner","Popover.Popup","say","state","say","walk","say","_Fragment"],"sources":["../../../kit/src/client/components/boardNew.ts","../../../kit/src/client/copy/lists/components/AppList.ts","../../../kit/src/client/copy/filters/components/FilterRail.ts","../../../kit/src/client/components/FilterRail.tsx","../../../kit/src/client/copy/filters/components/ListFilterBar.ts","../../../kit/src/client/components/ListFilterBar.tsx","../../../kit/src/client/copy/lists/components/myViews.ts","../../../kit/src/client/components/myViews.ts","../../../kit/src/client/copy/lists/components/SortMenu.ts","../../../kit/src/client/components/SortMenu.tsx","../../../kit/src/client/components/QuickAddOnDemand.ts","../../../kit/src/client/components/AppList.tsx","../../../kit/src/client/components/DashboardList.tsx"],"sourcesContent":["/**\n * The New form a list offers, handed to its board so each lane's head can\n * offer a record in that lane. A context rather than a prop: the list (AppList)\n * and its board (BoardList) are four components apart, and only an App's own\n * list room provides one — an embedded or dashboard board offers no New.\n */\nimport { createContext } from 'react';\nimport type { FormSpec } from './NewRecordButton.js';\n\nexport const BoardNewForm = createContext<FormSpec | null>(null);\n","/** What AppList says, in the lists and grid room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n theCountsCameBack: 'The counts came back the wrong length.',\n saveThisView: 'Save this view',\n mineDueThisWeek: 'Mine, due this week',\n renameThisView: 'Rename this view',\n noMatches: 'No matches',\n noneInTab: 'No {things} in {tab} right now.',\n addTheFirst: 'Use New to add the first {thing}.',\n rowsTheTabAndFilters: 'Rows the tab and filters match',\n listControls: '{caption} list controls',\n myViews: 'My views',\n savedViews: 'Saved views',\n yourView: 'your view',\n aSavedView: 'a saved view',\n removeTheView: 'Remove the view \"{name}\"',\n advanced: 'Advanced',\n keepThisTabIts: 'Keep this tab, its filters and sort as a view of your own',\n keepThisTabItsFilters: 'Keep this tab, its filters and sort as a saved view of this list, for everyone who opens it',\n saveView: 'Save view…',\n renameView: 'Rename view…',\n contains: '{naming} contains \"...\"',\n filterRecords: 'Filter records',\n filter: 'Filter {caption}',\n filtersApplied: '{caption} filters applied',\n match: '{gridTotal} match',\n captionFilters: '{caption} filters',\n everything: 'Everything',\n});\n","/** What FilterRail says, in the filter rail room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n moreConditions: 'More conditions',\n moreConditionsOn: 'More conditions on {label}',\n text: 'Text',\n standsForAnyRun: '% stands for any run of characters, _ for exactly one.',\n couldNotCountTheValues: 'Could not count the values.',\n countsUnavailable: 'Counts unavailable.',\n showAll: 'Show all {listedCount}',\n from: 'From',\n to: 'To',\n min: 'Min',\n max: 'Max',\n contains: 'Contains…',\n equals: 'Equals…',\n showCount: 'Show {count}',\n});\n","/**\n * A list's filters as a rail of facets beside the rows — `filterBar: 'rail'`.\n *\n * The bar asks one value per column; a rail is for the list a reader works\n * through by narrowing, where the question is \"open or done, mine, due this\n * week\" and the answer is how many of each. So a vocabulary or a reference\n * is a checklist of its values with live counts, a flag a toggle, a date its\n * presets and a range. Any other column shows as what its values are: a\n * number with many values a Min/Max range, one with a few (a priority, a\n * model year) a checklist, text with a few dozen values a checklist and more\n * a contains box — judged once, over the rows the view stands on\n * (filterRailModel `autoShape`). The name column is the rail's search box; in a column's\n * own picker (the filter popover) it is judged like the rest, so a name with a few values\n * lists them with their counts.\n * Every facet writes a condition tail into the same question the bar's boxes\n * do (filterRailModel says how), so a selection is a URL, a chip and a\n * refinement of the tab like any other.\n *\n * Controlled: the rail reads `refinement` and hands a new one to `onChange`.\n * Beside the list that navigates at once; in the phone sheet it edits a\n * draft, applied by the sheet's own button, because each navigation redraws\n * the list the sheet is covering.\n */\nimport { Fragment, useEffect, useId, useRef, useState, type ReactNode } from 'react';\nimport { keepPreviousData, useQueries, useQuery } from '@tanstack/react-query';\nimport { api, columnDisplay, findTable, labelColumn, state } from '../core.js';\nimport { batchedBreakdown } from '../breakdownBatch.js';\nimport { defaultCurrency, formatLocale, formatNumber, formatTimezone } from '../locale.js';\nimport { DateField } from './DateField.js';\nimport { Button } from '@mistriwork/ui/Button.js';\nimport { Field } from '@mistriwork/ui/Field.js';\nimport { isPickerDate } from '@mistriwork/ui/internal/datePickerModel.js';\nimport { columnKind, type TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport { andQuery } from '@mistriwork/engine/shared/query.js';\nimport { vocabularyWord } from '@mistriwork/engine/shared/model.js';\nimport { dressFor, wordFor, type DisplayRule } from './valueModel.js';\nimport { minorToMajor } from '@mistriwork/engine/shared/money.js';\nimport { majorToMinor } from '@mistriwork/engine/shared/moneyEntry.js';\nimport { WHOLE, conditionTail, holdsCondition, squeeze, unquote, withCondition } from '../filterbar.js';\nimport { boxTail, type Box } from './FilterBoxes.js';\nimport { useArrived } from './onDemand.js';\nimport { SuggestBox } from './suggestPart.js';\nimport {\n CHECKLIST_MOST,\n MORE_LABELS,\n datePresets,\n autoShape,\n clearFacets,\n facetActive,\n facetCountText,\n facetKind,\n facetShapeText,\n hasCountText,\n hasValuesText,\n moreConditions,\n moreOf,\n moreTail,\n numberRangeOf,\n numberRangeTail,\n rangeOf,\n rangeTail,\n selectedTags,\n selectedValues,\n tagsTail,\n takesText,\n valuesTail,\n type AutoShape,\n type MoreCondition,\n} from './filterRailModel.js';\nimport { Modal } from '@mistriwork/ui/Modal.js';\nimport { useConditionWords } from './useConditionWords.js';\nimport { say } from '../copy/filters/components/FilterRail.js';\n\n/** A checklist shows this many values before \"Show all\": five keeps the\n next facet in sight (at eight, Make and Model pushed Price off the first\n screen). A list only one or two longer is shown whole: a \"Show all 6\"\n that reveals one value is a click that buys nothing. */\nconst SHORT = 5;\nconst SLACK = 2;\n/** And never asks for more than this many; a column with more is a search, not a list. */\nconst MOST = CHECKLIST_MOST;\n\n/* Through locale.ts's kept formatter: a rail says a count per value, and\n built afresh each was a formatter per count on every draw. */\nconst counted = (n: number) => formatNumber(n);\n\n/** How a range says its column's figures: a currency before them, a unit after. */\nexport interface FacetUnit {\n currency?: string;\n unit?: string;\n}\n\ninterface RailProps {\n table: TableMeta;\n boxes: Box[];\n /** The question the facets read, without the table name or the plumbing. */\n refinement: string;\n /** The lit tab's own query: its conditions are the tab's, so Clear all leaves them. */\n tabQuery?: string;\n /** The view's standing condition (`status != sold`): not the reader's to see or clear, but every count stands on it. */\n standing?: string;\n /** A column's currency or unit, said beside a range's boxes. */\n unitOf?: (column: string) => FacetUnit | undefined;\n /** Beside a list whose chips carry their own Clear all, the rail's would be a second one. */\n clearAll?: boolean;\n onChange: (refinement: string) => void;\n /** What the list matches now, said politely to a screen reader as it changes. */\n status?: string;\n}\n\nexport function FilterRail({\n table,\n boxes,\n refinement,\n tabQuery = '',\n standing = '',\n unitOf,\n clearAll = true,\n onChange,\n status,\n}: RailProps) {\n const columns = boxes.map((box) => box.column);\n const any = columns.some((column) => facetActive(refinement, column, tabQuery));\n const set = (column: string, tail: string) => onChange(withCondition(refinement, column, tail));\n return (\n <div className=\"filter-rail-body\">\n <div className=\"filter-rail-head\">\n <h2 className=\"filter-rail-title\">{say('common.filtersButton')}</h2>\n {clearAll && any && (\n <button type=\"button\" className=\"filter-rail-clear\" onClick={() => onChange(clearFacets(refinement, columns, tabQuery))}>\n {say('list.clearAll')}\n </button>\n )}\n </div>\n {boxes.map((box) => (\n <FacetFor\n key={box.column}\n box={box}\n table={table}\n refinement={refinement}\n standing={standing}\n unit={unitOf?.(box.column)}\n set={(next) => set(box.column, next)}\n />\n ))}\n <p className=\"visually-hidden\" role=\"status\">\n {status ?? ''}\n </p>\n </div>\n );\n}\n\n/**\n * One column's facet over a question: what the rail draws for each of its\n * columns, and what an App list's filter bar opens alone in a popover\n * (ListFilterBar.tsx). `set` hears the column's new tail; `onEnter`, where\n * given, hears Enter in a box once its value is set, so a popover applies\n * on the key a reader expects to apply rather than on a second one.\n */\nexport function FacetFor({\n box,\n table,\n refinement,\n standing = '',\n unit,\n set,\n onEnter,\n picking = false,\n}: {\n box: Box;\n table: TableMeta;\n refinement: string;\n standing?: string;\n unit?: FacetUnit;\n set: (tail: string) => void;\n onEnter?: () => void;\n /** A column's own picker (the filter popover): its name column is a column like another, not the rail's search box. */\n picking?: boolean;\n}) {\n const tail = squeeze(conditionTail(refinement, box.column));\n /* The rows that point at the record are asked by what they hold, and counted as the list's records. */\n if (box.has) {\n const props = { box, tail, table, refinement, standing, set, onEnter };\n return box.has.segment ? <HasSegmentFacet {...props} /> : <HasValuesFacet {...props} />;\n }\n const kind = facetKind(box.kind);\n /* The rarer conditions sit behind one quiet disclosure in every facet, so\n the rail and a column menu's Filter… say them alike. */\n const more = kind === 'tags' ? null : <MoreConditions box={box} tail={tail} set={set} onEnter={onEnter} facet={kind} />;\n const props = { box, tail, table, refinement, standing, set, onEnter, more };\n if (kind === 'values') return <ValuesFacet {...props} />;\n if (kind === 'tags') return <TagsFacet {...props} />;\n if (kind === 'flag') return <FlagFacet {...props} />;\n if (kind === 'date') return <DateFacet {...props} />;\n /* The name is what a reader searches by; a source that takes whole\n values only (an API) cannot be counted or ranged. Anything else\n shows as what its values are. Keyed by its tail, so a condition\n changed elsewhere redraws the box with it. */\n /* In the rail the name is the search box. In a column's own picker it is judged like any column: a\n name with a few dozen values (a make, a department) is offered as those values with their counts, a\n longer one as the contains box, and a contains already asked stays the box that asked it. */\n const asked = /^contains\\s/i.test(tail);\n if (box.exact || (box.column === labelColumn(table) && (!picking || asked))) return <TextFacet key={tail} {...props} />;\n return <AutoFacet {...props} unit={unit} bare={box.column === labelColumn(table)} />;\n}\n\ninterface FacetProps {\n box: Box;\n tail: string;\n table: TableMeta;\n refinement: string;\n standing: string;\n set: (tail: string) => void;\n onEnter?: () => void;\n more?: ReactNode;\n}\n\n/* A facet's name and its own way out. A group of inputs is a fieldset, so\n each checkbox or radio is announced with the facet it belongs to. */\nfunction Facet({\n box,\n tail,\n set,\n more,\n group = true,\n busy = false,\n children,\n}: Pick<FacetProps, 'box' | 'tail' | 'set' | 'more'> & { group?: boolean; busy?: boolean; children: ReactNode }) {\n const clear = tail ? (\n <button type=\"button\" className=\"facet-clear\" aria-label={say('common.clear2', { label: box.label })} onClick={() => set('')}>\n {say('common.clear')}\n </button>\n ) : null;\n if (!group)\n return (\n <div className=\"facet\" data-column={box.column}>\n {children}\n {clear}\n {more}\n </div>\n );\n return (\n <fieldset className=\"facet\" data-column={box.column} aria-busy={busy || undefined}>\n <legend className=\"facet-label\">{box.label}</legend>\n {clear}\n {children}\n {more}\n </fieldset>\n );\n}\n\n/* A condition this facet has no control for — `!= open`, `= false`, typed\n in Advanced — is said rather than drawn as nothing, and kept until the\n reader picks. */\nfunction Unshown({ box, table, tail }: { box: Box; table: TableMeta; tail: string }) {\n // In the App's words, \"Status is not Open\"; the Workbench has no rail.\n const { speaker, sayTails } = useConditionWords(table, [`${box.column} ${tail}`]);\n return moreOf(tail) ? null : <p className=\"facet-note\">{sayTails(speaker, box.column, [tail])}</p>;\n}\n\n/**\n * The conditions a facet has no everyday control for — starts with, a\n * pattern, empty, not empty — behind one quiet disclosure, open while one of\n * them is what the column asks. A choice that needs no text applies as it is\n * picked; one that takes text applies on Enter or leaving the box, as a\n * range does.\n */\nfunction MoreConditions({\n box,\n tail,\n set,\n onEnter,\n facet,\n}: Pick<FacetProps, 'box' | 'tail' | 'set' | 'onEnter'> & { facet: Exclude<ReturnType<typeof facetKind>, 'tags'> }) {\n const id = useId();\n const said = moreOf(tail);\n const [open, setOpen] = useState(Boolean(said));\n const [picked, setPicked] = useState<MoreCondition | null>(said?.condition ?? null);\n const [text, setText] = useState(said?.text ?? '');\n const box$ = useRef<HTMLInputElement>(null);\n const focusText = useRef(false);\n useEffect(() => {\n setPicked(said?.condition ?? null);\n setText(said?.text ?? '');\n if (said) setOpen(true);\n }, [tail]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => {\n if (!focusText.current) return;\n focusText.current = false;\n box$.current?.focus();\n });\n const offered = moreConditions(facet, box.meta, box.exact);\n /* A condition typed elsewhere is shown here even where it would not be offered. */\n if (said && !offered.includes(said.condition)) offered.push(said.condition);\n if (!offered.length) return null;\n const choose = (condition: MoreCondition) => {\n setPicked(condition);\n if (!takesText(condition)) set(moreTail(condition));\n else if (text.trim()) set(moreTail(condition, text));\n else focusText.current = true;\n };\n const commit = () => {\n if (!picked || !takesText(picked)) return;\n const next = moreTail(picked, text);\n if (next && next !== tail) set(next);\n };\n return (\n <div className=\"facet-more-conditions\">\n <button type=\"button\" className=\"facet-more\" aria-expanded={open} aria-controls={id} onClick={() => setOpen(!open)}>\n {say('moreConditions')}\n </button>\n {open && (\n <div id={id} role=\"group\" aria-label={say('moreConditionsOn', { label: box.label })} className=\"facet-values\">\n {offered.map((condition) => (\n <Fragment key={condition}>\n <label className=\"facet-option\">\n <input type=\"radio\" name={id} data-value={condition} checked={picked === condition} onChange={() => choose(condition)} />\n <span className=\"facet-option-label\">{MORE_LABELS[condition]}</span>\n </label>\n {takesText(condition) && picked === condition && (\n <div className=\"form-field form-field-compact\">\n <input\n ref={box$}\n type=\"text\"\n className=\"field-control facet-input\"\n aria-label={MORE_LABELS[condition]}\n data-value={`${condition}-text`}\n value={text}\n placeholder={condition === 'like' ? say('common.patternEGWh') : say('text')}\n title={condition === 'like' ? say('standsForAnyRun') : undefined}\n onChange={(e) => setText(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n commit();\n onEnter?.();\n }\n }}\n />\n </div>\n )}\n </Fragment>\n ))}\n </div>\n )}\n </div>\n );\n}\n\ninterface Count {\n value: string;\n label?: string;\n count: number;\n}\n\n/** A facet's values and how many rows each would add, under everything else the list asks. */\nfunction useCounts(table: TableMeta, refinement: string, column: string, labelPath: string | undefined, standing: string) {\n const text = facetCountText(table.id, refinement, column, labelPath, standing);\n return useQuery<Count[]>({\n /* In the list's own query family, so a write that refreshes the rows refreshes the counts. */\n queryKey: ['run', state.activeConnection ?? '', 'facet', text],\n queryFn: async () => {\n /* With the rail's other facets, in one request (breakdownBatch.ts):\n a rail of eleven facets was eleven requests queued on one connection. */\n const data = (await batchedBreakdown({ text, limit: MOST })) as {\n columns?: string[];\n rows?: Array<Record<string, unknown>>;\n errors?: unknown[];\n };\n if (data.errors?.length || !data.columns?.length) throw new Error(say('couldNotCountTheValues'));\n const keys = data.columns;\n return (data.rows ?? []).flatMap((row) => {\n const value = row[keys[0]];\n const n = Number(row[keys[keys.length - 1]]);\n if (value == null || !Number.isFinite(n)) return [];\n const label = labelPath ? row[keys[1]] : undefined;\n return [{ value: String(value), count: n, ...(label == null ? {} : { label: String(label) }) }];\n });\n },\n staleTime: 60_000,\n placeholderData: keepPreviousData,\n retry: false,\n });\n}\n\n/** The label path a reference's values are said by: its target's label column. */\nfunction labelPathOf(box: Box): string | undefined {\n const target = box.meta?.references ? (findTable(box.meta.references.table) as TableMeta | undefined) : undefined;\n const label = target ? (labelColumn(target) as string | undefined) : undefined;\n return label ? `${box.column}.${label}` : undefined;\n}\n\nconst numericColumn = (box: Box) => (box.meta ? columnKind(box.meta.type) === 'number' : false);\n\nfunction ValuesFacet({ box, tail, table, refinement, standing, set, more }: FacetProps) {\n const [all, setAll] = useState(false);\n const labelPath = box.kind === 'ref' ? labelPathOf(box) : undefined;\n const counts = useCounts(table, refinement, box.column, labelPath, standing);\n const byValue = new Map((counts.data ?? []).map((c) => [c.value, c]));\n const selected = selectedValues(tail);\n const ticked = selected ?? [];\n /* A vocabulary is listed whole, in its own order — a value with no rows\n is still a value, and says 0. A reference lists the targets that have\n rows, the most first; so does text, and a number lists its values in\n their own order (1, 2, 3; 2016 to 2024). A ticked value is always\n listed, rows or none. */\n const allowed = (box.meta as { allowed?: string[] } | undefined)?.allowed;\n const rule = columnDisplay(table.id, box.column) as DisplayRule | null;\n const listed: Count[] = allowed?.length ? allowed.map((value) => byValue.get(value) ?? { value, count: 0 }) : [...(counts.data ?? [])];\n for (const value of ticked) if (!listed.some((c) => c.value === value)) listed.push({ value, count: 0 });\n if (!allowed?.length && box.kind !== 'ref' && numericColumn(box)) listed.sort((a, b) => Number(a.value) - Number(b.value));\n const shown = all || listed.length <= SHORT + SLACK ? listed : listed.filter((c, i) => i < SHORT || ticked.includes(c.value));\n /* Money is said as the cards say it ($1,795.00), whatever unit it is kept in; the tick still asks for the stored value. */\n const money = rule?.format === 'money' ? rule : null;\n const figure = (value: string) => {\n const dress = money ? dressFor(money, value) : null;\n return dress?.kind === 'money' ? dress.text : undefined;\n };\n const known = counts.isSuccess;\n const toggle = (value: string, on: boolean) => {\n const next = on ? [...ticked, value] : ticked.filter((v) => v !== value);\n const order = listed.map((c) => c.value);\n set(valuesTail(next.sort((a, b) => order.indexOf(a) - order.indexOf(b))));\n };\n return (\n <Facet box={box} tail={tail} set={set} more={more}>\n {selected === null && <Unshown box={box} table={table} tail={tail} />}\n {counts.isError && <p className=\"facet-note\">{say('countsUnavailable')}</p>}\n <ul className=\"facet-values\">\n {shown.map((c) => {\n /* A vocabulary's value is a word to its reader (`in_progress` says \"In progress\"),\n as its chip says it, and in the display rule's own word where it gives one\n (`values`, `humanize`); any other value is said exactly. */\n const said = c.label ?? wordFor(rule, c.value) ?? figure(c.value) ?? (allowed?.length ? vocabularyWord(c.value) : c.value);\n return (\n <li key={c.value}>\n <label className=\"facet-option\" title={c.label ? `${box.column} = ${c.value}` : undefined}>\n <input\n type=\"checkbox\"\n data-value={c.value}\n checked={ticked.includes(c.value)}\n onChange={(e) => toggle(c.value, e.target.checked)}\n />\n <span className=\"facet-option-label\">{said}</span> {/* Blank until known, never a guessed zero. */}\n <span className=\"facet-count\">{known ? counted(c.count) : ''}</span>\n </label>\n </li>\n );\n })}\n </ul>\n {!all && listed.length > shown.length && (\n <button type=\"button\" className=\"facet-more\" onClick={() => setAll(true)}>\n {say('showAll', { listedCount: listed.length })}\n </button>\n )}\n </Facet>\n );\n}\n\n/* One count of the list's records, asked of a breakdown in the rail's batch; null until known. */\nconst recordCount = (text: string) => ({\n queryKey: ['run', state.activeConnection ?? '', 'facet', text],\n queryFn: async (): Promise<number> => {\n const data = (await batchedBreakdown({ text, limit: 1 })) as {\n columns?: string[];\n rows?: Array<Record<string, unknown>>;\n errors?: unknown[];\n };\n if (data.errors?.length || !data.columns?.length) throw new Error(say('couldNotCountTheValues'));\n const n = Number(data.rows?.[0]?.[data.columns[data.columns.length - 1]] ?? 0);\n return Number.isFinite(n) ? n : 0;\n },\n staleTime: 60_000,\n placeholderData: keepPreviousData,\n retry: false,\n});\n\n/*\n * A value of the rows that point at the record (shared/listFilters.ts) —\n * `any opportunity where stage in (won, lost)`: a checklist of what those\n * rows hold, a vocabulary whole and in its order, anything else the values\n * held the most first, a reference by its record's name. Each value says how\n * many of the list's records one of their rows holding it would show — the\n * records, once each, under everything else the list asks.\n */\nfunction HasValuesFacet({ box, tail, table, refinement, standing, set }: FacetProps) {\n const [all, setAll] = useState(false);\n const has = box.has!;\n const allowed = (box.meta as { allowed?: string[] } | undefined)?.allowed;\n const target = box.meta?.references ? (findTable(box.meta.references.table) as TableMeta | undefined) : undefined;\n const naming = target ? (labelColumn(target) as string | undefined) : undefined;\n const labelPath = box.kind === 'ref' && naming ? `${has.asks}.${naming}` : undefined;\n const text = hasValuesText(has.child, has.asks, labelPath);\n const held = useQuery<Count[]>({\n queryKey: ['run', state.activeConnection ?? '', 'facet', text],\n enabled: !allowed?.length,\n queryFn: async () => {\n const data = (await batchedBreakdown({ text, limit: MOST })) as {\n columns?: string[];\n rows?: Array<Record<string, unknown>>;\n errors?: unknown[];\n };\n if (data.errors?.length || !data.columns?.length) throw new Error(say('couldNotCountTheValues'));\n const keys = data.columns;\n return (data.rows ?? []).flatMap((row) => {\n const value = row[keys[0]];\n if (value == null || value === '') return [];\n const label = labelPath ? row[keys[1]] : undefined;\n return [{ value: String(value), count: 0, ...(label == null ? {} : { label: String(label) }) }];\n });\n },\n staleTime: 60_000,\n retry: false,\n });\n const selected = selectedValues(tail);\n const ticked = selected ?? [];\n const listed: Count[] = allowed?.length ? allowed.map((value) => ({ value, count: 0 })) : [...(held.data ?? [])];\n for (const value of ticked) if (!listed.some((c) => c.value === value)) listed.push({ value, count: 0 });\n const shown = all || listed.length <= SHORT + SLACK ? listed : listed.filter((c, i) => i < SHORT || ticked.includes(c.value));\n const counts = useQueries({ queries: shown.map((c) => recordCount(hasCountText(table.id, refinement, box.column, standing, c.value))) });\n const rule = columnDisplay(has.child, has.asks) as DisplayRule | null;\n const toggle = (value: string, on: boolean) => {\n const next = on ? [...ticked, value] : ticked.filter((v) => v !== value);\n const order = listed.map((c) => c.value);\n set(valuesTail(next.sort((a, b) => order.indexOf(a) - order.indexOf(b))));\n };\n return (\n <Facet box={box} tail={tail} set={set}>\n {selected === null && <Unshown box={box} table={table} tail={tail} />}\n {(held.isError || counts.some((count) => count.isError)) && <p className=\"facet-note\">{say('countsUnavailable')}</p>}\n <ul className=\"facet-values\">\n {shown.map((c, i) => {\n const said = c.label ?? wordFor(rule, c.value) ?? (allowed?.length ? vocabularyWord(c.value) : c.value);\n const n = counts[i]?.data;\n return (\n <li key={c.value}>\n <label className=\"facet-option\" title={c.label ? `${has.asks} = ${c.value}` : undefined}>\n <input\n type=\"checkbox\"\n data-value={c.value}\n checked={ticked.includes(c.value)}\n onChange={(e) => toggle(c.value, e.target.checked)}\n />\n <span className=\"facet-option-label\">{said}</span> {/* Blank until known, never a guessed zero. */}\n <span className=\"facet-count\">{typeof n === 'number' ? counted(n) : ''}</span>\n </label>\n </li>\n );\n })}\n </ul>\n {!all && listed.length > shown.length && (\n <button type=\"button\" className=\"facet-more\" onClick={() => setAll(true)}>\n {say('showAll', { listedCount: listed.length })}\n </button>\n )}\n </Facet>\n );\n}\n\n/* One of their segments (`any opportunity where open`): a yes, as a flag's facet is, with how many records it shows. */\nfunction HasSegmentFacet({ box, table, refinement, standing, set }: FacetProps) {\n const count = useQuery(recordCount(hasCountText(table.id, refinement, box.column, standing)));\n const on = holdsCondition(refinement, box.column);\n return (\n <div className=\"facet\" data-column={box.column}>\n <label className=\"facet-option facet-flag\">\n <input type=\"checkbox\" data-value=\"true\" checked={on} onChange={(e) => set(e.target.checked ? WHOLE : '')} />\n <span className=\"facet-option-label\">{box.label}</span>{' '}\n <span className=\"facet-count\">{typeof count.data === 'number' ? counted(count.data) : ''}</span>\n </label>\n </div>\n );\n}\n\n/*\n * A record's tags (tagLists.ts): every tag, by name, ticked for any of them —\n * `tags has (bug, docs)`. The names are the tag table's, read as the rail\n * reads any values, through this reader's grants; a tag is listed whether\n * or not a record in view has it, as a vocabulary's value is.\n */\nfunction TagsFacet({ box, tail, table, set }: FacetProps) {\n const tags = table.tags;\n // A list its definition spells out (a row-defined `choices` field, DefinedFields.tsx) offers those options, uncounted.\n const options = (box.meta as { allowed?: readonly string[] } | undefined)?.allowed;\n const text = tags ? `${tags.to} count by ${tags.label} sort ${tags.label}` : '';\n const listing = useQuery<string[]>({\n queryKey: ['run', state.activeConnection ?? '', 'facet', text],\n enabled: Boolean(tags) && !options,\n queryFn: async () => {\n const data = (await batchedBreakdown({ text, limit: MOST })) as {\n columns?: string[];\n rows?: Array<Record<string, unknown>>;\n errors?: unknown[];\n };\n if (data.errors?.length || !data.columns?.length) throw new Error(say('couldNotCountTheValues'));\n const key = data.columns[0];\n return (data.rows ?? []).flatMap((row) => (row[key] == null || row[key] === '' ? [] : [String(row[key])]));\n },\n staleTime: 60_000,\n retry: false,\n });\n const selected = selectedTags(tail);\n const ticked = selected ?? [];\n const listed = [...(options ?? listing.data ?? [])];\n for (const value of ticked) if (!listed.includes(value)) listed.push(value);\n const toggle = (value: string, on: boolean) => {\n const next = on ? [...ticked, value] : ticked.filter((v) => v !== value);\n set(tagsTail(next.sort((a, b) => listed.indexOf(a) - listed.indexOf(b))));\n };\n return (\n <Facet box={box} tail={tail} set={set}>\n {selected === null && <Unshown box={box} table={table} tail={tail} />}\n {listing.isError && <p className=\"facet-note\">{say('countsUnavailable')}</p>}\n <ul className=\"facet-values\">\n {listed.map((value) => (\n <li key={value}>\n <label className=\"facet-option\">\n <input\n type=\"checkbox\"\n data-value={value}\n checked={ticked.includes(value)}\n onChange={(e) => toggle(value, e.target.checked)}\n />\n <span className=\"facet-option-label\">{value}</span>\n </label>\n </li>\n ))}\n </ul>\n </Facet>\n );\n}\n\nconst truthy = (value: string) => value === '1' || value.toLowerCase() === 'true';\n\nfunction FlagFacet({ box, tail, table, refinement, standing, set, more }: FacetProps) {\n const counts = useCounts(table, refinement, box.column, undefined, standing);\n const yes = counts.isSuccess ? (counts.data ?? []).filter((c) => truthy(c.value)).reduce((n, c) => n + c.count, 0) : null;\n const on = tail === '= true';\n return (\n /* Ticked, the box is its own Clear; a second one would only push the\n count out of line with every other facet's. */\n <Facet box={box} tail={on ? '' : tail} set={set} group={false} more={more}>\n {tail && !on && <Unshown box={box} table={table} tail={tail} />}\n <label className=\"facet-option facet-flag\">\n <input type=\"checkbox\" data-value=\"true\" checked={on} onChange={(e) => set(e.target.checked ? '= true' : '')} />\n <span className=\"facet-option-label\">{box.label}</span> <span className=\"facet-count\">{yes === null ? '' : counted(yes)}</span>\n </label>\n </Facet>\n );\n}\n\nfunction DateFacet({ box, tail, table, set, onEnter, more }: FacetProps) {\n const name = useId();\n const range = rangeOf(tail);\n /* What the column is decides what it is asked: a stamp its past windows, a deadline what is overdue (filterRailModel.ts). */\n const presets = datePresets(box.meta);\n const preset = presets.find(([, t]) => t === tail);\n /* The ends are typed into a draft and applied on Enter or leaving the\n box: a date input reports every keystroke of a year as a whole date. */\n const [from, setFrom] = useState(range.from);\n const [to, setTo] = useState(range.to);\n useEffect(() => {\n setFrom(range.from);\n setTo(range.to);\n }, [range.from, range.to]);\n const commit = () => {\n if ((from && !isPickerDate(from)) || (to && !isPickerDate(to))) return false;\n if (from !== range.from || to !== range.to) set(rangeTail(from, to));\n return true;\n };\n const onKey = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n if (commit()) onEnter?.();\n }\n };\n return (\n <Facet box={box} tail={tail} set={set} more={more}>\n {tail && !preset && !range.from && !range.to && <Unshown box={box} table={table} tail={tail} />}\n <div className=\"facet-values\">\n {presets.map(([label, value]) => (\n <label key={value} className=\"facet-option\">\n <input type=\"radio\" name={name} data-value={value} checked={preset?.[1] === value} onChange={() => set(value)} />\n <span className=\"facet-option-label\">{label}</span>\n </label>\n ))}\n </div>\n <div className=\"facet-range facet-date-range\">\n <div className=\"facet-range-end\">\n <label htmlFor={`${name}-from`}>{say('from')}</label>\n <DateField\n id={`${name}-from`}\n aria-label={say('from')}\n className=\"facet-input\"\n value={from}\n max={isPickerDate(to) ? to : undefined}\n locale={formatLocale()}\n timezone={formatTimezone()}\n onChange={setFrom}\n onBlur={commit}\n onKeyDown={onKey}\n />\n </div>\n <div className=\"facet-range-end\">\n <label htmlFor={`${name}-to`}>{say('to')}</label>\n <DateField\n id={`${name}-to`}\n aria-label={say('to')}\n className=\"facet-input\"\n value={to}\n min={isPickerDate(from) ? from : undefined}\n locale={formatLocale()}\n timezone={formatTimezone()}\n onChange={setTo}\n onBlur={commit}\n onKeyDown={onKey}\n />\n </div>\n </div>\n </Facet>\n );\n}\n\n/** The shape a plain column's facet takes, judged once from its values over the view's standing rows. */\nfunction useFacetShape(table: TableMeta, column: string, standing: string, numeric: boolean, bare = false) {\n const text = facetShapeText(table.id, column, standing);\n return useQuery<AutoShape>({\n queryKey: ['run', state.activeConnection ?? '', 'facet-shape', text, bare],\n queryFn: async () => {\n const data = (await batchedBreakdown({ text, limit: MOST + 1 })) as { rows?: unknown[]; errors?: unknown[] };\n if (data.errors?.length) throw new Error(say('couldNotCountTheValues'));\n const distinct = data.rows?.length ?? 0;\n /* A name with nothing to list has no checklist to offer: it stays the box that searches it. */\n if (bare && distinct === 0) return 'text';\n return autoShape(numeric, distinct, distinct <= MOST);\n },\n staleTime: 5 * 60_000,\n retry: false,\n });\n}\n\nfunction AutoFacet(props: FacetProps & { unit?: FacetUnit; bare?: boolean }) {\n const { box, tail, table, standing, set, more, bare } = props;\n const numeric = numericColumn(box);\n const shape = useFacetShape(table, box.column, standing, numeric, bare);\n const settled = shape.isError ? (numeric ? 'range' : 'text') : shape.data;\n /* Until the shape is known the facet is its name alone — never a box that\n turns into a list under the reader's pointer. */\n if (!settled)\n return (\n <Facet box={box} tail={tail} set={set} more={more} busy>\n {tail ? <Unshown box={box} table={table} tail={tail} /> : null}\n </Facet>\n );\n if (settled === 'values') return <ValuesFacet {...props} />;\n if (settled === 'range') return <RangeFacet {...props} />;\n return <TextFacet key={tail} {...props} />;\n}\n\n/* What a reader types as a figure, without its dressing: \"$15,000\" is 15000. */\nconst plain = (text: string) => text.replace(/[\\s,$€£]/g, '');\n\nfunction currencySymbol(currency: string): string | undefined {\n try {\n return new Intl.NumberFormat(formatLocale(), { style: 'currency', currency }).formatToParts(0).find((part) => part.type === 'currency')\n ?.value;\n } catch {\n return undefined;\n }\n}\n\n/**\n * A range over money kept in minor units is typed and read in the major unit, as the cards say it: the question\n * keeps the stored figure (179500), the boxes hold what a person means by it (1795). Any other column is as it is.\n */\nfunction minorRange(rule: DisplayRule | null, currency: string | undefined) {\n if (!rule?.minor || rule.format !== 'money') return null;\n const code = rule.currency || currency || defaultCurrency();\n return {\n /* \"1795.00\" is typed as 1795: the cents are said only where there are some. */\n toMajor: (stored: string) => minorToMajor(stored, code)?.replace(/\\.0+$/, '') ?? stored,\n /* A figure that is no amount in this currency (too many decimals) is left as typed, and ignored by the range. */\n toMinor: (typed: string) => {\n const minor = typed === '' ? undefined : majorToMinor(typed, code);\n return minor === undefined ? typed : String(minor);\n },\n };\n}\n\nfunction RangeFacet({ box, tail, table, set, unit, onEnter, more }: FacetProps & { unit?: FacetUnit }) {\n const kept = numberRangeOf(tail);\n const minor = minorRange(columnDisplay(table.id, box.column) as DisplayRule | null, unit?.currency);\n const range = minor ? { min: minor.toMajor(kept.min), max: minor.toMajor(kept.max) } : kept;\n /* Applied on Enter or leaving the box, as a date's range is: a figure\n typed a digit at a time is not a new question at every digit. */\n const [min, setMin] = useState(range.min);\n const [max, setMax] = useState(range.max);\n useEffect(() => {\n setMin(range.min);\n setMax(range.max);\n }, [range.min, range.max]);\n const commit = () => {\n const ends = minor ? [minor.toMinor(plain(min)), minor.toMinor(plain(max))] : [plain(min), plain(max)];\n const next = numberRangeTail(ends[0], ends[1]);\n if (next !== numberRangeTail(kept.min, kept.max)) set(next);\n };\n const onKey = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n commit();\n onEnter?.();\n }\n };\n const symbol = unit?.currency ? currencySymbol(unit.currency) : undefined;\n /* Each end is a compact Field, so the rail's boxes are the filter bar's\n fields in every look. The input is named by the word alone: the symbol\n and the unit beside it stay out of the label, and \"Min$\" is not a name. */\n const end = (which: 'min' | 'max', value: string, change: (value: string) => void) => (\n <Field size=\"compact\" className=\"facet-range-end\" label={which === 'min' ? say('min') : say('max')}>\n {(control) => (\n <span className=\"facet-affix\">\n {symbol && (\n <span className=\"facet-affix-text\" aria-hidden=\"true\">\n {symbol}\n </span>\n )}\n <input\n {...control}\n type=\"text\"\n inputMode=\"decimal\"\n className=\"field-control facet-input\"\n data-value={which}\n value={value}\n placeholder={say('common.any')}\n onChange={(e) => change(e.target.value)}\n onBlur={commit}\n onKeyDown={onKey}\n />\n {unit?.unit && (\n <span className=\"facet-affix-text\" aria-hidden=\"true\">\n {unit.unit}\n </span>\n )}\n </span>\n )}\n </Field>\n );\n return (\n <Facet box={box} tail={tail} set={set} more={more}>\n {tail && !range.min && !range.max && <Unshown box={box} table={table} tail={tail} />}\n <div className=\"facet-range\">\n {end('min', min, setMin)}\n {end('max', max, setMax)}\n </div>\n </Facet>\n );\n}\n\n/* Keyed by its tail, so a condition changed elsewhere redraws the box with it. */\nfunction TextFacet({ box, tail, table, standing, set, onEnter, more }: FacetProps) {\n const id = useId();\n const fuzzy = box.meta ? columnKind(box.meta.type) === 'text' : false;\n const initial = tail.startsWith('contains ')\n ? unquote(tail.slice('contains '.length))\n : tail.startsWith('= ')\n ? `${fuzzy ? '=' : ''}${unquote(tail.slice(2))}`\n : '';\n const [text, setText] = useState(initial);\n const suggesting = useArrived(SuggestBox, Boolean(box.suggest?.length));\n const commit = (raw = text) => {\n if (raw !== initial) set(boxTail(box, { raw }, tail));\n };\n const inputProps = {\n id,\n type: 'search',\n className: 'field-control facet-input',\n 'data-value': 'text',\n placeholder: fuzzy ? say('contains') : say('equals'),\n title: fuzzy ? say('common.matchesAnywhereInTheValue') : undefined,\n onBlur: () => commit(),\n onKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n commit();\n onEnter?.();\n }\n },\n };\n return (\n <Facet box={box} tail={tail} set={set} group={false} more={more}>\n <label className=\"facet-label\" htmlFor={id}>\n {box.label}\n </label>\n {tail && !initial && <Unshown box={box} table={table} tail={tail} />}\n {/* In a compact field's dress: the facet's name above is its label. */}\n <div className=\"form-field form-field-compact\">\n {suggesting && box.suggest ? (\n <SuggestBox\n table={table.id}\n columns={box.suggest}\n standing={standing}\n text={text}\n onText={setText}\n onPick={(value) => {\n commit(value);\n onEnter?.();\n }}\n inputProps={inputProps}\n />\n ) : (\n <input {...inputProps} value={text} onChange={(e) => setText(e.target.value)} />\n )}\n </div>\n </Facet>\n );\n}\n\n/**\n * How many rows a draft question shows — what the sheet's button and a list\n * bar's picker say before they apply it. Under the view's standing condition,\n * as the list itself is: without it \"Show 55\" counted the sold cars the list\n * never shows.\n */\nexport function useDraftCount(table: TableMeta, standing: string, draft: string): number | null | undefined {\n const q = squeeze(`${table.id} ${andQuery(standing, draft)}`);\n return useQuery<number | null>({\n queryKey: ['count', state.activeConnection ?? '', q],\n queryFn: async () => {\n const data = await api('/api/run', { q, limit: 1 });\n return 'total' in data && !data.errors?.length && typeof data.total === 'number' ? data.total : null;\n },\n staleTime: 60_000,\n placeholderData: keepPreviousData,\n retry: false,\n }).data;\n}\n\ninterface SheetProps extends Omit<RailProps, 'onChange' | 'status'> {\n onApply: (refinement: string) => void;\n onClose: () => void;\n}\n\n/**\n * The rail on a phone: the same facets in a sheet over the list, edited as\n * a draft — the counts follow the draft — and applied by one button that\n * says what it will show.\n */\nexport function FilterSheet({ refinement, onApply, onClose, ...rail }: SheetProps) {\n const [draft, setDraft] = useState(refinement);\n const n = useDraftCount(rail.table, rail.standing ?? '', draft);\n return (\n <Modal className=\"filter-sheet\" fullscreen=\"mobile\" ariaLabel={say('common.filtersButton')} onClose={onClose}>\n <FilterRail {...rail} refinement={draft} onChange={setDraft} status={typeof n === 'number' ? `${counted(n)} match` : undefined} />\n <div className=\"filter-sheet-foot\">\n <Button onClick={onClose}>{say('common.cancel')}</Button>\n <Button intent=\"primary\" onClick={() => onApply(draft)}>\n {typeof n === 'number' ? say('showCount', { count: counted(n) }) : say('common.showResults')}\n </Button>\n </div>\n </Modal>\n );\n}\n","/** What ListFilterBar says, in the filter rail room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n moreFilters: 'More filters: {map}',\n search: 'Search {listLabel}…',\n labelEquals: '{label} equals…',\n takesANumber: '{label} takes a number.',\n matchesAnywhereInTheAny: 'Matches anywhere in the {label}, any case. Start with = for an exact match.',\n showN: 'Show {n}',\n match: '{n} match',\n});\n","/**\n * An App list's filters as controls, not a form: the bar a list draws above\n * its rows unless its view says `filterBar: 'rail'` or `'none'`.\n *\n * The bar was a form — an empty box or Select per filter, then Filter, then\n * Advanced — the heaviest thing above a quiet table, and on a phone more than\n * half the first screen. So the list's name column keeps one search box, a\n * real field with the 3:1 edge; every other filter the view declares is a\n * quiet \"+ Status\" that opens, in a popover, the picker the rail draws for it\n * (a checklist, Min/Max, date presets; a reference is the typeahead its box\n * was); and what is applied is said in the same row as chips, each in its\n * filter's place: a chip opens its picker again, its × (or Backspace) takes\n * it out, and two or more earn one Clear all. On a phone the pickers are the\n * rail's sheet, behind one Filters button that says how many apply.\n *\n * No picker writes a new kind of question. Each hands a condition tail to\n * withCondition, as the boxes and the rail do, so a chip, the address\n * (publicAddress.ts), a saved view and the crumb read it as they always did.\n * A picker edits a draft and applies it with one button: every navigation\n * redraws the list, and a popover that applied each tick would close under\n * the reader's second one.\n */\nimport { useEffect, useLayoutEffect, useRef, useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { Button } from '@mistriwork/ui/Button.js';\nimport { Popover } from '@base-ui/react/popover';\nimport { WHOLE, canonicalize, conditionTail, mentionsColumn, ownedTails, squeeze, stripCondition, withCondition } from '../filterbar.js';\nimport { formatNumber } from '../locale.js';\nimport { columnKind, type TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport { layoutViewport, zoomAnchor } from '@mistriwork/ui/internal/anchor.js';\nimport { RefBox, boxTail, boxText, wrongForNumber, type Box, type BoxEdit } from './FilterBoxes.js';\nimport { useConditionWords } from './useConditionWords.js';\nimport { useArrived } from './onDemand.js';\nimport { SuggestBox } from './suggestPart.js';\nimport { FacetFor, useDraftCount, type FacetUnit } from './FilterRail.js';\nimport { clearFacets, facetActive } from './filterRailModel.js';\nimport { say } from '../copy/filters/components/ListFilterBar.js';\nimport { popupContainer } from '../shellHost.js';\n\ninterface ListFilterBarProps {\n table: TableMeta;\n /** Every filter the view declares, the name column's first. */\n boxes: Box[];\n /** The name column's box, drawn as the search box; every other box is a picker. */\n search?: Box;\n /** The question the controls read, without the table or the plumbing. */\n refinement: string;\n /** The lit tab's own query: a column it speaks for is the tab's to say, not a chip's. */\n tabQuery: string;\n /** The view's standing condition, under every count a picker shows. */\n standing: string;\n unitOf: (column: string) => FacetUnit | undefined;\n /** What is typed in the search box and not yet applied; undefined while untouched. */\n typed: string | undefined;\n onType: (raw: string) => void;\n /** Enter, or the search field's own ×: the list's form folds the typed text in. */\n onSearch: () => void;\n /** Every change goes here, with the column whose control the redrawn list focuses. */\n apply: (text: string, focus?: string) => void;\n /** The text a chip's × edits: the query bar's, while a reader is typing in it. */\n current: () => string;\n /** A leftover clause no tab explains, said in words with its own way out. */\n residue?: { text: string; remove: () => void };\n /** The list's own name, for the search box's words: \"Search issues…\". */\n listLabel: string;\n phone: boolean;\n /** The phone's pickers: the rail's sheet, over the list. */\n onSheet: () => void;\n}\n\ntype SlotProps = ListFilterBarProps & { box: Box; chipOnly?: boolean };\n\nexport function ListFilterBar(props: ListFilterBarProps) {\n const { boxes, search, refinement, tabQuery, apply, residue, phone, onSheet } = props;\n const pickers = boxes.filter((box) => box !== search);\n const columns = boxes.map((box) => box.column);\n const active = boxes.filter((box) => facetActive(refinement, box.column, tabQuery)).length;\n const narrowed = pickers.filter((box) => facetActive(refinement, box.column, tabQuery)).length;\n /* One way to empty the row once there is more than one thing in it; the\n lit tab's own conditions stay, as the rail's Clear all leaves them. The\n focus goes to the row's first control, not the page. */\n const clearAll =\n active >= 2 ? (\n <button\n type=\"button\"\n className=\"applist-chips-clear\"\n onClick={() => apply(clearFacets(refinement, columns, tabQuery), search?.column ?? pickers[0]?.column)}\n >\n {say('list.clearAll')}\n </button>\n ) : null;\n const residueChip = residue ? (\n <span className=\"applist-chip\">\n <span className=\"applist-chip-text\">{residue.text}</span>\n <button type=\"button\" className=\"applist-chip-x\" aria-label={say('common.remove2', { text: residue.text })} onClick={residue.remove}>\n ×\n </button>\n </span>\n ) : null;\n const searchBox = search ? <SearchBox {...props} box={search} /> : null;\n /* On a desk the row keeps one line: the filters not yet asked for give way\n from the end, into one \"+ Filter\" that opens every picker in the sheet,\n rather than the last of them standing cut at the window's edge (\"+ Orde…\").\n A chip never gives way — it says what the rows are. Counted before the\n row is painted, so nothing is seen to jump. */\n const idle = pickers.filter((box) => !facetActive(refinement, box.column, tabQuery));\n const [folded, setFolded] = useState(0);\n /* A new width is measured afresh even where nothing was folded: the fold\n below runs after a render, and unfolding nothing renders nothing. */\n const [, remeasure] = useState(0);\n const mark = useRef<HTMLSpanElement>(null);\n const width = useRef(0);\n useLayoutEffect(() => {\n setFolded(0);\n }, [refinement, tabQuery, boxes.length]);\n useLayoutEffect(() => {\n const row = mark.current?.closest<HTMLElement>('.applist-controls');\n if (!row) return;\n /* The list's tabs give way after the filters (structure.css): told here when the filters have nothing left to give. */\n row.toggleAttribute('data-filters-spent', !phone && folded >= idle.length);\n if (phone) return;\n const over = row.scrollWidth - row.clientWidth;\n if (over < 2 || folded >= idle.length) return;\n /* As many more of the shown pickers, from the end, as the room they stand in (their widths and the gaps before\n them, in layout pixels as scrollWidth is) covers: every one that starts past where the row would have to end,\n and the one before them. Never more than are needed — the \"+ Filter\" that folding brings takes room of its own —\n so a row still too wide folds again on its next render. One a render, it was a render and a measure of the whole\n row per picker, in every sort, filter and tab (test/built-client-vitals.mjs). */\n const slots = [...row.querySelectorAll<HTMLElement>('.applist-slot[data-column]')];\n const end = (node?: Node | null) => (node ? (node as HTMLElement).offsetLeft + (node as HTMLElement).offsetWidth : 0);\n const limit = end(slots.at(-1)) - over;\n setFolded(folded + 1 + slots.filter((slot) => end(slot.previousSibling) > limit).length);\n });\n useEffect(() => {\n const row = mark.current?.closest<HTMLElement>('.applist-controls');\n if (phone || !row || typeof ResizeObserver === 'undefined') return undefined;\n width.current = row.clientWidth;\n const observer = new ResizeObserver(() => {\n if (row.clientWidth === width.current) return;\n width.current = row.clientWidth;\n setFolded(0);\n remeasure((n) => n + 1);\n });\n observer.observe(row);\n /* A look's face arriving after the first measure widens the words in a row whose own width never changed: the\n fold was judged on the fallback's metrics, and the row scrolled 10px on a desk wherever the face was late. */\n const fonts = typeof document === 'undefined' ? undefined : document.fonts;\n const refit = () => {\n setFolded(0);\n remeasure((n) => n + 1);\n };\n fonts?.addEventListener?.('loadingdone', refit);\n return () => {\n observer.disconnect();\n fonts?.removeEventListener?.('loadingdone', refit);\n };\n }, [phone]);\n const hidden = new Set(folded ? idle.slice(-folded).map((box) => box.column) : []);\n if (phone) {\n /* The search stays in reach; the pickers are one button, and the chips\n wrap under the box rather than pushing it off the row. */\n return (\n <>\n {searchBox}\n {pickers.length > 0 && (\n <button type=\"button\" className=\"applist-add applist-sheet-open\" aria-haspopup=\"dialog\" onClick={onSheet}>\n {narrowed ? say('common.filters', { narrowed }) : say('common.filtersButton')}\n </button>\n )}\n <div className=\"applist-bar-chips\">\n {search && <FilterSlot {...props} box={search} chipOnly />}\n {pickers.map((box) => (\n <FilterSlot key={box.column} {...props} box={box} chipOnly />\n ))}\n {residueChip}\n {clearAll}\n </div>\n </>\n );\n }\n const rest = idle.filter((box) => hidden.has(box.column));\n return (\n <>\n <span ref={mark} hidden />\n {searchBox}\n {search && <FilterSlot {...props} box={search} />}\n {pickers\n .filter((box) => !hidden.has(box.column))\n .map((box) => (\n <FilterSlot key={box.column} {...props} box={box} />\n ))}\n {rest.length > 0 && (\n <span className=\"applist-slot applist-slot-more\">\n <button\n type=\"button\"\n className=\"applist-add\"\n aria-haspopup=\"dialog\"\n aria-label={say('moreFilters', { map: rest.map((box) => box.label).join(', ') })}\n onClick={onSheet}\n >\n <span className=\"applist-add-mark\" aria-hidden=\"true\">\n +\n </span>\n {say('common.filter')}\n </button>\n </span>\n )}\n {residueChip}\n {clearAll}\n </>\n );\n}\n\n/**\n * One declared filter in its place in the row: its chip when it narrows the\n * list, its \"+\" when it does not. A flag's \"+\" is one gesture, as its\n * checkbox was; every other \"+\" opens the column's picker.\n */\nfunction FilterSlot(props: SlotProps) {\n const { box, search, refinement, tabQuery, apply, current, phone, onSheet, chipOnly } = props;\n /* The lit tab says its own column; a chip would say it twice. */\n const owned = mentionsColumn(tabQuery, box.column);\n const tails = owned ? [] : (ownedTails(refinement, box.column) as string[]);\n /* In the App's words: the label, the rule's word for a value, and a\n reference by the name its box shows, not the id beneath it. */\n const { speaker, sayTails } = useConditionWords(\n props.table,\n tails.map((tail) => `${box.column} ${tail}`),\n );\n const isSearch = box === search;\n /* The search's own condition is in its box; a chip only for what the box cannot say. */\n const chipped = tails.length > 0 && !(isSearch && tails.length === 1 && boxText(box, tails[0]));\n if (chipped) {\n const text = sayTails(speaker, box.column, tails);\n const remove = () => apply(withCondition(current(), box.column, ''), box.column);\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Backspace' && e.key !== 'Delete') return;\n e.preventDefault();\n remove();\n };\n const open = isSearch ? (\n <span className=\"applist-chip-text\">{text}</span>\n ) : phone ? (\n <button type=\"button\" className=\"applist-chip-text applist-chip-open\" aria-haspopup=\"dialog\" onClick={onSheet} onKeyDown={onKeyDown}>\n {text}\n </button>\n ) : (\n <Picker {...props} owned={false} className=\"applist-chip-text applist-chip-open\" onKeyDown={onKeyDown}>\n {text}\n </Picker>\n );\n return (\n <span className=\"applist-chip\" data-column={box.column}>\n {open}\n <button\n type=\"button\"\n className=\"applist-chip-x\"\n aria-label={say('common.remove2', { text })}\n onClick={remove}\n onKeyDown={onKeyDown}\n >\n ×\n </button>\n </span>\n );\n }\n if (chipOnly || isSearch) return null;\n const plus = (\n <>\n <span className=\"applist-add-mark\" aria-hidden=\"true\">\n +\n </span>\n {box.label}\n </>\n );\n if (box.kind === 'flag') {\n return (\n <span className=\"applist-slot\" data-column={box.column}>\n <button\n type=\"button\"\n className=\"applist-add\"\n aria-label={say('common.only', { label: box.label })}\n onClick={() => apply(withCondition(refinement, box.column, box.has?.segment ? WHOLE : '= true'), box.column)}\n >\n {plus}\n </button>\n </span>\n );\n }\n return (\n <span className=\"applist-slot\" data-column={box.column}>\n <Picker {...props} owned={owned} className=\"applist-add\" label={say('common.filter2', { label: box.label })}>\n {plus}\n </Picker>\n </span>\n );\n}\n\n/* The list's name column as a search: Enter asks, and the field's own ×\n (a search field's clear button) empties the question as Enter on an empty\n box would. It reads what the question says and keeps what is typed. */\nfunction SearchBox({ box, table, standing, refinement, typed, onType, onSearch, listLabel }: SlotProps) {\n const input = useRef<HTMLInputElement>(null);\n const viaEnter = useRef(false);\n const said = boxText(box, squeeze(conditionTail(refinement, box.column)));\n const fuzzy = !box.exact && (box.meta ? columnKind(box.meta.type) === 'text' : false);\n const suggesting = useArrived(SuggestBox, Boolean(box.suggest?.length));\n useEffect(() => {\n const el = input.current;\n if (!el) return undefined;\n /* The search event also comes with Enter, which the form already answers. */\n const cleared = () => {\n if (viaEnter.current) {\n viaEnter.current = false;\n return;\n }\n if (el.value === '' && said) onSearch();\n };\n el.addEventListener('search', cleared);\n return () => el.removeEventListener('search', cleared);\n }, [said, onSearch, suggesting]);\n const wrong = wrongForNumber(box, typed);\n const inputProps = {\n type: 'search',\n className: 'applist-search-input',\n ...(box.meta && columnKind(box.meta.type) === 'number' ? { inputMode: 'decimal' as const } : {}),\n ...(wrong ? { 'aria-invalid': true, title: say('takesANumber', { label: box.label }) } : {}),\n placeholder: fuzzy ? say('search', { listLabel: listLabel.toLowerCase() }) : say('labelEquals', { label: box.label }),\n 'aria-label': say('common.filter2', { label: box.label }),\n ...(wrong ? {} : { title: fuzzy ? say('matchesAnywhereInTheAny', { label: box.label.toLowerCase() }) : undefined }),\n onKeyDown: (e: KeyboardEvent<HTMLInputElement>) => {\n viaEnter.current = e.key === 'Enter';\n /* Asked for, not left to implicit submission: a form with two\n fields (this and the query bar's) and no submit button has none. */\n if (e.key === 'Enter' && !e.nativeEvent.isComposing) {\n e.preventDefault();\n onSearch();\n }\n },\n };\n return (\n <span className=\"applist-search\" data-column={box.column}>\n {suggesting && box.suggest ? (\n <SuggestBox\n table={table.id}\n columns={box.suggest}\n standing={standing}\n text={typed ?? said}\n onText={onType}\n onPick={(value) => {\n onType(value);\n onSearch();\n }}\n inputProps={inputProps}\n inputRef={input}\n />\n ) : (\n <input ref={input} {...inputProps} value={typed ?? said} onChange={(e) => onType(e.target.value)} />\n )}\n </span>\n );\n}\n\n/**\n * A \"+\" or a chip, and the popover it opens: anchored on the zoom-aware\n * ruler, drawn inside the enclosing dialog when there is one, the focus on\n * its first field as it opens and back on its button when Escape closes it.\n */\nfunction Picker({\n className,\n label,\n onKeyDown,\n owned,\n children,\n ...props\n}: SlotProps & {\n owned: boolean;\n className: string;\n label?: string;\n onKeyDown?: (e: KeyboardEvent) => void;\n children: ReactNode;\n}) {\n const { box, refinement } = props;\n const trigger = useRef<HTMLButtonElement>(null);\n const popup = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const [container, setContainer] = useState<HTMLElement | null>(null);\n useEffect(() => {\n setContainer(trigger.current?.closest('dialog, [role=\"dialog\"]') as HTMLElement | null);\n }, []);\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger render={<button type=\"button\" className={className} aria-label={label} ref={trigger} onKeyDown={onKeyDown} />}>\n {children}\n </Popover.Trigger>\n <Popover.Portal container={container ?? popupContainer()}>\n <Popover.Positioner\n anchor={() => (trigger.current ? zoomAnchor(trigger.current) : null)}\n positionMethod=\"fixed\"\n side=\"bottom\"\n align=\"start\"\n sideOffset={6}\n collisionBoundary={layoutViewport()}\n collisionPadding={8}\n style={{ zIndex: 40 }}\n >\n <Popover.Popup\n ref={popup}\n className=\"filter-pop\"\n aria-label={say('common.filter2', { label: box.label })}\n data-column={box.column}\n initialFocus={() => popup.current?.querySelector<HTMLElement>('input:not([type=\"hidden\"]):not([aria-hidden=\"true\"])') ?? true}\n >\n <FilterPicker\n box={box}\n table={props.table}\n refinement={refinement}\n standing={props.standing}\n unit={props.unitOf(box.column)}\n owned={owned}\n apply={props.apply}\n close={() => setOpen(false)}\n />\n </Popover.Popup>\n </Popover.Positioner>\n </Popover.Portal>\n </Popover.Root>\n );\n}\n\n/** What a column's picker needs: the bar's \"+ Status\" and an App column menu's Filter… open the same one. */\nexport interface FilterPickerProps {\n box: Box;\n table: TableMeta;\n refinement: string;\n standing: string;\n unit?: FacetUnit;\n /** The lit tab speaks for this column: the picker starts blank, and a choice replaces the tab's condition. */\n owned: boolean;\n apply: (text: string, focus?: string) => void;\n close: () => void;\n}\n\n/** One column's picker: a reference's typeahead, or the rail's facet over a draft. */\nexport function FilterPicker(props: FilterPickerProps) {\n const { box, refinement, owned, apply } = props;\n return box.kind === 'ref' ? (\n <ReferencePicker box={box} tail={owned ? '' : squeeze(conditionTail(refinement, box.column))} refinement={refinement} apply={apply} />\n ) : (\n <FacetPicker {...props} />\n );\n}\n\n/**\n * The rail's facet for one column, editing a draft that one button applies,\n * saying what it will show as the sheet's does — and, to a screen reader, as\n * the draft changes. Where the lit tab speaks for the column the picker\n * starts blank — the tab says it — and a tick replaces the tab's condition,\n * as the box's choice did.\n */\nfunction FacetPicker({ box, refinement, table, standing, unit, apply, owned, close }: FilterPickerProps) {\n const [draft, setDraft] = useState(refinement);\n /* Read when the draft is applied, which can be in the event that set it (Enter in a box). */\n const now = useRef(refinement);\n const set = (tail: string) => {\n now.current = withCondition(now.current, box.column, tail);\n setDraft(now.current);\n };\n const unchanged = canonicalize(draft) === canonicalize(refinement);\n const go = () => {\n if (canonicalize(now.current) === canonicalize(refinement)) close();\n else apply(now.current, box.column);\n };\n const n = useDraftCount(table, standing, draft);\n const form = useRef<HTMLFormElement>(null);\n /* A facet whose shape is still being counted has no field yet as the\n popover opens, which then holds the focus itself: the first field to\n arrive takes it, unless the reader has already moved it. */\n useEffect(() => {\n const home = form.current;\n const pop = home?.closest<HTMLElement>('.filter-pop');\n if (!home || !pop || typeof MutationObserver === 'undefined') return undefined;\n const field = () => home.querySelector<HTMLElement>('input:not([type=\"hidden\"]):not([aria-hidden=\"true\"])');\n if (field()) return undefined;\n const observer = new MutationObserver(() => {\n const first = field();\n if (!first) return;\n observer.disconnect();\n /* After the popover's own focus management has settled on its frame. */\n setTimeout(() => {\n if (document.activeElement === pop || document.activeElement === document.body) first.focus();\n }, 0);\n });\n observer.observe(home, { childList: true, subtree: true });\n return () => observer.disconnect();\n }, []);\n return (\n <form\n ref={form}\n className=\"filter-pop-form\"\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n go();\n }}\n >\n <FacetFor\n box={box}\n table={table}\n refinement={owned && unchanged ? stripCondition(draft, box.column) : draft}\n standing={standing}\n unit={unit}\n set={set}\n onEnter={go}\n picking\n />\n <p className=\"visually-hidden\" role=\"status\">\n {typeof n === 'number' ? say('match', { n: formatNumber(n) }) : ''}\n </p>\n <div className=\"filter-pop-foot\">\n <Button intent=\"primary\" size=\"compact\" type=\"submit\">\n {typeof n === 'number' ? say('showN', { n: formatNumber(n) }) : say('common.showResults')}\n </Button>\n </div>\n </form>\n );\n}\n\n/* A reference is the typeahead its box was: type a name, pick a row, and the\n question says its id. A pick is the decision, so it applies at once; Enter\n on typed text asks for it as written. The list is up as the picker opens. */\nfunction ReferencePicker({\n box,\n tail,\n refinement,\n apply,\n}: {\n box: Box;\n tail: string;\n refinement: string;\n apply: ListFilterBarProps['apply'];\n}) {\n const [edit, setEdit] = useState<BoxEdit | undefined>(undefined);\n const now = useRef<BoxEdit | undefined>(undefined);\n const onEdit = (next: BoxEdit) => {\n now.current = next;\n setEdit(next);\n };\n const submit = () => {\n if (now.current) apply(withCondition(refinement, box.column, boxTail(box, now.current, tail)), box.column);\n };\n return (\n <form\n className=\"filter-pop-form\"\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n submit();\n }}\n >\n <div className=\"facet\" data-column={box.column}>\n <span className=\"facet-label\" aria-hidden=\"true\">\n {box.label}\n </span>\n {tail && (\n <button\n type=\"button\"\n className=\"facet-clear\"\n aria-label={say('common.clear2', { label: box.label })}\n onClick={() => apply(withCondition(refinement, box.column, ''), box.column)}\n >\n {say('common.clear')}\n </button>\n )}\n <RefBox box={box} tail={tail} edit={edit} onEdit={onEdit} onSubmit={submit} startOpen portal=\"body\" />\n </div>\n </form>\n );\n}\n","/** What myViews says, in the lists and grid room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n couldNotReadTheSaved: 'Could not read the saved views — nothing was changed: {message}',\n viewsCannotBeSaved: 'Views cannot be saved here.',\n});\n","/**\n * A reader's saved views of an App list: the tab, filters and sort they keep\n * coming back to, under a name.\n *\n * A view is the list's question as text (the visible question, plumbing\n * out), not a compiled filter, for the reasons the explorer's saved filters\n * give (views.js): it reads back in Advanced, and a view naming a dropped\n * column is a visible error rather than a silently empty list. Opening one\n * is navigating to its text, so its address is the ordinary list URL and a\n * link to it reproduces it anywhere.\n *\n * Kept by the server, in its saved-filters store (`/api/filters`), one list\n * per list view. Whose list it is, the server says (`store`): in an App\n * without sign-in one list the App shares, \"Saved views\"; in a signed-in App\n * each account's own, \"My views\", owned by the verified session and never by\n * anything this client sends; and none where rows are scoped by a policy or\n * a tenant, or for a visitor who is not signed in, who cannot save. The\n * cache is one Query per connection, cleared whenever the session identity\n * changes (applist.js), so one reader's views never paint for the next.\n */\nimport { useQuery, type QueryClient } from '@tanstack/react-query';\nimport { api, state } from '../core.js';\nimport { shell } from '../shellMode.js';\nimport { say } from '../copy/lists/components/myViews.js';\n\nexport interface SavedView {\n name: string;\n query: string;\n}\n/** Whose views a list keeps: the App's shared list, the account's own, or none to save into. */\ntype ViewStore = 'shared' | 'account' | 'none';\ninterface Saved {\n filters: Record<string, SavedView[]>;\n store: ViewStore;\n}\n\n/** The cache of a connection's saved views: the key the list reads and the warm-up fills. */\nexport const savedViewsKey = (): unknown[] => ['filters', state.activeConnection ?? ''];\n\nconst valid = (item: unknown): item is SavedView =>\n Boolean(item) && typeof (item as SavedView).name === 'string' && typeof (item as SavedView).query === 'string';\n\n/* Anything but the two stores the server names is no store: a reply that\n does not say whose list this is must not be offered a Save. A signed-out\n visitor (`auth.public`) is asked nothing: there is no account to keep views\n for, and the read's 401 would draw the sign-in screen over the browsing. */\nexport async function fetchSavedViews(): Promise<Saved> {\n if (shell().publicVisitor()) return { filters: {}, store: 'none' };\n const data = (await api('/api/filters')) as { filters?: Record<string, SavedView[]>; store?: unknown };\n const store = data.store === 'shared' || data.store === 'account' ? data.store : 'none';\n return { filters: data.filters ?? {}, store };\n}\n\nconst listOf = (saved: Saved | undefined, list: string): SavedView[] => {\n const views = saved?.filters[list];\n return Array.isArray(views) ? views.filter(valid) : [];\n};\n\n/** One list's views, and whose they are — undefined until known, and when the server will not say. */\nexport function useSavedViews(list: string): { views: SavedView[]; store: ViewStore | undefined } {\n const saved = useQuery({ queryKey: savedViewsKey(), queryFn: fetchSavedViews, staleTime: Infinity });\n return { views: listOf(saved.data, list), store: saved.data?.store };\n}\n\n/**\n * Change one list's views. The store is a whole list per list view, and a\n * write built on a stale cache silently deleted whatever another tab or\n * browser had saved since — so every write changes the server's *current*\n * list: a fresh read, the change, the whole list back. The cache is trusted\n * only after the server agreed; a failure is thrown, to be said out loud.\n */\nexport async function writeSavedViews(client: QueryClient, list: string, change: (views: SavedView[]) => SavedView[]): Promise<void> {\n let saved: Saved;\n try {\n saved = await fetchSavedViews();\n } catch (err) {\n throw new Error(say('couldNotReadTheSaved', { message: (err as Error).message }));\n }\n if (saved.store === 'none') throw new Error(say('viewsCannotBeSaved'));\n const views = change(listOf(saved, list));\n await api('/api/filters/save', { list, filters: views.length ? views : null });\n const filters = { ...saved.filters };\n if (views.length) filters[list] = views;\n else delete filters[list];\n client.setQueryData(savedViewsKey(), { ...saved, filters });\n}\n\n/** A question kept under a name. A repeated name replaces the older view:\n two called \"Mine\" that ask different things is worse than losing one. */\nexport const withView = (views: SavedView[], name: string, query: string): SavedView[] => [\n ...views.filter((v) => v.name !== name.trim()),\n { name: name.trim(), query },\n];\n\n/** A view renamed in its place; a name another view already has is taken over, by the same rule. */\nexport const renamedView = (views: SavedView[], from: string, to: string): SavedView[] =>\n views.filter((v) => v.name === from || v.name !== to.trim()).map((v) => (v.name === from ? { ...v, name: to.trim() } : v));\n\nexport const withoutView = (views: SavedView[], name: string): SavedView[] => views.filter((v) => v.name !== name);\n","/** What SortMenu says, in the lists and grid room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n xSort: 'x sort {sort}',\n sort: 'Sort',\n defaultOrder: 'Default order',\n});\n","/**\n * A list's Sort menu: the orders the view offers (`sorts`), by name —\n * \"Lowest price\", \"Newest\" — beside the filters. The order is the query's\n * own `sort` clause, so the address carries it, a reload keeps it and a\n * saved view remembers it; choosing one replaces the clause, and \"Default\n * order\" takes it off. A sort the reader typed that matches no choice\n * leaves the menu on none of them rather than pretending it is one.\n */\nimport { joinQuery, splitQuery } from '../clauses.js';\nimport { squeeze } from '../filterbar.js';\nimport { Dropdown } from './Dropdown.js';\nimport { say } from '../copy/lists/components/SortMenu.js';\n\ninterface SortChoice {\n label: string;\n sort: string;\n}\n\n/** Which choice the query is sorted by, or -1. */\nexport function sortChoice(sorts: readonly SortChoice[], query: string): number {\n const current = squeeze(String((splitQuery(query) as { sort?: string }).sort ?? '')).toLowerCase();\n if (!current) return -1;\n const said = (sort: string) =>\n squeeze(`sort ${sort}`)\n .replace(/\\s+asc\\b/gi, '')\n .replace(/\\s*,\\s*/g, ', ')\n .toLowerCase();\n return sorts.findIndex((choice) => said(choice.sort) === said(current.replace(/^sort\\s+/i, '')));\n}\n\n/** The query sorted by `sort`, or with no sort clause when there is none. */\nexport function withSort(query: string, sort: string | undefined): string {\n const parts = splitQuery(query) as { table: string; filter: string; show?: string; sort?: string; limit?: string };\n if (sort) parts.sort = `sort ${sort}`;\n else delete parts.sort;\n return joinQuery(parts);\n}\n\n/**\n * `sort` is the view's own order. Where one of the choices is it, that choice\n * is the default and is named: \"Default order\" beside \"Newest listings\" said\n * the same order twice, once in words a buyer does not use.\n */\nexport function SortMenu({\n sorts,\n query,\n onPick,\n sort,\n}: {\n sorts: readonly SortChoice[];\n query: string;\n onPick: (query: string) => void;\n sort?: string;\n}) {\n const at = sortChoice(sorts, query);\n const standing = sort ? sortChoice(sorts, say('xSort', { sort })) : -1;\n const unsorted = !(splitQuery(query) as { sort?: string }).sort;\n const items = sorts.map((choice, index) => ({ value: String(index), label: choice.label }));\n return (\n <div className=\"applist-sort\">\n <span className=\"applist-sort-label\" aria-hidden=\"true\">\n {say('sort')}\n </span>\n <Dropdown\n ariaLabel={say('sort')}\n value={at >= 0 ? String(at) : standing >= 0 && unsorted ? String(standing) : ''}\n items={standing >= 0 ? items : [{ value: '', label: say('defaultOrder') }, ...items]}\n onChange={(value: string) =>\n onPick(withSort(query, value === '' || Number(value) === standing ? undefined : sorts[Number(value)]?.sort))\n }\n />\n </div>\n );\n}\n","/**\n * The quick-add row, loaded the first time a list that offers one is drawn.\n *\n * QuickAdd is the New form in a list's frame, and the form brings its field\n * library with it: most lists offer no quick add, and none of them should\n * wait for that library to show their rows. The list imports QuickAdd from\n * here; the component and its props are QuickAdd.tsx's own.\n */\nimport { onDemand } from './onDemand.js';\n\nexport const QuickAdd = onDemand(() => import('./QuickAdd.js'), 'QuickAdd', { quiet: true });\n","/**\n * An app's list page: the table through the app's own words.\n *\n * This is the middle of the shape an app is made of — filters → lists →\n * detail pages — and it is deliberately the *real* table view underneath:\n * the vanilla grid with the explorer chrome off, drawn into a host, not a\n * lesser grid. Sorting, the header filter menus, the pager all still work;\n * what changes is the dressing: the app's heading, its filter tabs with live\n * counts, the reader's own views after them, and a filter bar in place of\n * the hidden query bar — a search, a picker per filter and the applied\n * filters said as chips in the same row (ListFilterBar.tsx) — or, where the\n * view says `filterBar: 'rail'`, a rail of facets beside the rows\n * (FilterRail.tsx), a sheet on a phone.\n *\n * The counts and the saved views are Queries: a tab's badge is a minute's\n * cache shared by every list on the connection, and a saved view\n * (myViews.ts) is written through a fresh read of the server's list — never\n * a stale cache — so what is shown is what the server agreed to. Each view is\n * the list's question as text, so opening one is the ordinary list address.\n */\nimport { filterLabel } from '@mistriwork/engine/shared/listFilters.js';\nimport { BoardNewForm } from './boardNew.js';\nimport { useMessageLanguage } from './useMessageLanguage.js';\nimport { createPortal } from 'react-dom';\nimport { listControlsRef, listHeadRef, useCrumbSlots } from './crumbSlot.js';\nimport { FavoriteStar } from './FavoriteStar.js';\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, type ReactNode } from 'react';\nimport { useMutation, useQueries, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { api, columnLabel, labelPath, pageSize, recordLabel, state as walk, toast } from '../core.js';\nimport { say } from '../copy/lists/components/AppList.js';\n\n/* The walk's state, with the field core.js's JSDoc does not declare. */\nconst state = walk as typeof walk & { activeConnection?: string | null };\nimport { mayRunAny } from '../actionGrants.js';\nimport { shell } from '../shellMode.js';\nimport { splitConditions, splitQuery } from '../clauses.js';\nimport { promptFor } from '../prompt.js';\nimport { canonicalize, conditionTail, deriveFilterNames, mentionsColumn, ownedTails, squeeze, withCondition } from '../filterbar.js';\nimport { exportOffered } from '@mistriwork/engine/shared/listPresentations.js';\nimport { humanName } from '@mistriwork/engine/shared/model.js';\nimport { pluralOf, recordNoun } from '@mistriwork/engine/shared/appNoun.js';\nimport type { ResourceHttpSuccess } from '@mistriwork/engine/shared/resourceHttp.js';\nimport { primaryKey, type TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport { findTable } from '../core.js';\nimport { sameReads } from '../liveReads.js';\nimport {\n appListQuery,\n litTabFor,\n residueOf,\n searchColumn,\n shownTabs,\n visibleQuestion,\n wholeQuery,\n type ListEntry,\n type ListSpec,\n subtitleColumns,\n editedReferences,\n listReferenceNames,\n} from './appListModel.js';\nimport { boxTail, boxesFor, type Box, type BoxEdit } from './FilterBoxes.js';\nimport { onDemand } from './onDemand.js';\n\nconst DefinedBoxes = onDemand(() => import('./DefinedFields.js'), 'DefinedBoxes', { quiet: true });\n\n/* A list's single `per` value (`category_id = 3`), which picks the fields a row-defined column's boxes are. */\nfunction oneValue(tail: string): string | undefined {\n const match = /^=\\s*(?:\"([^\"]*)\"|'([^']*)'|(\\S+))$/.exec(tail.trim());\n return match ? (match[1] ?? match[2] ?? match[3]) : undefined;\n}\nimport { useConditionWords } from './useConditionWords.js';\nimport { message } from '../messages.js';\nimport { useTabFold } from './useTabFold.js';\nimport { DropGroup, DropItem, DropMenu } from '@mistriwork/ui/DropMenu.js';\nimport { FilterRail, FilterSheet, type FacetUnit } from './FilterRail.js';\nimport { clearFacets, facetActive } from './filterRailModel.js';\nimport { FilterPicker, ListFilterBar } from './ListFilterBar.js';\nimport { AppColumnMenuContext, returnFocusTo, type AppColumnMenuHost } from './AppColumnMenu.js';\nimport { resourceOf } from './appRooms.js';\nimport { renamedView, useSavedViews, withView, withoutView, writeSavedViews, type SavedView } from './myViews.js';\nimport { PHONE_QUERY, RAIL_QUERY, useMediaQuery } from './useMediaQuery.js';\nimport { TableRoom } from './TableRoom.js';\nimport { RowOpensContext } from './rowOpens.js';\nimport { ListEmpty } from './ListEmpty.js';\nimport { Empty } from './Notes.js';\nimport { Button } from '@mistriwork/ui/Button.js';\nimport { SortMenu } from './SortMenu.js';\nimport { QuickAdd } from './QuickAddOnDemand.js';\nimport { defaultCurrency, formatLocale, formatNumber } from '../locale.js';\n\ninterface AppListProps {\n entry: ListEntry;\n spec: ListSpec;\n /** Where a new question goes: the walk, or an embedding page's own redraw. */\n navigate: (query: string) => void;\n /** Embedded in a page's chooser, the grid's own navigation is off. */\n embedded?: boolean;\n /** The app's New button, when the page offers one. */\n newButton?: ReactNode;\n /** In a dashboard's section that opted in (`interactive`): the list works — its search, its filters,\n its selection and the bulk actions its room offers — under the section's own heading, with no\n heading, saved views, quick add or rail of its own. */\n inDashboard?: boolean;\n /** Rows the list matched, once known, for a heading drawn outside the list (a dashboard section's count). */\n onTotal?: (total: number | undefined) => void;\n}\n\n/* What the next paint should hand focus back to. The redraw replaces the\n control the person just used and focus fell to <body> — twenty Tab stops\n from where they were — so the box or tab that spoke is remembered, and\n the next list puts focus back on its twin. */\nlet refocus: { column?: string; value?: string; tab?: string } | null = null;\n\ninterface Counted {\n total: number;\n capped: boolean;\n}\n\n/**\n * Every tab's badge, asked in one request (`/api/counts`) and counted in one\n * statement where the server can: a list with six tabs was six requests, each\n * running the whole list's read — joins, sort, a page of rows — to use its\n * count. Each is bounded as a list's total is (\"10,000+\"). A minute's cache,\n * shared by every list on the connection that shows the same tabs. A server\n * that refuses the batch is asked tab by tab, as before.\n */\nfunction useTabCounts(questions: string[]): Map<string, Counted | null> | undefined {\n const items = [...new Set(questions)].sort();\n const client = useQueryClient();\n return useQuery<Map<string, Counted | null>>({\n queryKey: ['count', state.activeConnection ?? '', 'tabs', items],\n /* While a new batch is on the way each badge says what it last said — a batch's answer, or the grid's total\n when its tab was on screen (gridCount) — so swapping tabs never empties the badges and shifts the row. */\n placeholderData: () => knownCounts(client),\n queryFn: async () => {\n const said = (data: { total?: unknown; cappedTotal?: unknown; errors?: unknown[] } | undefined): Counted | null =>\n data && !data.errors?.length && typeof data.total === 'number' ? { total: data.total, capped: data.cappedTotal === true } : null;\n try {\n const data = (await api('/api/counts', { items })) as {\n results?: Array<{\n total?: number;\n cappedTotal?: boolean;\n errors?: unknown[];\n }>;\n };\n if (!Array.isArray(data.results) || data.results.length !== items.length) throw new Error(say('theCountsCameBack'));\n return sameReads(new Map(items.map((q, i) => [q, said(data.results![i])])), data);\n } catch {\n return new Map(\n await Promise.all(\n items.map(async (q): Promise<[string, Counted | null]> => {\n try {\n return [\n q,\n said(\n (await api('/api/run', { q, limit: 1 })) as {\n total?: number;\n cappedTotal?: boolean;\n errors?: unknown[];\n },\n ),\n ];\n } catch {\n return [q, null];\n }\n }),\n ),\n );\n }\n },\n enabled: items.length > 0,\n staleTime: 60_000,\n }).data;\n}\n\n/* The last placeholder handed out, handed out again while it says the same. Query asks for a placeholder on\n every render of a batch not yet answered — and of one never asked, a list with no tabs — and a fresh Map each\n time is a new result: the list rendered again, which asked again, every frame for as long as it stood. Each\n render woke the navigation hold, which then held every list to its 1.5 s cap (navigationHold.ts). */\nlet lastKnown: Map<string, Counted | null> | undefined;\nconst sameCount = (a: Counted | null | undefined, b: Counted | null | undefined) =>\n a === b || (a != null && b != null && a.total === b.total && a.capped === b.capped);\n\n/** Every count this connection's badges have been told, newest last: the placeholder for a batch on the way. */\nfunction knownCounts(client: ReturnType<typeof useQueryClient>): Map<string, Counted | null> | undefined {\n const known = new Map<string, Counted | null>();\n for (const [, data] of client.getQueriesData<Map<string, Counted | null>>({ queryKey: ['count', state.activeConnection ?? ''] }))\n if (data instanceof Map) for (const [question, counted] of data) known.set(question, counted);\n if (!known.size) return undefined;\n const last = lastKnown;\n if (\n last &&\n last.size === known.size &&\n [...known].every(([question, counted]) => last.has(question) && sameCount(last.get(question), counted))\n )\n return last;\n lastKnown = known;\n return known;\n}\n\n/** A tab's badge: its count from the batch, or the grid's own total when the tab is the one on screen. */\nfunction TabCount({ counted }: { counted?: Counted | null }) {\n // null is a current result with no count, not permission to show an older one.\n const said = counted == null ? '' : `${formatNumber(counted.total)}${counted.capped ? '+' : ''}`;\n /* The number in a box of its own, over the room a tab keeps for it (features.css). */\n return <span className=\"tab-count\">{said && <span>{said}</span>}</span>;\n}\n\nexport function AppList({ entry, spec, navigate, embedded = false, newButton, inDashboard = false, onTotal }: AppListProps) {\n useMessageLanguage();\n const caption = spec.label;\n const client = useQueryClient();\n const table = findTable(entry.table) as TableMeta | undefined;\n const tabs = shownTabs(spec);\n const refinement = visibleQuestion(spec, entry.query);\n // The name column's box, where one can be drawn (appListModel.ts).\n const naming = searchColumn(table);\n const declared = [...new Set([...(naming ? [naming] : []), ...(spec.filters ?? (table ? deriveFilterNames(table) : []))])];\n /* A row-defined column among the filters is its fields' boxes, once its definitions are read (DefinedFields.tsx). */\n const bound = table ? resourceOf(shell().app(), table.id)?.defined : undefined;\n const boundNames = bound ? declared.filter((name) => Object.hasOwn(bound, name)) : [];\n const [definedBoxes, setDefinedBoxes] = useState<Record<string, Box[]>>({});\n const onDefinedBoxes = useCallback((column: string, next: Box[]) => setDefinedBoxes((previous) => ({ ...previous, [column]: next })), []);\n const names = declared.flatMap((name) => (boundNames.includes(name) ? (definedBoxes[name] ?? []).map((box) => box.column) : [name]));\n /* The resource's caption, through the label source every surface reads (appLabels.ts). */\n const captionOf = (name: string) => columnLabel(spec.table, name) ?? humanName(name);\n const near = [...declared, ...(table?.columns.map((column) => column.name) ?? [])];\n const labelOf = (name: string) => filterLabel(name, captionOf, near);\n const form = useRef<HTMLFormElement>(null);\n const filter = useRef<HTMLInputElement>(null);\n const head = useRef<HTMLDivElement>(null);\n const crumbs = useCrumbSlots();\n const ownList = !embedded && !inDashboard;\n /* The page's own list names itself in the crumb bar where one is drawn over it; where none is (a room reached\n from the menu, `shell.breadcrumbs`), in its own heading row, whose end holds the same verbs. Either way its\n New and Export stand together at the end of the row with its title, and its range is said in the pager. */\n const inBar = ownList && Boolean(crumbs.note && crumbs.tools);\n const inCrumbs = inBar || (ownList && Boolean(crumbs.head));\n const [gridResult, setGridResult] = useState<{\n query: string;\n connection: string | null | undefined;\n total: number | null;\n capped: boolean;\n }>();\n const connection = state.activeConnection;\n const gridCurrent = gridResult?.query === entry.query && gridResult.connection === connection ? gridResult : undefined;\n const gridTotal = gridCurrent?.total;\n const gridCapped = gridCurrent?.capped === true;\n const [advancedOpen, setAdvanced] = useState(false);\n const rail = useRef<HTMLElement>(null);\n const phone = useMediaQuery(PHONE_QUERY);\n /* The rail needs more room than a phone query describes: see RAIL_QUERY. */\n const railNarrow = useMediaQuery(RAIL_QUERY);\n /* An embedded list is a page's chooser, too narrow for a rail: it keeps the bar. */\n const railed = spec.filterBar === 'rail' && !embedded && !inDashboard;\n const [sheet, setSheet] = useState(false);\n\n /* What the person set by hand, box by box, since this question was\n drawn. Only a touched box speaks on submit — in the bar, that is the\n search box; every picker applies itself. */\n const boxes = useMemo(\n () =>\n table\n ? declared\n .flatMap((name) => (boundNames.includes(name) ? (definedBoxes[name] ?? []) : boxesFor(table, [name], labelOf)))\n .map((box) => (box.kind === 'text' && spec.suggest?.[box.column] ? { ...box, suggest: spec.suggest[box.column] } : box))\n : [],\n [table, names.join(','), spec, definedBoxes], // eslint-disable-line react-hooks/exhaustive-deps\n );\n const [edits, setEdits] = useState<Record<string, BoxEdit>>({});\n const editsNow = useRef(edits);\n editsNow.current = edits;\n const touched = (column: string) => column in editsNow.current;\n const tailOf = (box: (typeof boxes)[number]) =>\n boxTail(box, editsNow.current[box.column], conditionTail(refinement, box.column) as string);\n const litTab = litTabFor(tabs, refinement, names);\n /* The name column's box is the bar's search; every other box is a picker. */\n const searchBox = boxes.find((box) => box.column === naming && box.kind === 'text');\n\n /* The saved views of this list, by the view's key: two views over one\n table are two lists with their own working sets. The server says whose\n they are — the App's shared list, or the signed-in account's own — or\n that this reader cannot save (a row policy, a tenant, signed out). */\n const viewKey = spec.id ?? `table:${entry.table}`;\n const saved = useSavedViews(viewKey);\n // A dashboard's list keeps the dashboard's question: views are the list room's to save.\n const yours = inDashboard ? [] : saved.views;\n const store = saved.store;\n const savable = !inDashboard && (store === 'shared' || store === 'account');\n const yourLit = yours.findIndex((f) => canonicalize(f.query) === canonicalize(refinement));\n /* The strip fits its row (useTabFold.ts): the list's tabs by their place, then the saved views' heading, then each\n saved view; what does not fit is under More, and the lit one never is. */\n const savedAt = tabs.length + 1;\n const { strip: tabStrip, folded } = useTabFold(\n tabs.length + (yours.length ? yours.length + 1 : 0),\n yourLit === -1 ? litTab : savedAt + yourLit,\n );\n const foldMark = (at: number) => ({\n 'data-fold': at,\n 'data-folded': folded.has(at) ? '' : undefined,\n 'aria-hidden': folded.has(at) || undefined,\n });\n const writeViews = useMutation({\n mutationFn: (change: (views: SavedView[]) => SavedView[]) => writeSavedViews(client, viewKey, change),\n onError: (err: Error) => toast(err.message, 'error'),\n });\n\n /* Every control funnels here: one composition, one navigation. A control\n that knows where the focus belongs next — a picker in a popover, a chip's\n way out — says which column's control takes it. */\n const apply = (typed: string, focus?: string) => {\n const active = document.activeElement as HTMLElement | null;\n const boxHome = active?.closest?.('[data-column]') as HTMLElement | null;\n refocus = focus\n ? { column: focus }\n : boxHome\n ? { column: boxHome.dataset.column, value: active?.dataset?.value }\n : active?.getAttribute?.('role') === 'tab'\n ? { tab: active.textContent ?? '' }\n : null;\n state.page = 0;\n navigate(wholeQuery(spec, typed));\n };\n\n const currentText = () => filter.current?.value ?? refinement;\n\n /* Everything applied, as chips — each condition with its own way out, and\n the leftover clauses (a sort, a hand-written group) as one chip\n when no tab explains them. The bar says them in its own row\n (ListFilterBar.tsx); a list without one says them here. */\n const residue = litTab === -1 ? residueOf(refinement, names) : '';\n /* Said in the App's words — the column's label, the rule's word for a\n value — never the language the controls wrote (conditionWords.ts). */\n const { speaker, andWords, sayCondition, sayFilter, sayQuestion, sayTails } = useConditionWords(table, [\n refinement,\n ...yours.map((view) => view.query),\n ]);\n const residueChip = residue\n ? {\n text: andWords(sayQuestion(speaker, residue)),\n remove: () => {\n let text = '';\n for (const box of boxes) text = withCondition(text, box.column, tailOf(box));\n apply(text);\n },\n }\n : undefined;\n const chips: Array<{ text: string; remove: () => void }> = [];\n for (const box of boxes) {\n const tails = ownedTails(refinement, box.column);\n if (!tails.length) continue;\n // The lit tab already says its own conditions; a chip would repeat it.\n if (litTab >= 0 && mentionsColumn(tabs[litTab].query ?? '', box.column)) continue;\n chips.push({\n text: sayTails(speaker, box.column, tails),\n remove: () => apply(withCondition(currentText(), box.column, '')),\n });\n }\n if (residueChip) chips.push(residueChip);\n\n const chipList = chips.map((c) => (\n <span key={c.text} className=\"applist-chip\">\n <span className=\"applist-chip-text\">{c.text}</span>\n <button type=\"button\" className=\"applist-chip-x\" aria-label={say('common.remove2', { text: c.text })} onClick={c.remove}>\n ×\n </button>\n </span>\n ));\n\n const isDefault = canonicalize(entry.query) === canonicalize(appListQuery(spec, 0));\n const exactTab = litTab >= 0 && canonicalize(refinement) === canonicalize(tabs[litTab].query ?? '');\n const offerSave = savable && !(isDefault || exactTab || yourLit >= 0 || !refinement);\n const gridTab = tabs.findIndex((_, i) => squeeze(appListQuery(spec, i)) === squeeze(entry.query));\n /* The badges not already on screen: the grid's own total answers the tab\n it shows, so that one is never asked twice (and a list whose grid is\n still loading does not ask again once it lands). */\n const tabCounts = useTabCounts(\n tabs.length > 1 || yours.length > 0\n ? [\n ...tabs.flatMap((_, i) => (i === gridTab ? [] : [appListQuery(spec, i)])),\n ...yours.map((f) => squeeze(`${entry.table} ${f.query}`)),\n ]\n : [],\n );\n\n /* The grid's own total is a count its tab's badge said: kept with the batches, for the placeholder. */\n useEffect(() => {\n if (typeof gridTotal !== 'number' || gridTab < 0) return;\n const question = appListQuery(spec, gridTab);\n client.setQueryData(['count', connection ?? '', 'grid', question], new Map([[question, { total: gridTotal, capped: gridCapped }]]));\n }, [gridTotal, gridCapped, gridTab, connection]); // eslint-disable-line react-hooks/exhaustive-deps\n\n /* A tab's count: the grid's own total for the tab it shows, else the counts read for the strip. While the grid of\n the tab just chosen is on its way, its badge says what it last said, as every other badge does while its batch\n is: the strip's batch leaves that tab out, and once it was answered the badge stood empty until the rows came.\n An emptied badge is a narrower tab, and a strip at the edge of its fold took its last tab out of More for those\n few frames and put it back, on every visit to the list and every switch to a tab (a service-desk App's Inbox\n flickered at a desk); where nothing folds, the search box beside the strip jumped instead. */\n const countOf = (i: number) => {\n const question = appListQuery(spec, i);\n if (i !== gridTab) return tabCounts?.get(question);\n if (typeof gridTotal === 'number') return { total: gridTotal, capped: gridCapped };\n if (gridCurrent) return null;\n return tabCounts?.has(question) ? tabCounts.get(question) : knownCounts(client)?.get(question);\n };\n const pickTab = (i: number) => {\n if (i === litTab) return;\n state.page = 0;\n /* Swapping tabs swaps the tab's clause and keeps the boxes: the reader\n who narrowed to one customer and flips from Open to Done is asking\n about the same customer. Only what the person set by hand travels;\n and the tab wins over a box for its own columns. */\n let text = tabs[i].query ?? '';\n for (const box of boxes) {\n if (!touched(box.column)) continue;\n if (mentionsColumn(text, box.column)) continue;\n text = withCondition(text, box.column, tailOf(box));\n }\n apply(text);\n };\n\n const submit = (e: React.FormEvent) => {\n e.preventDefault();\n /* Touched boxes fold into the text on the way out; untouched ones stay\n silent — the text already says what they would. */\n let text = currentText();\n for (const box of boxes) {\n if (touched(box.column)) text = withCondition(text, box.column, tailOf(box));\n }\n apply(text);\n };\n\n /* A view is the question on screen — tab, filters and sort — as text. */\n /* A view's name starts as what it asks, in the reader's words: \"Status is Open and Owner is me\". */\n const viewWords = (query: string) => {\n const conditions = sayFilter(speaker, splitQuery(`rows ${query}`).filter);\n return andWords(conditions.length ? conditions : sayQuestion(speaker, query));\n };\n const save = async () => {\n const name = await promptFor({\n title: say('saveThisView'),\n label: say('common.name'),\n value: viewWords(refinement),\n placeholder: say('mineDueThisWeek'),\n });\n if (!name || !String(name).trim()) return;\n writeViews.mutate((views) => withView(views, String(name), refinement));\n };\n const rename = async (view: SavedView) => {\n const name = await promptFor({\n title: say('renameThisView'),\n label: say('common.name'),\n value: view.name,\n hint: viewWords(view.query),\n confirmLabel: say('common.rename'),\n });\n if (!name || !String(name).trim()) return;\n writeViews.mutate((views) => renamedView(views, view.name, String(name)));\n };\n\n /* The paint that replaced the one this person was using: put focus back\n on the twin of the control they used — in a rail, the very value. */\n useEffect(() => {\n if (!refocus) return;\n const root = form.current?.parentElement;\n if (refocus.column) {\n const at = `[data-column=\"${CSS.escape(refocus.column)}\"]`;\n const exact = refocus.value ? `${at} input[data-value=\"${CSS.escape(refocus.value)}\"]` : '';\n for (const home of [rail.current, root]) {\n const twin = (exact && home?.querySelector(exact)) || home?.querySelector(`${at} input, ${at} button`);\n if (twin) {\n (twin as HTMLElement).focus();\n break;\n }\n }\n } else if (refocus.tab && root) {\n for (const t of root.querySelectorAll('[role=\"tab\"]')) {\n if ((t.textContent ?? '') === refocus.tab) {\n (t as HTMLElement).focus();\n break;\n }\n }\n }\n refocus = null;\n }, []);\n\n /* The grid: rows only — an entry can carry a workbench tab (diagram,\n definition) across the mode flip, and the diagram under the app's\n filter boxes was a surface those controls cannot filter. The keys the\n app did not choose to show ride along hidden. */\n const chosen = new Set(spec.show ?? []);\n /* A reference is drawn by its record's name, read beside it (appListModel's referenceNames). */\n const referenceLabels = useMemo(() => listReferenceNames(spec), [spec]);\n const named = Object.values(referenceLabels).filter((name) => !chosen.has(name));\n const hide =\n chosen.size && table\n ? [\n ...new Set([\n ...primaryKey(table),\n ...(recordLabel(table) && labelPath(table) ? [labelPath(table)!] : []),\n ...(spec.order ? [spec.order] : []),\n ...subtitleColumns(entry.table, [...chosen]),\n ...editedReferences(spec),\n ...(spec.opens ? [spec.opens] : []),\n ...named,\n ]),\n ].filter((name) => !chosen.has(name))\n : named;\n /* A join table's list opens what each row is about, by its name where the list shows it. */\n const rowOpens = useMemo(\n () =>\n spec.opens\n ? {\n column: spec.opens,\n label:\n referenceLabels[spec.opens] ??\n spec.show?.find((name) => name.startsWith(`${spec.opens}.`) && !name.slice(spec.opens!.length + 1).includes('.')),\n }\n : null,\n [spec.opens, spec.show, referenceLabels],\n );\n const gridEntry = useMemo(() => ({ kind: 'table' as const, table: entry.table, query: entry.query }), [entry.table, entry.query]);\n /* Totals are over everything the conditions match, not the page: one\n measure per column, asked in the list's own query family so a write\n that refreshes the rows refreshes the sums too. */\n // The conditions alone: a sort, a column list or a limit is the page's, not the sum's.\n const totalText = (column: string) => [entry.table, splitQuery(entry.query).filter, `sum ${column}`].filter(Boolean).join(' ');\n const totalAnswers = useQueries({\n queries: (spec.presentation ? [] : (spec.totals ?? [])).map((column) => ({\n queryKey: ['run', connection ?? '', 'total', totalText(column)],\n queryFn: async () => {\n const data = (await api('/api/breakdown', {\n text: totalText(column),\n limit: 1,\n })) as { rows?: Array<Record<string, unknown>> };\n const row = data.rows?.[0];\n return row ? row[Object.keys(row)[0]] : null;\n },\n })),\n });\n const totals =\n spec.totals?.length && !spec.presentation\n ? Object.fromEntries(spec.totals.map((column, i) => [column, totalAnswers[i]?.data]))\n : undefined;\n const onGrid = (result: ResourceHttpSuccess<'/api/run'>) => {\n setGridResult({\n query: entry.query,\n connection,\n total: typeof result.total === 'number' ? result.total : null,\n capped: 'cappedTotal' in result && result.cappedTotal === true,\n });\n onTotal?.(typeof result.total === 'number' ? result.total : undefined);\n /* \"Fix the query above\" must not point at a control the redraw hid. */\n if (result.errors?.length) setAdvanced(true);\n };\n\n // A failed query can still expose its recovery editor; ordinary browsing is opt-in.\n const showAdvanced = advancedOpen || (spec.advancedFilters === true && !boxes.length);\n const tabQuery = litTab >= 0 ? (tabs[litTab].query ?? '') : '';\n /* A range's figures in the App's own dress: the resource's currency before them (the App's\n `ui.currency` when the rule names none, as every other money figure), its unit after. */\n const display =\n (\n resourceOf(shell().app(), entry.table) as\n | {\n display?: Record<string, { format?: string; currency?: string; unit?: string }>;\n }\n | undefined\n )?.display ?? {};\n const unitOf = (column: string): FacetUnit | undefined => {\n const rule = display[column];\n if (rule?.format === 'money')\n return {\n currency: rule.currency ?? defaultCurrency(),\n ...(rule.unit ? { unit: rule.unit } : {}),\n };\n return rule?.unit ? { unit: rule.unit } : undefined;\n };\n /* The view's own `query` is its standing condition: hidden from the reader's question, but every facet count stands on it. */\n const railProps = table ? { table, boxes, refinement, tabQuery, standing: spec.query ?? '', unitOf } : undefined;\n /* Beside the rows, the chips head the results — where the eye is on the\n rows, with the Sort and one Clear all — not under the heading, a column\n away from the facets that set them. The phone's sheet keeps them above. */\n const beside = railed && !railNarrow && Boolean(railProps);\n /* The rail stays beside the rows as they scroll while it fits the room; taller, it scrolls with them (`data-long`,\n FilterRail.css), so the room is the one box that scrolls. A rail held to the window's height and scrolling on its\n own was a second scroller in every room it was taller than: 900px under a 50px bar, so the room scrolled for it\n too (grade's double-scroll on Compass's tasks). */\n useLayoutEffect(() => {\n const box = rail.current;\n const room = box?.closest<HTMLElement>('.content');\n if (!box || !room) return;\n /* Its own top (Lumen stands it 12px down) is room it does not have. */\n const fit = () => box.toggleAttribute('data-long', box.offsetHeight + (parseFloat(getComputedStyle(box).top) || 0) > room.clientHeight);\n fit();\n if (typeof ResizeObserver === 'undefined') return;\n const watch = new ResizeObserver(fit);\n watch.observe(box);\n watch.observe(room);\n return () => watch.disconnect();\n }, [beside]);\n /* The bar says what is applied in its own row, where it was set. */\n const chipsInBar = spec.filterBar !== 'none' && !railed && Boolean(table);\n const narrowed = boxes.filter((box) => facetActive(refinement, box.column, tabQuery)).length;\n /* What the grid's column menus write through (AppColumnMenu.tsx): read when\n a menu is used, so the grid is not redrawn each time it changes. */\n const menuHost = useRef<AppColumnMenuHost | null>(null);\n menuHost.current = table\n ? {\n table,\n query: entry.query,\n refinement,\n tabQuery,\n standing: spec.query ?? '',\n listKey: viewKey,\n unitOf,\n Picker: FilterPicker,\n boxFor: (column) =>\n boxes.find((box) => box.column === column && box.meta) ?? boxesFor(table, [column], labelOf).find((box) => box.meta),\n apply: (text, column) => {\n refocus = null;\n returnFocusTo(column);\n state.page = 0;\n navigate(wholeQuery(spec, text));\n },\n navigate: (query, column) => {\n refocus = null;\n returnFocusTo(column);\n state.page = 0;\n navigate(query);\n },\n /* Beside the rows the rail already shows the column's control: the menu goes there rather than drawing a second one. */\n railFacet: (column) =>\n beside ? (rail.current?.querySelector<HTMLElement>(`.facet[data-column=\"${CSS.escape(column)}\"]`) ?? null) : null,\n }\n : null;\n const matched =\n typeof gridTotal === 'number'\n ? say('match', {\n gridTotal: new Intl.NumberFormat(formatLocale()).format(gridTotal),\n })\n : undefined;\n\n /* Narrowed past the tab — a search, a filter — to nothing: said as that,\n with the way back beside it. \"No rows match.\" alone left the reader to\n find each chip's × (or the rail's Clear all) to see the list again.\n Clear keeps the tab and the order and drops the rest. */\n const refinedFilter = splitQuery(`rows ${refinement}`) as {\n filter: string;\n sort?: string;\n };\n /* The tab the conditions stand under, read without the order: a sort from\n the Sort menu lights no tab, and Clear must not drop the tab with it. */\n /* Each tab read without its order too: a tab carries its sort (`on_notice sort available_on`), and held against a\n filter with the order taken out it lit no tab, so a tab with no rows was said as a search that matched nothing,\n its own condition named as what narrowed it, with a Clear that left the tab. */\n const tabFilters = tabs.map((tab) => ({ ...tab, query: splitQuery(`rows ${tab.query ?? ''}`).filter }));\n const filterTab = litTabFor(tabFilters, refinedFilter.filter, names);\n const filterTabQuery = filterTab >= 0 ? (tabFilters[filterTab].query ?? '') : '';\n const narrowedPast =\n Boolean(refinedFilter.filter.trim()) &&\n canonicalize(refinedFilter.filter) !== canonicalize(splitQuery(`rows ${filterTabQuery}`).filter);\n const clearTo = [filterTabQuery, refinedFilter.sort].filter(Boolean).join(' ');\n const applyNow = useRef(apply);\n applyNow.current = apply;\n /* Kept while its words and target are unchanged, so the rows below (kept by\n `grid`) are not redrawn for a keystroke. */\n /* What narrowed it, said as the chips say it: the conditions past the tab's own. */\n const tabConditions = new Set(splitConditions(splitQuery(`rows ${filterTabQuery}`).filter).map((c: string) => canonicalize(c)));\n const pastTab = splitConditions(refinedFilter.filter).filter((c: string) => !tabConditions.has(canonicalize(c)));\n /* Said by the records' own noun where the resource names one (\"No homes match\"), not the list's caption, which may\n name a ledger (\"No rent roll match\"). */\n const listNoun = table ? resourceOf(shell().app(), entry.table)?.noun : undefined;\n const things = listNoun?.many ?? caption.toLowerCase();\n const narrowedBy = pastTab.length ? andWords(pastTab.map((c: string) => sayCondition(speaker, c))) : '';\n const noMatchText = narrowedBy\n ? message('filter.noMatches', { things, conditions: narrowedBy })\n : message('filter.noMatchesPlain', { things });\n const noMatches = useMemo(\n () => (\n <Empty\n className=\"list-empty list-no-matches\"\n text={<span className=\"empty-note-title\">{say('noMatches')}</span>}\n detail={noMatchText}\n action={\n <Button size=\"compact\" onClick={() => applyNow.current(clearTo)}>\n {say('common.clear')}\n </Button>\n }\n />\n ),\n [noMatchText, clearTo],\n );\n\n /* The page's own list names itself in the crumb bar — title, count, star —\n with New at the bar's end, instead of a heading band of its own. An\n embedded list, or a list with no bar over it, keeps the heading row. */\n /* The rows, kept as one element for as long as what they are drawn from is\n unchanged. The search box is this room's state, so each character typed\n redrew the room and, with it, the whole grid under the box; now a\n keystroke redraws the box and the chips, and the rows are left alone. */\n const hideKey = hide.join('\\n');\n const keptHide = useMemo(() => hide, [hideKey]); // eslint-disable-line react-hooks/exhaustive-deps\n const totalsKey = totals ? JSON.stringify(totals) : '';\n const keptTotals = useMemo(() => totals, [totalsKey]); // eslint-disable-line react-hooks/exhaustive-deps\n const onGridNow = useRef(onGrid);\n onGridNow.current = onGrid;\n const keptOnGrid = useCallback((result: ResourceHttpSuccess<'/api/run'>) => onGridNow.current(result), []);\n const unrefined = !splitQuery(`rows ${refinement}`).filter.trim();\n /* The words an empty tab says when nothing narrows it past its own condition: the tab's own, else on the first\n tab (where the list opens) the list's, so a list whose first tab is \"Open\" no longer said its authored empty\n only after the reader took the tab away. Other tabs fall back to \"No {things} in {tab}\". */\n const tabOwnEmpty = filterTab >= 0 ? tabs[filterTab].empty : undefined;\n const authoredEmpty = embedded || narrowedPast ? undefined : (tabOwnEmpty ?? (unrefined || filterTab === 0 ? spec.empty : undefined));\n /* A list that says nothing of its own empty state says what belongs in it, by its noun, and offers New where the\n room does: \"No work orders yet. Use New to add the first work order.\" A narrowed list keeps its own words. */\n const noun = resourceOf(shell().app(), entry.table)?.noun;\n const nothingYet =\n !embedded && !spec.empty && unrefined && table ? (\n <ListEmpty\n spec={{\n title: message('common.noYet', { things: noun?.many ?? pluralOf(recordNoun(noun, table.name)) }),\n ...(newButton && !inDashboard ? { description: say('addTheFirst', { thing: recordNoun(noun, table.name) }) } : {}),\n }}\n />\n ) : undefined;\n /* A tab with nothing under it is not a search that missed: it says the tab is empty, by the records' noun and the\n tab's own word, with nothing to clear. Left to the grid, it said nothing at all. */\n const tabEmpty =\n !embedded && !unrefined && !narrowedPast && filterTab >= 0 && table ? (\n <Empty\n className=\"list-empty\"\n text={say('noneInTab', { things: noun?.many ?? pluralOf(recordNoun(noun, table.name)), tab: tabs[filterTab].label ?? '' })}\n />\n ) : undefined;\n const exportOff = !exportOffered(shell().app(), entry.table);\n /* A board's lanes offer New where the room does (BoardList): a boolean, so the room's fresh button each render does\n not redraw the rows. */\n const offersNew = Boolean(newButton) && !embedded && !inDashboard;\n const gridPage = state.page,\n gridSize = pageSize();\n const grid = useMemo(\n () => (\n <div className={`applist-grid${embedded ? '' : ' applist-room'}`}>\n {spec.quickAdd && table && !embedded && !inDashboard && (\n <div className=\"grid-inset\">\n <QuickAdd\n table={table}\n form={spec.form}\n onAdded={() => {\n void client.invalidateQueries({\n queryKey: ['run', connection ?? ''],\n });\n void client.invalidateQueries({\n queryKey: ['count', connection ?? ''],\n });\n }}\n />\n </div>\n )}\n <BoardNewForm.Provider value={offersNew ? (spec.form ?? {}) : null}>\n <RowOpensContext.Provider value={rowOpens}>\n <TableRoom\n entry={gridEntry}\n sizing={spec.sizing}\n chrome={false}\n summaries\n inset={!inDashboard}\n embedded={inDashboard}\n hide={keptHide}\n referenceLabels={referenceLabels}\n totals={keptTotals}\n density={spec.density}\n /* A ⋯ with nothing a reader may run is a dead control and a reserved column; the App payload already says what they may run. */\n rowActions={Boolean(\n spec.rowActions && !spec.presentation && !embedded && mayRunAny(shell().app(), entry.table, spec.actions ?? []),\n )}\n editable={spec.presentation || embedded ? undefined : spec.editable}\n inCrumbs={inCrumbs}\n onResult={keptOnGrid}\n presentation={embedded ? undefined : spec.presentation}\n present={shell().present ?? undefined}\n empty={\n embedded ? undefined : narrowedPast ? (\n noMatches\n ) : authoredEmpty ? (\n <ListEmpty spec={authoredEmpty} />\n ) : (\n (nothingYet ?? tabEmpty)\n )\n }\n actions={embedded ? undefined : spec.actions}\n listLabel={caption}\n order={embedded ? undefined : spec.order}\n export={exportOff ? false : undefined}\n interactive={embedded ? false : undefined}\n />\n </RowOpensContext.Provider>\n </BoardNewForm.Provider>\n </div>\n ),\n [\n gridPage,\n gridSize,\n embedded,\n inDashboard,\n spec,\n table,\n client,\n connection,\n gridEntry,\n keptHide,\n referenceLabels,\n keptTotals,\n inCrumbs,\n keptOnGrid,\n authoredEmpty,\n narrowedPast,\n noMatches,\n filterTab,\n caption,\n exportOff,\n offersNew,\n rowOpens,\n ],\n );\n /* A signed-out visitor reads the storefront, not the tool (docs/design.md,\n public pages): a match count chip and a favourites star are an\n operator's furniture there. */\n const visitor = shell().publicVisitor();\n const title = (\n <>\n <h1 className={`applist-title${spec.heading === false ? ' visually-hidden' : ''}`}>{caption}</h1>\n {typeof gridTotal === 'number' && !visitor && spec.heading !== false && (\n <span className=\"applist-count\" title={say('rowsTheTabAndFilters')}>\n {formatNumber(gridTotal)}\n {gridCapped ? '+' : ''}\n </span>\n )}\n {spec.favorite && spec.id && !visitor && <FavoriteStar favorite={{ kind: 'view', view: spec.id, label: caption }} name={caption} />}\n </>\n );\n return (\n <>\n {boundNames.map((name) => (\n <DefinedBoxes\n key={name}\n column={name}\n binding={bound![name]}\n per={bound![name].per ? oneValue(conditionTail(refinement, bound![name].per!) as string) : undefined}\n onBoxes={onDefinedBoxes}\n />\n ))}\n {inBar && createPortal(title, crumbs.note!)}\n {inCrumbs && !spec.quickAdd && newButton && createPortal(newButton, (crumbs.tools ?? crumbs.head)!)}\n <div className={`applist-head${inBar ? ' in-crumbs' : ''}`}>\n {!inBar && !inDashboard && (\n <div className=\"applist-head-row\" ref={head}>\n {title}\n {ownList ? <div className=\"applist-head-tools\" ref={listHeadRef} /> : !spec.quickAdd && newButton}\n </div>\n )}\n {/* In the layout under a heading, chips or none: a row that appears with the\n first filter shoves everything down a line under a reader's eyes.\n Beside a title in the crumb bar the empty row folds away (features.css). */}\n {!beside && !chipsInBar && <div className=\"applist-chips\">{chipList}</div>}\n </div>\n <div className=\"applist-controls\" role=\"group\" aria-label={say('listControls', { caption })}>\n {(tabs.length > 1 || yours.length > 0) && (\n <div className=\"tabs folds\" ref={tabStrip}>\n <div className=\"tabs-row\" role=\"tablist\">\n {tabs.map((tab, i) => (\n <button\n key={tab.label}\n type=\"button\"\n role=\"tab\"\n className=\"tab\"\n aria-selected={i === litTab && yourLit === -1}\n onClick={() => pickTab(i)}\n {...foldMark(i)}\n >\n <span>{tab.label}</span>\n <TabCount counted={countOf(i)} />\n </button>\n ))}\n {yours.length > 0 && (\n <span className=\"tab-group\" {...foldMark(tabs.length)} aria-hidden=\"true\">\n {tabs.length > 1 && <span className=\"tab-divider\" />}\n <span className=\"tab-group-label\">{store === 'account' ? say('myViews') : say('savedViews')}</span>\n </span>\n )}\n {/* The × is a real button *beside* the tab, not a span inside it:\n interactive-inside-interactive is invalid ARIA. */}\n {yours.map((f, i) => (\n <span key={f.name} className=\"tab-wrap\" role=\"presentation\" {...foldMark(savedAt + i)}>\n <button\n type=\"button\"\n role=\"tab\"\n className=\"tab tab-yours\"\n aria-selected={i === yourLit}\n title={`${viewWords(f.query) || say('everything')} — ${store === 'account' ? say('yourView') : say('aSavedView')}`}\n onClick={() => {\n if (i !== yourLit) {\n state.page = 0;\n apply(f.query);\n }\n }}\n >\n <span>{f.name}</span>\n <TabCount counted={tabCounts?.get(squeeze(`${entry.table} ${f.query}`))} />\n </button>\n {savable && (\n <button\n type=\"button\"\n className=\"tab-x\"\n title={say('common.removeName', { name: f.name })}\n aria-label={say('removeTheView', { name: f.name })}\n onClick={() => writeViews.mutate((views) => withoutView(views, f.name))}\n >\n ×\n </button>\n )}\n </span>\n ))}\n </div>\n <div className=\"tab-more\" data-fold-more=\"\" data-folded={folded.size ? undefined : ''} aria-hidden={!folded.size || undefined}>\n <DropMenu\n className=\"tab-more-menu\"\n triggerClassName=\"tab\"\n label={message('common.more')}\n popupClassName=\"page-actions-popup\"\n align=\"end\"\n >\n {tabs.map((tab, i) =>\n folded.has(i) ? (\n <DropItem key={tab.label} className=\"page-actions-item\" onClick={() => pickTab(i)}>\n <span>{tab.label}</span>\n <TabCount counted={countOf(i)} />\n </DropItem>\n ) : null,\n )}\n {yours.some((_, i) => folded.has(savedAt + i)) && (\n <DropGroup labelClassName=\"more-group-label\" label={store === 'account' ? say('myViews') : say('savedViews')}>\n {yours.map((f, i) =>\n folded.has(savedAt + i) ? (\n <DropItem\n key={f.name}\n className=\"page-actions-item\"\n onClick={() => {\n state.page = 0;\n apply(f.query);\n }}\n >\n {f.name}\n </DropItem>\n ) : null,\n )}\n </DropGroup>\n )}\n </DropMenu>\n </div>\n </div>\n )}\n {spec.filterBar !== 'none' && (\n <form className=\"applist-filterbar\" ref={form} onSubmit={submit}>\n <div className=\"applist-fields\">\n {chipsInBar && table && (\n <ListFilterBar\n table={table}\n boxes={boxes}\n search={searchBox}\n refinement={refinement}\n tabQuery={tabQuery}\n standing={spec.query ?? ''}\n unitOf={unitOf}\n typed={searchBox ? edits[searchBox.column]?.raw : undefined}\n onType={(raw) => {\n if (!searchBox) return;\n /* Now, not on the next paint: the search field's own × asks in the same event. */\n editsNow.current = {\n ...editsNow.current,\n [searchBox.column]: { raw },\n };\n setEdits(editsNow.current);\n }}\n onSearch={() => form.current?.requestSubmit()}\n apply={apply}\n current={currentText}\n residue={residueChip}\n listLabel={caption}\n phone={phone}\n onSheet={() => setSheet(true)}\n />\n )}\n {/* Beside a rail the Sort heads the results with the chips instead. */}\n {spec.sorts?.length && !beside ? (\n <SortMenu\n sorts={spec.sorts}\n sort={spec.sort}\n query={entry.query}\n onPick={(query) => {\n walk.page = 0;\n navigate(query);\n }}\n />\n ) : null}\n {/* The view's own verbs — how to ask, keep and forget the question —\n together at the bar's end, not strewn between the filters. */}\n <div className=\"applist-actions\">\n {railed && railNarrow && railProps && boxes.length > 0 && (\n <button type=\"button\" className=\"applist-toggle\" aria-haspopup=\"dialog\" onClick={() => setSheet(true)}>\n {narrowed ? say('common.filters', { narrowed }) : say('common.filtersButton')}\n </button>\n )}\n {spec.advancedFilters === true && boxes.length > 0 && (\n <button\n type=\"button\"\n className=\"applist-toggle\"\n aria-expanded={showAdvanced}\n onClick={() => {\n setAdvanced(!showAdvanced);\n // Opening an inline editor must not scroll its toggle beneath\n // the sticky trail, leaving the same control impossible to close.\n if (!showAdvanced) setTimeout(() => filter.current?.focus({ preventScroll: true }), 0);\n }}\n >\n {say('advanced')}\n </button>\n )}\n {/* Saving and renaming never both apply: a question already kept is not offered again. */}\n {offerSave && (\n <button\n type=\"button\"\n className=\"applist-toggle\"\n title={store === 'account' ? say('keepThisTabIts') : say('keepThisTabItsFilters')}\n onClick={() => void save()}\n >\n {say('saveView')}\n </button>\n )}\n {savable && yourLit >= 0 && (\n <button type=\"button\" className=\"applist-toggle\" onClick={() => void rename(yours[yourLit])}>\n {say('renameView')}\n </button>\n )}\n </div>\n </div>\n <div className=\"applist-advanced\" hidden={!showAdvanced}>\n <input\n ref={filter}\n type=\"text\"\n className=\"applist-filter\"\n defaultValue={refinement}\n placeholder={naming ? say('contains', { naming }) : say('filterRecords')}\n aria-label={say('filter', { caption })}\n /* The form has no submit button and, beside the search box, two\n fields, so Enter submits by hand rather than by implicit submission. */\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.nativeEvent.isComposing) {\n e.preventDefault();\n form.current?.requestSubmit();\n }\n }}\n />\n </div>\n </form>\n )}\n {/* A phone's Records/Table switch, drawn here by the list (TableView): its own row over the rows cost a\n line of every list's first screen. */}\n {inCrumbs && <span className=\"applist-presentation\" ref={listControlsRef} />}\n </div>\n {beside && railProps ? (\n <div className=\"applist-body has-rail\">\n <aside className=\"filter-rail\" ref={rail} aria-label={say('captionFilters', { caption })}>\n <FilterRail {...railProps} clearAll={false} onChange={apply} status={matched} />\n </aside>\n <div className=\"applist-results\">\n <div className=\"applist-results-head\">\n <div className=\"applist-chips\" role=\"group\" aria-label={say('filtersApplied', { caption })}>\n {chipList}\n {narrowed > 0 && (\n <button\n type=\"button\"\n className=\"applist-chips-clear\"\n onClick={() =>\n apply(\n clearFacets(\n refinement,\n boxes.map((box) => box.column),\n tabQuery,\n ),\n )\n }\n >\n {say('list.clearAll')}\n </button>\n )}\n </div>\n {spec.sorts?.length ? (\n <SortMenu\n sorts={spec.sorts}\n sort={spec.sort}\n query={entry.query}\n onPick={(query) => {\n walk.page = 0;\n navigate(query);\n }}\n />\n ) : null}\n </div>\n <AppColumnMenuContext.Provider value={menuHost}>{grid}</AppColumnMenuContext.Provider>\n </div>\n </div>\n ) : (\n <AppColumnMenuContext.Provider value={menuHost}>{grid}</AppColumnMenuContext.Provider>\n )}\n {/* The phone's pickers: the rail's sheet — for a bar, every filter but the search it keeps in view. */}\n {sheet && railProps && (\n <FilterSheet\n {...railProps}\n boxes={railed ? boxes : boxes.filter((box) => box !== searchBox)}\n onClose={() => setSheet(false)}\n onApply={(text) => {\n setSheet(false);\n apply(text);\n }}\n />\n )}\n </>\n );\n}\n","/**\n * A dashboard's list that works as its room does (`embed(view, { interactive:\n * true })`): the view's own search and filters over the rows the section\n * shows, and, for a reader offered one, its selection with the bulk actions\n * its room offers — the same list component the room draws, so nothing here\n * is a second list. What the reader may do is the room's: the actions ride\n * the App as it was served to this reader, and every write is authorized on\n * the server as it is from the room.\n *\n * The section's question — the view's, its tab, the dashboard's window and\n * picks — is the list's standing condition here, never a chip to remove; the\n * reader's search and filters narrow within it, and the question is the\n * section's own state, so it moves nothing else on the dashboard and no\n * address. Loaded the first time a dashboard holds one (onDemand.tsx).\n */\nimport { useEffect, useMemo, useState } from 'react';\nimport { AppList } from './AppList.js';\nimport { appListQuery, type ListSpec } from './appListModel.js';\nimport type { Section } from './dashboardModel.js';\nimport { splitClauseTail } from '@mistriwork/engine/shared/query.js';\nimport './DashboardList.css';\n\nexport function InteractiveList({\n section,\n source,\n onTotal,\n}: {\n section: Section;\n /** The view's room, as the App was served to this reader. */\n source: ListSpec;\n onTotal: (total: number | undefined) => void;\n}) {\n const spec = useMemo<ListSpec>(() => {\n /* The section's conditions stand; its order (a tab's `sort ship_by`) is the list's default order, never a chip. */\n const { head, tail } = splitClauseTail(section.query ?? '');\n const order = /^(?:sort|order\\s+by)\\s+(.+)$/i.exec(tail)?.[1]?.trim();\n return {\n ...source,\n query: head || undefined,\n /* The section drew one tab; a split's list is its plain grid, as the room's list half is. */\n tabs: undefined,\n presentation: source.presentation?.kind === 'split' ? undefined : source.presentation,\n limit: section.limit ?? 5,\n ...((order ?? section.sort) ? { sort: order ?? section.sort } : {}),\n filterBar: source.filterBar === 'rail' ? 'bar' : source.filterBar,\n };\n }, [source, section.query, section.limit, section.sort]);\n const first = appListQuery(spec);\n const [query, setQuery] = useState(first);\n /* A new window or pick is a new question: the reader's narrowing starts over within it. */\n useEffect(() => setQuery(first), [first]);\n /* The rows are the list's own read, which a write through its actions refreshes as the room's does;\n the dashboard's refresh clock does not re-draw a list a reader may be selecting in. */\n const entry = useMemo(() => ({ table: spec.table, query, view: source.id }), [spec.table, query, source.id]);\n return <AppList entry={entry} spec={spec} navigate={setQuery} inDashboard onTotal={onTotal} />;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"shared-zG6e1Rhz.js","names":["say","say","say","state","say","say","_Fragment","Popover.Root","Popover.Trigger","Popover.Portal","Popover.Positioner","Popover.Popup","say","state","say","walk","say","_Fragment"],"sources":["../../../kit/src/client/components/boardNew.ts","../../../kit/src/client/copy/lists/components/AppList.ts","../../../kit/src/client/copy/filters/components/FilterRail.ts","../../../kit/src/client/components/FilterRail.tsx","../../../kit/src/client/copy/filters/components/ListFilterBar.ts","../../../kit/src/client/components/ListFilterBar.tsx","../../../kit/src/client/copy/lists/components/myViews.ts","../../../kit/src/client/components/myViews.ts","../../../kit/src/client/copy/lists/components/SortMenu.ts","../../../kit/src/client/components/SortMenu.tsx","../../../kit/src/client/components/QuickAddOnDemand.ts","../../../kit/src/client/components/AppList.tsx","../../../kit/src/client/components/DashboardList.tsx"],"sourcesContent":["/**\n * The New form a list offers, handed to its board so each lane's head can\n * offer a record in that lane. A context rather than a prop: the list (AppList)\n * and its board (BoardList) are four components apart, and only an App's own\n * list room provides one — an embedded or dashboard board offers no New.\n */\nimport { createContext } from 'react';\nimport type { FormSpec } from './NewRecordButton.js';\n\nexport const BoardNewForm = createContext<FormSpec | null>(null);\n","/** What AppList says, in the lists and grid room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n theCountsCameBack: 'The counts came back the wrong length.',\n saveThisView: 'Save this view',\n mineDueThisWeek: 'Mine, due this week',\n renameThisView: 'Rename this view',\n noMatches: 'No matches',\n noneInTab: 'No {things} in {tab} right now.',\n addTheFirst: 'Use New to add the first {thing}.',\n rowsTheTabAndFilters: 'Rows the tab and filters match',\n listControls: '{caption} list controls',\n myViews: 'My views',\n savedViews: 'Saved views',\n yourView: 'your view',\n aSavedView: 'a saved view',\n removeTheView: 'Remove the view \"{name}\"',\n advanced: 'Advanced',\n keepThisTabIts: 'Keep this tab, its filters and sort as a view of your own',\n keepThisTabItsFilters: 'Keep this tab, its filters and sort as a saved view of this list, for everyone who opens it',\n saveView: 'Save view…',\n renameView: 'Rename view…',\n contains: '{naming} contains \"...\"',\n filterRecords: 'Filter records',\n filter: 'Filter {caption}',\n filtersApplied: '{caption} filters applied',\n match: '{gridTotal} match',\n captionFilters: '{caption} filters',\n everything: 'Everything',\n});\n","/** What FilterRail says, in the filter rail room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n moreConditions: 'More conditions',\n moreConditionsOn: 'More conditions on {label}',\n text: 'Text',\n standsForAnyRun: '% stands for any run of characters, _ for exactly one.',\n couldNotCountTheValues: 'Could not count the values.',\n countsUnavailable: 'Counts unavailable.',\n showAll: 'Show all {listedCount}',\n from: 'From',\n to: 'To',\n min: 'Min',\n max: 'Max',\n contains: 'Contains…',\n equals: 'Equals…',\n showCount: 'Show {count}',\n});\n","/**\n * A list's filters as a rail of facets beside the rows — `filterBar: 'rail'`.\n *\n * The bar asks one value per column; a rail is for the list a reader works\n * through by narrowing, where the question is \"open or done, mine, due this\n * week\" and the answer is how many of each. So a vocabulary or a reference\n * is a checklist of its values with live counts, a flag a toggle, a date its\n * presets and a range. Any other column shows as what its values are: a\n * number with many values a Min/Max range, one with a few (a priority, a\n * model year) a checklist, text with a few dozen values a checklist and more\n * a contains box — judged once, over the rows the view stands on\n * (filterRailModel `autoShape`). The name column is the rail's search box; in a column's\n * own picker (the filter popover) it is judged like the rest, so a name with a few values\n * lists them with their counts.\n * Every facet writes a condition tail into the same question the bar's boxes\n * do (filterRailModel says how), so a selection is a URL, a chip and a\n * refinement of the tab like any other.\n *\n * Controlled: the rail reads `refinement` and hands a new one to `onChange`.\n * Beside the list that navigates at once; in the phone sheet it edits a\n * draft, applied by the sheet's own button, because each navigation redraws\n * the list the sheet is covering.\n */\nimport { Fragment, useEffect, useId, useRef, useState, type ReactNode } from 'react';\nimport { keepPreviousData, useQueries, useQuery } from '@tanstack/react-query';\nimport { api, columnDisplay, findTable, labelColumn, state } from '../core.js';\nimport { batchedBreakdown } from '../breakdownBatch.js';\nimport { defaultCurrency, formatLocale, formatNumber, formatTimezone } from '../locale.js';\nimport { DateField } from './DateField.js';\nimport { Button } from '@mistriwork/ui/Button.js';\nimport { Field } from '@mistriwork/ui/Field.js';\nimport { isPickerDate } from '@mistriwork/ui/internal/datePickerModel.js';\nimport { columnKind, type TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport { andQuery } from '@mistriwork/engine/shared/query.js';\nimport { vocabularyWord } from '@mistriwork/engine/shared/model.js';\nimport { dressFor, wordFor, type DisplayRule } from './valueModel.js';\nimport { minorToMajor } from '@mistriwork/engine/shared/money.js';\nimport { majorToMinor } from '@mistriwork/engine/shared/moneyEntry.js';\nimport { WHOLE, conditionTail, holdsCondition, squeeze, unquote, withCondition } from '../filterbar.js';\nimport { boxTail, type Box } from './FilterBoxes.js';\nimport { useArrived } from './onDemand.js';\nimport { SuggestBox } from './suggestPart.js';\nimport {\n CHECKLIST_MOST,\n MORE_LABELS,\n datePresets,\n autoShape,\n clearFacets,\n facetActive,\n facetCountText,\n facetKind,\n facetShapeText,\n hasCountText,\n hasValuesText,\n moreConditions,\n moreOf,\n moreTail,\n numberRangeOf,\n numberRangeTail,\n rangeOf,\n rangeTail,\n selectedTags,\n selectedValues,\n tagsTail,\n takesText,\n valuesTail,\n type AutoShape,\n type MoreCondition,\n} from './filterRailModel.js';\nimport { Modal } from '@mistriwork/ui/Modal.js';\nimport { useConditionWords } from './useConditionWords.js';\nimport { say } from '../copy/filters/components/FilterRail.js';\n\n/** A checklist shows this many values before \"Show all\": five keeps the\n next facet in sight (at eight, Make and Model pushed Price off the first\n screen). A list only one or two longer is shown whole: a \"Show all 6\"\n that reveals one value is a click that buys nothing. */\nconst SHORT = 5;\nconst SLACK = 2;\n/** And never asks for more than this many; a column with more is a search, not a list. */\nconst MOST = CHECKLIST_MOST;\n\n/* Through locale.ts's kept formatter: a rail says a count per value, and\n built afresh each was a formatter per count on every draw. */\nconst counted = (n: number) => formatNumber(n);\n\n/** How a range says its column's figures: a currency before them, a unit after. */\nexport interface FacetUnit {\n currency?: string;\n unit?: string;\n}\n\ninterface RailProps {\n table: TableMeta;\n boxes: Box[];\n /** The question the facets read, without the table name or the plumbing. */\n refinement: string;\n /** The lit tab's own query: its conditions are the tab's, so Clear all leaves them. */\n tabQuery?: string;\n /** The view's standing condition (`status != sold`): not the reader's to see or clear, but every count stands on it. */\n standing?: string;\n /** A column's currency or unit, said beside a range's boxes. */\n unitOf?: (column: string) => FacetUnit | undefined;\n /** Beside a list whose chips carry their own Clear all, the rail's would be a second one. */\n clearAll?: boolean;\n onChange: (refinement: string) => void;\n /** What the list matches now, said politely to a screen reader as it changes. */\n status?: string;\n}\n\nexport function FilterRail({\n table,\n boxes,\n refinement,\n tabQuery = '',\n standing = '',\n unitOf,\n clearAll = true,\n onChange,\n status,\n}: RailProps) {\n const columns = boxes.map((box) => box.column);\n const any = columns.some((column) => facetActive(refinement, column, tabQuery));\n const set = (column: string, tail: string) => onChange(withCondition(refinement, column, tail));\n return (\n <div className=\"filter-rail-body\">\n <div className=\"filter-rail-head\">\n <h2 className=\"filter-rail-title\">{say('common.filtersButton')}</h2>\n {clearAll && any && (\n <button type=\"button\" className=\"filter-rail-clear\" onClick={() => onChange(clearFacets(refinement, columns, tabQuery))}>\n {say('list.clearAll')}\n </button>\n )}\n </div>\n {boxes.map((box) => (\n <FacetFor\n key={box.column}\n box={box}\n table={table}\n refinement={refinement}\n standing={standing}\n unit={unitOf?.(box.column)}\n set={(next) => set(box.column, next)}\n />\n ))}\n <p className=\"visually-hidden\" role=\"status\">\n {status ?? ''}\n </p>\n </div>\n );\n}\n\n/**\n * One column's facet over a question: what the rail draws for each of its\n * columns, and what an App list's filter bar opens alone in a popover\n * (ListFilterBar.tsx). `set` hears the column's new tail; `onEnter`, where\n * given, hears Enter in a box once its value is set, so a popover applies\n * on the key a reader expects to apply rather than on a second one.\n */\nexport function FacetFor({\n box,\n table,\n refinement,\n standing = '',\n unit,\n set,\n onEnter,\n picking = false,\n}: {\n box: Box;\n table: TableMeta;\n refinement: string;\n standing?: string;\n unit?: FacetUnit;\n set: (tail: string) => void;\n onEnter?: () => void;\n /** A column's own picker (the filter popover): its name column is a column like another, not the rail's search box. */\n picking?: boolean;\n}) {\n const tail = squeeze(conditionTail(refinement, box.column));\n /* The rows that point at the record are asked by what they hold, and counted as the list's records. */\n if (box.has) {\n const props = { box, tail, table, refinement, standing, set, onEnter };\n return box.has.segment ? <HasSegmentFacet {...props} /> : <HasValuesFacet {...props} />;\n }\n const kind = facetKind(box.kind);\n /* The rarer conditions sit behind one quiet disclosure in every facet, so\n the rail and a column menu's Filter… say them alike. */\n const more = kind === 'tags' ? null : <MoreConditions box={box} tail={tail} set={set} onEnter={onEnter} facet={kind} />;\n const props = { box, tail, table, refinement, standing, set, onEnter, more };\n if (kind === 'values') return <ValuesFacet {...props} />;\n if (kind === 'tags') return <TagsFacet {...props} />;\n if (kind === 'flag') return <FlagFacet {...props} />;\n if (kind === 'date') return <DateFacet {...props} />;\n /* The name is what a reader searches by; a source that takes whole\n values only (an API) cannot be counted or ranged. Anything else\n shows as what its values are. Keyed by its tail, so a condition\n changed elsewhere redraws the box with it. */\n /* In the rail the name is the search box. In a column's own picker it is judged like any column: a\n name with a few dozen values (a make, a department) is offered as those values with their counts, a\n longer one as the contains box, and a contains already asked stays the box that asked it. */\n const asked = /^contains\\s/i.test(tail);\n if (box.exact || (box.column === labelColumn(table) && (!picking || asked))) return <TextFacet key={tail} {...props} />;\n return <AutoFacet {...props} unit={unit} bare={box.column === labelColumn(table)} />;\n}\n\ninterface FacetProps {\n box: Box;\n tail: string;\n table: TableMeta;\n refinement: string;\n standing: string;\n set: (tail: string) => void;\n onEnter?: () => void;\n more?: ReactNode;\n}\n\n/* A facet's name and its own way out. A group of inputs is a fieldset, so\n each checkbox or radio is announced with the facet it belongs to. */\nfunction Facet({\n box,\n tail,\n set,\n more,\n group = true,\n busy = false,\n children,\n}: Pick<FacetProps, 'box' | 'tail' | 'set' | 'more'> & { group?: boolean; busy?: boolean; children: ReactNode }) {\n const clear = tail ? (\n <button type=\"button\" className=\"facet-clear\" aria-label={say('common.clear2', { label: box.label })} onClick={() => set('')}>\n {say('common.clear')}\n </button>\n ) : null;\n if (!group)\n return (\n <div className=\"facet\" data-column={box.column}>\n {children}\n {clear}\n {more}\n </div>\n );\n return (\n <fieldset className=\"facet\" data-column={box.column} aria-busy={busy || undefined}>\n <legend className=\"facet-label\">{box.label}</legend>\n {clear}\n {children}\n {more}\n </fieldset>\n );\n}\n\n/* A condition this facet has no control for — `!= open`, `= false`, typed\n in Advanced — is said rather than drawn as nothing, and kept until the\n reader picks. */\nfunction Unshown({ box, table, tail }: { box: Box; table: TableMeta; tail: string }) {\n // In the App's words, \"Status is not Open\"; the Workbench has no rail.\n const { speaker, sayTails } = useConditionWords(table, [`${box.column} ${tail}`]);\n return moreOf(tail) ? null : <p className=\"facet-note\">{sayTails(speaker, box.column, [tail])}</p>;\n}\n\n/**\n * The conditions a facet has no everyday control for — starts with, a\n * pattern, empty, not empty — behind one quiet disclosure, open while one of\n * them is what the column asks. A choice that needs no text applies as it is\n * picked; one that takes text applies on Enter or leaving the box, as a\n * range does.\n */\nfunction MoreConditions({\n box,\n tail,\n set,\n onEnter,\n facet,\n}: Pick<FacetProps, 'box' | 'tail' | 'set' | 'onEnter'> & { facet: Exclude<ReturnType<typeof facetKind>, 'tags'> }) {\n const id = useId();\n const said = moreOf(tail);\n const [open, setOpen] = useState(Boolean(said));\n const [picked, setPicked] = useState<MoreCondition | null>(said?.condition ?? null);\n const [text, setText] = useState(said?.text ?? '');\n const box$ = useRef<HTMLInputElement>(null);\n const focusText = useRef(false);\n useEffect(() => {\n setPicked(said?.condition ?? null);\n setText(said?.text ?? '');\n if (said) setOpen(true);\n }, [tail]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => {\n if (!focusText.current) return;\n focusText.current = false;\n box$.current?.focus();\n });\n const offered = moreConditions(facet, box.meta, box.exact);\n /* A condition typed elsewhere is shown here even where it would not be offered. */\n if (said && !offered.includes(said.condition)) offered.push(said.condition);\n if (!offered.length) return null;\n const choose = (condition: MoreCondition) => {\n setPicked(condition);\n if (!takesText(condition)) set(moreTail(condition));\n else if (text.trim()) set(moreTail(condition, text));\n else focusText.current = true;\n };\n const commit = () => {\n if (!picked || !takesText(picked)) return;\n const next = moreTail(picked, text);\n if (next && next !== tail) set(next);\n };\n return (\n <div className=\"facet-more-conditions\">\n <button type=\"button\" className=\"facet-more\" aria-expanded={open} aria-controls={id} onClick={() => setOpen(!open)}>\n {say('moreConditions')}\n </button>\n {open && (\n <div id={id} role=\"group\" aria-label={say('moreConditionsOn', { label: box.label })} className=\"facet-values\">\n {offered.map((condition) => (\n <Fragment key={condition}>\n <label className=\"facet-option\">\n <input type=\"radio\" name={id} data-value={condition} checked={picked === condition} onChange={() => choose(condition)} />\n <span className=\"facet-option-label\">{MORE_LABELS[condition]}</span>\n </label>\n {takesText(condition) && picked === condition && (\n <div className=\"form-field form-field-compact\">\n <input\n ref={box$}\n type=\"text\"\n className=\"field-control facet-input\"\n aria-label={MORE_LABELS[condition]}\n data-value={`${condition}-text`}\n value={text}\n placeholder={condition === 'like' ? say('common.patternEGWh') : say('text')}\n title={condition === 'like' ? say('standsForAnyRun') : undefined}\n onChange={(e) => setText(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n commit();\n onEnter?.();\n }\n }}\n />\n </div>\n )}\n </Fragment>\n ))}\n </div>\n )}\n </div>\n );\n}\n\ninterface Count {\n value: string;\n label?: string;\n count: number;\n}\n\n/** A facet's values and how many rows each would add, under everything else the list asks. */\nfunction useCounts(table: TableMeta, refinement: string, column: string, labelPath: string | undefined, standing: string) {\n const text = facetCountText(table.id, refinement, column, labelPath, standing);\n return useQuery<Count[]>({\n /* In the list's own query family, so a write that refreshes the rows refreshes the counts. */\n queryKey: ['run', state.activeConnection ?? '', 'facet', text],\n queryFn: async () => {\n /* With the rail's other facets, in one request (breakdownBatch.ts):\n a rail of eleven facets was eleven requests queued on one connection. */\n const data = (await batchedBreakdown({ text, limit: MOST })) as {\n columns?: string[];\n rows?: Array<Record<string, unknown>>;\n errors?: unknown[];\n };\n if (data.errors?.length || !data.columns?.length) throw new Error(say('couldNotCountTheValues'));\n const keys = data.columns;\n return (data.rows ?? []).flatMap((row) => {\n const value = row[keys[0]];\n const n = Number(row[keys[keys.length - 1]]);\n if (value == null || !Number.isFinite(n)) return [];\n const label = labelPath ? row[keys[1]] : undefined;\n return [{ value: String(value), count: n, ...(label == null ? {} : { label: String(label) }) }];\n });\n },\n staleTime: 60_000,\n placeholderData: keepPreviousData,\n retry: false,\n });\n}\n\n/** The label path a reference's values are said by: its target's label column. */\nfunction labelPathOf(box: Box): string | undefined {\n const target = box.meta?.references ? (findTable(box.meta.references.table) as TableMeta | undefined) : undefined;\n const label = target ? (labelColumn(target) as string | undefined) : undefined;\n return label ? `${box.column}.${label}` : undefined;\n}\n\nconst numericColumn = (box: Box) => (box.meta ? columnKind(box.meta.type) === 'number' : false);\n\nfunction ValuesFacet({ box, tail, table, refinement, standing, set, more }: FacetProps) {\n const [all, setAll] = useState(false);\n const labelPath = box.kind === 'ref' ? labelPathOf(box) : undefined;\n const counts = useCounts(table, refinement, box.column, labelPath, standing);\n const byValue = new Map((counts.data ?? []).map((c) => [c.value, c]));\n const selected = selectedValues(tail);\n const ticked = selected ?? [];\n /* A vocabulary is listed whole, in its own order — a value with no rows\n is still a value, and says 0. A reference lists the targets that have\n rows, the most first; so does text, and a number lists its values in\n their own order (1, 2, 3; 2016 to 2024). A ticked value is always\n listed, rows or none. */\n const allowed = (box.meta as { allowed?: string[] } | undefined)?.allowed;\n const rule = columnDisplay(table.id, box.column) as DisplayRule | null;\n const listed: Count[] = allowed?.length ? allowed.map((value) => byValue.get(value) ?? { value, count: 0 }) : [...(counts.data ?? [])];\n for (const value of ticked) if (!listed.some((c) => c.value === value)) listed.push({ value, count: 0 });\n if (!allowed?.length && box.kind !== 'ref' && numericColumn(box)) listed.sort((a, b) => Number(a.value) - Number(b.value));\n const shown = all || listed.length <= SHORT + SLACK ? listed : listed.filter((c, i) => i < SHORT || ticked.includes(c.value));\n /* Money is said as the cards say it ($1,795.00), whatever unit it is kept in; the tick still asks for the stored value. */\n const money = rule?.format === 'money' ? rule : null;\n const figure = (value: string) => {\n const dress = money ? dressFor(money, value) : null;\n return dress?.kind === 'money' ? dress.text : undefined;\n };\n const known = counts.isSuccess;\n const toggle = (value: string, on: boolean) => {\n const next = on ? [...ticked, value] : ticked.filter((v) => v !== value);\n const order = listed.map((c) => c.value);\n set(valuesTail(next.sort((a, b) => order.indexOf(a) - order.indexOf(b))));\n };\n return (\n <Facet box={box} tail={tail} set={set} more={more}>\n {selected === null && <Unshown box={box} table={table} tail={tail} />}\n {counts.isError && <p className=\"facet-note\">{say('countsUnavailable')}</p>}\n <ul className=\"facet-values\">\n {shown.map((c) => {\n /* A vocabulary's value is a word to its reader (`in_progress` says \"In progress\"),\n as its chip says it, and in the display rule's own word where it gives one\n (`values`, `humanize`); any other value is said exactly. */\n const said = c.label ?? wordFor(rule, c.value) ?? figure(c.value) ?? (allowed?.length ? vocabularyWord(c.value) : c.value);\n return (\n <li key={c.value}>\n <label className=\"facet-option\" title={c.label ? `${box.column} = ${c.value}` : undefined}>\n <input\n type=\"checkbox\"\n data-value={c.value}\n checked={ticked.includes(c.value)}\n onChange={(e) => toggle(c.value, e.target.checked)}\n />\n <span className=\"facet-option-label\">{said}</span> {/* Blank until known, never a guessed zero. */}\n <span className=\"facet-count\">{known ? counted(c.count) : ''}</span>\n </label>\n </li>\n );\n })}\n </ul>\n {!all && listed.length > shown.length && (\n <button type=\"button\" className=\"facet-more\" onClick={() => setAll(true)}>\n {say('showAll', { listedCount: listed.length })}\n </button>\n )}\n </Facet>\n );\n}\n\n/* One count of the list's records, asked of a breakdown in the rail's batch; null until known. */\nconst recordCount = (text: string) => ({\n queryKey: ['run', state.activeConnection ?? '', 'facet', text],\n queryFn: async (): Promise<number> => {\n const data = (await batchedBreakdown({ text, limit: 1 })) as {\n columns?: string[];\n rows?: Array<Record<string, unknown>>;\n errors?: unknown[];\n };\n if (data.errors?.length || !data.columns?.length) throw new Error(say('couldNotCountTheValues'));\n const n = Number(data.rows?.[0]?.[data.columns[data.columns.length - 1]] ?? 0);\n return Number.isFinite(n) ? n : 0;\n },\n staleTime: 60_000,\n placeholderData: keepPreviousData,\n retry: false,\n});\n\n/*\n * A value of the rows that point at the record (shared/listFilters.ts) —\n * `any opportunity where stage in (won, lost)`: a checklist of what those\n * rows hold, a vocabulary whole and in its order, anything else the values\n * held the most first, a reference by its record's name. Each value says how\n * many of the list's records one of their rows holding it would show — the\n * records, once each, under everything else the list asks.\n */\nfunction HasValuesFacet({ box, tail, table, refinement, standing, set }: FacetProps) {\n const [all, setAll] = useState(false);\n const has = box.has!;\n const allowed = (box.meta as { allowed?: string[] } | undefined)?.allowed;\n const target = box.meta?.references ? (findTable(box.meta.references.table) as TableMeta | undefined) : undefined;\n const naming = target ? (labelColumn(target) as string | undefined) : undefined;\n const labelPath = box.kind === 'ref' && naming ? `${has.asks}.${naming}` : undefined;\n const text = hasValuesText(has.child, has.asks, labelPath);\n const held = useQuery<Count[]>({\n queryKey: ['run', state.activeConnection ?? '', 'facet', text],\n enabled: !allowed?.length,\n queryFn: async () => {\n const data = (await batchedBreakdown({ text, limit: MOST })) as {\n columns?: string[];\n rows?: Array<Record<string, unknown>>;\n errors?: unknown[];\n };\n if (data.errors?.length || !data.columns?.length) throw new Error(say('couldNotCountTheValues'));\n const keys = data.columns;\n return (data.rows ?? []).flatMap((row) => {\n const value = row[keys[0]];\n if (value == null || value === '') return [];\n const label = labelPath ? row[keys[1]] : undefined;\n return [{ value: String(value), count: 0, ...(label == null ? {} : { label: String(label) }) }];\n });\n },\n staleTime: 60_000,\n retry: false,\n });\n const selected = selectedValues(tail);\n const ticked = selected ?? [];\n const listed: Count[] = allowed?.length ? allowed.map((value) => ({ value, count: 0 })) : [...(held.data ?? [])];\n for (const value of ticked) if (!listed.some((c) => c.value === value)) listed.push({ value, count: 0 });\n const shown = all || listed.length <= SHORT + SLACK ? listed : listed.filter((c, i) => i < SHORT || ticked.includes(c.value));\n const counts = useQueries({ queries: shown.map((c) => recordCount(hasCountText(table.id, refinement, box.column, standing, c.value))) });\n const rule = columnDisplay(has.child, has.asks) as DisplayRule | null;\n const toggle = (value: string, on: boolean) => {\n const next = on ? [...ticked, value] : ticked.filter((v) => v !== value);\n const order = listed.map((c) => c.value);\n set(valuesTail(next.sort((a, b) => order.indexOf(a) - order.indexOf(b))));\n };\n return (\n <Facet box={box} tail={tail} set={set}>\n {selected === null && <Unshown box={box} table={table} tail={tail} />}\n {(held.isError || counts.some((count) => count.isError)) && <p className=\"facet-note\">{say('countsUnavailable')}</p>}\n <ul className=\"facet-values\">\n {shown.map((c, i) => {\n const said = c.label ?? wordFor(rule, c.value) ?? (allowed?.length ? vocabularyWord(c.value) : c.value);\n const n = counts[i]?.data;\n return (\n <li key={c.value}>\n <label className=\"facet-option\" title={c.label ? `${has.asks} = ${c.value}` : undefined}>\n <input\n type=\"checkbox\"\n data-value={c.value}\n checked={ticked.includes(c.value)}\n onChange={(e) => toggle(c.value, e.target.checked)}\n />\n <span className=\"facet-option-label\">{said}</span> {/* Blank until known, never a guessed zero. */}\n <span className=\"facet-count\">{typeof n === 'number' ? counted(n) : ''}</span>\n </label>\n </li>\n );\n })}\n </ul>\n {!all && listed.length > shown.length && (\n <button type=\"button\" className=\"facet-more\" onClick={() => setAll(true)}>\n {say('showAll', { listedCount: listed.length })}\n </button>\n )}\n </Facet>\n );\n}\n\n/* One of their segments (`any opportunity where open`): a yes, as a flag's facet is, with how many records it shows. */\nfunction HasSegmentFacet({ box, table, refinement, standing, set }: FacetProps) {\n const count = useQuery(recordCount(hasCountText(table.id, refinement, box.column, standing)));\n const on = holdsCondition(refinement, box.column);\n return (\n <div className=\"facet\" data-column={box.column}>\n <label className=\"facet-option facet-flag\">\n <input type=\"checkbox\" data-value=\"true\" checked={on} onChange={(e) => set(e.target.checked ? WHOLE : '')} />\n <span className=\"facet-option-label\">{box.label}</span>{' '}\n <span className=\"facet-count\">{typeof count.data === 'number' ? counted(count.data) : ''}</span>\n </label>\n </div>\n );\n}\n\n/*\n * A record's tags (tagLists.ts): every tag, by name, ticked for any of them —\n * `tags has (bug, docs)`. The names are the tag table's, read as the rail\n * reads any values, through this reader's grants; a tag is listed whether\n * or not a record in view has it, as a vocabulary's value is.\n */\nfunction TagsFacet({ box, tail, table, set }: FacetProps) {\n const tags = table.tags;\n // A list its definition spells out (a row-defined `choices` field, DefinedFields.tsx) offers those options, uncounted.\n const options = (box.meta as { allowed?: readonly string[] } | undefined)?.allowed;\n const text = tags ? `${tags.to} count by ${tags.label} sort ${tags.label}` : '';\n const listing = useQuery<string[]>({\n queryKey: ['run', state.activeConnection ?? '', 'facet', text],\n enabled: Boolean(tags) && !options,\n queryFn: async () => {\n const data = (await batchedBreakdown({ text, limit: MOST })) as {\n columns?: string[];\n rows?: Array<Record<string, unknown>>;\n errors?: unknown[];\n };\n if (data.errors?.length || !data.columns?.length) throw new Error(say('couldNotCountTheValues'));\n const key = data.columns[0];\n return (data.rows ?? []).flatMap((row) => (row[key] == null || row[key] === '' ? [] : [String(row[key])]));\n },\n staleTime: 60_000,\n retry: false,\n });\n const selected = selectedTags(tail);\n const ticked = selected ?? [];\n const listed = [...(options ?? listing.data ?? [])];\n for (const value of ticked) if (!listed.includes(value)) listed.push(value);\n const toggle = (value: string, on: boolean) => {\n const next = on ? [...ticked, value] : ticked.filter((v) => v !== value);\n set(tagsTail(next.sort((a, b) => listed.indexOf(a) - listed.indexOf(b))));\n };\n return (\n <Facet box={box} tail={tail} set={set}>\n {selected === null && <Unshown box={box} table={table} tail={tail} />}\n {listing.isError && <p className=\"facet-note\">{say('countsUnavailable')}</p>}\n <ul className=\"facet-values\">\n {listed.map((value) => (\n <li key={value}>\n <label className=\"facet-option\">\n <input\n type=\"checkbox\"\n data-value={value}\n checked={ticked.includes(value)}\n onChange={(e) => toggle(value, e.target.checked)}\n />\n <span className=\"facet-option-label\">{value}</span>\n </label>\n </li>\n ))}\n </ul>\n </Facet>\n );\n}\n\nconst truthy = (value: string) => value === '1' || value.toLowerCase() === 'true';\n\nfunction FlagFacet({ box, tail, table, refinement, standing, set, more }: FacetProps) {\n const counts = useCounts(table, refinement, box.column, undefined, standing);\n const yes = counts.isSuccess ? (counts.data ?? []).filter((c) => truthy(c.value)).reduce((n, c) => n + c.count, 0) : null;\n const on = tail === '= true';\n return (\n /* Ticked, the box is its own Clear; a second one would only push the\n count out of line with every other facet's. */\n <Facet box={box} tail={on ? '' : tail} set={set} group={false} more={more}>\n {tail && !on && <Unshown box={box} table={table} tail={tail} />}\n <label className=\"facet-option facet-flag\">\n <input type=\"checkbox\" data-value=\"true\" checked={on} onChange={(e) => set(e.target.checked ? '= true' : '')} />\n <span className=\"facet-option-label\">{box.label}</span> <span className=\"facet-count\">{yes === null ? '' : counted(yes)}</span>\n </label>\n </Facet>\n );\n}\n\nfunction DateFacet({ box, tail, table, set, onEnter, more }: FacetProps) {\n const name = useId();\n const range = rangeOf(tail);\n /* What the column is decides what it is asked: a stamp its past windows, a deadline what is overdue (filterRailModel.ts). */\n const presets = datePresets(box.meta);\n const preset = presets.find(([, t]) => t === tail);\n /* The ends are typed into a draft and applied on Enter or leaving the\n box: a date input reports every keystroke of a year as a whole date. */\n const [from, setFrom] = useState(range.from);\n const [to, setTo] = useState(range.to);\n useEffect(() => {\n setFrom(range.from);\n setTo(range.to);\n }, [range.from, range.to]);\n const commit = () => {\n if ((from && !isPickerDate(from)) || (to && !isPickerDate(to))) return false;\n if (from !== range.from || to !== range.to) set(rangeTail(from, to));\n return true;\n };\n const onKey = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n if (commit()) onEnter?.();\n }\n };\n return (\n <Facet box={box} tail={tail} set={set} more={more}>\n {tail && !preset && !range.from && !range.to && <Unshown box={box} table={table} tail={tail} />}\n <div className=\"facet-values\">\n {presets.map(([label, value]) => (\n <label key={value} className=\"facet-option\">\n <input type=\"radio\" name={name} data-value={value} checked={preset?.[1] === value} onChange={() => set(value)} />\n <span className=\"facet-option-label\">{label}</span>\n </label>\n ))}\n </div>\n <div className=\"facet-range facet-date-range\">\n <div className=\"facet-range-end\">\n <label htmlFor={`${name}-from`}>{say('from')}</label>\n <DateField\n id={`${name}-from`}\n aria-label={say('from')}\n className=\"facet-input\"\n value={from}\n max={isPickerDate(to) ? to : undefined}\n locale={formatLocale()}\n timezone={formatTimezone()}\n onChange={setFrom}\n onBlur={commit}\n onKeyDown={onKey}\n />\n </div>\n <div className=\"facet-range-end\">\n <label htmlFor={`${name}-to`}>{say('to')}</label>\n <DateField\n id={`${name}-to`}\n aria-label={say('to')}\n className=\"facet-input\"\n value={to}\n min={isPickerDate(from) ? from : undefined}\n locale={formatLocale()}\n timezone={formatTimezone()}\n onChange={setTo}\n onBlur={commit}\n onKeyDown={onKey}\n />\n </div>\n </div>\n </Facet>\n );\n}\n\n/** The shape a plain column's facet takes, judged once from its values over the view's standing rows. */\nfunction useFacetShape(table: TableMeta, column: string, standing: string, numeric: boolean, bare = false) {\n const text = facetShapeText(table.id, column, standing);\n return useQuery<AutoShape>({\n queryKey: ['run', state.activeConnection ?? '', 'facet-shape', text, bare],\n queryFn: async () => {\n const data = (await batchedBreakdown({ text, limit: MOST + 1 })) as { rows?: unknown[]; errors?: unknown[] };\n if (data.errors?.length) throw new Error(say('couldNotCountTheValues'));\n const distinct = data.rows?.length ?? 0;\n /* A name with nothing to list has no checklist to offer: it stays the box that searches it. */\n if (bare && distinct === 0) return 'text';\n return autoShape(numeric, distinct, distinct <= MOST);\n },\n staleTime: 5 * 60_000,\n retry: false,\n });\n}\n\nfunction AutoFacet(props: FacetProps & { unit?: FacetUnit; bare?: boolean }) {\n const { box, tail, table, standing, set, more, bare } = props;\n const numeric = numericColumn(box);\n const shape = useFacetShape(table, box.column, standing, numeric, bare);\n const settled = shape.isError ? (numeric ? 'range' : 'text') : shape.data;\n /* Until the shape is known the facet is its name alone — never a box that\n turns into a list under the reader's pointer. */\n if (!settled)\n return (\n <Facet box={box} tail={tail} set={set} more={more} busy>\n {tail ? <Unshown box={box} table={table} tail={tail} /> : null}\n </Facet>\n );\n if (settled === 'values') return <ValuesFacet {...props} />;\n if (settled === 'range') return <RangeFacet {...props} />;\n return <TextFacet key={tail} {...props} />;\n}\n\n/* What a reader types as a figure, without its dressing: \"$15,000\" is 15000. */\nconst plain = (text: string) => text.replace(/[\\s,$€£]/g, '');\n\nfunction currencySymbol(currency: string): string | undefined {\n try {\n return new Intl.NumberFormat(formatLocale(), { style: 'currency', currency }).formatToParts(0).find((part) => part.type === 'currency')\n ?.value;\n } catch {\n return undefined;\n }\n}\n\n/**\n * A range over money kept in minor units is typed and read in the major unit, as the cards say it: the question\n * keeps the stored figure (179500), the boxes hold what a person means by it (1795). Any other column is as it is.\n */\nfunction minorRange(rule: DisplayRule | null, currency: string | undefined) {\n if (!rule?.minor || rule.format !== 'money') return null;\n const code = rule.currency || currency || defaultCurrency();\n return {\n /* \"1795.00\" is typed as 1795: the cents are said only where there are some. */\n toMajor: (stored: string) => minorToMajor(stored, code)?.replace(/\\.0+$/, '') ?? stored,\n /* A figure that is no amount in this currency (too many decimals) is left as typed, and ignored by the range. */\n toMinor: (typed: string) => {\n const minor = typed === '' ? undefined : majorToMinor(typed, code);\n return minor === undefined ? typed : String(minor);\n },\n };\n}\n\nfunction RangeFacet({ box, tail, table, set, unit, onEnter, more }: FacetProps & { unit?: FacetUnit }) {\n const kept = numberRangeOf(tail);\n const minor = minorRange(columnDisplay(table.id, box.column) as DisplayRule | null, unit?.currency);\n const range = minor ? { min: minor.toMajor(kept.min), max: minor.toMajor(kept.max) } : kept;\n /* Applied on Enter or leaving the box, as a date's range is: a figure\n typed a digit at a time is not a new question at every digit. */\n const [min, setMin] = useState(range.min);\n const [max, setMax] = useState(range.max);\n useEffect(() => {\n setMin(range.min);\n setMax(range.max);\n }, [range.min, range.max]);\n const commit = () => {\n const ends = minor ? [minor.toMinor(plain(min)), minor.toMinor(plain(max))] : [plain(min), plain(max)];\n const next = numberRangeTail(ends[0], ends[1]);\n if (next !== numberRangeTail(kept.min, kept.max)) set(next);\n };\n const onKey = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n commit();\n onEnter?.();\n }\n };\n const symbol = unit?.currency ? currencySymbol(unit.currency) : undefined;\n /* Each end is a compact Field, so the rail's boxes are the filter bar's\n fields in every look. The input is named by the word alone: the symbol\n and the unit beside it stay out of the label, and \"Min$\" is not a name. */\n const end = (which: 'min' | 'max', value: string, change: (value: string) => void) => (\n <Field size=\"compact\" className=\"facet-range-end\" label={which === 'min' ? say('min') : say('max')}>\n {(control) => (\n <span className=\"facet-affix\">\n {symbol && (\n <span className=\"facet-affix-text\" aria-hidden=\"true\">\n {symbol}\n </span>\n )}\n <input\n {...control}\n type=\"text\"\n inputMode=\"decimal\"\n className=\"field-control facet-input\"\n data-value={which}\n value={value}\n placeholder={say('common.any')}\n onChange={(e) => change(e.target.value)}\n onBlur={commit}\n onKeyDown={onKey}\n />\n {unit?.unit && (\n <span className=\"facet-affix-text\" aria-hidden=\"true\">\n {unit.unit}\n </span>\n )}\n </span>\n )}\n </Field>\n );\n return (\n <Facet box={box} tail={tail} set={set} more={more}>\n {tail && !range.min && !range.max && <Unshown box={box} table={table} tail={tail} />}\n <div className=\"facet-range\">\n {end('min', min, setMin)}\n {end('max', max, setMax)}\n </div>\n </Facet>\n );\n}\n\n/* Keyed by its tail, so a condition changed elsewhere redraws the box with it. */\nfunction TextFacet({ box, tail, table, standing, set, onEnter, more }: FacetProps) {\n const id = useId();\n const fuzzy = box.meta ? columnKind(box.meta.type) === 'text' : false;\n const initial = tail.startsWith('contains ')\n ? unquote(tail.slice('contains '.length))\n : tail.startsWith('= ')\n ? `${fuzzy ? '=' : ''}${unquote(tail.slice(2))}`\n : '';\n const [text, setText] = useState(initial);\n const suggesting = useArrived(SuggestBox, Boolean(box.suggest?.length));\n const commit = (raw = text) => {\n if (raw !== initial) set(boxTail(box, { raw }, tail));\n };\n const inputProps = {\n id,\n type: 'search',\n className: 'field-control facet-input',\n 'data-value': 'text',\n placeholder: fuzzy ? say('contains') : say('equals'),\n title: fuzzy ? say('common.matchesAnywhereInTheValue') : undefined,\n onBlur: () => commit(),\n onKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n commit();\n onEnter?.();\n }\n },\n };\n return (\n <Facet box={box} tail={tail} set={set} group={false} more={more}>\n <label className=\"facet-label\" htmlFor={id}>\n {box.label}\n </label>\n {tail && !initial && <Unshown box={box} table={table} tail={tail} />}\n {/* In a compact field's dress: the facet's name above is its label. */}\n <div className=\"form-field form-field-compact\">\n {suggesting && box.suggest ? (\n <SuggestBox\n table={table.id}\n columns={box.suggest}\n standing={standing}\n text={text}\n onText={setText}\n onPick={(value) => {\n commit(value);\n onEnter?.();\n }}\n inputProps={inputProps}\n />\n ) : (\n <input {...inputProps} value={text} onChange={(e) => setText(e.target.value)} />\n )}\n </div>\n </Facet>\n );\n}\n\n/**\n * How many rows a draft question shows — what the sheet's button and a list\n * bar's picker say before they apply it. Under the view's standing condition,\n * as the list itself is: without it \"Show 55\" counted the sold cars the list\n * never shows.\n */\nexport function useDraftCount(table: TableMeta, standing: string, draft: string): number | null | undefined {\n const q = squeeze(`${table.id} ${andQuery(standing, draft)}`);\n return useQuery<number | null>({\n queryKey: ['count', state.activeConnection ?? '', q],\n queryFn: async () => {\n const data = await api('/api/run', { q, limit: 1 });\n return 'total' in data && !data.errors?.length && typeof data.total === 'number' ? data.total : null;\n },\n staleTime: 60_000,\n placeholderData: keepPreviousData,\n retry: false,\n }).data;\n}\n\ninterface SheetProps extends Omit<RailProps, 'onChange' | 'status'> {\n onApply: (refinement: string) => void;\n onClose: () => void;\n}\n\n/**\n * The rail on a phone: the same facets in a sheet over the list, edited as\n * a draft — the counts follow the draft — and applied by one button that\n * says what it will show.\n */\nexport function FilterSheet({ refinement, onApply, onClose, ...rail }: SheetProps) {\n const [draft, setDraft] = useState(refinement);\n const n = useDraftCount(rail.table, rail.standing ?? '', draft);\n return (\n <Modal className=\"filter-sheet\" fullscreen=\"mobile\" ariaLabel={say('common.filtersButton')} onClose={onClose}>\n <FilterRail {...rail} refinement={draft} onChange={setDraft} status={typeof n === 'number' ? `${counted(n)} match` : undefined} />\n <div className=\"filter-sheet-foot\">\n <Button onClick={onClose}>{say('common.cancel')}</Button>\n <Button intent=\"primary\" onClick={() => onApply(draft)}>\n {typeof n === 'number' ? say('showCount', { count: counted(n) }) : say('common.showResults')}\n </Button>\n </div>\n </Modal>\n );\n}\n","/** What ListFilterBar says, in the filter rail room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n moreFilters: 'More filters: {map}',\n search: 'Search {listLabel}…',\n labelEquals: '{label} equals…',\n takesANumber: '{label} takes a number.',\n matchesAnywhereInTheAny: 'Matches anywhere in the {label}, any case. Start with = for an exact match.',\n showN: 'Show {n}',\n match: '{n} match',\n});\n","/**\n * An App list's filters as controls, not a form: the bar a list draws above\n * its rows unless its view says `filterBar: 'rail'` or `'none'`.\n *\n * The bar was a form — an empty box or Select per filter, then Filter, then\n * Advanced — the heaviest thing above a quiet table, and on a phone more than\n * half the first screen. So the list's name column keeps one search box, a\n * real field with the 3:1 edge; every other filter the view declares is a\n * quiet \"+ Status\" that opens, in a popover, the picker the rail draws for it\n * (a checklist, Min/Max, date presets; a reference is the typeahead its box\n * was); and what is applied is said in the same row as chips, each in its\n * filter's place: a chip opens its picker again, its × (or Backspace) takes\n * it out, and two or more earn one Clear all. On a phone the pickers are the\n * rail's sheet, behind one Filters button that says how many apply.\n *\n * No picker writes a new kind of question. Each hands a condition tail to\n * withCondition, as the boxes and the rail do, so a chip, the address\n * (publicAddress.ts), a saved view and the crumb read it as they always did.\n * A picker edits a draft and applies it with one button: every navigation\n * redraws the list, and a popover that applied each tick would close under\n * the reader's second one.\n */\nimport { useEffect, useLayoutEffect, useRef, useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { Button } from '@mistriwork/ui/Button.js';\nimport { Popover } from '@base-ui/react/popover';\nimport { WHOLE, canonicalize, conditionTail, mentionsColumn, ownedTails, squeeze, stripCondition, withCondition } from '../filterbar.js';\nimport { formatNumber } from '../locale.js';\nimport { columnKind, type TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport { layoutViewport, zoomAnchor } from '@mistriwork/ui/internal/anchor.js';\nimport { RefBox, boxTail, boxText, wrongForNumber, type Box, type BoxEdit } from './FilterBoxes.js';\nimport { useConditionWords } from './useConditionWords.js';\nimport { useArrived } from './onDemand.js';\nimport { SuggestBox } from './suggestPart.js';\nimport { FacetFor, useDraftCount, type FacetUnit } from './FilterRail.js';\nimport { clearFacets, facetActive } from './filterRailModel.js';\nimport { say } from '../copy/filters/components/ListFilterBar.js';\nimport { popupContainer } from '../shellHost.js';\n\ninterface ListFilterBarProps {\n table: TableMeta;\n /** Every filter the view declares, the name column's first. */\n boxes: Box[];\n /** The name column's box, drawn as the search box; every other box is a picker. */\n search?: Box;\n /** The question the controls read, without the table or the plumbing. */\n refinement: string;\n /** The lit tab's own query: a column it speaks for is the tab's to say, not a chip's. */\n tabQuery: string;\n /** The view's standing condition, under every count a picker shows. */\n standing: string;\n unitOf: (column: string) => FacetUnit | undefined;\n /** What is typed in the search box and not yet applied; undefined while untouched. */\n typed: string | undefined;\n onType: (raw: string) => void;\n /** Enter, or the search field's own ×: the list's form folds the typed text in. */\n onSearch: () => void;\n /** Every change goes here, with the column whose control the redrawn list focuses. */\n apply: (text: string, focus?: string) => void;\n /** The text a chip's × edits: the query bar's, while a reader is typing in it. */\n current: () => string;\n /** A leftover clause no tab explains, said in words with its own way out. */\n residue?: { text: string; remove: () => void };\n /** The list's own name, for the search box's words: \"Search issues…\". */\n listLabel: string;\n phone: boolean;\n /** The phone's pickers: the rail's sheet, over the list. */\n onSheet: () => void;\n}\n\ntype SlotProps = ListFilterBarProps & { box: Box; chipOnly?: boolean };\n\nexport function ListFilterBar(props: ListFilterBarProps) {\n const { boxes, search, refinement, tabQuery, apply, residue, phone, onSheet } = props;\n const pickers = boxes.filter((box) => box !== search);\n const columns = boxes.map((box) => box.column);\n const active = boxes.filter((box) => facetActive(refinement, box.column, tabQuery)).length;\n const narrowed = pickers.filter((box) => facetActive(refinement, box.column, tabQuery)).length;\n /* One way to empty the row once there is more than one thing in it; the\n lit tab's own conditions stay, as the rail's Clear all leaves them. The\n focus goes to the row's first control, not the page. */\n const clearAll =\n active >= 2 ? (\n <button\n type=\"button\"\n className=\"applist-chips-clear\"\n onClick={() => apply(clearFacets(refinement, columns, tabQuery), search?.column ?? pickers[0]?.column)}\n >\n {say('list.clearAll')}\n </button>\n ) : null;\n const residueChip = residue ? (\n <span className=\"applist-chip\">\n <span className=\"applist-chip-text\">{residue.text}</span>\n <button type=\"button\" className=\"applist-chip-x\" aria-label={say('common.remove2', { text: residue.text })} onClick={residue.remove}>\n ×\n </button>\n </span>\n ) : null;\n const searchBox = search ? <SearchBox {...props} box={search} /> : null;\n /* On a desk the row keeps one line: the filters not yet asked for give way\n from the end, into one \"+ Filter\" that opens every picker in the sheet,\n rather than the last of them standing cut at the window's edge (\"+ Orde…\").\n A chip never gives way — it says what the rows are. Counted before the\n row is painted, so nothing is seen to jump. */\n const idle = pickers.filter((box) => !facetActive(refinement, box.column, tabQuery));\n const [folded, setFolded] = useState(0);\n /* A new width is measured afresh even where nothing was folded: the fold\n below runs after a render, and unfolding nothing renders nothing. */\n const [, remeasure] = useState(0);\n const mark = useRef<HTMLSpanElement>(null);\n const width = useRef(0);\n useLayoutEffect(() => {\n setFolded(0);\n }, [refinement, tabQuery, boxes.length]);\n useLayoutEffect(() => {\n const row = mark.current?.closest<HTMLElement>('.applist-controls');\n if (!row) return;\n /* The list's tabs give way after the filters (structure.css): told here when the filters have nothing left to give. */\n row.toggleAttribute('data-filters-spent', !phone && folded >= idle.length);\n if (phone) return;\n const over = row.scrollWidth - row.clientWidth;\n if (over < 2 || folded >= idle.length) return;\n /* As many more of the shown pickers, from the end, as the room they stand in (their widths and the gaps before\n them, in layout pixels as scrollWidth is) covers: every one that starts past where the row would have to end,\n and the one before them. Never more than are needed — the \"+ Filter\" that folding brings takes room of its own —\n so a row still too wide folds again on its next render. One a render, it was a render and a measure of the whole\n row per picker, in every sort, filter and tab (test/built-client-vitals.mjs). */\n const slots = [...row.querySelectorAll<HTMLElement>('.applist-slot[data-column]')];\n const end = (node?: Node | null) => (node ? (node as HTMLElement).offsetLeft + (node as HTMLElement).offsetWidth : 0);\n const limit = end(slots.at(-1)) - over;\n setFolded(folded + 1 + slots.filter((slot) => end(slot.previousSibling) > limit).length);\n });\n useEffect(() => {\n const row = mark.current?.closest<HTMLElement>('.applist-controls');\n if (phone || !row || typeof ResizeObserver === 'undefined') return undefined;\n width.current = row.clientWidth;\n const observer = new ResizeObserver(() => {\n if (row.clientWidth === width.current) return;\n width.current = row.clientWidth;\n setFolded(0);\n remeasure((n) => n + 1);\n });\n observer.observe(row);\n /* A look's face arriving after the first measure widens the words in a row whose own width never changed: the\n fold was judged on the fallback's metrics, and the row scrolled 10px on a desk wherever the face was late. */\n const fonts = typeof document === 'undefined' ? undefined : document.fonts;\n const refit = () => {\n setFolded(0);\n remeasure((n) => n + 1);\n };\n fonts?.addEventListener?.('loadingdone', refit);\n return () => {\n observer.disconnect();\n fonts?.removeEventListener?.('loadingdone', refit);\n };\n }, [phone]);\n const hidden = new Set(folded ? idle.slice(-folded).map((box) => box.column) : []);\n if (phone) {\n /* The search stays in reach; the pickers are one button, and the chips\n wrap under the box rather than pushing it off the row. */\n return (\n <>\n {searchBox}\n {pickers.length > 0 && (\n <button type=\"button\" className=\"applist-add applist-sheet-open\" aria-haspopup=\"dialog\" onClick={onSheet}>\n {narrowed ? say('common.filters', { narrowed }) : say('common.filtersButton')}\n </button>\n )}\n <div className=\"applist-bar-chips\">\n {search && <FilterSlot {...props} box={search} chipOnly />}\n {pickers.map((box) => (\n <FilterSlot key={box.column} {...props} box={box} chipOnly />\n ))}\n {residueChip}\n {clearAll}\n </div>\n </>\n );\n }\n const rest = idle.filter((box) => hidden.has(box.column));\n return (\n <>\n <span ref={mark} hidden />\n {searchBox}\n {search && <FilterSlot {...props} box={search} />}\n {pickers\n .filter((box) => !hidden.has(box.column))\n .map((box) => (\n <FilterSlot key={box.column} {...props} box={box} />\n ))}\n {rest.length > 0 && (\n <span className=\"applist-slot applist-slot-more\">\n <button\n type=\"button\"\n className=\"applist-add\"\n aria-haspopup=\"dialog\"\n aria-label={say('moreFilters', { map: rest.map((box) => box.label).join(', ') })}\n onClick={onSheet}\n >\n <span className=\"applist-add-mark\" aria-hidden=\"true\">\n +\n </span>\n {say('common.filter')}\n </button>\n </span>\n )}\n {residueChip}\n {clearAll}\n </>\n );\n}\n\n/**\n * One declared filter in its place in the row: its chip when it narrows the\n * list, its \"+\" when it does not. A flag's \"+\" is one gesture, as its\n * checkbox was; every other \"+\" opens the column's picker.\n */\nfunction FilterSlot(props: SlotProps) {\n const { box, search, refinement, tabQuery, apply, current, phone, onSheet, chipOnly } = props;\n /* The lit tab says its own column; a chip would say it twice. */\n const owned = mentionsColumn(tabQuery, box.column);\n const tails = owned ? [] : (ownedTails(refinement, box.column) as string[]);\n /* In the App's words: the label, the rule's word for a value, and a\n reference by the name its box shows, not the id beneath it. */\n const { speaker, sayTails } = useConditionWords(\n props.table,\n tails.map((tail) => `${box.column} ${tail}`),\n );\n const isSearch = box === search;\n /* The search's own condition is in its box; a chip only for what the box cannot say. */\n const chipped = tails.length > 0 && !(isSearch && tails.length === 1 && boxText(box, tails[0]));\n if (chipped) {\n const text = sayTails(speaker, box.column, tails);\n const remove = () => apply(withCondition(current(), box.column, ''), box.column);\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Backspace' && e.key !== 'Delete') return;\n e.preventDefault();\n remove();\n };\n const open = isSearch ? (\n <span className=\"applist-chip-text\">{text}</span>\n ) : phone ? (\n <button type=\"button\" className=\"applist-chip-text applist-chip-open\" aria-haspopup=\"dialog\" onClick={onSheet} onKeyDown={onKeyDown}>\n {text}\n </button>\n ) : (\n <Picker {...props} owned={false} className=\"applist-chip-text applist-chip-open\" onKeyDown={onKeyDown}>\n {text}\n </Picker>\n );\n return (\n <span className=\"applist-chip\" data-column={box.column}>\n {open}\n <button\n type=\"button\"\n className=\"applist-chip-x\"\n aria-label={say('common.remove2', { text })}\n onClick={remove}\n onKeyDown={onKeyDown}\n >\n ×\n </button>\n </span>\n );\n }\n if (chipOnly || isSearch) return null;\n const plus = (\n <>\n <span className=\"applist-add-mark\" aria-hidden=\"true\">\n +\n </span>\n {box.label}\n </>\n );\n if (box.kind === 'flag') {\n return (\n <span className=\"applist-slot\" data-column={box.column}>\n <button\n type=\"button\"\n className=\"applist-add\"\n aria-label={say('common.only', { label: box.label })}\n onClick={() => apply(withCondition(refinement, box.column, box.has?.segment ? WHOLE : '= true'), box.column)}\n >\n {plus}\n </button>\n </span>\n );\n }\n return (\n <span className=\"applist-slot\" data-column={box.column}>\n <Picker {...props} owned={owned} className=\"applist-add\" label={say('common.filter2', { label: box.label })}>\n {plus}\n </Picker>\n </span>\n );\n}\n\n/* The list's name column as a search: Enter asks, and the field's own ×\n (a search field's clear button) empties the question as Enter on an empty\n box would. It reads what the question says and keeps what is typed. */\nfunction SearchBox({ box, table, standing, refinement, typed, onType, onSearch, listLabel }: SlotProps) {\n const input = useRef<HTMLInputElement>(null);\n const viaEnter = useRef(false);\n const said = boxText(box, squeeze(conditionTail(refinement, box.column)));\n const fuzzy = !box.exact && (box.meta ? columnKind(box.meta.type) === 'text' : false);\n const suggesting = useArrived(SuggestBox, Boolean(box.suggest?.length));\n useEffect(() => {\n const el = input.current;\n if (!el) return undefined;\n /* The search event also comes with Enter, which the form already answers. */\n const cleared = () => {\n if (viaEnter.current) {\n viaEnter.current = false;\n return;\n }\n if (el.value === '' && said) onSearch();\n };\n el.addEventListener('search', cleared);\n return () => el.removeEventListener('search', cleared);\n }, [said, onSearch, suggesting]);\n const wrong = wrongForNumber(box, typed);\n const inputProps = {\n type: 'search',\n className: 'applist-search-input',\n ...(box.meta && columnKind(box.meta.type) === 'number' ? { inputMode: 'decimal' as const } : {}),\n ...(wrong ? { 'aria-invalid': true, title: say('takesANumber', { label: box.label }) } : {}),\n placeholder: fuzzy ? say('search', { listLabel: listLabel.toLowerCase() }) : say('labelEquals', { label: box.label }),\n 'aria-label': say('common.filter2', { label: box.label }),\n ...(wrong ? {} : { title: fuzzy ? say('matchesAnywhereInTheAny', { label: box.label.toLowerCase() }) : undefined }),\n onKeyDown: (e: KeyboardEvent<HTMLInputElement>) => {\n viaEnter.current = e.key === 'Enter';\n /* Asked for, not left to implicit submission: a form with two\n fields (this and the query bar's) and no submit button has none. */\n if (e.key === 'Enter' && !e.nativeEvent.isComposing) {\n e.preventDefault();\n onSearch();\n }\n },\n };\n return (\n <span className=\"applist-search\" data-column={box.column}>\n {suggesting && box.suggest ? (\n <SuggestBox\n table={table.id}\n columns={box.suggest}\n standing={standing}\n text={typed ?? said}\n onText={onType}\n onPick={(value) => {\n onType(value);\n onSearch();\n }}\n inputProps={inputProps}\n inputRef={input}\n />\n ) : (\n <input ref={input} {...inputProps} value={typed ?? said} onChange={(e) => onType(e.target.value)} />\n )}\n </span>\n );\n}\n\n/**\n * A \"+\" or a chip, and the popover it opens: anchored on the zoom-aware\n * ruler, drawn inside the enclosing dialog when there is one, the focus on\n * its first field as it opens and back on its button when Escape closes it.\n */\nfunction Picker({\n className,\n label,\n onKeyDown,\n owned,\n children,\n ...props\n}: SlotProps & {\n owned: boolean;\n className: string;\n label?: string;\n onKeyDown?: (e: KeyboardEvent) => void;\n children: ReactNode;\n}) {\n const { box, refinement } = props;\n const trigger = useRef<HTMLButtonElement>(null);\n const popup = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const [container, setContainer] = useState<HTMLElement | null>(null);\n useEffect(() => {\n setContainer(trigger.current?.closest('dialog, [role=\"dialog\"]') as HTMLElement | null);\n }, []);\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger render={<button type=\"button\" className={className} aria-label={label} ref={trigger} onKeyDown={onKeyDown} />}>\n {children}\n </Popover.Trigger>\n <Popover.Portal container={container ?? popupContainer()}>\n <Popover.Positioner\n anchor={() => (trigger.current ? zoomAnchor(trigger.current) : null)}\n positionMethod=\"fixed\"\n side=\"bottom\"\n align=\"start\"\n sideOffset={6}\n collisionBoundary={layoutViewport()}\n collisionPadding={8}\n style={{ zIndex: 40 }}\n >\n <Popover.Popup\n ref={popup}\n className=\"filter-pop\"\n aria-label={say('common.filter2', { label: box.label })}\n data-column={box.column}\n initialFocus={() => popup.current?.querySelector<HTMLElement>('input:not([type=\"hidden\"]):not([aria-hidden=\"true\"])') ?? true}\n >\n <FilterPicker\n box={box}\n table={props.table}\n refinement={refinement}\n standing={props.standing}\n unit={props.unitOf(box.column)}\n owned={owned}\n apply={props.apply}\n close={() => setOpen(false)}\n />\n </Popover.Popup>\n </Popover.Positioner>\n </Popover.Portal>\n </Popover.Root>\n );\n}\n\n/** What a column's picker needs: the bar's \"+ Status\" and an App column menu's Filter… open the same one. */\nexport interface FilterPickerProps {\n box: Box;\n table: TableMeta;\n refinement: string;\n standing: string;\n unit?: FacetUnit;\n /** The lit tab speaks for this column: the picker starts blank, and a choice replaces the tab's condition. */\n owned: boolean;\n apply: (text: string, focus?: string) => void;\n close: () => void;\n}\n\n/** One column's picker: a reference's typeahead, or the rail's facet over a draft. */\nexport function FilterPicker(props: FilterPickerProps) {\n const { box, refinement, owned, apply } = props;\n return box.kind === 'ref' ? (\n <ReferencePicker box={box} tail={owned ? '' : squeeze(conditionTail(refinement, box.column))} refinement={refinement} apply={apply} />\n ) : (\n <FacetPicker {...props} />\n );\n}\n\n/**\n * The rail's facet for one column, editing a draft that one button applies,\n * saying what it will show as the sheet's does — and, to a screen reader, as\n * the draft changes. Where the lit tab speaks for the column the picker\n * starts blank — the tab says it — and a tick replaces the tab's condition,\n * as the box's choice did.\n */\nfunction FacetPicker({ box, refinement, table, standing, unit, apply, owned, close }: FilterPickerProps) {\n const [draft, setDraft] = useState(refinement);\n /* Read when the draft is applied, which can be in the event that set it (Enter in a box). */\n const now = useRef(refinement);\n const set = (tail: string) => {\n now.current = withCondition(now.current, box.column, tail);\n setDraft(now.current);\n };\n const unchanged = canonicalize(draft) === canonicalize(refinement);\n const go = () => {\n if (canonicalize(now.current) === canonicalize(refinement)) close();\n else apply(now.current, box.column);\n };\n const n = useDraftCount(table, standing, draft);\n const form = useRef<HTMLFormElement>(null);\n /* A facet whose shape is still being counted has no field yet as the\n popover opens, which then holds the focus itself: the first field to\n arrive takes it, unless the reader has already moved it. */\n useEffect(() => {\n const home = form.current;\n const pop = home?.closest<HTMLElement>('.filter-pop');\n if (!home || !pop || typeof MutationObserver === 'undefined') return undefined;\n const field = () => home.querySelector<HTMLElement>('input:not([type=\"hidden\"]):not([aria-hidden=\"true\"])');\n if (field()) return undefined;\n const observer = new MutationObserver(() => {\n const first = field();\n if (!first) return;\n observer.disconnect();\n /* After the popover's own focus management has settled on its frame. */\n setTimeout(() => {\n if (document.activeElement === pop || document.activeElement === document.body) first.focus();\n }, 0);\n });\n observer.observe(home, { childList: true, subtree: true });\n return () => observer.disconnect();\n }, []);\n return (\n <form\n ref={form}\n className=\"filter-pop-form\"\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n go();\n }}\n >\n <FacetFor\n box={box}\n table={table}\n refinement={owned && unchanged ? stripCondition(draft, box.column) : draft}\n standing={standing}\n unit={unit}\n set={set}\n onEnter={go}\n picking\n />\n <p className=\"visually-hidden\" role=\"status\">\n {typeof n === 'number' ? say('match', { n: formatNumber(n) }) : ''}\n </p>\n <div className=\"filter-pop-foot\">\n <Button intent=\"primary\" size=\"compact\" type=\"submit\">\n {typeof n === 'number' ? say('showN', { n: formatNumber(n) }) : say('common.showResults')}\n </Button>\n </div>\n </form>\n );\n}\n\n/* A reference is the typeahead its box was: type a name, pick a row, and the\n question says its id. A pick is the decision, so it applies at once; Enter\n on typed text asks for it as written. The list is up as the picker opens. */\nfunction ReferencePicker({\n box,\n tail,\n refinement,\n apply,\n}: {\n box: Box;\n tail: string;\n refinement: string;\n apply: ListFilterBarProps['apply'];\n}) {\n const [edit, setEdit] = useState<BoxEdit | undefined>(undefined);\n const now = useRef<BoxEdit | undefined>(undefined);\n const onEdit = (next: BoxEdit) => {\n now.current = next;\n setEdit(next);\n };\n const submit = () => {\n if (now.current) apply(withCondition(refinement, box.column, boxTail(box, now.current, tail)), box.column);\n };\n return (\n <form\n className=\"filter-pop-form\"\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n submit();\n }}\n >\n <div className=\"facet\" data-column={box.column}>\n <span className=\"facet-label\" aria-hidden=\"true\">\n {box.label}\n </span>\n {tail && (\n <button\n type=\"button\"\n className=\"facet-clear\"\n aria-label={say('common.clear2', { label: box.label })}\n onClick={() => apply(withCondition(refinement, box.column, ''), box.column)}\n >\n {say('common.clear')}\n </button>\n )}\n <RefBox box={box} tail={tail} edit={edit} onEdit={onEdit} onSubmit={submit} startOpen portal=\"body\" />\n </div>\n </form>\n );\n}\n","/** What myViews says, in the lists and grid room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n couldNotReadTheSaved: 'Could not read the saved views — nothing was changed: {message}',\n viewsCannotBeSaved: 'Views cannot be saved here.',\n});\n","/**\n * A reader's saved views of an App list: the tab, filters and sort they keep\n * coming back to, under a name.\n *\n * A view is the list's question as text (the visible question, plumbing\n * out), not a compiled filter, for the reasons the explorer's saved filters\n * give (views.js): it reads back in Advanced, and a view naming a dropped\n * column is a visible error rather than a silently empty list. Opening one\n * is navigating to its text, so its address is the ordinary list URL and a\n * link to it reproduces it anywhere.\n *\n * Kept by the server, in its saved-filters store (`/api/filters`), one list\n * per list view. Whose list it is, the server says (`store`): in an App\n * without sign-in one list the App shares, \"Saved views\"; in a signed-in App\n * each account's own, \"My views\", owned by the verified session and never by\n * anything this client sends; and none where rows are scoped by a policy or\n * a tenant, or for a visitor who is not signed in, who cannot save. The\n * cache is one Query per connection, cleared whenever the session identity\n * changes (applist.js), so one reader's views never paint for the next.\n */\nimport { useQuery, type QueryClient } from '@tanstack/react-query';\nimport { api, state } from '../core.js';\nimport { shell } from '../shellMode.js';\nimport { say } from '../copy/lists/components/myViews.js';\n\nexport interface SavedView {\n name: string;\n query: string;\n}\n/** Whose views a list keeps: the App's shared list, the account's own, or none to save into. */\ntype ViewStore = 'shared' | 'account' | 'none';\ninterface Saved {\n filters: Record<string, SavedView[]>;\n store: ViewStore;\n}\n\n/** The cache of a connection's saved views: the key the list reads and the warm-up fills. */\nexport const savedViewsKey = (): unknown[] => ['filters', state.activeConnection ?? ''];\n\nconst valid = (item: unknown): item is SavedView =>\n Boolean(item) && typeof (item as SavedView).name === 'string' && typeof (item as SavedView).query === 'string';\n\n/* Anything but the two stores the server names is no store: a reply that\n does not say whose list this is must not be offered a Save. A signed-out\n visitor (`auth.public`) is asked nothing: there is no account to keep views\n for, and the read's 401 would draw the sign-in screen over the browsing. */\nexport async function fetchSavedViews(): Promise<Saved> {\n if (shell().publicVisitor()) return { filters: {}, store: 'none' };\n const data = (await api('/api/filters')) as { filters?: Record<string, SavedView[]>; store?: unknown };\n const store = data.store === 'shared' || data.store === 'account' ? data.store : 'none';\n return { filters: data.filters ?? {}, store };\n}\n\nconst listOf = (saved: Saved | undefined, list: string): SavedView[] => {\n const views = saved?.filters[list];\n return Array.isArray(views) ? views.filter(valid) : [];\n};\n\n/** One list's views, and whose they are — undefined until known, and when the server will not say. */\nexport function useSavedViews(list: string): { views: SavedView[]; store: ViewStore | undefined } {\n const saved = useQuery({ queryKey: savedViewsKey(), queryFn: fetchSavedViews, staleTime: Infinity });\n return { views: listOf(saved.data, list), store: saved.data?.store };\n}\n\n/**\n * Change one list's views. The store is a whole list per list view, and a\n * write built on a stale cache silently deleted whatever another tab or\n * browser had saved since — so every write changes the server's *current*\n * list: a fresh read, the change, the whole list back. The cache is trusted\n * only after the server agreed; a failure is thrown, to be said out loud.\n */\nexport async function writeSavedViews(client: QueryClient, list: string, change: (views: SavedView[]) => SavedView[]): Promise<void> {\n let saved: Saved;\n try {\n saved = await fetchSavedViews();\n } catch (err) {\n throw new Error(say('couldNotReadTheSaved', { message: (err as Error).message }));\n }\n if (saved.store === 'none') throw new Error(say('viewsCannotBeSaved'));\n const views = change(listOf(saved, list));\n await api('/api/filters/save', { list, filters: views.length ? views : null });\n const filters = { ...saved.filters };\n if (views.length) filters[list] = views;\n else delete filters[list];\n client.setQueryData(savedViewsKey(), { ...saved, filters });\n}\n\n/** A question kept under a name. A repeated name replaces the older view:\n two called \"Mine\" that ask different things is worse than losing one. */\nexport const withView = (views: SavedView[], name: string, query: string): SavedView[] => [\n ...views.filter((v) => v.name !== name.trim()),\n { name: name.trim(), query },\n];\n\n/** A view renamed in its place; a name another view already has is taken over, by the same rule. */\nexport const renamedView = (views: SavedView[], from: string, to: string): SavedView[] =>\n views.filter((v) => v.name === from || v.name !== to.trim()).map((v) => (v.name === from ? { ...v, name: to.trim() } : v));\n\nexport const withoutView = (views: SavedView[], name: string): SavedView[] => views.filter((v) => v.name !== name);\n","/** What SortMenu says, in the lists and grid room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n xSort: 'x sort {sort}',\n sort: 'Sort',\n defaultOrder: 'Default order',\n});\n","/**\n * A list's Sort menu: the orders the view offers (`sorts`), by name —\n * \"Lowest price\", \"Newest\" — beside the filters. The order is the query's\n * own `sort` clause, so the address carries it, a reload keeps it and a\n * saved view remembers it; choosing one replaces the clause, and \"Default\n * order\" takes it off. A sort the reader typed that matches no choice\n * leaves the menu on none of them rather than pretending it is one.\n */\nimport { joinQuery, splitQuery } from '../clauses.js';\nimport { squeeze } from '../filterbar.js';\nimport { Dropdown } from './Dropdown.js';\nimport { say } from '../copy/lists/components/SortMenu.js';\n\ninterface SortChoice {\n label: string;\n sort: string;\n}\n\n/** Which choice the query is sorted by, or -1. */\nexport function sortChoice(sorts: readonly SortChoice[], query: string): number {\n const current = squeeze(String((splitQuery(query) as { sort?: string }).sort ?? '')).toLowerCase();\n if (!current) return -1;\n const said = (sort: string) =>\n squeeze(`sort ${sort}`)\n .replace(/\\s+asc\\b/gi, '')\n .replace(/\\s*,\\s*/g, ', ')\n .toLowerCase();\n return sorts.findIndex((choice) => said(choice.sort) === said(current.replace(/^sort\\s+/i, '')));\n}\n\n/** The query sorted by `sort`, or with no sort clause when there is none. */\nexport function withSort(query: string, sort: string | undefined): string {\n const parts = splitQuery(query) as { table: string; filter: string; show?: string; sort?: string; limit?: string };\n if (sort) parts.sort = `sort ${sort}`;\n else delete parts.sort;\n return joinQuery(parts);\n}\n\n/**\n * `sort` is the view's own order. Where one of the choices is it, that choice\n * is the default and is named: \"Default order\" beside \"Newest listings\" said\n * the same order twice, once in words a buyer does not use.\n */\nexport function SortMenu({\n sorts,\n query,\n onPick,\n sort,\n}: {\n sorts: readonly SortChoice[];\n query: string;\n onPick: (query: string) => void;\n sort?: string;\n}) {\n const at = sortChoice(sorts, query);\n const standing = sort ? sortChoice(sorts, say('xSort', { sort })) : -1;\n const unsorted = !(splitQuery(query) as { sort?: string }).sort;\n const items = sorts.map((choice, index) => ({ value: String(index), label: choice.label }));\n return (\n <div className=\"applist-sort\">\n <span className=\"applist-sort-label\" aria-hidden=\"true\">\n {say('sort')}\n </span>\n <Dropdown\n ariaLabel={say('sort')}\n value={at >= 0 ? String(at) : standing >= 0 && unsorted ? String(standing) : ''}\n items={standing >= 0 ? items : [{ value: '', label: say('defaultOrder') }, ...items]}\n onChange={(value: string) =>\n onPick(withSort(query, value === '' || Number(value) === standing ? undefined : sorts[Number(value)]?.sort))\n }\n />\n </div>\n );\n}\n","/**\n * The quick-add row, loaded the first time a list that offers one is drawn.\n *\n * QuickAdd is the New form in a list's frame, and the form brings its field\n * library with it: most lists offer no quick add, and none of them should\n * wait for that library to show their rows. The list imports QuickAdd from\n * here; the component and its props are QuickAdd.tsx's own.\n */\nimport { onDemand } from './onDemand.js';\n\nexport const QuickAdd = onDemand(() => import('./QuickAdd.js'), 'QuickAdd', { quiet: true });\n","/**\n * An app's list page: the table through the app's own words.\n *\n * This is the middle of the shape an app is made of — filters → lists →\n * detail pages — and it is deliberately the *real* table view underneath:\n * the vanilla grid with the explorer chrome off, drawn into a host, not a\n * lesser grid. Sorting, the header filter menus, the pager all still work;\n * what changes is the dressing: the app's heading, its filter tabs with live\n * counts, the reader's own views after them, and a filter bar in place of\n * the hidden query bar — a search, a picker per filter and the applied\n * filters said as chips in the same row (ListFilterBar.tsx) — or, where the\n * view says `filterBar: 'rail'`, a rail of facets beside the rows\n * (FilterRail.tsx), a sheet on a phone.\n *\n * The counts and the saved views are Queries: a tab's badge is a minute's\n * cache shared by every list on the connection, and a saved view\n * (myViews.ts) is written through a fresh read of the server's list — never\n * a stale cache — so what is shown is what the server agreed to. Each view is\n * the list's question as text, so opening one is the ordinary list address.\n */\nimport { filterLabel } from '@mistriwork/engine/shared/listFilters.js';\nimport { BoardNewForm } from './boardNew.js';\nimport { useMessageLanguage } from './useMessageLanguage.js';\nimport { createPortal } from 'react-dom';\nimport { listControlsRef, listHeadRef, useCrumbSlots } from './crumbSlot.js';\nimport { FavoriteStar } from './FavoriteStar.js';\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, type ReactNode } from 'react';\nimport { useMutation, useQueries, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { api, columnLabel, labelPath, pageSize, recordLabel, state as walk, toast } from '../core.js';\nimport { say } from '../copy/lists/components/AppList.js';\n\n/* The walk's state, with the field core.js's JSDoc does not declare. */\nconst state = walk as typeof walk & { activeConnection?: string | null };\nimport { mayRunAny } from '../actionGrants.js';\nimport { shell } from '../shellMode.js';\nimport { splitConditions, splitQuery } from '../clauses.js';\nimport { promptFor } from '../prompt.js';\nimport { canonicalize, conditionTail, deriveFilterNames, mentionsColumn, ownedTails, squeeze, withCondition } from '../filterbar.js';\nimport { exportOffered } from '@mistriwork/engine/shared/listPresentations.js';\nimport { humanName } from '@mistriwork/engine/shared/model.js';\nimport { pluralOf, recordNoun } from '@mistriwork/engine/shared/appNoun.js';\nimport type { ResourceHttpSuccess } from '@mistriwork/engine/shared/resourceHttp.js';\nimport { primaryKey, type TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport { findTable } from '../core.js';\nimport { sameReads } from '../liveReads.js';\nimport {\n appListQuery,\n litTabFor,\n residueOf,\n searchColumn,\n shownTabs,\n visibleQuestion,\n wholeQuery,\n type ListEntry,\n type ListSpec,\n subtitleColumns,\n editedReferences,\n listReferenceNames,\n} from './appListModel.js';\nimport { boxTail, boxesFor, type Box, type BoxEdit } from './FilterBoxes.js';\nimport { onDemand } from './onDemand.js';\n\nconst DefinedBoxes = onDemand(() => import('./DefinedFields.js'), 'DefinedBoxes', { quiet: true });\n\n/* A list's single `per` value (`category_id = 3`), which picks the fields a row-defined column's boxes are. */\nfunction oneValue(tail: string): string | undefined {\n const match = /^=\\s*(?:\"([^\"]*)\"|'([^']*)'|(\\S+))$/.exec(tail.trim());\n return match ? (match[1] ?? match[2] ?? match[3]) : undefined;\n}\nimport { useConditionWords } from './useConditionWords.js';\nimport { message } from '../messages.js';\nimport { useTabFold } from './useTabFold.js';\nimport { DropGroup, DropItem, DropMenu } from '@mistriwork/ui/DropMenu.js';\nimport { FilterRail, FilterSheet, type FacetUnit } from './FilterRail.js';\nimport { clearFacets, facetActive } from './filterRailModel.js';\nimport { FilterPicker, ListFilterBar } from './ListFilterBar.js';\nimport { AppColumnMenuContext, returnFocusTo, type AppColumnMenuHost } from './AppColumnMenu.js';\nimport { resourceOf } from './appRooms.js';\nimport { renamedView, useSavedViews, withView, withoutView, writeSavedViews, type SavedView } from './myViews.js';\nimport { PHONE_QUERY, RAIL_QUERY, useMediaQuery } from './useMediaQuery.js';\nimport { TableRoom } from './TableRoom.js';\nimport { RowOpensContext } from './rowOpens.js';\nimport { ListEmpty } from './ListEmpty.js';\nimport { Empty } from './Notes.js';\nimport { Button } from '@mistriwork/ui/Button.js';\nimport { SortMenu } from './SortMenu.js';\nimport { QuickAdd } from './QuickAddOnDemand.js';\nimport { defaultCurrency, formatLocale, formatNumber } from '../locale.js';\n\ninterface AppListProps {\n entry: ListEntry;\n spec: ListSpec;\n /** Where a new question goes: the walk, or an embedding page's own redraw. */\n navigate: (query: string) => void;\n /** Embedded in a page's chooser, the grid's own navigation is off. */\n embedded?: boolean;\n /** The app's New button, when the page offers one. */\n newButton?: ReactNode;\n /** In a dashboard's section that opted in (`interactive`): the list works — its search, its filters,\n its selection and the bulk actions its room offers — under the section's own heading, with no\n heading, saved views, quick add or rail of its own. */\n inDashboard?: boolean;\n /** Rows the list matched, once known, for a heading drawn outside the list (a dashboard section's count). */\n onTotal?: (total: number | undefined) => void;\n}\n\n/* What the next paint should hand focus back to. The redraw replaces the\n control the person just used and focus fell to <body> — twenty Tab stops\n from where they were — so the box or tab that spoke is remembered, and\n the next list puts focus back on its twin. */\nlet refocus: { column?: string; value?: string; tab?: string } | null = null;\n\ninterface Counted {\n total: number;\n capped: boolean;\n}\n\n/**\n * Every tab's badge, asked in one request (`/api/counts`) and counted in one\n * statement where the server can: a list with six tabs was six requests, each\n * running the whole list's read — joins, sort, a page of rows — to use its\n * count. Each is bounded as a list's total is (\"10,000+\"). A minute's cache,\n * shared by every list on the connection that shows the same tabs. A server\n * that refuses the batch is asked tab by tab, as before.\n */\nfunction useTabCounts(questions: string[]): Map<string, Counted | null> | undefined {\n const items = [...new Set(questions)].sort();\n const client = useQueryClient();\n return useQuery<Map<string, Counted | null>>({\n queryKey: ['count', state.activeConnection ?? '', 'tabs', items],\n /* While a new batch is on the way each badge says what it last said — a batch's answer, or the grid's total\n when its tab was on screen (gridCount) — so swapping tabs never empties the badges and shifts the row. */\n placeholderData: () => knownCounts(client),\n queryFn: async () => {\n const said = (data: { total?: unknown; cappedTotal?: unknown; errors?: unknown[] } | undefined): Counted | null =>\n data && !data.errors?.length && typeof data.total === 'number' ? { total: data.total, capped: data.cappedTotal === true } : null;\n try {\n const data = (await api('/api/counts', { items })) as {\n results?: Array<{\n total?: number;\n cappedTotal?: boolean;\n errors?: unknown[];\n }>;\n };\n if (!Array.isArray(data.results) || data.results.length !== items.length) throw new Error(say('theCountsCameBack'));\n return sameReads(new Map(items.map((q, i) => [q, said(data.results![i])])), data);\n } catch {\n return new Map(\n await Promise.all(\n items.map(async (q): Promise<[string, Counted | null]> => {\n try {\n return [\n q,\n said(\n (await api('/api/run', { q, limit: 1 })) as {\n total?: number;\n cappedTotal?: boolean;\n errors?: unknown[];\n },\n ),\n ];\n } catch {\n return [q, null];\n }\n }),\n ),\n );\n }\n },\n enabled: items.length > 0,\n staleTime: 60_000,\n }).data;\n}\n\n/* The last placeholder handed out, handed out again while it says the same. Query asks for a placeholder on\n every render of a batch not yet answered — and of one never asked, a list with no tabs — and a fresh Map each\n time is a new result: the list rendered again, which asked again, every frame for as long as it stood. Each\n render woke the navigation hold, which then held every list to its 1.5 s cap (navigationHold.ts). */\nlet lastKnown: Map<string, Counted | null> | undefined;\nconst sameCount = (a: Counted | null | undefined, b: Counted | null | undefined) =>\n a === b || (a != null && b != null && a.total === b.total && a.capped === b.capped);\n\n/** Every count this connection's badges have been told, newest last: the placeholder for a batch on the way. */\nfunction knownCounts(client: ReturnType<typeof useQueryClient>): Map<string, Counted | null> | undefined {\n const known = new Map<string, Counted | null>();\n for (const [, data] of client.getQueriesData<Map<string, Counted | null>>({ queryKey: ['count', state.activeConnection ?? ''] }))\n if (data instanceof Map) for (const [question, counted] of data) known.set(question, counted);\n if (!known.size) return undefined;\n const last = lastKnown;\n if (\n last &&\n last.size === known.size &&\n [...known].every(([question, counted]) => last.has(question) && sameCount(last.get(question), counted))\n )\n return last;\n lastKnown = known;\n return known;\n}\n\n/** A tab's badge: its count from the batch, or the grid's own total when the tab is the one on screen. */\nfunction TabCount({ counted }: { counted?: Counted | null }) {\n // null is a current result with no count, not permission to show an older one.\n const said = counted == null ? '' : `${formatNumber(counted.total)}${counted.capped ? '+' : ''}`;\n /* The number in a box of its own, over the room a tab keeps for it (features.css). */\n return <span className=\"tab-count\">{said && <span>{said}</span>}</span>;\n}\n\nexport function AppList({ entry, spec, navigate, embedded = false, newButton, inDashboard = false, onTotal }: AppListProps) {\n useMessageLanguage();\n const caption = spec.label;\n const client = useQueryClient();\n const table = findTable(entry.table) as TableMeta | undefined;\n const tabs = shownTabs(spec);\n const refinement = visibleQuestion(spec, entry.query);\n // The name column's box, where one can be drawn (appListModel.ts).\n const naming = searchColumn(table);\n const declared = [...new Set([...(naming ? [naming] : []), ...(spec.filters ?? (table ? deriveFilterNames(table) : []))])];\n /* A row-defined column among the filters is its fields' boxes, once its definitions are read (DefinedFields.tsx). */\n const bound = table ? resourceOf(shell().app(), table.id)?.defined : undefined;\n const boundNames = bound ? declared.filter((name) => Object.hasOwn(bound, name)) : [];\n const [definedBoxes, setDefinedBoxes] = useState<Record<string, Box[]>>({});\n const onDefinedBoxes = useCallback((column: string, next: Box[]) => setDefinedBoxes((previous) => ({ ...previous, [column]: next })), []);\n const names = declared.flatMap((name) => (boundNames.includes(name) ? (definedBoxes[name] ?? []).map((box) => box.column) : [name]));\n /* The resource's caption, through the label source every surface reads (appLabels.ts). */\n const captionOf = (name: string) => columnLabel(spec.table, name) ?? humanName(name);\n const near = [...declared, ...(table?.columns.map((column) => column.name) ?? [])];\n const labelOf = (name: string) => filterLabel(name, captionOf, near);\n const form = useRef<HTMLFormElement>(null);\n const filter = useRef<HTMLInputElement>(null);\n const head = useRef<HTMLDivElement>(null);\n const crumbs = useCrumbSlots();\n const ownList = !embedded && !inDashboard;\n /* The page's own list names itself in the crumb bar where one is drawn over it; where none is (a room reached\n from the menu, `shell.breadcrumbs`), in its own heading row, whose end holds the same verbs. Either way its\n New and Export stand together at the end of the row with its title, and its range is said in the pager. */\n const inBar = ownList && Boolean(crumbs.note && crumbs.tools);\n const inCrumbs = inBar || (ownList && Boolean(crumbs.head));\n const [gridResult, setGridResult] = useState<{\n query: string;\n connection: string | null | undefined;\n total: number | null;\n capped: boolean;\n }>();\n const connection = state.activeConnection;\n const gridCurrent = gridResult?.query === entry.query && gridResult.connection === connection ? gridResult : undefined;\n const gridTotal = gridCurrent?.total;\n const gridCapped = gridCurrent?.capped === true;\n const [advancedOpen, setAdvanced] = useState(false);\n const rail = useRef<HTMLElement>(null);\n const phone = useMediaQuery(PHONE_QUERY);\n /* The rail needs more room than a phone query describes: see RAIL_QUERY. */\n const railNarrow = useMediaQuery(RAIL_QUERY);\n /* An embedded list is a page's chooser, too narrow for a rail: it keeps the bar. */\n const railed = spec.filterBar === 'rail' && !embedded && !inDashboard;\n const [sheet, setSheet] = useState(false);\n\n /* What the person set by hand, box by box, since this question was\n drawn. Only a touched box speaks on submit — in the bar, that is the\n search box; every picker applies itself. */\n const boxes = useMemo(\n () =>\n table\n ? declared\n .flatMap((name) => (boundNames.includes(name) ? (definedBoxes[name] ?? []) : boxesFor(table, [name], labelOf)))\n .map((box) => (box.kind === 'text' && spec.suggest?.[box.column] ? { ...box, suggest: spec.suggest[box.column] } : box))\n : [],\n [table, names.join(','), spec, definedBoxes], // eslint-disable-line react-hooks/exhaustive-deps\n );\n const [edits, setEdits] = useState<Record<string, BoxEdit>>({});\n const editsNow = useRef(edits);\n editsNow.current = edits;\n const touched = (column: string) => column in editsNow.current;\n const tailOf = (box: (typeof boxes)[number]) =>\n boxTail(box, editsNow.current[box.column], conditionTail(refinement, box.column) as string);\n const litTab = litTabFor(tabs, refinement, names);\n /* The name column's box is the bar's search; every other box is a picker. */\n const searchBox = boxes.find((box) => box.column === naming && box.kind === 'text');\n\n /* The saved views of this list, by the view's key: two views over one\n table are two lists with their own working sets. The server says whose\n they are — the App's shared list, or the signed-in account's own — or\n that this reader cannot save (a row policy, a tenant, signed out). */\n const viewKey = spec.id ?? `table:${entry.table}`;\n const saved = useSavedViews(viewKey);\n // A dashboard's list keeps the dashboard's question: views are the list room's to save.\n const yours = inDashboard ? [] : saved.views;\n const store = saved.store;\n const savable = !inDashboard && (store === 'shared' || store === 'account');\n const yourLit = yours.findIndex((f) => canonicalize(f.query) === canonicalize(refinement));\n /* The strip fits its row (useTabFold.ts): the list's tabs by their place, then the saved views' heading, then each\n saved view; what does not fit is under More, and the lit one never is. */\n const savedAt = tabs.length + 1;\n const { strip: tabStrip, folded } = useTabFold(\n tabs.length + (yours.length ? yours.length + 1 : 0),\n yourLit === -1 ? litTab : savedAt + yourLit,\n );\n const foldMark = (at: number) => ({\n 'data-fold': at,\n 'data-folded': folded.has(at) ? '' : undefined,\n 'aria-hidden': folded.has(at) || undefined,\n });\n const writeViews = useMutation({\n mutationFn: (change: (views: SavedView[]) => SavedView[]) => writeSavedViews(client, viewKey, change),\n onError: (err: Error) => toast(err.message, 'error'),\n });\n\n /* Every control funnels here: one composition, one navigation. A control\n that knows where the focus belongs next — a picker in a popover, a chip's\n way out — says which column's control takes it. */\n const apply = (typed: string, focus?: string) => {\n const active = document.activeElement as HTMLElement | null;\n const boxHome = active?.closest?.('[data-column]') as HTMLElement | null;\n refocus = focus\n ? { column: focus }\n : boxHome\n ? { column: boxHome.dataset.column, value: active?.dataset?.value }\n : active?.getAttribute?.('role') === 'tab'\n ? { tab: active.textContent ?? '' }\n : null;\n state.page = 0;\n navigate(wholeQuery(spec, typed));\n };\n\n const currentText = () => filter.current?.value ?? refinement;\n\n /* Everything applied, as chips — each condition with its own way out, and\n the leftover clauses (a sort, a hand-written group) as one chip\n when no tab explains them. The bar says them in its own row\n (ListFilterBar.tsx); a list without one says them here. */\n const residue = litTab === -1 ? residueOf(refinement, names) : '';\n /* Said in the App's words — the column's label, the rule's word for a\n value — never the language the controls wrote (conditionWords.ts). */\n const { speaker, andWords, sayCondition, sayFilter, sayQuestion, sayTails } = useConditionWords(table, [\n refinement,\n ...yours.map((view) => view.query),\n ]);\n const residueChip = residue\n ? {\n text: andWords(sayQuestion(speaker, residue)),\n remove: () => {\n let text = '';\n for (const box of boxes) text = withCondition(text, box.column, tailOf(box));\n apply(text);\n },\n }\n : undefined;\n const chips: Array<{ text: string; remove: () => void }> = [];\n for (const box of boxes) {\n const tails = ownedTails(refinement, box.column);\n if (!tails.length) continue;\n // The lit tab already says its own conditions; a chip would repeat it.\n if (litTab >= 0 && mentionsColumn(tabs[litTab].query ?? '', box.column)) continue;\n chips.push({\n text: sayTails(speaker, box.column, tails),\n remove: () => apply(withCondition(currentText(), box.column, '')),\n });\n }\n if (residueChip) chips.push(residueChip);\n\n const chipList = chips.map((c) => (\n <span key={c.text} className=\"applist-chip\">\n <span className=\"applist-chip-text\">{c.text}</span>\n <button type=\"button\" className=\"applist-chip-x\" aria-label={say('common.remove2', { text: c.text })} onClick={c.remove}>\n ×\n </button>\n </span>\n ));\n\n const isDefault = canonicalize(entry.query) === canonicalize(appListQuery(spec, 0));\n const exactTab = litTab >= 0 && canonicalize(refinement) === canonicalize(tabs[litTab].query ?? '');\n const offerSave = savable && !(isDefault || exactTab || yourLit >= 0 || !refinement);\n const gridTab = tabs.findIndex((_, i) => squeeze(appListQuery(spec, i)) === squeeze(entry.query));\n /* The badges not already on screen: the grid's own total answers the tab\n it shows, so that one is never asked twice (and a list whose grid is\n still loading does not ask again once it lands). */\n const tabCounts = useTabCounts(\n tabs.length > 1 || yours.length > 0\n ? [\n ...tabs.flatMap((_, i) => (i === gridTab ? [] : [appListQuery(spec, i)])),\n ...yours.map((f) => squeeze(`${entry.table} ${f.query}`)),\n ]\n : [],\n );\n\n /* The grid's own total is a count its tab's badge said: kept with the batches, for the placeholder. */\n useEffect(() => {\n if (typeof gridTotal !== 'number' || gridTab < 0) return;\n const question = appListQuery(spec, gridTab);\n client.setQueryData(['count', connection ?? '', 'grid', question], new Map([[question, { total: gridTotal, capped: gridCapped }]]));\n }, [gridTotal, gridCapped, gridTab, connection]); // eslint-disable-line react-hooks/exhaustive-deps\n\n /* A tab's count: the grid's own total for the tab it shows, else the counts read for the strip. While the grid of\n the tab just chosen is on its way, its badge says what it last said, as every other badge does while its batch\n is: the strip's batch leaves that tab out, and once it was answered the badge stood empty until the rows came.\n An emptied badge is a narrower tab, and a strip at the edge of its fold took its last tab out of More for those\n few frames and put it back, on every visit to the list and every switch to a tab (a service-desk App's Inbox\n flickered at a desk); where nothing folds, the search box beside the strip jumped instead. */\n const countOf = (i: number) => {\n const question = appListQuery(spec, i);\n if (i !== gridTab) return tabCounts?.get(question);\n if (typeof gridTotal === 'number') return { total: gridTotal, capped: gridCapped };\n if (gridCurrent) return null;\n return tabCounts?.has(question) ? tabCounts.get(question) : knownCounts(client)?.get(question);\n };\n const pickTab = (i: number) => {\n if (i === litTab) return;\n state.page = 0;\n /* Swapping tabs swaps the tab's clause and keeps the boxes: the reader\n who narrowed to one customer and flips from Open to Done is asking\n about the same customer. Only what the person set by hand travels;\n and the tab wins over a box for its own columns. */\n let text = tabs[i].query ?? '';\n for (const box of boxes) {\n if (!touched(box.column)) continue;\n if (mentionsColumn(text, box.column)) continue;\n text = withCondition(text, box.column, tailOf(box));\n }\n apply(text);\n };\n\n const submit = (e: React.FormEvent) => {\n e.preventDefault();\n /* Touched boxes fold into the text on the way out; untouched ones stay\n silent — the text already says what they would. */\n let text = currentText();\n for (const box of boxes) {\n if (touched(box.column)) text = withCondition(text, box.column, tailOf(box));\n }\n apply(text);\n };\n\n /* A view is the question on screen — tab, filters and sort — as text. */\n /* A view's name starts as what it asks, in the reader's words: \"Status is Open and Owner is me\". */\n const viewWords = (query: string) => {\n const conditions = sayFilter(speaker, splitQuery(`rows ${query}`).filter);\n return andWords(conditions.length ? conditions : sayQuestion(speaker, query));\n };\n const save = async () => {\n const name = await promptFor({\n title: say('saveThisView'),\n label: say('common.name'),\n value: viewWords(refinement),\n placeholder: say('mineDueThisWeek'),\n });\n if (!name || !String(name).trim()) return;\n writeViews.mutate((views) => withView(views, String(name), refinement));\n };\n const rename = async (view: SavedView) => {\n const name = await promptFor({\n title: say('renameThisView'),\n label: say('common.name'),\n value: view.name,\n hint: viewWords(view.query),\n confirmLabel: say('common.rename'),\n });\n if (!name || !String(name).trim()) return;\n writeViews.mutate((views) => renamedView(views, view.name, String(name)));\n };\n\n /* The paint that replaced the one this person was using: put focus back\n on the twin of the control they used — in a rail, the very value. */\n useEffect(() => {\n if (!refocus) return;\n const root = form.current?.parentElement;\n if (refocus.column) {\n const at = `[data-column=\"${CSS.escape(refocus.column)}\"]`;\n const exact = refocus.value ? `${at} input[data-value=\"${CSS.escape(refocus.value)}\"]` : '';\n for (const home of [rail.current, root]) {\n const twin = (exact && home?.querySelector(exact)) || home?.querySelector(`${at} input, ${at} button`);\n if (twin) {\n (twin as HTMLElement).focus();\n break;\n }\n }\n } else if (refocus.tab && root) {\n for (const t of root.querySelectorAll('[role=\"tab\"]')) {\n if ((t.textContent ?? '') === refocus.tab) {\n (t as HTMLElement).focus();\n break;\n }\n }\n }\n refocus = null;\n }, []);\n\n /* The grid: rows only — an entry can carry a workbench tab (diagram,\n definition) across the mode flip, and the diagram under the app's\n filter boxes was a surface those controls cannot filter. The keys the\n app did not choose to show ride along hidden. */\n const chosen = new Set(spec.show ?? []);\n /* A reference is drawn by its record's name, read beside it (appListModel's referenceNames). */\n const referenceLabels = useMemo(() => listReferenceNames(spec), [spec]);\n const named = Object.values(referenceLabels).filter((name) => !chosen.has(name));\n const hide =\n chosen.size && table\n ? [\n ...new Set([\n ...primaryKey(table),\n ...(recordLabel(table) && labelPath(table) ? [labelPath(table)!] : []),\n ...(spec.order ? [spec.order] : []),\n ...subtitleColumns(entry.table, [...chosen]),\n ...editedReferences(spec),\n ...(spec.opens ? [spec.opens] : []),\n ...named,\n ]),\n ].filter((name) => !chosen.has(name))\n : named;\n /* A join table's list opens what each row is about, by its name where the list shows it. */\n const rowOpens = useMemo(\n () =>\n spec.opens\n ? {\n column: spec.opens,\n label:\n referenceLabels[spec.opens] ??\n spec.show?.find((name) => name.startsWith(`${spec.opens}.`) && !name.slice(spec.opens!.length + 1).includes('.')),\n }\n : null,\n [spec.opens, spec.show, referenceLabels],\n );\n const gridEntry = useMemo(() => ({ kind: 'table' as const, table: entry.table, query: entry.query }), [entry.table, entry.query]);\n /* Totals are over everything the conditions match, not the page: one\n measure per column, asked in the list's own query family so a write\n that refreshes the rows refreshes the sums too. */\n // The conditions alone: a sort, a column list or a limit is the page's, not the sum's.\n const totalText = (column: string) => [entry.table, splitQuery(entry.query).filter, `sum ${column}`].filter(Boolean).join(' ');\n const totalAnswers = useQueries({\n queries: (spec.presentation ? [] : (spec.totals ?? [])).map((column) => ({\n queryKey: ['run', connection ?? '', 'total', totalText(column)],\n queryFn: async () => {\n const data = (await api('/api/breakdown', {\n text: totalText(column),\n limit: 1,\n })) as { rows?: Array<Record<string, unknown>> };\n const row = data.rows?.[0];\n return row ? row[Object.keys(row)[0]] : null;\n },\n })),\n });\n const totals =\n spec.totals?.length && !spec.presentation\n ? Object.fromEntries(spec.totals.map((column, i) => [column, totalAnswers[i]?.data]))\n : undefined;\n const onGrid = (result: ResourceHttpSuccess<'/api/run'>) => {\n setGridResult({\n query: entry.query,\n connection,\n total: typeof result.total === 'number' ? result.total : null,\n capped: 'cappedTotal' in result && result.cappedTotal === true,\n });\n onTotal?.(typeof result.total === 'number' ? result.total : undefined);\n /* \"Fix the query above\" must not point at a control the redraw hid. */\n if (result.errors?.length) setAdvanced(true);\n };\n\n // A failed query can still expose its recovery editor; ordinary browsing is opt-in.\n const showAdvanced = advancedOpen || (spec.advancedFilters === true && !boxes.length);\n const tabQuery = litTab >= 0 ? (tabs[litTab].query ?? '') : '';\n /* A range's figures in the App's own dress: the resource's currency before them (the App's\n `ui.currency` when the rule names none, as every other money figure), its unit after. */\n const display =\n (\n resourceOf(shell().app(), entry.table) as\n | {\n display?: Record<string, { format?: string; currency?: string; unit?: string }>;\n }\n | undefined\n )?.display ?? {};\n const unitOf = (column: string): FacetUnit | undefined => {\n const rule = display[column];\n if (rule?.format === 'money')\n return {\n currency: rule.currency ?? defaultCurrency(),\n ...(rule.unit ? { unit: rule.unit } : {}),\n };\n return rule?.unit ? { unit: rule.unit } : undefined;\n };\n /* The view's own `query` is its standing condition: hidden from the reader's question, but every facet count stands on it. */\n const railProps = table ? { table, boxes, refinement, tabQuery, standing: spec.query ?? '', unitOf } : undefined;\n /* Beside the rows, the chips head the results — where the eye is on the\n rows, with the Sort and one Clear all — not under the heading, a column\n away from the facets that set them. The phone's sheet keeps them above. */\n const beside = railed && !railNarrow && Boolean(railProps);\n /* The rail stays beside the rows as they scroll while it fits the room; taller, it scrolls with them (`data-long`,\n FilterRail.css), so the room is the one box that scrolls. A rail held to the window's height and scrolling on its\n own was a second scroller in every room it was taller than: 900px under a 50px bar, so the room scrolled for it\n too (grade's double-scroll on Compass's tasks). */\n useLayoutEffect(() => {\n const box = rail.current;\n const room = box?.closest<HTMLElement>('.content');\n if (!box || !room) return;\n /* Its own top (Lumen stands it 12px down) is room it does not have. */\n const fit = () => box.toggleAttribute('data-long', box.offsetHeight + (parseFloat(getComputedStyle(box).top) || 0) > room.clientHeight);\n fit();\n if (typeof ResizeObserver === 'undefined') return;\n const watch = new ResizeObserver(fit);\n watch.observe(box);\n watch.observe(room);\n return () => watch.disconnect();\n }, [beside]);\n /* The bar says what is applied in its own row, where it was set. */\n const chipsInBar = spec.filterBar !== 'none' && !railed && Boolean(table);\n const narrowed = boxes.filter((box) => facetActive(refinement, box.column, tabQuery)).length;\n /* What the grid's column menus write through (AppColumnMenu.tsx): read when\n a menu is used, so the grid is not redrawn each time it changes. */\n const menuHost = useRef<AppColumnMenuHost | null>(null);\n menuHost.current = table\n ? {\n table,\n query: entry.query,\n refinement,\n tabQuery,\n standing: spec.query ?? '',\n listKey: viewKey,\n unitOf,\n Picker: FilterPicker,\n boxFor: (column) =>\n boxes.find((box) => box.column === column && box.meta) ?? boxesFor(table, [column], labelOf).find((box) => box.meta),\n apply: (text, column) => {\n refocus = null;\n returnFocusTo(column);\n state.page = 0;\n navigate(wholeQuery(spec, text));\n },\n navigate: (query, column) => {\n refocus = null;\n returnFocusTo(column);\n state.page = 0;\n navigate(query);\n },\n /* Beside the rows the rail already shows the column's control: the menu goes there rather than drawing a second one. */\n railFacet: (column) =>\n beside ? (rail.current?.querySelector<HTMLElement>(`.facet[data-column=\"${CSS.escape(column)}\"]`) ?? null) : null,\n }\n : null;\n const matched =\n typeof gridTotal === 'number'\n ? say('match', {\n gridTotal: new Intl.NumberFormat(formatLocale()).format(gridTotal),\n })\n : undefined;\n\n /* Narrowed past the tab — a search, a filter — to nothing: said as that,\n with the way back beside it. \"No rows match.\" alone left the reader to\n find each chip's × (or the rail's Clear all) to see the list again.\n Clear keeps the tab and the order and drops the rest. */\n const refinedFilter = splitQuery(`rows ${refinement}`) as {\n filter: string;\n sort?: string;\n };\n /* The tab the conditions stand under, read without the order: a sort from\n the Sort menu lights no tab, and Clear must not drop the tab with it. */\n /* Each tab read without its order too: a tab carries its sort (`on_notice sort available_on`), and held against a\n filter with the order taken out it lit no tab, so a tab with no rows was said as a search that matched nothing,\n its own condition named as what narrowed it, with a Clear that left the tab. */\n const tabFilters = tabs.map((tab) => ({ ...tab, query: splitQuery(`rows ${tab.query ?? ''}`).filter }));\n const filterTab = litTabFor(tabFilters, refinedFilter.filter, names);\n const filterTabQuery = filterTab >= 0 ? (tabFilters[filterTab].query ?? '') : '';\n const narrowedPast =\n Boolean(refinedFilter.filter.trim()) &&\n canonicalize(refinedFilter.filter) !== canonicalize(splitQuery(`rows ${filterTabQuery}`).filter);\n const clearTo = [filterTabQuery, refinedFilter.sort].filter(Boolean).join(' ');\n const applyNow = useRef(apply);\n applyNow.current = apply;\n /* Kept while its words and target are unchanged, so the rows below (kept by\n `grid`) are not redrawn for a keystroke. */\n /* What narrowed it, said as the chips say it: the conditions past the tab's own. */\n const tabConditions = new Set(splitConditions(splitQuery(`rows ${filterTabQuery}`).filter).map((c: string) => canonicalize(c)));\n const pastTab = splitConditions(refinedFilter.filter).filter((c: string) => !tabConditions.has(canonicalize(c)));\n /* Said by the records' own noun where the resource names one (\"No homes match\"), not the list's caption, which may\n name a ledger (\"No rent roll match\"). */\n const listNoun = table ? resourceOf(shell().app(), entry.table)?.noun : undefined;\n const things = listNoun?.many ?? caption.toLowerCase();\n const narrowedBy = pastTab.length ? andWords(pastTab.map((c: string) => sayCondition(speaker, c))) : '';\n const noMatchText = narrowedBy\n ? message('filter.noMatches', { things, conditions: narrowedBy })\n : message('filter.noMatchesPlain', { things });\n const noMatches = useMemo(\n () => (\n <Empty\n className=\"list-empty list-no-matches\"\n text={<span className=\"empty-note-title\">{say('noMatches')}</span>}\n detail={noMatchText}\n action={\n <Button size=\"compact\" onClick={() => applyNow.current(clearTo)}>\n {say('common.clear')}\n </Button>\n }\n />\n ),\n [noMatchText, clearTo],\n );\n\n /* The page's own list names itself in the crumb bar — title, count, star —\n with New at the bar's end, instead of a heading band of its own. An\n embedded list, or a list with no bar over it, keeps the heading row. */\n /* The rows, kept as one element for as long as what they are drawn from is\n unchanged. The search box is this room's state, so each character typed\n redrew the room and, with it, the whole grid under the box; now a\n keystroke redraws the box and the chips, and the rows are left alone. */\n const hideKey = hide.join('\\n');\n const keptHide = useMemo(() => hide, [hideKey]); // eslint-disable-line react-hooks/exhaustive-deps\n const totalsKey = totals ? JSON.stringify(totals) : '';\n const keptTotals = useMemo(() => totals, [totalsKey]); // eslint-disable-line react-hooks/exhaustive-deps\n const onGridNow = useRef(onGrid);\n onGridNow.current = onGrid;\n const keptOnGrid = useCallback((result: ResourceHttpSuccess<'/api/run'>) => onGridNow.current(result), []);\n const unrefined = !splitQuery(`rows ${refinement}`).filter.trim();\n /* The words an empty tab says when nothing narrows it past its own condition: the tab's own, else on the first\n tab (where the list opens) the list's, so a list whose first tab is \"Open\" no longer said its authored empty\n only after the reader took the tab away. Other tabs fall back to \"No {things} in {tab}\". */\n const tabOwnEmpty = filterTab >= 0 ? tabs[filterTab].empty : undefined;\n const authoredEmpty = embedded || narrowedPast ? undefined : (tabOwnEmpty ?? (unrefined || filterTab === 0 ? spec.empty : undefined));\n /* A list that says nothing of its own empty state says what belongs in it, by its noun, and offers New where the\n room does: \"No work orders yet. Use New to add the first work order.\" A narrowed list keeps its own words. */\n const noun = resourceOf(shell().app(), entry.table)?.noun;\n const nothingYet =\n !embedded && !spec.empty && unrefined && table ? (\n <ListEmpty\n spec={{\n title: message('common.noYet', { things: noun?.many ?? pluralOf(recordNoun(noun, table.name)) }),\n ...(newButton && !inDashboard ? { description: say('addTheFirst', { thing: recordNoun(noun, table.name) }) } : {}),\n }}\n />\n ) : undefined;\n /* A tab with nothing under it is not a search that missed: it says the tab is empty, by the records' noun and the\n tab's own word, with nothing to clear. Left to the grid, it said nothing at all. */\n const tabEmpty =\n !embedded && !unrefined && !narrowedPast && filterTab >= 0 && table ? (\n <Empty\n className=\"list-empty\"\n text={say('noneInTab', { things: noun?.many ?? pluralOf(recordNoun(noun, table.name)), tab: tabs[filterTab].label ?? '' })}\n />\n ) : undefined;\n const exportOff = !exportOffered(shell().app(), entry.table);\n /* A board's lanes offer New where the room does (BoardList): a boolean, so the room's fresh button each render does\n not redraw the rows. */\n const offersNew = Boolean(newButton) && !embedded && !inDashboard;\n const gridPage = state.page,\n gridSize = pageSize();\n const grid = useMemo(\n () => (\n <div className={`applist-grid${embedded ? '' : ' applist-room'}`}>\n {spec.quickAdd && table && !embedded && !inDashboard && (\n <div className=\"grid-inset\">\n <QuickAdd\n table={table}\n form={spec.form}\n onAdded={() => {\n void client.invalidateQueries({\n queryKey: ['run', connection ?? ''],\n });\n void client.invalidateQueries({\n queryKey: ['count', connection ?? ''],\n });\n }}\n />\n </div>\n )}\n <BoardNewForm.Provider value={offersNew ? (spec.form ?? {}) : null}>\n <RowOpensContext.Provider value={rowOpens}>\n <TableRoom\n entry={gridEntry}\n sizing={spec.sizing}\n chrome={false}\n summaries\n inset={!inDashboard}\n embedded={inDashboard}\n hide={keptHide}\n referenceLabels={referenceLabels}\n totals={keptTotals}\n density={spec.density}\n /* A ⋯ with nothing a reader may run is a dead control and a reserved column; the App payload already says what they may run. */\n rowActions={Boolean(\n spec.rowActions && !spec.presentation && !embedded && mayRunAny(shell().app(), entry.table, spec.actions ?? []),\n )}\n editable={spec.presentation || embedded ? undefined : spec.editable}\n inCrumbs={inCrumbs}\n onResult={keptOnGrid}\n presentation={embedded ? undefined : spec.presentation}\n present={shell().present ?? undefined}\n empty={\n embedded ? undefined : narrowedPast ? (\n noMatches\n ) : authoredEmpty ? (\n <ListEmpty spec={authoredEmpty} />\n ) : (\n (nothingYet ?? tabEmpty)\n )\n }\n actions={embedded ? undefined : spec.actions}\n listLabel={caption}\n order={embedded ? undefined : spec.order}\n export={exportOff ? false : undefined}\n interactive={embedded ? false : undefined}\n />\n </RowOpensContext.Provider>\n </BoardNewForm.Provider>\n </div>\n ),\n [\n gridPage,\n gridSize,\n embedded,\n inDashboard,\n spec,\n table,\n client,\n connection,\n gridEntry,\n keptHide,\n referenceLabels,\n keptTotals,\n inCrumbs,\n keptOnGrid,\n authoredEmpty,\n narrowedPast,\n noMatches,\n filterTab,\n caption,\n exportOff,\n offersNew,\n rowOpens,\n ],\n );\n /* A signed-out visitor reads the storefront, not the tool (docs/design.md,\n public pages): a match count chip and a favourites star are an\n operator's furniture there. */\n const visitor = shell().publicVisitor();\n const title = (\n <>\n <h1 className={`applist-title${spec.heading === false ? ' visually-hidden' : ''}`}>{caption}</h1>\n {typeof gridTotal === 'number' && !visitor && spec.heading !== false && (\n <span className=\"applist-count\" title={say('rowsTheTabAndFilters')}>\n {formatNumber(gridTotal)}\n {gridCapped ? '+' : ''}\n </span>\n )}\n {spec.favorite && spec.id && !visitor && <FavoriteStar favorite={{ kind: 'view', view: spec.id, label: caption }} name={caption} />}\n </>\n );\n return (\n <>\n {boundNames.map((name) => (\n <DefinedBoxes\n key={name}\n column={name}\n binding={bound![name]}\n per={bound![name].per ? oneValue(conditionTail(refinement, bound![name].per!) as string) : undefined}\n onBoxes={onDefinedBoxes}\n />\n ))}\n {inBar && createPortal(title, crumbs.note!)}\n {inCrumbs && !spec.quickAdd && newButton && createPortal(newButton, (crumbs.tools ?? crumbs.head)!)}\n <div className={`applist-head${inBar ? ' in-crumbs' : ''}`}>\n {!inBar && !inDashboard && (\n <div className=\"applist-head-row\" ref={head}>\n {title}\n {ownList ? <div className=\"applist-head-tools\" ref={listHeadRef} /> : !spec.quickAdd && newButton}\n </div>\n )}\n {/* In the layout under a heading, chips or none: a row that appears with the\n first filter shoves everything down a line under a reader's eyes.\n Beside a title in the crumb bar the empty row folds away (features.css). */}\n {!beside && !chipsInBar && <div className=\"applist-chips\">{chipList}</div>}\n </div>\n <div className=\"applist-controls\" role=\"group\" aria-label={say('listControls', { caption })}>\n {(tabs.length > 1 || yours.length > 0) && (\n <div className=\"tabs folds\" ref={tabStrip}>\n <div className=\"tabs-row\" role=\"tablist\">\n {tabs.map((tab, i) => (\n <button\n key={tab.label}\n type=\"button\"\n role=\"tab\"\n className=\"tab\"\n aria-selected={i === litTab && yourLit === -1}\n onClick={() => pickTab(i)}\n {...foldMark(i)}\n >\n <span>{tab.label}</span>\n <TabCount counted={countOf(i)} />\n </button>\n ))}\n {yours.length > 0 && (\n <span className=\"tab-group\" {...foldMark(tabs.length)} aria-hidden=\"true\">\n {tabs.length > 1 && <span className=\"tab-divider\" />}\n <span className=\"tab-group-label\">{store === 'account' ? say('myViews') : say('savedViews')}</span>\n </span>\n )}\n {/* The × is a real button *beside* the tab, not a span inside it:\n interactive-inside-interactive is invalid ARIA. */}\n {yours.map((f, i) => (\n <span key={f.name} className=\"tab-wrap\" role=\"presentation\" {...foldMark(savedAt + i)}>\n <button\n type=\"button\"\n role=\"tab\"\n className=\"tab tab-yours\"\n aria-selected={i === yourLit}\n title={`${viewWords(f.query) || say('everything')} — ${store === 'account' ? say('yourView') : say('aSavedView')}`}\n onClick={() => {\n if (i !== yourLit) {\n state.page = 0;\n apply(f.query);\n }\n }}\n >\n <span>{f.name}</span>\n <TabCount counted={tabCounts?.get(squeeze(`${entry.table} ${f.query}`))} />\n </button>\n {savable && (\n <button\n type=\"button\"\n className=\"tab-x\"\n title={say('common.removeName', { name: f.name })}\n aria-label={say('removeTheView', { name: f.name })}\n onClick={() => writeViews.mutate((views) => withoutView(views, f.name))}\n >\n ×\n </button>\n )}\n </span>\n ))}\n </div>\n <div className=\"tab-more\" data-fold-more=\"\" data-folded={folded.size ? undefined : ''} aria-hidden={!folded.size || undefined}>\n <DropMenu\n className=\"tab-more-menu\"\n triggerClassName=\"tab\"\n label={message('common.more')}\n popupClassName=\"page-actions-popup\"\n align=\"end\"\n >\n {tabs.map((tab, i) =>\n folded.has(i) ? (\n <DropItem key={tab.label} className=\"page-actions-item\" onClick={() => pickTab(i)}>\n <span>{tab.label}</span>\n <TabCount counted={countOf(i)} />\n </DropItem>\n ) : null,\n )}\n {yours.some((_, i) => folded.has(savedAt + i)) && (\n <DropGroup labelClassName=\"more-group-label\" label={store === 'account' ? say('myViews') : say('savedViews')}>\n {yours.map((f, i) =>\n folded.has(savedAt + i) ? (\n <DropItem\n key={f.name}\n className=\"page-actions-item\"\n onClick={() => {\n state.page = 0;\n apply(f.query);\n }}\n >\n {f.name}\n </DropItem>\n ) : null,\n )}\n </DropGroup>\n )}\n </DropMenu>\n </div>\n </div>\n )}\n {spec.filterBar !== 'none' && (\n <form className=\"applist-filterbar\" ref={form} onSubmit={submit}>\n <div className=\"applist-fields\">\n {chipsInBar && table && (\n <ListFilterBar\n table={table}\n boxes={boxes}\n search={searchBox}\n refinement={refinement}\n tabQuery={tabQuery}\n standing={spec.query ?? ''}\n unitOf={unitOf}\n typed={searchBox ? edits[searchBox.column]?.raw : undefined}\n onType={(raw) => {\n if (!searchBox) return;\n /* Now, not on the next paint: the search field's own × asks in the same event. */\n editsNow.current = {\n ...editsNow.current,\n [searchBox.column]: { raw },\n };\n setEdits(editsNow.current);\n }}\n onSearch={() => form.current?.requestSubmit()}\n apply={apply}\n current={currentText}\n residue={residueChip}\n listLabel={caption}\n phone={phone}\n onSheet={() => setSheet(true)}\n />\n )}\n {/* Beside a rail the Sort heads the results with the chips instead. */}\n {spec.sorts?.length && !beside ? (\n <SortMenu\n sorts={spec.sorts}\n sort={spec.sort}\n query={entry.query}\n onPick={(query) => {\n walk.page = 0;\n navigate(query);\n }}\n />\n ) : null}\n {/* The view's own verbs — how to ask, keep and forget the question —\n together at the bar's end, not strewn between the filters. */}\n <div className=\"applist-actions\">\n {railed && railNarrow && railProps && boxes.length > 0 && (\n <button type=\"button\" className=\"applist-toggle\" aria-haspopup=\"dialog\" onClick={() => setSheet(true)}>\n {narrowed ? say('common.filters', { narrowed }) : say('common.filtersButton')}\n </button>\n )}\n {spec.advancedFilters === true && boxes.length > 0 && (\n <button\n type=\"button\"\n className=\"applist-toggle\"\n aria-expanded={showAdvanced}\n onClick={() => {\n setAdvanced(!showAdvanced);\n // Opening an inline editor must not scroll its toggle beneath\n // the sticky trail, leaving the same control impossible to close.\n if (!showAdvanced) setTimeout(() => filter.current?.focus({ preventScroll: true }), 0);\n }}\n >\n {say('advanced')}\n </button>\n )}\n {/* Saving and renaming never both apply: a question already kept is not offered again. */}\n {offerSave && (\n <button\n type=\"button\"\n className=\"applist-toggle\"\n title={store === 'account' ? say('keepThisTabIts') : say('keepThisTabItsFilters')}\n onClick={() => void save()}\n >\n {say('saveView')}\n </button>\n )}\n {savable && yourLit >= 0 && (\n <button type=\"button\" className=\"applist-toggle\" onClick={() => void rename(yours[yourLit])}>\n {say('renameView')}\n </button>\n )}\n </div>\n </div>\n <div className=\"applist-advanced\" hidden={!showAdvanced}>\n <input\n ref={filter}\n type=\"text\"\n className=\"applist-filter\"\n defaultValue={refinement}\n placeholder={naming ? say('contains', { naming }) : say('filterRecords')}\n aria-label={say('filter', { caption })}\n /* The form has no submit button and, beside the search box, two\n fields, so Enter submits by hand rather than by implicit submission. */\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.nativeEvent.isComposing) {\n e.preventDefault();\n form.current?.requestSubmit();\n }\n }}\n />\n </div>\n </form>\n )}\n {/* A phone's Records/Table switch, drawn here by the list (TableView): its own row over the rows cost a\n line of every list's first screen. */}\n {inCrumbs && <span className=\"applist-presentation\" ref={listControlsRef} />}\n </div>\n {beside && railProps ? (\n <div className=\"applist-body has-rail\">\n <aside className=\"filter-rail\" ref={rail} aria-label={say('captionFilters', { caption })}>\n <FilterRail {...railProps} clearAll={false} onChange={apply} status={matched} />\n </aside>\n <div className=\"applist-results\">\n <div className=\"applist-results-head\">\n <div className=\"applist-chips\" role=\"group\" aria-label={say('filtersApplied', { caption })}>\n {chipList}\n {narrowed > 0 && (\n <button\n type=\"button\"\n className=\"applist-chips-clear\"\n onClick={() =>\n apply(\n clearFacets(\n refinement,\n boxes.map((box) => box.column),\n tabQuery,\n ),\n )\n }\n >\n {say('list.clearAll')}\n </button>\n )}\n </div>\n {spec.sorts?.length ? (\n <SortMenu\n sorts={spec.sorts}\n sort={spec.sort}\n query={entry.query}\n onPick={(query) => {\n walk.page = 0;\n navigate(query);\n }}\n />\n ) : null}\n </div>\n <AppColumnMenuContext.Provider value={menuHost}>{grid}</AppColumnMenuContext.Provider>\n </div>\n </div>\n ) : (\n <AppColumnMenuContext.Provider value={menuHost}>{grid}</AppColumnMenuContext.Provider>\n )}\n {/* The phone's pickers: the rail's sheet — for a bar, every filter but the search it keeps in view. */}\n {sheet && railProps && (\n <FilterSheet\n {...railProps}\n boxes={railed ? boxes : boxes.filter((box) => box !== searchBox)}\n onClose={() => setSheet(false)}\n onApply={(text) => {\n setSheet(false);\n apply(text);\n }}\n />\n )}\n </>\n );\n}\n","/**\n * A dashboard's list that works as its room does (`embed(view, { interactive:\n * true })`): the view's own search and filters over the rows the section\n * shows, and, for a reader offered one, its selection with the bulk actions\n * its room offers — the same list component the room draws, so nothing here\n * is a second list. What the reader may do is the room's: the actions ride\n * the App as it was served to this reader, and every write is authorized on\n * the server as it is from the room.\n *\n * The section's question — the view's, its tab, the dashboard's window and\n * picks — is the list's standing condition here, never a chip to remove; the\n * reader's search and filters narrow within it, and the question is the\n * section's own state, so it moves nothing else on the dashboard and no\n * address. Loaded the first time a dashboard holds one (onDemand.tsx).\n */\nimport { useEffect, useMemo, useState } from 'react';\nimport { AppList } from './AppList.js';\nimport { appListQuery, type ListSpec } from './appListModel.js';\nimport type { Section } from './dashboardModel.js';\nimport { splitClauseTail } from '@mistriwork/engine/shared/query.js';\nimport './DashboardList.css';\n\nexport function InteractiveList({\n section,\n source,\n onTotal,\n}: {\n section: Section;\n /** The view's room, as the App was served to this reader. */\n source: ListSpec;\n onTotal: (total: number | undefined) => void;\n}) {\n const spec = useMemo<ListSpec>(() => {\n /* The section's conditions stand; its order (a tab's `sort ship_by`) is the list's default order, never a chip. */\n const { head, tail } = splitClauseTail(section.query ?? '');\n const order = /^(?:sort|order\\s+by)\\s+(.+)$/i.exec(tail)?.[1]?.trim();\n return {\n ...source,\n query: head || undefined,\n /* The section drew one tab; a split's list is its plain grid, as the room's list half is. */\n tabs: undefined,\n presentation: source.presentation?.kind === 'split' ? undefined : source.presentation,\n limit: section.limit ?? 5,\n ...((order ?? section.sort) ? { sort: order ?? section.sort } : {}),\n filterBar: source.filterBar === 'rail' ? 'bar' : source.filterBar,\n };\n }, [source, section.query, section.limit, section.sort]);\n const first = appListQuery(spec);\n const [query, setQuery] = useState(first);\n /* A new window or pick is a new question: the reader's narrowing starts over within it. */\n useEffect(() => setQuery(first), [first]);\n /* The rows are the list's own read, which a write through its actions refreshes as the room's does;\n the dashboard's refresh clock does not re-draw a list a reader may be selecting in. */\n const entry = useMemo(() => ({ table: spec.table, query, view: source.id }), [spec.table, query, source.id]);\n return <AppList entry={entry} spec={spec} navigate={setQuery} inDashboard onTotal={onTotal} />;\n}\n"],"mappings":"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"}