@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,16 +1,16 @@
|
|
|
1
1
|
import { E as sessionIdentity } from "./shared-poc11xxo.js";
|
|
2
2
|
import { At as removeHostListener, Ct as addHostListener, D as columnKind, Kt as formatLocale, Qt as formatTimezone, c as booleanWords, gt as defineMessages, h as linkFor, kt as portalRoot, l as choiceWord, rn as shell, ut as humanName } from "./shared-DJZjSi3J.js";
|
|
3
|
-
import { M as useEditNotice, O as liveKeyText } from "./shared-
|
|
4
|
-
import { a as JsonValue } from "./shared-
|
|
5
|
-
import { B as toast, C as prefersPages, D as refsFrom, L as state, c as columnLabel, d as findTable, s as columnDisplay } from "./shared-
|
|
6
|
-
import { t as onDemand } from "./shared-
|
|
3
|
+
import { M as useEditNotice, O as liveKeyText } from "./shared-BHsjawAG.js";
|
|
4
|
+
import { a as JsonValue } from "./shared-CMjK-Ucd.js";
|
|
5
|
+
import { B as toast, C as prefersPages, D as refsFrom, L as state, c as columnLabel, d as findTable, s as columnDisplay } from "./shared-BoLbc2WD.js";
|
|
6
|
+
import { t as onDemand } from "./shared-B-BUF9fx.js";
|
|
7
7
|
import { t as Dropdown } from "./shared-gtzTT5Z7.js";
|
|
8
8
|
import { r as jsonValueOf } from "./shared-DP0_R8KD.js";
|
|
9
9
|
import { t as DateField } from "./shared-D0FwuLNI.js";
|
|
10
|
-
import { n as canEditRow, t as booleanChoices } from "./shared-
|
|
11
|
-
import { C as stagedOriginal, D as suspendDraft, E as subscribeStaged, O as takeFieldFocus, S as stagedFeedback, T as stagedVersion, _ as sameRow, a as captureRecordAutosaveGuard, b as stagedDiscardVersion, c as dismissSaveFeedback, d as pendingColumns, f as pendingCount, g as retainedValues, h as resumeDraft, i as cancelRecordAutosave, l as draftNeedsReview, m as registerInput, n as applyStaged, p as refreshEditValidation, r as applyingStaged, s as discardStaged, t as activateDraft, u as draftSchemaChanged, v as stage, w as stagedValue, x as stagedEditErrors, y as stagedAttempt } from "./shared-
|
|
12
|
-
import { n as mentionSearch, r as pictureKeeper, t as RichTextField } from "./shared-
|
|
13
|
-
import { n as columnInput, r as RecordPicker, t as InputSlot } from "./shared-
|
|
10
|
+
import { n as canEditRow, t as booleanChoices } from "./shared-BHCQ60yN.js";
|
|
11
|
+
import { C as stagedOriginal, D as suspendDraft, E as subscribeStaged, O as takeFieldFocus, S as stagedFeedback, T as stagedVersion, _ as sameRow, a as captureRecordAutosaveGuard, b as stagedDiscardVersion, c as dismissSaveFeedback, d as pendingColumns, f as pendingCount, g as retainedValues, h as resumeDraft, i as cancelRecordAutosave, l as draftNeedsReview, m as registerInput, n as applyStaged, p as refreshEditValidation, r as applyingStaged, s as discardStaged, t as activateDraft, u as draftSchemaChanged, v as stage, w as stagedValue, x as stagedEditErrors, y as stagedAttempt } from "./shared-Z4uBJU6I.js";
|
|
12
|
+
import { n as mentionSearch, r as pictureKeeper, t as RichTextField } from "./shared-DHy41sET.js";
|
|
13
|
+
import { n as columnInput, r as RecordPicker, t as InputSlot } from "./shared-C2RU1qjv.js";
|
|
14
14
|
import { useCallback, useEffect, useId, useLayoutEffect, useRef, useState, useSyncExternalStore } from "react";
|
|
15
15
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
16
16
|
import { createPortal } from "react-dom";
|
|
@@ -224,7 +224,7 @@ var say = defineMessages({
|
|
|
224
224
|
* confirmation that shows the statement, the request, the undo — is the
|
|
225
225
|
* store's.
|
|
226
226
|
*/
|
|
227
|
-
var LiveEditNotice = onDemand(() => import("./shared-
|
|
227
|
+
var LiveEditNotice = onDemand(() => import("./shared-B07qIMlE.js"), "LiveEditNotice", { quiet: true });
|
|
228
228
|
function cancelBlur() {
|
|
229
229
|
cancelEditInteractions();
|
|
230
230
|
cancelRecordAutosave();
|
|
@@ -813,4 +813,4 @@ function PendingBar({ table, recordKey, onDone, placement, isCurrent }) {
|
|
|
813
813
|
}
|
|
814
814
|
export { PendingBar as n, Editable as t };
|
|
815
815
|
|
|
816
|
-
//# sourceMappingURL=shared-
|
|
816
|
+
//# sourceMappingURL=shared-BumxsBlA.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-CQWLz8uT.js","names":["_Fragment","JsonView"],"sources":["../../../kit/src/client/components/editInteraction.tsx","../../../kit/src/client/copy/record/components/Editable.ts","../../../kit/src/client/components/Editable.tsx"],"sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useRef } from 'react';\nimport { addHostListener, removeHostListener } from '../shellHost.js';\n\nconst cancellations = new Set<() => void>();\n\n/** Intent belongs to the record, even when another field has a deferred blur. */\nexport function cancelEditInteractions() {\n for (const cancel of cancellations) cancel();\n}\n\ninterface EditInteractionOptions {\n enabled: boolean;\n blocked?: boolean;\n owner?: string;\n captureGuard: (current: () => boolean) => () => boolean;\n onLeave: (guard: () => boolean) => void;\n onCancel: () => void;\n}\n\nconst action = (target: EventTarget | null) =>\n target instanceof Element &&\n Boolean(\n target.closest('a, [role=\"link\"], [data-edit-intent]') ||\n (!target.closest('[data-edit-field]') &&\n target.closest(\n 'button, summary, .clickable, [role=\"button\"], [role=\"menuitem\"], [role=\"tab\"], [tabindex]:not([tabindex=\"-1\"]), input, select, textarea',\n )),\n );\n\n/** A blur is evidence to examine, not permission to submit. Focus and pointer\n * ownership are checked after Base UI has settled selection/return focus. */\nexport function useEditInteraction(options: EditInteractionOptions) {\n const latest = useRef(options);\n latest.current = options;\n const root = useRef<HTMLDivElement>(null);\n const popup = useRef<HTMLDivElement | null>(null);\n const state = useRef({\n mounted: false,\n generation: 0,\n armed: false,\n departed: false,\n open: false,\n pointer: false,\n decision: undefined as undefined | { mounted: () => boolean; guard: () => boolean },\n timer: undefined as ReturnType<typeof setTimeout> | undefined,\n });\n const owns = useCallback(\n (target: EventTarget | null) => target instanceof Node && Boolean(root.current?.contains(target) || popup.current?.contains(target)),\n [],\n );\n const cancel = useCallback(() => {\n const s = state.current;\n s.generation++;\n s.armed = false;\n s.departed = false;\n s.decision = undefined;\n clearTimeout(s.timer);\n }, []);\n const changed = useCallback(() => {\n if (!latest.current.enabled) return;\n const s = state.current;\n s.generation++;\n s.armed = true;\n s.departed = false;\n s.decision = undefined;\n clearTimeout(s.timer);\n }, []);\n useLayoutEffect(() => cancel, [cancel, options.owner]);\n const settle = useCallback(() => {\n const s = state.current;\n if (!s.mounted || !s.armed || !s.departed || !latest.current.enabled) return;\n clearTimeout(s.timer);\n if (!s.decision) {\n const generation = s.generation;\n const mounted = () => s.mounted && generation === s.generation && latest.current.enabled && Boolean(root.current?.isConnected);\n s.decision = { mounted, guard: latest.current.captureGuard(mounted) };\n }\n const { mounted, guard } = s.decision;\n s.timer = setTimeout(() => {\n if (!mounted() || !s.armed || !s.departed || s.open || s.pointer) return;\n const active = document.activeElement;\n if (owns(active)) {\n s.departed = false;\n return;\n }\n if (action(active)) {\n cancelEditInteractions();\n latest.current.onCancel();\n return;\n }\n const current = () =>\n mounted() && !s.open && !s.pointer && !owns(document.activeElement) && !action(document.activeElement) && guard();\n // Consume this user change even if preflight or the store refuses it.\n s.armed = false;\n s.departed = false;\n s.decision = undefined;\n latest.current.onLeave(current);\n }, 0);\n }, [owns]);\n const popupRef = useCallback((node: HTMLDivElement | null) => {\n popup.current = node;\n if (node) {\n node.setAttribute('data-edit-field', '');\n node.inert = Boolean(latest.current.blocked);\n }\n }, []);\n useLayoutEffect(() => {\n if (popup.current) popup.current.inert = Boolean(options.blocked);\n }, [options.blocked]);\n const onOpenChange = useCallback(\n (open: boolean) => {\n state.current.open = open;\n if (!open) settle();\n },\n [settle],\n );\n\n useEffect(() => {\n const s = state.current;\n s.mounted = true;\n cancellations.add(cancel);\n const cancelIntent = () => {\n cancelEditInteractions();\n latest.current.onCancel();\n };\n const focusOut = (event: FocusEvent) => {\n if (!owns(event.target)) return;\n s.departed = true;\n if (action(event.relatedTarget) && !owns(event.relatedTarget)) cancelIntent();\n else settle();\n };\n const focusIn = (event: FocusEvent) => {\n if (owns(event.target)) {\n s.departed = false;\n s.decision = undefined;\n clearTimeout(s.timer);\n } else if (s.armed && action(event.target)) cancelIntent();\n };\n const pointerDown = (event: PointerEvent) => {\n if (!s.armed && !owns(event.target)) return;\n if (!owns(event.target) && action(event.target)) {\n cancelIntent();\n return;\n }\n s.pointer = true;\n };\n const pointerUp = () => {\n s.pointer = false;\n settle();\n };\n const pointerCancel = () => {\n s.pointer = false;\n cancelIntent();\n };\n const keyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' || ((event.key === 'Enter' || event.key === ' ') && !owns(event.target) && action(event.target)))\n cancelIntent();\n };\n const click = (event: MouseEvent) => {\n if (!owns(event.target) && action(event.target)) cancelIntent();\n };\n const input = (event: Event) => {\n if (owns(event.target)) changed();\n };\n addHostListener(document, 'focusout', focusOut, true);\n addHostListener(document, 'focusin', focusIn, true);\n addHostListener(document, 'pointerdown', pointerDown, true);\n addHostListener(document, 'pointerup', pointerUp, true);\n addHostListener(document, 'pointercancel', pointerCancel, true);\n addHostListener(document, 'keydown', keyDown, true);\n addHostListener(document, 'click', click, true);\n addHostListener(document, 'input', input, true);\n addHostListener(window, 'blur', cancelIntent);\n return () => {\n s.mounted = false;\n cancel();\n cancellations.delete(cancel);\n removeHostListener(document, 'focusout', focusOut, true);\n removeHostListener(document, 'focusin', focusIn, true);\n removeHostListener(document, 'pointerdown', pointerDown, true);\n removeHostListener(document, 'pointerup', pointerUp, true);\n removeHostListener(document, 'pointercancel', pointerCancel, true);\n removeHostListener(document, 'keydown', keyDown, true);\n removeHostListener(document, 'click', click, true);\n removeHostListener(document, 'input', input, true);\n removeHostListener(window, 'blur', cancelIntent);\n };\n }, [cancel, changed, owns, settle]);\n\n return { root, popupRef, onOpenChange, changed, isOpen: () => state.current.open };\n}\n","/** What Editable says, in the record page room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n edit: 'Edit {label}',\n doneEditing: 'Done editing {label}',\n yesValue: 'yes',\n noValue: 'no',\n one: 'one of: {allowed}',\n proposedChanges: 'Proposed changes',\n retainedDraft: 'Retained draft',\n unsavedChangesFromYourPrevious: {\n one: '{count} unsaved change from your previous visit',\n other: '{count} unsaved changes from your previous visit',\n },\n theTableDefinitionChanged: 'The table definition changed. This draft cannot be resumed.',\n discardDraft: 'Discard draft',\n resumeDraft: 'Resume draft',\n savedChanges: 'Saved changes',\n unsavedChanges: 'Unsaved changes',\n discard: 'Discard',\n awaitingConfirmation: 'Awaiting confirmation...',\n reviewApply: 'Review & apply',\n countUnsavedChanges: { one: '{count} unsaved change', other: '{count} unsaved changes' },\n});\n","/**\n * A field as an editor, and the bar that says what is pending.\n *\n * Edits share one staged snapshot and expected originals. Explicit Save is\n * the default; an opted-in App can submit on an owned field blur. Staging lives\n * in write.js, keyed by connection, table and row; these components read\n * it and tick with it. Everything about the write itself — the\n * confirmation that shows the statement, the request, the undo — is the\n * store's.\n */\nimport { useEffect, useId, useLayoutEffect, useRef, useState, useSyncExternalStore, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n activateDraft,\n applyStaged,\n applyingStaged,\n booleanChoices,\n canEditRow,\n cancelRecordAutosave,\n captureRecordAutosaveGuard,\n discardStaged,\n dismissSaveFeedback,\n draftNeedsReview,\n draftSchemaChanged,\n pendingCount,\n pendingColumns,\n refreshEditValidation,\n registerInput,\n retainedValues,\n resumeDraft,\n sameRow,\n stage,\n stagedAttempt,\n stagedDiscardVersion,\n stagedEditErrors,\n stagedFeedback,\n stagedOriginal,\n stagedValue,\n subscribeStaged,\n stagedVersion,\n suspendDraft,\n takeFieldFocus,\n} from '../write.js';\nimport { columnKind, type ColumnMeta, type TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport { columnDisplay, columnLabel, findTable, prefersPages, refsFrom, state, toast } from '../core.js';\nimport { RichTextField, mentionSearch, pictureKeeper } from './RichTextField.js';\nimport { booleanWords, choiceWord, linkFor, type DisplayRule } from './valueModel.js';\nimport { humanName } from '@mistriwork/engine/shared/model.js';\nimport { Dropdown } from './Dropdown.js';\nimport { RecordPicker } from './RecordPicker.js';\nimport { sessionIdentity } from '../sessionIdentity.js';\nimport type { DefinedFold } from '../recordDrafts.js';\nimport { shell } from '../shellMode.js';\nimport { cancelEditInteractions, useEditInteraction } from './editInteraction.js';\nimport { formatLocale, formatTimezone } from '../locale.js';\nimport { DateField } from './DateField.js';\nimport { InputSlot, columnInput } from './inputRenderers.js';\nimport { say } from '../copy/record/components/Editable.js';\n\nimport { JsonValue as JsonView } from './JsonValue.js';\nimport { jsonValueOf } from './jsonModel.js';\nimport { portalRoot } from '../shellHost.js';\nimport { onDemand } from './onDemand.js';\nimport { liveKeyText, useEditNotice } from '../liveState.js';\n\nconst LiveEditNotice = onDemand(() => import('./LiveNotices.js'), 'LiveEditNotice', { quiet: true });\n\nfunction cancelBlur() {\n cancelEditInteractions();\n cancelRecordAutosave();\n}\n\nfunction editorCurrent(isCurrent?: () => boolean): boolean {\n try {\n return isCurrent === undefined || isCurrent() === true;\n } catch {\n return false;\n }\n}\n\n/** Re-render whenever the staging changes. */\nfunction useStaged(): number {\n return useSyncExternalStore(subscribeStaged, stagedVersion, stagedVersion);\n}\n\ninterface EditableProps {\n table: TableMeta;\n row: Record<string, unknown>;\n column: ColumnMeta & { allowed?: string[] };\n recordKey: Record<string, unknown>;\n app?: boolean;\n /** A formatted App-mode value, replaced only when this field is opened. */\n display?: (value: unknown, referenceLabel?: string) => ReactNode;\n /** Told after a change is staged, and after a write lands (`{ inPlace: true }`). */\n onSaved?: (opts?: { inPlace?: boolean }) => void;\n /** Additional explicit-surface lifetime fence; never replaces draft authority. */\n isCurrent?: () => boolean;\n}\n\nexport function Editable({ table, row, column, recordKey, onSaved, app = false, display, isCurrent }: EditableProps) {\n useStaged();\n const done = (opts?: { inPlace?: boolean }) => {\n if (editorCurrent(isCurrent)) onSaved?.(opts);\n };\n const value = row[column.name];\n const [committed, setCommitted] = useState<{ source: Record<string, unknown>; value: string | null; label?: string } | null>(null);\n const [opened, setOpened] = useState(false);\n const [saved, setSaved] = useState(false);\n const retainedOriginal = sameRow(table.id, recordKey) ? stagedOriginal(column.name) : undefined;\n const original =\n retainedOriginal !== undefined\n ? retainedOriginal\n : committed?.source === row\n ? committed.value\n : value === null || value === undefined\n ? null\n : String(value);\n const pending = sameRow(table.id, recordKey) ? (stagedValue(column.name) as string | null | undefined) : undefined;\n const shown = pending !== undefined ? pending : original;\n const dirty = pending !== undefined;\n const statusClass = dirty ? ' dirty' : saved && committed?.source === row ? ' saved' : '';\n const attempt = stagedAttempt(table.id, recordKey);\n const pendingWrite = applyingStaged() || attempt?.phase === 'pending';\n const locked = attempt?.phase === 'uncertain' || draftNeedsReview(table.id, recordKey);\n const applying = pendingWrite || locked;\n const input = useRef<HTMLInputElement | HTMLSelectElement | HTMLDivElement>(null);\n const launcher = useRef<HTMLButtonElement>(null);\n const wasOpened = useRef(false);\n const unresolved = useRef(false);\n const [leftInvalid, setLeftInvalid] = useState(false);\n const [pickerGeneration, setPickerGeneration] = useState(0);\n const pickerFocusRequested = useRef(false);\n const discarded = stagedDiscardVersion(table.id, recordKey);\n const lastDiscard = useRef(discarded);\n useLayoutEffect(() => {\n if (lastDiscard.current === discarded) return;\n lastDiscard.current = discarded;\n unresolved.current = false;\n setLeftInvalid(false);\n pickerFocusRequested.current = false;\n if (column.references) setPickerGeneration((generation) => generation + 1);\n }, [discarded, column.references]);\n const errorId = useId();\n const dateId = useId();\n /* A box the browser cannot read (badInput), or the calendar's text box\n holding what is not a date (its own validity), is not a value to save. */\n const readState = () => {\n const node = input.current;\n const control =\n node instanceof HTMLInputElement\n ? node\n : node instanceof HTMLDivElement\n ? node.querySelector<HTMLInputElement>('input.date-field-input')\n : null;\n return {\n unresolvedReference: unresolved.current,\n invalidInput: Boolean(control && (control.validity.badInput || control.validity.customError)),\n };\n };\n const interaction = useEditInteraction({\n enabled:\n app &&\n shell().saveMode() === 'blur' &&\n column.writable !== false &&\n column.changesBy !== 'actions' &&\n !applying &&\n editorCurrent(isCurrent),\n blocked: applying,\n owner: JSON.stringify([sessionIdentity().epoch, table.id, recordKey, column.name]),\n captureGuard: (current) =>\n captureRecordAutosaveGuard(\n table,\n recordKey,\n () => current() && editorCurrent(isCurrent) && shell().saveMode() === 'blur' && canEditRow(table, recordKey),\n ),\n onLeave: (guard) => {\n setLeftInvalid(true);\n void applyStaged(table, recordKey, done, { trigger: 'blur', guard });\n },\n onCancel: cancelRecordAutosave,\n });\n const error =\n stagedEditErrors(table.id, recordKey)[column.name] ??\n (leftInvalid && readState().unresolvedReference\n ? say('common.chooseARecordOrClear')\n : leftInvalid && readState().invalidInput\n ? say('common.enterAValidValue')\n : undefined);\n\n // Composite controls keep their own ARIA attributes; this field owns one\n // description token, on the actual focusable control, for both renderers.\n useLayoutEffect(() => {\n const node = input.current;\n const control =\n node instanceof HTMLInputElement || node instanceof HTMLSelectElement ? node : node?.querySelector<HTMLElement>('input, .dd-button');\n if (!control || !error) return;\n const described = control.getAttribute('aria-describedby')?.split(/\\s+/).filter(Boolean) ?? [];\n const invalid = control.getAttribute('aria-invalid');\n control.setAttribute('aria-describedby', [...new Set([...described, errorId])].join(' '));\n control.setAttribute('aria-invalid', 'true');\n return () => {\n const remaining =\n control\n .getAttribute('aria-describedby')\n ?.split(/\\s+/)\n .filter((id) => id && id !== errorId) ?? [];\n if (remaining.length) control.setAttribute('aria-describedby', remaining.join(' '));\n else control.removeAttribute('aria-describedby');\n if (invalid !== null) control.setAttribute('aria-invalid', invalid);\n else control.removeAttribute('aria-invalid');\n };\n });\n /* A refused Save leaves the focus for the first field it marked; this\n editor takes it once it is drawn — a marked field opens to be answered. */\n useLayoutEffect(() => {\n const node = input.current;\n if (!error || !node || !takeFieldFocus(table.id, recordKey, column.name)) return;\n const control =\n node instanceof HTMLInputElement || node instanceof HTMLSelectElement ? node : node.querySelector<HTMLElement>('input, .dd-button');\n control?.focus();\n });\n useLayoutEffect(() => {\n const control = input.current instanceof HTMLDivElement ? input.current.querySelector('input') : null;\n // Read-only keeps a newly focused field in place while another field saves.\n // The picker API stays unchanged; its search and buttons share this boundary.\n if (control) control.readOnly = pendingWrite;\n });\n\n /* Kept by the store so a successful write can confirm in place — the saved\n value, in green, on the field you just edited — rather than re-render.\n An unopened field registers its launcher: the store needs to know it is\n on screen to mark it when a refused save names it. */\n useEffect(() => {\n const element = input.current ?? launcher.current;\n if (element && editorCurrent(isCurrent))\n return registerInput(\n table,\n recordKey,\n column.name,\n element,\n (next: unknown) => {\n if (!editorCurrent(isCurrent)) return;\n const label = column.references ? input.current?.querySelector('input')?.value : undefined;\n setCommitted({ source: row, value: next === null || next === undefined ? null : String(next), label });\n setSaved(true);\n },\n readState,\n );\n });\n useEffect(() => {\n if (!saved) return;\n const timer = setTimeout(() => setSaved(false), 2200);\n return () => clearTimeout(timer);\n }, [saved]);\n useEffect(() => {\n if (!opened) {\n if (wasOpened.current) launcher.current?.focus();\n return;\n }\n wasOpened.current = true;\n const node = input.current;\n if (node instanceof HTMLInputElement || node instanceof HTMLSelectElement) node.focus();\n /* A rich text field is its text, not its toolbar's first button. */ else\n (node?.querySelector<HTMLElement>('[contenteditable=\"true\"]') ?? node?.querySelector<HTMLElement>('input, button'))?.focus();\n }, [opened]);\n useLayoutEffect(() => {\n if (pickerFocusRequested.current && (!display || opened)) input.current?.querySelector<HTMLElement>('input')?.focus();\n pickerFocusRequested.current = false;\n }, [pickerGeneration]);\n\n // A mounted editor can receive a narrower policy while a field is open; a\n // declared transition is the record's actions' to make, never an editor's.\n if (column.writable === false || column.changesBy === 'actions')\n return <>{display ? display(value) : <span>{value === null || value === undefined ? '—' : String(value)}</span>}</>;\n /* A document is not a line of text: a box would show `[object Object]`\n and stage it back over the value. JSON is read here, never edited. */\n const json = jsonValueOf(column, value);\n if (json) return <JsonView value={json.value} />;\n\n const onEdit = (next: string) => {\n if (applying || column.writable === false || column.changesBy === 'actions' || !editorCurrent(isCurrent)) return;\n setSaved(false);\n // An empty box on a nullable column means NULL, not the empty string.\n stage(table, recordKey, column, next === '' && column.nullable ? null : next, original);\n interaction.changed();\n refreshEditValidation(table, recordKey);\n done();\n };\n const onKey = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (!editorCurrent(isCurrent)) return;\n if (applying && e.key !== 'Tab' && e.key !== 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n if (e.key === 'Enter' && !interaction.isOpen() && (e.target instanceof HTMLInputElement || e.target instanceof HTMLSelectElement)) {\n e.preventDefault();\n e.stopPropagation();\n cancelBlur();\n if (pendingCount()) void applyStaged(table, recordKey, done);\n }\n if (e.key === 'Escape') {\n cancelBlur();\n if (interaction.isOpen()) return;\n e.preventDefault();\n e.stopPropagation();\n if (applying) return;\n // Restoring is cancellation, never a fresh edit of this or another field.\n stage(table, recordKey, column, original, original);\n unresolved.current = false;\n if (column.references) {\n pickerFocusRequested.current = true;\n setPickerGeneration((generation) => generation + 1);\n }\n setLeftInvalid(false);\n refreshEditValidation(table, recordKey);\n done();\n if (display) setOpened(false);\n }\n };\n\n /* A box you type `0` or `1` into is not an editor for a column that holds\n two values: the choices are the values the database stores. */\n const choices = booleanChoices(column, row) as { yes: string; no: string } | null;\n // A row-defined field (DefinedFields.tsx) is captioned by its definition, not by a label the App declares.\n const caption = (column as { defined?: DefinedFold }).defined?.label;\n const label = app ? (caption ?? columnLabel(table.id, column.name) ?? humanName(column.name)) : `${column.name} (${column.type})`;\n const inline = app && Boolean(display);\n const freezePointer = (e: React.SyntheticEvent) => {\n if (applying) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n const surface = (body: ReactNode) => (\n <div\n ref={interaction.root}\n data-edit-field=\"\"\n className=\"edit-field-surface\"\n onKeyDownCapture={onKey}\n onPointerDownCapture={freezePointer}\n onClickCapture={freezePointer}\n >\n {body}\n </div>\n );\n if (inline && !opened && !dirty && !error) {\n const shownValue = committed?.source === row ? committed.value : value;\n const body = display!(shownValue, committed?.source === row ? committed.label : undefined);\n /* A reference and a link are values to follow, so the value is not the\n edit button: a link inside a button is neither. The pencil beside it edits. */\n const shownRule = columnDisplay(table.id, column.name) as DisplayRule | null;\n /* Formatted text holds links and blocks of its own, so it is not drawn inside a button either. */\n const followed = column.references || shownRule?.format === 'richText' || linkFor(column.name, shownValue, shownRule, true);\n return surface(\n followed && shownValue !== null && shownValue !== undefined ? (\n <div className=\"inline-field\">\n <div className=\"inline-field-value\">{body}</div>\n <button\n ref={launcher}\n type=\"button\"\n className=\"inline-edit-button\"\n aria-label={say('edit', { label })}\n title={say('edit', { label })}\n disabled={applying}\n onClick={() => setOpened(true)}\n >\n ✎\n </button>\n </div>\n ) : (\n <button\n ref={launcher}\n type=\"button\"\n className=\"inline-edit-value\"\n aria-label={say('edit', { label })}\n title={say('edit', { label })}\n disabled={applying}\n onClick={() => setOpened(true)}\n >\n {body}\n </button>\n ),\n );\n }\n const wrap = (editor: ReactNode) =>\n surface(\n <>\n {inline ? (\n <div className=\"inline-field inline-field-open\">\n {editor}\n <button\n type=\"button\"\n className=\"inline-edit-button\"\n aria-label={say('doneEditing', { label })}\n title={say('doneEditing', { label })}\n disabled={dirty || applying}\n onClick={() => setOpened(false)}\n >\n ✓\n </button>\n </div>\n ) : (\n editor\n )}\n {error && (\n <span id={errorId} className=\"edit-field-error\" role=\"alert\">\n {error}\n </span>\n )}\n </>,\n );\n /* The App's own input for this column (`resources.<name>.inputs`): it hands back a value the draft\n stages and Save sends like any other; until its module is here the plain box stands in its place. */\n const custom = app ? columnInput(table.id, column.name) : undefined;\n if (custom) {\n const plain = (\n <input\n className={`cell-edit${statusClass}`}\n disabled={locked}\n aria-label={label}\n type=\"text\"\n value={shown === null ? '' : String(shown)}\n onChange={(e) => onEdit(e.target.value)}\n />\n );\n return wrap(\n <div\n ref={input as React.RefObject<HTMLDivElement>}\n inert={locked}\n aria-disabled={applying || undefined}\n className={`cell-edit-control${statusClass}`}\n >\n <InputSlot\n component={custom}\n fallback={plain}\n value={shown === null ? null : String(shown)}\n onChange={(next) => onEdit(next === null ? '' : String(next))}\n id={`${dateId}-input`}\n invalid={Boolean(error)}\n describedBy={error ? errorId : undefined}\n disabled={locked}\n required={column.nullable === false}\n label={label}\n field={{ name: column.name, resource: table.id }}\n context=\"edit\"\n />\n </div>,\n );\n }\n /* Formatted text: the editor, fetched the first time a rich text field is edited. Save sends the HTML it\n writes, and the server sanitizes it like any other write of the column. */\n const rich = app ? (columnDisplay(table.id, column.name) as DisplayRule | null) : null;\n if (rich?.format === 'richText') {\n const keep = pictureKeeper(rich.images, { table: table.id, key: recordKey }, state.activeConnection);\n return wrap(\n <div\n ref={input as React.RefObject<HTMLDivElement>}\n inert={locked}\n aria-disabled={applying || undefined}\n className={`cell-edit-control rich-edit${statusClass}`}\n >\n <RichTextField\n id={`${dateId}-input`}\n label={label}\n value={shown === null ? '' : String(shown)}\n onChange={onEdit}\n disabled={locked}\n invalid={Boolean(error)}\n {...(error ? { describedBy: errorId } : {})}\n autoFocus={inline}\n onPopupChange={interaction.onOpenChange}\n {...(rich.mentions ? { mentions: mentionSearch(rich.mentions, state.activeConnection) } : {})}\n {...(keep ? { pictures: keep, onProblem: (message: string) => toast(message, 'error') } : {})}\n />\n </div>,\n );\n }\n const composite =\n app &&\n column.references &&\n refsFrom(table.id).some((fk: { from: { columns: string[] } }) => fk.from.columns.length > 1 && fk.from.columns.includes(column.name));\n if (app && column.references && !composite) {\n const target = findTable(column.references.table) as TableMeta | undefined;\n if (target)\n return wrap(\n <div\n ref={input as React.RefObject<HTMLDivElement>}\n inert={locked}\n aria-disabled={applying || undefined}\n className={`cell-edit-control${statusClass}`}\n >\n <RecordPicker\n key={pickerGeneration}\n table={target}\n valueColumn={column.references.column}\n value={shown ?? ''}\n onChange={onEdit}\n ariaLabel={label}\n app\n editing={{\n popupRef: interaction.popupRef,\n onCancel: cancelBlur,\n onStateChange: (next) => {\n unresolved.current = next.unresolvedReference;\n interaction.onOpenChange(next.open);\n refreshEditValidation(table, recordKey);\n if (!next.unresolvedReference) setLeftInvalid(false);\n },\n }}\n />\n </div>,\n );\n }\n if (app && (column.allowed?.length || choices)) {\n const rule = columnDisplay(table.id, column.name) as DisplayRule | null;\n // The words the field says when it is read: an Off/On column is not edited as No/Yes.\n const words = choices ? booleanWords(rule, choices) : {};\n const values = column.allowed?.length\n ? column.allowed.map((v) => ({ value: v, label: choiceWord(rule, v) }))\n : [\n { value: choices!.yes, label: words.yes ?? say('common.yes') },\n { value: choices!.no, label: words.no ?? say('common.no') },\n ];\n if (shown !== null && !values.some((v) => v.value === shown)) values.unshift({ value: shown, label: shown });\n return wrap(\n <div\n ref={input as React.RefObject<HTMLDivElement>}\n inert={locked}\n aria-disabled={applying || undefined}\n className={`cell-edit-control${statusClass}`}\n >\n <Dropdown\n ariaLabel={label}\n value={shown ?? ''}\n items={[...(column.nullable ? [{ value: '', label: say('common.noValue') }] : []), ...values]}\n onChange={onEdit}\n disabled={locked}\n readOnly={pendingWrite}\n popupRef={interaction.popupRef}\n onOpenChange={interaction.onOpenChange}\n />\n </div>,\n );\n }\n if (choices) {\n return wrap(\n <select\n ref={input as React.RefObject<HTMLSelectElement>}\n disabled={applying}\n className={`cell-edit${statusClass}`}\n aria-label={label}\n value={shown === null ? '' : String(shown)}\n onChange={(e) => onEdit(e.target.value)}\n >\n {column.nullable && <option value=\"\">null</option>}\n <option value={choices.yes}>{say('yesValue')}</option>\n <option value={choices.no}>{say('noValue')}</option>\n </select>,\n );\n }\n /* A calendar date in an App is the themed calendar over ISO text, never read\n as an instant. A timestamp keeps its text box: a picker of wall times would\n rewrite a stored offset as a local time. Read-only while a save is in\n flight and the calendar's ownership of focus come from the same hooks as\n the pickers above. */\n if (app && columnKind(column.type) === 'date' && !/time/i.test(column.type)) {\n return wrap(\n <div\n ref={input as React.RefObject<HTMLDivElement>}\n inert={locked}\n aria-disabled={applying || undefined}\n className={`cell-edit-control${statusClass}`}\n >\n <DateField\n id={dateId}\n value={shown === null ? '' : String(shown)}\n onChange={onEdit}\n aria-label={label}\n disabled={locked}\n locale={formatLocale()}\n timezone={formatTimezone()}\n popupRef={interaction.popupRef}\n onOpenChange={interaction.onOpenChange}\n />\n </div>,\n );\n }\n return wrap(\n <input\n ref={input as React.RefObject<HTMLInputElement>}\n className={`cell-edit${statusClass}`}\n disabled={locked}\n readOnly={pendingWrite}\n aria-disabled={applying || undefined}\n aria-label={label}\n type=\"text\"\n value={shown === null ? '' : String(shown)}\n data-null={String(shown === null)}\n /* Where the database pins the vocabulary, say it — but still a text\n box: a select would silently rewrite a value the check would refuse. */\n title={column.allowed?.length ? say('one', { allowed: column.allowed.join(', ') }) : undefined}\n onChange={(e) => onEdit(e.target.value)}\n />,\n );\n}\n\n/** Explicit targets never fall back to document.body while a modal is mounting. */\nexport type PendingBarPlacement = 'inline' | { container: HTMLElement | null };\nexport interface PendingBarProps {\n table: TableMeta;\n recordKey: Record<string, unknown>;\n onDone?: (opts?: { inPlace?: boolean }) => void;\n /** Omitted: the existing App body dock or Workbench inline bar. */\n placement?: PendingBarPlacement;\n isCurrent?: () => boolean;\n}\n\n/** Placement changes presentation only; one bar still owns the existing draft. */\nexport function PendingBar({ table, recordKey, onDone, placement, isCurrent }: PendingBarProps) {\n useStaged();\n const changedElsewhere = useEditNotice(table.id, liveKeyText(recordKey));\n const owner = JSON.stringify(recordKey);\n useEffect(() => {\n if (!editorCurrent(isCurrent)) return;\n const draft = activateDraft(table, recordKey);\n return () => suspendDraft(draft);\n }, [table, owner]);\n const app = prefersPages();\n const container = placement === undefined ? (app ? portalRoot() : null) : placement === 'inline' ? null : placement.container;\n const present = (node: ReactNode) => (container ? createPortal(node, container) : node);\n const dock = app && placement === undefined ? ' pending-dock' : '';\n const done = (opts?: { inPlace?: boolean }) => {\n if (editorCurrent(isCurrent)) onDone?.(opts);\n };\n if (!editorCurrent(isCurrent)) return null;\n const attempt = stagedAttempt(table.id, recordKey);\n const feedback = app ? stagedFeedback(table.id, recordKey) : undefined;\n if (attempt?.phase === 'uncertain')\n return present(\n <div className={`pending pending-uncertain${dock}`} role=\"alert\">\n <p>{attempt.message}</p>\n <details>\n <summary>{say('proposedChanges')}</summary>\n {!app && attempt.detail && <p>{attempt.detail}</p>}\n <dl>\n {Object.entries(attempt.values).map(([column, value]) => (\n <div key={column}>\n <dt>{columnLabel(table.id, column) ?? column}</dt>\n <dd>{value === null ? 'NULL' : String(value)}</dd>\n </div>\n ))}\n </dl>\n </details>\n </div>,\n );\n if (draftNeedsReview(table.id, recordKey) && pendingCount())\n return present(\n <div className={`pending pending-recovery${dock}`} role=\"region\" aria-label={say('retainedDraft')}>\n <span className=\"pending-count\" role=\"status\">\n {say('unsavedChangesFromYourPrevious', { count: pendingCount() })}\n </span>\n <details>\n <summary>{say('proposedChanges')}</summary>\n <dl>\n {Object.entries(retainedValues()).map(([column, value]) => (\n <div key={column}>\n <dt>{columnLabel(table.id, column) ?? column}</dt>\n <dd>{value === null ? 'NULL' : String(value)}</dd>\n </div>\n ))}\n </dl>\n </details>\n {draftSchemaChanged(table) && <p role=\"alert\">{say('theTableDefinitionChanged')}</p>}\n <button\n type=\"button\"\n className=\"ghost\"\n onPointerDown={cancelBlur}\n onKeyDown={cancelBlur}\n onClick={() => {\n cancelBlur();\n if (editorCurrent(isCurrent)) {\n discardStaged();\n done();\n }\n }}\n >\n {say('discardDraft')}\n </button>\n <button\n type=\"button\"\n className=\"primary\"\n disabled={draftSchemaChanged(table) || !canEditRow(table, recordKey)}\n onClick={() => {\n cancelBlur();\n if (editorCurrent(isCurrent)) resumeDraft(table, recordKey);\n }}\n >\n {say('resumeDraft')}\n </button>\n </div>,\n );\n if (feedback && !pendingCount())\n return present(\n <div className={`pending pending-saved${dock}`} role=\"region\" aria-label={say('savedChanges')} aria-busy={applyingStaged()}>\n <span className=\"pending-count\" role={feedback.phase === 'error' ? 'alert' : 'status'}>\n <span className={`pending-status-icon ${feedback.phase === 'error' ? 'is-error' : ''}`} aria-hidden=\"true\">\n {feedback.phase === 'error' ? '!' : '✓'}\n </span>\n {feedback.message}\n </span>\n <span className=\"pending-cols\">{feedback.columns?.map((name: string) => columnLabel(table.id, name) ?? name).join(', ')}</span>\n <button\n type=\"button\"\n className=\"ghost\"\n disabled={applyingStaged()}\n onClick={() => {\n if (editorCurrent(isCurrent)) dismissSaveFeedback();\n }}\n >\n {say('common.dismiss')}\n </button>\n </div>,\n );\n if (!sameRow(table.id, recordKey) || !pendingCount()) return null;\n const n = pendingCount();\n /* Another person changed this record under the draft: said, and the form is left as it is (liveInvalidate.ts). A\n record room's draft docks at the window's foot, often far below the fields; there the notice hangs from the\n record's head instead, where this bar is drawn (PageHead's .page-pending), so the two read together. Elsewhere\n (a dialog, a board's card) the bar is beside the fields, and says it itself. */\n const notice = changedElsewhere && <LiveEditNotice table={table} recordKey={recordKey} {...(dock ? { place: 'anchored' } : {})} />;\n const bar = present(\n <div className={`pending${dock}`} role=\"region\" aria-label={say('unsavedChanges')} aria-busy={applyingStaged()}>\n {!dock && notice}\n <span className=\"pending-count\" role=\"status\">\n {say('countUnsavedChanges', { count: n })}\n </span>\n <span className=\"pending-cols\">\n {pendingColumns()\n .map((name: string) => columnLabel(table.id, name) ?? name)\n .join(', ')}\n </span>\n <button\n type=\"button\"\n className=\"ghost\"\n disabled={applyingStaged()}\n onPointerDown={cancelBlur}\n onKeyDown={cancelBlur}\n onClick={() => {\n cancelBlur();\n if (editorCurrent(isCurrent)) {\n discardStaged();\n done();\n }\n }}\n >\n {say('discard')}\n </button>\n <button\n type=\"button\"\n className=\"primary\"\n disabled={applyingStaged()}\n onPointerDown={cancelBlur}\n onKeyDown={cancelBlur}\n onClick={() => {\n cancelBlur();\n if (editorCurrent(isCurrent)) void applyStaged(table, recordKey, done);\n }}\n >\n {applyingStaged() ? (app ? 'Saving...' : say('awaitingConfirmation')) : app ? say('common.saveChanges') : say('reviewApply')}\n </button>\n {feedback?.phase === 'error' && (\n <p className=\"pending-error\" role=\"alert\">\n {feedback.message}\n </p>\n )}\n </div>,\n );\n return dock ? (\n <>\n {notice}\n {bar}\n </>\n ) : (\n bar\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shared-BumxsBlA.js","names":["_Fragment","JsonView"],"sources":["../../../kit/src/client/components/editInteraction.tsx","../../../kit/src/client/copy/record/components/Editable.ts","../../../kit/src/client/components/Editable.tsx"],"sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useRef } from 'react';\nimport { addHostListener, removeHostListener } from '../shellHost.js';\n\nconst cancellations = new Set<() => void>();\n\n/** Intent belongs to the record, even when another field has a deferred blur. */\nexport function cancelEditInteractions() {\n for (const cancel of cancellations) cancel();\n}\n\ninterface EditInteractionOptions {\n enabled: boolean;\n blocked?: boolean;\n owner?: string;\n captureGuard: (current: () => boolean) => () => boolean;\n onLeave: (guard: () => boolean) => void;\n onCancel: () => void;\n}\n\nconst action = (target: EventTarget | null) =>\n target instanceof Element &&\n Boolean(\n target.closest('a, [role=\"link\"], [data-edit-intent]') ||\n (!target.closest('[data-edit-field]') &&\n target.closest(\n 'button, summary, .clickable, [role=\"button\"], [role=\"menuitem\"], [role=\"tab\"], [tabindex]:not([tabindex=\"-1\"]), input, select, textarea',\n )),\n );\n\n/** A blur is evidence to examine, not permission to submit. Focus and pointer\n * ownership are checked after Base UI has settled selection/return focus. */\nexport function useEditInteraction(options: EditInteractionOptions) {\n const latest = useRef(options);\n latest.current = options;\n const root = useRef<HTMLDivElement>(null);\n const popup = useRef<HTMLDivElement | null>(null);\n const state = useRef({\n mounted: false,\n generation: 0,\n armed: false,\n departed: false,\n open: false,\n pointer: false,\n decision: undefined as undefined | { mounted: () => boolean; guard: () => boolean },\n timer: undefined as ReturnType<typeof setTimeout> | undefined,\n });\n const owns = useCallback(\n (target: EventTarget | null) => target instanceof Node && Boolean(root.current?.contains(target) || popup.current?.contains(target)),\n [],\n );\n const cancel = useCallback(() => {\n const s = state.current;\n s.generation++;\n s.armed = false;\n s.departed = false;\n s.decision = undefined;\n clearTimeout(s.timer);\n }, []);\n const changed = useCallback(() => {\n if (!latest.current.enabled) return;\n const s = state.current;\n s.generation++;\n s.armed = true;\n s.departed = false;\n s.decision = undefined;\n clearTimeout(s.timer);\n }, []);\n useLayoutEffect(() => cancel, [cancel, options.owner]);\n const settle = useCallback(() => {\n const s = state.current;\n if (!s.mounted || !s.armed || !s.departed || !latest.current.enabled) return;\n clearTimeout(s.timer);\n if (!s.decision) {\n const generation = s.generation;\n const mounted = () => s.mounted && generation === s.generation && latest.current.enabled && Boolean(root.current?.isConnected);\n s.decision = { mounted, guard: latest.current.captureGuard(mounted) };\n }\n const { mounted, guard } = s.decision;\n s.timer = setTimeout(() => {\n if (!mounted() || !s.armed || !s.departed || s.open || s.pointer) return;\n const active = document.activeElement;\n if (owns(active)) {\n s.departed = false;\n return;\n }\n if (action(active)) {\n cancelEditInteractions();\n latest.current.onCancel();\n return;\n }\n const current = () =>\n mounted() && !s.open && !s.pointer && !owns(document.activeElement) && !action(document.activeElement) && guard();\n // Consume this user change even if preflight or the store refuses it.\n s.armed = false;\n s.departed = false;\n s.decision = undefined;\n latest.current.onLeave(current);\n }, 0);\n }, [owns]);\n const popupRef = useCallback((node: HTMLDivElement | null) => {\n popup.current = node;\n if (node) {\n node.setAttribute('data-edit-field', '');\n node.inert = Boolean(latest.current.blocked);\n }\n }, []);\n useLayoutEffect(() => {\n if (popup.current) popup.current.inert = Boolean(options.blocked);\n }, [options.blocked]);\n const onOpenChange = useCallback(\n (open: boolean) => {\n state.current.open = open;\n if (!open) settle();\n },\n [settle],\n );\n\n useEffect(() => {\n const s = state.current;\n s.mounted = true;\n cancellations.add(cancel);\n const cancelIntent = () => {\n cancelEditInteractions();\n latest.current.onCancel();\n };\n const focusOut = (event: FocusEvent) => {\n if (!owns(event.target)) return;\n s.departed = true;\n if (action(event.relatedTarget) && !owns(event.relatedTarget)) cancelIntent();\n else settle();\n };\n const focusIn = (event: FocusEvent) => {\n if (owns(event.target)) {\n s.departed = false;\n s.decision = undefined;\n clearTimeout(s.timer);\n } else if (s.armed && action(event.target)) cancelIntent();\n };\n const pointerDown = (event: PointerEvent) => {\n if (!s.armed && !owns(event.target)) return;\n if (!owns(event.target) && action(event.target)) {\n cancelIntent();\n return;\n }\n s.pointer = true;\n };\n const pointerUp = () => {\n s.pointer = false;\n settle();\n };\n const pointerCancel = () => {\n s.pointer = false;\n cancelIntent();\n };\n const keyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' || ((event.key === 'Enter' || event.key === ' ') && !owns(event.target) && action(event.target)))\n cancelIntent();\n };\n const click = (event: MouseEvent) => {\n if (!owns(event.target) && action(event.target)) cancelIntent();\n };\n const input = (event: Event) => {\n if (owns(event.target)) changed();\n };\n addHostListener(document, 'focusout', focusOut, true);\n addHostListener(document, 'focusin', focusIn, true);\n addHostListener(document, 'pointerdown', pointerDown, true);\n addHostListener(document, 'pointerup', pointerUp, true);\n addHostListener(document, 'pointercancel', pointerCancel, true);\n addHostListener(document, 'keydown', keyDown, true);\n addHostListener(document, 'click', click, true);\n addHostListener(document, 'input', input, true);\n addHostListener(window, 'blur', cancelIntent);\n return () => {\n s.mounted = false;\n cancel();\n cancellations.delete(cancel);\n removeHostListener(document, 'focusout', focusOut, true);\n removeHostListener(document, 'focusin', focusIn, true);\n removeHostListener(document, 'pointerdown', pointerDown, true);\n removeHostListener(document, 'pointerup', pointerUp, true);\n removeHostListener(document, 'pointercancel', pointerCancel, true);\n removeHostListener(document, 'keydown', keyDown, true);\n removeHostListener(document, 'click', click, true);\n removeHostListener(document, 'input', input, true);\n removeHostListener(window, 'blur', cancelIntent);\n };\n }, [cancel, changed, owns, settle]);\n\n return { root, popupRef, onOpenChange, changed, isOpen: () => state.current.open };\n}\n","/** What Editable says, in the record page room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n edit: 'Edit {label}',\n doneEditing: 'Done editing {label}',\n yesValue: 'yes',\n noValue: 'no',\n one: 'one of: {allowed}',\n proposedChanges: 'Proposed changes',\n retainedDraft: 'Retained draft',\n unsavedChangesFromYourPrevious: {\n one: '{count} unsaved change from your previous visit',\n other: '{count} unsaved changes from your previous visit',\n },\n theTableDefinitionChanged: 'The table definition changed. This draft cannot be resumed.',\n discardDraft: 'Discard draft',\n resumeDraft: 'Resume draft',\n savedChanges: 'Saved changes',\n unsavedChanges: 'Unsaved changes',\n discard: 'Discard',\n awaitingConfirmation: 'Awaiting confirmation...',\n reviewApply: 'Review & apply',\n countUnsavedChanges: { one: '{count} unsaved change', other: '{count} unsaved changes' },\n});\n","/**\n * A field as an editor, and the bar that says what is pending.\n *\n * Edits share one staged snapshot and expected originals. Explicit Save is\n * the default; an opted-in App can submit on an owned field blur. Staging lives\n * in write.js, keyed by connection, table and row; these components read\n * it and tick with it. Everything about the write itself — the\n * confirmation that shows the statement, the request, the undo — is the\n * store's.\n */\nimport { useEffect, useId, useLayoutEffect, useRef, useState, useSyncExternalStore, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n activateDraft,\n applyStaged,\n applyingStaged,\n booleanChoices,\n canEditRow,\n cancelRecordAutosave,\n captureRecordAutosaveGuard,\n discardStaged,\n dismissSaveFeedback,\n draftNeedsReview,\n draftSchemaChanged,\n pendingCount,\n pendingColumns,\n refreshEditValidation,\n registerInput,\n retainedValues,\n resumeDraft,\n sameRow,\n stage,\n stagedAttempt,\n stagedDiscardVersion,\n stagedEditErrors,\n stagedFeedback,\n stagedOriginal,\n stagedValue,\n subscribeStaged,\n stagedVersion,\n suspendDraft,\n takeFieldFocus,\n} from '../write.js';\nimport { columnKind, type ColumnMeta, type TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport { columnDisplay, columnLabel, findTable, prefersPages, refsFrom, state, toast } from '../core.js';\nimport { RichTextField, mentionSearch, pictureKeeper } from './RichTextField.js';\nimport { booleanWords, choiceWord, linkFor, type DisplayRule } from './valueModel.js';\nimport { humanName } from '@mistriwork/engine/shared/model.js';\nimport { Dropdown } from './Dropdown.js';\nimport { RecordPicker } from './RecordPicker.js';\nimport { sessionIdentity } from '../sessionIdentity.js';\nimport type { DefinedFold } from '../recordDrafts.js';\nimport { shell } from '../shellMode.js';\nimport { cancelEditInteractions, useEditInteraction } from './editInteraction.js';\nimport { formatLocale, formatTimezone } from '../locale.js';\nimport { DateField } from './DateField.js';\nimport { InputSlot, columnInput } from './inputRenderers.js';\nimport { say } from '../copy/record/components/Editable.js';\n\nimport { JsonValue as JsonView } from './JsonValue.js';\nimport { jsonValueOf } from './jsonModel.js';\nimport { portalRoot } from '../shellHost.js';\nimport { onDemand } from './onDemand.js';\nimport { liveKeyText, useEditNotice } from '../liveState.js';\n\nconst LiveEditNotice = onDemand(() => import('./LiveNotices.js'), 'LiveEditNotice', { quiet: true });\n\nfunction cancelBlur() {\n cancelEditInteractions();\n cancelRecordAutosave();\n}\n\nfunction editorCurrent(isCurrent?: () => boolean): boolean {\n try {\n return isCurrent === undefined || isCurrent() === true;\n } catch {\n return false;\n }\n}\n\n/** Re-render whenever the staging changes. */\nfunction useStaged(): number {\n return useSyncExternalStore(subscribeStaged, stagedVersion, stagedVersion);\n}\n\ninterface EditableProps {\n table: TableMeta;\n row: Record<string, unknown>;\n column: ColumnMeta & { allowed?: string[] };\n recordKey: Record<string, unknown>;\n app?: boolean;\n /** A formatted App-mode value, replaced only when this field is opened. */\n display?: (value: unknown, referenceLabel?: string) => ReactNode;\n /** Told after a change is staged, and after a write lands (`{ inPlace: true }`). */\n onSaved?: (opts?: { inPlace?: boolean }) => void;\n /** Additional explicit-surface lifetime fence; never replaces draft authority. */\n isCurrent?: () => boolean;\n}\n\nexport function Editable({ table, row, column, recordKey, onSaved, app = false, display, isCurrent }: EditableProps) {\n useStaged();\n const done = (opts?: { inPlace?: boolean }) => {\n if (editorCurrent(isCurrent)) onSaved?.(opts);\n };\n const value = row[column.name];\n const [committed, setCommitted] = useState<{ source: Record<string, unknown>; value: string | null; label?: string } | null>(null);\n const [opened, setOpened] = useState(false);\n const [saved, setSaved] = useState(false);\n const retainedOriginal = sameRow(table.id, recordKey) ? stagedOriginal(column.name) : undefined;\n const original =\n retainedOriginal !== undefined\n ? retainedOriginal\n : committed?.source === row\n ? committed.value\n : value === null || value === undefined\n ? null\n : String(value);\n const pending = sameRow(table.id, recordKey) ? (stagedValue(column.name) as string | null | undefined) : undefined;\n const shown = pending !== undefined ? pending : original;\n const dirty = pending !== undefined;\n const statusClass = dirty ? ' dirty' : saved && committed?.source === row ? ' saved' : '';\n const attempt = stagedAttempt(table.id, recordKey);\n const pendingWrite = applyingStaged() || attempt?.phase === 'pending';\n const locked = attempt?.phase === 'uncertain' || draftNeedsReview(table.id, recordKey);\n const applying = pendingWrite || locked;\n const input = useRef<HTMLInputElement | HTMLSelectElement | HTMLDivElement>(null);\n const launcher = useRef<HTMLButtonElement>(null);\n const wasOpened = useRef(false);\n const unresolved = useRef(false);\n const [leftInvalid, setLeftInvalid] = useState(false);\n const [pickerGeneration, setPickerGeneration] = useState(0);\n const pickerFocusRequested = useRef(false);\n const discarded = stagedDiscardVersion(table.id, recordKey);\n const lastDiscard = useRef(discarded);\n useLayoutEffect(() => {\n if (lastDiscard.current === discarded) return;\n lastDiscard.current = discarded;\n unresolved.current = false;\n setLeftInvalid(false);\n pickerFocusRequested.current = false;\n if (column.references) setPickerGeneration((generation) => generation + 1);\n }, [discarded, column.references]);\n const errorId = useId();\n const dateId = useId();\n /* A box the browser cannot read (badInput), or the calendar's text box\n holding what is not a date (its own validity), is not a value to save. */\n const readState = () => {\n const node = input.current;\n const control =\n node instanceof HTMLInputElement\n ? node\n : node instanceof HTMLDivElement\n ? node.querySelector<HTMLInputElement>('input.date-field-input')\n : null;\n return {\n unresolvedReference: unresolved.current,\n invalidInput: Boolean(control && (control.validity.badInput || control.validity.customError)),\n };\n };\n const interaction = useEditInteraction({\n enabled:\n app &&\n shell().saveMode() === 'blur' &&\n column.writable !== false &&\n column.changesBy !== 'actions' &&\n !applying &&\n editorCurrent(isCurrent),\n blocked: applying,\n owner: JSON.stringify([sessionIdentity().epoch, table.id, recordKey, column.name]),\n captureGuard: (current) =>\n captureRecordAutosaveGuard(\n table,\n recordKey,\n () => current() && editorCurrent(isCurrent) && shell().saveMode() === 'blur' && canEditRow(table, recordKey),\n ),\n onLeave: (guard) => {\n setLeftInvalid(true);\n void applyStaged(table, recordKey, done, { trigger: 'blur', guard });\n },\n onCancel: cancelRecordAutosave,\n });\n const error =\n stagedEditErrors(table.id, recordKey)[column.name] ??\n (leftInvalid && readState().unresolvedReference\n ? say('common.chooseARecordOrClear')\n : leftInvalid && readState().invalidInput\n ? say('common.enterAValidValue')\n : undefined);\n\n // Composite controls keep their own ARIA attributes; this field owns one\n // description token, on the actual focusable control, for both renderers.\n useLayoutEffect(() => {\n const node = input.current;\n const control =\n node instanceof HTMLInputElement || node instanceof HTMLSelectElement ? node : node?.querySelector<HTMLElement>('input, .dd-button');\n if (!control || !error) return;\n const described = control.getAttribute('aria-describedby')?.split(/\\s+/).filter(Boolean) ?? [];\n const invalid = control.getAttribute('aria-invalid');\n control.setAttribute('aria-describedby', [...new Set([...described, errorId])].join(' '));\n control.setAttribute('aria-invalid', 'true');\n return () => {\n const remaining =\n control\n .getAttribute('aria-describedby')\n ?.split(/\\s+/)\n .filter((id) => id && id !== errorId) ?? [];\n if (remaining.length) control.setAttribute('aria-describedby', remaining.join(' '));\n else control.removeAttribute('aria-describedby');\n if (invalid !== null) control.setAttribute('aria-invalid', invalid);\n else control.removeAttribute('aria-invalid');\n };\n });\n /* A refused Save leaves the focus for the first field it marked; this\n editor takes it once it is drawn — a marked field opens to be answered. */\n useLayoutEffect(() => {\n const node = input.current;\n if (!error || !node || !takeFieldFocus(table.id, recordKey, column.name)) return;\n const control =\n node instanceof HTMLInputElement || node instanceof HTMLSelectElement ? node : node.querySelector<HTMLElement>('input, .dd-button');\n control?.focus();\n });\n useLayoutEffect(() => {\n const control = input.current instanceof HTMLDivElement ? input.current.querySelector('input') : null;\n // Read-only keeps a newly focused field in place while another field saves.\n // The picker API stays unchanged; its search and buttons share this boundary.\n if (control) control.readOnly = pendingWrite;\n });\n\n /* Kept by the store so a successful write can confirm in place — the saved\n value, in green, on the field you just edited — rather than re-render.\n An unopened field registers its launcher: the store needs to know it is\n on screen to mark it when a refused save names it. */\n useEffect(() => {\n const element = input.current ?? launcher.current;\n if (element && editorCurrent(isCurrent))\n return registerInput(\n table,\n recordKey,\n column.name,\n element,\n (next: unknown) => {\n if (!editorCurrent(isCurrent)) return;\n const label = column.references ? input.current?.querySelector('input')?.value : undefined;\n setCommitted({ source: row, value: next === null || next === undefined ? null : String(next), label });\n setSaved(true);\n },\n readState,\n );\n });\n useEffect(() => {\n if (!saved) return;\n const timer = setTimeout(() => setSaved(false), 2200);\n return () => clearTimeout(timer);\n }, [saved]);\n useEffect(() => {\n if (!opened) {\n if (wasOpened.current) launcher.current?.focus();\n return;\n }\n wasOpened.current = true;\n const node = input.current;\n if (node instanceof HTMLInputElement || node instanceof HTMLSelectElement) node.focus();\n /* A rich text field is its text, not its toolbar's first button. */ else\n (node?.querySelector<HTMLElement>('[contenteditable=\"true\"]') ?? node?.querySelector<HTMLElement>('input, button'))?.focus();\n }, [opened]);\n useLayoutEffect(() => {\n if (pickerFocusRequested.current && (!display || opened)) input.current?.querySelector<HTMLElement>('input')?.focus();\n pickerFocusRequested.current = false;\n }, [pickerGeneration]);\n\n // A mounted editor can receive a narrower policy while a field is open; a\n // declared transition is the record's actions' to make, never an editor's.\n if (column.writable === false || column.changesBy === 'actions')\n return <>{display ? display(value) : <span>{value === null || value === undefined ? '—' : String(value)}</span>}</>;\n /* A document is not a line of text: a box would show `[object Object]`\n and stage it back over the value. JSON is read here, never edited. */\n const json = jsonValueOf(column, value);\n if (json) return <JsonView value={json.value} />;\n\n const onEdit = (next: string) => {\n if (applying || column.writable === false || column.changesBy === 'actions' || !editorCurrent(isCurrent)) return;\n setSaved(false);\n // An empty box on a nullable column means NULL, not the empty string.\n stage(table, recordKey, column, next === '' && column.nullable ? null : next, original);\n interaction.changed();\n refreshEditValidation(table, recordKey);\n done();\n };\n const onKey = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (!editorCurrent(isCurrent)) return;\n if (applying && e.key !== 'Tab' && e.key !== 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n if (e.key === 'Enter' && !interaction.isOpen() && (e.target instanceof HTMLInputElement || e.target instanceof HTMLSelectElement)) {\n e.preventDefault();\n e.stopPropagation();\n cancelBlur();\n if (pendingCount()) void applyStaged(table, recordKey, done);\n }\n if (e.key === 'Escape') {\n cancelBlur();\n if (interaction.isOpen()) return;\n e.preventDefault();\n e.stopPropagation();\n if (applying) return;\n // Restoring is cancellation, never a fresh edit of this or another field.\n stage(table, recordKey, column, original, original);\n unresolved.current = false;\n if (column.references) {\n pickerFocusRequested.current = true;\n setPickerGeneration((generation) => generation + 1);\n }\n setLeftInvalid(false);\n refreshEditValidation(table, recordKey);\n done();\n if (display) setOpened(false);\n }\n };\n\n /* A box you type `0` or `1` into is not an editor for a column that holds\n two values: the choices are the values the database stores. */\n const choices = booleanChoices(column, row) as { yes: string; no: string } | null;\n // A row-defined field (DefinedFields.tsx) is captioned by its definition, not by a label the App declares.\n const caption = (column as { defined?: DefinedFold }).defined?.label;\n const label = app ? (caption ?? columnLabel(table.id, column.name) ?? humanName(column.name)) : `${column.name} (${column.type})`;\n const inline = app && Boolean(display);\n const freezePointer = (e: React.SyntheticEvent) => {\n if (applying) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n const surface = (body: ReactNode) => (\n <div\n ref={interaction.root}\n data-edit-field=\"\"\n className=\"edit-field-surface\"\n onKeyDownCapture={onKey}\n onPointerDownCapture={freezePointer}\n onClickCapture={freezePointer}\n >\n {body}\n </div>\n );\n if (inline && !opened && !dirty && !error) {\n const shownValue = committed?.source === row ? committed.value : value;\n const body = display!(shownValue, committed?.source === row ? committed.label : undefined);\n /* A reference and a link are values to follow, so the value is not the\n edit button: a link inside a button is neither. The pencil beside it edits. */\n const shownRule = columnDisplay(table.id, column.name) as DisplayRule | null;\n /* Formatted text holds links and blocks of its own, so it is not drawn inside a button either. */\n const followed = column.references || shownRule?.format === 'richText' || linkFor(column.name, shownValue, shownRule, true);\n return surface(\n followed && shownValue !== null && shownValue !== undefined ? (\n <div className=\"inline-field\">\n <div className=\"inline-field-value\">{body}</div>\n <button\n ref={launcher}\n type=\"button\"\n className=\"inline-edit-button\"\n aria-label={say('edit', { label })}\n title={say('edit', { label })}\n disabled={applying}\n onClick={() => setOpened(true)}\n >\n ✎\n </button>\n </div>\n ) : (\n <button\n ref={launcher}\n type=\"button\"\n className=\"inline-edit-value\"\n aria-label={say('edit', { label })}\n title={say('edit', { label })}\n disabled={applying}\n onClick={() => setOpened(true)}\n >\n {body}\n </button>\n ),\n );\n }\n const wrap = (editor: ReactNode) =>\n surface(\n <>\n {inline ? (\n <div className=\"inline-field inline-field-open\">\n {editor}\n <button\n type=\"button\"\n className=\"inline-edit-button\"\n aria-label={say('doneEditing', { label })}\n title={say('doneEditing', { label })}\n disabled={dirty || applying}\n onClick={() => setOpened(false)}\n >\n ✓\n </button>\n </div>\n ) : (\n editor\n )}\n {error && (\n <span id={errorId} className=\"edit-field-error\" role=\"alert\">\n {error}\n </span>\n )}\n </>,\n );\n /* The App's own input for this column (`resources.<name>.inputs`): it hands back a value the draft\n stages and Save sends like any other; until its module is here the plain box stands in its place. */\n const custom = app ? columnInput(table.id, column.name) : undefined;\n if (custom) {\n const plain = (\n <input\n className={`cell-edit${statusClass}`}\n disabled={locked}\n aria-label={label}\n type=\"text\"\n value={shown === null ? '' : String(shown)}\n onChange={(e) => onEdit(e.target.value)}\n />\n );\n return wrap(\n <div\n ref={input as React.RefObject<HTMLDivElement>}\n inert={locked}\n aria-disabled={applying || undefined}\n className={`cell-edit-control${statusClass}`}\n >\n <InputSlot\n component={custom}\n fallback={plain}\n value={shown === null ? null : String(shown)}\n onChange={(next) => onEdit(next === null ? '' : String(next))}\n id={`${dateId}-input`}\n invalid={Boolean(error)}\n describedBy={error ? errorId : undefined}\n disabled={locked}\n required={column.nullable === false}\n label={label}\n field={{ name: column.name, resource: table.id }}\n context=\"edit\"\n />\n </div>,\n );\n }\n /* Formatted text: the editor, fetched the first time a rich text field is edited. Save sends the HTML it\n writes, and the server sanitizes it like any other write of the column. */\n const rich = app ? (columnDisplay(table.id, column.name) as DisplayRule | null) : null;\n if (rich?.format === 'richText') {\n const keep = pictureKeeper(rich.images, { table: table.id, key: recordKey }, state.activeConnection);\n return wrap(\n <div\n ref={input as React.RefObject<HTMLDivElement>}\n inert={locked}\n aria-disabled={applying || undefined}\n className={`cell-edit-control rich-edit${statusClass}`}\n >\n <RichTextField\n id={`${dateId}-input`}\n label={label}\n value={shown === null ? '' : String(shown)}\n onChange={onEdit}\n disabled={locked}\n invalid={Boolean(error)}\n {...(error ? { describedBy: errorId } : {})}\n autoFocus={inline}\n onPopupChange={interaction.onOpenChange}\n {...(rich.mentions ? { mentions: mentionSearch(rich.mentions, state.activeConnection) } : {})}\n {...(keep ? { pictures: keep, onProblem: (message: string) => toast(message, 'error') } : {})}\n />\n </div>,\n );\n }\n const composite =\n app &&\n column.references &&\n refsFrom(table.id).some((fk: { from: { columns: string[] } }) => fk.from.columns.length > 1 && fk.from.columns.includes(column.name));\n if (app && column.references && !composite) {\n const target = findTable(column.references.table) as TableMeta | undefined;\n if (target)\n return wrap(\n <div\n ref={input as React.RefObject<HTMLDivElement>}\n inert={locked}\n aria-disabled={applying || undefined}\n className={`cell-edit-control${statusClass}`}\n >\n <RecordPicker\n key={pickerGeneration}\n table={target}\n valueColumn={column.references.column}\n value={shown ?? ''}\n onChange={onEdit}\n ariaLabel={label}\n app\n editing={{\n popupRef: interaction.popupRef,\n onCancel: cancelBlur,\n onStateChange: (next) => {\n unresolved.current = next.unresolvedReference;\n interaction.onOpenChange(next.open);\n refreshEditValidation(table, recordKey);\n if (!next.unresolvedReference) setLeftInvalid(false);\n },\n }}\n />\n </div>,\n );\n }\n if (app && (column.allowed?.length || choices)) {\n const rule = columnDisplay(table.id, column.name) as DisplayRule | null;\n // The words the field says when it is read: an Off/On column is not edited as No/Yes.\n const words = choices ? booleanWords(rule, choices) : {};\n const values = column.allowed?.length\n ? column.allowed.map((v) => ({ value: v, label: choiceWord(rule, v) }))\n : [\n { value: choices!.yes, label: words.yes ?? say('common.yes') },\n { value: choices!.no, label: words.no ?? say('common.no') },\n ];\n if (shown !== null && !values.some((v) => v.value === shown)) values.unshift({ value: shown, label: shown });\n return wrap(\n <div\n ref={input as React.RefObject<HTMLDivElement>}\n inert={locked}\n aria-disabled={applying || undefined}\n className={`cell-edit-control${statusClass}`}\n >\n <Dropdown\n ariaLabel={label}\n value={shown ?? ''}\n items={[...(column.nullable ? [{ value: '', label: say('common.noValue') }] : []), ...values]}\n onChange={onEdit}\n disabled={locked}\n readOnly={pendingWrite}\n popupRef={interaction.popupRef}\n onOpenChange={interaction.onOpenChange}\n />\n </div>,\n );\n }\n if (choices) {\n return wrap(\n <select\n ref={input as React.RefObject<HTMLSelectElement>}\n disabled={applying}\n className={`cell-edit${statusClass}`}\n aria-label={label}\n value={shown === null ? '' : String(shown)}\n onChange={(e) => onEdit(e.target.value)}\n >\n {column.nullable && <option value=\"\">null</option>}\n <option value={choices.yes}>{say('yesValue')}</option>\n <option value={choices.no}>{say('noValue')}</option>\n </select>,\n );\n }\n /* A calendar date in an App is the themed calendar over ISO text, never read\n as an instant. A timestamp keeps its text box: a picker of wall times would\n rewrite a stored offset as a local time. Read-only while a save is in\n flight and the calendar's ownership of focus come from the same hooks as\n the pickers above. */\n if (app && columnKind(column.type) === 'date' && !/time/i.test(column.type)) {\n return wrap(\n <div\n ref={input as React.RefObject<HTMLDivElement>}\n inert={locked}\n aria-disabled={applying || undefined}\n className={`cell-edit-control${statusClass}`}\n >\n <DateField\n id={dateId}\n value={shown === null ? '' : String(shown)}\n onChange={onEdit}\n aria-label={label}\n disabled={locked}\n locale={formatLocale()}\n timezone={formatTimezone()}\n popupRef={interaction.popupRef}\n onOpenChange={interaction.onOpenChange}\n />\n </div>,\n );\n }\n return wrap(\n <input\n ref={input as React.RefObject<HTMLInputElement>}\n className={`cell-edit${statusClass}`}\n disabled={locked}\n readOnly={pendingWrite}\n aria-disabled={applying || undefined}\n aria-label={label}\n type=\"text\"\n value={shown === null ? '' : String(shown)}\n data-null={String(shown === null)}\n /* Where the database pins the vocabulary, say it — but still a text\n box: a select would silently rewrite a value the check would refuse. */\n title={column.allowed?.length ? say('one', { allowed: column.allowed.join(', ') }) : undefined}\n onChange={(e) => onEdit(e.target.value)}\n />,\n );\n}\n\n/** Explicit targets never fall back to document.body while a modal is mounting. */\nexport type PendingBarPlacement = 'inline' | { container: HTMLElement | null };\nexport interface PendingBarProps {\n table: TableMeta;\n recordKey: Record<string, unknown>;\n onDone?: (opts?: { inPlace?: boolean }) => void;\n /** Omitted: the existing App body dock or Workbench inline bar. */\n placement?: PendingBarPlacement;\n isCurrent?: () => boolean;\n}\n\n/** Placement changes presentation only; one bar still owns the existing draft. */\nexport function PendingBar({ table, recordKey, onDone, placement, isCurrent }: PendingBarProps) {\n useStaged();\n const changedElsewhere = useEditNotice(table.id, liveKeyText(recordKey));\n const owner = JSON.stringify(recordKey);\n useEffect(() => {\n if (!editorCurrent(isCurrent)) return;\n const draft = activateDraft(table, recordKey);\n return () => suspendDraft(draft);\n }, [table, owner]);\n const app = prefersPages();\n const container = placement === undefined ? (app ? portalRoot() : null) : placement === 'inline' ? null : placement.container;\n const present = (node: ReactNode) => (container ? createPortal(node, container) : node);\n const dock = app && placement === undefined ? ' pending-dock' : '';\n const done = (opts?: { inPlace?: boolean }) => {\n if (editorCurrent(isCurrent)) onDone?.(opts);\n };\n if (!editorCurrent(isCurrent)) return null;\n const attempt = stagedAttempt(table.id, recordKey);\n const feedback = app ? stagedFeedback(table.id, recordKey) : undefined;\n if (attempt?.phase === 'uncertain')\n return present(\n <div className={`pending pending-uncertain${dock}`} role=\"alert\">\n <p>{attempt.message}</p>\n <details>\n <summary>{say('proposedChanges')}</summary>\n {!app && attempt.detail && <p>{attempt.detail}</p>}\n <dl>\n {Object.entries(attempt.values).map(([column, value]) => (\n <div key={column}>\n <dt>{columnLabel(table.id, column) ?? column}</dt>\n <dd>{value === null ? 'NULL' : String(value)}</dd>\n </div>\n ))}\n </dl>\n </details>\n </div>,\n );\n if (draftNeedsReview(table.id, recordKey) && pendingCount())\n return present(\n <div className={`pending pending-recovery${dock}`} role=\"region\" aria-label={say('retainedDraft')}>\n <span className=\"pending-count\" role=\"status\">\n {say('unsavedChangesFromYourPrevious', { count: pendingCount() })}\n </span>\n <details>\n <summary>{say('proposedChanges')}</summary>\n <dl>\n {Object.entries(retainedValues()).map(([column, value]) => (\n <div key={column}>\n <dt>{columnLabel(table.id, column) ?? column}</dt>\n <dd>{value === null ? 'NULL' : String(value)}</dd>\n </div>\n ))}\n </dl>\n </details>\n {draftSchemaChanged(table) && <p role=\"alert\">{say('theTableDefinitionChanged')}</p>}\n <button\n type=\"button\"\n className=\"ghost\"\n onPointerDown={cancelBlur}\n onKeyDown={cancelBlur}\n onClick={() => {\n cancelBlur();\n if (editorCurrent(isCurrent)) {\n discardStaged();\n done();\n }\n }}\n >\n {say('discardDraft')}\n </button>\n <button\n type=\"button\"\n className=\"primary\"\n disabled={draftSchemaChanged(table) || !canEditRow(table, recordKey)}\n onClick={() => {\n cancelBlur();\n if (editorCurrent(isCurrent)) resumeDraft(table, recordKey);\n }}\n >\n {say('resumeDraft')}\n </button>\n </div>,\n );\n if (feedback && !pendingCount())\n return present(\n <div className={`pending pending-saved${dock}`} role=\"region\" aria-label={say('savedChanges')} aria-busy={applyingStaged()}>\n <span className=\"pending-count\" role={feedback.phase === 'error' ? 'alert' : 'status'}>\n <span className={`pending-status-icon ${feedback.phase === 'error' ? 'is-error' : ''}`} aria-hidden=\"true\">\n {feedback.phase === 'error' ? '!' : '✓'}\n </span>\n {feedback.message}\n </span>\n <span className=\"pending-cols\">{feedback.columns?.map((name: string) => columnLabel(table.id, name) ?? name).join(', ')}</span>\n <button\n type=\"button\"\n className=\"ghost\"\n disabled={applyingStaged()}\n onClick={() => {\n if (editorCurrent(isCurrent)) dismissSaveFeedback();\n }}\n >\n {say('common.dismiss')}\n </button>\n </div>,\n );\n if (!sameRow(table.id, recordKey) || !pendingCount()) return null;\n const n = pendingCount();\n /* Another person changed this record under the draft: said, and the form is left as it is (liveInvalidate.ts). A\n record room's draft docks at the window's foot, often far below the fields; there the notice hangs from the\n record's head instead, where this bar is drawn (PageHead's .page-pending), so the two read together. Elsewhere\n (a dialog, a board's card) the bar is beside the fields, and says it itself. */\n const notice = changedElsewhere && <LiveEditNotice table={table} recordKey={recordKey} {...(dock ? { place: 'anchored' } : {})} />;\n const bar = present(\n <div className={`pending${dock}`} role=\"region\" aria-label={say('unsavedChanges')} aria-busy={applyingStaged()}>\n {!dock && notice}\n <span className=\"pending-count\" role=\"status\">\n {say('countUnsavedChanges', { count: n })}\n </span>\n <span className=\"pending-cols\">\n {pendingColumns()\n .map((name: string) => columnLabel(table.id, name) ?? name)\n .join(', ')}\n </span>\n <button\n type=\"button\"\n className=\"ghost\"\n disabled={applyingStaged()}\n onPointerDown={cancelBlur}\n onKeyDown={cancelBlur}\n onClick={() => {\n cancelBlur();\n if (editorCurrent(isCurrent)) {\n discardStaged();\n done();\n }\n }}\n >\n {say('discard')}\n </button>\n <button\n type=\"button\"\n className=\"primary\"\n disabled={applyingStaged()}\n onPointerDown={cancelBlur}\n onKeyDown={cancelBlur}\n onClick={() => {\n cancelBlur();\n if (editorCurrent(isCurrent)) void applyStaged(table, recordKey, done);\n }}\n >\n {applyingStaged() ? (app ? 'Saving...' : say('awaitingConfirmation')) : app ? say('common.saveChanges') : say('reviewApply')}\n </button>\n {feedback?.phase === 'error' && (\n <p className=\"pending-error\" role=\"alert\">\n {feedback.message}\n </p>\n )}\n </div>,\n );\n return dock ? (\n <>\n {notice}\n {bar}\n </>\n ) : (\n bar\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { it as useQuery } from "./shared-poc11xxo.js";
|
|
2
2
|
import { F as primaryKey, Jt as formatNumber, Kt as formatLocale, gt as defineMessages } from "./shared-DJZjSi3J.js";
|
|
3
|
-
import { L as state, _ as openRecord, i as api, p as keyOf, st as ownedBy } from "./shared-
|
|
3
|
+
import { L as state, _ as openRecord, i as api, p as keyOf, st as ownedBy } from "./shared-BoLbc2WD.js";
|
|
4
4
|
import { t as listPresentationColumns, u as splitQuery } from "./shared-DOvMIC4W.js";
|
|
5
|
-
import { n as namedCell } from "./shared-
|
|
5
|
+
import { n as namedCell } from "./shared-DyKsJTZs.js";
|
|
6
6
|
import { useEffect, useMemo, useRef, useState } from "react";
|
|
7
7
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
8
|
// packages/mistri/src/client/copy/lists/components/GanttList.ts
|
|
@@ -351,4 +351,4 @@ function GanttList({ table, spec, entry, interactive = true, label, referenceLab
|
|
|
351
351
|
}
|
|
352
352
|
export { GanttList, dayOf, rowsOf };
|
|
353
353
|
|
|
354
|
-
//# sourceMappingURL=shared-
|
|
354
|
+
//# sourceMappingURL=shared-Bw73ktBk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-Dzu7tFiC.js","names":["sayCopy"],"sources":["../../src/client/copy/lists/components/GanttList.ts","../../src/client/components/GanttList.tsx"],"sourcesContent":["/** What GanttList says, in the lists and grid 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 untitled: 'Untitled',\n noGroup: 'None',\n nothingHere: 'Nothing to show here.',\n onDay: '{title}, on {day}',\n fromTo: '{title}, {from} to {to}',\n done: ', {share}% done',\n firstOnly: 'Showing the first {count}; narrow the list to see the rest.',\n});\n","/**\n * Records as bars across time: each from its start to its end (both days\n * counted), on a row of its own or on its group's row, against a ruler of\n * weeks or months and a line at today. The list's own question is asked once\n * for the whole span, up to LIMIT records, sorted by start, and the chart\n * says when there are more. A record with no end is a mark on its start.\n *\n * The keyboard reads it as a list (one Tab stop, the bar last visited): Up\n * and Down step between bars in reading order, Home and End to the ends, and\n * Enter opens the record. Each bar says its dates in words, so the chart is\n * readable without the picture. Dragging a bar to move its dates is not here\n * yet; the record's own form changes them.\n */\nimport './GanttList.css';\nimport { useEffect, useMemo, useRef, useState, type KeyboardEvent } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { api, keyOf, openRecord, state } from '@mistriwork/kit/client/core.js';\nimport { formatLocale, formatNumber } from '@mistriwork/kit/client/locale.js';\nimport { ownedBy } from '@mistriwork/kit/client/requestIdentity.js';\nimport { splitQuery } from '@mistriwork/kit/client/clauses.js';\nimport { primaryKey, type TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport type { AppGanttList } from '@mistriwork/engine/shared/listPresentations.js';\nimport { listPresentationColumns } from '@mistriwork/engine/shared/appListColumns.js';\nimport { namedCell } from '@mistriwork/kit/client/components/listColumn.js';\nimport type { ModalRecord } from './RecordModal.js';\nimport type { TableEntry } from '@mistriwork/kit/client/components/TableView.js';\nimport { say as sayCopy } from '../copy/lists/components/GanttList.js';\n\n/** A chart is read whole; past this it says so rather than drawing a part as if it were all. */\nconst LIMIT = 500;\nconst DAY = 86_400_000;\n\n/** A date or timestamp as its calendar day (days since 1970, UTC), or null when it is not one. */\nexport function dayOf(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null;\n const text = value instanceof Date ? value.toISOString() : String(value);\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(text);\n if (!match) return null;\n return Math.floor(Date.UTC(Number(match[1]), Number(match[2]) - 1, Number(match[3])) / DAY);\n}\n\ninterface GanttBar {\n id: string;\n key: Record<string, unknown>;\n title: string;\n first: number;\n /** The last day the bar covers; equal to `first` for a mark. */\n last: number;\n mark: boolean;\n /** 0–100, where the list names a progress column and the record has one. */\n done?: number;\n}\n\ninterface GanttRow {\n name: string;\n /** The group this row stands under, drawn once as a band over its rows; unset where the list is not grouped. */\n band?: string;\n bars: Array<GanttBar & { lane: number }>;\n /** How many lanes the row stacks its bars in, so two that overlap never cover each other. */\n lanes: number;\n}\n\n/**\n * The rows in reading order. Ungrouped, a row per bar. Grouped, a band per group in the order each first starts\n * and under it a row per name (a home's leases share its row, one after the other); a row takes its bars' first\n * lane free by their start (a bar's last day and the next one's first may not share a lane), so a row is as tall\n * as the most that overlap at once.\n */\nexport function rowsOf(bars: Array<GanttBar & { group?: string }>, grouped: boolean): GanttRow[] {\n const sorted = [...bars].sort((a, b) => a.first - b.first || a.last - b.last || a.title.localeCompare(b.title));\n if (!grouped) return sorted.map((bar) => ({ name: bar.title, bars: [{ ...bar, lane: 0 }], lanes: 1 }));\n const groups = new Map<string, Map<string, GanttRow & { ends: number[] }>>();\n for (const bar of sorted) {\n const band = bar.group ?? '';\n const rows = groups.get(band) ?? new Map<string, GanttRow & { ends: number[] }>();\n const row = rows.get(bar.title) ?? { name: bar.title, band, bars: [], lanes: 0, ends: [] };\n let lane = row.ends.findIndex((end) => end < bar.first);\n if (lane < 0) lane = row.ends.length;\n row.ends[lane] = bar.last;\n row.lanes = Math.max(row.lanes, lane + 1);\n row.bars.push({ ...bar, lane });\n rows.set(bar.title, row);\n groups.set(band, rows);\n }\n return [...groups.values()].flatMap((rows) => [...rows.values()].map(({ ends: _ends, ...row }) => row));\n}\n\n/** The ruler's lower tier: a mark at each month's first (or each Monday, for a span under ten weeks). */\nfunction ticksOf(from: number, to: number): Array<{ day: number; month: boolean; index: number }> {\n const out: Array<{ day: number; month: boolean; index: number }> = [];\n if (to - from < 70) {\n /* 1970-01-01 was a Thursday, so a Monday is a day ≡ 4 (mod 7). */\n for (let day = from + ((4 - (from % 7) + 7) % 7); day <= to; day += 7) out.push({ day, month: false, index: out.length });\n return out;\n }\n const start = new Date(from * DAY);\n for (let at = Date.UTC(start.getUTCFullYear(), start.getUTCMonth() + 1, 1); at / DAY <= to;) {\n const d = new Date(at);\n out.push({ day: at / DAY, month: true, index: d.getUTCMonth() });\n at = Date.UTC(d.getUTCFullYear(), d.getUTCMonth() + 1, 1);\n }\n return out;\n}\n\n/** The ruler's upper tier: each calendar year the span touches, from where it enters the span. */\nfunction yearsOf(from: number, to: number): Array<{ day: number; year: number }> {\n const out: Array<{ day: number; year: number }> = [];\n for (let year = new Date(from * DAY).getUTCFullYear(); Date.UTC(year, 0, 1) / DAY <= to; year++) {\n out.push({ day: Math.max(from, Date.UTC(year, 0, 1) / DAY), year });\n }\n return out;\n}\n\n/** Every how many months a label fits: one if there is room for each, else a quarter, a half year, a year. */\nfunction monthStep(width: number, months: number): number {\n if (!width || months <= 1) return 1;\n return [1, 2, 3, 6, 12].find((step) => (width / months) * step >= 36) ?? 12;\n}\n\ninterface GanttListProps {\n table: TableMeta;\n spec: AppGanttList;\n entry: TableEntry;\n interactive?: boolean;\n label?: string;\n referenceLabels?: Record<string, string>;\n /** Today, as a day number; a test holds it still. */\n today?: number;\n}\n\nexport function GanttList({ table, spec, entry, interactive = true, label, referenceLabels, today }: GanttListProps) {\n const connection = state.activeConnection ?? null;\n const columns = [...new Set([...primaryKey(table), ...listPresentationColumns(spec), ...Object.values(referenceLabels ?? {})])];\n const filter = splitQuery(entry.query).filter;\n const text = `${table.id}${filter ? ` ${filter}` : ''} sort ${spec.start} show ${columns.join(', ')}`;\n const answer = useQuery({\n queryKey: ['run', connection ?? '', 'gantt', text],\n queryFn: async () => {\n const data = (await api('/api/run', {\n q: text,\n limit: LIMIT,\n offset: 0,\n count: 'none',\n ...(connection ? ownedBy(connection) : {}),\n })) as {\n rows?: Array<Record<string, unknown>>;\n errors?: Array<{ message: string }>;\n more?: boolean;\n };\n if (data.errors?.length) throw new Error(data.errors[0].message);\n return { rows: data.rows ?? [], more: Boolean(data.more) };\n },\n });\n const rows = useMemo(() => {\n const bars: Array<GanttBar & { group?: string }> = [];\n for (const row of answer.data?.rows ?? []) {\n const first = dayOf(row[spec.start]);\n const key = keyOf(table, row) as Record<string, unknown> | null;\n if (first === null || !key) continue;\n const end = dayOf(row[spec.end]);\n const last = end === null || end < first ? first : end;\n const raw = spec.progress === undefined ? null : row[spec.progress];\n const done =\n raw === null || raw === undefined || raw === '' || !Number.isFinite(Number(raw))\n ? undefined\n : Math.min(100, Math.max(0, Number(raw)));\n const named = spec.by === undefined ? undefined : namedCell(table, spec.by, row, referenceLabels).value;\n bars.push({\n id: JSON.stringify(key),\n key,\n title: String(namedCell(table, spec.primary, row, referenceLabels).value ?? sayCopy('untitled')),\n first,\n last,\n mark: end === null,\n ...(done === undefined ? {} : { done }),\n ...(spec.by === undefined\n ? {}\n : { group: named === null || named === undefined || named === '' ? sayCopy('noGroup') : String(named) }),\n });\n }\n return rowsOf(bars, spec.by !== undefined);\n }, [answer.data, spec, table, referenceLabels]);\n const bars = rows.flatMap((row) => row.bars);\n /* A band over its rows, each group its own block so the band holds the top only while its rows are in view. */\n const groups = useMemo(() => {\n const out: Array<{ band?: string; rows: GanttRow[] }> = [];\n for (const row of rows) {\n const last = out[out.length - 1];\n if (last && last.band === row.band && row.band !== undefined) last.rows.push(row);\n else out.push({ band: row.band, rows: [row] });\n }\n return out;\n }, [rows]);\n const now = today ?? Math.floor(Date.now() / DAY);\n /* The span is every bar's with a day's margin each side; today is in it when it is near. */\n const from = Math.min(...bars.map((bar) => bar.first)) - 1;\n const to = Math.max(...bars.map((bar) => bar.last)) + 2;\n const span = Math.max(1, to - from);\n const at = (day: number) => `${(((day - from) / span) * 100).toFixed(3)}%`;\n const locale = formatLocale();\n const dayName = new Intl.DateTimeFormat(locale, { month: 'short', day: 'numeric', year: 'numeric', timeZone: 'UTC' });\n const monthName = new Intl.DateTimeFormat(locale, { month: 'short', timeZone: 'UTC' });\n const weekName = new Intl.DateTimeFormat(locale, { month: 'short', day: 'numeric', timeZone: 'UTC' });\n const said = (bar: GanttBar) =>\n bar.mark\n ? sayCopy('onDay', { title: bar.title, day: dayName.format(bar.first * DAY) })\n : sayCopy('fromTo', { title: bar.title, from: dayName.format(bar.first * DAY), to: dayName.format(bar.last * DAY) }) +\n (bar.done === undefined ? '' : sayCopy('done', { share: formatNumber(Math.round(bar.done)) }));\n\n /* The track's width, to thin the month labels to what fits; unknown (0) until measured, and then all are drawn. */\n const ruler = useRef<HTMLSpanElement>(null);\n const [width, setWidth] = useState(0);\n const measured = !!answer.data && bars.length > 0;\n useEffect(() => {\n const node = ruler.current;\n if (!node || typeof ResizeObserver === 'undefined') return;\n const watch = new ResizeObserver(() => setWidth(node.clientWidth));\n watch.observe(node);\n setWidth(node.clientWidth);\n return () => watch.disconnect();\n }, [measured]);\n const [active, setActive] = useState<string>();\n const current = bars.find((bar) => bar.id === active) ?? bars[0];\n const buttons = useRef(new Map<string, HTMLButtonElement>());\n const records: ModalRecord[] = bars.map((bar) => ({ table: table.id, key: bar.key, label: bar.title }));\n const go = (bar: GanttBar | undefined) => {\n if (!bar) return;\n setActive(bar.id);\n buttons.current.get(bar.id)?.focus();\n };\n const onKey = (event: KeyboardEvent<HTMLDivElement>) => {\n if (!current) return;\n const index = bars.indexOf(current);\n const moves: Record<string, () => void> = {\n ArrowDown: () => go(bars[index + 1]),\n ArrowRight: () => go(bars[index + 1]),\n ArrowUp: () => go(bars[index - 1]),\n ArrowLeft: () => go(bars[index - 1]),\n Home: () => go(bars[0]),\n End: () => go(bars[bars.length - 1]),\n };\n const move = moves[event.key];\n if (!move) return;\n event.preventDefault();\n move();\n };\n\n if (answer.isError) return <p className=\"gantt-note\">{(answer.error as Error).message}</p>;\n if (!answer.data) return <div className=\"gantt\" aria-busy=\"true\" />;\n if (!bars.length) return <p className=\"gantt-note\">{sayCopy('nothingHere')}</p>;\n const all = ticksOf(from, to);\n const step = all[0]?.month ? monthStep(width, all.length) : 1;\n const ticks = all.filter((tick) => !tick.month || tick.index % step === 0);\n const years = yearsOf(from, to);\n const yearName = new Intl.NumberFormat(locale, { useGrouping: false });\n return (\n <div className=\"gantt\">\n <div className=\"gantt-chart\" role=\"list\" aria-label={label ?? table.name} onKeyDown={onKey}>\n <div className=\"gantt-ruler\" aria-hidden=\"true\">\n <span className=\"gantt-name\" />\n <span className=\"gantt-track\" ref={ruler}>\n {years.map((year) => (\n <span key={year.year} className=\"gantt-year\" style={{ insetInlineStart: at(year.day) }}>\n {yearName.format(year.year)}\n </span>\n ))}\n {ticks.map((tick) => (\n <span key={tick.day} className=\"gantt-tick\" style={{ insetInlineStart: at(tick.day) }}>\n {(tick.month ? monthName : weekName).format(tick.day * DAY)}\n </span>\n ))}\n </span>\n </div>\n {groups.map((group) => (\n <div key={group.band ?? group.rows[0].bars[0].id} className=\"gantt-group\">\n {group.band !== undefined && (\n <div className=\"gantt-band\" role=\"presentation\">\n {group.band}\n </div>\n )}\n {group.rows.map((row) => (\n <div\n key={row.name + row.bars[0].id}\n className=\"gantt-row\"\n role=\"listitem\"\n style={{ '--lanes': row.lanes } as Record<string, number>}\n >\n <span className=\"gantt-name\" title={row.name}>\n {row.name}\n </span>\n <span className=\"gantt-track\">\n {ticks.map((tick) => (\n <span key={tick.day} className=\"gantt-grid\" style={{ insetInlineStart: at(tick.day) }} aria-hidden=\"true\" />\n ))}\n {now >= from && now <= to && (\n <span className=\"gantt-today\" style={{ insetInlineStart: at(now + 0.5) }} aria-hidden=\"true\" />\n )}\n {row.bars.map((bar) => (\n <button\n key={bar.id}\n ref={(element) => {\n if (element) buttons.current.set(bar.id, element);\n else buttons.current.delete(bar.id);\n }}\n type=\"button\"\n className={`gantt-bar${bar.mark ? ' is-mark' : ''}`}\n style={{\n insetInlineStart: at(bar.first),\n top: `${bar.lane * 26 + 16}px`,\n ...(bar.mark ? {} : { width: at(bar.last + 1 - bar.first + from) }),\n ...(bar.done === undefined ? {} : ({ '--done': `${bar.done}%` } as Record<string, string>)),\n }}\n tabIndex={bar === current ? 0 : -1}\n aria-label={said(bar)}\n title={said(bar)}\n disabled={!interactive}\n onFocus={() => setActive(bar.id)}\n onClick={() => void openRecord(table.id, bar.key, bar.title, 'push', { records })}\n ></button>\n ))}\n </span>\n </div>\n ))}\n </div>\n ))}\n </div>\n {answer.data.more && <p className=\"gantt-note\">{sayCopy('firstOnly', { count: formatNumber(LIMIT) })}</p>}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shared-Bw73ktBk.js","names":["sayCopy"],"sources":["../../src/client/copy/lists/components/GanttList.ts","../../src/client/components/GanttList.tsx"],"sourcesContent":["/** What GanttList says, in the lists and grid 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 untitled: 'Untitled',\n noGroup: 'None',\n nothingHere: 'Nothing to show here.',\n onDay: '{title}, on {day}',\n fromTo: '{title}, {from} to {to}',\n done: ', {share}% done',\n firstOnly: 'Showing the first {count}; narrow the list to see the rest.',\n});\n","/**\n * Records as bars across time: each from its start to its end (both days\n * counted), on a row of its own or on its group's row, against a ruler of\n * weeks or months and a line at today. The list's own question is asked once\n * for the whole span, up to LIMIT records, sorted by start, and the chart\n * says when there are more. A record with no end is a mark on its start.\n *\n * The keyboard reads it as a list (one Tab stop, the bar last visited): Up\n * and Down step between bars in reading order, Home and End to the ends, and\n * Enter opens the record. Each bar says its dates in words, so the chart is\n * readable without the picture. Dragging a bar to move its dates is not here\n * yet; the record's own form changes them.\n */\nimport './GanttList.css';\nimport { useEffect, useMemo, useRef, useState, type KeyboardEvent } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { api, keyOf, openRecord, state } from '@mistriwork/kit/client/core.js';\nimport { formatLocale, formatNumber } from '@mistriwork/kit/client/locale.js';\nimport { ownedBy } from '@mistriwork/kit/client/requestIdentity.js';\nimport { splitQuery } from '@mistriwork/kit/client/clauses.js';\nimport { primaryKey, type TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport type { AppGanttList } from '@mistriwork/engine/shared/listPresentations.js';\nimport { listPresentationColumns } from '@mistriwork/engine/shared/appListColumns.js';\nimport { namedCell } from '@mistriwork/kit/client/components/listColumn.js';\nimport type { ModalRecord } from './RecordModal.js';\nimport type { TableEntry } from '@mistriwork/kit/client/components/TableView.js';\nimport { say as sayCopy } from '../copy/lists/components/GanttList.js';\n\n/** A chart is read whole; past this it says so rather than drawing a part as if it were all. */\nconst LIMIT = 500;\nconst DAY = 86_400_000;\n\n/** A date or timestamp as its calendar day (days since 1970, UTC), or null when it is not one. */\nexport function dayOf(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null;\n const text = value instanceof Date ? value.toISOString() : String(value);\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(text);\n if (!match) return null;\n return Math.floor(Date.UTC(Number(match[1]), Number(match[2]) - 1, Number(match[3])) / DAY);\n}\n\ninterface GanttBar {\n id: string;\n key: Record<string, unknown>;\n title: string;\n first: number;\n /** The last day the bar covers; equal to `first` for a mark. */\n last: number;\n mark: boolean;\n /** 0–100, where the list names a progress column and the record has one. */\n done?: number;\n}\n\ninterface GanttRow {\n name: string;\n /** The group this row stands under, drawn once as a band over its rows; unset where the list is not grouped. */\n band?: string;\n bars: Array<GanttBar & { lane: number }>;\n /** How many lanes the row stacks its bars in, so two that overlap never cover each other. */\n lanes: number;\n}\n\n/**\n * The rows in reading order. Ungrouped, a row per bar. Grouped, a band per group in the order each first starts\n * and under it a row per name (a home's leases share its row, one after the other); a row takes its bars' first\n * lane free by their start (a bar's last day and the next one's first may not share a lane), so a row is as tall\n * as the most that overlap at once.\n */\nexport function rowsOf(bars: Array<GanttBar & { group?: string }>, grouped: boolean): GanttRow[] {\n const sorted = [...bars].sort((a, b) => a.first - b.first || a.last - b.last || a.title.localeCompare(b.title));\n if (!grouped) return sorted.map((bar) => ({ name: bar.title, bars: [{ ...bar, lane: 0 }], lanes: 1 }));\n const groups = new Map<string, Map<string, GanttRow & { ends: number[] }>>();\n for (const bar of sorted) {\n const band = bar.group ?? '';\n const rows = groups.get(band) ?? new Map<string, GanttRow & { ends: number[] }>();\n const row = rows.get(bar.title) ?? { name: bar.title, band, bars: [], lanes: 0, ends: [] };\n let lane = row.ends.findIndex((end) => end < bar.first);\n if (lane < 0) lane = row.ends.length;\n row.ends[lane] = bar.last;\n row.lanes = Math.max(row.lanes, lane + 1);\n row.bars.push({ ...bar, lane });\n rows.set(bar.title, row);\n groups.set(band, rows);\n }\n return [...groups.values()].flatMap((rows) => [...rows.values()].map(({ ends: _ends, ...row }) => row));\n}\n\n/** The ruler's lower tier: a mark at each month's first (or each Monday, for a span under ten weeks). */\nfunction ticksOf(from: number, to: number): Array<{ day: number; month: boolean; index: number }> {\n const out: Array<{ day: number; month: boolean; index: number }> = [];\n if (to - from < 70) {\n /* 1970-01-01 was a Thursday, so a Monday is a day ≡ 4 (mod 7). */\n for (let day = from + ((4 - (from % 7) + 7) % 7); day <= to; day += 7) out.push({ day, month: false, index: out.length });\n return out;\n }\n const start = new Date(from * DAY);\n for (let at = Date.UTC(start.getUTCFullYear(), start.getUTCMonth() + 1, 1); at / DAY <= to;) {\n const d = new Date(at);\n out.push({ day: at / DAY, month: true, index: d.getUTCMonth() });\n at = Date.UTC(d.getUTCFullYear(), d.getUTCMonth() + 1, 1);\n }\n return out;\n}\n\n/** The ruler's upper tier: each calendar year the span touches, from where it enters the span. */\nfunction yearsOf(from: number, to: number): Array<{ day: number; year: number }> {\n const out: Array<{ day: number; year: number }> = [];\n for (let year = new Date(from * DAY).getUTCFullYear(); Date.UTC(year, 0, 1) / DAY <= to; year++) {\n out.push({ day: Math.max(from, Date.UTC(year, 0, 1) / DAY), year });\n }\n return out;\n}\n\n/** Every how many months a label fits: one if there is room for each, else a quarter, a half year, a year. */\nfunction monthStep(width: number, months: number): number {\n if (!width || months <= 1) return 1;\n return [1, 2, 3, 6, 12].find((step) => (width / months) * step >= 36) ?? 12;\n}\n\ninterface GanttListProps {\n table: TableMeta;\n spec: AppGanttList;\n entry: TableEntry;\n interactive?: boolean;\n label?: string;\n referenceLabels?: Record<string, string>;\n /** Today, as a day number; a test holds it still. */\n today?: number;\n}\n\nexport function GanttList({ table, spec, entry, interactive = true, label, referenceLabels, today }: GanttListProps) {\n const connection = state.activeConnection ?? null;\n const columns = [...new Set([...primaryKey(table), ...listPresentationColumns(spec), ...Object.values(referenceLabels ?? {})])];\n const filter = splitQuery(entry.query).filter;\n const text = `${table.id}${filter ? ` ${filter}` : ''} sort ${spec.start} show ${columns.join(', ')}`;\n const answer = useQuery({\n queryKey: ['run', connection ?? '', 'gantt', text],\n queryFn: async () => {\n const data = (await api('/api/run', {\n q: text,\n limit: LIMIT,\n offset: 0,\n count: 'none',\n ...(connection ? ownedBy(connection) : {}),\n })) as {\n rows?: Array<Record<string, unknown>>;\n errors?: Array<{ message: string }>;\n more?: boolean;\n };\n if (data.errors?.length) throw new Error(data.errors[0].message);\n return { rows: data.rows ?? [], more: Boolean(data.more) };\n },\n });\n const rows = useMemo(() => {\n const bars: Array<GanttBar & { group?: string }> = [];\n for (const row of answer.data?.rows ?? []) {\n const first = dayOf(row[spec.start]);\n const key = keyOf(table, row) as Record<string, unknown> | null;\n if (first === null || !key) continue;\n const end = dayOf(row[spec.end]);\n const last = end === null || end < first ? first : end;\n const raw = spec.progress === undefined ? null : row[spec.progress];\n const done =\n raw === null || raw === undefined || raw === '' || !Number.isFinite(Number(raw))\n ? undefined\n : Math.min(100, Math.max(0, Number(raw)));\n const named = spec.by === undefined ? undefined : namedCell(table, spec.by, row, referenceLabels).value;\n bars.push({\n id: JSON.stringify(key),\n key,\n title: String(namedCell(table, spec.primary, row, referenceLabels).value ?? sayCopy('untitled')),\n first,\n last,\n mark: end === null,\n ...(done === undefined ? {} : { done }),\n ...(spec.by === undefined\n ? {}\n : { group: named === null || named === undefined || named === '' ? sayCopy('noGroup') : String(named) }),\n });\n }\n return rowsOf(bars, spec.by !== undefined);\n }, [answer.data, spec, table, referenceLabels]);\n const bars = rows.flatMap((row) => row.bars);\n /* A band over its rows, each group its own block so the band holds the top only while its rows are in view. */\n const groups = useMemo(() => {\n const out: Array<{ band?: string; rows: GanttRow[] }> = [];\n for (const row of rows) {\n const last = out[out.length - 1];\n if (last && last.band === row.band && row.band !== undefined) last.rows.push(row);\n else out.push({ band: row.band, rows: [row] });\n }\n return out;\n }, [rows]);\n const now = today ?? Math.floor(Date.now() / DAY);\n /* The span is every bar's with a day's margin each side; today is in it when it is near. */\n const from = Math.min(...bars.map((bar) => bar.first)) - 1;\n const to = Math.max(...bars.map((bar) => bar.last)) + 2;\n const span = Math.max(1, to - from);\n const at = (day: number) => `${(((day - from) / span) * 100).toFixed(3)}%`;\n const locale = formatLocale();\n const dayName = new Intl.DateTimeFormat(locale, { month: 'short', day: 'numeric', year: 'numeric', timeZone: 'UTC' });\n const monthName = new Intl.DateTimeFormat(locale, { month: 'short', timeZone: 'UTC' });\n const weekName = new Intl.DateTimeFormat(locale, { month: 'short', day: 'numeric', timeZone: 'UTC' });\n const said = (bar: GanttBar) =>\n bar.mark\n ? sayCopy('onDay', { title: bar.title, day: dayName.format(bar.first * DAY) })\n : sayCopy('fromTo', { title: bar.title, from: dayName.format(bar.first * DAY), to: dayName.format(bar.last * DAY) }) +\n (bar.done === undefined ? '' : sayCopy('done', { share: formatNumber(Math.round(bar.done)) }));\n\n /* The track's width, to thin the month labels to what fits; unknown (0) until measured, and then all are drawn. */\n const ruler = useRef<HTMLSpanElement>(null);\n const [width, setWidth] = useState(0);\n const measured = !!answer.data && bars.length > 0;\n useEffect(() => {\n const node = ruler.current;\n if (!node || typeof ResizeObserver === 'undefined') return;\n const watch = new ResizeObserver(() => setWidth(node.clientWidth));\n watch.observe(node);\n setWidth(node.clientWidth);\n return () => watch.disconnect();\n }, [measured]);\n const [active, setActive] = useState<string>();\n const current = bars.find((bar) => bar.id === active) ?? bars[0];\n const buttons = useRef(new Map<string, HTMLButtonElement>());\n const records: ModalRecord[] = bars.map((bar) => ({ table: table.id, key: bar.key, label: bar.title }));\n const go = (bar: GanttBar | undefined) => {\n if (!bar) return;\n setActive(bar.id);\n buttons.current.get(bar.id)?.focus();\n };\n const onKey = (event: KeyboardEvent<HTMLDivElement>) => {\n if (!current) return;\n const index = bars.indexOf(current);\n const moves: Record<string, () => void> = {\n ArrowDown: () => go(bars[index + 1]),\n ArrowRight: () => go(bars[index + 1]),\n ArrowUp: () => go(bars[index - 1]),\n ArrowLeft: () => go(bars[index - 1]),\n Home: () => go(bars[0]),\n End: () => go(bars[bars.length - 1]),\n };\n const move = moves[event.key];\n if (!move) return;\n event.preventDefault();\n move();\n };\n\n if (answer.isError) return <p className=\"gantt-note\">{(answer.error as Error).message}</p>;\n if (!answer.data) return <div className=\"gantt\" aria-busy=\"true\" />;\n if (!bars.length) return <p className=\"gantt-note\">{sayCopy('nothingHere')}</p>;\n const all = ticksOf(from, to);\n const step = all[0]?.month ? monthStep(width, all.length) : 1;\n const ticks = all.filter((tick) => !tick.month || tick.index % step === 0);\n const years = yearsOf(from, to);\n const yearName = new Intl.NumberFormat(locale, { useGrouping: false });\n return (\n <div className=\"gantt\">\n <div className=\"gantt-chart\" role=\"list\" aria-label={label ?? table.name} onKeyDown={onKey}>\n <div className=\"gantt-ruler\" aria-hidden=\"true\">\n <span className=\"gantt-name\" />\n <span className=\"gantt-track\" ref={ruler}>\n {years.map((year) => (\n <span key={year.year} className=\"gantt-year\" style={{ insetInlineStart: at(year.day) }}>\n {yearName.format(year.year)}\n </span>\n ))}\n {ticks.map((tick) => (\n <span key={tick.day} className=\"gantt-tick\" style={{ insetInlineStart: at(tick.day) }}>\n {(tick.month ? monthName : weekName).format(tick.day * DAY)}\n </span>\n ))}\n </span>\n </div>\n {groups.map((group) => (\n <div key={group.band ?? group.rows[0].bars[0].id} className=\"gantt-group\">\n {group.band !== undefined && (\n <div className=\"gantt-band\" role=\"presentation\">\n {group.band}\n </div>\n )}\n {group.rows.map((row) => (\n <div\n key={row.name + row.bars[0].id}\n className=\"gantt-row\"\n role=\"listitem\"\n style={{ '--lanes': row.lanes } as Record<string, number>}\n >\n <span className=\"gantt-name\" title={row.name}>\n {row.name}\n </span>\n <span className=\"gantt-track\">\n {ticks.map((tick) => (\n <span key={tick.day} className=\"gantt-grid\" style={{ insetInlineStart: at(tick.day) }} aria-hidden=\"true\" />\n ))}\n {now >= from && now <= to && (\n <span className=\"gantt-today\" style={{ insetInlineStart: at(now + 0.5) }} aria-hidden=\"true\" />\n )}\n {row.bars.map((bar) => (\n <button\n key={bar.id}\n ref={(element) => {\n if (element) buttons.current.set(bar.id, element);\n else buttons.current.delete(bar.id);\n }}\n type=\"button\"\n className={`gantt-bar${bar.mark ? ' is-mark' : ''}`}\n style={{\n insetInlineStart: at(bar.first),\n top: `${bar.lane * 26 + 16}px`,\n ...(bar.mark ? {} : { width: at(bar.last + 1 - bar.first + from) }),\n ...(bar.done === undefined ? {} : ({ '--done': `${bar.done}%` } as Record<string, string>)),\n }}\n tabIndex={bar === current ? 0 : -1}\n aria-label={said(bar)}\n title={said(bar)}\n disabled={!interactive}\n onFocus={() => setActive(bar.id)}\n onClick={() => void openRecord(table.id, bar.key, bar.title, 'push', { records })}\n ></button>\n ))}\n </span>\n </div>\n ))}\n </div>\n ))}\n </div>\n {answer.data.more && <p className=\"gantt-note\">{sayCopy('firstOnly', { count: formatNumber(LIMIT) })}</p>}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { D as subscribeSessionIdentity, E as sessionIdentity } from "./shared-poc11xxo.js";
|
|
2
2
|
import { gt as defineMessages, ut as humanName } from "./shared-DJZjSi3J.js";
|
|
3
|
-
import { a as canInsert, d as draftSchemaKey, o as formProps } from "./shared-
|
|
4
|
-
import { H as whenConnectionChanges, L as state, R as subscribeWalk, V as walkVersion, r as allowMutationExit } from "./shared-
|
|
5
|
-
import { a as useRecordClose, r as NewRecordForm, t as DiscardNewRecord } from "./shared-
|
|
3
|
+
import { a as canInsert, d as draftSchemaKey, o as formProps } from "./shared-BHsjawAG.js";
|
|
4
|
+
import { H as whenConnectionChanges, L as state, R as subscribeWalk, V as walkVersion, r as allowMutationExit } from "./shared-BoLbc2WD.js";
|
|
5
|
+
import { a as useRecordClose, r as NewRecordForm, t as DiscardNewRecord } from "./shared-C4wSfz6k.js";
|
|
6
6
|
import { useEffect, useLayoutEffect, useRef, useState, useSyncExternalStore } from "react";
|
|
7
7
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
8
8
|
// packages/kit/src/client/copy/forms/components/QuickAdd.ts
|
|
@@ -70,4 +70,4 @@ function InlineForm(props) {
|
|
|
70
70
|
}
|
|
71
71
|
export { QuickAdd };
|
|
72
72
|
|
|
73
|
-
//# sourceMappingURL=shared-
|
|
73
|
+
//# sourceMappingURL=shared-C1B0GH0e.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-
|
|
1
|
+
{"version":3,"file":"shared-C1B0GH0e.js","names":["_Fragment"],"sources":["../../../kit/src/client/copy/forms/components/QuickAdd.ts","../../../kit/src/client/components/QuickAdd.tsx"],"sourcesContent":["/** What QuickAdd says, in the forms room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n quickAdd: '+ Add {label}',\n});\n","import { useEffect, useLayoutEffect, useRef, useState, useSyncExternalStore } from 'react';\nimport type { TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport { humanName } from '@mistriwork/engine/shared/model.js';\nimport { allowMutationExit, state, subscribeWalk, walkVersion, whenConnectionChanges } from '../core.js';\nimport { canInsert, formProps } from '../insert.js';\nimport { draftSchemaKey } from '../recordDrafts.js';\nimport { sessionIdentity, subscribeSessionIdentity } from '../sessionIdentity.js';\nimport { DiscardNewRecord, NewRecordForm, useRecordClose, type FormCuration, type NewRecordProps } from './NewRecord.js';\nimport { say } from '../copy/forms/components/QuickAdd.js';\n\ninterface QuickAddProps {\n table: TableMeta;\n form?: FormCuration;\n label?: string;\n onAdded: () => void;\n}\n\n/** A list-owned frame over the same form and request lifetime as New. */\nexport function QuickAdd(props: QuickAddProps) {\n const identity = useSyncExternalStore(subscribeSessionIdentity, sessionIdentity, sessionIdentity);\n useSyncExternalStore(subscribeWalk, walkVersion, walkVersion);\n const [connectionGeneration, setConnectionGeneration] = useState(0);\n useEffect(() => {\n const stop = whenConnectionChanges(() => setConnectionGeneration((value) => value + 1));\n return () => {\n stop();\n };\n }, []);\n if (identity.mode === 'locked' || !canInsert(props.table, true)) return null;\n const owner = JSON.stringify([\n identity.epoch,\n state.activeConnection,\n connectionGeneration,\n location.href,\n props.table.id,\n draftSchemaKey(props.table),\n props.form,\n ]);\n return <QuickAddHost key={owner} {...props} />;\n}\n\nfunction QuickAddHost({ table, form, label, onAdded }: QuickAddProps) {\n const host = useRef<HTMLDivElement>(null);\n const trigger = useRef<HTMLButtonElement>(null);\n const [opened, setOpened] = useState<NewRecordProps | null>(null);\n const wasOpen = useRef(false);\n useLayoutEffect(() => {\n if (!opened && wasOpen.current) trigger.current?.focus();\n wasOpen.current = opened !== null;\n }, [opened]);\n return (\n <div className=\"quick-add\" ref={host}>\n <button\n ref={trigger}\n type=\"button\"\n className=\"ghost quick-add-trigger\"\n hidden={opened !== null}\n aria-expanded={opened !== null}\n onClick={() => {\n if (opened || !host.current || !canInsert(table, true) || !allowMutationExit()) return;\n setOpened(\n formProps(\n table,\n form,\n host.current,\n () => setOpened(null),\n () => onAdded(),\n { app: true },\n ),\n );\n }}\n >\n {say('quickAdd', { label: label ?? humanName(table.name).toLowerCase() })}\n </button>\n {opened && <InlineForm {...opened} />}\n </div>\n );\n}\n\nfunction InlineForm(props: NewRecordProps) {\n const dismissal = useRecordClose(props.onCancel, props.canClose);\n return (\n <>\n <NewRecordForm\n {...props}\n compact\n onCancel={dismissal.close}\n onPendingChange={dismissal.change}\n onDiscardChange={dismissal.discardChange}\n />\n {dismissal.discard && <DiscardNewRecord onDone={dismissal.resolve} />}\n </>\n );\n}\n"],"mappings":";;;;;;;;;AAGA,IAAa,MAAM,eAAe,EAChC,UAAU,gBACZ,CAAC;;;ACaD,SAAgB,SAAS,OAAsB;CAC7C,MAAM,WAAW,qBAAqB,0BAA0B,iBAAiB,eAAe;CAChG,qBAAqB,eAAe,aAAa,WAAW;CAC5D,MAAM,CAAC,sBAAsB,2BAA2B,SAAS,CAAC;CAClE,gBAAgB;EACd,MAAM,OAAO,4BAA4B,yBAAyB,UAAU,QAAQ,CAAC,CAAC;EACtF,aAAa;GACX,KAAK;EACP;CACF,GAAG,CAAC,CAAC;CACL,IAAI,SAAS,SAAS,YAAY,CAAC,UAAU,MAAM,OAAO,IAAI,GAAG,OAAO;CACxE,MAAM,QAAQ,KAAK,UAAU;EAC3B,SAAS;EACT,MAAM;EACN;EACA,SAAS;EACT,MAAM,MAAM;EACZ,eAAe,MAAM,KAAK;EAC1B,MAAM;CACR,CAAC;CACD,OAAO,oBAAC,cAAD,EAA0B,GAAI,MAAQ,GAAnB,KAAmB;AAC/C;AAEA,SAAS,aAAa,EAAE,OAAO,MAAM,OAAO,WAA0B;CACpE,MAAM,OAAO,OAAuB,IAAI;CACxC,MAAM,UAAU,OAA0B,IAAI;CAC9C,MAAM,CAAC,QAAQ,aAAa,SAAgC,IAAI;CAChE,MAAM,UAAU,OAAO,KAAK;CAC5B,sBAAsB;EACpB,IAAI,CAAC,UAAU,QAAQ,SAAS,QAAQ,SAAS,MAAM;EACvD,QAAQ,UAAU,WAAW;CAC/B,GAAG,CAAC,MAAM,CAAC;CACX,OACE,qBAAC,OAAD;EAAK,WAAU;EAAY,KAAK;EAAhC,UAAA,CACE,oBAAC,UAAD;GACE,KAAK;GACL,MAAK;GACL,WAAU;GACV,QAAQ,WAAW;GACnB,iBAAe,WAAW;GAC1B,eAAe;IACb,IAAI,UAAU,CAAC,KAAK,WAAW,CAAC,UAAU,OAAO,IAAI,KAAK,CAAC,kBAAkB,GAAG;IAChF,UACE,UACE,OACA,MACA,KAAK,eACC,UAAU,IAAI,SACd,QAAQ,GACd,EAAE,KAAK,KAAK,CACd,CACF;GACF;GAEC,UAAA,IAAI,YAAY,EAAE,OAAO,SAAS,UAAU,MAAM,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;EAClE,CAAA,GACP,UAAU,oBAAC,YAAD,EAAY,GAAI,OAAS,CAAA,CACjC;;AAET;AAEA,SAAS,WAAW,OAAuB;CACzC,MAAM,YAAY,eAAe,MAAM,UAAU,MAAM,QAAQ;CAC/D,OACE,qBAAAA,YAAA,EAAA,UAAA,CACE,oBAAC,eAAD;EACE,GAAI;EACJ,SAAA;EACA,UAAU,UAAU;EACpB,iBAAiB,UAAU;EAC3B,iBAAiB,UAAU;CAC5B,CAAA,GACA,UAAU,WAAW,oBAAC,kBAAD,EAAkB,QAAQ,UAAU,QAAU,CAAA,CACpE,EAAA,CAAA;AAEN"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { I as quoteValue, N as andQuery, it as useQuery } from "./shared-poc11xxo.js";
|
|
2
2
|
import { yn as keepPreviousData } from "./shared-DJZjSi3J.js";
|
|
3
|
-
import { z as Typeahead } from "./shared-
|
|
4
|
-
import { L as state } from "./shared-
|
|
5
|
-
import { A as batchedBreakdown } from "./shared-
|
|
3
|
+
import { z as Typeahead } from "./shared-BHsjawAG.js";
|
|
4
|
+
import { L as state } from "./shared-BoLbc2WD.js";
|
|
5
|
+
import { A as batchedBreakdown } from "./shared-XcSKDp6N.js";
|
|
6
6
|
import { useEffect, useRef, useState } from "react";
|
|
7
7
|
import { jsx } from "react/jsx-runtime";
|
|
8
8
|
/** The breakdown one column's suggestions are read by. */
|
|
@@ -128,4 +128,4 @@ function SuggestBox({ table, columns, standing = "", text, onText, onPick, input
|
|
|
128
128
|
}
|
|
129
129
|
export { SuggestBox };
|
|
130
130
|
|
|
131
|
-
//# sourceMappingURL=shared-
|
|
131
|
+
//# sourceMappingURL=shared-C2FsyYr7.js.map
|