@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
|
@@ -35,7 +35,7 @@ See it in the sample (`examples/apps/lintel/resources.ts:19`) (other keys left o
|
|
|
35
35
|
|
|
36
36
|
- Declare every table a view, page, label path or rollup reads; `{}` is enough, because a declared resource reads by default.
|
|
37
37
|
- Use `hidden` for a column no one may ever receive (a password hash, a cost); use a role's `fields` instead when some signed-in readers may see it ([roles and field access](/docs/roles/)).
|
|
38
|
-
- Use the standalone [database browser](
|
|
38
|
+
- Use the standalone [database browser](https://tablewalk.dev) instead for tables nobody curates: raw SQL, the schema browser and the connection manager are its tools, never an App's.
|
|
39
39
|
|
|
40
40
|
## Options
|
|
41
41
|
|
|
@@ -24,7 +24,6 @@ npx @mistriwork/mistri --config ./mistri.json --app ./build/my-app # served wit
|
|
|
24
24
|
|
|
25
25
|
- Use a build for production: the start-time work is done once, in CI, and a broken App never reaches a server.
|
|
26
26
|
- Run the App from its source directory instead while you build it: a save reloads it, and the build is optional.
|
|
27
|
-
- The database browser has no build step at all: `npx tablewalk <db>` is its whole deployment.
|
|
28
27
|
|
|
29
28
|
## Options
|
|
30
29
|
|
package/dist/docs/cli.md
CHANGED
|
@@ -9,7 +9,7 @@ Every mistri command and flag — the App framework's — laid out from the help
|
|
|
9
9
|
prints: what each does, and where its section is. `npx mistri --help all`
|
|
10
10
|
prints the same text, `npx mistri --help` the commands and common options
|
|
11
11
|
on one screen, and `npx mistri <command> --help` one command's.
|
|
12
|
-
Browsing a database with no App is the database browser's
|
|
12
|
+
Browsing a database with no App is the [database browser](https://tablewalk.dev)'s, which has its own.
|
|
13
13
|
|
|
14
14
|
The first line of the help says it: *mistri — the App framework: a few lines of TypeScript, a complete App*
|
|
15
15
|
|
package/dist/docs/glossary.md
CHANGED
|
@@ -8,16 +8,16 @@ The words this documentation uses, one line each, with the page that explains
|
|
|
8
8
|
each one.
|
|
9
9
|
|
|
10
10
|
- **[mistri](/docs/getting-started/)**: the App framework, and the `npx @mistriwork/mistri` command that serves, checks and builds an App.
|
|
11
|
-
- **[tablewalk](
|
|
11
|
+
- **[tablewalk](https://tablewalk.dev)**: the database browser, a product of its own in its own repository; it serves no App.
|
|
12
12
|
- **[App](/docs/quickstart-app/)**: a database's workspace, written in the TypeScript DSL and run from its source directory.
|
|
13
|
-
- **[Workbench](
|
|
13
|
+
- **[Workbench](https://tablewalk.dev)**: tablewalk's tools for one database (rows, schema, diagram); an App never serves it.
|
|
14
14
|
- **[Resource](/docs/access-model/)**: a table an App serves, with its access, display and form rules.
|
|
15
15
|
- **[View](/docs/dsl-views/)**: anything a visitor opens by address: a list, a dashboard, a landing, a form or a room.
|
|
16
16
|
- **[Page](/docs/pages/)**: a record page: the sections that show one record.
|
|
17
17
|
- **[Section](/docs/dsl-pages/)**: one block of a page or dashboard.
|
|
18
18
|
- **[Feature](/docs/dsl-features/)**: a bundle of resources, views, pages and grants an App merges in as one unit.
|
|
19
19
|
- **[Look](/docs/looks/)**: a built-in visual theme for an App.
|
|
20
|
-
- **[Walk](
|
|
20
|
+
- **[Walk](https://tablewalk.dev)**: following a link from one record or table to the next; the path taken.
|
|
21
21
|
- **[Source](/docs/sources/)**: a connection an App reads, a database or an HTTP service.
|
|
22
22
|
- **[Role](/docs/roles/)**: a named set of grants a signed-in account holds.
|
|
23
23
|
- **[Grant](/docs/roles/)**: what a role may read, write or run.
|
package/dist/docs/query.md
CHANGED
|
@@ -10,27 +10,17 @@ count, in one line the address keeps.
|
|
|
10
10
|
invoice total >= 500 sort total desc
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
`
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
## What you'll see
|
|
19
|
-
|
|
20
|
-
- Only the matching rows, with a count that stops at 10,000 and says so.
|
|
21
|
-
- The line written into the address (`/demo/invoice%20total%20%3E%3D%20500…`),
|
|
22
|
-
so a copied link reruns it.
|
|
23
|
-
- **SQL** beside the result shows the statement it compiled to, with every
|
|
24
|
-
value bound as a parameter.
|
|
13
|
+
An App's list tabs, filters, `when` conditions and typed query strings are
|
|
14
|
+
written in it (`mistri check` reads every one), and so is a list's address
|
|
15
|
+
when its parameters cannot say a search. The examples here are over a small
|
|
16
|
+
invoicing schema: customers, invoices and their lines.
|
|
25
17
|
|
|
26
18
|
## When to use it
|
|
27
19
|
|
|
28
|
-
- Use
|
|
29
|
-
|
|
30
|
-
- Use
|
|
31
|
-
|
|
32
|
-
- Use raw **SQL** only for what the language cannot say (window functions,
|
|
33
|
-
unions); it shows the same result grid but checks nothing for you.
|
|
20
|
+
- Use it when you know the condition, not the record: overdue, over a limit,
|
|
21
|
+
missing an email.
|
|
22
|
+
- Use raw SQL only for what the language cannot say (window functions,
|
|
23
|
+
unions); it checks nothing for you.
|
|
34
24
|
|
|
35
25
|
## Conditions
|
|
36
26
|
|
|
@@ -119,7 +109,5 @@ names a column of the answer (`billed`), not a path.
|
|
|
119
109
|
|
|
120
110
|
## Related
|
|
121
111
|
|
|
122
|
-
- [tablewalk, the database browser](
|
|
123
|
-
- [MCP for coding agents](/docs/mcp/): `query` and `breakdown` take these lines verbatim.
|
|
124
|
-
- [Keyboard](/docs/keyboard/): `/` focuses the bar; `⌘/` opens it as a panel.
|
|
112
|
+
- [tablewalk, the database browser](https://tablewalk.dev): its query bar and its MCP tools take these lines verbatim.
|
|
125
113
|
- [Lists](/docs/lists/): an App's tabs and filters are written in this language.
|
package/dist/docs/status.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Status & roadmap
|
|
3
|
-
description: The 1.0.0-rc.
|
|
3
|
+
description: The 1.0.0-rc.13 scope, stable and preview features, current limitations and planned work.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
The scope of this release, stable and preview features, current limitations and planned work.
|
|
@@ -10,7 +10,7 @@ npx @mistriwork/mistri check --app .
|
|
|
10
10
|
# preview: This App uses Preview features (…). They work as documented and may change in any 1.x release.
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
This site describes **mistri 1.0.0-rc.
|
|
13
|
+
This site describes **mistri 1.0.0-rc.13**, a release candidate. Since rc.2, the first release under the mistri name,
|
|
14
14
|
the App framework is split out of tablewalk, which stays the standalone database browser. A save is a fixed number of
|
|
15
15
|
database round trips, the runtime forgets what it wrote about an App after the App's own retention windows, and on
|
|
16
16
|
PostgreSQL the runtime lives in one schema named `mistri`. There is no upgrade from a tablewalk 0.9 App database.
|
|
@@ -112,7 +112,7 @@ stable.
|
|
|
112
112
|
| Package | What it is | Status |
|
|
113
113
|
| --- | --- | --- |
|
|
114
114
|
| `mistri` | The App framework and its command (`npx @mistriwork/mistri`) | Stable |
|
|
115
|
-
| `tablewalk` | The [database browser](
|
|
115
|
+
| `tablewalk` | The [database browser](https://tablewalk.dev) and its MCP server (`npx tablewalk`), released from [its own repository](https://github.com/rbaljinder/tablewalk) | Stable |
|
|
116
116
|
| `@mistriwork/ui` | The React primitives both are drawn with, usable [on their own](/docs/mistri-ui/) | Preview |
|
|
117
117
|
| `@mistriwork/cloudflare` and `mistri deploy` | The [Cloudflare Containers roll](/docs/build-and-deploy/#deploy-to-cloudflare): one target, proven on one deployment so far | Preview |
|
|
118
118
|
| `@mistriwork/engine`, `@mistriwork/kit` | The engine and the shared client both install; internal, with no promise to an App's author | Internal |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LayoutBuilder-Cbxa_wve.js","names":["say","say","_Fragment","defineMessages","state","tableAtPrefix","findTable","promptFor","Fragment$1","say$1","FieldArranger","n","list","useRef","dragging","setDragging","useState","sending","setSending","focusAt","setFocusAt","chosen","move","to","from","next","item","onChange","remove","at","i","handOver","other","name","onSend","sendTo","others","rest","all","heading","columns","e","label","typeOf","k","say","childOf","fk","f","section","LayoutBuilder","bump","applied","onApplied","preview","onPreview","canEdit","index","delta","draft","saving","hasRecovery","table","recoverySourceChanged","onRecover","recoveryStatus","error","onReset","onCancel","onSave","SectionCard","isList","child","rename","onMove","count","ListChoices","FieldChoices","prefix","source","qualify","types","c","s","path"],"sources":["../../../../../kit/src/client/copy/record/components/FieldArranger.ts","../../../../../kit/src/client/components/FieldArranger.tsx","../../../../../kit/src/client/copy/record/components/LayoutBuilder.ts","../../../../../kit/src/client/components/LayoutBuilder.tsx"],"sourcesContent":["/** What FieldArranger 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 fields: 'Fields',\n ofDragToArrange: '{chosenCount} of {allCount} · drag to arrange',\n everyFieldInTheTables: 'Every field, in the table’s own order',\n none: 'None',\n position: '{name} — position {i} of {chosenCount}',\n moveThisFieldToAnother: 'Move this field to another group',\n moveToAnotherGroup: 'Move {name} to another group',\n takeThisFieldOff: 'Take this field off the {noun}',\n remove: 'Remove {name}',\n noFieldsInThisGroup: 'No fields in this group yet.',\n everyField: 'Every field is on the {noun}',\n addToThisGroup: 'Add {name} to this group',\n add: 'Add {name}',\n});\n","/**\n * Arranging a group of fields: which ones, and in what order. Drag to\n * reorder, Alt+arrows for the keyboard, × to take one off, a pool of the\n * rest to add from, and — when there are other groups — a way to send a\n * field to one of them. Controlled: the parent owns the list and hears\n * every change. The vanilla twin in `arrange.js` serves the page builder\n * until that room crosses over.\n */\nimport { useEffect, useRef, useState } from 'react';\nimport { say } from '../copy/record/components/FieldArranger.js';\n\ninterface OtherGroup {\n title: string;\n receive: (name: string) => void;\n}\ninterface FieldArrangerProps {\n all: string[];\n chosen: string[];\n columns?: number;\n /** What a field is taken off — \"page\", \"layout\". */\n noun?: string;\n /** The panel's own label, or null where whatever it sits in already says what these are. */\n heading?: string | null;\n label?: (name: string) => string;\n typeOf?: (name: string) => string;\n onChange: (next: string[]) => void;\n /** Identity of this group, for cross-group drags. */\n owner?: unknown;\n others?: OtherGroup[];\n /** Redraw everything after a hand-over: two groups change and the other one may be open. */\n onSend?: () => void;\n}\n\n/** The field being dragged between groups, or null. */\nlet carried: { name: string; owner: unknown; take: () => void } | null = null;\nexport const carriedField = () => carried;\n\nexport function FieldArranger({\n all,\n chosen,\n columns = 1,\n noun = 'layout',\n heading = say('fields'),\n label = (n) => n,\n typeOf = () => '',\n onChange,\n owner,\n others = [],\n onSend,\n}: FieldArrangerProps) {\n const list = useRef<HTMLDivElement>(null);\n const [dragging, setDragging] = useState<number | null>(null);\n const [sending, setSending] = useState<number | null>(null);\n const [focusAt, setFocusAt] = useState(-1);\n useEffect(() => {\n if (focusAt < 0) return;\n (list.current?.children[focusAt] as HTMLElement | undefined)?.focus();\n setFocusAt(-1);\n }, [focusAt, chosen]);\n\n const move = (from: number, to: number) => {\n if (to < 0 || to >= chosen.length || from === to) return;\n const next = [...chosen];\n const [item] = next.splice(from, 1);\n next.splice(to, 0, item);\n onChange(next);\n setFocusAt(to);\n };\n const remove = (i: number) => onChange(chosen.filter((_, at) => at !== i));\n const handOver = (name: string, i: number, other: OtherGroup) => {\n onChange(chosen.filter((_, at) => at !== i));\n other.receive(name);\n setSending(null);\n onSend?.();\n };\n const sendTo = (name: string, i: number) => {\n if (others.length === 1) {\n handOver(name, i, others[0]);\n return;\n }\n /* More than one candidate, so it is a choice — made in the row rather than in a dialog, which would cover the thing being arranged. */\n setSending(i);\n };\n const rest = all.filter((n) => !chosen.includes(n));\n return (\n <div className=\"pb-panel\">\n <div className=\"pb-panel-head\">\n {heading ? <span className=\"pb-label\">{heading}</span> : null}\n <span className=\"pb-field-count\">{say('ofDragToArrange', { chosenCount: chosen.length, allCount: all.length })}</span>\n <span className=\"pb-spacer\" />\n <button type=\"button\" className=\"ghost\" title={say('everyFieldInTheTables')} onClick={() => onChange([...all])}>\n {say('common.all')}\n </button>\n <button type=\"button\" className=\"ghost\" onClick={() => onChange([])}>\n {say('none')}\n </button>\n </div>\n <div ref={list} className=\"pb-arrange\" style={{ gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }}>\n {chosen.length ? (\n chosen.map((name, i) => (\n <div\n key={name}\n className={`pb-arrange-row${dragging === i ? ' dragging' : ''}`}\n draggable\n tabIndex={0}\n role=\"listitem\"\n aria-label={say('position', { name, i: i + 1, chosenCount: chosen.length })}\n onDragStart={(e) => {\n setDragging(i);\n /* Also offered to every other group's row: reordering inside this list and carrying to another group are the same grip. */\n carried = { name, owner, take: () => onChange(chosen.filter((n) => n !== name)) };\n e.dataTransfer.effectAllowed = 'move';\n /* Firefox will not start a drag without something on the transfer; the payload is never read. */\n e.dataTransfer.setData('text/plain', name);\n }}\n onDragEnd={() => {\n setDragging(null);\n carried = null;\n }}\n onDragOver={(e) => {\n if (dragging === null || dragging === i) return;\n e.preventDefault();\n const next = [...chosen];\n const [item] = next.splice(dragging, 1);\n next.splice(i, 0, item);\n setDragging(i);\n onChange(next);\n }}\n onDrop={(e) => e.preventDefault()}\n onKeyDown={(e) => {\n if (!e.altKey) return;\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n move(i, i - 1);\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n move(i, i + 1);\n }\n }}\n >\n <span className=\"pb-grip\" aria-hidden=\"true\">\n ∷\n </span>\n <span className=\"pb-field-name\" title={name}>\n {label(name)}\n </span>\n <span className=\"pb-field-type\">{typeOf(name)}</span>\n {others.length ? (\n <button\n type=\"button\"\n className=\"ghost pb-send\"\n title={say('moveThisFieldToAnother')}\n aria-label={say('moveToAnotherGroup', { name })}\n onClick={() => sendTo(name, i)}\n >\n →\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"ghost pb-remove\"\n title={say('takeThisFieldOff', { noun })}\n aria-label={say('remove', { name })}\n onClick={() => remove(i)}\n >\n ×\n </button>\n {sending === i ? (\n <div className=\"pb-send-menu\">\n {others.map((other, k) => (\n <button key={other.title} type=\"button\" className=\"ghost\" autoFocus={k === 0} onClick={() => handOver(name, i, other)}>\n {other.title}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n ))\n ) : (\n <p className=\"note\">{say('noFieldsInThisGroup')}</p>\n )}\n </div>\n <div className=\"pb-pool\">\n <span className=\"pb-label\">{rest.length ? say('common.add') : say('everyField', { noun })}</span>\n {rest.map((name) => (\n /* Named for what pressing it does: the visible text is the field's own name, which reads as a label to anyone hearing the page one element at a time. */\n <button\n key={name}\n type=\"button\"\n className=\"ghost pb-add-field\"\n title={say('addToThisGroup', { name })}\n aria-label={say('add', { name })}\n onClick={() => onChange([...chosen, name])}\n >\n {label(name)}\n </button>\n ))}\n </div>\n </div>\n );\n}\n","/** What LayoutBuilder 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 fields: 'Fields',\n discardDraft: 'Discard draft',\n recordLayout: 'Record layout',\n layoutName: 'Layout name',\n defaultLayout: 'Default layout',\n anUnsavedDraftIsAvailable: 'An unsaved draft is available. The saved layout has changed since it was started.',\n anUnsavedLayoutDraft: 'An unsaved layout draft is available.',\n restoreDraft: 'Restore draft',\n anotherEditorChangedTheRecovery: 'Another editor changed the recovery copy. This draft is kept in this tab only.',\n browserRecoveryIsUnavailable: 'Browser recovery is unavailable. Keep this tab open until the layout is saved.',\n resetToDefault: 'Reset to default',\n saveLayout: 'Save layout',\n renameSection: 'Rename section',\n heading: 'Heading',\n tableNamed: 'table · {table}',\n thatReferenceIsNoLonger: 'That reference is no longer in the schema.',\n thatRelationshipIsNoLonger: 'That relationship is no longer in the schema.',\n rowsOnThePage: 'Rows on the page',\n for: 'for {name}',\n block: 'block {i}',\n fieldsKind: 'fields',\n});\n","/**\n * The record layout editor: the sections of a record, each on or off,\n * reordered, renamed, and its fields arranged — with the record beside it\n * updating as you change it. The draft is one mutable object the record\n * view also reads (`template.js` holds it), so a change here is a mutation\n * and a redraw, not a copy.\n */\nimport { useState } from 'react';\nimport { findTable, state, tableAtPrefix } from '../core.js';\nimport { promptFor } from '../prompt.js';\nimport { DEFAULT_LIST_LIMIT } from '@mistriwork/engine/shared/recordview.js';\nimport type { TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport { FieldArranger } from './FieldArranger.js';\nimport type { RecoveryStatus } from '../draftRecovery.js';\nimport { say } from '../copy/record/components/LayoutBuilder.js';\n\nexport interface Section {\n kind: 'fields' | 'list';\n title?: string;\n off?: boolean;\n paths: string[];\n via?: string;\n columns: string[];\n limit?: number;\n}\nexport interface Template {\n id: string;\n name?: string;\n base: string;\n sections: Section[];\n}\nexport interface LayoutBuilderProps {\n draft: Template;\n table: TableMeta;\n /** The record beside the builder redraws, a beat later. */\n onPreview: () => void;\n /** Both redraw now. */\n onApplied: () => void;\n onReset: () => void;\n onCancel: () => void;\n onSave: () => void;\n saving?: boolean;\n error?: string;\n recoveryStatus?: RecoveryStatus;\n hasRecovery?: boolean;\n recoverySourceChanged?: boolean;\n onRecover?: (restore: boolean) => void;\n canEdit?: () => boolean;\n}\n\nfunction childOf(section: Section): TableMeta | null {\n const fk = (state as { schema: { foreignKeys: Array<{ name: string; from: { table: string } }> } }).schema.foreignKeys.find(\n (f) => f.name === section.via,\n );\n return fk ? ((findTable(fk.from.table) as TableMeta | undefined) ?? null) : null;\n}\n\nexport function LayoutBuilder({\n draft,\n table,\n onPreview,\n onApplied,\n onReset,\n onCancel,\n onSave,\n saving = false,\n error,\n recoveryStatus,\n hasRecovery = false,\n recoverySourceChanged,\n onRecover,\n canEdit = () => true,\n}: LayoutBuilderProps) {\n const [, bump] = useState(0);\n const applied = () => {\n bump((n) => n + 1);\n onApplied();\n };\n const preview = () => {\n bump((n) => n + 1);\n onPreview();\n };\n const move = (index: number, delta: number) => {\n if (!canEdit()) return;\n const next = index + delta;\n if (next < 0 || next >= draft.sections.length) return;\n const [section] = draft.sections.splice(index, 1);\n draft.sections.splice(next, 0, section);\n applied();\n };\n return (\n <>\n <div className=\"tpl-head\">\n <div className=\"tpl-title\">\n <span className=\"tpl-eyebrow\">{say('recordLayout')}</span>\n <input\n type=\"text\"\n className=\"tpl-name\"\n value={draft.name ?? ''}\n disabled={saving || hasRecovery}\n aria-label={say('layoutName')}\n placeholder={say('defaultLayout')}\n spellCheck={false}\n onChange={(e) => {\n if (canEdit()) {\n draft.name = e.currentTarget.value;\n preview();\n }\n }}\n />\n <span className=\"tpl-for\">{say('for', { name: table.name })}</span>\n </div>\n {hasRecovery ? (\n <div className=\"tpl-recovery\" role=\"status\">\n <p>{recoverySourceChanged ? say('anUnsavedDraftIsAvailable') : say('anUnsavedLayoutDraft')}</p>\n <div className=\"tpl-head-actions\">\n <button type=\"button\" onClick={() => onRecover?.(true)}>\n {say('restoreDraft')}\n </button>\n <button type=\"button\" className=\"ghost\" onClick={() => onRecover?.(false)}>\n {say('discardDraft')}\n </button>\n </div>\n </div>\n ) : null}\n {recoveryStatus === 'unavailable' || recoveryStatus === 'conflict' ? (\n <p className=\"tpl-error\" role=\"alert\">\n {recoveryStatus === 'conflict' ? say('anotherEditorChangedTheRecovery') : say('browserRecoveryIsUnavailable')}\n </p>\n ) : null}\n {error ? (\n <p className=\"tpl-error\" role=\"alert\">\n {error}\n </p>\n ) : null}\n <div className=\"tpl-head-actions\">\n <button type=\"button\" className=\"ghost\" disabled={saving || hasRecovery} onClick={onReset}>\n {say('resetToDefault')}\n </button>\n <button type=\"button\" className=\"ghost\" disabled={saving} onClick={onCancel}>\n {say('common.cancel')}\n </button>\n <button type=\"button\" disabled={saving || hasRecovery} onClick={onSave}>\n {saving ? 'Saving...' : say('saveLayout')}\n </button>\n </div>\n </div>\n <div className=\"tpl-body\" inert={saving || hasRecovery} aria-busy={saving}>\n {draft.sections.map((section, index) => (\n <SectionCard\n key={`${section.kind}:${section.via ?? ''}:${index}`}\n section={section}\n index={index}\n count={draft.sections.length}\n draft={draft}\n table={table}\n onMove={(delta) => move(index, delta)}\n applied={applied}\n preview={preview}\n canEdit={canEdit}\n />\n ))}\n </div>\n </>\n );\n}\n\nfunction SectionCard({\n section,\n index,\n count,\n draft,\n table,\n onMove,\n applied,\n preview,\n canEdit,\n}: {\n section: Section;\n index: number;\n count: number;\n draft: Template;\n table: TableMeta;\n onMove: (delta: number) => void;\n applied: () => void;\n preview: () => void;\n canEdit: () => boolean;\n}) {\n const isList = section.kind === 'list';\n const child = isList ? childOf(section) : null;\n const rename = async () => {\n const name = await promptFor({\n title: say('renameSection'),\n label: say('heading'),\n value: section.title ?? '',\n confirmLabel: say('common.rename'),\n hint: undefined,\n placeholder: undefined,\n });\n if (name === null || !canEdit()) return;\n section.title = name.trim() || undefined;\n applied();\n };\n return (\n <section className={`tpl-section${section.off ? ' off' : ''}`}>\n <div className=\"tpl-section-head\">\n <label className=\"tpl-toggle\">\n <input\n type=\"checkbox\"\n checked={!section.off}\n onChange={(e) => {\n section.off = !e.currentTarget.checked;\n applied();\n }}\n />\n <span className=\"tpl-section-name\">{section.title ?? say('fields')}</span>\n </label>\n <span className=\"tpl-section-kind\">\n {isList ? say('tableNamed', { table: (child ? child.name : section.via) ?? '' }) : say('fieldsKind')}\n </span>\n <div className=\"tpl-section-actions\">\n <button\n type=\"button\"\n className=\"tpl-move\"\n title={say('common.moveUp')}\n aria-label={say('common.moveUp')}\n disabled={index === 0}\n onClick={() => onMove(-1)}\n >\n ↑\n </button>\n <button\n type=\"button\"\n className=\"tpl-move\"\n title={say('common.moveDown')}\n aria-label={say('common.moveDown')}\n disabled={index === count - 1}\n onClick={() => onMove(1)}\n >\n ↓\n </button>\n <button\n type=\"button\"\n className=\"tpl-move\"\n title={say('common.rename')}\n aria-label={say('renameSection')}\n onClick={() => void rename()}\n >\n ✎\n </button>\n </div>\n </div>\n {section.off ? null : isList ? (\n <ListChoices section={section} child={child} applied={applied} preview={preview} />\n ) : (\n <FieldChoices section={section} draft={draft} table={table} applied={applied} preview={preview} />\n )}\n </section>\n );\n}\n\nfunction FieldChoices({\n section,\n draft,\n table,\n applied,\n preview,\n}: {\n section: Section;\n draft: Template;\n table: TableMeta;\n applied: () => void;\n preview: () => void;\n}) {\n /* The candidates are the columns of whichever table the section's paths point into. */\n const prefix = section.paths[0]?.includes('.') ? section.paths[0].slice(0, section.paths[0].lastIndexOf('.')) : '';\n const source = (prefix ? tableAtPrefix(table.id, prefix) : table) as TableMeta | null | undefined;\n if (!source) return <p className=\"note\">{say('thatReferenceIsNoLonger')}</p>;\n const qualify = (name: string) => (prefix ? `${prefix}.${name}` : name);\n const types = new Map(source.columns.map((c) => [qualify(c.name), c.type.toLowerCase()]));\n const others = draft.sections\n .map((s, i) => ({ s, i }))\n .filter(({ s }) => s.kind === 'fields' && s !== section && !s.off)\n .map(({ s, i }) => ({\n title: s.title || say('block', { i: i + 1 }),\n receive: (name: string) => {\n if (!s.paths.includes(name)) s.paths = [...s.paths, name];\n },\n }));\n return (\n <FieldArranger\n all={source.columns.map((c) => qualify(c.name))}\n chosen={section.paths}\n /* No label of its own: the card this sits in is headed with the block's name. */\n heading={null}\n label={(path) => (prefix && path.startsWith(`${prefix}.`) ? path.slice(prefix.length + 1) : path)}\n typeOf={(path) => types.get(path) ?? ''}\n owner={section}\n onChange={(next) => {\n section.paths = next;\n preview();\n }}\n others={others}\n onSend={applied}\n />\n );\n}\n\nfunction ListChoices({\n section,\n child,\n applied,\n preview,\n}: {\n section: Section;\n child: TableMeta | null;\n applied: () => void;\n preview: () => void;\n}) {\n if (!child) return <p className=\"note\">{say('thatRelationshipIsNoLonger')}</p>;\n const types = new Map(child.columns.map((c) => [c.name, c.type.toLowerCase()]));\n return (\n <div>\n {/* The same arranger as a field block, because a list's columns are the same kind of choice. */}\n <FieldArranger\n heading={say('common.columns')}\n all={child.columns.map((c) => c.name)}\n chosen={section.columns}\n typeOf={(name) => types.get(name) ?? ''}\n owner={section}\n onChange={(next) => {\n section.columns = next;\n preview();\n }}\n />\n <label className=\"tpl-rows\">\n <span>{say('rowsOnThePage')}</span>\n <input\n type=\"number\"\n min={1}\n max={50}\n defaultValue={String(section.limit ?? (DEFAULT_LIST_LIMIT as number))}\n onChange={(e) => {\n section.limit = Math.max(1, Math.min(50, Number(e.currentTarget.value) || 8));\n applied();\n }}\n />\n </label>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LayoutBuilder-Cbxa_wve.js","names":["say","say","_Fragment","defineMessages","state","tableAtPrefix","findTable","promptFor","Fragment$1","say$1","FieldArranger","n","list","useRef","dragging","setDragging","useState","sending","setSending","focusAt","setFocusAt","chosen","move","to","from","next","item","onChange","remove","at","i","handOver","other","name","onSend","sendTo","others","rest","all","heading","columns","e","label","typeOf","k","say","childOf","fk","f","section","LayoutBuilder","bump","applied","onApplied","preview","onPreview","canEdit","index","delta","draft","saving","hasRecovery","table","recoverySourceChanged","onRecover","recoveryStatus","error","onReset","onCancel","onSave","SectionCard","isList","child","rename","onMove","count","ListChoices","FieldChoices","prefix","source","qualify","types","c","s","path"],"sources":["../../../../../kit/src/client/copy/record/components/FieldArranger.ts","../../../../../kit/src/client/components/FieldArranger.tsx","../../../../../kit/src/client/copy/record/components/LayoutBuilder.ts","../../../../../kit/src/client/components/LayoutBuilder.tsx"],"sourcesContent":["/** What FieldArranger 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 fields: 'Fields',\n ofDragToArrange: '{chosenCount} of {allCount} · drag to arrange',\n everyFieldInTheTables: 'Every field, in the table’s own order',\n none: 'None',\n position: '{name} — position {i} of {chosenCount}',\n moveThisFieldToAnother: 'Move this field to another group',\n moveToAnotherGroup: 'Move {name} to another group',\n takeThisFieldOff: 'Take this field off the {noun}',\n remove: 'Remove {name}',\n noFieldsInThisGroup: 'No fields in this group yet.',\n everyField: 'Every field is on the {noun}',\n addToThisGroup: 'Add {name} to this group',\n add: 'Add {name}',\n});\n","/**\n * Arranging a group of fields: which ones, and in what order. Drag to\n * reorder, Alt+arrows for the keyboard, × to take one off, a pool of the\n * rest to add from, and — when there are other groups — a way to send a\n * field to one of them. Controlled: the parent owns the list and hears\n * every change. The vanilla twin in `arrange.js` serves the page builder\n * until that room crosses over.\n */\nimport { useEffect, useRef, useState } from 'react';\nimport { say } from '../copy/record/components/FieldArranger.js';\n\ninterface OtherGroup {\n title: string;\n receive: (name: string) => void;\n}\ninterface FieldArrangerProps {\n all: string[];\n chosen: string[];\n columns?: number;\n /** What a field is taken off — \"page\", \"layout\". */\n noun?: string;\n /** The panel's own label, or null where whatever it sits in already says what these are. */\n heading?: string | null;\n label?: (name: string) => string;\n typeOf?: (name: string) => string;\n onChange: (next: string[]) => void;\n /** Identity of this group, for cross-group drags. */\n owner?: unknown;\n others?: OtherGroup[];\n /** Redraw everything after a hand-over: two groups change and the other one may be open. */\n onSend?: () => void;\n}\n\n/** The field being dragged between groups, or null. */\nlet carried: { name: string; owner: unknown; take: () => void } | null = null;\n/** @public the database browser's (scripts/boundary/entries.json, \"host\") */\nexport const carriedField = () => carried;\n\nexport function FieldArranger({\n all,\n chosen,\n columns = 1,\n noun = 'layout',\n heading = say('fields'),\n label = (n) => n,\n typeOf = () => '',\n onChange,\n owner,\n others = [],\n onSend,\n}: FieldArrangerProps) {\n const list = useRef<HTMLDivElement>(null);\n const [dragging, setDragging] = useState<number | null>(null);\n const [sending, setSending] = useState<number | null>(null);\n const [focusAt, setFocusAt] = useState(-1);\n useEffect(() => {\n if (focusAt < 0) return;\n (list.current?.children[focusAt] as HTMLElement | undefined)?.focus();\n setFocusAt(-1);\n }, [focusAt, chosen]);\n\n const move = (from: number, to: number) => {\n if (to < 0 || to >= chosen.length || from === to) return;\n const next = [...chosen];\n const [item] = next.splice(from, 1);\n next.splice(to, 0, item);\n onChange(next);\n setFocusAt(to);\n };\n const remove = (i: number) => onChange(chosen.filter((_, at) => at !== i));\n const handOver = (name: string, i: number, other: OtherGroup) => {\n onChange(chosen.filter((_, at) => at !== i));\n other.receive(name);\n setSending(null);\n onSend?.();\n };\n const sendTo = (name: string, i: number) => {\n if (others.length === 1) {\n handOver(name, i, others[0]);\n return;\n }\n /* More than one candidate, so it is a choice — made in the row rather than in a dialog, which would cover the thing being arranged. */\n setSending(i);\n };\n const rest = all.filter((n) => !chosen.includes(n));\n return (\n <div className=\"pb-panel\">\n <div className=\"pb-panel-head\">\n {heading ? <span className=\"pb-label\">{heading}</span> : null}\n <span className=\"pb-field-count\">{say('ofDragToArrange', { chosenCount: chosen.length, allCount: all.length })}</span>\n <span className=\"pb-spacer\" />\n <button type=\"button\" className=\"ghost\" title={say('everyFieldInTheTables')} onClick={() => onChange([...all])}>\n {say('common.all')}\n </button>\n <button type=\"button\" className=\"ghost\" onClick={() => onChange([])}>\n {say('none')}\n </button>\n </div>\n <div ref={list} className=\"pb-arrange\" style={{ gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }}>\n {chosen.length ? (\n chosen.map((name, i) => (\n <div\n key={name}\n className={`pb-arrange-row${dragging === i ? ' dragging' : ''}`}\n draggable\n tabIndex={0}\n role=\"listitem\"\n aria-label={say('position', { name, i: i + 1, chosenCount: chosen.length })}\n onDragStart={(e) => {\n setDragging(i);\n /* Also offered to every other group's row: reordering inside this list and carrying to another group are the same grip. */\n carried = { name, owner, take: () => onChange(chosen.filter((n) => n !== name)) };\n e.dataTransfer.effectAllowed = 'move';\n /* Firefox will not start a drag without something on the transfer; the payload is never read. */\n e.dataTransfer.setData('text/plain', name);\n }}\n onDragEnd={() => {\n setDragging(null);\n carried = null;\n }}\n onDragOver={(e) => {\n if (dragging === null || dragging === i) return;\n e.preventDefault();\n const next = [...chosen];\n const [item] = next.splice(dragging, 1);\n next.splice(i, 0, item);\n setDragging(i);\n onChange(next);\n }}\n onDrop={(e) => e.preventDefault()}\n onKeyDown={(e) => {\n if (!e.altKey) return;\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n move(i, i - 1);\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n move(i, i + 1);\n }\n }}\n >\n <span className=\"pb-grip\" aria-hidden=\"true\">\n ∷\n </span>\n <span className=\"pb-field-name\" title={name}>\n {label(name)}\n </span>\n <span className=\"pb-field-type\">{typeOf(name)}</span>\n {others.length ? (\n <button\n type=\"button\"\n className=\"ghost pb-send\"\n title={say('moveThisFieldToAnother')}\n aria-label={say('moveToAnotherGroup', { name })}\n onClick={() => sendTo(name, i)}\n >\n →\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"ghost pb-remove\"\n title={say('takeThisFieldOff', { noun })}\n aria-label={say('remove', { name })}\n onClick={() => remove(i)}\n >\n ×\n </button>\n {sending === i ? (\n <div className=\"pb-send-menu\">\n {others.map((other, k) => (\n <button key={other.title} type=\"button\" className=\"ghost\" autoFocus={k === 0} onClick={() => handOver(name, i, other)}>\n {other.title}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n ))\n ) : (\n <p className=\"note\">{say('noFieldsInThisGroup')}</p>\n )}\n </div>\n <div className=\"pb-pool\">\n <span className=\"pb-label\">{rest.length ? say('common.add') : say('everyField', { noun })}</span>\n {rest.map((name) => (\n /* Named for what pressing it does: the visible text is the field's own name, which reads as a label to anyone hearing the page one element at a time. */\n <button\n key={name}\n type=\"button\"\n className=\"ghost pb-add-field\"\n title={say('addToThisGroup', { name })}\n aria-label={say('add', { name })}\n onClick={() => onChange([...chosen, name])}\n >\n {label(name)}\n </button>\n ))}\n </div>\n </div>\n );\n}\n","/** What LayoutBuilder 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 fields: 'Fields',\n discardDraft: 'Discard draft',\n recordLayout: 'Record layout',\n layoutName: 'Layout name',\n defaultLayout: 'Default layout',\n anUnsavedDraftIsAvailable: 'An unsaved draft is available. The saved layout has changed since it was started.',\n anUnsavedLayoutDraft: 'An unsaved layout draft is available.',\n restoreDraft: 'Restore draft',\n anotherEditorChangedTheRecovery: 'Another editor changed the recovery copy. This draft is kept in this tab only.',\n browserRecoveryIsUnavailable: 'Browser recovery is unavailable. Keep this tab open until the layout is saved.',\n resetToDefault: 'Reset to default',\n saveLayout: 'Save layout',\n renameSection: 'Rename section',\n heading: 'Heading',\n tableNamed: 'table · {table}',\n thatReferenceIsNoLonger: 'That reference is no longer in the schema.',\n thatRelationshipIsNoLonger: 'That relationship is no longer in the schema.',\n rowsOnThePage: 'Rows on the page',\n for: 'for {name}',\n block: 'block {i}',\n fieldsKind: 'fields',\n});\n","/**\n * The record layout editor: the sections of a record, each on or off,\n * reordered, renamed, and its fields arranged — with the record beside it\n * updating as you change it. The draft is one mutable object the record\n * view also reads (`template.js` holds it), so a change here is a mutation\n * and a redraw, not a copy.\n */\nimport { useState } from 'react';\nimport { findTable, state, tableAtPrefix } from '../core.js';\nimport { promptFor } from '../prompt.js';\nimport { DEFAULT_LIST_LIMIT } from '@mistriwork/engine/shared/recordview.js';\nimport type { TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport { FieldArranger } from './FieldArranger.js';\nimport type { RecoveryStatus } from '../draftRecovery.js';\nimport { say } from '../copy/record/components/LayoutBuilder.js';\n\nexport interface Section {\n kind: 'fields' | 'list';\n title?: string;\n off?: boolean;\n paths: string[];\n via?: string;\n columns: string[];\n limit?: number;\n}\nexport interface Template {\n id: string;\n name?: string;\n base: string;\n sections: Section[];\n}\nexport interface LayoutBuilderProps {\n draft: Template;\n table: TableMeta;\n /** The record beside the builder redraws, a beat later. */\n onPreview: () => void;\n /** Both redraw now. */\n onApplied: () => void;\n onReset: () => void;\n onCancel: () => void;\n onSave: () => void;\n saving?: boolean;\n error?: string;\n recoveryStatus?: RecoveryStatus;\n hasRecovery?: boolean;\n recoverySourceChanged?: boolean;\n onRecover?: (restore: boolean) => void;\n canEdit?: () => boolean;\n}\n\nfunction childOf(section: Section): TableMeta | null {\n const fk = (state as { schema: { foreignKeys: Array<{ name: string; from: { table: string } }> } }).schema.foreignKeys.find(\n (f) => f.name === section.via,\n );\n return fk ? ((findTable(fk.from.table) as TableMeta | undefined) ?? null) : null;\n}\n\nexport function LayoutBuilder({\n draft,\n table,\n onPreview,\n onApplied,\n onReset,\n onCancel,\n onSave,\n saving = false,\n error,\n recoveryStatus,\n hasRecovery = false,\n recoverySourceChanged,\n onRecover,\n canEdit = () => true,\n}: LayoutBuilderProps) {\n const [, bump] = useState(0);\n const applied = () => {\n bump((n) => n + 1);\n onApplied();\n };\n const preview = () => {\n bump((n) => n + 1);\n onPreview();\n };\n const move = (index: number, delta: number) => {\n if (!canEdit()) return;\n const next = index + delta;\n if (next < 0 || next >= draft.sections.length) return;\n const [section] = draft.sections.splice(index, 1);\n draft.sections.splice(next, 0, section);\n applied();\n };\n return (\n <>\n <div className=\"tpl-head\">\n <div className=\"tpl-title\">\n <span className=\"tpl-eyebrow\">{say('recordLayout')}</span>\n <input\n type=\"text\"\n className=\"tpl-name\"\n value={draft.name ?? ''}\n disabled={saving || hasRecovery}\n aria-label={say('layoutName')}\n placeholder={say('defaultLayout')}\n spellCheck={false}\n onChange={(e) => {\n if (canEdit()) {\n draft.name = e.currentTarget.value;\n preview();\n }\n }}\n />\n <span className=\"tpl-for\">{say('for', { name: table.name })}</span>\n </div>\n {hasRecovery ? (\n <div className=\"tpl-recovery\" role=\"status\">\n <p>{recoverySourceChanged ? say('anUnsavedDraftIsAvailable') : say('anUnsavedLayoutDraft')}</p>\n <div className=\"tpl-head-actions\">\n <button type=\"button\" onClick={() => onRecover?.(true)}>\n {say('restoreDraft')}\n </button>\n <button type=\"button\" className=\"ghost\" onClick={() => onRecover?.(false)}>\n {say('discardDraft')}\n </button>\n </div>\n </div>\n ) : null}\n {recoveryStatus === 'unavailable' || recoveryStatus === 'conflict' ? (\n <p className=\"tpl-error\" role=\"alert\">\n {recoveryStatus === 'conflict' ? say('anotherEditorChangedTheRecovery') : say('browserRecoveryIsUnavailable')}\n </p>\n ) : null}\n {error ? (\n <p className=\"tpl-error\" role=\"alert\">\n {error}\n </p>\n ) : null}\n <div className=\"tpl-head-actions\">\n <button type=\"button\" className=\"ghost\" disabled={saving || hasRecovery} onClick={onReset}>\n {say('resetToDefault')}\n </button>\n <button type=\"button\" className=\"ghost\" disabled={saving} onClick={onCancel}>\n {say('common.cancel')}\n </button>\n <button type=\"button\" disabled={saving || hasRecovery} onClick={onSave}>\n {saving ? 'Saving...' : say('saveLayout')}\n </button>\n </div>\n </div>\n <div className=\"tpl-body\" inert={saving || hasRecovery} aria-busy={saving}>\n {draft.sections.map((section, index) => (\n <SectionCard\n key={`${section.kind}:${section.via ?? ''}:${index}`}\n section={section}\n index={index}\n count={draft.sections.length}\n draft={draft}\n table={table}\n onMove={(delta) => move(index, delta)}\n applied={applied}\n preview={preview}\n canEdit={canEdit}\n />\n ))}\n </div>\n </>\n );\n}\n\nfunction SectionCard({\n section,\n index,\n count,\n draft,\n table,\n onMove,\n applied,\n preview,\n canEdit,\n}: {\n section: Section;\n index: number;\n count: number;\n draft: Template;\n table: TableMeta;\n onMove: (delta: number) => void;\n applied: () => void;\n preview: () => void;\n canEdit: () => boolean;\n}) {\n const isList = section.kind === 'list';\n const child = isList ? childOf(section) : null;\n const rename = async () => {\n const name = await promptFor({\n title: say('renameSection'),\n label: say('heading'),\n value: section.title ?? '',\n confirmLabel: say('common.rename'),\n hint: undefined,\n placeholder: undefined,\n });\n if (name === null || !canEdit()) return;\n section.title = name.trim() || undefined;\n applied();\n };\n return (\n <section className={`tpl-section${section.off ? ' off' : ''}`}>\n <div className=\"tpl-section-head\">\n <label className=\"tpl-toggle\">\n <input\n type=\"checkbox\"\n checked={!section.off}\n onChange={(e) => {\n section.off = !e.currentTarget.checked;\n applied();\n }}\n />\n <span className=\"tpl-section-name\">{section.title ?? say('fields')}</span>\n </label>\n <span className=\"tpl-section-kind\">\n {isList ? say('tableNamed', { table: (child ? child.name : section.via) ?? '' }) : say('fieldsKind')}\n </span>\n <div className=\"tpl-section-actions\">\n <button\n type=\"button\"\n className=\"tpl-move\"\n title={say('common.moveUp')}\n aria-label={say('common.moveUp')}\n disabled={index === 0}\n onClick={() => onMove(-1)}\n >\n ↑\n </button>\n <button\n type=\"button\"\n className=\"tpl-move\"\n title={say('common.moveDown')}\n aria-label={say('common.moveDown')}\n disabled={index === count - 1}\n onClick={() => onMove(1)}\n >\n ↓\n </button>\n <button\n type=\"button\"\n className=\"tpl-move\"\n title={say('common.rename')}\n aria-label={say('renameSection')}\n onClick={() => void rename()}\n >\n ✎\n </button>\n </div>\n </div>\n {section.off ? null : isList ? (\n <ListChoices section={section} child={child} applied={applied} preview={preview} />\n ) : (\n <FieldChoices section={section} draft={draft} table={table} applied={applied} preview={preview} />\n )}\n </section>\n );\n}\n\nfunction FieldChoices({\n section,\n draft,\n table,\n applied,\n preview,\n}: {\n section: Section;\n draft: Template;\n table: TableMeta;\n applied: () => void;\n preview: () => void;\n}) {\n /* The candidates are the columns of whichever table the section's paths point into. */\n const prefix = section.paths[0]?.includes('.') ? section.paths[0].slice(0, section.paths[0].lastIndexOf('.')) : '';\n const source = (prefix ? tableAtPrefix(table.id, prefix) : table) as TableMeta | null | undefined;\n if (!source) return <p className=\"note\">{say('thatReferenceIsNoLonger')}</p>;\n const qualify = (name: string) => (prefix ? `${prefix}.${name}` : name);\n const types = new Map(source.columns.map((c) => [qualify(c.name), c.type.toLowerCase()]));\n const others = draft.sections\n .map((s, i) => ({ s, i }))\n .filter(({ s }) => s.kind === 'fields' && s !== section && !s.off)\n .map(({ s, i }) => ({\n title: s.title || say('block', { i: i + 1 }),\n receive: (name: string) => {\n if (!s.paths.includes(name)) s.paths = [...s.paths, name];\n },\n }));\n return (\n <FieldArranger\n all={source.columns.map((c) => qualify(c.name))}\n chosen={section.paths}\n /* No label of its own: the card this sits in is headed with the block's name. */\n heading={null}\n label={(path) => (prefix && path.startsWith(`${prefix}.`) ? path.slice(prefix.length + 1) : path)}\n typeOf={(path) => types.get(path) ?? ''}\n owner={section}\n onChange={(next) => {\n section.paths = next;\n preview();\n }}\n others={others}\n onSend={applied}\n />\n );\n}\n\nfunction ListChoices({\n section,\n child,\n applied,\n preview,\n}: {\n section: Section;\n child: TableMeta | null;\n applied: () => void;\n preview: () => void;\n}) {\n if (!child) return <p className=\"note\">{say('thatRelationshipIsNoLonger')}</p>;\n const types = new Map(child.columns.map((c) => [c.name, c.type.toLowerCase()]));\n return (\n <div>\n {/* The same arranger as a field block, because a list's columns are the same kind of choice. */}\n <FieldArranger\n heading={say('common.columns')}\n all={child.columns.map((c) => c.name)}\n chosen={section.columns}\n typeOf={(name) => types.get(name) ?? ''}\n owner={section}\n onChange={(next) => {\n section.columns = next;\n preview();\n }}\n />\n <label className=\"tpl-rows\">\n <span>{say('rowsOnThePage')}</span>\n <input\n type=\"number\"\n min={1}\n max={50}\n defaultValue={String(section.limit ?? (DEFAULT_LIST_LIMIT as number))}\n onChange={(e) => {\n section.limit = Math.max(1, Math.min(50, Number(e.currentTarget.value) || 8));\n applied();\n }}\n />\n </label>\n </div>\n );\n}\n"],"mappings":"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"}
|