@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.
- package/README.md +4 -3
- package/dist/client/assets/LayoutBuilder-MPzkVU2e.js.map +1 -1
- package/dist/client/assets/index-D2dHI6hR.js.map +1 -1
- package/dist/client/assets/shell-TreN_uLs.js.map +1 -1
- package/dist/docs/access-model.md +1 -1
- package/dist/docs/build-and-deploy.md +0 -1
- package/dist/docs/cli.md +1 -1
- package/dist/docs/glossary.md +3 -3
- package/dist/docs/query.md +9 -21
- package/dist/docs/status.md +3 -3
- package/dist/embed/react/chunks/LayoutBuilder-Cbxa_wve.js.map +1 -1
- package/dist/embed/react/chunks/app-0UZ1Re1k.js.map +1 -1
- package/dist/embed/react/chunks/page-Bx4o1kpQ.js.map +1 -1
- package/dist/embed/react/chunks/palette-Bb7Lf6eo.js.map +1 -1
- package/dist/embed/react/chunks/shell-DZRACiB9.js.map +1 -1
- package/dist/embed/react/chunks/write-BQO4CFc9.js.map +1 -1
- package/dist/embed/react/index.js +1 -1
- package/dist/server/build/dockerfile.js +1 -1
- package/dist/server/cli/usage.js +2 -2
- package/dist/ui/index.js +2 -2
- package/dist/ui/page.js +2 -2
- package/dist/ui/{shared-N4Ej8yRD.js → shared-1PD7TOTJ.js} +5 -5
- package/dist/ui/{shared-N4Ej8yRD.js.map → shared-1PD7TOTJ.js.map} +1 -1
- package/dist/ui/{shared-D5m86-4o.js → shared-1gMnOu9J.js} +6 -6
- package/dist/ui/{shared-D5m86-4o.js.map → shared-1gMnOu9J.js.map} +1 -1
- package/dist/ui/{shared-Ctaj8mR2.js → shared-5RQMi4BR.js} +3 -3
- package/dist/ui/{shared-Ctaj8mR2.js.map → shared-5RQMi4BR.js.map} +1 -1
- package/dist/ui/{shared-DpLeIATZ.js → shared-B-BUF9fx.js} +2 -2
- package/dist/ui/{shared-DpLeIATZ.js.map → shared-B-BUF9fx.js.map} +1 -1
- package/dist/ui/{shared-DWYnjItP.js → shared-B-MhiPIN.js} +9 -9
- package/dist/ui/{shared-DWYnjItP.js.map → shared-B-MhiPIN.js.map} +1 -1
- package/dist/ui/{shared-0fNuhSbG.js → shared-B07qIMlE.js} +5 -5
- package/dist/ui/{shared-0fNuhSbG.js.map → shared-B07qIMlE.js.map} +1 -1
- package/dist/ui/{shared-lYtMadRU.js → shared-B1SAS_J-.js} +3 -3
- package/dist/ui/{shared-lYtMadRU.js.map → shared-B1SAS_J-.js.map} +1 -1
- package/dist/ui/{shared-CpI0Y8M5.js → shared-B4jgU8h9.js} +6 -6
- package/dist/ui/{shared-CpI0Y8M5.js.map → shared-B4jgU8h9.js.map} +1 -1
- package/dist/ui/{shared-Cxu1c35l.js → shared-B5aBCUi7.js} +30 -30
- package/dist/ui/{shared-Cxu1c35l.js.map → shared-B5aBCUi7.js.map} +1 -1
- package/dist/ui/{shared-CAe-US1q.js → shared-B9H7_Pji.js} +5 -5
- package/dist/ui/{shared-CAe-US1q.js.map → shared-B9H7_Pji.js.map} +1 -1
- package/dist/ui/{shared-Q2bgBaYo.js → shared-BAXr20S-.js} +4 -4
- package/dist/ui/{shared-Q2bgBaYo.js.map → shared-BAXr20S-.js.map} +1 -1
- package/dist/ui/{shared-CyEefFFb.js → shared-BDDUzH-f.js} +19 -19
- package/dist/ui/{shared-CyEefFFb.js.map → shared-BDDUzH-f.js.map} +1 -1
- package/dist/ui/{shared-BdhPI6dq.js → shared-BGmkeDeW.js} +3 -3
- package/dist/ui/{shared-BdhPI6dq.js.map → shared-BGmkeDeW.js.map} +1 -1
- package/dist/ui/{shared-DONIpq2q.js → shared-BHCQ60yN.js} +2 -2
- package/dist/ui/{shared-DONIpq2q.js.map → shared-BHCQ60yN.js.map} +1 -1
- package/dist/ui/{shared-CNmaAv64.js → shared-BHsjawAG.js} +8 -8
- package/dist/ui/{shared-CNmaAv64.js.map → shared-BHsjawAG.js.map} +1 -1
- package/dist/ui/{shared-DgjU9kOy.js → shared-BIQuK_nq.js} +4 -4
- package/dist/ui/{shared-DgjU9kOy.js.map → shared-BIQuK_nq.js.map} +1 -1
- package/dist/ui/{shared-icSQAj21.js → shared-BOe4W2FI.js} +3 -3
- package/dist/ui/{shared-icSQAj21.js.map → shared-BOe4W2FI.js.map} +1 -1
- package/dist/ui/{shared-BlxoOJSk.js → shared-BPpC08ip.js} +3 -3
- package/dist/ui/{shared-BlxoOJSk.js.map → shared-BPpC08ip.js.map} +1 -1
- package/dist/ui/{shared-BtiFL37J.js → shared-BdA3LPCB.js} +2 -2
- package/dist/ui/{shared-BtiFL37J.js.map → shared-BdA3LPCB.js.map} +1 -1
- package/dist/ui/{shared-CvR94vn4.js → shared-Be3nbWsd.js} +11 -11
- package/dist/ui/{shared-CvR94vn4.js.map → shared-Be3nbWsd.js.map} +1 -1
- package/dist/ui/{shared-Bl_nF_IH.js → shared-Bf30ZLoS.js} +8 -4
- package/dist/ui/shared-Bf30ZLoS.js.map +1 -0
- package/dist/ui/{shared-DijrJ_V-.js → shared-BguP_BaR.js} +7 -7
- package/dist/ui/{shared-DijrJ_V-.js.map → shared-BguP_BaR.js.map} +1 -1
- package/dist/ui/{shared-DPAVoWY0.js → shared-BoLbc2WD.js} +17 -2
- package/dist/ui/{shared-DPAVoWY0.js.map → shared-BoLbc2WD.js.map} +1 -1
- package/dist/ui/{shared-BkdBTYwx.js → shared-BttyOW4W.js} +3 -3
- package/dist/ui/{shared-BkdBTYwx.js.map → shared-BttyOW4W.js.map} +1 -1
- package/dist/ui/{shared-CQWLz8uT.js → shared-BumxsBlA.js} +10 -10
- package/dist/ui/{shared-CQWLz8uT.js.map → shared-BumxsBlA.js.map} +1 -1
- package/dist/ui/{shared-Dzu7tFiC.js → shared-Bw73ktBk.js} +3 -3
- package/dist/ui/{shared-Dzu7tFiC.js.map → shared-Bw73ktBk.js.map} +1 -1
- package/dist/ui/{shared-BhAYErSx.js → shared-C1B0GH0e.js} +4 -4
- package/dist/ui/{shared-BhAYErSx.js.map → shared-C1B0GH0e.js.map} +1 -1
- package/dist/ui/{shared-BQJQcGgj.js → shared-C2FsyYr7.js} +4 -4
- package/dist/ui/{shared-BQJQcGgj.js.map → shared-C2FsyYr7.js.map} +1 -1
- package/dist/ui/{shared-B9lw2Ryh.js → shared-C2RU1qjv.js} +4 -4
- package/dist/ui/{shared-B9lw2Ryh.js.map → shared-C2RU1qjv.js.map} +1 -1
- package/dist/ui/{shared-DQYNI9wO.js → shared-C42f07hJ.js} +5 -5
- package/dist/ui/{shared-DQYNI9wO.js.map → shared-C42f07hJ.js.map} +1 -1
- package/dist/ui/{shared-CqCZ8wMY.js → shared-C4LkPCU4.js} +3 -3
- package/dist/ui/{shared-CqCZ8wMY.js.map → shared-C4LkPCU4.js.map} +1 -1
- package/dist/ui/{shared-BhtpgOpa.js → shared-C4wSfz6k.js} +9 -9
- package/dist/ui/{shared-BhtpgOpa.js.map → shared-C4wSfz6k.js.map} +1 -1
- package/dist/ui/{shared-BHc2Izkj.js → shared-C9DZtSFH.js} +2 -2
- package/dist/ui/{shared-BHc2Izkj.js.map → shared-C9DZtSFH.js.map} +1 -1
- package/dist/ui/{shared-DW1YuiNS.js → shared-CA52ClGo.js} +2 -2
- package/dist/ui/{shared-DW1YuiNS.js.map → shared-CA52ClGo.js.map} +1 -1
- package/dist/ui/{shared-BbSbilkh.js → shared-CBciTwm6.js} +9 -9
- package/dist/ui/{shared-BbSbilkh.js.map → shared-CBciTwm6.js.map} +1 -1
- package/dist/ui/{shared-C-J32eBn.js → shared-CL3RLKDA.js} +16 -16
- package/dist/ui/{shared-C-J32eBn.js.map → shared-CL3RLKDA.js.map} +1 -1
- package/dist/ui/{shared-Ck8S4OxW.js → shared-CLq3-_hW.js} +3 -3
- package/dist/ui/{shared-Ck8S4OxW.js.map → shared-CLq3-_hW.js.map} +1 -1
- package/dist/ui/{shared-Q5WefT7G.js → shared-CMjK-Ucd.js} +3 -3
- package/dist/ui/{shared-Q5WefT7G.js.map → shared-CMjK-Ucd.js.map} +1 -1
- package/dist/ui/{shared-D3MAuEA3.js → shared-CPjpSFGh.js} +2 -2
- package/dist/ui/{shared-D3MAuEA3.js.map → shared-CPjpSFGh.js.map} +1 -1
- package/dist/ui/{shared-VshXGwXP.js → shared-CSPhENq3.js} +2 -2
- package/dist/ui/{shared-VshXGwXP.js.map → shared-CSPhENq3.js.map} +1 -1
- package/dist/ui/{shared-DJrJaE73.js → shared-CZJE4Bmp.js} +3 -3
- package/dist/ui/{shared-DJrJaE73.js.map → shared-CZJE4Bmp.js.map} +1 -1
- package/dist/ui/{shared-D7ONOwI7.js → shared-C_BhUL2I.js} +7 -7
- package/dist/ui/{shared-D7ONOwI7.js.map → shared-C_BhUL2I.js.map} +1 -1
- package/dist/ui/{shared-j-2peBIB.js → shared-CbeujwdU.js} +4 -4
- package/dist/ui/{shared-j-2peBIB.js.map → shared-CbeujwdU.js.map} +1 -1
- package/dist/ui/{shared-D5GrOEa2.js → shared-Cbf-o4Dt.js} +4 -4
- package/dist/ui/{shared-D5GrOEa2.js.map → shared-Cbf-o4Dt.js.map} +1 -1
- package/dist/ui/{shared-HwiPIajr.js → shared-CdNmeNHh.js} +3 -3
- package/dist/ui/{shared-HwiPIajr.js.map → shared-CdNmeNHh.js.map} +1 -1
- package/dist/ui/{shared-ZCFt-CPb.js → shared-CdQOMD8J.js} +3 -3
- package/dist/ui/{shared-ZCFt-CPb.js.map → shared-CdQOMD8J.js.map} +1 -1
- package/dist/ui/{shared-ClhXSGGK.js → shared-CdiPYlTh.js} +2 -2
- package/dist/ui/{shared-ClhXSGGK.js.map → shared-CdiPYlTh.js.map} +1 -1
- package/dist/ui/{shared-DA8_pVRZ.js → shared-CepLAhwm.js} +2 -2
- package/dist/ui/{shared-DA8_pVRZ.js.map → shared-CepLAhwm.js.map} +1 -1
- package/dist/ui/{shared-BrYKjrnM.js → shared-Ch82h_Fu.js} +6 -6
- package/dist/ui/{shared-BrYKjrnM.js.map → shared-Ch82h_Fu.js.map} +1 -1
- package/dist/ui/{shared-C4UrE8Fb.js → shared-Chp88all.js} +3 -3
- package/dist/ui/{shared-C4UrE8Fb.js.map → shared-Chp88all.js.map} +1 -1
- package/dist/ui/{shared-CWa80DTO.js → shared-Ci16s2rN.js} +9 -9
- package/dist/ui/{shared-CWa80DTO.js.map → shared-Ci16s2rN.js.map} +1 -1
- package/dist/ui/{shared-tksTLD6Q.js → shared-CiqNkoE1.js} +5 -5
- package/dist/ui/{shared-tksTLD6Q.js.map → shared-CiqNkoE1.js.map} +1 -1
- package/dist/ui/{shared-yt7DjSrq.js → shared-CpMhOq8F.js} +2 -2
- package/dist/ui/{shared-yt7DjSrq.js.map → shared-CpMhOq8F.js.map} +1 -1
- package/dist/ui/{shared-Dm0z5WUl.js → shared-CrWv5JKH.js} +6 -6
- package/dist/ui/{shared-Dm0z5WUl.js.map → shared-CrWv5JKH.js.map} +1 -1
- package/dist/ui/{shared-CQL3FGHc.js → shared-Csfi3Pti.js} +2 -2
- package/dist/ui/{shared-CQL3FGHc.js.map → shared-Csfi3Pti.js.map} +1 -1
- package/dist/ui/{shared-BKNRbm-V.js → shared-CuZt26rm.js} +2 -2
- package/dist/ui/{shared-BKNRbm-V.js.map → shared-CuZt26rm.js.map} +1 -1
- package/dist/ui/{shared-Guq3upiR.js → shared-Cws_z-TS.js} +2 -2
- package/dist/ui/{shared-Guq3upiR.js.map → shared-Cws_z-TS.js.map} +1 -1
- package/dist/ui/{shared-Bw_qZeIj.js → shared-D1KWuCg6.js} +2 -2
- package/dist/ui/{shared-Bw_qZeIj.js.map → shared-D1KWuCg6.js.map} +1 -1
- package/dist/ui/{shared-CuCZKwXW.js → shared-D66ju_Cb.js} +23 -23
- package/dist/ui/{shared-CuCZKwXW.js.map → shared-D66ju_Cb.js.map} +1 -1
- package/dist/ui/{shared-DYfX7NSM.js → shared-DGaQZXnw.js} +2 -2
- package/dist/ui/{shared-DYfX7NSM.js.map → shared-DGaQZXnw.js.map} +1 -1
- package/dist/ui/{shared-B3Hp8tOv.js → shared-DHy41sET.js} +6 -6
- package/dist/ui/{shared-B3Hp8tOv.js.map → shared-DHy41sET.js.map} +1 -1
- package/dist/ui/{shared-CXyd7IKi.js → shared-DKEOMQ6l.js} +2 -2
- package/dist/ui/{shared-CXyd7IKi.js.map → shared-DKEOMQ6l.js.map} +1 -1
- package/dist/ui/{shared-Ccmc8YO0.js → shared-DSUICuaJ.js} +33 -33
- package/dist/ui/{shared-Ccmc8YO0.js.map → shared-DSUICuaJ.js.map} +1 -1
- package/dist/ui/{shared-CL2iw_js.js → shared-DUPMRoO0.js} +13 -13
- package/dist/ui/{shared-CL2iw_js.js.map → shared-DUPMRoO0.js.map} +1 -1
- package/dist/ui/{shared-Dtp4eRul.js → shared-DVfdm6ah.js} +2 -2
- package/dist/ui/{shared-Dtp4eRul.js.map → shared-DVfdm6ah.js.map} +1 -1
- package/dist/ui/{shared-BJ5Ex32G.js → shared-DXM7d7lJ.js} +3 -3
- package/dist/ui/{shared-BJ5Ex32G.js.map → shared-DXM7d7lJ.js.map} +1 -1
- package/dist/ui/{shared-BFr6ld0e.js → shared-DXbMlcev.js} +2 -2
- package/dist/ui/{shared-BFr6ld0e.js.map → shared-DXbMlcev.js.map} +1 -1
- package/dist/ui/{shared-BUp3jv-N.js → shared-D_SkPtJ9.js} +6 -6
- package/dist/ui/{shared-BUp3jv-N.js.map → shared-D_SkPtJ9.js.map} +1 -1
- package/dist/ui/{shared-CdNomVzH.js → shared-Dd21k2ic.js} +4 -4
- package/dist/ui/{shared-CdNomVzH.js.map → shared-Dd21k2ic.js.map} +1 -1
- package/dist/ui/{shared-gRMbxmpu.js → shared-Dh0nHtLZ.js} +8 -8
- package/dist/ui/{shared-gRMbxmpu.js.map → shared-Dh0nHtLZ.js.map} +1 -1
- package/dist/ui/{shared-BKGJgjog.js → shared-DkOdSpSK.js} +3 -3
- package/dist/ui/{shared-BKGJgjog.js.map → shared-DkOdSpSK.js.map} +1 -1
- package/dist/ui/{shared-BMsh72Uq.js → shared-Dkph5ckT.js} +2 -2
- package/dist/ui/{shared-BMsh72Uq.js.map → shared-Dkph5ckT.js.map} +1 -1
- package/dist/ui/{shared-Be1HpDOB.js → shared-Dl1_Nx--.js} +3 -3
- package/dist/ui/{shared-Be1HpDOB.js.map → shared-Dl1_Nx--.js.map} +1 -1
- package/dist/ui/{shared-BQIZWOoJ.js → shared-Dm0IGbAf.js} +2 -2
- package/dist/ui/{shared-BQIZWOoJ.js.map → shared-Dm0IGbAf.js.map} +1 -1
- package/dist/ui/{shared-DSUtcU5S.js → shared-DnIkTpPr.js} +5 -5
- package/dist/ui/{shared-DSUtcU5S.js.map → shared-DnIkTpPr.js.map} +1 -1
- package/dist/ui/{shared-DsxGbYlV.js → shared-Docl_0tq.js} +3 -3
- package/dist/ui/{shared-DsxGbYlV.js.map → shared-Docl_0tq.js.map} +1 -1
- package/dist/ui/{shared-DZskrV26.js → shared-DprrHC72.js} +2 -2
- package/dist/ui/{shared-DZskrV26.js.map → shared-DprrHC72.js.map} +1 -1
- package/dist/ui/{shared-Bmw43Hwf.js → shared-DyKsJTZs.js} +2 -2
- package/dist/ui/{shared-Bmw43Hwf.js.map → shared-DyKsJTZs.js.map} +1 -1
- package/dist/ui/{shared-BLG88Pya.js → shared-FO7vfI3F.js} +4 -4
- package/dist/ui/{shared-BLG88Pya.js.map → shared-FO7vfI3F.js.map} +1 -1
- package/dist/ui/{shared-DLSd80D1.js → shared-HalAVHjv.js} +3 -3
- package/dist/ui/{shared-DLSd80D1.js.map → shared-HalAVHjv.js.map} +1 -1
- package/dist/ui/{shared-D1mMBLdj.js → shared-JvcI-LWp.js} +15 -15
- package/dist/ui/{shared-D1mMBLdj.js.map → shared-JvcI-LWp.js.map} +1 -1
- package/dist/ui/{shared-C6Hv_4O0.js → shared-K7Ym27yg.js} +2 -2
- package/dist/ui/{shared-C6Hv_4O0.js.map → shared-K7Ym27yg.js.map} +1 -1
- package/dist/ui/{shared-B39ln7oi.js → shared-SzlnwfJO.js} +3 -3
- package/dist/ui/{shared-B39ln7oi.js.map → shared-SzlnwfJO.js.map} +1 -1
- package/dist/ui/{shared-DgPn_Jll.js → shared-TrGbd1FY.js} +3 -3
- package/dist/ui/{shared-DgPn_Jll.js.map → shared-TrGbd1FY.js.map} +1 -1
- package/dist/ui/{shared-DrFb-XtA.js → shared-WhbuObEW.js} +2 -2
- package/dist/ui/{shared-DrFb-XtA.js.map → shared-WhbuObEW.js.map} +1 -1
- package/dist/ui/{shared-DiFQljcq.js → shared-XcSKDp6N.js} +11 -11
- package/dist/ui/{shared-DiFQljcq.js.map → shared-XcSKDp6N.js.map} +1 -1
- package/dist/ui/{shared-CMAg58rY.js → shared-Z4uBJU6I.js} +7 -6
- package/dist/ui/shared-Z4uBJU6I.js.map +1 -0
- package/dist/ui/{shared-BnUptuUp.js → shared-bAgeiRa5.js} +2 -2
- package/dist/ui/{shared-BnUptuUp.js.map → shared-bAgeiRa5.js.map} +1 -1
- package/dist/ui/{shared-BxMvSjey.js → shared-cgXG7OgZ.js} +5 -5
- package/dist/ui/{shared-BxMvSjey.js.map → shared-cgXG7OgZ.js.map} +1 -1
- package/dist/ui/{shared-u4CG2kQJ.js → shared-eZ0SB_zm.js} +2 -2
- package/dist/ui/{shared-u4CG2kQJ.js.map → shared-eZ0SB_zm.js.map} +1 -1
- package/dist/ui/{shared-L90bWW8e.js → shared-frKFb79C.js} +2 -2
- package/dist/ui/{shared-L90bWW8e.js.map → shared-frKFb79C.js.map} +1 -1
- package/dist/ui/{shared-Dd34nhkw.js → shared-hAayNSRA.js} +3 -3
- package/dist/ui/{shared-Dd34nhkw.js.map → shared-hAayNSRA.js.map} +1 -1
- package/dist/ui/{shared-DzC64cpp.js → shared-j_J16p2B.js} +2 -2
- package/dist/ui/{shared-DzC64cpp.js.map → shared-j_J16p2B.js.map} +1 -1
- package/dist/ui/{shared-DX7HRIV-.js → shared-tqpl5N3g.js} +6 -6
- package/dist/ui/{shared-DX7HRIV-.js.map → shared-tqpl5N3g.js.map} +1 -1
- package/dist/ui/{shared-BS5dBMpA.js → shared-y-6_ZDts.js} +2 -2
- package/dist/ui/{shared-BS5dBMpA.js.map → shared-y-6_ZDts.js.map} +1 -1
- package/dist/ui/{shared-Cv5v_MP1.js → shared-zG6e1Rhz.js} +13 -13
- package/dist/ui/{shared-Cv5v_MP1.js.map → shared-zG6e1Rhz.js.map} +1 -1
- package/dist/ui/testing.js +1 -1
- package/package.json +4 -4
- package/dist/docs/cli-browser.md +0 -232
- package/dist/docs/database-browser.md +0 -115
- package/dist/docs/keyboard.md +0 -63
- package/dist/docs/mcp.md +0 -86
- package/dist/ui/shared-Bl_nF_IH.js.map +0 -1
- package/dist/ui/shared-CMAg58rY.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { c as computedColumnMeta } from "./shared-poc11xxo.js";
|
|
2
|
-
import { D as refsFrom, J as rollupColumnMeta, d as findTable } from "./shared-
|
|
2
|
+
import { D as refsFrom, J as rollupColumnMeta, d as findTable } from "./shared-BoLbc2WD.js";
|
|
3
3
|
// packages/kit/src/client/components/listColumn.ts
|
|
4
4
|
var own = (table, name) => table.columns.find((column) => column.name === name) ?? (table.rollups && Object.hasOwn(table.rollups, name) ? rollupColumnMeta(name, table.rollups[name]) : void 0) ?? (table.computed && Object.hasOwn(table.computed, name) ? computedColumnMeta(name, table.computed[name]) : void 0);
|
|
5
5
|
function listColumn(table, name) {
|
|
@@ -40,4 +40,4 @@ function namedCell(table, name, row, referenceLabels) {
|
|
|
40
40
|
}
|
|
41
41
|
export { namedCell as n, listColumn as t };
|
|
42
42
|
|
|
43
|
-
//# sourceMappingURL=shared-
|
|
43
|
+
//# sourceMappingURL=shared-DyKsJTZs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-
|
|
1
|
+
{"version":3,"file":"shared-DyKsJTZs.js","names":[],"sources":["../../../kit/src/client/components/listColumn.ts"],"sourcesContent":["/**\n * The column a card's or a queue's said value dresses as: the row's own\n * column, a rollup of the row (rollups.ts), or through one reference the\n * target's column or rollup (`category_id.products`). A path keeps its full\n * name, which is what the answer's row is keyed by and what the App's\n * display rules and captions are written against.\n */\nimport type { ColumnMeta, TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport { rollupColumnMeta } from '@mistriwork/engine/shared/rollups.js';\nimport { computedColumnMeta } from '@mistriwork/engine/shared/computed.js';\nimport { findTable, refsFrom } from '../core.js';\n\nconst own = (table: TableMeta, name: string): ColumnMeta | undefined =>\n table.columns.find((column) => column.name === name) ??\n (table.rollups && Object.hasOwn(table.rollups, name) ? rollupColumnMeta(name, table.rollups[name]) : undefined) ??\n (table.computed && Object.hasOwn(table.computed, name) ? computedColumnMeta(name, table.computed[name]) : undefined);\n\nexport function listColumn(table: TableMeta, name: string | undefined): ColumnMeta | undefined {\n if (!name) return undefined;\n if (!name.includes('.')) return own(table, name);\n const [reference, terminal] = name.split('.');\n const fk = refsFrom(table.id).find((candidate) => candidate.from.columns.length === 1 && candidate.from.columns[0] === reference);\n const target = fk ? (findTable(fk.to.table) as TableMeta | undefined) : undefined;\n const column = target && own(target, terminal);\n return column ? { ...column, name } : undefined;\n}\n\n/**\n * What a card or a queue says for `name` in one row: where `name` is a\n * reference the list fetched a name for (appListModel's referenceNames), the\n * record's name, dressed as the column it is read from — `partner_id` said as\n * `partner_id.code` — or, for a computed name (`$label`), as plain text. A\n * reference whose name did not come back is said by its key, as before.\n */\nexport function namedCell(\n table: TableMeta,\n name: string,\n row: Record<string, unknown>,\n referenceLabels?: Record<string, string>,\n): { column: ColumnMeta | undefined; value: unknown } {\n const at = referenceLabels && Object.hasOwn(referenceLabels, name) ? referenceLabels[name] : undefined;\n const named = at === undefined ? undefined : row[at];\n if (at === undefined || named === null || named === undefined || named === '')\n return { column: listColumn(table, name), value: row[name] };\n return { column: listColumn(table, at) ?? { name: at, type: 'text', nullable: true, primaryKey: false }, value: named };\n}\n"],"mappings":";;;AAYA,IAAM,OAAO,OAAkB,SAC7B,MAAM,QAAQ,MAAM,WAAW,OAAO,SAAS,IAAI,MAClD,MAAM,WAAW,OAAO,OAAO,MAAM,SAAS,IAAI,IAAI,iBAAiB,MAAM,MAAM,QAAQ,KAAK,IAAI,KAAA,OACpG,MAAM,YAAY,OAAO,OAAO,MAAM,UAAU,IAAI,IAAI,mBAAmB,MAAM,MAAM,SAAS,KAAK,IAAI,KAAA;AAE5G,SAAgB,WAAW,OAAkB,MAAkD;CAC7F,IAAI,CAAC,MAAM,OAAO,KAAA;CAClB,IAAI,CAAC,KAAK,SAAS,GAAG,GAAG,OAAO,IAAI,OAAO,IAAI;CAC/C,MAAM,CAAC,WAAW,YAAY,KAAK,MAAM,GAAG;CAC5C,MAAM,KAAK,SAAS,MAAM,EAAE,CAAC,CAAC,MAAM,cAAc,UAAU,KAAK,QAAQ,WAAW,KAAK,UAAU,KAAK,QAAQ,OAAO,SAAS;CAChI,MAAM,SAAS,KAAM,UAAU,GAAG,GAAG,KAAK,IAA8B,KAAA;CACxE,MAAM,SAAS,UAAU,IAAI,QAAQ,QAAQ;CAC7C,OAAO,SAAS;EAAE,GAAG;EAAQ;CAAK,IAAI,KAAA;AACxC;;;;;;;;AASA,SAAgB,UACd,OACA,MACA,KACA,iBACoD;CACpD,MAAM,KAAK,mBAAmB,OAAO,OAAO,iBAAiB,IAAI,IAAI,gBAAgB,QAAQ,KAAA;CAC7F,MAAM,QAAQ,OAAO,KAAA,IAAY,KAAA,IAAY,IAAI;CACjD,IAAI,OAAO,KAAA,KAAa,UAAU,QAAQ,UAAU,KAAA,KAAa,UAAU,IACzE,OAAO;EAAE,QAAQ,WAAW,OAAO,IAAI;EAAG,OAAO,IAAI;CAAM;CAC7D,OAAO;EAAE,QAAQ,WAAW,OAAO,EAAE,KAAK;GAAE,MAAM;GAAI,MAAM;GAAQ,UAAU;GAAM,YAAY;EAAM;EAAG,OAAO;CAAM;AACxH"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Z as Empty, nt as Button, rt as buttonClass } from "./shared-poc11xxo.js";
|
|
2
2
|
import { Vt as formatBytes, gt as defineMessages } from "./shared-DJZjSi3J.js";
|
|
3
|
-
import { L as DropItem, R as DropMenu } from "./shared-
|
|
4
|
-
import { B as toast } from "./shared-
|
|
3
|
+
import { L as DropItem, R as DropMenu } from "./shared-BHsjawAG.js";
|
|
4
|
+
import { B as toast } from "./shared-BoLbc2WD.js";
|
|
5
5
|
import { t as Modal } from "./shared-CRr4kJXB.js";
|
|
6
|
-
import { t as onDemand } from "./shared-
|
|
6
|
+
import { t as onDemand } from "./shared-B-BUF9fx.js";
|
|
7
7
|
import { t as Field } from "./shared-CERG8O1B.js";
|
|
8
8
|
import { useRef, useState } from "react";
|
|
9
9
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -379,4 +379,4 @@ function RemoveConfirm({ item, onClose }) {
|
|
|
379
379
|
}
|
|
380
380
|
export { AttachmentList, fileToBase64 };
|
|
381
381
|
|
|
382
|
-
//# sourceMappingURL=shared-
|
|
382
|
+
//# sourceMappingURL=shared-FO7vfI3F.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-BLG88Pya.js","names":["_Fragment"],"sources":["../../../kit/src/client/components/filePreviewModel.ts","../../../kit/src/client/copy/record/components/AttachmentList.ts","../../../kit/src/client/components/AttachmentList.tsx"],"sourcesContent":["/**\n * Which files open in a preview (FilePreview.tsx), and what a preview is\n * handed. Apart from the preview itself, which is loaded the first time a\n * file is opened: a list of attachments needs only to know which names are\n * worth a button.\n */\ntype PreviewKind = 'image' | 'pdf' | 'text' | 'video' | 'audio';\n\nconst IMAGE = /^(png|jpe?g|gif|webp|avif|bmp)$/;\nconst VIDEO = /^(mp4|m4v|mov|webm|ogv)$/;\nconst AUDIO = /^(mp3|m4a|wav|ogg|oga|opus|flac)$/;\nconst TEXT = /^(txt|text|md|markdown|csv|tsv|json|log|xml|ya?ml|ini|toml|sql|ts|js|css|html?)$/;\n\n/** Which viewer a file opens in, read from its name and its stored type; undefined is download-only. */\nexport function previewKind(name: string, type?: string): PreviewKind | undefined {\n const dot = name.lastIndexOf('.');\n const ext = dot > 0 ? name.slice(dot + 1).toLowerCase() : '';\n const claimed = (type ?? '').toLowerCase();\n if (IMAGE.test(ext) || /^image\\/(png|jpeg|gif|webp|avif|bmp)$/.test(claimed)) return 'image';\n if (ext === 'pdf' || claimed === 'application/pdf') return 'pdf';\n if (VIDEO.test(ext) || claimed.startsWith('video/')) return 'video';\n if (AUDIO.test(ext) || claimed.startsWith('audio/')) return 'audio';\n if (TEXT.test(ext) || claimed.startsWith('text/') || claimed === 'application/json') return 'text';\n return undefined;\n}\n\nexport interface PreviewFile {\n name: string;\n kind: PreviewKind;\n /** The download address: the bytes a PDF or a text is read from. */\n href: string;\n /** A picture's address in the file route's inline mode. */\n inline?: string;\n}\n","/** What AttachmentList says, in the record page room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n download: 'Download',\n isOverTheLimit: '“{name}” is over the {maxBytes} limit for a file.',\n attached: 'Attached “{attached}”',\n attachedFiles: { one: 'Attached {count} file', other: 'Attached {count} files' },\n attaching: 'Attaching…',\n orDropFilesHere: 'or drop files here',\n preview: 'Preview {name}',\n downloadName: 'Download {name}',\n more: 'More for {name}',\n detailsItem: 'Details',\n removeMore: 'Remove…',\n aFileNeedsAName: 'A file needs a name.',\n fileName: 'File name',\n removeName: 'Remove {name}?',\n removeQuotedNameQuestion: 'Remove “{name}”?',\n theFileIsDeleted: 'The file is deleted for everyone who can see this record, and Undo cannot bring it back.',\n keep: 'Keep',\n removing: 'Removing…',\n});\n","/**\n * A related list over a resource whose rows are files, drawn as attachments:\n * each file by name with its size and when it came, a Download beside it,\n * and — for a picture, a PDF or text — a preview in place (FilePreview.tsx).\n * Where the resource lets this reader, a file is renamed in its row and\n * removed from its More menu. Where the list may add, an Attach button sits\n * in a drop area drawn as one. A file past the resource's cap is refused\n * here with the reason, before any of it is read.\n */\nimport { useRef, useState, type ReactNode } from 'react';\nimport { formatBytes } from '../locale.js';\nimport { toast } from '../core.js';\nimport { Empty } from './Notes.js';\nimport { Button, buttonClass } from '@mistriwork/ui/Button.js';\nimport { Field } from '@mistriwork/ui/Field.js';\nimport { Modal, type ModalHandle } from '@mistriwork/ui/Modal.js';\nimport { DropItem, DropMenu } from '@mistriwork/ui/DropMenu.js';\nimport { previewKind, type PreviewFile } from './filePreviewModel.js';\nimport { onDemand } from './onDemand.js';\nimport { say } from '../copy/record/components/AttachmentList.js';\n\n/* The preview draws its own dialog, fetched the first time a file is opened. */\nconst FilePreview = onDemand(() => import('./FilePreview.js'), 'FilePreview', { quiet: true });\n\n/** What a row may do answers null when it was done, or why it was not. */\ntype Outcome = Promise<string | null>;\n\ninterface AttachmentItem {\n id: string;\n name: string;\n /** The download address. */\n href: string;\n /** In a tenant App, where a file has no address (fileSource.ts): saving reads it on the lease instead of following `href`. */\n save?: () => Promise<void>;\n meta: string[];\n /** The stored media type, where the resource keeps one: which viewer to try, never trusted for the bytes. */\n type?: string;\n /** A picture's address in the file route's inline mode, for its preview. */\n inline?: string;\n onOpen?: () => void;\n /** Present where this reader may change the file's name. */\n rename?: (name: string) => Outcome;\n /** Present where this reader may delete the file. */\n remove?: () => Outcome;\n}\n\ninterface AttachmentListProps {\n items: AttachmentItem[];\n emptyText: string;\n empty?: ReactNode;\n /** Present where the list may add: `send` answers null, or why nothing was attached. */\n upload?: { label: string; maxBytes: number; send: (file: File) => Promise<string | null> };\n}\n\n/** A file's bytes as base64, in slices, so a large file does not overflow the argument list. */\nexport async function fileToBase64(file: Blob): Promise<string> {\n const bytes = new Uint8Array(await file.arrayBuffer());\n let text = '';\n for (let i = 0; i < bytes.length; i += 0x8000) text += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n return btoa(text);\n}\n\n/* A link that is saved from the lease rather than followed, where the file has no address of its own. */\nconst saveOnLease = (item: AttachmentItem) =>\n item.save\n ? (event: { preventDefault(): void }) => {\n event.preventDefault();\n void item.save!().catch((error: Error) => toast(error.message, 'error'));\n }\n : undefined;\n\n/* The extension, as a file manager shows it: a short word, not an icon set. */\nconst badge = (name: string) => {\n const dot = name.lastIndexOf('.');\n const ext =\n dot > 0\n ? name\n .slice(dot + 1)\n .slice(0, 4)\n .toUpperCase()\n : '';\n return ext || 'FILE';\n};\n\nexport function AttachmentList({ items, emptyText, empty, upload }: AttachmentListProps) {\n const [over, setOver] = useState(false);\n const [busy, setBusy] = useState(false);\n const [said, setSaid] = useState<{ text: string; error: boolean }>();\n const input = useRef<HTMLInputElement>(null);\n const [previewing, setPreviewing] = useState<PreviewFile>();\n const [renaming, setRenaming] = useState<string>();\n const [removing, setRemoving] = useState<AttachmentItem>();\n /* Where focus goes back to once a preview closes: the name that opened it. */\n const back = useRef<HTMLElement | null>(null);\n\n const take = async (files: File[]) => {\n if (!upload || busy || !files.length) return;\n setBusy(true);\n setSaid(undefined);\n const attached: string[] = [];\n const refused: string[] = [];\n for (const file of files) {\n if (file.size > upload.maxBytes) {\n refused.push(say('isOverTheLimit', { name: file.name, maxBytes: formatBytes(upload.maxBytes) }));\n continue;\n }\n const why = await upload.send(file);\n if (why) refused.push(why);\n else attached.push(file.name);\n }\n setBusy(false);\n if (refused.length) setSaid({ text: refused.join(' '), error: true });\n else\n setSaid({\n text: attached.length === 1 ? say('attached', { attached: attached[0] }) : say('attachedFiles', { count: attached.length }),\n error: false,\n });\n };\n\n const carriesFiles = (types: readonly string[]) => types.includes('Files');\n const previewOf = (item: AttachmentItem): PreviewFile | undefined => {\n /* A viewer reads its file by address; a file on a lease has none, so it is saved instead. */\n if (item.save) return undefined;\n const kind = previewKind(item.name, item.type);\n return kind ? { name: item.name, kind, href: item.href, ...(item.inline ? { inline: item.inline } : {}) } : undefined;\n };\n return (\n <div\n className={`attachments${over ? ' is-over' : ''}`}\n onDragOver={\n upload\n ? (event) => {\n if (carriesFiles([...event.dataTransfer.types])) {\n event.preventDefault();\n setOver(true);\n }\n }\n : undefined\n }\n onDragLeave={\n upload\n ? (event) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) setOver(false);\n }\n : undefined\n }\n onDrop={\n upload\n ? (event) => {\n event.preventDefault();\n setOver(false);\n void take([...event.dataTransfer.files]);\n }\n : undefined\n }\n >\n {upload && (\n /* The drop area is drawn, not only promised: an edge a file can be\n aimed at, with the button inside it for everyone else. */\n <div className=\"attachments-add\">\n <Button\n intent=\"secondary\"\n size=\"compact\"\n busy={busy}\n busyLabel={say('attaching')}\n onClick={() => input.current?.click()}\n >{`+ ${upload.label}`}</Button>\n <input\n ref={input}\n type=\"file\"\n multiple\n hidden\n aria-label={upload.label}\n onChange={(event) => {\n const files = [...(event.target.files ?? [])];\n event.target.value = '';\n void take(files);\n }}\n />\n <span className=\"attachments-hint\">{say('orDropFilesHere')}</span>\n {said && (\n <span role={said.error ? 'alert' : 'status'} className={said.error ? 'attachments-error' : 'attachments-said'}>\n {said.text}\n </span>\n )}\n </div>\n )}\n {items.length ? (\n <ul className=\"attachments-list\">\n {items.map((item) => {\n const preview = previewOf(item);\n return (\n <li key={item.id} className=\"attachments-item\">\n <span className=\"attachments-badge\" aria-hidden=\"true\">\n {badge(item.name)}\n </span>\n {renaming === item.id && item.rename ? (\n <RenameRow item={item} onDone={() => setRenaming(undefined)} />\n ) : (\n <>\n <span className=\"attachments-text\">\n {/* A file with a viewer opens in it; any other is its download. */}\n {preview ? (\n <button\n type=\"button\"\n className=\"attachments-name\"\n title={say('preview', { name: item.name })}\n onClick={(event) => {\n back.current = event.currentTarget;\n setPreviewing(preview);\n }}\n >\n {item.name}\n </button>\n ) : (\n <a className=\"attachments-name\" href={item.href} download={item.name} onClick={saveOnLease(item)}>\n {item.name}\n </a>\n )}\n {item.meta.length > 0 && <span className=\"attachments-meta\">{item.meta.join(' · ')}</span>}\n </span>\n <span className=\"attachments-actions\">\n <a\n className={buttonClass({ intent: 'quiet', size: 'compact', className: 'attachments-download' })}\n href={item.href}\n download={item.name}\n onClick={saveOnLease(item)}\n aria-label={say('downloadName', { name: item.name })}\n >\n {say('download')}\n </a>\n {(item.onOpen || item.rename || item.remove) && (\n <DropMenu\n className=\"row-actions-menu\"\n triggerClassName=\"ghost row-actions-trigger\"\n triggerTitle={say('more', { name: item.name })}\n triggerLabel={say('more', { name: item.name })}\n label=\"⋯\"\n popupClassName=\"page-actions-popup\"\n align=\"end\"\n >\n {item.onOpen && (\n <DropItem className=\"page-actions-item\" onClick={item.onOpen}>\n {say('detailsItem')}\n </DropItem>\n )}\n {item.rename && (\n <DropItem className=\"page-actions-item\" onClick={() => setRenaming(item.id)}>\n {say('common.rename')}\n </DropItem>\n )}\n {/* Remove is last, in the danger colour, ruled off from the rest (docs/design.md). */}\n {item.remove && (\n <DropItem className=\"page-actions-item is-danger\" onClick={() => setRemoving(item)}>\n {say('removeMore')}\n </DropItem>\n )}\n </DropMenu>\n )}\n </span>\n </>\n )}\n </li>\n );\n })}\n </ul>\n ) : (\n (empty ?? <Empty className=\"attachments-empty\" text={emptyText} />)\n )}\n {previewing && <FilePreview file={previewing} onClose={() => setPreviewing(undefined)} finalFocus={back} />}\n {removing && <RemoveConfirm item={removing} onClose={() => setRemoving(undefined)} />}\n </div>\n );\n}\n\n/** The name, edited where it stood: Enter saves, Escape puts it back. */\nfunction RenameRow({ item, onDone }: { item: AttachmentItem; onDone: () => void }) {\n const [name, setName] = useState(item.name);\n const [busy, setBusy] = useState(false);\n const [problem, setProblem] = useState('');\n const save = async () => {\n const next = name.trim();\n if (!next) {\n setProblem(say('aFileNeedsAName'));\n return;\n }\n if (next === item.name) {\n onDone();\n return;\n }\n setBusy(true);\n const why = await item.rename!(next);\n setBusy(false);\n if (why) setProblem(why);\n else onDone();\n };\n return (\n <form\n className=\"attachments-rename\"\n onSubmit={(event) => {\n event.preventDefault();\n void save();\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n onDone();\n }\n }}\n >\n <Field label={say('fileName')} size=\"compact\" problem={problem}>\n {/* The reader just asked to type here, so the box takes the focus. */}\n {/* oxlint-disable-next-line jsx-a11y/no-autofocus */}\n <input\n type=\"text\"\n value={name}\n autoFocus\n onChange={(event) => {\n setName(event.target.value);\n setProblem('');\n }}\n />\n </Field>\n <span className=\"attachments-rename-actions\">\n <Button intent=\"primary\" size=\"compact\" type=\"submit\" busy={busy} busyLabel={say('common.saving')}>\n {say('common.save')}\n </Button>\n <Button intent=\"secondary\" size=\"compact\" onClick={onDone}>\n {say('common.cancel')}\n </Button>\n </span>\n </form>\n );\n}\n\n/* A removed file is not in Undo, so it is asked about first, and said so. */\nfunction RemoveConfirm({ item, onClose }: { item: AttachmentItem; onClose: () => void }) {\n const dialog = useRef<ModalHandle>(null);\n const keep = useRef<HTMLButtonElement>(null);\n const [busy, setBusy] = useState(false);\n const [problem, setProblem] = useState('');\n const remove = async () => {\n setBusy(true);\n const why = await item.remove!();\n setBusy(false);\n if (why) setProblem(why);\n else dialog.current?.close();\n };\n return (\n <Modal\n className=\"confirm attachments-confirm\"\n ref={dialog}\n fullscreen={false}\n initialFocus={keep}\n closeDisabled={busy}\n ariaLabel={say('removeName', { name: item.name })}\n onClose={onClose}\n >\n <h2>{say('removeQuotedNameQuestion', { name: item.name })}</h2>\n <p>{say('theFileIsDeleted')}</p>\n {problem && (\n <p className=\"attachments-error\" role=\"alert\">\n {problem}\n </p>\n )}\n <div className=\"confirm-actions\">\n <Button ref={keep} intent=\"secondary\" disabled={busy} onClick={() => dialog.current?.close()}>\n {say('keep')}\n </Button>\n <Button intent=\"danger\" busy={busy} busyLabel={say('removing')} onClick={() => void remove()}>\n {say('common.remove')}\n </Button>\n </div>\n </Modal>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shared-FO7vfI3F.js","names":["_Fragment"],"sources":["../../../kit/src/client/components/filePreviewModel.ts","../../../kit/src/client/copy/record/components/AttachmentList.ts","../../../kit/src/client/components/AttachmentList.tsx"],"sourcesContent":["/**\n * Which files open in a preview (FilePreview.tsx), and what a preview is\n * handed. Apart from the preview itself, which is loaded the first time a\n * file is opened: a list of attachments needs only to know which names are\n * worth a button.\n */\ntype PreviewKind = 'image' | 'pdf' | 'text' | 'video' | 'audio';\n\nconst IMAGE = /^(png|jpe?g|gif|webp|avif|bmp)$/;\nconst VIDEO = /^(mp4|m4v|mov|webm|ogv)$/;\nconst AUDIO = /^(mp3|m4a|wav|ogg|oga|opus|flac)$/;\nconst TEXT = /^(txt|text|md|markdown|csv|tsv|json|log|xml|ya?ml|ini|toml|sql|ts|js|css|html?)$/;\n\n/** Which viewer a file opens in, read from its name and its stored type; undefined is download-only. */\nexport function previewKind(name: string, type?: string): PreviewKind | undefined {\n const dot = name.lastIndexOf('.');\n const ext = dot > 0 ? name.slice(dot + 1).toLowerCase() : '';\n const claimed = (type ?? '').toLowerCase();\n if (IMAGE.test(ext) || /^image\\/(png|jpeg|gif|webp|avif|bmp)$/.test(claimed)) return 'image';\n if (ext === 'pdf' || claimed === 'application/pdf') return 'pdf';\n if (VIDEO.test(ext) || claimed.startsWith('video/')) return 'video';\n if (AUDIO.test(ext) || claimed.startsWith('audio/')) return 'audio';\n if (TEXT.test(ext) || claimed.startsWith('text/') || claimed === 'application/json') return 'text';\n return undefined;\n}\n\nexport interface PreviewFile {\n name: string;\n kind: PreviewKind;\n /** The download address: the bytes a PDF or a text is read from. */\n href: string;\n /** A picture's address in the file route's inline mode. */\n inline?: string;\n}\n","/** What AttachmentList says, in the record page room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n download: 'Download',\n isOverTheLimit: '“{name}” is over the {maxBytes} limit for a file.',\n attached: 'Attached “{attached}”',\n attachedFiles: { one: 'Attached {count} file', other: 'Attached {count} files' },\n attaching: 'Attaching…',\n orDropFilesHere: 'or drop files here',\n preview: 'Preview {name}',\n downloadName: 'Download {name}',\n more: 'More for {name}',\n detailsItem: 'Details',\n removeMore: 'Remove…',\n aFileNeedsAName: 'A file needs a name.',\n fileName: 'File name',\n removeName: 'Remove {name}?',\n removeQuotedNameQuestion: 'Remove “{name}”?',\n theFileIsDeleted: 'The file is deleted for everyone who can see this record, and Undo cannot bring it back.',\n keep: 'Keep',\n removing: 'Removing…',\n});\n","/**\n * A related list over a resource whose rows are files, drawn as attachments:\n * each file by name with its size and when it came, a Download beside it,\n * and — for a picture, a PDF or text — a preview in place (FilePreview.tsx).\n * Where the resource lets this reader, a file is renamed in its row and\n * removed from its More menu. Where the list may add, an Attach button sits\n * in a drop area drawn as one. A file past the resource's cap is refused\n * here with the reason, before any of it is read.\n */\nimport { useRef, useState, type ReactNode } from 'react';\nimport { formatBytes } from '../locale.js';\nimport { toast } from '../core.js';\nimport { Empty } from './Notes.js';\nimport { Button, buttonClass } from '@mistriwork/ui/Button.js';\nimport { Field } from '@mistriwork/ui/Field.js';\nimport { Modal, type ModalHandle } from '@mistriwork/ui/Modal.js';\nimport { DropItem, DropMenu } from '@mistriwork/ui/DropMenu.js';\nimport { previewKind, type PreviewFile } from './filePreviewModel.js';\nimport { onDemand } from './onDemand.js';\nimport { say } from '../copy/record/components/AttachmentList.js';\n\n/* The preview draws its own dialog, fetched the first time a file is opened. */\nconst FilePreview = onDemand(() => import('./FilePreview.js'), 'FilePreview', { quiet: true });\n\n/** What a row may do answers null when it was done, or why it was not. */\ntype Outcome = Promise<string | null>;\n\ninterface AttachmentItem {\n id: string;\n name: string;\n /** The download address. */\n href: string;\n /** In a tenant App, where a file has no address (fileSource.ts): saving reads it on the lease instead of following `href`. */\n save?: () => Promise<void>;\n meta: string[];\n /** The stored media type, where the resource keeps one: which viewer to try, never trusted for the bytes. */\n type?: string;\n /** A picture's address in the file route's inline mode, for its preview. */\n inline?: string;\n onOpen?: () => void;\n /** Present where this reader may change the file's name. */\n rename?: (name: string) => Outcome;\n /** Present where this reader may delete the file. */\n remove?: () => Outcome;\n}\n\ninterface AttachmentListProps {\n items: AttachmentItem[];\n emptyText: string;\n empty?: ReactNode;\n /** Present where the list may add: `send` answers null, or why nothing was attached. */\n upload?: { label: string; maxBytes: number; send: (file: File) => Promise<string | null> };\n}\n\n/** A file's bytes as base64, in slices, so a large file does not overflow the argument list. */\nexport async function fileToBase64(file: Blob): Promise<string> {\n const bytes = new Uint8Array(await file.arrayBuffer());\n let text = '';\n for (let i = 0; i < bytes.length; i += 0x8000) text += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n return btoa(text);\n}\n\n/* A link that is saved from the lease rather than followed, where the file has no address of its own. */\nconst saveOnLease = (item: AttachmentItem) =>\n item.save\n ? (event: { preventDefault(): void }) => {\n event.preventDefault();\n void item.save!().catch((error: Error) => toast(error.message, 'error'));\n }\n : undefined;\n\n/* The extension, as a file manager shows it: a short word, not an icon set. */\nconst badge = (name: string) => {\n const dot = name.lastIndexOf('.');\n const ext =\n dot > 0\n ? name\n .slice(dot + 1)\n .slice(0, 4)\n .toUpperCase()\n : '';\n return ext || 'FILE';\n};\n\nexport function AttachmentList({ items, emptyText, empty, upload }: AttachmentListProps) {\n const [over, setOver] = useState(false);\n const [busy, setBusy] = useState(false);\n const [said, setSaid] = useState<{ text: string; error: boolean }>();\n const input = useRef<HTMLInputElement>(null);\n const [previewing, setPreviewing] = useState<PreviewFile>();\n const [renaming, setRenaming] = useState<string>();\n const [removing, setRemoving] = useState<AttachmentItem>();\n /* Where focus goes back to once a preview closes: the name that opened it. */\n const back = useRef<HTMLElement | null>(null);\n\n const take = async (files: File[]) => {\n if (!upload || busy || !files.length) return;\n setBusy(true);\n setSaid(undefined);\n const attached: string[] = [];\n const refused: string[] = [];\n for (const file of files) {\n if (file.size > upload.maxBytes) {\n refused.push(say('isOverTheLimit', { name: file.name, maxBytes: formatBytes(upload.maxBytes) }));\n continue;\n }\n const why = await upload.send(file);\n if (why) refused.push(why);\n else attached.push(file.name);\n }\n setBusy(false);\n if (refused.length) setSaid({ text: refused.join(' '), error: true });\n else\n setSaid({\n text: attached.length === 1 ? say('attached', { attached: attached[0] }) : say('attachedFiles', { count: attached.length }),\n error: false,\n });\n };\n\n const carriesFiles = (types: readonly string[]) => types.includes('Files');\n const previewOf = (item: AttachmentItem): PreviewFile | undefined => {\n /* A viewer reads its file by address; a file on a lease has none, so it is saved instead. */\n if (item.save) return undefined;\n const kind = previewKind(item.name, item.type);\n return kind ? { name: item.name, kind, href: item.href, ...(item.inline ? { inline: item.inline } : {}) } : undefined;\n };\n return (\n <div\n className={`attachments${over ? ' is-over' : ''}`}\n onDragOver={\n upload\n ? (event) => {\n if (carriesFiles([...event.dataTransfer.types])) {\n event.preventDefault();\n setOver(true);\n }\n }\n : undefined\n }\n onDragLeave={\n upload\n ? (event) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) setOver(false);\n }\n : undefined\n }\n onDrop={\n upload\n ? (event) => {\n event.preventDefault();\n setOver(false);\n void take([...event.dataTransfer.files]);\n }\n : undefined\n }\n >\n {upload && (\n /* The drop area is drawn, not only promised: an edge a file can be\n aimed at, with the button inside it for everyone else. */\n <div className=\"attachments-add\">\n <Button\n intent=\"secondary\"\n size=\"compact\"\n busy={busy}\n busyLabel={say('attaching')}\n onClick={() => input.current?.click()}\n >{`+ ${upload.label}`}</Button>\n <input\n ref={input}\n type=\"file\"\n multiple\n hidden\n aria-label={upload.label}\n onChange={(event) => {\n const files = [...(event.target.files ?? [])];\n event.target.value = '';\n void take(files);\n }}\n />\n <span className=\"attachments-hint\">{say('orDropFilesHere')}</span>\n {said && (\n <span role={said.error ? 'alert' : 'status'} className={said.error ? 'attachments-error' : 'attachments-said'}>\n {said.text}\n </span>\n )}\n </div>\n )}\n {items.length ? (\n <ul className=\"attachments-list\">\n {items.map((item) => {\n const preview = previewOf(item);\n return (\n <li key={item.id} className=\"attachments-item\">\n <span className=\"attachments-badge\" aria-hidden=\"true\">\n {badge(item.name)}\n </span>\n {renaming === item.id && item.rename ? (\n <RenameRow item={item} onDone={() => setRenaming(undefined)} />\n ) : (\n <>\n <span className=\"attachments-text\">\n {/* A file with a viewer opens in it; any other is its download. */}\n {preview ? (\n <button\n type=\"button\"\n className=\"attachments-name\"\n title={say('preview', { name: item.name })}\n onClick={(event) => {\n back.current = event.currentTarget;\n setPreviewing(preview);\n }}\n >\n {item.name}\n </button>\n ) : (\n <a className=\"attachments-name\" href={item.href} download={item.name} onClick={saveOnLease(item)}>\n {item.name}\n </a>\n )}\n {item.meta.length > 0 && <span className=\"attachments-meta\">{item.meta.join(' · ')}</span>}\n </span>\n <span className=\"attachments-actions\">\n <a\n className={buttonClass({ intent: 'quiet', size: 'compact', className: 'attachments-download' })}\n href={item.href}\n download={item.name}\n onClick={saveOnLease(item)}\n aria-label={say('downloadName', { name: item.name })}\n >\n {say('download')}\n </a>\n {(item.onOpen || item.rename || item.remove) && (\n <DropMenu\n className=\"row-actions-menu\"\n triggerClassName=\"ghost row-actions-trigger\"\n triggerTitle={say('more', { name: item.name })}\n triggerLabel={say('more', { name: item.name })}\n label=\"⋯\"\n popupClassName=\"page-actions-popup\"\n align=\"end\"\n >\n {item.onOpen && (\n <DropItem className=\"page-actions-item\" onClick={item.onOpen}>\n {say('detailsItem')}\n </DropItem>\n )}\n {item.rename && (\n <DropItem className=\"page-actions-item\" onClick={() => setRenaming(item.id)}>\n {say('common.rename')}\n </DropItem>\n )}\n {/* Remove is last, in the danger colour, ruled off from the rest (docs/design.md). */}\n {item.remove && (\n <DropItem className=\"page-actions-item is-danger\" onClick={() => setRemoving(item)}>\n {say('removeMore')}\n </DropItem>\n )}\n </DropMenu>\n )}\n </span>\n </>\n )}\n </li>\n );\n })}\n </ul>\n ) : (\n (empty ?? <Empty className=\"attachments-empty\" text={emptyText} />)\n )}\n {previewing && <FilePreview file={previewing} onClose={() => setPreviewing(undefined)} finalFocus={back} />}\n {removing && <RemoveConfirm item={removing} onClose={() => setRemoving(undefined)} />}\n </div>\n );\n}\n\n/** The name, edited where it stood: Enter saves, Escape puts it back. */\nfunction RenameRow({ item, onDone }: { item: AttachmentItem; onDone: () => void }) {\n const [name, setName] = useState(item.name);\n const [busy, setBusy] = useState(false);\n const [problem, setProblem] = useState('');\n const save = async () => {\n const next = name.trim();\n if (!next) {\n setProblem(say('aFileNeedsAName'));\n return;\n }\n if (next === item.name) {\n onDone();\n return;\n }\n setBusy(true);\n const why = await item.rename!(next);\n setBusy(false);\n if (why) setProblem(why);\n else onDone();\n };\n return (\n <form\n className=\"attachments-rename\"\n onSubmit={(event) => {\n event.preventDefault();\n void save();\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n onDone();\n }\n }}\n >\n <Field label={say('fileName')} size=\"compact\" problem={problem}>\n {/* The reader just asked to type here, so the box takes the focus. */}\n {/* oxlint-disable-next-line jsx-a11y/no-autofocus */}\n <input\n type=\"text\"\n value={name}\n autoFocus\n onChange={(event) => {\n setName(event.target.value);\n setProblem('');\n }}\n />\n </Field>\n <span className=\"attachments-rename-actions\">\n <Button intent=\"primary\" size=\"compact\" type=\"submit\" busy={busy} busyLabel={say('common.saving')}>\n {say('common.save')}\n </Button>\n <Button intent=\"secondary\" size=\"compact\" onClick={onDone}>\n {say('common.cancel')}\n </Button>\n </span>\n </form>\n );\n}\n\n/* A removed file is not in Undo, so it is asked about first, and said so. */\nfunction RemoveConfirm({ item, onClose }: { item: AttachmentItem; onClose: () => void }) {\n const dialog = useRef<ModalHandle>(null);\n const keep = useRef<HTMLButtonElement>(null);\n const [busy, setBusy] = useState(false);\n const [problem, setProblem] = useState('');\n const remove = async () => {\n setBusy(true);\n const why = await item.remove!();\n setBusy(false);\n if (why) setProblem(why);\n else dialog.current?.close();\n };\n return (\n <Modal\n className=\"confirm attachments-confirm\"\n ref={dialog}\n fullscreen={false}\n initialFocus={keep}\n closeDisabled={busy}\n ariaLabel={say('removeName', { name: item.name })}\n onClose={onClose}\n >\n <h2>{say('removeQuotedNameQuestion', { name: item.name })}</h2>\n <p>{say('theFileIsDeleted')}</p>\n {problem && (\n <p className=\"attachments-error\" role=\"alert\">\n {problem}\n </p>\n )}\n <div className=\"confirm-actions\">\n <Button ref={keep} intent=\"secondary\" disabled={busy} onClick={() => dialog.current?.close()}>\n {say('keep')}\n </Button>\n <Button intent=\"danger\" busy={busy} busyLabel={say('removing')} onClick={() => void remove()}>\n {say('common.remove')}\n </Button>\n </div>\n </Modal>\n );\n}\n"],"mappings":";;;;;;;;;;AAQA,IAAM,QAAQ;AACd,IAAM,QAAQ;AACd,IAAM,QAAQ;AACd,IAAM,OAAO;;AAGb,SAAgB,YAAY,MAAc,MAAwC;CAChF,MAAM,MAAM,KAAK,YAAY,GAAG;CAChC,MAAM,MAAM,MAAM,IAAI,KAAK,MAAM,MAAM,CAAC,CAAC,CAAC,YAAY,IAAI;CAC1D,MAAM,WAAW,QAAQ,GAAA,CAAI,YAAY;CACzC,IAAI,MAAM,KAAK,GAAG,KAAK,wCAAwC,KAAK,OAAO,GAAG,OAAO;CACrF,IAAI,QAAQ,SAAS,YAAY,mBAAmB,OAAO;CAC3D,IAAI,MAAM,KAAK,GAAG,KAAK,QAAQ,WAAW,QAAQ,GAAG,OAAO;CAC5D,IAAI,MAAM,KAAK,GAAG,KAAK,QAAQ,WAAW,QAAQ,GAAG,OAAO;CAC5D,IAAI,KAAK,KAAK,GAAG,KAAK,QAAQ,WAAW,OAAO,KAAK,YAAY,oBAAoB,OAAO;AAE9F;;;ACrBA,IAAa,MAAM,eAAe;CAChC,UAAU;CACV,gBAAgB;CAChB,UAAU;CACV,eAAe;EAAE,KAAK;EAAyB,OAAO;CAAyB;CAC/E,WAAW;CACX,iBAAiB;CACjB,SAAS;CACT,cAAc;CACd,MAAM;CACN,aAAa;CACb,YAAY;CACZ,iBAAiB;CACjB,UAAU;CACV,YAAY;CACZ,0BAA0B;CAC1B,kBAAkB;CAClB,MAAM;CACN,UAAU;AACZ,CAAC;;;;;;;;;;;ACAD,IAAM,cAAc,eAAe,OAAO,yBAAqB,eAAe,EAAE,OAAO,KAAK,CAAC;;AAiC7F,eAAsB,aAAa,MAA6B;CAC9D,MAAM,QAAQ,IAAI,WAAW,MAAM,KAAK,YAAY,CAAC;CACrD,IAAI,OAAO;CACX,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,OAAQ,QAAQ,OAAO,aAAa,GAAG,MAAM,SAAS,GAAG,IAAI,KAAM,CAAC;CAC3G,OAAO,KAAK,IAAI;AAClB;AAGA,IAAM,eAAe,SACnB,KAAK,QACA,UAAsC;CACrC,MAAM,eAAe;CACrB,KAAU,KAAM,CAAC,CAAC,OAAO,UAAiB,MAAM,MAAM,SAAS,OAAO,CAAC;AACzE,IACA,KAAA;AAGN,IAAM,SAAS,SAAiB;CAC9B,MAAM,MAAM,KAAK,YAAY,GAAG;CAQhC,QANE,MAAM,IACF,KACG,MAAM,MAAM,CAAC,CAAC,CACd,MAAM,GAAG,CAAC,CAAC,CACX,YAAY,IACf,OACQ;AAChB;AAEA,SAAgB,eAAe,EAAE,OAAO,WAAW,OAAO,UAA+B;CACvF,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,CAAC,MAAM,WAAW,SAA2C;CACnE,MAAM,QAAQ,OAAyB,IAAI;CAC3C,MAAM,CAAC,YAAY,iBAAiB,SAAsB;CAC1D,MAAM,CAAC,UAAU,eAAe,SAAiB;CACjD,MAAM,CAAC,UAAU,eAAe,SAAyB;CAEzD,MAAM,OAAO,OAA2B,IAAI;CAE5C,MAAM,OAAO,OAAO,UAAkB;EACpC,IAAI,CAAC,UAAU,QAAQ,CAAC,MAAM,QAAQ;EACtC,QAAQ,IAAI;EACZ,QAAQ,KAAA,CAAS;EACjB,MAAM,WAAqB,CAAC;EAC5B,MAAM,UAAoB,CAAC;EAC3B,KAAK,MAAM,QAAQ,OAAO;GACxB,IAAI,KAAK,OAAO,OAAO,UAAU;IAC/B,QAAQ,KAAK,IAAI,kBAAkB;KAAE,MAAM,KAAK;KAAM,UAAU,YAAY,OAAO,QAAQ;IAAE,CAAC,CAAC;IAC/F;GACF;GACA,MAAM,MAAM,MAAM,OAAO,KAAK,IAAI;GAClC,IAAI,KAAK,QAAQ,KAAK,GAAG;QACpB,SAAS,KAAK,KAAK,IAAI;EAC9B;EACA,QAAQ,KAAK;EACb,IAAI,QAAQ,QAAQ,QAAQ;GAAE,MAAM,QAAQ,KAAK,GAAG;GAAG,OAAO;EAAK,CAAC;OAElE,QAAQ;GACN,MAAM,SAAS,WAAW,IAAI,IAAI,YAAY,EAAE,UAAU,SAAS,GAAG,CAAC,IAAI,IAAI,iBAAiB,EAAE,OAAO,SAAS,OAAO,CAAC;GAC1H,OAAO;EACT,CAAC;CACL;CAEA,MAAM,gBAAgB,UAA6B,MAAM,SAAS,OAAO;CACzE,MAAM,aAAa,SAAkD;EAEnE,IAAI,KAAK,MAAM,OAAO,KAAA;EACtB,MAAM,OAAO,YAAY,KAAK,MAAM,KAAK,IAAI;EAC7C,OAAO,OAAO;GAAE,MAAM,KAAK;GAAM;GAAM,MAAM,KAAK;GAAM,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;EAAG,IAAI,KAAA;CAC9G;CACA,OACE,qBAAC,OAAD;EACE,WAAW,cAAc,OAAO,aAAa;EAC7C,YACE,UACK,UAAU;GACT,IAAI,aAAa,CAAC,GAAG,MAAM,aAAa,KAAK,CAAC,GAAG;IAC/C,MAAM,eAAe;IACrB,QAAQ,IAAI;GACd;EACF,IACA,KAAA;EAEN,aACE,UACK,UAAU;GACT,IAAI,CAAC,MAAM,cAAc,SAAS,MAAM,aAA4B,GAAG,QAAQ,KAAK;EACtF,IACA,KAAA;EAEN,QACE,UACK,UAAU;GACT,MAAM,eAAe;GACrB,QAAQ,KAAK;GACb,KAAU,CAAC,GAAG,MAAM,aAAa,KAAK,CAAC;EACzC,IACA,KAAA;EA1BR,UAAA;GA6BG,UAGC,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,oBAAC,QAAD;MACE,QAAO;MACP,MAAK;MACC;MACN,WAAW,IAAI,WAAW;MAC1B,eAAe,MAAM,SAAS,MAAM;MACpC,UAAA,KAAK,OAAO;KAAgB,CAAA;KAC9B,oBAAC,SAAD;MACE,KAAK;MACL,MAAK;MACL,UAAA;MACA,QAAA;MACA,cAAY,OAAO;MACnB,WAAW,UAAU;OACnB,MAAM,QAAQ,CAAC,GAAI,MAAM,OAAO,SAAS,CAAC,CAAE;OAC5C,MAAM,OAAO,QAAQ;OACrB,KAAU,KAAK;MACjB;KACD,CAAA;KACD,oBAAC,QAAD;MAAM,WAAU;MAAoB,UAAA,IAAI,iBAAiB;KAAQ,CAAA;KAChE,QACC,oBAAC,QAAD;MAAM,MAAM,KAAK,QAAQ,UAAU;MAAU,WAAW,KAAK,QAAQ,sBAAsB;MACxF,UAAA,KAAK;KACF,CAAA;IAEL;;GAEN,MAAM,SACL,oBAAC,MAAD;IAAI,WAAU;IACX,UAAA,MAAM,KAAK,SAAS;KACnB,MAAM,UAAU,UAAU,IAAI;KAC9B,OACE,qBAAC,MAAD;MAAkB,WAAU;MAA5B,UAAA,CACE,oBAAC,QAAD;OAAM,WAAU;OAAoB,eAAY;OAC7C,UAAA,MAAM,KAAK,IAAI;MACZ,CAAA,GACL,aAAa,KAAK,MAAM,KAAK,SAC5B,oBAAC,WAAD;OAAiB;OAAM,cAAc,YAAY,KAAA,CAAS;MAAI,CAAA,IAE9D,qBAAAA,YAAA,EAAA,UAAA,CACE,qBAAC,QAAD;OAAM,WAAU;OAAhB,UAAA,CAEG,UACC,oBAAC,UAAD;QACE,MAAK;QACL,WAAU;QACV,OAAO,IAAI,WAAW,EAAE,MAAM,KAAK,KAAK,CAAC;QACzC,UAAU,UAAU;SAClB,KAAK,UAAU,MAAM;SACrB,cAAc,OAAO;QACvB;QAEC,UAAA,KAAK;OACA,CAAA,IAER,oBAAC,KAAD;QAAG,WAAU;QAAmB,MAAM,KAAK;QAAM,UAAU,KAAK;QAAM,SAAS,YAAY,IAAI;QAC5F,UAAA,KAAK;OACL,CAAA,GAEJ,KAAK,KAAK,SAAS,KAAK,oBAAC,QAAD;QAAM,WAAU;QAAoB,UAAA,KAAK,KAAK,KAAK,KAAK;OAAQ,CAAA,CACrF;MACN,CAAA,GAAA,qBAAC,QAAD;OAAM,WAAU;OAAhB,UAAA,CACE,oBAAC,KAAD;QACE,WAAW,YAAY;SAAE,QAAQ;SAAS,MAAM;SAAW,WAAW;QAAuB,CAAC;QAC9F,MAAM,KAAK;QACX,UAAU,KAAK;QACf,SAAS,YAAY,IAAI;QACzB,cAAY,IAAI,gBAAgB,EAAE,MAAM,KAAK,KAAK,CAAC;QAElD,UAAA,IAAI,UAAU;OACd,CAAA,IACD,KAAK,UAAU,KAAK,UAAU,KAAK,WACnC,qBAAC,UAAD;QACE,WAAU;QACV,kBAAiB;QACjB,cAAc,IAAI,QAAQ,EAAE,MAAM,KAAK,KAAK,CAAC;QAC7C,cAAc,IAAI,QAAQ,EAAE,MAAM,KAAK,KAAK,CAAC;QAC7C,OAAM;QACN,gBAAe;QACf,OAAM;QAPR,UAAA;SASG,KAAK,UACJ,oBAAC,UAAD;UAAU,WAAU;UAAoB,SAAS,KAAK;UACnD,UAAA,IAAI,aAAa;SACV,CAAA;SAEX,KAAK,UACJ,oBAAC,UAAD;UAAU,WAAU;UAAoB,eAAe,YAAY,KAAK,EAAE;UACvE,UAAA,IAAI,eAAe;SACZ,CAAA;SAGX,KAAK,UACJ,oBAAC,UAAD;UAAU,WAAU;UAA8B,eAAe,YAAY,IAAI;UAC9E,UAAA,IAAI,YAAY;SACT,CAAA;QAEJ;OAER,CAAA,CAAA;MACN,CAAA,CAAA,EAAA,CAAA,CAEF;KAtEK,GAAA,KAAK,EAsEV;IAER,CAAC;GACC,CAAA,IAEH,SAAS,oBAAC,OAAD;IAAO,WAAU;IAAoB,MAAM;GAAY,CAAA;GAElE,cAAc,oBAAC,aAAD;IAAa,MAAM;IAAY,eAAe,cAAc,KAAA,CAAS;IAAG,YAAY;GAAO,CAAA;GACzG,YAAY,oBAAC,eAAD;IAAe,MAAM;IAAU,eAAe,YAAY,KAAA,CAAS;GAAI,CAAA;EACjF;;AAET;;AAGA,SAAS,UAAU,EAAE,MAAM,UAAwD;CACjF,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK,IAAI;CAC1C,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,CAAC,SAAS,cAAc,SAAS,EAAE;CACzC,MAAM,OAAO,YAAY;EACvB,MAAM,OAAO,KAAK,KAAK;EACvB,IAAI,CAAC,MAAM;GACT,WAAW,IAAI,iBAAiB,CAAC;GACjC;EACF;EACA,IAAI,SAAS,KAAK,MAAM;GACtB,OAAO;GACP;EACF;EACA,QAAQ,IAAI;EACZ,MAAM,MAAM,MAAM,KAAK,OAAQ,IAAI;EACnC,QAAQ,KAAK;EACb,IAAI,KAAK,WAAW,GAAG;OAClB,OAAO;CACd;CACA,OACE,qBAAC,QAAD;EACE,WAAU;EACV,WAAW,UAAU;GACnB,MAAM,eAAe;GACrB,KAAU;EACZ;EACA,YAAY,UAAU;GACpB,IAAI,MAAM,QAAQ,UAAU;IAC1B,MAAM,eAAe;IACrB,MAAM,gBAAgB;IACtB,OAAO;GACT;EACF;EAZF,UAAA,CAcE,oBAAC,OAAD;GAAO,OAAO,IAAI,UAAU;GAAG,MAAK;GAAmB;GAGrD,UAAA,oBAAC,SAAD;IACE,MAAK;IACL,OAAO;IACP,WAAA;IACA,WAAW,UAAU;KACnB,QAAQ,MAAM,OAAO,KAAK;KAC1B,WAAW,EAAE;IACf;GACD,CAAA;EACI,CAAA,GACP,qBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CACE,oBAAC,QAAD;IAAQ,QAAO;IAAU,MAAK;IAAU,MAAK;IAAe;IAAM,WAAW,IAAI,eAAe;IAC7F,UAAA,IAAI,aAAa;GACZ,CAAA,GACR,oBAAC,QAAD;IAAQ,QAAO;IAAY,MAAK;IAAU,SAAS;IAChD,UAAA,IAAI,eAAe;GACd,CAAA,CACJ;EACF,CAAA,CAAA;;AAEV;AAGA,SAAS,cAAc,EAAE,MAAM,WAA0D;CACvF,MAAM,SAAS,OAAoB,IAAI;CACvC,MAAM,OAAO,OAA0B,IAAI;CAC3C,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,CAAC,SAAS,cAAc,SAAS,EAAE;CACzC,MAAM,SAAS,YAAY;EACzB,QAAQ,IAAI;EACZ,MAAM,MAAM,MAAM,KAAK,OAAQ;EAC/B,QAAQ,KAAK;EACb,IAAI,KAAK,WAAW,GAAG;OAClB,OAAO,SAAS,MAAM;CAC7B;CACA,OACE,qBAAC,OAAD;EACE,WAAU;EACV,KAAK;EACL,YAAY;EACZ,cAAc;EACd,eAAe;EACf,WAAW,IAAI,cAAc,EAAE,MAAM,KAAK,KAAK,CAAC;EACvC;EAPX,UAAA;GASE,oBAAC,MAAD,EAAA,UAAK,IAAI,4BAA4B,EAAE,MAAM,KAAK,KAAK,CAAC,EAAM,CAAA;GAC9D,oBAAC,KAAD,EAAA,UAAI,IAAI,kBAAkB,EAAK,CAAA;GAC9B,WACC,oBAAC,KAAD;IAAG,WAAU;IAAoB,MAAK;IACnC,UAAA;GACA,CAAA;GAEL,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,oBAAC,QAAD;KAAQ,KAAK;KAAM,QAAO;KAAY,UAAU;KAAM,eAAe,OAAO,SAAS,MAAM;KACxF,UAAA,IAAI,MAAM;IACL,CAAA,GACR,oBAAC,QAAD;KAAQ,QAAO;KAAe;KAAM,WAAW,IAAI,UAAU;KAAG,eAAe,KAAK,OAAO;KACxF,UAAA,IAAI,eAAe;IACd,CAAA,CACL;;EACA;;AAEX"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { J as maskQuoted, Y as dateWindow } from "./shared-poc11xxo.js";
|
|
2
2
|
import { A as isFlagColumn, D as columnKind, Jt as formatNumber, K as minorFigure, Rt as defaultCurrency, Ut as formatDate, Yt as formatPercent, b as withUnit, ft as vocabularyWord, gt as defineMessages, qt as formatMoney, st as MASK, vt as messageLanguage, x as wordFor } from "./shared-DJZjSi3J.js";
|
|
3
|
-
import { G as unquote } from "./shared-
|
|
3
|
+
import { G as unquote } from "./shared-BHsjawAG.js";
|
|
4
4
|
import { c as sortFields, l as splitConditions, u as splitQuery } from "./shared-DOvMIC4W.js";
|
|
5
|
-
import { a as ungroup, i as squeeze, n as andWords, o as written, r as joined } from "./shared-
|
|
5
|
+
import { a as ungroup, i as squeeze, n as andWords, o as written, r as joined } from "./shared-CrWv5JKH.js";
|
|
6
6
|
// packages/kit/src/client/copy/filters/components/conditionWords.ts
|
|
7
7
|
/** What conditionWords says, in the filter rail room (packages/kit/src/client/messages.ts says how the catalog is split). */
|
|
8
8
|
var say = defineMessages({
|
|
@@ -465,4 +465,4 @@ function referencedIds(sp, text) {
|
|
|
465
465
|
}
|
|
466
466
|
export { andWords, referencedIds, sayCondition, sayFilter, sayQuestion, sayTails };
|
|
467
467
|
|
|
468
|
-
//# sourceMappingURL=shared-
|
|
468
|
+
//# sourceMappingURL=shared-HalAVHjv.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-DLSd80D1.js","names":["sayCopy","say"],"sources":["../../../kit/src/client/copy/filters/components/conditionWords.ts","../../../kit/src/client/components/conditionWords.ts"],"sourcesContent":["/** What conditionWords 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 {\n is: '{label} is {value}',\n isNot: '{label} is not {value}',\n moreThan: '{label} more than {value}',\n lessThan: '{label} less than {value}',\n from: '{label} from {value}',\n upTo: '{label} up to {value}',\n after: '{label} after {value}',\n before: '{label} before {value}',\n onOrAfter: '{label} on or after {value}',\n onOrBefore: '{label} on or before {value}',\n between: '{label} {from} – {to}',\n when: '{label} {phrase}',\n contains: '{label} contains {value}',\n notContains: '{label} does not contain {value}',\n startsWith: '{label} starts with {value}',\n endsWith: '{label} ends with {value}',\n matches: '{label} matches {value}',\n empty: '{label} is empty',\n notEmpty: '{label} is not empty',\n quoted: '“{text}”',\n me: 'me',\n yes: 'Yes',\n no: 'No',\n today: 'today',\n yesterday: 'yesterday',\n tomorrow: 'tomorrow',\n thisWeek: 'this week',\n lastWeek: 'last week',\n thisMonth: 'this month',\n lastMonth: 'last month',\n thisQuarter: 'this quarter',\n lastQuarter: 'last quarter',\n nextQuarter: 'next quarter',\n thisYear: 'this year',\n lastYear: 'last year',\n lastSpan: 'the last {span}',\n nextSpan: 'the next {span}',\n previousSpan: 'the {span} before that',\n within: 'in {phrase}',\n other: 'Another condition',\n sorted: 'Sorted by {columns}',\n descending: '{label}, descending',\n showing: 'Showing {columns}',\n first: 'First {count}',\n },\n {\n es: {\n is: '{label} es {value}',\n isNot: '{label} no es {value}',\n moreThan: '{label} mayor que {value}',\n lessThan: '{label} menor que {value}',\n from: '{label} desde {value}',\n upTo: '{label} hasta {value}',\n after: '{label} después del {value}',\n before: '{label} antes del {value}',\n onOrAfter: '{label} desde el {value}',\n onOrBefore: '{label} hasta el {value}',\n between: '{label} {from} – {to}',\n when: '{label}: {phrase}',\n contains: '{label} contiene {value}',\n notContains: '{label} no contiene {value}',\n startsWith: '{label} empieza por {value}',\n endsWith: '{label} termina en {value}',\n matches: '{label} coincide con {value}',\n empty: '{label} está vacío',\n notEmpty: '{label} no está vacío',\n quoted: '«{text}»',\n me: 'yo',\n yes: 'Sí',\n no: 'No',\n today: 'hoy',\n yesterday: 'ayer',\n tomorrow: 'mañana',\n thisWeek: 'esta semana',\n lastWeek: 'la semana pasada',\n thisMonth: 'este mes',\n lastMonth: 'el mes pasado',\n thisQuarter: 'este trimestre',\n lastQuarter: 'el trimestre pasado',\n nextQuarter: 'el próximo trimestre',\n thisYear: 'este año',\n lastYear: 'el año pasado',\n lastSpan: 'los últimos {span}',\n nextSpan: 'los próximos {span}',\n previousSpan: 'los {span} anteriores',\n within: 'en {phrase}',\n other: 'Otra condición',\n sorted: 'Ordenado por {columns}',\n descending: '{label}, descendente',\n showing: 'Mostrando {columns}',\n first: 'Primeros {count}',\n },\n },\n);\n","/**\n * A condition said in words, for a reader of an App.\n *\n * The filter controls write the query language — `status != done`,\n * `claim_number contains zzzz`, `rent >= 1000` — and that is the right thing\n * for an address and for the Workbench, whose reader writes it too. An App's\n * reader never wrote it, so every place an App says what a list is narrowed\n * by — a chip, a facet's note, the column menu's Clear filter, the empty\n * list, a saved view's name — says it through here: the column's label, the\n * display rule's word for a value, and the catalog's connectives. \"Status is\n * not Done\", \"Claim number contains “zzzz”\", \"Rent from $1,000\", \"Due\n * before Oct 1\".\n *\n * Pure: what it knows of the App comes in as a speaker (the columns this\n * reader is served, their labels and rules, the names of referenced records\n * once read). Without one — the Workbench — the language is said as written.\n * A column the reader is not served (hidden, or outside their field grant)\n * is said as \"Another condition\": neither its name nor its value.\n */\nimport { MASK, vocabularyWord } from '@mistriwork/engine/shared/model.js';\nimport { dateWindow } from '@mistriwork/engine/shared/query.js';\nimport { columnKind, isFlagColumn, type ColumnMeta } from '@mistriwork/engine/shared/schema.js';\nimport { maskQuoted, sortFields, splitConditions, splitQuery } from '../clauses.js';\nimport { andWords, joined, squeeze, ungroup, written } from './conditionText.js';\nimport { unquote } from '../filterbar.js';\nimport { defaultCurrency, formatDate, formatMoney, formatNumber, formatPercent } from '../locale.js';\nimport { messageLanguage } from '../messages.js';\nimport { say as sayCopy } from '../copy/filters/components/conditionWords.js';\nimport { withUnit, wordFor, type DisplayRule } from './valueModel.js';\nimport { minorFigure } from '@mistriwork/engine/shared/money.js';\n\ntype Meta = ColumnMeta & { allowed?: readonly string[]; flag?: true };\n\n/** What an App lends the words: its columns as this reader is served them. */\nexport interface ConditionSpeaker {\n /** The column, or undefined for one this reader is not served. */\n column(name: string): Meta | undefined;\n label(name: string): string;\n rule(name: string): DisplayRule | null | undefined;\n /** The name of the record a reference's id points at, once it has been read. */\n recordName?(column: string, id: string): string | undefined;\n}\n\ninterface Operand {\n text: string;\n quoted: boolean;\n}\ntype Read =\n | { op: 'empty' | 'notEmpty' }\n | { op: '=' | '!=' | '>' | '>=' | '<' | '<=' | 'contains' | 'notContains' | 'startsWith' | 'endsWith' | 'like'; value: Operand }\n | { op: 'between'; from: Operand; to: Operand }\n | { op: 'in'; values: Operand[] };\n\nconst operand = (raw: string): Operand => {\n const text = raw.trim();\n return /^[\"']/.test(text) ? { text: unquote(text), quoted: true } : { text, quoted: false };\n};\n\n/* A list's items, split on the commas outside quotes. */\nfunction items(list: string): Operand[] {\n const masked = maskQuoted(list) as string;\n const out: Operand[] = [];\n let start = 0;\n for (let i = 0; i <= list.length; i += 1) {\n if (i < list.length && masked[i] !== ',') continue;\n const item = list.slice(start, i).trim();\n if (item) out.push(operand(item));\n start = i + 1;\n }\n return out;\n}\n\nconst WORD_OPS: Record<string, Exclude<Read['op'], 'empty' | 'notEmpty' | 'between' | 'in'>> = {\n contains: 'contains',\n 'not contains': 'notContains',\n startswith: 'startsWith',\n endswith: 'endsWith',\n like: 'like',\n};\n\n/** What a condition's tail asks — `!= done`, `in (a, b)`, `is empty` — or null for one the words do not know. */\nfunction readTail(tail: string): Read | null {\n const t = squeeze(tail);\n const empty = /^is\\s+(not\\s+)?empty$/i.exec(t);\n if (empty) return { op: empty[1] ? 'notEmpty' : 'empty' };\n const between = /^between\\s+(.+?)\\s+and\\s+(.+)$/i.exec(t);\n if (between) return { op: 'between', from: operand(between[1]), to: operand(between[2]) };\n const list = /^(not\\s+)?in\\s+[([](.*)[)\\]]$/i.exec(t);\n if (list) {\n const values = items(list[2]);\n return list[1] ? null : { op: 'in', values };\n }\n const word = /^(not\\s+contains|contains|startswith|endswith|like)\\s+(.+)$/i.exec(t);\n if (word) return { op: WORD_OPS[word[1].toLowerCase().replace(/\\s+/g, ' ')], value: operand(word[2]) };\n const symbol = /^(!=|<=|>=|=|<|>)\\s*(.+)$/.exec(t);\n if (symbol) return { op: symbol[1] as '=', value: operand(symbol[2]) };\n return null;\n}\n\nexport { andWords };\n\n/* ---------- a value, as the App says it ---------- */\n\nconst FIXED_PHRASES: Record<string, () => string> = {\n today: () => sayCopy('today'),\n yesterday: () => sayCopy('yesterday'),\n tomorrow: () => sayCopy('tomorrow'),\n 'this week': () => sayCopy('thisWeek'),\n 'last week': () => sayCopy('lastWeek'),\n 'this month': () => sayCopy('thisMonth'),\n 'last month': () => sayCopy('lastMonth'),\n 'this quarter': () => sayCopy('thisQuarter'),\n 'last quarter': () => sayCopy('lastQuarter'),\n 'next quarter': () => sayCopy('nextQuarter'),\n 'this year': () => sayCopy('thisYear'),\n 'last year': () => sayCopy('lastYear'),\n};\nconst SPAN = /^(last|next|previous)\\s+(\\d+)\\s+(minute|hour|day|week|month|year)s?$/i;\n\n/** A relative date — `today`, `last 30 days` — in words, and whether it is a window (\"the last 30 days\") rather than a day. */\nfunction datePhrase(value: Operand): { words: string; span: boolean } | undefined {\n if (value.quoted) return undefined;\n const p = value.text.toLowerCase().trim();\n if (!dateWindow(p, new Date())) return undefined;\n if (Object.hasOwn(FIXED_PHRASES, p)) return { words: FIXED_PHRASES[p](), span: false };\n const span = SPAN.exec(p);\n if (!span) return undefined;\n const said = new Intl.NumberFormat(messageLanguage(), { style: 'unit', unit: span[3].toLowerCase(), unitDisplay: 'long' }).format(\n Number(span[2]),\n );\n const way = span[1].toLowerCase();\n return { words: sayCopy(way === 'next' ? 'nextSpan' : way === 'previous' ? 'previousSpan' : 'lastSpan', { span: said }), span: true };\n}\n\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}(?:[T ][\\d:.]+(?:Z|[+-]\\d{2}:?\\d{2})?)?$/;\n\nfunction shortDate(text: string): string {\n const sameYear = text.slice(0, 4) === String(new Date().getFullYear());\n return formatDate(text, { month: 'short', day: 'numeric', ...(sameYear ? {} : { year: 'numeric' }) });\n}\n\n/** Whether a column is read as a masked value: nothing it is compared with is ever said. */\nconst isMasked = (rule: DisplayRule | null | undefined) => Boolean(rule && rule.masked);\n\n/** One value of a column, in the words the App draws it with. */\nfunction sayValue(sp: ConditionSpeaker, column: string, meta: Meta | undefined, value: Operand, pattern = false): string {\n const rule = sp.rule(column);\n if (isMasked(rule)) return MASK;\n // What a text is searched for is the reader's own fragment, quoted as typed: “zzzz”.\n if (pattern) return sayCopy('quoted', { text: value.text });\n const { text, quoted } = value;\n if (!quoted && text === 'me') return sayCopy('me');\n // Compared with another column: that column's label.\n if (!quoted && text !== column && /^[\\w.$+]+$/.test(text) && !/^-?\\d/.test(text) && sp.column(text)) return sp.label(text);\n const phrase = datePhrase(value);\n if (phrase) return phrase.words;\n if (meta?.references) return sp.recordName?.(column, text) ?? text;\n const n = Number(text);\n const figure = text.trim() !== '' && Number.isFinite(n) && Number.isSafeInteger(Math.trunc(n));\n /* A vocabulary — a CHECK, or values the rule tones or marks — says a value\n as its pill does: `in_progress` is \"In progress\". A toned figure stays a\n figure, dressed below as the rule dresses it. */\n const vocabulary = Boolean(meta?.allowed?.length || rule?.tone || rule?.icons);\n const word = wordFor(rule, text) ?? (vocabulary && !figure ? vocabularyWord(text) : undefined);\n if (word !== undefined) return word;\n const flag = isFlagColumn(meta) || (meta && columnKind(meta.type) === 'boolean');\n if (!quoted && (/^(true|false)$/i.test(text) || (flag && /^[01]$/.test(text)))) {\n return sayCopy(/^(true|1)$/i.test(text) ? 'yes' : 'no');\n }\n if (figure && rule?.format === 'money') {\n const currency = rule.currency ?? defaultCurrency();\n const amount = rule.minor ? (minorFigure(text, currency) ?? n) : n;\n /* A bound is said as it was typed: \"up to $15,000\", not a figure to the cent. A value is always to the cent. */\n return withUnit(formatMoney(amount, currency, Number.isInteger(Number(amount)) ? { maximumFractionDigits: 0 } : {}), rule.unit);\n }\n if (figure && rule?.format === 'percent') return formatPercent(n);\n if (figure && (rule?.format === 'number' || rule?.unit)) return withUnit(formatNumber(n), rule.unit);\n if (ISO_DATE.test(text) && (!meta || columnKind(meta.type) === 'date' || columnKind(meta.type) === 'text')) return shortDate(text);\n return text;\n}\n\nconst isDateish = (meta: Meta | undefined, value: Operand) =>\n Boolean(datePhrase(value)) || (meta ? columnKind(meta.type) === 'date' : false) || (!value.quoted && ISO_DATE.test(value.text));\n\n/* ---------- one column's conditions ---------- */\n\nfunction sayRead(sp: ConditionSpeaker, column: string, meta: Meta | undefined, read: Read): string {\n const label = sp.label(column);\n const value = (v: Operand) => sayValue(sp, column, meta, v);\n const fragment = (v: Operand) => sayValue(sp, column, meta, v, true);\n switch (read.op) {\n case 'empty':\n return sayCopy('empty', { label });\n case 'notEmpty':\n return sayCopy('notEmpty', { label });\n case 'in':\n return sayCopy('is', { label, value: joined(read.values.map(value), 'filter.or') });\n case 'between':\n return sayCopy('between', { label, from: value(read.from), to: value(read.to) });\n case 'contains':\n return sayCopy('contains', { label, value: fragment(read.value) });\n case 'notContains':\n return sayCopy('notContains', { label, value: fragment(read.value) });\n case 'startsWith':\n return sayCopy('startsWith', { label, value: fragment(read.value) });\n case 'endsWith':\n return sayCopy('endsWith', { label, value: fragment(read.value) });\n case 'like':\n return sayCopy('matches', { label, value: fragment(read.value) });\n default:\n break;\n }\n const phrase = datePhrase(read.value);\n // A window asked with `=` is the window: \"Due today\", \"Created in the last 30 days\".\n if (read.op === '=' && phrase)\n return sayCopy('when', { label, phrase: phrase.span ? sayCopy('within', { phrase: phrase.words }) : phrase.words });\n if (read.op === '=') return sayCopy('is', { label, value: value(read.value) });\n if (read.op === '!=') return sayCopy('isNot', { label, value: value(read.value) });\n const dated = isDateish(meta, read.value);\n const said = { label, value: value(read.value) };\n if (dated)\n return read.op === '>'\n ? sayCopy('after', said)\n : read.op === '>='\n ? sayCopy('onOrAfter', said)\n : read.op === '<'\n ? sayCopy('before', said)\n : sayCopy('onOrBefore', said);\n return read.op === '>'\n ? sayCopy('moreThan', said)\n : read.op === '>='\n ? sayCopy('from', said)\n : read.op === '<'\n ? sayCopy('lessThan', said)\n : sayCopy('upTo', said);\n}\n\n/* The column a condition names, and what it can be said as: a path\n (`account_id.name`) is said by its own label, and only where the reference\n it starts from is one this reader is served; its value is text. */\nfunction subject(sp: ConditionSpeaker, column: string): { column: string; meta: Meta | undefined } | null {\n const meta = sp.column(column);\n if (meta) return { column, meta };\n const head = column.split('.')[0];\n if (head !== column && sp.column(head)) return { column, meta: undefined };\n return null;\n}\n\n/**\n * One column's conditions — its tails, as the filter controls read them\n * (`= open`, `!= a` and `!= b`, `>= 5` and `<= 9`) — as one phrase.\n */\nexport function sayTails(sp: ConditionSpeaker | null, column: string, tails: readonly string[]): string {\n if (!sp) return written.tails(column, tails);\n // A whole condition — the rows that point at the record, by a segment of theirs — is its own label.\n if (tails.length && tails.every((tail) => !squeeze(tail)) && sp.column(column)) return sp.label(column);\n return sayReads(sp, column, tails.map(readTail));\n}\n\nfunction sayReads(sp: ConditionSpeaker, column: string, reads: Array<Read | null>): string {\n const who = subject(sp, column);\n if (!who || !reads.length || reads.some((read) => !read)) return sayCopy('other');\n const said = reads as Read[];\n const say = (read: Read) => sayRead(sp, who.column, who.meta, read);\n // `stage != won and stage != lost`: \"Stage is not Won or Lost\".\n if (said.length > 1 && said.every((read) => read.op === '!=')) {\n const values = said.map((read) => sayValue(sp, who.column, who.meta, (read as { value: Operand }).value));\n return sayCopy('isNot', { label: sp.label(who.column), value: joined(values, 'filter.or') });\n }\n // `price >= 5 and price <= 9`: the range the rail would have written.\n if (said.length === 2 && said[0].op === '>=' && said[1].op === '<=') {\n return say({ op: 'between', from: said[0].value, to: said[1].value });\n }\n return andWords(said.map(say));\n}\n\n/* The arms of a top-level `or`, outside quotes and parentheses. */\nfunction orArms(text: string): string[] {\n const masked = maskQuoted(text) as string;\n const arms: string[] = [];\n let depth = 0;\n let start = 0;\n for (let i = 0; i < text.length; i += 1) {\n if (masked[i] === '(') depth += 1;\n else if (masked[i] === ')') depth -= 1;\n else if (depth === 0 && /\\s/.test(masked[i]) && /^\\sor\\s/i.test(masked.slice(i, i + 4))) {\n arms.push(text.slice(start, i));\n start = i + 4;\n i += 3;\n }\n }\n arms.push(text.slice(start));\n return arms.map(squeeze).filter(Boolean);\n}\n\nconst PLAIN = /^([\\w.$+]+)\\s*((?:!=|<=|>=|=|<|>|\\s)[\\s\\S]*)$/;\n/* A list's filter over the rows that point at its record (shared/listFilters.ts) is its words up to what they\n ask, `any opportunity where stage`, and a tail after them as any column's — or none, by a segment of theirs. */\nconst HAS = /^(any\\s+[\\w.$]+(?:\\s+via\\s+[\\w$+]+)?\\s+where\\s+[\\w.$]+)(?:\\s*((?:!=|<=|>=|=|<|>|\\s)[\\s\\S]*))?$/i;\nconst SIMPLE = {\n exec(text: string): [string, string, string] | null {\n const has = HAS.exec(text);\n if (has) return [has[0], has[1], has[2] ?? ''];\n const plain = PLAIN.exec(text);\n return plain && !/^(?:any|no)$/i.test(plain[1]) ? [plain[0], plain[1], plain[2]] : null;\n },\n};\n\n/** One top-level condition of a filter — `status != done`, an or-group, a bracketed and — in words. */\nexport function sayCondition(sp: ConditionSpeaker | null, condition: string): string {\n if (!sp) return written.condition(condition);\n const text = ungroup(condition);\n const arms = orArms(text);\n if (arms.length > 1) {\n const simple = arms.map((arm) => SIMPLE.exec(ungroup(arm)));\n const reads = simple.map((m) => (m ? readTail(m[2]) : null));\n // `status = open or status = done`: \"Status is Open or Done\".\n const column = simple[0]?.[1];\n const values = reads.map((read) => (read?.op === '=' && !datePhrase(read.value) ? read.value : null));\n if (column && simple.every((m) => m?.[1] === column) && values.every(Boolean)) {\n return sayReads(sp, column, [{ op: 'in', values: values as Operand[] }]);\n }\n return joined(\n arms.map((arm) => sayCondition(sp, arm)),\n 'filter.or',\n );\n }\n const parts = splitConditions(text) as string[];\n if (parts.length > 1) return andWords(parts.map((part) => sayCondition(sp, part)));\n const simple = SIMPLE.exec(text);\n return simple ? sayTails(sp, simple[1], [simple[2]]) : sayCopy('other');\n}\n\n/** Each condition of a filter's text (no table name), in words. */\nexport function sayFilter(sp: ConditionSpeaker | null, filter: string): string[] {\n return (splitConditions(squeeze(filter)) as string[]).map((condition) => sayCondition(sp, condition));\n}\n\n/**\n * Everything a question asks beyond its table — its conditions, and a sort,\n * a column list or a page size a reader wrote by hand — one phrase each.\n */\nexport function sayQuestion(sp: ConditionSpeaker | null, text: string): string[] {\n if (!sp) return written.question(text);\n const parts = splitQuery(`q ${squeeze(text)}`) as { filter: string; sort?: string; show?: string; limit?: string };\n const out = sayFilter(sp, parts.filter);\n const name = (column: string) => (subject(sp, column) ? sp.label(subject(sp, column)!.column) : sayCopy('other'));\n if (parts.sort) {\n const fields = (sortFields(`q ${parts.sort}`) as Array<{ column: string; direction: 'asc' | 'desc' }>).map((field) =>\n field.direction === 'desc' ? sayCopy('descending', { label: name(field.column) }) : name(field.column),\n );\n out.push(sayCopy('sorted', { columns: andWords(fields) }));\n }\n if (parts.show) {\n const columns = parts.show\n .replace(/^(show|select)\\s+/i, '')\n .split(',')\n .map((column) => name(column.trim()));\n out.push(sayCopy('showing', { columns: andWords(columns) }));\n }\n const limit = parts.limit ? /\\d+/.exec(parts.limit)?.[0] : undefined;\n if (limit) out.push(sayCopy('first', { count: formatNumber(Number(limit)) }));\n return out;\n}\n\n/**\n * The ids a question compares a reference with, column by column: what a\n * speaker needs named before `owner_id in (3, 7)` can say \"Dana Ward or\n * Sam Reyes\".\n */\nexport function referencedIds(sp: ConditionSpeaker, text: string): Map<string, string[]> {\n const out = new Map<string, Set<string>>();\n const visit = (condition: string): void => {\n const plain = ungroup(condition);\n const arms = orArms(plain);\n if (arms.length > 1) {\n arms.forEach(visit);\n return;\n }\n const parts = splitConditions(plain) as string[];\n if (parts.length > 1) {\n parts.forEach(visit);\n return;\n }\n const simple = SIMPLE.exec(plain);\n const meta = simple ? sp.column(simple[1]) : undefined;\n if (!simple || !meta?.references) return;\n const read = readTail(simple[2]);\n const values = !read ? [] : read.op === 'in' ? read.values : 'value' in read ? [read.value] : [];\n for (const value of values) {\n if (value.text === 'me' && !value.quoted) continue;\n if (!out.has(simple[1])) out.set(simple[1], new Set());\n out.get(simple[1])!.add(value.text);\n }\n };\n const parts = splitQuery(`q ${squeeze(text)}`) as { filter: string };\n (splitConditions(parts.filter) as string[]).forEach(visit);\n return new Map([...out].map(([column, ids]) => [column, [...ids]]));\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shared-HalAVHjv.js","names":["sayCopy","say"],"sources":["../../../kit/src/client/copy/filters/components/conditionWords.ts","../../../kit/src/client/components/conditionWords.ts"],"sourcesContent":["/** What conditionWords 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 {\n is: '{label} is {value}',\n isNot: '{label} is not {value}',\n moreThan: '{label} more than {value}',\n lessThan: '{label} less than {value}',\n from: '{label} from {value}',\n upTo: '{label} up to {value}',\n after: '{label} after {value}',\n before: '{label} before {value}',\n onOrAfter: '{label} on or after {value}',\n onOrBefore: '{label} on or before {value}',\n between: '{label} {from} – {to}',\n when: '{label} {phrase}',\n contains: '{label} contains {value}',\n notContains: '{label} does not contain {value}',\n startsWith: '{label} starts with {value}',\n endsWith: '{label} ends with {value}',\n matches: '{label} matches {value}',\n empty: '{label} is empty',\n notEmpty: '{label} is not empty',\n quoted: '“{text}”',\n me: 'me',\n yes: 'Yes',\n no: 'No',\n today: 'today',\n yesterday: 'yesterday',\n tomorrow: 'tomorrow',\n thisWeek: 'this week',\n lastWeek: 'last week',\n thisMonth: 'this month',\n lastMonth: 'last month',\n thisQuarter: 'this quarter',\n lastQuarter: 'last quarter',\n nextQuarter: 'next quarter',\n thisYear: 'this year',\n lastYear: 'last year',\n lastSpan: 'the last {span}',\n nextSpan: 'the next {span}',\n previousSpan: 'the {span} before that',\n within: 'in {phrase}',\n other: 'Another condition',\n sorted: 'Sorted by {columns}',\n descending: '{label}, descending',\n showing: 'Showing {columns}',\n first: 'First {count}',\n },\n {\n es: {\n is: '{label} es {value}',\n isNot: '{label} no es {value}',\n moreThan: '{label} mayor que {value}',\n lessThan: '{label} menor que {value}',\n from: '{label} desde {value}',\n upTo: '{label} hasta {value}',\n after: '{label} después del {value}',\n before: '{label} antes del {value}',\n onOrAfter: '{label} desde el {value}',\n onOrBefore: '{label} hasta el {value}',\n between: '{label} {from} – {to}',\n when: '{label}: {phrase}',\n contains: '{label} contiene {value}',\n notContains: '{label} no contiene {value}',\n startsWith: '{label} empieza por {value}',\n endsWith: '{label} termina en {value}',\n matches: '{label} coincide con {value}',\n empty: '{label} está vacío',\n notEmpty: '{label} no está vacío',\n quoted: '«{text}»',\n me: 'yo',\n yes: 'Sí',\n no: 'No',\n today: 'hoy',\n yesterday: 'ayer',\n tomorrow: 'mañana',\n thisWeek: 'esta semana',\n lastWeek: 'la semana pasada',\n thisMonth: 'este mes',\n lastMonth: 'el mes pasado',\n thisQuarter: 'este trimestre',\n lastQuarter: 'el trimestre pasado',\n nextQuarter: 'el próximo trimestre',\n thisYear: 'este año',\n lastYear: 'el año pasado',\n lastSpan: 'los últimos {span}',\n nextSpan: 'los próximos {span}',\n previousSpan: 'los {span} anteriores',\n within: 'en {phrase}',\n other: 'Otra condición',\n sorted: 'Ordenado por {columns}',\n descending: '{label}, descendente',\n showing: 'Mostrando {columns}',\n first: 'Primeros {count}',\n },\n },\n);\n","/**\n * A condition said in words, for a reader of an App.\n *\n * The filter controls write the query language — `status != done`,\n * `claim_number contains zzzz`, `rent >= 1000` — and that is the right thing\n * for an address and for the Workbench, whose reader writes it too. An App's\n * reader never wrote it, so every place an App says what a list is narrowed\n * by — a chip, a facet's note, the column menu's Clear filter, the empty\n * list, a saved view's name — says it through here: the column's label, the\n * display rule's word for a value, and the catalog's connectives. \"Status is\n * not Done\", \"Claim number contains “zzzz”\", \"Rent from $1,000\", \"Due\n * before Oct 1\".\n *\n * Pure: what it knows of the App comes in as a speaker (the columns this\n * reader is served, their labels and rules, the names of referenced records\n * once read). Without one — the Workbench — the language is said as written.\n * A column the reader is not served (hidden, or outside their field grant)\n * is said as \"Another condition\": neither its name nor its value.\n */\nimport { MASK, vocabularyWord } from '@mistriwork/engine/shared/model.js';\nimport { dateWindow } from '@mistriwork/engine/shared/query.js';\nimport { columnKind, isFlagColumn, type ColumnMeta } from '@mistriwork/engine/shared/schema.js';\nimport { maskQuoted, sortFields, splitConditions, splitQuery } from '../clauses.js';\nimport { andWords, joined, squeeze, ungroup, written } from './conditionText.js';\nimport { unquote } from '../filterbar.js';\nimport { defaultCurrency, formatDate, formatMoney, formatNumber, formatPercent } from '../locale.js';\nimport { messageLanguage } from '../messages.js';\nimport { say as sayCopy } from '../copy/filters/components/conditionWords.js';\nimport { withUnit, wordFor, type DisplayRule } from './valueModel.js';\nimport { minorFigure } from '@mistriwork/engine/shared/money.js';\n\ntype Meta = ColumnMeta & { allowed?: readonly string[]; flag?: true };\n\n/** What an App lends the words: its columns as this reader is served them. */\nexport interface ConditionSpeaker {\n /** The column, or undefined for one this reader is not served. */\n column(name: string): Meta | undefined;\n label(name: string): string;\n rule(name: string): DisplayRule | null | undefined;\n /** The name of the record a reference's id points at, once it has been read. */\n recordName?(column: string, id: string): string | undefined;\n}\n\ninterface Operand {\n text: string;\n quoted: boolean;\n}\ntype Read =\n | { op: 'empty' | 'notEmpty' }\n | { op: '=' | '!=' | '>' | '>=' | '<' | '<=' | 'contains' | 'notContains' | 'startsWith' | 'endsWith' | 'like'; value: Operand }\n | { op: 'between'; from: Operand; to: Operand }\n | { op: 'in'; values: Operand[] };\n\nconst operand = (raw: string): Operand => {\n const text = raw.trim();\n return /^[\"']/.test(text) ? { text: unquote(text), quoted: true } : { text, quoted: false };\n};\n\n/* A list's items, split on the commas outside quotes. */\nfunction items(list: string): Operand[] {\n const masked = maskQuoted(list) as string;\n const out: Operand[] = [];\n let start = 0;\n for (let i = 0; i <= list.length; i += 1) {\n if (i < list.length && masked[i] !== ',') continue;\n const item = list.slice(start, i).trim();\n if (item) out.push(operand(item));\n start = i + 1;\n }\n return out;\n}\n\nconst WORD_OPS: Record<string, Exclude<Read['op'], 'empty' | 'notEmpty' | 'between' | 'in'>> = {\n contains: 'contains',\n 'not contains': 'notContains',\n startswith: 'startsWith',\n endswith: 'endsWith',\n like: 'like',\n};\n\n/** What a condition's tail asks — `!= done`, `in (a, b)`, `is empty` — or null for one the words do not know. */\nfunction readTail(tail: string): Read | null {\n const t = squeeze(tail);\n const empty = /^is\\s+(not\\s+)?empty$/i.exec(t);\n if (empty) return { op: empty[1] ? 'notEmpty' : 'empty' };\n const between = /^between\\s+(.+?)\\s+and\\s+(.+)$/i.exec(t);\n if (between) return { op: 'between', from: operand(between[1]), to: operand(between[2]) };\n const list = /^(not\\s+)?in\\s+[([](.*)[)\\]]$/i.exec(t);\n if (list) {\n const values = items(list[2]);\n return list[1] ? null : { op: 'in', values };\n }\n const word = /^(not\\s+contains|contains|startswith|endswith|like)\\s+(.+)$/i.exec(t);\n if (word) return { op: WORD_OPS[word[1].toLowerCase().replace(/\\s+/g, ' ')], value: operand(word[2]) };\n const symbol = /^(!=|<=|>=|=|<|>)\\s*(.+)$/.exec(t);\n if (symbol) return { op: symbol[1] as '=', value: operand(symbol[2]) };\n return null;\n}\n\nexport { andWords };\n\n/* ---------- a value, as the App says it ---------- */\n\nconst FIXED_PHRASES: Record<string, () => string> = {\n today: () => sayCopy('today'),\n yesterday: () => sayCopy('yesterday'),\n tomorrow: () => sayCopy('tomorrow'),\n 'this week': () => sayCopy('thisWeek'),\n 'last week': () => sayCopy('lastWeek'),\n 'this month': () => sayCopy('thisMonth'),\n 'last month': () => sayCopy('lastMonth'),\n 'this quarter': () => sayCopy('thisQuarter'),\n 'last quarter': () => sayCopy('lastQuarter'),\n 'next quarter': () => sayCopy('nextQuarter'),\n 'this year': () => sayCopy('thisYear'),\n 'last year': () => sayCopy('lastYear'),\n};\nconst SPAN = /^(last|next|previous)\\s+(\\d+)\\s+(minute|hour|day|week|month|year)s?$/i;\n\n/** A relative date — `today`, `last 30 days` — in words, and whether it is a window (\"the last 30 days\") rather than a day. */\nfunction datePhrase(value: Operand): { words: string; span: boolean } | undefined {\n if (value.quoted) return undefined;\n const p = value.text.toLowerCase().trim();\n if (!dateWindow(p, new Date())) return undefined;\n if (Object.hasOwn(FIXED_PHRASES, p)) return { words: FIXED_PHRASES[p](), span: false };\n const span = SPAN.exec(p);\n if (!span) return undefined;\n const said = new Intl.NumberFormat(messageLanguage(), { style: 'unit', unit: span[3].toLowerCase(), unitDisplay: 'long' }).format(\n Number(span[2]),\n );\n const way = span[1].toLowerCase();\n return { words: sayCopy(way === 'next' ? 'nextSpan' : way === 'previous' ? 'previousSpan' : 'lastSpan', { span: said }), span: true };\n}\n\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}(?:[T ][\\d:.]+(?:Z|[+-]\\d{2}:?\\d{2})?)?$/;\n\nfunction shortDate(text: string): string {\n const sameYear = text.slice(0, 4) === String(new Date().getFullYear());\n return formatDate(text, { month: 'short', day: 'numeric', ...(sameYear ? {} : { year: 'numeric' }) });\n}\n\n/** Whether a column is read as a masked value: nothing it is compared with is ever said. */\nconst isMasked = (rule: DisplayRule | null | undefined) => Boolean(rule && rule.masked);\n\n/** One value of a column, in the words the App draws it with. */\nfunction sayValue(sp: ConditionSpeaker, column: string, meta: Meta | undefined, value: Operand, pattern = false): string {\n const rule = sp.rule(column);\n if (isMasked(rule)) return MASK;\n // What a text is searched for is the reader's own fragment, quoted as typed: “zzzz”.\n if (pattern) return sayCopy('quoted', { text: value.text });\n const { text, quoted } = value;\n if (!quoted && text === 'me') return sayCopy('me');\n // Compared with another column: that column's label.\n if (!quoted && text !== column && /^[\\w.$+]+$/.test(text) && !/^-?\\d/.test(text) && sp.column(text)) return sp.label(text);\n const phrase = datePhrase(value);\n if (phrase) return phrase.words;\n if (meta?.references) return sp.recordName?.(column, text) ?? text;\n const n = Number(text);\n const figure = text.trim() !== '' && Number.isFinite(n) && Number.isSafeInteger(Math.trunc(n));\n /* A vocabulary — a CHECK, or values the rule tones or marks — says a value\n as its pill does: `in_progress` is \"In progress\". A toned figure stays a\n figure, dressed below as the rule dresses it. */\n const vocabulary = Boolean(meta?.allowed?.length || rule?.tone || rule?.icons);\n const word = wordFor(rule, text) ?? (vocabulary && !figure ? vocabularyWord(text) : undefined);\n if (word !== undefined) return word;\n const flag = isFlagColumn(meta) || (meta && columnKind(meta.type) === 'boolean');\n if (!quoted && (/^(true|false)$/i.test(text) || (flag && /^[01]$/.test(text)))) {\n return sayCopy(/^(true|1)$/i.test(text) ? 'yes' : 'no');\n }\n if (figure && rule?.format === 'money') {\n const currency = rule.currency ?? defaultCurrency();\n const amount = rule.minor ? (minorFigure(text, currency) ?? n) : n;\n /* A bound is said as it was typed: \"up to $15,000\", not a figure to the cent. A value is always to the cent. */\n return withUnit(formatMoney(amount, currency, Number.isInteger(Number(amount)) ? { maximumFractionDigits: 0 } : {}), rule.unit);\n }\n if (figure && rule?.format === 'percent') return formatPercent(n);\n if (figure && (rule?.format === 'number' || rule?.unit)) return withUnit(formatNumber(n), rule.unit);\n if (ISO_DATE.test(text) && (!meta || columnKind(meta.type) === 'date' || columnKind(meta.type) === 'text')) return shortDate(text);\n return text;\n}\n\nconst isDateish = (meta: Meta | undefined, value: Operand) =>\n Boolean(datePhrase(value)) || (meta ? columnKind(meta.type) === 'date' : false) || (!value.quoted && ISO_DATE.test(value.text));\n\n/* ---------- one column's conditions ---------- */\n\nfunction sayRead(sp: ConditionSpeaker, column: string, meta: Meta | undefined, read: Read): string {\n const label = sp.label(column);\n const value = (v: Operand) => sayValue(sp, column, meta, v);\n const fragment = (v: Operand) => sayValue(sp, column, meta, v, true);\n switch (read.op) {\n case 'empty':\n return sayCopy('empty', { label });\n case 'notEmpty':\n return sayCopy('notEmpty', { label });\n case 'in':\n return sayCopy('is', { label, value: joined(read.values.map(value), 'filter.or') });\n case 'between':\n return sayCopy('between', { label, from: value(read.from), to: value(read.to) });\n case 'contains':\n return sayCopy('contains', { label, value: fragment(read.value) });\n case 'notContains':\n return sayCopy('notContains', { label, value: fragment(read.value) });\n case 'startsWith':\n return sayCopy('startsWith', { label, value: fragment(read.value) });\n case 'endsWith':\n return sayCopy('endsWith', { label, value: fragment(read.value) });\n case 'like':\n return sayCopy('matches', { label, value: fragment(read.value) });\n default:\n break;\n }\n const phrase = datePhrase(read.value);\n // A window asked with `=` is the window: \"Due today\", \"Created in the last 30 days\".\n if (read.op === '=' && phrase)\n return sayCopy('when', { label, phrase: phrase.span ? sayCopy('within', { phrase: phrase.words }) : phrase.words });\n if (read.op === '=') return sayCopy('is', { label, value: value(read.value) });\n if (read.op === '!=') return sayCopy('isNot', { label, value: value(read.value) });\n const dated = isDateish(meta, read.value);\n const said = { label, value: value(read.value) };\n if (dated)\n return read.op === '>'\n ? sayCopy('after', said)\n : read.op === '>='\n ? sayCopy('onOrAfter', said)\n : read.op === '<'\n ? sayCopy('before', said)\n : sayCopy('onOrBefore', said);\n return read.op === '>'\n ? sayCopy('moreThan', said)\n : read.op === '>='\n ? sayCopy('from', said)\n : read.op === '<'\n ? sayCopy('lessThan', said)\n : sayCopy('upTo', said);\n}\n\n/* The column a condition names, and what it can be said as: a path\n (`account_id.name`) is said by its own label, and only where the reference\n it starts from is one this reader is served; its value is text. */\nfunction subject(sp: ConditionSpeaker, column: string): { column: string; meta: Meta | undefined } | null {\n const meta = sp.column(column);\n if (meta) return { column, meta };\n const head = column.split('.')[0];\n if (head !== column && sp.column(head)) return { column, meta: undefined };\n return null;\n}\n\n/**\n * One column's conditions — its tails, as the filter controls read them\n * (`= open`, `!= a` and `!= b`, `>= 5` and `<= 9`) — as one phrase.\n */\nexport function sayTails(sp: ConditionSpeaker | null, column: string, tails: readonly string[]): string {\n if (!sp) return written.tails(column, tails);\n // A whole condition — the rows that point at the record, by a segment of theirs — is its own label.\n if (tails.length && tails.every((tail) => !squeeze(tail)) && sp.column(column)) return sp.label(column);\n return sayReads(sp, column, tails.map(readTail));\n}\n\nfunction sayReads(sp: ConditionSpeaker, column: string, reads: Array<Read | null>): string {\n const who = subject(sp, column);\n if (!who || !reads.length || reads.some((read) => !read)) return sayCopy('other');\n const said = reads as Read[];\n const say = (read: Read) => sayRead(sp, who.column, who.meta, read);\n // `stage != won and stage != lost`: \"Stage is not Won or Lost\".\n if (said.length > 1 && said.every((read) => read.op === '!=')) {\n const values = said.map((read) => sayValue(sp, who.column, who.meta, (read as { value: Operand }).value));\n return sayCopy('isNot', { label: sp.label(who.column), value: joined(values, 'filter.or') });\n }\n // `price >= 5 and price <= 9`: the range the rail would have written.\n if (said.length === 2 && said[0].op === '>=' && said[1].op === '<=') {\n return say({ op: 'between', from: said[0].value, to: said[1].value });\n }\n return andWords(said.map(say));\n}\n\n/* The arms of a top-level `or`, outside quotes and parentheses. */\nfunction orArms(text: string): string[] {\n const masked = maskQuoted(text) as string;\n const arms: string[] = [];\n let depth = 0;\n let start = 0;\n for (let i = 0; i < text.length; i += 1) {\n if (masked[i] === '(') depth += 1;\n else if (masked[i] === ')') depth -= 1;\n else if (depth === 0 && /\\s/.test(masked[i]) && /^\\sor\\s/i.test(masked.slice(i, i + 4))) {\n arms.push(text.slice(start, i));\n start = i + 4;\n i += 3;\n }\n }\n arms.push(text.slice(start));\n return arms.map(squeeze).filter(Boolean);\n}\n\nconst PLAIN = /^([\\w.$+]+)\\s*((?:!=|<=|>=|=|<|>|\\s)[\\s\\S]*)$/;\n/* A list's filter over the rows that point at its record (shared/listFilters.ts) is its words up to what they\n ask, `any opportunity where stage`, and a tail after them as any column's — or none, by a segment of theirs. */\nconst HAS = /^(any\\s+[\\w.$]+(?:\\s+via\\s+[\\w$+]+)?\\s+where\\s+[\\w.$]+)(?:\\s*((?:!=|<=|>=|=|<|>|\\s)[\\s\\S]*))?$/i;\nconst SIMPLE = {\n exec(text: string): [string, string, string] | null {\n const has = HAS.exec(text);\n if (has) return [has[0], has[1], has[2] ?? ''];\n const plain = PLAIN.exec(text);\n return plain && !/^(?:any|no)$/i.test(plain[1]) ? [plain[0], plain[1], plain[2]] : null;\n },\n};\n\n/** One top-level condition of a filter — `status != done`, an or-group, a bracketed and — in words. */\nexport function sayCondition(sp: ConditionSpeaker | null, condition: string): string {\n if (!sp) return written.condition(condition);\n const text = ungroup(condition);\n const arms = orArms(text);\n if (arms.length > 1) {\n const simple = arms.map((arm) => SIMPLE.exec(ungroup(arm)));\n const reads = simple.map((m) => (m ? readTail(m[2]) : null));\n // `status = open or status = done`: \"Status is Open or Done\".\n const column = simple[0]?.[1];\n const values = reads.map((read) => (read?.op === '=' && !datePhrase(read.value) ? read.value : null));\n if (column && simple.every((m) => m?.[1] === column) && values.every(Boolean)) {\n return sayReads(sp, column, [{ op: 'in', values: values as Operand[] }]);\n }\n return joined(\n arms.map((arm) => sayCondition(sp, arm)),\n 'filter.or',\n );\n }\n const parts = splitConditions(text) as string[];\n if (parts.length > 1) return andWords(parts.map((part) => sayCondition(sp, part)));\n const simple = SIMPLE.exec(text);\n return simple ? sayTails(sp, simple[1], [simple[2]]) : sayCopy('other');\n}\n\n/** Each condition of a filter's text (no table name), in words. */\nexport function sayFilter(sp: ConditionSpeaker | null, filter: string): string[] {\n return (splitConditions(squeeze(filter)) as string[]).map((condition) => sayCondition(sp, condition));\n}\n\n/**\n * Everything a question asks beyond its table — its conditions, and a sort,\n * a column list or a page size a reader wrote by hand — one phrase each.\n */\nexport function sayQuestion(sp: ConditionSpeaker | null, text: string): string[] {\n if (!sp) return written.question(text);\n const parts = splitQuery(`q ${squeeze(text)}`) as { filter: string; sort?: string; show?: string; limit?: string };\n const out = sayFilter(sp, parts.filter);\n const name = (column: string) => (subject(sp, column) ? sp.label(subject(sp, column)!.column) : sayCopy('other'));\n if (parts.sort) {\n const fields = (sortFields(`q ${parts.sort}`) as Array<{ column: string; direction: 'asc' | 'desc' }>).map((field) =>\n field.direction === 'desc' ? sayCopy('descending', { label: name(field.column) }) : name(field.column),\n );\n out.push(sayCopy('sorted', { columns: andWords(fields) }));\n }\n if (parts.show) {\n const columns = parts.show\n .replace(/^(show|select)\\s+/i, '')\n .split(',')\n .map((column) => name(column.trim()));\n out.push(sayCopy('showing', { columns: andWords(columns) }));\n }\n const limit = parts.limit ? /\\d+/.exec(parts.limit)?.[0] : undefined;\n if (limit) out.push(sayCopy('first', { count: formatNumber(Number(limit)) }));\n return out;\n}\n\n/**\n * The ids a question compares a reference with, column by column: what a\n * speaker needs named before `owner_id in (3, 7)` can say \"Dana Ward or\n * Sam Reyes\".\n */\nexport function referencedIds(sp: ConditionSpeaker, text: string): Map<string, string[]> {\n const out = new Map<string, Set<string>>();\n const visit = (condition: string): void => {\n const plain = ungroup(condition);\n const arms = orArms(plain);\n if (arms.length > 1) {\n arms.forEach(visit);\n return;\n }\n const parts = splitConditions(plain) as string[];\n if (parts.length > 1) {\n parts.forEach(visit);\n return;\n }\n const simple = SIMPLE.exec(plain);\n const meta = simple ? sp.column(simple[1]) : undefined;\n if (!simple || !meta?.references) return;\n const read = readTail(simple[2]);\n const values = !read ? [] : read.op === 'in' ? read.values : 'value' in read ? [read.value] : [];\n for (const value of values) {\n if (value.text === 'me' && !value.quoted) continue;\n if (!out.has(simple[1])) out.set(simple[1], new Set());\n out.get(simple[1])!.add(value.text);\n }\n };\n const parts = splitQuery(`q ${squeeze(text)}`) as { filter: string };\n (splitConditions(parts.filter) as string[]).forEach(visit);\n return new Map([...out].map(([column, ids]) => [column, [...ids]]));\n}\n"],"mappings":"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"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { A as tenantLeaseActive, D as subscribeSessionIdentity, E as sessionIdentity, O as subscribeTenantLease, T as captureTenantLease, nt as Button, z as DEFINED_KEY } from "./shared-poc11xxo.js";
|
|
2
2
|
import { Kt as formatLocale, Pn as useQueryClient, Qt as formatTimezone, Rt as defaultCurrency, _t as message, gt as defineMessages, rt as richTextPlain } from "./shared-DJZjSi3J.js";
|
|
3
|
-
import { ut as useQueries } from "./shared-
|
|
4
|
-
import { B as toast, L as state, i as api, ot as appRequestScope, st as ownedBy } from "./shared-
|
|
5
|
-
import { n as useArrived, t as onDemand } from "./shared-
|
|
3
|
+
import { ut as useQueries } from "./shared-BHsjawAG.js";
|
|
4
|
+
import { B as toast, L as state, i as api, ot as appRequestScope, st as ownedBy } from "./shared-BoLbc2WD.js";
|
|
5
|
+
import { n as useArrived, t as onDemand } from "./shared-B-BUF9fx.js";
|
|
6
6
|
import { n as readsAsName, t as Dropdown } from "./shared-gtzTT5Z7.js";
|
|
7
7
|
import { t as DateField } from "./shared-D0FwuLNI.js";
|
|
8
8
|
import { t as Field } from "./shared-CERG8O1B.js";
|
|
9
9
|
import { n as commandKeyText, r as isIsoDate } from "./shared-Du2YAQk4.js";
|
|
10
10
|
import { r as recordKey } from "./shared-_IMKuuvy.js";
|
|
11
|
-
import { n as composedCheck, t as composeUnderway } from "./shared-
|
|
12
|
-
import { n as mentionSearch, r as pictureKeeper, t as RichTextField } from "./shared-
|
|
13
|
-
import { t as InputSlot } from "./shared-
|
|
14
|
-
import { t as commandOperations } from "./shared-
|
|
15
|
-
import { _ as maskPattern, g as isoInstant, h as isIsoMonth, m as fieldPattern, p as COMMAND_INPUT_LIMITS } from "./shared-
|
|
11
|
+
import { n as composedCheck, t as composeUnderway } from "./shared-CpMhOq8F.js";
|
|
12
|
+
import { n as mentionSearch, r as pictureKeeper, t as RichTextField } from "./shared-DHy41sET.js";
|
|
13
|
+
import { t as InputSlot } from "./shared-C2RU1qjv.js";
|
|
14
|
+
import { t as commandOperations } from "./shared-Docl_0tq.js";
|
|
15
|
+
import { _ as maskPattern, g as isoInstant, h as isIsoMonth, m as fieldPattern, p as COMMAND_INPUT_LIMITS } from "./shared-CL3RLKDA.js";
|
|
16
16
|
import { Fragment, useEffect, useId, useMemo, useRef, useState, useSyncExternalStore } from "react";
|
|
17
17
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
18
18
|
// packages/mistri/src/client/commandSend.ts
|
|
@@ -637,11 +637,11 @@ var say = defineMessages({
|
|
|
637
637
|
* lines grid (CommandLines.tsx), each cell read as its column's kind.
|
|
638
638
|
*/
|
|
639
639
|
var DateTimeInput = onDemand(() => import("./shared-CsOQlA23.js"), "DateTimeInput", { quiet: true });
|
|
640
|
-
var IntakeControl = onDemand(() => import("./shared-
|
|
641
|
-
var CommandLive = onDemand(() => import("./shared-
|
|
640
|
+
var IntakeControl = onDemand(() => import("./shared-CLq3-_hW.js"), "IntakeControl", { quiet: true });
|
|
641
|
+
var CommandLive = onDemand(() => import("./shared-DprrHC72.js"), "CommandLive", { quiet: true });
|
|
642
642
|
var drafting;
|
|
643
643
|
var draftArriving;
|
|
644
|
-
var loadDraftLogic = () => draftArriving ??= import("./shared-
|
|
644
|
+
var loadDraftLogic = () => draftArriving ??= import("./shared-DVfdm6ah.js").then((module) => {
|
|
645
645
|
drafting = module;
|
|
646
646
|
}, (error) => {
|
|
647
647
|
draftArriving = void 0;
|
|
@@ -660,7 +660,7 @@ function asksDraftLogic(fields, rules) {
|
|
|
660
660
|
var readsRecord = (when) => drafting ? drafting.readsRecord(when) : /\brecord\./.test(when);
|
|
661
661
|
var lining;
|
|
662
662
|
/** The lines module, fetched once: the grid is drawn from it, and a form's checks read a line's cells with it. */
|
|
663
|
-
var loadLines = () => import("./shared-
|
|
663
|
+
var loadLines = () => import("./shared-Ci16s2rN.js").then((module) => {
|
|
664
664
|
lining = module;
|
|
665
665
|
return module;
|
|
666
666
|
});
|
|
@@ -689,9 +689,9 @@ var draftLine = (values = {}) => ({
|
|
|
689
689
|
values
|
|
690
690
|
});
|
|
691
691
|
var isLines = (value) => Array.isArray(value) && value.every((row) => !!row && typeof row === "object" && "values" in row && "id" in row);
|
|
692
|
-
var CommandReferenceField = onDemand(() => import("./shared-
|
|
692
|
+
var CommandReferenceField = onDemand(() => import("./shared-C42f07hJ.js"), "CommandReferenceField", { quiet: true });
|
|
693
693
|
var answering;
|
|
694
|
-
var DefinedAnswers = onDemand(() => import("./shared-
|
|
694
|
+
var DefinedAnswers = onDemand(() => import("./shared-Dm0IGbAf.js").then((module) => {
|
|
695
695
|
answering = module;
|
|
696
696
|
return module;
|
|
697
697
|
}), "DefinedAnswers", { quiet: true });
|
|
@@ -1354,4 +1354,4 @@ function RepeatRows({ field, path, rows, shared, onChange }) {
|
|
|
1354
1354
|
}
|
|
1355
1355
|
export { readyCommand as _, commandInput as a, draftHidden as c, readsRecord as d, readyToJudge as f, useCommandAnswers as g, commandAvailable as h, blankCommandValues as i, draftLogic as l, commandFieldAt as m, CommandLive as n, commandPathLabel as o, say as p, asksDraftLogic as r, commandProblems as s, CommandFields as t, prefilledCommandValues as u, sendCommand as v };
|
|
1356
1356
|
|
|
1357
|
-
//# sourceMappingURL=shared-
|
|
1357
|
+
//# sourceMappingURL=shared-JvcI-LWp.js.map
|