@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 { F as primaryKey, M as labelColumn, k as findTable } from "./shared-DJZjSi3J.js";
|
|
2
|
-
import { J as rollupColumnMeta, q as tryResolvePath } from "./shared-
|
|
2
|
+
import { J as rollupColumnMeta, q as tryResolvePath } from "./shared-BoLbc2WD.js";
|
|
3
3
|
// packages/engine/src/shared/referenceModel.ts
|
|
4
4
|
/** Reference paths and joined labels used when planning record and view reads. */
|
|
5
5
|
function viewOutputs(columns) {
|
|
@@ -192,4 +192,4 @@ function withoutParentName(rows, labelOutputs, parent) {
|
|
|
192
192
|
}
|
|
193
193
|
export { withoutParent as a, referenceProjection as i, recordViewKey as n, withoutParentName as o, recordViewLabel as r, recordView as t };
|
|
194
194
|
|
|
195
|
-
//# sourceMappingURL=shared-
|
|
195
|
+
//# sourceMappingURL=shared-C9DZtSFH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-BHc2Izkj.js","names":["labelColumn"],"sources":["../../../engine/src/shared/referenceModel.ts"],"sourcesContent":["/** Reference paths and joined labels used when planning record and view reads. */\nimport { findTable, labelColumn, primaryKey, type ColumnMeta, type DatabaseSchema, type TableMeta } from './schema.js';\nimport { rollupColumnMeta } from './rollups.js';\nimport { MAX_PATH_DEPTH, tryResolvePath } from './viewPaths.js';\n\nfunction viewOutputs(columns: readonly { path: string; alias?: string }[]) {\n const counts = new Map<string, number>();\n return columns.map((col) => {\n const name = col.alias?.trim() || col.path;\n const count = (counts.get(name) ?? 0) + 1;\n counts.set(name, count);\n return count === 1 ? name : `${name}_${count}`;\n });\n}\n\n/** Joined labels share the field query; never fetch each reference separately. */\nexport function referenceProjection(\n schema: DatabaseSchema,\n table: TableMeta,\n paths: readonly string[],\n enabled: boolean,\n namingPath: (table: TableMeta) => string | undefined = labelColumn,\n) {\n const fetched = [...new Set(paths)];\n const labels = new Map<string, string>();\n if (!enabled) return { fetched, labels };\n /* A single column cannot safely traverse one leg of a composite foreign\n key — unless it is also a key of its own: a tenant's `vehicle_id` is both\n the composite `(tenant_id, vehicle_id)`, which keeps it in its tenant, and\n the single key its path walks, and was drawn as its opaque id. */\n const composite = (tableId: string) => {\n const single = new Set(\n schema.foreignKeys.filter((fk) => fk.from.table === tableId && fk.from.columns.length === 1).map((fk) => fk.from.columns[0]),\n );\n return new Set(\n schema.foreignKeys\n .filter((fk) => fk.from.table === tableId && fk.from.columns.length > 1)\n .flatMap((fk) => fk.from.columns)\n .filter((column) => !single.has(column)),\n );\n };\n for (const path of paths) {\n /* A reference reached through others — `employee_id.department_id` —\n is named the same way as one on the row itself: its record's label,\n read one hop further along, while the path stays within reach. */\n let column: ColumnMeta | undefined;\n let owner = table.id;\n let hops = 0;\n let derived = false;\n if (!path.includes('.')) {\n column = table.columns.find((col) => col.name === path);\n /* A latest of a reference column is the record's key too (rollups.ts): named as the column it reads is, by a\n column of that record (`resident.name`, viewPaths.ts); a template or a path past it is not a column to read. */\n const rollup = !column && table.rollups && Object.hasOwn(table.rollups, path) ? table.rollups[path] : undefined;\n if (rollup?.fn === 'latest' && rollup.references && !rollup.of) {\n column = rollupColumnMeta(path, rollup);\n derived = true;\n }\n } else {\n const { resolved } = tryResolvePath(schema, table.id, path);\n if (!resolved) continue;\n column = resolved.column;\n owner = resolved.table.id;\n hops = resolved.hops.length;\n }\n if (!column?.references || composite(owner).has(column.name)) continue;\n const target = findTable(schema, column.references.table);\n const naming = target && namingPath(target);\n if (derived && (!naming || naming.includes('.') || !target?.columns.some((col) => col.name === naming))) continue;\n if (!naming || hops + 1 + naming.split('.').length - 1 > MAX_PATH_DEPTH) continue;\n const labelAt = `${path}.${naming}`;\n labels.set(path, labelAt);\n if (!fetched.includes(labelAt)) fetched.push(labelAt);\n }\n return { fetched, labels };\n}\n\n/** Hidden label columns must not replace raw keys or collide with authored aliases. */\nexport function referenceView<T extends { columns?: Array<{ path: string; alias?: string }> }>(\n schema: DatabaseSchema,\n table: TableMeta,\n view: T,\n enabled: boolean,\n namingPath: (table: TableMeta) => string | undefined = labelColumn,\n) {\n const columns = view.columns ?? [];\n const projection = referenceProjection(\n schema,\n table,\n columns.map((col) => col.path),\n enabled,\n namingPath,\n );\n const labelColumns: Record<string, string> = {};\n const hidden: string[] = [];\n const outputs = viewOutputs(columns);\n const used = new Set(outputs);\n const extra: Array<{ path: string; alias: string }> = [];\n columns.forEach((col, index) => {\n const label = projection.labels.get(col.path);\n if (!label) return;\n let alias = `__tw_reference_${index}`;\n while (used.has(alias)) alias += '_';\n used.add(alias);\n extra.push({ path: label, alias });\n labelColumns[outputs[index]] = alias;\n hidden.push(alias);\n });\n return { view: extra.length ? { ...view, columns: [...columns, ...extra] } : view, labelColumns, hidden };\n}\n\n/** Navigation needs the complete authorized key, independently of authored show.\n * Add labels first so hidden key columns do not introduce extra reference labels. */\nexport function recordView<T extends { columns?: Array<{ path: string; alias?: string }> }>(\n schema: DatabaseSchema,\n table: TableMeta,\n view: T,\n enabled: boolean,\n namingPath: (table: TableMeta) => string | undefined = labelColumn,\n rootLabelPath?: (table: TableMeta) => string | undefined,\n) {\n const shown = view.columns?.length ? view : { ...view, columns: table.columns.map((column) => ({ path: column.name })) };\n const presentation = referenceView(schema, table, shown, enabled, namingPath);\n const columns = [...(presentation.view.columns ?? [])];\n const outputs = viewOutputs(columns);\n const used = new Set(outputs);\n const hidden = [...presentation.hidden];\n // A record's configured label may be a joined path and the view may have\n // named an unrelated column or alias the same way. Carry it in a private\n // output so navigation never reads an authored cell as the record's name.\n const naming = rootLabelPath?.(table);\n let labelColumn: { path: string; index: number } | undefined;\n if (naming) {\n let alias = '__tw_label';\n while (used.has(alias)) alias += '_';\n used.add(alias);\n labelColumn = { path: naming, index: columns.length };\n columns.push({ path: naming, alias });\n outputs.push(alias);\n hidden.push(alias);\n }\n const keyColumns = primaryKey(table).map((column, keyIndex) => {\n // A colliding authored output cannot be trusted to contain this path's value.\n let index = columns.findIndex((col, i) => col.path === column && outputs.filter((name) => name === outputs[i]).length === 1);\n if (index < 0) {\n let alias = `__tw_key_${keyIndex}`;\n while (used.has(alias)) alias += '_';\n used.add(alias);\n index = columns.length;\n columns.push({ path: column, alias });\n outputs.push(alias);\n hidden.push(alias);\n }\n return { column, index };\n });\n return { ...presentation, view: { ...presentation.view, columns }, hidden, keyColumns, labelColumn };\n}\n\n/** A private synthetic output is the only value record navigation may treat as\n * the configured label. It deliberately does not copy or rename authored cells. */\nexport function recordViewLabel(\n labelColumn: { path: string; index: number } | undefined,\n outputs: readonly string[],\n row: Record<string, unknown>,\n): Record<string, unknown> {\n if (!labelColumn) return {};\n const output = outputs[labelColumn.index];\n if (output === undefined || outputs.filter((name) => name === output).length !== 1 || !Object.hasOwn(row, output)) return {};\n return { [labelColumn.path]: row[output] };\n}\n\n/** Returned output positions preserve aliases without narrowing numeric strings. */\nexport function recordViewKey(\n keyColumns: readonly { column: string; index: number }[],\n outputs: readonly string[],\n row: Record<string, unknown>,\n): Record<string, string | number> | null {\n if (!keyColumns.length) return null;\n const entries: Array<[string, string | number]> = [];\n for (const { column, index } of keyColumns) {\n const output = outputs[index];\n if (output === undefined || outputs.filter((name) => name === output).length !== 1 || !Object.hasOwn(row, output)) return null;\n const value = row[output];\n if (typeof value !== 'string' && (typeof value !== 'number' || !Number.isFinite(value))) return null;\n entries.push([column, value]);\n }\n return Object.fromEntries(entries);\n}\n\n/* A child is named by its parent and a word that tells it from its siblings\n (\"Ada Park · follow-up\", docs/design.md). On the parent's own page every\n sibling repeats the page's title, so the list says the word alone; a name\n of some other parent, or one that is the parent's name and nothing more,\n is left as it is. */\nconst AFTER_PARENT = /^\\s*[·•–—:|/-]\\s*/u;\n\n/** A name that opens with the page record's, said without it. */\nexport function withoutParent<T>(value: T, parent: string | undefined): T | string {\n const name = parent?.trim();\n if (!name || typeof value !== 'string' || !value.startsWith(name)) return value;\n const rest = value.slice(name.length);\n const cut = AFTER_PARENT.exec(rest);\n const word = cut ? rest.slice(cut[0].length) : '';\n return cut && word.trim() ? word : value;\n}\n\n/** The rows with every label that opens with the page record's name said without it. */\nexport function withoutParentName(\n rows: ReadonlyArray<Record<string, unknown>>,\n labelOutputs: readonly string[],\n parent: string | undefined,\n): Array<Record<string, unknown>> {\n if (!parent?.trim() || !labelOutputs.length) return rows as Array<Record<string, unknown>>;\n const trim = (value: unknown) => withoutParent(value, parent);\n return rows.map((row) => {\n let next: Record<string, unknown> | undefined;\n for (const output of labelOutputs) {\n if (!Object.hasOwn(row, output)) continue;\n const said = trim(row[output]);\n if (said !== row[output]) (next ??= { ...row })[output] = said;\n }\n return next ?? row;\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shared-C9DZtSFH.js","names":["labelColumn"],"sources":["../../../engine/src/shared/referenceModel.ts"],"sourcesContent":["/** Reference paths and joined labels used when planning record and view reads. */\nimport { findTable, labelColumn, primaryKey, type ColumnMeta, type DatabaseSchema, type TableMeta } from './schema.js';\nimport { rollupColumnMeta } from './rollups.js';\nimport { MAX_PATH_DEPTH, tryResolvePath } from './viewPaths.js';\n\nfunction viewOutputs(columns: readonly { path: string; alias?: string }[]) {\n const counts = new Map<string, number>();\n return columns.map((col) => {\n const name = col.alias?.trim() || col.path;\n const count = (counts.get(name) ?? 0) + 1;\n counts.set(name, count);\n return count === 1 ? name : `${name}_${count}`;\n });\n}\n\n/** Joined labels share the field query; never fetch each reference separately. */\nexport function referenceProjection(\n schema: DatabaseSchema,\n table: TableMeta,\n paths: readonly string[],\n enabled: boolean,\n namingPath: (table: TableMeta) => string | undefined = labelColumn,\n) {\n const fetched = [...new Set(paths)];\n const labels = new Map<string, string>();\n if (!enabled) return { fetched, labels };\n /* A single column cannot safely traverse one leg of a composite foreign\n key — unless it is also a key of its own: a tenant's `vehicle_id` is both\n the composite `(tenant_id, vehicle_id)`, which keeps it in its tenant, and\n the single key its path walks, and was drawn as its opaque id. */\n const composite = (tableId: string) => {\n const single = new Set(\n schema.foreignKeys.filter((fk) => fk.from.table === tableId && fk.from.columns.length === 1).map((fk) => fk.from.columns[0]),\n );\n return new Set(\n schema.foreignKeys\n .filter((fk) => fk.from.table === tableId && fk.from.columns.length > 1)\n .flatMap((fk) => fk.from.columns)\n .filter((column) => !single.has(column)),\n );\n };\n for (const path of paths) {\n /* A reference reached through others — `employee_id.department_id` —\n is named the same way as one on the row itself: its record's label,\n read one hop further along, while the path stays within reach. */\n let column: ColumnMeta | undefined;\n let owner = table.id;\n let hops = 0;\n let derived = false;\n if (!path.includes('.')) {\n column = table.columns.find((col) => col.name === path);\n /* A latest of a reference column is the record's key too (rollups.ts): named as the column it reads is, by a\n column of that record (`resident.name`, viewPaths.ts); a template or a path past it is not a column to read. */\n const rollup = !column && table.rollups && Object.hasOwn(table.rollups, path) ? table.rollups[path] : undefined;\n if (rollup?.fn === 'latest' && rollup.references && !rollup.of) {\n column = rollupColumnMeta(path, rollup);\n derived = true;\n }\n } else {\n const { resolved } = tryResolvePath(schema, table.id, path);\n if (!resolved) continue;\n column = resolved.column;\n owner = resolved.table.id;\n hops = resolved.hops.length;\n }\n if (!column?.references || composite(owner).has(column.name)) continue;\n const target = findTable(schema, column.references.table);\n const naming = target && namingPath(target);\n if (derived && (!naming || naming.includes('.') || !target?.columns.some((col) => col.name === naming))) continue;\n if (!naming || hops + 1 + naming.split('.').length - 1 > MAX_PATH_DEPTH) continue;\n const labelAt = `${path}.${naming}`;\n labels.set(path, labelAt);\n if (!fetched.includes(labelAt)) fetched.push(labelAt);\n }\n return { fetched, labels };\n}\n\n/** Hidden label columns must not replace raw keys or collide with authored aliases. */\nexport function referenceView<T extends { columns?: Array<{ path: string; alias?: string }> }>(\n schema: DatabaseSchema,\n table: TableMeta,\n view: T,\n enabled: boolean,\n namingPath: (table: TableMeta) => string | undefined = labelColumn,\n) {\n const columns = view.columns ?? [];\n const projection = referenceProjection(\n schema,\n table,\n columns.map((col) => col.path),\n enabled,\n namingPath,\n );\n const labelColumns: Record<string, string> = {};\n const hidden: string[] = [];\n const outputs = viewOutputs(columns);\n const used = new Set(outputs);\n const extra: Array<{ path: string; alias: string }> = [];\n columns.forEach((col, index) => {\n const label = projection.labels.get(col.path);\n if (!label) return;\n let alias = `__tw_reference_${index}`;\n while (used.has(alias)) alias += '_';\n used.add(alias);\n extra.push({ path: label, alias });\n labelColumns[outputs[index]] = alias;\n hidden.push(alias);\n });\n return { view: extra.length ? { ...view, columns: [...columns, ...extra] } : view, labelColumns, hidden };\n}\n\n/** Navigation needs the complete authorized key, independently of authored show.\n * Add labels first so hidden key columns do not introduce extra reference labels. */\nexport function recordView<T extends { columns?: Array<{ path: string; alias?: string }> }>(\n schema: DatabaseSchema,\n table: TableMeta,\n view: T,\n enabled: boolean,\n namingPath: (table: TableMeta) => string | undefined = labelColumn,\n rootLabelPath?: (table: TableMeta) => string | undefined,\n) {\n const shown = view.columns?.length ? view : { ...view, columns: table.columns.map((column) => ({ path: column.name })) };\n const presentation = referenceView(schema, table, shown, enabled, namingPath);\n const columns = [...(presentation.view.columns ?? [])];\n const outputs = viewOutputs(columns);\n const used = new Set(outputs);\n const hidden = [...presentation.hidden];\n // A record's configured label may be a joined path and the view may have\n // named an unrelated column or alias the same way. Carry it in a private\n // output so navigation never reads an authored cell as the record's name.\n const naming = rootLabelPath?.(table);\n let labelColumn: { path: string; index: number } | undefined;\n if (naming) {\n let alias = '__tw_label';\n while (used.has(alias)) alias += '_';\n used.add(alias);\n labelColumn = { path: naming, index: columns.length };\n columns.push({ path: naming, alias });\n outputs.push(alias);\n hidden.push(alias);\n }\n const keyColumns = primaryKey(table).map((column, keyIndex) => {\n // A colliding authored output cannot be trusted to contain this path's value.\n let index = columns.findIndex((col, i) => col.path === column && outputs.filter((name) => name === outputs[i]).length === 1);\n if (index < 0) {\n let alias = `__tw_key_${keyIndex}`;\n while (used.has(alias)) alias += '_';\n used.add(alias);\n index = columns.length;\n columns.push({ path: column, alias });\n outputs.push(alias);\n hidden.push(alias);\n }\n return { column, index };\n });\n return { ...presentation, view: { ...presentation.view, columns }, hidden, keyColumns, labelColumn };\n}\n\n/** A private synthetic output is the only value record navigation may treat as\n * the configured label. It deliberately does not copy or rename authored cells. */\nexport function recordViewLabel(\n labelColumn: { path: string; index: number } | undefined,\n outputs: readonly string[],\n row: Record<string, unknown>,\n): Record<string, unknown> {\n if (!labelColumn) return {};\n const output = outputs[labelColumn.index];\n if (output === undefined || outputs.filter((name) => name === output).length !== 1 || !Object.hasOwn(row, output)) return {};\n return { [labelColumn.path]: row[output] };\n}\n\n/** Returned output positions preserve aliases without narrowing numeric strings. */\nexport function recordViewKey(\n keyColumns: readonly { column: string; index: number }[],\n outputs: readonly string[],\n row: Record<string, unknown>,\n): Record<string, string | number> | null {\n if (!keyColumns.length) return null;\n const entries: Array<[string, string | number]> = [];\n for (const { column, index } of keyColumns) {\n const output = outputs[index];\n if (output === undefined || outputs.filter((name) => name === output).length !== 1 || !Object.hasOwn(row, output)) return null;\n const value = row[output];\n if (typeof value !== 'string' && (typeof value !== 'number' || !Number.isFinite(value))) return null;\n entries.push([column, value]);\n }\n return Object.fromEntries(entries);\n}\n\n/* A child is named by its parent and a word that tells it from its siblings\n (\"Ada Park · follow-up\", docs/design.md). On the parent's own page every\n sibling repeats the page's title, so the list says the word alone; a name\n of some other parent, or one that is the parent's name and nothing more,\n is left as it is. */\nconst AFTER_PARENT = /^\\s*[·•–—:|/-]\\s*/u;\n\n/** A name that opens with the page record's, said without it. */\nexport function withoutParent<T>(value: T, parent: string | undefined): T | string {\n const name = parent?.trim();\n if (!name || typeof value !== 'string' || !value.startsWith(name)) return value;\n const rest = value.slice(name.length);\n const cut = AFTER_PARENT.exec(rest);\n const word = cut ? rest.slice(cut[0].length) : '';\n return cut && word.trim() ? word : value;\n}\n\n/** The rows with every label that opens with the page record's name said without it. */\nexport function withoutParentName(\n rows: ReadonlyArray<Record<string, unknown>>,\n labelOutputs: readonly string[],\n parent: string | undefined,\n): Array<Record<string, unknown>> {\n if (!parent?.trim() || !labelOutputs.length) return rows as Array<Record<string, unknown>>;\n const trim = (value: unknown) => withoutParent(value, parent);\n return rows.map((row) => {\n let next: Record<string, unknown> | undefined;\n for (const output of labelOutputs) {\n if (!Object.hasOwn(row, output)) continue;\n const said = trim(row[output]);\n if (said !== row[output]) (next ??= { ...row })[output] = said;\n }\n return next ?? row;\n });\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { nt as Button } from "./shared-poc11xxo.js";
|
|
2
2
|
import { gt as defineMessages } from "./shared-DJZjSi3J.js";
|
|
3
3
|
import { d as readClaim, n as answerClaim } from "./shared-CKKduWQD.js";
|
|
4
|
-
import "./shared-
|
|
4
|
+
import "./shared-B4jgU8h9.js";
|
|
5
5
|
import { useEffect, useId, useState } from "react";
|
|
6
6
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
7
7
|
// packages/mistri/src/client/copy/public/components/FormClaimSurface.ts
|
|
@@ -153,4 +153,4 @@ function FormClaimSurface({ form, appName, statusHref, onSignIn }) {
|
|
|
153
153
|
}
|
|
154
154
|
export { FormClaimSurface };
|
|
155
155
|
|
|
156
|
-
//# sourceMappingURL=shared-
|
|
156
|
+
//# sourceMappingURL=shared-CA52ClGo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-
|
|
1
|
+
{"version":3,"file":"shared-CA52ClGo.js","names":["_Fragment"],"sources":["../../src/client/copy/public/components/FormClaimSurface.ts","../../src/client/components/FormClaimSurface.tsx"],"sourcesContent":["/** What FormClaimSurface says, in the public pages room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '@mistriwork/kit/client/messages.js';\n\nexport const say = defineMessages({\n addedToYourAccountTitle: 'Added to your account',\n notAdded: 'Not added',\n addItToYourAccount: 'Add it to your account?',\n nothingToAdd: 'Nothing to add',\n lookingForTheApplication: 'Looking for the application you just submitted…',\n addApplication: 'Add application',\n toTheAccountYouAreSigned: 'to the account you are signed in to? Only its status is shown there.',\n yesAdd: 'Yes, add it',\n isInYourAccount: '{reference} is in your account now.',\n seeItsStatus: 'See its status',\n itWasNotAdded: 'It was not added, and this browser can no longer add it.',\n thereIsNoApplication: 'There is no application waiting to be added here. It may have been added already, declined, or timed out.',\n});\n","/**\n * The account screen a saved form's done screen leads to\n * (`/{app}/form/{key}/claim`): \"Add application APP-… to this account?\"\n *\n * The claim the submit left in this browser is spent here and nowhere else —\n * never by a sign-in on its own, because the next person at a shared\n * computer must not inherit it (server/forms/formLink.ts). Signed out, the\n * page is the App's sign-in (or its sign-up, from \"Create an account\"), and\n * comes back here once there is a session. Yes adds it; No burns the claim.\n */\nimport { useEffect, useId, useState } from 'react';\nimport { Button } from '@mistriwork/ui/Button.js';\nimport { answerClaim, readClaim, type SavedFormFailure } from './savedFormApi.js';\nimport './FormSurface.css';\nimport { say } from '../copy/public/components/FormClaimSurface.js';\n\ntype Phase =\n | { kind: 'asking' }\n | { kind: 'question'; reference: string }\n | { kind: 'none' }\n | { kind: 'added'; reference: string }\n | { kind: 'declined' };\n\nexport function FormClaimSurface({\n form,\n appName,\n statusHref,\n onSignIn,\n}: {\n form: { id: string; label: string };\n appName: string;\n /** The form's status check page, when it has one: where an added application is followed. */\n statusHref?: string;\n /** Nobody is signed in: draw the App's sign-in here instead. */\n onSignIn: () => void;\n}) {\n const id = useId();\n const [phase, setPhase] = useState<Phase>({ kind: 'asking' });\n const [failure, setFailure] = useState('');\n const [pending, setPending] = useState(false);\n\n useEffect(() => {\n let live = true;\n readClaim(form.id).then(\n (found) => {\n if (!live) return;\n if (!found.signedIn) {\n onSignIn();\n return;\n }\n setPhase(found.reference ? { kind: 'question', reference: found.reference } : { kind: 'none' });\n },\n (error) => {\n if (live) {\n setFailure((error as Error).message);\n setPhase({ kind: 'none' });\n }\n },\n );\n return () => {\n live = false;\n };\n }, [form.id, onSignIn]);\n\n const answer = async (said: 'yes' | 'no') => {\n if (pending || phase.kind !== 'question') return;\n setPending(true);\n setFailure('');\n try {\n const reference = await answerClaim(form.id, said);\n setPhase(said === 'yes' ? { kind: 'added', reference: reference ?? phase.reference } : { kind: 'declined' });\n } catch (error) {\n setFailure((error as SavedFormFailure).message);\n setPhase({ kind: 'none' });\n } finally {\n setPending(false);\n }\n };\n\n const title =\n phase.kind === 'added'\n ? say('addedToYourAccountTitle')\n : phase.kind === 'declined'\n ? say('notAdded')\n : phase.kind === 'question'\n ? say('addItToYourAccount')\n : phase.kind === 'none'\n ? say('nothingToAdd')\n : form.label;\n return (\n <section className=\"form-page form-page-done\" aria-labelledby={`${id}-title`}>\n <p className=\"eyebrow\">{appName}</p>\n <h1\n id={`${id}-title`}\n tabIndex={-1}\n ref={(node) => {\n if (phase.kind !== 'asking') node?.focus();\n }}\n >\n {title}\n </h1>\n {phase.kind === 'asking' && (\n <p className=\"form-page-description\" role=\"status\">\n {say('lookingForTheApplication')}\n </p>\n )}\n {phase.kind === 'question' && (\n <>\n <p className=\"form-page-done-message\">\n {say('addApplication')} <strong>{phase.reference}</strong> {say('toTheAccountYouAreSigned')}\n </p>\n <div className=\"form-claim-actions\">\n <Button intent=\"primary\" onClick={() => void answer('yes')} busy={pending}>\n {say('yesAdd')}\n </Button>\n <Button intent=\"secondary\" onClick={() => void answer('no')} disabled={pending}>\n {say('common.no')}\n </Button>\n </div>\n </>\n )}\n {phase.kind === 'added' && (\n <p className=\"form-page-done-message\" role=\"status\">\n {say('isInYourAccount', { reference: phase.reference })}\n {statusHref && (\n <>\n {' '}\n <a href={statusHref}>{say('seeItsStatus')}</a>.\n </>\n )}\n </p>\n )}\n {phase.kind === 'declined' && (\n <p className=\"form-page-done-message\" role=\"status\">\n {say('itWasNotAdded')}\n </p>\n )}\n {phase.kind === 'none' && !failure && <p className=\"form-page-done-message\">{say('thereIsNoApplication')}</p>}\n <p className=\"form-page-failure\" role=\"alert\" aria-live=\"assertive\" hidden={!failure}>\n {failure}\n </p>\n </section>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { D as subscribeSessionIdentity, E as sessionIdentity, it as useQuery, nt as Button } from "./shared-poc11xxo.js";
|
|
2
2
|
import { Pn as useQueryClient, gt as defineMessages } from "./shared-DJZjSi3J.js";
|
|
3
|
-
import { A as releaseEditNotice, M as useEditNotice, O as liveKeyText, k as registerEditing } from "./shared-
|
|
4
|
-
import { L as state, i as api, st as ownedBy } from "./shared-
|
|
3
|
+
import { A as releaseEditNotice, M as useEditNotice, O as liveKeyText, k as registerEditing } from "./shared-BHsjawAG.js";
|
|
4
|
+
import { L as state, i as api, st as ownedBy } from "./shared-BoLbc2WD.js";
|
|
5
5
|
import { t as Modal } from "./shared-CRr4kJXB.js";
|
|
6
|
-
import { t as onDemand } from "./shared-
|
|
7
|
-
import { a as countedLabel, s as prepareBulkCommand } from "./shared-
|
|
6
|
+
import { t as onDemand } from "./shared-B-BUF9fx.js";
|
|
7
|
+
import { a as countedLabel, s as prepareBulkCommand } from "./shared-Chp88all.js";
|
|
8
8
|
import { n as commandKeyText, t as commandFieldsDeep } from "./shared-Du2YAQk4.js";
|
|
9
|
-
import { t as commandOperations } from "./shared-
|
|
10
|
-
import { a as commandInput, d as readsRecord, i as blankCommandValues, l as draftLogic, r as asksDraftLogic, t as CommandFields, u as prefilledCommandValues } from "./shared-
|
|
11
|
-
import { v as recordColumnsIn } from "./shared-
|
|
9
|
+
import { t as commandOperations } from "./shared-Docl_0tq.js";
|
|
10
|
+
import { a as commandInput, d as readsRecord, i as blankCommandValues, l as draftLogic, r as asksDraftLogic, t as CommandFields, u as prefilledCommandValues } from "./shared-JvcI-LWp.js";
|
|
11
|
+
import { v as recordColumnsIn } from "./shared-CL3RLKDA.js";
|
|
12
12
|
import { useEffect, useId, useMemo, useRef, useState, useSyncExternalStore } from "react";
|
|
13
13
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
14
14
|
// packages/mistri/src/client/copy/forms/components/CommandForm.ts
|
|
@@ -37,7 +37,7 @@ var say = defineMessages({
|
|
|
37
37
|
* command's inputs through CommandFields, and submits once under a request
|
|
38
38
|
* key the operation store keeps, for one record or a queue's selection.
|
|
39
39
|
*/
|
|
40
|
-
var LiveEditNotice = onDemand(() => import("./shared-
|
|
40
|
+
var LiveEditNotice = onDemand(() => import("./shared-B07qIMlE.js"), "LiveEditNotice", { quiet: true });
|
|
41
41
|
/** One record prepared: the revision the form submits, and its starting values when the command serves them. */
|
|
42
42
|
var waitingPickers = (fields) => Object.fromEntries([...commandFieldsDeep(fields)].flatMap(({ field, path }) => field.type === "reference" && field.query && recordColumnsIn(field.query).length ? [[path, null]] : []));
|
|
43
43
|
function asked(input, record) {
|
|
@@ -360,4 +360,4 @@ function CommandForm({ action, owner, label, onClose, onDone, isCurrent, targets
|
|
|
360
360
|
}
|
|
361
361
|
export { CommandForm };
|
|
362
362
|
|
|
363
|
-
//# sourceMappingURL=shared-
|
|
363
|
+
//# sourceMappingURL=shared-CBciTwm6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-BbSbilkh.js","names":["_Fragment"],"sources":["../../src/client/copy/forms/components/CommandForm.ts","../../src/client/components/CommandForm.tsx"],"sourcesContent":["/** What CommandForm says, in the forms room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '@mistriwork/kit/client/messages.js';\n\nexport const say = defineMessages({\n theSessionChanged: 'The session changed.',\n deselectTheIneligibleRecords: 'Deselect the ineligible records to continue.',\n readyToSubmit: 'Ready to submit {count}.',\n readyToSubmitOne: 'Ready to submit.',\n deselectIneligible: 'Deselect ineligible',\n checkResult: 'Check result',\n retrySameSubmission: 'Retry same submission',\n refreshAndReview: 'Refresh and review',\n checkTheRecord:\n 'The result is not confirmed, and this action keeps no receipt to check it by. Refresh the record and look before you try again.',\n recordCouldNotBePrepared: 'The record could not be prepared. Refresh and try again.',\n recordsCouldNotBePrepared: 'The records could not be prepared. Refresh and try again.',\n readingTheCurrentVersion: 'Reading the current record version…',\n readingTheCurrentVersions: 'Reading the current record versions…',\n oneIneligible: 'One selected record cannot take this action now. The request is all or nothing, so it would refuse the whole request.',\n manyIneligible:\n '{count} selected records cannot take this action now. The request is all or nothing, so any one of them would refuse the whole request.',\n});\n","/**\n * A record action's command form: the modal that prepares the record — its\n * revision, and the starting values the command serves — draws the\n * command's inputs through CommandFields, and submits once under a request\n * key the operation store keeps, for one record or a queue's selection.\n */\nimport { ownedBy } from '@mistriwork/kit/client/requestIdentity.js';\nimport { useEffect, useId, useMemo, useRef, useState, useSyncExternalStore, type RefObject } from 'react';\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport type { AppCommandAction } from '../../shared/app.js';\nimport { api, state } from '@mistriwork/kit/client/core.js';\nimport { commandOperations, type CommandOperation, type CommandOwner } from '../commandState.js';\nimport { countedLabel, prepareBulkCommand, type PreparedTarget } from '@mistriwork/kit/client/bulkActions.js';\nimport { commandFieldsDeep, commandKeyText, recordColumnsIn, type AppCommandField } from '../../shared/command.js';\nimport { sessionIdentity, subscribeSessionIdentity } from '@mistriwork/kit/client/sessionIdentity.js';\nimport {\n CommandFields,\n asksDraftLogic,\n blankCommandValues,\n draftLogic,\n readsRecord,\n commandInput,\n prefilledCommandValues,\n type CommandQuestions,\n type CommandValues,\n} from './CommandFields.js';\nimport { Button } from '@mistriwork/ui/Button.js';\nimport { Modal } from '@mistriwork/ui/Modal.js';\nimport { say } from '../copy/forms/components/CommandForm.js';\nimport { liveKeyText, registerEditing, releaseEditNotice, useEditNotice } from '@mistriwork/kit/client/liveState.js';\nimport { onDemand } from '@mistriwork/kit/client/components/onDemand.js';\nimport type { TableMeta } from '@mistriwork/engine/shared/schema.js';\n\nconst LiveEditNotice = onDemand(() => import('@mistriwork/kit/client/components/LiveNotices.js'), 'LiveEditNotice', { quiet: true });\n\n/** One record prepared: the revision the form submits, and its starting values when the command serves them. */\n/* The pickers that read the record (`record.id` in their query), each waiting (null) until prepare binds it. */\nconst waitingPickers = (fields: readonly AppCommandField[]): Record<string, null> =>\n Object.fromEntries(\n [...commandFieldsDeep(fields)].flatMap(({ field, path }) =>\n field.type === 'reference' && field.query && recordColumnsIn(field.query).length ? [[path, null]] : [],\n ),\n );\n\n/* The fields a prepared record is asked. A `when` that reads the record waits for prepare: left out where the\n record's part never holds, a plain field where it always does, and otherwise the draft's part prepare left to\n judge as it is typed. A `when` over the draft alone is the form's own to judge (commandDraft.ts). */\nfunction asked(\n input: readonly AppCommandField[],\n record: { withheld?: string[]; when?: Record<string, string> } | undefined,\n): readonly AppCommandField[] {\n if (!input.some((field) => field.type !== 'group' && field.type !== 'lines' && field.when !== undefined && readsRecord(field.when)))\n return input;\n return input.flatMap((field): AppCommandField[] => {\n if (field.type === 'group' || field.type === 'lines' || field.when === undefined || !readsRecord(field.when)) return [field];\n if (!record || record.withheld?.includes(field.name)) return [];\n const { when: _when, ...plain } = field;\n const left = record.when?.[field.name];\n return [(left === undefined ? plain : { ...plain, when: left }) as AppCommandField];\n });\n}\n\ninterface PreparedRecord {\n expectedVersion: number;\n initial?: Record<string, unknown>;\n /** Pickers that read the record (`record.id` in their query), bound to it: by declared path, null for none. */\n choices?: Record<string, string | null>;\n /** The inputs this record is not asked: their `when` does not hold of it. */\n withheld?: string[];\n /** What is left of a record-reading `when` to judge over the draft, by input. */\n when?: Record<string, string>;\n /** The questions defined in rows this record is asked, by input name (`field.defined`). */\n questions?: CommandQuestions;\n /** The count of applied commands when this prepare was asked (commandOperations.appliedOn). */\n seen: number;\n}\n/* The same count for a group's prepare, whose answer is a Map. */\nconst groupSeen = new WeakMap<Map<string, PreparedTarget>, number>();\n\n/** The table a command acts on, as live sync's notice names it (its noun, its history). */\nconst liveTable = (id: string): TableMeta =>\n (state.schema?.tables?.find((table: TableMeta) => table.id === id) as TableMeta | undefined) ??\n ({ id, name: id, columns: [] } as unknown as TableMeta);\n\n/** One record of a group, as the host names it. */\ninterface CommandTarget {\n key: Record<string, unknown>;\n label: string;\n}\n\nexport function CommandForm({\n action,\n owner,\n label,\n onClose,\n onDone,\n isCurrent,\n targets,\n onDeselect,\n finalFocus,\n noun,\n initial,\n headless,\n onApplied,\n}: {\n action: AppCommandAction;\n owner: CommandOwner;\n label: string;\n /** Starting values a custom component handed over (useCommand's `open`), over the blank form and before the command's own. */\n initial?: Readonly<Record<string, unknown>>;\n /** Opened by a component's `open`, which holds this form and resolves it: the record's action bar must not draw its\n own copy over the same operation, and Done there would blank this one. */\n headless?: boolean;\n /** What a group's records are called, so its verb counts them: \"Approve 2 timesheets\". */\n noun?: { one: string; many: string };\n /** The form closed; a settled operation says how it ended (success or a definite refusal). */\n onClose: (settled?: CommandOperation) => void;\n onDone: () => void;\n /** The command landed: what to ask again. A record's bar asks its record (recordWriteRefresh.ts refreshAfterCommand);\n without it, every read is asked again, as a group's or an assistant's form does. */\n onApplied?: () => void;\n /** Supplemental host lifetime; retirement never forgets an operation. */\n isCurrent?: () => boolean;\n /** A group owner's records, aligned with `owner.keys`. */\n targets?: CommandTarget[];\n /** Drop these records from the group. The host owns the selection, and the form follows it. */\n onDeselect?: (keys: Array<Record<string, unknown>>) => void;\n /** Where the host wants focus when the form closes — its report of the outcome. */\n finalFocus?: RefObject<HTMLElement | null>;\n}) {\n // A group is one request for several records: every one commits or none does.\n const group = owner.keys !== undefined;\n const [identity] = useState(sessionIdentity);\n const currentIdentity = useSyncExternalStore(subscribeSessionIdentity, sessionIdentity, sessionIdentity);\n useSyncExternalStore(commandOperations.subscribe, commandOperations.version, commandOperations.version);\n const operation = commandOperations.get(owner);\n const [values, setValues] = useState<CommandValues>(\n () =>\n (operation?.envelope.input as CommandValues | undefined) ??\n (initial ? prefilledCommandValues(action.command.input, initial) : blankCommandValues(action.command.input)),\n );\n /* The fields the person has changed since the form was (re)filled. The\n starting values arrive with `prepare`, which can answer after someone has\n already picked a code or typed a note: they fill every field but these,\n so neither the edits nor the starting values are lost (a box that starts\n checked stayed unchecked because one other field had been typed in). */\n const touched = useRef(new Set<string>());\n const [problem, setProblem] = useState('');\n /* A refusal that names one of the inputs — `refuse('Only $12.00 is left to refund', { field: 'amount' })` — is said\n beside that input, and the form lets go of the attempt so the answer can be changed and sent again: nothing ran. */\n const [beside, setBeside] = useState<Record<string, string> | undefined>(undefined);\n const refusedField =\n operation?.phase === 'error' &&\n operation.field &&\n action.command.input.some((field) => field.name === operation.field!.split(/[.[]/)[0])\n ? operation.field\n : undefined;\n useEffect(() => {\n if (!refusedField || !operation || !current()) return;\n setBeside({ [refusedField]: operation.message });\n commandOperations.forget(owner);\n });\n // The selection the form opened with is what it prepares; deselecting\n // narrows the request without asking the server again.\n const [preparedKeys] = useState(() => owner.keys?.map((key) => ({ ...key })));\n const client = useQueryClient();\n const id = useId();\n const ownerText = JSON.stringify([owner.connection, owner.target, owner.command, owner.commandVersion, owner.key, owner.keys]);\n /* Live sync (liveInvalidate.ts): once something is typed, the records the form acts on are not read over it — their\n fields, its prepared starting values — and a change to one is said in the status line instead. Untouched, the\n form still follows the record. Let go when the form closes, with the notice it raised: the next form starts\n clean, unless the record's own draft is still open over the same record and still owns it. */\n const recordText = owner.keys ? '' : liveKeyText(owner.key);\n const changedElsewhere = useEditNotice(owner.target, recordText);\n useEffect(() => {\n const release = registerEditing(() => {\n if (!touched.current.size || commandOperations.get(owner)) return undefined;\n const keys = owner.keys ?? (Object.keys(owner.key).length ? [owner.key] : []);\n return keys.map((key) => ({ table: owner.target, key }));\n });\n return () => {\n release();\n for (const key of owner.keys ?? [owner.key]) releaseEditNotice(owner.target, liveKeyText(key));\n };\n }, [ownerText]);\n const lifetime = useMemo(() => ({}), [ownerText, isCurrent]);\n const activeLifetime = useRef(lifetime);\n activeLifetime.current = lifetime;\n const mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n /* Closed, and only waiting to be taken down. A component's form (useCommand's `open`) is unmounted a microtask after\n it closes (mount.tsx), so it draws once more with its refused operation forgotten — which re-enabled its prepare,\n whose answer, arriving after the unmount, failed as \"no longer current\" and stood in the cache as the answer a\n form opened again at once was handed: \"The record could not be prepared\". */\n const closed = useRef(false);\n const current = () => {\n try {\n return (\n mounted.current &&\n activeLifetime.current === lifetime &&\n sessionIdentity() === identity &&\n identity.mode === 'authenticated' &&\n state.activeConnection === owner.connection &&\n (isCurrent === undefined || isCurrent() === true)\n );\n } catch {\n return false;\n }\n };\n const prepared = useQuery({\n queryKey: ['command-prepare', identity.epoch, group ? { ...owner, keys: preparedKeys, labels: undefined } : owner],\n retry: false,\n staleTime: 0,\n gcTime: 0,\n enabled: current() && !operation && !closed.current,\n /* Reading the signal lets a read nobody waits for any more be cancelled back to what it was, rather than settle as\n an error the next form of this record would be handed. */\n queryFn: async ({ signal }): Promise<PreparedRecord | Map<string, PreparedTarget>> => {\n if (!current() || signal.aborted) throw new Error(say('common.thisCommandFormIsNoLonger'));\n const seen = commandOperations.appliedOn(owner.connection, owner.target, preparedKeys ?? [owner.key]);\n // The draft's logic travels beside prepare, so the form is drawn whole once prepare answers (CommandFields.tsx).\n const logic = asksDraftLogic(action.command.input) ? draftLogic.ready() : undefined;\n if (group) {\n const keys = (preparedKeys ?? []).map((key) =>\n Object.fromEntries(\n Object.entries(key).filter(\n (entry): entry is [string, string | number] => typeof entry[1] === 'string' || typeof entry[1] === 'number',\n ),\n ),\n );\n const result = await prepareBulkCommand(owner.connection, action, keys);\n if (!current()) throw new Error(say('theSessionChanged'));\n const statuses = new Map(result.map((target) => [commandKeyText(target.key), target]));\n groupSeen.set(statuses, seen);\n return statuses;\n }\n const result = await api('/api/commands/prepare', {\n ...ownedBy(owner.connection),\n command: owner.command,\n commandVersion: owner.commandVersion,\n key: owner.key,\n });\n await logic;\n if (!current()) throw new Error(say('theSessionChanged'));\n if (!Number.isSafeInteger(result.expectedVersion) || result.expectedVersion < 0)\n throw new Error(say('common.theRecordVersionIsUnavailable'));\n const initial =\n result.initial && typeof result.initial === 'object' && !Array.isArray(result.initial)\n ? (result.initial as Record<string, unknown>)\n : undefined;\n const choices = result.choices && typeof result.choices === 'object' ? (result.choices as Record<string, string | null>) : undefined;\n const withheld = Array.isArray(result.withheld) ? (result.withheld as unknown[]).filter((name) => typeof name === 'string') : [];\n const when =\n result.when && typeof result.when === 'object' && !Array.isArray(result.when)\n ? Object.fromEntries(Object.entries(result.when as Record<string, unknown>).filter(([, text]) => typeof text === 'string'))\n : undefined;\n const questions = result.defined && typeof result.defined === 'object' ? (result.defined as CommandQuestions) : undefined;\n return {\n expectedVersion: result.expectedVersion as number,\n ...(initial ? { initial } : {}),\n ...(choices ? { choices } : {}),\n ...(withheld.length ? { withheld } : {}),\n ...(when && Object.keys(when).length ? { when: when as Record<string, string> } : {}),\n ...(questions ? { questions } : {}),\n seen,\n };\n },\n });\n const record = prepared.data instanceof Map ? undefined : prepared.data;\n /* The inputs this record is asked: one asked only where its `when` holds waits for prepare to say,\n is left out where it does not, and is an ordinary field — required unless optional — where it does. */\n const fields = useMemo(() => asked(action.command.input, record), [action.command.input, record]);\n /* Another command applied to this record after this form prepared it: the\n revision it holds is one it knows is old, and submitting it could only\n be refused as stale. The form prepares again and holds its submit until\n that answer is in, rather than wait for whoever applied it to refresh\n the page's queries (which a busy server answers late, if at all). */\n const seen = prepared.data instanceof Map ? groupSeen.get(prepared.data) : record?.seen;\n const outdated =\n !operation && seen !== undefined && commandOperations.appliedOn(owner.connection, owner.target, preparedKeys ?? [owner.key]) > seen;\n const refetchPrepared = prepared.refetch;\n useEffect(() => {\n if (outdated && !prepared.isFetching && !prepared.isError) void refetchPrepared();\n }, [outdated, prepared.isFetching, prepared.isError, refetchPrepared]);\n /* The command's starting values, read with the revision this form will\n submit: laid over the blank form once per prepare, unless the person has\n already typed. \"Refresh and review\" prepares again and fills again, so\n what is reviewed is the record as it is now. */\n /* Filled while rendering, not in an effect after it: an effect let one\n frame commit with the revision ready and the fields still blank, and a\n quick submit sent the blank form (\"Amount is required\"). React renders\n again at once, before anything is drawn. */\n const [filledFrom, setFilledFrom] = useState<PreparedRecord | undefined>(undefined);\n if (record?.initial && !operation && filledFrom !== record) {\n setFilledFrom(record);\n // What a component handed over stands over the command's own starting values.\n const filled = prefilledCommandValues(action.command.input, { ...record.initial, ...initial });\n for (const name of touched.current) if (Object.hasOwn(values, name)) filled[name] = values[name];\n setValues(filled);\n }\n if (currentIdentity !== identity || !current()) return null;\n const pending = operation?.phase === 'pending';\n const unknown = operation?.phase === 'unknown';\n const success = operation?.phase === 'success';\n /* An action that keeps no receipt has nothing to check a lost answer by:\n the record is what says whether it ran, so the form lets go of it. */\n const untracked = action.untracked === true;\n const locked = pending || (unknown && !untracked);\n const listed: CommandTarget[] = targets ?? (owner.keys ?? []).map((key) => ({ key, label: commandKeyText(key) }));\n const statuses = prepared.data instanceof Map ? prepared.data : undefined;\n const ineligible = statuses ? listed.filter((target) => !statuses.get(commandKeyText(target.key))?.eligible) : [];\n const versions = (owner.keys ?? []).map((key) => statuses?.get(commandKeyText(key))?.expectedVersion ?? null);\n const ready =\n !outdated &&\n (group\n ? Boolean(statuses) && listed.length > 0 && !ineligible.length && versions.every((version) => version !== null)\n : typeof record?.expectedVersion === 'number');\n const send = (submitted: NonNullable<typeof operation>, endpoint: 'execute' | 'status') => {\n void commandOperations.send(\n submitted,\n endpoint,\n (path, envelope) => {\n if (path !== '/api/commands/execute' && path !== '/api/commands/status') throw new Error(say('common.invalidCommandPath'));\n if (!current()) throw Object.assign(new Error(say('common.thisCommandFormIsNoLonger')), { outcome: 'not_applied' });\n return api(path, { ...envelope, ...ownedBy(owner.connection) });\n },\n () => {\n if (current()) (onApplied ?? (() => void client.invalidateQueries()))();\n },\n );\n };\n const close = () => {\n // Read the real operation again: an old Cancel closure may predate dispatch.\n const live = commandOperations.get(owner);\n if (!current() || live !== operation || live?.phase === 'pending' || (live?.phase === 'unknown' && !untracked)) return;\n closed.current = true;\n commandOperations.forget(owner);\n onClose(live);\n if (success && current()) onDone();\n };\n const review = () => {\n const live = commandOperations.get(owner);\n if (!current() || live !== operation || live?.phase === 'pending' || (live?.phase === 'unknown' && !untracked)) return;\n commandOperations.forget(owner);\n setProblem('');\n touched.current = new Set();\n void prepared.refetch();\n void client.invalidateQueries({ predicate: (query) => query.queryKey[0] !== 'command-prepare' });\n };\n const refused = operation?.refusedKey && listed.find((target) => commandKeyText(target.key) === commandKeyText(operation.refusedKey));\n const count = say('common.records2', { count: listed.length });\n /* The verb follows the selection as it narrows: a group of two says so. A label the App's messages count\n (useBulkSelection.tsx ActionLabel) is not counted as English counts; the form's count line says how many. */\n const verb = group && noun && !(action as { counted?: unknown }).counted ? countedLabel(action.label, listed.length, noun) : action.label;\n const noticed = Boolean(changedElsewhere && !operation && !problem);\n const feedback =\n problem ||\n (unknown && untracked ? say('checkTheRecord') : '') ||\n (operation?.message && `${operation.message}${refused ? ` (${refused.label})` : ''}`) ||\n (prepared.isError\n ? say(group ? 'recordsCouldNotBePrepared' : 'recordCouldNotBePrepared')\n : prepared.isPending || outdated\n ? say(group ? 'readingTheCurrentVersions' : 'readingTheCurrentVersion')\n : group && ineligible.length\n ? say('deselectTheIneligibleRecords')\n : group\n ? say('readyToSubmit', { count })\n : say('readyToSubmitOne'));\n return (\n <Modal className=\"confirm command-form\" ariaLabel={verb} onClose={close} closeDisabled={locked} finalFocus={finalFocus}>\n <h2>{verb}</h2>\n <p className=\"insert-lede\">{label}</p>\n {group && ineligible.length > 0 && !operation && (\n <div className=\"command-ineligible\" role=\"alert\">\n <p>{ineligible.length === 1 ? say('oneIneligible') : say('manyIneligible', { count: ineligible.length })}</p>\n <ul>\n {ineligible.map((target) => (\n <li key={commandKeyText(target.key)}>{target.label}</li>\n ))}\n </ul>\n {onDeselect && (\n <Button\n intent=\"secondary\"\n onClick={() => {\n if (current()) onDeselect(ineligible.map((target) => target.key));\n }}\n >\n {say('deselectIneligible')}\n </Button>\n )}\n </div>\n )}\n <form\n noValidate\n onSubmit={(event) => {\n event.preventDefault();\n if (!current() || operation || !ready || prepared.isFetching) return;\n try {\n const input = commandInput(fields, values, record?.questions);\n setProblem('');\n setBeside(undefined);\n send(\n commandOperations.start(owner, group ? (versions as number[]) : record!.expectedVersion, input, action, headless),\n 'execute',\n );\n } catch (error) {\n setProblem((error as Error).message);\n }\n }}\n >\n <fieldset className=\"command-fields\" disabled={Boolean(operation)}>\n <CommandFields\n fields={fields}\n values={values}\n idPrefix={id}\n disabled={Boolean(operation)}\n inputs={action.inputs}\n connection={owner.connection}\n {...(!owner.keys && Object.keys(owner.key).length ? { record: { table: owner.target, key: owner.key } } : {})}\n identityEpoch={identity.epoch}\n isCurrent={current}\n {...(beside ? { problems: beside } : {})}\n bound={record ? (record.choices ?? {}) : waitingPickers(action.command.input)}\n {...(record?.questions ? { questions: record.questions } : {})}\n onChange={(next, path) => {\n for (const field of action.command.input)\n if (JSON.stringify(next[field.name]) !== JSON.stringify(values[field.name])) touched.current.add(field.name);\n if (beside && path !== undefined && Object.hasOwn(beside, path)) setBeside(undefined);\n setValues(next);\n }}\n />\n </fieldset>\n <p\n className=\"command-feedback\"\n data-phase={problem ? 'error' : (operation?.phase ?? (prepared.isError ? 'error' : 'ready'))}\n /* Drawn while it holds a change from elsewhere: a ready line is otherwise said to a screen reader only, and\n Keep editing has to be seen and pressed. */\n {...(noticed ? { 'data-live': '' } : {})}\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {noticed ? <LiveEditNotice table={liveTable(owner.target)} recordKey={owner.key} place=\"inline\" /> : feedback}\n </p>\n <div className=\"confirm-actions\">\n <Button intent=\"secondary\" disabled={locked} onClick={close}>\n {success ? say('common.done') : say('common.cancel')}\n </Button>\n {unknown && !untracked ? (\n <>\n <Button\n intent=\"secondary\"\n onClick={() => {\n if (current()) send(operation!, 'status');\n }}\n >\n {say('checkResult')}\n </Button>\n <Button\n intent=\"primary\"\n onClick={() => {\n if (current()) send(operation!, 'execute');\n }}\n >\n {say('retrySameSubmission')}\n </Button>\n </>\n ) : operation?.phase === 'error' || unknown || prepared.isError ? (\n <Button intent=\"primary\" onClick={review}>\n {say('refreshAndReview')}\n </Button>\n ) : (\n !success && (\n <Button intent=\"primary\" type=\"submit\" disabled={pending || !ready || prepared.isFetching}>\n {pending ? say('common.submitting') : verb}\n </Button>\n )\n )}\n </div>\n </form>\n </Modal>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shared-CBciTwm6.js","names":["_Fragment"],"sources":["../../src/client/copy/forms/components/CommandForm.ts","../../src/client/components/CommandForm.tsx"],"sourcesContent":["/** What CommandForm says, in the forms room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '@mistriwork/kit/client/messages.js';\n\nexport const say = defineMessages({\n theSessionChanged: 'The session changed.',\n deselectTheIneligibleRecords: 'Deselect the ineligible records to continue.',\n readyToSubmit: 'Ready to submit {count}.',\n readyToSubmitOne: 'Ready to submit.',\n deselectIneligible: 'Deselect ineligible',\n checkResult: 'Check result',\n retrySameSubmission: 'Retry same submission',\n refreshAndReview: 'Refresh and review',\n checkTheRecord:\n 'The result is not confirmed, and this action keeps no receipt to check it by. Refresh the record and look before you try again.',\n recordCouldNotBePrepared: 'The record could not be prepared. Refresh and try again.',\n recordsCouldNotBePrepared: 'The records could not be prepared. Refresh and try again.',\n readingTheCurrentVersion: 'Reading the current record version…',\n readingTheCurrentVersions: 'Reading the current record versions…',\n oneIneligible: 'One selected record cannot take this action now. The request is all or nothing, so it would refuse the whole request.',\n manyIneligible:\n '{count} selected records cannot take this action now. The request is all or nothing, so any one of them would refuse the whole request.',\n});\n","/**\n * A record action's command form: the modal that prepares the record — its\n * revision, and the starting values the command serves — draws the\n * command's inputs through CommandFields, and submits once under a request\n * key the operation store keeps, for one record or a queue's selection.\n */\nimport { ownedBy } from '@mistriwork/kit/client/requestIdentity.js';\nimport { useEffect, useId, useMemo, useRef, useState, useSyncExternalStore, type RefObject } from 'react';\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport type { AppCommandAction } from '../../shared/app.js';\nimport { api, state } from '@mistriwork/kit/client/core.js';\nimport { commandOperations, type CommandOperation, type CommandOwner } from '../commandState.js';\nimport { countedLabel, prepareBulkCommand, type PreparedTarget } from '@mistriwork/kit/client/bulkActions.js';\nimport { commandFieldsDeep, commandKeyText, recordColumnsIn, type AppCommandField } from '../../shared/command.js';\nimport { sessionIdentity, subscribeSessionIdentity } from '@mistriwork/kit/client/sessionIdentity.js';\nimport {\n CommandFields,\n asksDraftLogic,\n blankCommandValues,\n draftLogic,\n readsRecord,\n commandInput,\n prefilledCommandValues,\n type CommandQuestions,\n type CommandValues,\n} from './CommandFields.js';\nimport { Button } from '@mistriwork/ui/Button.js';\nimport { Modal } from '@mistriwork/ui/Modal.js';\nimport { say } from '../copy/forms/components/CommandForm.js';\nimport { liveKeyText, registerEditing, releaseEditNotice, useEditNotice } from '@mistriwork/kit/client/liveState.js';\nimport { onDemand } from '@mistriwork/kit/client/components/onDemand.js';\nimport type { TableMeta } from '@mistriwork/engine/shared/schema.js';\n\nconst LiveEditNotice = onDemand(() => import('@mistriwork/kit/client/components/LiveNotices.js'), 'LiveEditNotice', { quiet: true });\n\n/** One record prepared: the revision the form submits, and its starting values when the command serves them. */\n/* The pickers that read the record (`record.id` in their query), each waiting (null) until prepare binds it. */\nconst waitingPickers = (fields: readonly AppCommandField[]): Record<string, null> =>\n Object.fromEntries(\n [...commandFieldsDeep(fields)].flatMap(({ field, path }) =>\n field.type === 'reference' && field.query && recordColumnsIn(field.query).length ? [[path, null]] : [],\n ),\n );\n\n/* The fields a prepared record is asked. A `when` that reads the record waits for prepare: left out where the\n record's part never holds, a plain field where it always does, and otherwise the draft's part prepare left to\n judge as it is typed. A `when` over the draft alone is the form's own to judge (commandDraft.ts). */\nfunction asked(\n input: readonly AppCommandField[],\n record: { withheld?: string[]; when?: Record<string, string> } | undefined,\n): readonly AppCommandField[] {\n if (!input.some((field) => field.type !== 'group' && field.type !== 'lines' && field.when !== undefined && readsRecord(field.when)))\n return input;\n return input.flatMap((field): AppCommandField[] => {\n if (field.type === 'group' || field.type === 'lines' || field.when === undefined || !readsRecord(field.when)) return [field];\n if (!record || record.withheld?.includes(field.name)) return [];\n const { when: _when, ...plain } = field;\n const left = record.when?.[field.name];\n return [(left === undefined ? plain : { ...plain, when: left }) as AppCommandField];\n });\n}\n\ninterface PreparedRecord {\n expectedVersion: number;\n initial?: Record<string, unknown>;\n /** Pickers that read the record (`record.id` in their query), bound to it: by declared path, null for none. */\n choices?: Record<string, string | null>;\n /** The inputs this record is not asked: their `when` does not hold of it. */\n withheld?: string[];\n /** What is left of a record-reading `when` to judge over the draft, by input. */\n when?: Record<string, string>;\n /** The questions defined in rows this record is asked, by input name (`field.defined`). */\n questions?: CommandQuestions;\n /** The count of applied commands when this prepare was asked (commandOperations.appliedOn). */\n seen: number;\n}\n/* The same count for a group's prepare, whose answer is a Map. */\nconst groupSeen = new WeakMap<Map<string, PreparedTarget>, number>();\n\n/** The table a command acts on, as live sync's notice names it (its noun, its history). */\nconst liveTable = (id: string): TableMeta =>\n (state.schema?.tables?.find((table: TableMeta) => table.id === id) as TableMeta | undefined) ??\n ({ id, name: id, columns: [] } as unknown as TableMeta);\n\n/** One record of a group, as the host names it. */\ninterface CommandTarget {\n key: Record<string, unknown>;\n label: string;\n}\n\nexport function CommandForm({\n action,\n owner,\n label,\n onClose,\n onDone,\n isCurrent,\n targets,\n onDeselect,\n finalFocus,\n noun,\n initial,\n headless,\n onApplied,\n}: {\n action: AppCommandAction;\n owner: CommandOwner;\n label: string;\n /** Starting values a custom component handed over (useCommand's `open`), over the blank form and before the command's own. */\n initial?: Readonly<Record<string, unknown>>;\n /** Opened by a component's `open`, which holds this form and resolves it: the record's action bar must not draw its\n own copy over the same operation, and Done there would blank this one. */\n headless?: boolean;\n /** What a group's records are called, so its verb counts them: \"Approve 2 timesheets\". */\n noun?: { one: string; many: string };\n /** The form closed; a settled operation says how it ended (success or a definite refusal). */\n onClose: (settled?: CommandOperation) => void;\n onDone: () => void;\n /** The command landed: what to ask again. A record's bar asks its record (recordWriteRefresh.ts refreshAfterCommand);\n without it, every read is asked again, as a group's or an assistant's form does. */\n onApplied?: () => void;\n /** Supplemental host lifetime; retirement never forgets an operation. */\n isCurrent?: () => boolean;\n /** A group owner's records, aligned with `owner.keys`. */\n targets?: CommandTarget[];\n /** Drop these records from the group. The host owns the selection, and the form follows it. */\n onDeselect?: (keys: Array<Record<string, unknown>>) => void;\n /** Where the host wants focus when the form closes — its report of the outcome. */\n finalFocus?: RefObject<HTMLElement | null>;\n}) {\n // A group is one request for several records: every one commits or none does.\n const group = owner.keys !== undefined;\n const [identity] = useState(sessionIdentity);\n const currentIdentity = useSyncExternalStore(subscribeSessionIdentity, sessionIdentity, sessionIdentity);\n useSyncExternalStore(commandOperations.subscribe, commandOperations.version, commandOperations.version);\n const operation = commandOperations.get(owner);\n const [values, setValues] = useState<CommandValues>(\n () =>\n (operation?.envelope.input as CommandValues | undefined) ??\n (initial ? prefilledCommandValues(action.command.input, initial) : blankCommandValues(action.command.input)),\n );\n /* The fields the person has changed since the form was (re)filled. The\n starting values arrive with `prepare`, which can answer after someone has\n already picked a code or typed a note: they fill every field but these,\n so neither the edits nor the starting values are lost (a box that starts\n checked stayed unchecked because one other field had been typed in). */\n const touched = useRef(new Set<string>());\n const [problem, setProblem] = useState('');\n /* A refusal that names one of the inputs — `refuse('Only $12.00 is left to refund', { field: 'amount' })` — is said\n beside that input, and the form lets go of the attempt so the answer can be changed and sent again: nothing ran. */\n const [beside, setBeside] = useState<Record<string, string> | undefined>(undefined);\n const refusedField =\n operation?.phase === 'error' &&\n operation.field &&\n action.command.input.some((field) => field.name === operation.field!.split(/[.[]/)[0])\n ? operation.field\n : undefined;\n useEffect(() => {\n if (!refusedField || !operation || !current()) return;\n setBeside({ [refusedField]: operation.message });\n commandOperations.forget(owner);\n });\n // The selection the form opened with is what it prepares; deselecting\n // narrows the request without asking the server again.\n const [preparedKeys] = useState(() => owner.keys?.map((key) => ({ ...key })));\n const client = useQueryClient();\n const id = useId();\n const ownerText = JSON.stringify([owner.connection, owner.target, owner.command, owner.commandVersion, owner.key, owner.keys]);\n /* Live sync (liveInvalidate.ts): once something is typed, the records the form acts on are not read over it — their\n fields, its prepared starting values — and a change to one is said in the status line instead. Untouched, the\n form still follows the record. Let go when the form closes, with the notice it raised: the next form starts\n clean, unless the record's own draft is still open over the same record and still owns it. */\n const recordText = owner.keys ? '' : liveKeyText(owner.key);\n const changedElsewhere = useEditNotice(owner.target, recordText);\n useEffect(() => {\n const release = registerEditing(() => {\n if (!touched.current.size || commandOperations.get(owner)) return undefined;\n const keys = owner.keys ?? (Object.keys(owner.key).length ? [owner.key] : []);\n return keys.map((key) => ({ table: owner.target, key }));\n });\n return () => {\n release();\n for (const key of owner.keys ?? [owner.key]) releaseEditNotice(owner.target, liveKeyText(key));\n };\n }, [ownerText]);\n const lifetime = useMemo(() => ({}), [ownerText, isCurrent]);\n const activeLifetime = useRef(lifetime);\n activeLifetime.current = lifetime;\n const mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n /* Closed, and only waiting to be taken down. A component's form (useCommand's `open`) is unmounted a microtask after\n it closes (mount.tsx), so it draws once more with its refused operation forgotten — which re-enabled its prepare,\n whose answer, arriving after the unmount, failed as \"no longer current\" and stood in the cache as the answer a\n form opened again at once was handed: \"The record could not be prepared\". */\n const closed = useRef(false);\n const current = () => {\n try {\n return (\n mounted.current &&\n activeLifetime.current === lifetime &&\n sessionIdentity() === identity &&\n identity.mode === 'authenticated' &&\n state.activeConnection === owner.connection &&\n (isCurrent === undefined || isCurrent() === true)\n );\n } catch {\n return false;\n }\n };\n const prepared = useQuery({\n queryKey: ['command-prepare', identity.epoch, group ? { ...owner, keys: preparedKeys, labels: undefined } : owner],\n retry: false,\n staleTime: 0,\n gcTime: 0,\n enabled: current() && !operation && !closed.current,\n /* Reading the signal lets a read nobody waits for any more be cancelled back to what it was, rather than settle as\n an error the next form of this record would be handed. */\n queryFn: async ({ signal }): Promise<PreparedRecord | Map<string, PreparedTarget>> => {\n if (!current() || signal.aborted) throw new Error(say('common.thisCommandFormIsNoLonger'));\n const seen = commandOperations.appliedOn(owner.connection, owner.target, preparedKeys ?? [owner.key]);\n // The draft's logic travels beside prepare, so the form is drawn whole once prepare answers (CommandFields.tsx).\n const logic = asksDraftLogic(action.command.input) ? draftLogic.ready() : undefined;\n if (group) {\n const keys = (preparedKeys ?? []).map((key) =>\n Object.fromEntries(\n Object.entries(key).filter(\n (entry): entry is [string, string | number] => typeof entry[1] === 'string' || typeof entry[1] === 'number',\n ),\n ),\n );\n const result = await prepareBulkCommand(owner.connection, action, keys);\n if (!current()) throw new Error(say('theSessionChanged'));\n const statuses = new Map(result.map((target) => [commandKeyText(target.key), target]));\n groupSeen.set(statuses, seen);\n return statuses;\n }\n const result = await api('/api/commands/prepare', {\n ...ownedBy(owner.connection),\n command: owner.command,\n commandVersion: owner.commandVersion,\n key: owner.key,\n });\n await logic;\n if (!current()) throw new Error(say('theSessionChanged'));\n if (!Number.isSafeInteger(result.expectedVersion) || result.expectedVersion < 0)\n throw new Error(say('common.theRecordVersionIsUnavailable'));\n const initial =\n result.initial && typeof result.initial === 'object' && !Array.isArray(result.initial)\n ? (result.initial as Record<string, unknown>)\n : undefined;\n const choices = result.choices && typeof result.choices === 'object' ? (result.choices as Record<string, string | null>) : undefined;\n const withheld = Array.isArray(result.withheld) ? (result.withheld as unknown[]).filter((name) => typeof name === 'string') : [];\n const when =\n result.when && typeof result.when === 'object' && !Array.isArray(result.when)\n ? Object.fromEntries(Object.entries(result.when as Record<string, unknown>).filter(([, text]) => typeof text === 'string'))\n : undefined;\n const questions = result.defined && typeof result.defined === 'object' ? (result.defined as CommandQuestions) : undefined;\n return {\n expectedVersion: result.expectedVersion as number,\n ...(initial ? { initial } : {}),\n ...(choices ? { choices } : {}),\n ...(withheld.length ? { withheld } : {}),\n ...(when && Object.keys(when).length ? { when: when as Record<string, string> } : {}),\n ...(questions ? { questions } : {}),\n seen,\n };\n },\n });\n const record = prepared.data instanceof Map ? undefined : prepared.data;\n /* The inputs this record is asked: one asked only where its `when` holds waits for prepare to say,\n is left out where it does not, and is an ordinary field — required unless optional — where it does. */\n const fields = useMemo(() => asked(action.command.input, record), [action.command.input, record]);\n /* Another command applied to this record after this form prepared it: the\n revision it holds is one it knows is old, and submitting it could only\n be refused as stale. The form prepares again and holds its submit until\n that answer is in, rather than wait for whoever applied it to refresh\n the page's queries (which a busy server answers late, if at all). */\n const seen = prepared.data instanceof Map ? groupSeen.get(prepared.data) : record?.seen;\n const outdated =\n !operation && seen !== undefined && commandOperations.appliedOn(owner.connection, owner.target, preparedKeys ?? [owner.key]) > seen;\n const refetchPrepared = prepared.refetch;\n useEffect(() => {\n if (outdated && !prepared.isFetching && !prepared.isError) void refetchPrepared();\n }, [outdated, prepared.isFetching, prepared.isError, refetchPrepared]);\n /* The command's starting values, read with the revision this form will\n submit: laid over the blank form once per prepare, unless the person has\n already typed. \"Refresh and review\" prepares again and fills again, so\n what is reviewed is the record as it is now. */\n /* Filled while rendering, not in an effect after it: an effect let one\n frame commit with the revision ready and the fields still blank, and a\n quick submit sent the blank form (\"Amount is required\"). React renders\n again at once, before anything is drawn. */\n const [filledFrom, setFilledFrom] = useState<PreparedRecord | undefined>(undefined);\n if (record?.initial && !operation && filledFrom !== record) {\n setFilledFrom(record);\n // What a component handed over stands over the command's own starting values.\n const filled = prefilledCommandValues(action.command.input, { ...record.initial, ...initial });\n for (const name of touched.current) if (Object.hasOwn(values, name)) filled[name] = values[name];\n setValues(filled);\n }\n if (currentIdentity !== identity || !current()) return null;\n const pending = operation?.phase === 'pending';\n const unknown = operation?.phase === 'unknown';\n const success = operation?.phase === 'success';\n /* An action that keeps no receipt has nothing to check a lost answer by:\n the record is what says whether it ran, so the form lets go of it. */\n const untracked = action.untracked === true;\n const locked = pending || (unknown && !untracked);\n const listed: CommandTarget[] = targets ?? (owner.keys ?? []).map((key) => ({ key, label: commandKeyText(key) }));\n const statuses = prepared.data instanceof Map ? prepared.data : undefined;\n const ineligible = statuses ? listed.filter((target) => !statuses.get(commandKeyText(target.key))?.eligible) : [];\n const versions = (owner.keys ?? []).map((key) => statuses?.get(commandKeyText(key))?.expectedVersion ?? null);\n const ready =\n !outdated &&\n (group\n ? Boolean(statuses) && listed.length > 0 && !ineligible.length && versions.every((version) => version !== null)\n : typeof record?.expectedVersion === 'number');\n const send = (submitted: NonNullable<typeof operation>, endpoint: 'execute' | 'status') => {\n void commandOperations.send(\n submitted,\n endpoint,\n (path, envelope) => {\n if (path !== '/api/commands/execute' && path !== '/api/commands/status') throw new Error(say('common.invalidCommandPath'));\n if (!current()) throw Object.assign(new Error(say('common.thisCommandFormIsNoLonger')), { outcome: 'not_applied' });\n return api(path, { ...envelope, ...ownedBy(owner.connection) });\n },\n () => {\n if (current()) (onApplied ?? (() => void client.invalidateQueries()))();\n },\n );\n };\n const close = () => {\n // Read the real operation again: an old Cancel closure may predate dispatch.\n const live = commandOperations.get(owner);\n if (!current() || live !== operation || live?.phase === 'pending' || (live?.phase === 'unknown' && !untracked)) return;\n closed.current = true;\n commandOperations.forget(owner);\n onClose(live);\n if (success && current()) onDone();\n };\n const review = () => {\n const live = commandOperations.get(owner);\n if (!current() || live !== operation || live?.phase === 'pending' || (live?.phase === 'unknown' && !untracked)) return;\n commandOperations.forget(owner);\n setProblem('');\n touched.current = new Set();\n void prepared.refetch();\n void client.invalidateQueries({ predicate: (query) => query.queryKey[0] !== 'command-prepare' });\n };\n const refused = operation?.refusedKey && listed.find((target) => commandKeyText(target.key) === commandKeyText(operation.refusedKey));\n const count = say('common.records2', { count: listed.length });\n /* The verb follows the selection as it narrows: a group of two says so. A label the App's messages count\n (useBulkSelection.tsx ActionLabel) is not counted as English counts; the form's count line says how many. */\n const verb = group && noun && !(action as { counted?: unknown }).counted ? countedLabel(action.label, listed.length, noun) : action.label;\n const noticed = Boolean(changedElsewhere && !operation && !problem);\n const feedback =\n problem ||\n (unknown && untracked ? say('checkTheRecord') : '') ||\n (operation?.message && `${operation.message}${refused ? ` (${refused.label})` : ''}`) ||\n (prepared.isError\n ? say(group ? 'recordsCouldNotBePrepared' : 'recordCouldNotBePrepared')\n : prepared.isPending || outdated\n ? say(group ? 'readingTheCurrentVersions' : 'readingTheCurrentVersion')\n : group && ineligible.length\n ? say('deselectTheIneligibleRecords')\n : group\n ? say('readyToSubmit', { count })\n : say('readyToSubmitOne'));\n return (\n <Modal className=\"confirm command-form\" ariaLabel={verb} onClose={close} closeDisabled={locked} finalFocus={finalFocus}>\n <h2>{verb}</h2>\n <p className=\"insert-lede\">{label}</p>\n {group && ineligible.length > 0 && !operation && (\n <div className=\"command-ineligible\" role=\"alert\">\n <p>{ineligible.length === 1 ? say('oneIneligible') : say('manyIneligible', { count: ineligible.length })}</p>\n <ul>\n {ineligible.map((target) => (\n <li key={commandKeyText(target.key)}>{target.label}</li>\n ))}\n </ul>\n {onDeselect && (\n <Button\n intent=\"secondary\"\n onClick={() => {\n if (current()) onDeselect(ineligible.map((target) => target.key));\n }}\n >\n {say('deselectIneligible')}\n </Button>\n )}\n </div>\n )}\n <form\n noValidate\n onSubmit={(event) => {\n event.preventDefault();\n if (!current() || operation || !ready || prepared.isFetching) return;\n try {\n const input = commandInput(fields, values, record?.questions);\n setProblem('');\n setBeside(undefined);\n send(\n commandOperations.start(owner, group ? (versions as number[]) : record!.expectedVersion, input, action, headless),\n 'execute',\n );\n } catch (error) {\n setProblem((error as Error).message);\n }\n }}\n >\n <fieldset className=\"command-fields\" disabled={Boolean(operation)}>\n <CommandFields\n fields={fields}\n values={values}\n idPrefix={id}\n disabled={Boolean(operation)}\n inputs={action.inputs}\n connection={owner.connection}\n {...(!owner.keys && Object.keys(owner.key).length ? { record: { table: owner.target, key: owner.key } } : {})}\n identityEpoch={identity.epoch}\n isCurrent={current}\n {...(beside ? { problems: beside } : {})}\n bound={record ? (record.choices ?? {}) : waitingPickers(action.command.input)}\n {...(record?.questions ? { questions: record.questions } : {})}\n onChange={(next, path) => {\n for (const field of action.command.input)\n if (JSON.stringify(next[field.name]) !== JSON.stringify(values[field.name])) touched.current.add(field.name);\n if (beside && path !== undefined && Object.hasOwn(beside, path)) setBeside(undefined);\n setValues(next);\n }}\n />\n </fieldset>\n <p\n className=\"command-feedback\"\n data-phase={problem ? 'error' : (operation?.phase ?? (prepared.isError ? 'error' : 'ready'))}\n /* Drawn while it holds a change from elsewhere: a ready line is otherwise said to a screen reader only, and\n Keep editing has to be seen and pressed. */\n {...(noticed ? { 'data-live': '' } : {})}\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {noticed ? <LiveEditNotice table={liveTable(owner.target)} recordKey={owner.key} place=\"inline\" /> : feedback}\n </p>\n <div className=\"confirm-actions\">\n <Button intent=\"secondary\" disabled={locked} onClick={close}>\n {success ? say('common.done') : say('common.cancel')}\n </Button>\n {unknown && !untracked ? (\n <>\n <Button\n intent=\"secondary\"\n onClick={() => {\n if (current()) send(operation!, 'status');\n }}\n >\n {say('checkResult')}\n </Button>\n <Button\n intent=\"primary\"\n onClick={() => {\n if (current()) send(operation!, 'execute');\n }}\n >\n {say('retrySameSubmission')}\n </Button>\n </>\n ) : operation?.phase === 'error' || unknown || prepared.isError ? (\n <Button intent=\"primary\" onClick={review}>\n {say('refreshAndReview')}\n </Button>\n ) : (\n !success && (\n <Button intent=\"primary\" type=\"submit\" disabled={pending || !ready || prepared.isFetching}>\n {pending ? say('common.submitting') : verb}\n </Button>\n )\n )}\n </div>\n </form>\n </Modal>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { n as __exportAll } from "./shared-C-UrYobY.js";
|
|
2
2
|
import { D as subscribeSessionIdentity, E as sessionIdentity, F as parseQuery, J as maskQuoted, N as andQuery, Q as Problem, R as topLevelConditions, it as useQuery, m as canonicalText, s as ComputedError } from "./shared-poc11xxo.js";
|
|
3
3
|
import { A as isFlagColumn, D as columnKind, F as primaryKey, R as tableNamed, at as DISPLAY_TONES, ct as allowKeys, dt as isRecord, gt as defineMessages, it as CHART_SHAPES, k as findTable, ot as FIGURE_FORMATS, r as UiPageContext, rn as shell, z as LABEL_SEGMENT } from "./shared-DJZjSi3J.js";
|
|
4
|
-
import { L as state, U as writeAllowed, W as hopName, d as findTable$1, i as api, m as labelPath, st as ownedBy, ut as connectionGeneration, y as pageFor } from "./shared-
|
|
4
|
+
import { L as state, U as writeAllowed, W as hopName, d as findTable$1, i as api, m as labelPath, st as ownedBy, ut as connectionGeneration, y as pageFor } from "./shared-BoLbc2WD.js";
|
|
5
5
|
import { c as SERVER_SEGMENTS } from "./shared-sZ8B7ZTw.js";
|
|
6
|
-
import { t as onDemand } from "./shared-
|
|
6
|
+
import { t as onDemand } from "./shared-B-BUF9fx.js";
|
|
7
7
|
import { a as ErrorBoundary, t as FOCUS_ALWAYS } from "./shared-C3MTHv9P.js";
|
|
8
8
|
import { t as filterAddressWord } from "./shared-DUlM0U0V.js";
|
|
9
9
|
import "./shared-BZ8KfT9k.js";
|
|
@@ -11,17 +11,17 @@ import { i as parseCards } from "./shared-CS6uipL4.js";
|
|
|
11
11
|
import { r as isIsoDate } from "./shared-Du2YAQk4.js";
|
|
12
12
|
import { n as pathEqualityFilter, r as recordKey } from "./shared-_IMKuuvy.js";
|
|
13
13
|
import { t as tabKey } from "./shared-DVZ7wmSR.js";
|
|
14
|
-
import { t as grantedActionIds } from "./shared-
|
|
14
|
+
import { t as grantedActionIds } from "./shared-eZ0SB_zm.js";
|
|
15
15
|
import "./shared-QhJ3Hj3V.js";
|
|
16
16
|
import { p as ASSISTANT_ROOM, u as resourceOf$1 } from "./shared-DpVb48sM.js";
|
|
17
|
-
import { a as composing, o as holdComposed, r as composedEpoch } from "./shared-
|
|
18
|
-
import { a as pagesFor, l as rootMatches, r as pageById } from "./shared-
|
|
19
|
-
import { t as RECORD_COMPOSE_PATH } from "./shared-
|
|
17
|
+
import { a as composing, o as holdComposed, r as composedEpoch } from "./shared-CpMhOq8F.js";
|
|
18
|
+
import { a as pagesFor, l as rootMatches, r as pageById } from "./shared-Bf30ZLoS.js";
|
|
19
|
+
import { t as RECORD_COMPOSE_PATH } from "./shared-CZJE4Bmp.js";
|
|
20
20
|
import { r as isRequired, t as autoKey } from "./shared-CoarExWh.js";
|
|
21
|
-
import "./shared-
|
|
22
|
-
import { n as relatedRows } from "./shared-
|
|
21
|
+
import "./shared-BdA3LPCB.js";
|
|
22
|
+
import { n as relatedRows } from "./shared-CuZt26rm.js";
|
|
23
23
|
import "./shared-D_CtFPwG.js";
|
|
24
|
-
import { t as useWalk } from "./shared-
|
|
24
|
+
import { t as useWalk } from "./shared-CSPhENq3.js";
|
|
25
25
|
import { createElement, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
|
|
26
26
|
import { jsx } from "react/jsx-runtime";
|
|
27
27
|
// packages/engine/src/shared/tableSizing.ts
|
|
@@ -2387,12 +2387,12 @@ var blocks_exports = /* @__PURE__ */ __exportAll({
|
|
|
2387
2387
|
Timeline: () => Timeline,
|
|
2388
2388
|
Tree: () => Tree
|
|
2389
2389
|
});
|
|
2390
|
-
var DashboardBlock = onDemand(() => import("./shared-
|
|
2391
|
-
var RecordPageBody = onDemand(() => import("./shared-
|
|
2392
|
-
var TreeList = onDemand(() => import("./shared-
|
|
2393
|
-
var GanttList = onDemand(() => import("./shared-
|
|
2394
|
-
var AssistantRoom = onDemand(() => import("./shared-
|
|
2395
|
-
var TabStrip = onDemand(() => import("./shared-
|
|
2390
|
+
var DashboardBlock = onDemand(() => import("./shared-DSUICuaJ.js").then((n) => n.t), "DashboardBlock");
|
|
2391
|
+
var RecordPageBody = onDemand(() => import("./shared-D66ju_Cb.js"), "RecordPageBody");
|
|
2392
|
+
var TreeList = onDemand(() => import("./shared-Cbf-o4Dt.js"), "TreeList");
|
|
2393
|
+
var GanttList = onDemand(() => import("./shared-Bw73ktBk.js"), "GanttList");
|
|
2394
|
+
var AssistantRoom = onDemand(() => import("./shared-BDDUzH-f.js"), "AssistantRoom");
|
|
2395
|
+
var TabStrip = onDemand(() => import("./shared-B5aBCUi7.js").then((n) => n.t), "TabStrip");
|
|
2396
2396
|
var WIDTHS = [
|
|
2397
2397
|
"full",
|
|
2398
2398
|
"half",
|
|
@@ -2815,4 +2815,4 @@ var Assistant = block((props) => {
|
|
|
2815
2815
|
var Tabs = block(tabsAsk, TabsBlock);
|
|
2816
2816
|
export { Assistant, Breakdown, conditionResult as C, Chart, typedValue as D, inferredFormDefaults as E, Gantt, Metric, RecordCard, Rows, compileCondition as S, formDefaultWord as T, Tabs, Timeline, Tree, maskPattern as _, drawnLayout as a, relatedCreatePlan as b, funnelBasis as c, stageColumn as d, parseComputed as f, isoInstant as g, isIsoMonth as h, useRecordSurface as i, funnelChains as l, fieldPattern as m, groupsAsked as n, showcaseIndex as o, COMMAND_INPUT_LIMITS as p, RECORD_REFRESH_FAILED as r, droppedQuery as s, blocks_exports as t, funnelText as u, recordColumnsIn as v, evaluateFormCondition as w, isAppIcon as x, appAddressBook as y };
|
|
2817
2817
|
|
|
2818
|
-
//# sourceMappingURL=shared-
|
|
2818
|
+
//# sourceMappingURL=shared-CL3RLKDA.js.map
|