@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,10 +1,10 @@
|
|
|
1
1
|
import { At as removeHostListener, Ct as addHostListener, Ft as shellRoot, St as subscribeMessages, _t as message, bt as servedLanguage, gt as defineMessages, jt as shellBody, rn as shell, vt as messageLanguage, xt as setMessageLanguage, yt as offeredLanguages } from "./shared-DJZjSi3J.js";
|
|
2
|
-
import { A as render, B as toast, L as state, P as setPageSize, b as pageSize, i as api, n as PAGE_SIZES, st as ownedBy } from "./shared-
|
|
2
|
+
import { A as render, B as toast, L as state, P as setPageSize, b as pageSize, i as api, n as PAGE_SIZES, st as ownedBy } from "./shared-BoLbc2WD.js";
|
|
3
3
|
import { t as Modal } from "./shared-CRr4kJXB.js";
|
|
4
4
|
import { t as Dropdown } from "./shared-gtzTT5Z7.js";
|
|
5
|
-
import { C as visualThemeScheme, S as visualThemeOptions, _ as setVisualPalette, b as visualPaletteOptions, f as VISUAL_THEME_EVENT, g as resetVisualTheme, h as readerOverridesAppTheme, m as appVisualTheme, p as VISUAL_THEME_REGISTRY_EVENT, v as setVisualTheme, w as visualThemesOffered, x as visualThemeChoice, y as visualPaletteChoice } from "./shared-
|
|
6
|
-
import { i as subscribeRelatedRows, n as relatedRows, r as setRelatedRows, t as RELATED_SIZES } from "./shared-
|
|
7
|
-
import { n as setDensity, t as densityChoice } from "./shared-
|
|
5
|
+
import { C as visualThemeScheme, S as visualThemeOptions, _ as setVisualPalette, b as visualPaletteOptions, f as VISUAL_THEME_EVENT, g as resetVisualTheme, h as readerOverridesAppTheme, m as appVisualTheme, p as VISUAL_THEME_REGISTRY_EVENT, v as setVisualTheme, w as visualThemesOffered, x as visualThemeChoice, y as visualPaletteChoice } from "./shared-XcSKDp6N.js";
|
|
6
|
+
import { i as subscribeRelatedRows, n as relatedRows, r as setRelatedRows, t as RELATED_SIZES } from "./shared-CuZt26rm.js";
|
|
7
|
+
import { n as setDensity, t as densityChoice } from "./shared-CPjpSFGh.js";
|
|
8
8
|
import { useEffect, useRef, useState, useSyncExternalStore } from "react";
|
|
9
9
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
10
|
// packages/kit/src/client/typography.js
|
|
@@ -355,4 +355,4 @@ function PrefsDialog({ onClose }) {
|
|
|
355
355
|
}
|
|
356
356
|
export { PrefsDialog };
|
|
357
357
|
|
|
358
|
-
//# sourceMappingURL=shared-
|
|
358
|
+
//# sourceMappingURL=shared-B9H7_Pji.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-CAe-US1q.js","names":["KEY","remembered","say"],"sources":["../../../kit/src/client/typography.js","../../../kit/src/client/copy/shell/theme.ts","../../../kit/src/client/theme.js","../../../kit/src/client/copy/shell/components/Prefs.ts","../../../kit/src/client/components/Prefs.tsx"],"sourcesContent":["/**\n * What face the data wears: mono — tablewalk's own, values as things you\n * compare character by character — or sans, a reading cut where values\n * take the prose face and only true code stays code.\n *\n * A display preference like density and the theme: per person, per\n * browser, applied at boot before the first paint and again by the brand\n * pass on every connection switch. The whole\n * mechanism is one token — the stylesheet says `var(--mono)` everywhere\n * data is set, so swapping what that token resolves to re-dresses every\n * value at once, and a short carve-out list (DDL, SQL, the query\n * language) pins the surfaces that *are* code back to a real mono stack.\n */\nimport { shellBody } from './shellHost.js';\nconst KEY = 'mistri.typography';\n/** @type {'default' | 'sans' | 'mono'} */\nlet remembered = 'default';\nlet sessionOnly = false;\n\nexport function typographyPreference() {\n if (sessionOnly) return remembered;\n try {\n const value = localStorage.getItem(KEY);\n remembered = value === 'sans' || value === 'mono' ? value : 'default';\n } catch {\n /* Keep the last readable or explicitly chosen value. */\n }\n return remembered;\n}\n\nexport function applyTypography() {\n const preference = typographyPreference();\n shellBody().classList.toggle('type-sans', preference === 'sans');\n shellBody().classList.toggle('type-mono', preference === 'mono');\n}\n\n/** Default follows the app/preset; explicit faces override it. Unknown values mean mono. */\nexport function setTypography(choice) {\n remembered = choice === 'default' ? 'default' : choice === 'sans' ? 'sans' : 'mono';\n try {\n if (remembered === 'default') localStorage.removeItem(KEY);\n else localStorage.setItem(KEY, remembered);\n sessionOnly = false;\n } catch {\n // Nowhere to keep the choice is no reason to refuse it for this tab.\n sessionOnly = true;\n }\n applyTypography();\n}\n","/** What theme says, in the shell room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../messages.js';\n\nexport const say = defineMessages(\n {\n matchTheSystem: 'match the system',\n alwaysLight: 'always light',\n alwaysDark: 'always dark',\n },\n {\n /* The words a visitor sees in the shell; the rest are said in English. */\n es: {\n matchTheSystem: 'según el sistema',\n alwaysLight: 'siempre claro',\n alwaysDark: 'siempre oscuro',\n },\n },\n);\n","/**\n * Light, dark, or whatever the machine is set to.\n *\n * The palette for all three has been in style.css from early on: a full token\n * override under `@media (prefers-color-scheme: dark)`, guarded as\n * `:root:not([data-theme=\"light\"])`, and a second copy under\n * `:root[data-theme=\"dark\"]`. That guard only means anything if something can\n * stamp `data-theme`, and nothing ever did — so the dark palette was reachable\n * by changing your operating system and by no other route, and the light one\n * was unreachable from a dark machine at all.\n *\n * This is that missing piece and nothing more. It writes one attribute.\n *\n * Three states rather than two, because \"system\" is a real answer and not the\n * absence of one: a reader who has told their machine to go dark at sunset\n * means it here too, and a toggle that only remembers light-or-dark quietly\n * opts them out of that. Absent attribute *is* the system state, which is why\n * the CSS was written to key off its absence.\n */\nimport { say } from './copy/shell/theme.js';\nimport { shellRoot } from './shellHost.js';\n\nconst KEY = 'mistri.theme';\nconst ORDER = ['system', 'light', 'dark'];\n\n/* Said when asked, not when the module loads: a visitor's language arrives later. */\nconst LABEL = {\n system: () => say('matchTheSystem'),\n light: () => say('alwaysLight'),\n dark: () => say('alwaysDark'),\n};\n\nlet current = 'system';\n/** The worn theme's `scheme` (appTheme.js): `dark` is the mode a reader gets until they pick one, `dark-only` the only one. */\nlet scheme;\n\nfunction stored() {\n try {\n const raw = window.localStorage?.getItem(KEY);\n /* Validated, not trusted: this comes back from storage a stale build or a\n hand edit may have written, and an unknown value would stamp\n `data-theme=\"banana\"` — which matches no rule, so the page would render\n in the light palette while claiming to be in another one. */\n return ORDER.includes(raw) ? raw : 'system';\n } catch {\n return 'system';\n }\n}\n\n/** Whether the reader has picked a mode, \"match the system\" included: an absent key is no answer. */\nfunction remembered() {\n try {\n return ORDER.includes(window.localStorage?.getItem(KEY));\n } catch {\n return false;\n }\n}\n\n/** The mode in force for a pick: a dark theme is dark until the reader has said otherwise, a dark-only one always. */\nfunction shown(name) {\n if (scheme === 'dark-only') return 'dark';\n return scheme === 'dark' && name === 'system' && !remembered() ? 'dark' : name;\n}\n\nfunction apply(name) {\n current = ORDER.includes(name) ? name : 'system';\n const showing = shown(current);\n const root = shellRoot();\n if (showing === 'system') root.removeAttribute('data-theme');\n else root.setAttribute('data-theme', showing);\n /* Tells the browser which way to paint the things the page does not: form\n controls, scrollbars, the canvas behind an overscroll. Without it a dark\n page keeps light scrollbars. */\n root.style.colorScheme = showing === 'system' ? '' : showing;\n}\n\n/** The worn theme says it is dark (or dark only), or nothing; the page is stamped again when that changes. */\nexport function setThemeScheme(value) {\n if (value === scheme) return;\n scheme = value;\n apply(current);\n}\n\n/** Read the stored choice and put it on the page. Called once, at boot. */\nexport function initTheme() {\n apply(stored());\n}\n\n/** A mode held for this page only, never remembered: a theme bench frame (themeBench.ts) shows one mode whatever the reader picked. */\nexport function holdTheme(name) {\n apply(name);\n}\n\n/** What is in force, for a menu item that has to say so. */\nexport const themeChoice = () => current;\nexport const themeLabel = () => LABEL[current]();\n\n/** An explicit preference; System continues to follow the operating system. */\nexport function setTheme(name) {\n const pick = ORDER.includes(name) ? name : 'system';\n /* Remembered before it is applied: a dark theme answers \"match the system\" with the system only once it is asked for. */\n try {\n window.localStorage?.setItem(KEY, pick);\n } catch {\n /* A theme that cannot be remembered is still a theme for this tab. */\n }\n apply(pick);\n return current;\n}\n\nexport function effectiveTheme() {\n const showing = shown(current);\n return showing === 'system' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : showing;\n}\n\n/** A quick toggle always changes the visible palette, even when following System. */\nexport function toggleTheme() {\n return setTheme(effectiveTheme() === 'dark' ? 'light' : 'dark');\n}\n","/** What Prefs says, in the shell room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages(\n {\n english: 'English',\n notSaved: 'Your language could not be saved to your profile. It is kept in this browser.',\n },\n {\n /* The words a visitor sees in the shell; the rest are said in English. */\n es: {\n notSaved: 'No se pudo guardar tu idioma en tu perfil. Se guarda en este navegador.',\n },\n },\n);\n","/**\n * Preferences: visual theme, color mode, density, typography, and list lengths. Each\n * is a dropdown over a setting that already lives somewhere else; this\n * dialog only puts them in one place.\n */\nimport { useEffect, useRef, useState, useSyncExternalStore } from 'react';\nimport { Modal, type ModalHandle } from '@mistriwork/ui/Modal.js';\nimport { api, PAGE_SIZES, pageSize, render, setPageSize, state, toast } from '../core.js';\nimport { shell } from '../shellMode.js';\nimport { ownedBy } from '../requestIdentity.js';\nimport { densityChoice, setDensity } from '../density.js';\nimport { setTypography, typographyPreference } from '../typography.js';\nimport {\n setVisualPalette,\n visualPaletteChoice,\n visualPaletteOptions,\n appVisualTheme,\n readerOverridesAppTheme,\n resetVisualTheme,\n setVisualTheme,\n visualThemeChoice,\n visualThemeOptions,\n visualThemeScheme,\n visualThemesOffered,\n VISUAL_THEME_EVENT,\n VISUAL_THEME_REGISTRY_EVENT,\n} from '../visualTheme.js';\nimport { setTheme, themeChoice } from '../theme.js';\nimport { message, messageLanguage, offeredLanguages, servedLanguage, setMessageLanguage, subscribeMessages } from '../messages.js';\nimport { Dropdown } from './Dropdown.js';\nimport { RELATED_SIZES, relatedRows, setRelatedRows, subscribeRelatedRows } from '../relatedRows.js';\nimport { say } from '../copy/shell/components/Prefs.js';\nimport { addHostListener, removeHostListener } from '../shellHost.js';\n\nfunction Row({ label, hint, action, children }: { label: string; hint?: string; action?: React.ReactNode; children: React.ReactNode }) {\n return (\n <div className=\"prefs-row\">\n <div className=\"prefs-name\">\n <span>{label}</span>\n {hint ? <span className=\"prefs-hint\">{hint}</span> : null}\n {action}\n </div>\n {children}\n </div>\n );\n}\n\n/** A language as it calls itself: \"Español\", \"English\", \"Português (Brasil)\". */\nfunction ownName(tag: string): string {\n try {\n const name = new Intl.DisplayNames([tag], { type: 'language' }).of(tag) ?? tag;\n return name.charAt(0).toLocaleUpperCase(tag) + name.slice(1);\n } catch {\n return tag;\n }\n}\n\n/**\n * The language picker. Where the App has words in several languages the\n * server says them, so the pick is one of the App's (written to the reader's\n * row where `ui.locale` names a column of it, and kept in this browser either\n * way); anywhere else it is the framework's own, kept in this browser.\n */\nfunction LanguageRow({ language }: { language: string }) {\n const offered = offeredLanguages();\n const row = (shell().app()?.ui as { localeRow?: { table: string; key: Record<string, string | number>; column: string } } | undefined)\n ?.localeRow;\n const served = servedLanguage();\n const value = offered.length\n ? (offered.find((tag) => tag === served) ?? offered.find((tag) => served?.split('-')[0] === tag.split('-')[0]) ?? offered[0])\n : language;\n const pick = async (tag: string) => {\n if (offered.length && row) {\n try {\n const reply = (await api('/api/update', {\n ...ownedBy(state.activeConnection),\n table: row.table,\n key: row.key,\n values: { [row.column]: tag },\n })) as { errors?: Array<{ message?: string }> };\n if (reply?.errors?.length) throw new Error(reply.errors[0]?.message ?? say('notSaved'));\n } catch (error) {\n /* Still this browser's: the pick stands here, and the reader is told it did not reach their profile. */\n toast((error as Error).message || say('notSaved'), 'error');\n }\n }\n await setMessageLanguage(tag);\n };\n return (\n <Row label={message('preferences.language')} hint={message(row ? 'preferences.languageHintPerson' : 'preferences.languageHint')}>\n <Dropdown\n ariaLabel={message('preferences.language')}\n value={value}\n onChange={(tag) => void pick(tag)}\n items={\n offered.length\n ? offered.map((tag) => ({ value: tag, label: ownName(tag) }))\n : [\n { value: 'en', label: say('english') },\n { value: 'es', label: ownName('es') },\n ]\n }\n />\n </Row>\n );\n}\n\nexport function PrefsDialog({ onClose }: { onClose: () => void }) {\n const dialog = useRef<ModalHandle>(null);\n const language = useSyncExternalStore(subscribeMessages, messageLanguage, messageLanguage);\n const related = useSyncExternalStore(subscribeRelatedRows, relatedRows);\n /* The choices live in their stores; a pick writes there and this looks\n again, so the picker shows what was just chosen rather than what it\n opened on. */\n const [, look] = useState(0);\n useEffect(() => {\n const refresh = () => look((n) => n + 1);\n addHostListener(window, VISUAL_THEME_REGISTRY_EVENT, refresh);\n addHostListener(window, VISUAL_THEME_EVENT, refresh);\n return () => {\n removeHostListener(window, VISUAL_THEME_REGISTRY_EVENT, refresh);\n removeHostListener(window, VISUAL_THEME_EVENT, refresh);\n };\n }, []);\n const after = (write: () => void) => {\n write();\n look((n) => n + 1);\n };\n const darkOnly = visualThemeScheme() === 'dark-only';\n /* Which of a suite's Apps opens first is the App framework's (SuiteAppPreference.tsx), drawn through the shell's slot. */\n const { SuitePreference } = shell().slots;\n return (\n <Modal className=\"prefs\" ref={dialog} onClose={onClose} ariaLabel={message('preferences.title')}>\n <h2 className=\"prefs-title\">{message('preferences.title')}</h2>\n {SuitePreference && <SuitePreference />}\n <LanguageRow language={language} />\n {/* Workbench picks its own look; an App may lock its authored branding. */}\n {visualThemesOffered() && (\n <Row\n label={message('preferences.visualTheme')}\n action={\n readerOverridesAppTheme() ? (\n <button type=\"button\" className=\"prefs-reset\" onClick={() => after(resetVisualTheme)}>\n {message('preferences.resetTheme')}\n </button>\n ) : null\n }\n >\n <Dropdown\n ariaLabel={message('preferences.visualTheme')}\n value={visualThemeChoice()}\n onChange={(v) => after(() => setVisualTheme(v))}\n items={visualThemeOptions().map((theme) => ({\n ...theme,\n swatches: [...theme.swatches],\n ...(theme.value === appVisualTheme() ? { detail: message('preferences.appTheme') } : {}),\n }))}\n />\n </Row>\n )}\n {visualThemesOffered() && visualPaletteOptions().length > 1 && (\n <Row label={message('preferences.palette')} hint={message('preferences.paletteHint')}>\n <Dropdown\n ariaLabel={message('preferences.palette')}\n value={visualPaletteChoice()}\n onChange={(v) => after(() => setVisualPalette(v))}\n items={visualPaletteOptions().map((palette) => ({ ...palette, swatches: [...palette.swatches] }))}\n />\n </Row>\n )}\n {/* A dark-only theme has no light to choose (theme.js shows dark whatever is stored): the pick is shown as what it is. */}\n <Row label={message('preferences.colorMode')} hint={darkOnly ? message('preferences.colorModeDarkOnly') : undefined}>\n <Dropdown\n ariaLabel={message('preferences.colorMode')}\n disabled={darkOnly}\n value={darkOnly ? 'dark' : themeChoice()}\n onChange={(v) => after(() => setTheme(v))}\n items={[\n { value: 'system', label: message('preferences.system') },\n { value: 'light', label: message('preferences.light') },\n { value: 'dark', label: message('preferences.dark') },\n ]}\n />\n </Row>\n <Row label={message('preferences.density')}>\n <Dropdown\n ariaLabel={message('preferences.density')}\n value={densityChoice() as string}\n onChange={(v) => after(() => setDensity(v))}\n items={[\n { value: 'comfortable', label: message('preferences.comfortable'), detail: message('preferences.defaultHint') },\n { value: 'spacious', label: message('preferences.spacious'), detail: message('preferences.spaciousHint') },\n { value: 'compact', label: message('preferences.compact'), detail: message('preferences.compactHint') },\n ]}\n />\n </Row>\n <Row label={message('preferences.typography')}>\n <Dropdown\n ariaLabel={message('preferences.typography')}\n value={typographyPreference() as string}\n onChange={(v) => after(() => setTypography(v))}\n items={[\n { value: 'default', label: message('preferences.appDefault') },\n { value: 'mono', label: message('preferences.mono'), detail: message('preferences.monoHint') },\n { value: 'sans', label: message('preferences.sans'), detail: message('preferences.sansHint') },\n ]}\n />\n </Row>\n <Row label={message('preferences.rowsPerList')} hint={message('preferences.rowsPerListHint')}>\n <Dropdown\n ariaLabel={message('preferences.rowsPerList')}\n value={String(pageSize())}\n onChange={(v) =>\n after(() => {\n setPageSize(Number(v));\n render();\n })\n }\n items={(PAGE_SIZES as number[]).map((n) => ({ value: String(n), label: String(n) }))}\n />\n </Row>\n <Row label={message('preferences.rowsPerRelatedList')} hint={message('preferences.rowsPerRelatedListHint')}>\n <Dropdown\n ariaLabel={message('preferences.rowsPerRelatedList')}\n value={String(related)}\n onChange={(v) => {\n setRelatedRows(Number(v));\n render();\n }}\n items={RELATED_SIZES.map((n) => ({ value: String(n), label: String(n) }))}\n />\n </Row>\n <div className=\"prefs-foot\">\n <button type=\"button\" className=\"ghost\" onClick={() => dialog.current?.close()}>\n {message('common.close')}\n </button>\n </div>\n </Modal>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shared-B9H7_Pji.js","names":["KEY","remembered","say"],"sources":["../../../kit/src/client/typography.js","../../../kit/src/client/copy/shell/theme.ts","../../../kit/src/client/theme.js","../../../kit/src/client/copy/shell/components/Prefs.ts","../../../kit/src/client/components/Prefs.tsx"],"sourcesContent":["/**\n * What face the data wears: mono — tablewalk's own, values as things you\n * compare character by character — or sans, a reading cut where values\n * take the prose face and only true code stays code.\n *\n * A display preference like density and the theme: per person, per\n * browser, applied at boot before the first paint and again by the brand\n * pass on every connection switch. The whole\n * mechanism is one token — the stylesheet says `var(--mono)` everywhere\n * data is set, so swapping what that token resolves to re-dresses every\n * value at once, and a short carve-out list (DDL, SQL, the query\n * language) pins the surfaces that *are* code back to a real mono stack.\n */\nimport { shellBody } from './shellHost.js';\nconst KEY = 'mistri.typography';\n/** @type {'default' | 'sans' | 'mono'} */\nlet remembered = 'default';\nlet sessionOnly = false;\n\nexport function typographyPreference() {\n if (sessionOnly) return remembered;\n try {\n const value = localStorage.getItem(KEY);\n remembered = value === 'sans' || value === 'mono' ? value : 'default';\n } catch {\n /* Keep the last readable or explicitly chosen value. */\n }\n return remembered;\n}\n\nexport function applyTypography() {\n const preference = typographyPreference();\n shellBody().classList.toggle('type-sans', preference === 'sans');\n shellBody().classList.toggle('type-mono', preference === 'mono');\n}\n\n/** Default follows the app/preset; explicit faces override it. Unknown values mean mono. */\nexport function setTypography(choice) {\n remembered = choice === 'default' ? 'default' : choice === 'sans' ? 'sans' : 'mono';\n try {\n if (remembered === 'default') localStorage.removeItem(KEY);\n else localStorage.setItem(KEY, remembered);\n sessionOnly = false;\n } catch {\n // Nowhere to keep the choice is no reason to refuse it for this tab.\n sessionOnly = true;\n }\n applyTypography();\n}\n","/** What theme says, in the shell room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../messages.js';\n\nexport const say = defineMessages(\n {\n matchTheSystem: 'match the system',\n alwaysLight: 'always light',\n alwaysDark: 'always dark',\n },\n {\n /* The words a visitor sees in the shell; the rest are said in English. */\n es: {\n matchTheSystem: 'según el sistema',\n alwaysLight: 'siempre claro',\n alwaysDark: 'siempre oscuro',\n },\n },\n);\n","/**\n * Light, dark, or whatever the machine is set to.\n *\n * The palette for all three has been in style.css from early on: a full token\n * override under `@media (prefers-color-scheme: dark)`, guarded as\n * `:root:not([data-theme=\"light\"])`, and a second copy under\n * `:root[data-theme=\"dark\"]`. That guard only means anything if something can\n * stamp `data-theme`, and nothing ever did — so the dark palette was reachable\n * by changing your operating system and by no other route, and the light one\n * was unreachable from a dark machine at all.\n *\n * This is that missing piece and nothing more. It writes one attribute.\n *\n * Three states rather than two, because \"system\" is a real answer and not the\n * absence of one: a reader who has told their machine to go dark at sunset\n * means it here too, and a toggle that only remembers light-or-dark quietly\n * opts them out of that. Absent attribute *is* the system state, which is why\n * the CSS was written to key off its absence.\n */\nimport { say } from './copy/shell/theme.js';\nimport { shellRoot } from './shellHost.js';\n\nconst KEY = 'mistri.theme';\nconst ORDER = ['system', 'light', 'dark'];\n\n/* Said when asked, not when the module loads: a visitor's language arrives later. */\nconst LABEL = {\n system: () => say('matchTheSystem'),\n light: () => say('alwaysLight'),\n dark: () => say('alwaysDark'),\n};\n\nlet current = 'system';\n/** The worn theme's `scheme` (appTheme.js): `dark` is the mode a reader gets until they pick one, `dark-only` the only one. */\nlet scheme;\n\nfunction stored() {\n try {\n const raw = window.localStorage?.getItem(KEY);\n /* Validated, not trusted: this comes back from storage a stale build or a\n hand edit may have written, and an unknown value would stamp\n `data-theme=\"banana\"` — which matches no rule, so the page would render\n in the light palette while claiming to be in another one. */\n return ORDER.includes(raw) ? raw : 'system';\n } catch {\n return 'system';\n }\n}\n\n/** Whether the reader has picked a mode, \"match the system\" included: an absent key is no answer. */\nfunction remembered() {\n try {\n return ORDER.includes(window.localStorage?.getItem(KEY));\n } catch {\n return false;\n }\n}\n\n/** The mode in force for a pick: a dark theme is dark until the reader has said otherwise, a dark-only one always. */\nfunction shown(name) {\n if (scheme === 'dark-only') return 'dark';\n return scheme === 'dark' && name === 'system' && !remembered() ? 'dark' : name;\n}\n\nfunction apply(name) {\n current = ORDER.includes(name) ? name : 'system';\n const showing = shown(current);\n const root = shellRoot();\n if (showing === 'system') root.removeAttribute('data-theme');\n else root.setAttribute('data-theme', showing);\n /* Tells the browser which way to paint the things the page does not: form\n controls, scrollbars, the canvas behind an overscroll. Without it a dark\n page keeps light scrollbars. */\n root.style.colorScheme = showing === 'system' ? '' : showing;\n}\n\n/** The worn theme says it is dark (or dark only), or nothing; the page is stamped again when that changes. */\nexport function setThemeScheme(value) {\n if (value === scheme) return;\n scheme = value;\n apply(current);\n}\n\n/** Read the stored choice and put it on the page. Called once, at boot. */\nexport function initTheme() {\n apply(stored());\n}\n\n/** A mode held for this page only, never remembered: a theme bench frame (themeBench.ts) shows one mode whatever the reader picked. */\nexport function holdTheme(name) {\n apply(name);\n}\n\n/** What is in force, for a menu item that has to say so. */\nexport const themeChoice = () => current;\nexport const themeLabel = () => LABEL[current]();\n\n/** An explicit preference; System continues to follow the operating system. */\nexport function setTheme(name) {\n const pick = ORDER.includes(name) ? name : 'system';\n /* Remembered before it is applied: a dark theme answers \"match the system\" with the system only once it is asked for. */\n try {\n window.localStorage?.setItem(KEY, pick);\n } catch {\n /* A theme that cannot be remembered is still a theme for this tab. */\n }\n apply(pick);\n return current;\n}\n\nexport function effectiveTheme() {\n const showing = shown(current);\n return showing === 'system' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : showing;\n}\n\n/** A quick toggle always changes the visible palette, even when following System. */\nexport function toggleTheme() {\n return setTheme(effectiveTheme() === 'dark' ? 'light' : 'dark');\n}\n","/** What Prefs says, in the shell room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages(\n {\n english: 'English',\n notSaved: 'Your language could not be saved to your profile. It is kept in this browser.',\n },\n {\n /* The words a visitor sees in the shell; the rest are said in English. */\n es: {\n notSaved: 'No se pudo guardar tu idioma en tu perfil. Se guarda en este navegador.',\n },\n },\n);\n","/**\n * Preferences: visual theme, color mode, density, typography, and list lengths. Each\n * is a dropdown over a setting that already lives somewhere else; this\n * dialog only puts them in one place.\n */\nimport { useEffect, useRef, useState, useSyncExternalStore } from 'react';\nimport { Modal, type ModalHandle } from '@mistriwork/ui/Modal.js';\nimport { api, PAGE_SIZES, pageSize, render, setPageSize, state, toast } from '../core.js';\nimport { shell } from '../shellMode.js';\nimport { ownedBy } from '../requestIdentity.js';\nimport { densityChoice, setDensity } from '../density.js';\nimport { setTypography, typographyPreference } from '../typography.js';\nimport {\n setVisualPalette,\n visualPaletteChoice,\n visualPaletteOptions,\n appVisualTheme,\n readerOverridesAppTheme,\n resetVisualTheme,\n setVisualTheme,\n visualThemeChoice,\n visualThemeOptions,\n visualThemeScheme,\n visualThemesOffered,\n VISUAL_THEME_EVENT,\n VISUAL_THEME_REGISTRY_EVENT,\n} from '../visualTheme.js';\nimport { setTheme, themeChoice } from '../theme.js';\nimport { message, messageLanguage, offeredLanguages, servedLanguage, setMessageLanguage, subscribeMessages } from '../messages.js';\nimport { Dropdown } from './Dropdown.js';\nimport { RELATED_SIZES, relatedRows, setRelatedRows, subscribeRelatedRows } from '../relatedRows.js';\nimport { say } from '../copy/shell/components/Prefs.js';\nimport { addHostListener, removeHostListener } from '../shellHost.js';\n\nfunction Row({ label, hint, action, children }: { label: string; hint?: string; action?: React.ReactNode; children: React.ReactNode }) {\n return (\n <div className=\"prefs-row\">\n <div className=\"prefs-name\">\n <span>{label}</span>\n {hint ? <span className=\"prefs-hint\">{hint}</span> : null}\n {action}\n </div>\n {children}\n </div>\n );\n}\n\n/** A language as it calls itself: \"Español\", \"English\", \"Português (Brasil)\". */\nfunction ownName(tag: string): string {\n try {\n const name = new Intl.DisplayNames([tag], { type: 'language' }).of(tag) ?? tag;\n return name.charAt(0).toLocaleUpperCase(tag) + name.slice(1);\n } catch {\n return tag;\n }\n}\n\n/**\n * The language picker. Where the App has words in several languages the\n * server says them, so the pick is one of the App's (written to the reader's\n * row where `ui.locale` names a column of it, and kept in this browser either\n * way); anywhere else it is the framework's own, kept in this browser.\n */\nfunction LanguageRow({ language }: { language: string }) {\n const offered = offeredLanguages();\n const row = (shell().app()?.ui as { localeRow?: { table: string; key: Record<string, string | number>; column: string } } | undefined)\n ?.localeRow;\n const served = servedLanguage();\n const value = offered.length\n ? (offered.find((tag) => tag === served) ?? offered.find((tag) => served?.split('-')[0] === tag.split('-')[0]) ?? offered[0])\n : language;\n const pick = async (tag: string) => {\n if (offered.length && row) {\n try {\n const reply = (await api('/api/update', {\n ...ownedBy(state.activeConnection),\n table: row.table,\n key: row.key,\n values: { [row.column]: tag },\n })) as { errors?: Array<{ message?: string }> };\n if (reply?.errors?.length) throw new Error(reply.errors[0]?.message ?? say('notSaved'));\n } catch (error) {\n /* Still this browser's: the pick stands here, and the reader is told it did not reach their profile. */\n toast((error as Error).message || say('notSaved'), 'error');\n }\n }\n await setMessageLanguage(tag);\n };\n return (\n <Row label={message('preferences.language')} hint={message(row ? 'preferences.languageHintPerson' : 'preferences.languageHint')}>\n <Dropdown\n ariaLabel={message('preferences.language')}\n value={value}\n onChange={(tag) => void pick(tag)}\n items={\n offered.length\n ? offered.map((tag) => ({ value: tag, label: ownName(tag) }))\n : [\n { value: 'en', label: say('english') },\n { value: 'es', label: ownName('es') },\n ]\n }\n />\n </Row>\n );\n}\n\nexport function PrefsDialog({ onClose }: { onClose: () => void }) {\n const dialog = useRef<ModalHandle>(null);\n const language = useSyncExternalStore(subscribeMessages, messageLanguage, messageLanguage);\n const related = useSyncExternalStore(subscribeRelatedRows, relatedRows);\n /* The choices live in their stores; a pick writes there and this looks\n again, so the picker shows what was just chosen rather than what it\n opened on. */\n const [, look] = useState(0);\n useEffect(() => {\n const refresh = () => look((n) => n + 1);\n addHostListener(window, VISUAL_THEME_REGISTRY_EVENT, refresh);\n addHostListener(window, VISUAL_THEME_EVENT, refresh);\n return () => {\n removeHostListener(window, VISUAL_THEME_REGISTRY_EVENT, refresh);\n removeHostListener(window, VISUAL_THEME_EVENT, refresh);\n };\n }, []);\n const after = (write: () => void) => {\n write();\n look((n) => n + 1);\n };\n const darkOnly = visualThemeScheme() === 'dark-only';\n /* Which of a suite's Apps opens first is the App framework's (SuiteAppPreference.tsx), drawn through the shell's slot. */\n const { SuitePreference } = shell().slots;\n return (\n <Modal className=\"prefs\" ref={dialog} onClose={onClose} ariaLabel={message('preferences.title')}>\n <h2 className=\"prefs-title\">{message('preferences.title')}</h2>\n {SuitePreference && <SuitePreference />}\n <LanguageRow language={language} />\n {/* Workbench picks its own look; an App may lock its authored branding. */}\n {visualThemesOffered() && (\n <Row\n label={message('preferences.visualTheme')}\n action={\n readerOverridesAppTheme() ? (\n <button type=\"button\" className=\"prefs-reset\" onClick={() => after(resetVisualTheme)}>\n {message('preferences.resetTheme')}\n </button>\n ) : null\n }\n >\n <Dropdown\n ariaLabel={message('preferences.visualTheme')}\n value={visualThemeChoice()}\n onChange={(v) => after(() => setVisualTheme(v))}\n items={visualThemeOptions().map((theme) => ({\n ...theme,\n swatches: [...theme.swatches],\n ...(theme.value === appVisualTheme() ? { detail: message('preferences.appTheme') } : {}),\n }))}\n />\n </Row>\n )}\n {visualThemesOffered() && visualPaletteOptions().length > 1 && (\n <Row label={message('preferences.palette')} hint={message('preferences.paletteHint')}>\n <Dropdown\n ariaLabel={message('preferences.palette')}\n value={visualPaletteChoice()}\n onChange={(v) => after(() => setVisualPalette(v))}\n items={visualPaletteOptions().map((palette) => ({ ...palette, swatches: [...palette.swatches] }))}\n />\n </Row>\n )}\n {/* A dark-only theme has no light to choose (theme.js shows dark whatever is stored): the pick is shown as what it is. */}\n <Row label={message('preferences.colorMode')} hint={darkOnly ? message('preferences.colorModeDarkOnly') : undefined}>\n <Dropdown\n ariaLabel={message('preferences.colorMode')}\n disabled={darkOnly}\n value={darkOnly ? 'dark' : themeChoice()}\n onChange={(v) => after(() => setTheme(v))}\n items={[\n { value: 'system', label: message('preferences.system') },\n { value: 'light', label: message('preferences.light') },\n { value: 'dark', label: message('preferences.dark') },\n ]}\n />\n </Row>\n <Row label={message('preferences.density')}>\n <Dropdown\n ariaLabel={message('preferences.density')}\n value={densityChoice() as string}\n onChange={(v) => after(() => setDensity(v))}\n items={[\n { value: 'comfortable', label: message('preferences.comfortable'), detail: message('preferences.defaultHint') },\n { value: 'spacious', label: message('preferences.spacious'), detail: message('preferences.spaciousHint') },\n { value: 'compact', label: message('preferences.compact'), detail: message('preferences.compactHint') },\n ]}\n />\n </Row>\n <Row label={message('preferences.typography')}>\n <Dropdown\n ariaLabel={message('preferences.typography')}\n value={typographyPreference() as string}\n onChange={(v) => after(() => setTypography(v))}\n items={[\n { value: 'default', label: message('preferences.appDefault') },\n { value: 'mono', label: message('preferences.mono'), detail: message('preferences.monoHint') },\n { value: 'sans', label: message('preferences.sans'), detail: message('preferences.sansHint') },\n ]}\n />\n </Row>\n <Row label={message('preferences.rowsPerList')} hint={message('preferences.rowsPerListHint')}>\n <Dropdown\n ariaLabel={message('preferences.rowsPerList')}\n value={String(pageSize())}\n onChange={(v) =>\n after(() => {\n setPageSize(Number(v));\n render();\n })\n }\n items={(PAGE_SIZES as number[]).map((n) => ({ value: String(n), label: String(n) }))}\n />\n </Row>\n <Row label={message('preferences.rowsPerRelatedList')} hint={message('preferences.rowsPerRelatedListHint')}>\n <Dropdown\n ariaLabel={message('preferences.rowsPerRelatedList')}\n value={String(related)}\n onChange={(v) => {\n setRelatedRows(Number(v));\n render();\n }}\n items={RELATED_SIZES.map((n) => ({ value: String(n), label: String(n) }))}\n />\n </Row>\n <div className=\"prefs-foot\">\n <button type=\"button\" className=\"ghost\" onClick={() => dialog.current?.close()}>\n {message('common.close')}\n </button>\n </div>\n </Modal>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Z as Empty, at as useBaseQuery, it as useQuery, mt as QueryObserver } from "./shared-poc11xxo.js";
|
|
2
2
|
import { Wt as formatDateTime, gt as defineMessages, on as hasNextPage, sn as hasPreviousPage, ut as humanName } from "./shared-DJZjSi3J.js";
|
|
3
|
-
import { T as recordLabel, c as columnLabel, d as findTable, j as rowLabel, m as labelPath } from "./shared-
|
|
4
|
-
import { f as Value, g as pageBridge } from "./shared-
|
|
5
|
-
import { s as historyBody } from "./shared-
|
|
3
|
+
import { T as recordLabel, c as columnLabel, d as findTable, j as rowLabel, m as labelPath } from "./shared-BoLbc2WD.js";
|
|
4
|
+
import { f as Value, g as pageBridge } from "./shared-Chp88all.js";
|
|
5
|
+
import { s as historyBody } from "./shared-CZJE4Bmp.js";
|
|
6
6
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
7
7
|
// node_modules/@tanstack/query-core/build/modern/infiniteQueryObserver.js
|
|
8
8
|
var InfiniteQueryObserver = class extends QueryObserver {
|
|
@@ -304,4 +304,4 @@ function HistoryFieldRow({ field, kind, base, names }) {
|
|
|
304
304
|
}
|
|
305
305
|
export { RecordHistory, whatWrote, whoWrote };
|
|
306
306
|
|
|
307
|
-
//# sourceMappingURL=shared-
|
|
307
|
+
//# sourceMappingURL=shared-BAXr20S-.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-Q2bgBaYo.js","names":["_Fragment"],"sources":["../../../../node_modules/@tanstack/query-core/build/modern/infiniteQueryObserver.js","../../../../node_modules/@tanstack/react-query/build/modern/useInfiniteQuery.js","../../../kit/src/client/copy/record/components/PageHistory.ts","../../../kit/src/client/components/PageHistory.tsx"],"sourcesContent":[null,null,"/** What PageHistory 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 anAgent: 'An agent',\n aPublicForm: 'A public form',\n theWorkbench: 'The Workbench',\n theApi: 'The API',\n theSystem: 'The system',\n someone: 'Someone',\n created: 'Created',\n edited: 'Edited',\n changesToThisRecord: 'Changes to this record appear here.',\n noChangesRecordedYet: 'No changes recorded yet.',\n eachChangeToThisRecord: 'Each change to this record from now on is listed here, with who made it.',\n showEarlierChanges: 'Show earlier changes',\n changed: 'changed',\n to: 'to',\n keptShortenedInTheHistory: 'Kept shortened in the history',\n shortened: '(shortened)',\n});\n","/**\n * A page's history section: the record's own changes, newest first, one\n * entry per write — who made it, when, the action or command it came from,\n * and each field from what to what, in the App's words.\n *\n * The server answers for this reader (server/recordHistory.ts): a field\n * their grant does not read, or one the App's `audit.redact` names, comes\n * back as \"changed\" with no values, and a record they cannot read has no\n * history for them at all. This module only says what it was handed.\n *\n * A reference is said by its record's name, read through the reader's own\n * `/api/query` as a picker's chosen value is, so a name they cannot read\n * stays the key it was stored as — never a name the history kept, since it\n * keeps none.\n *\n * The page hands it its reads and its frame (PageSections.tsx) rather than\n * this module importing the page's: a section reaching back into the page\n * would join the page's import cycle, which is only allowed to shrink.\n */\nimport type { ReactNode } from 'react';\nimport { historyBody } from '@mistriwork/engine/shared/recordReads.js';\nimport { DEFAULT_HISTORY_LIMIT } from '@mistriwork/engine/shared/pageModel.js';\nimport { useInfiniteQuery, useQuery } from '@tanstack/react-query';\nimport { columnLabel, findTable, labelPath, recordLabel, rowLabel } from '../core.js';\nimport { formatDateTime } from '../locale.js';\nimport { humanName } from '@mistriwork/engine/shared/model.js';\nimport { LABEL_SEGMENT } from '@mistriwork/engine/shared/recordLabel.js';\nimport type { ColumnMeta, TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport type { PageSection } from './pageModel.js';\nimport { Empty } from './Notes.js';\nimport { Value } from './Value.js';\nimport { say } from '../copy/record/components/PageHistory.js';\nimport { pageBridge } from '../uiBridge.js';\nimport type { ServedMachine } from '@mistriwork/engine/shared/servedApp.js';\n\n/* The machine of the record's resource, when it has one: its state's words, and its column leads a change. */\nconst machineOf = (tableId: string): ServedMachine | undefined =>\n (pageBridge.activeApp() as { resources?: Record<string, { machine?: ServedMachine }> } | null)?.resources?.[tableId]?.machine;\n\ntype Scalar = string | number | boolean | null;\nexport interface HistoryField {\n column: string;\n before?: Scalar;\n after?: Scalar;\n hidden?: true;\n redacted?: true;\n cut?: true;\n label?: string;\n}\nexport interface HistoryEntry {\n at: string;\n kind: 'insert' | 'update';\n via: 'app' | 'workbench' | 'agent' | 'api' | 'form' | 'system';\n action?: string;\n /** The writer's name when they wrote; never an email. */ by?: string;\n fields: HistoryField[];\n}\ninterface HistoryPage {\n entries: HistoryEntry[];\n more?: number;\n}\n/** A read through the page's connection, as `usePageApi` makes one. */\nexport type HistoryApi = (path: string, body: Record<string, unknown>) => Promise<unknown>;\ninterface HistoryProps {\n section: PageSection;\n base: TableMeta;\n recordKey: Record<string, unknown>;\n api: HistoryApi;\n /** An authoring preview has no record to read: the section shows its shape. */\n preview?: boolean;\n /** The section's frame: its heading around `body`, or its heading and a problem where the read failed. */\n frame: (body: ReactNode, broken?: string) => ReactNode;\n /** What stands in the section while the first read is out. */\n loading: ReactNode;\n}\n\n/** Who made a write, as a person reads it: their name when they wrote, else the door it came through.\n Never an address: the server sends none, and a name that reads as one is not said either. */\nexport function whoWrote(entry: Pick<HistoryEntry, 'by' | 'via'>): string {\n if (entry.by && !/[^\\s@]+@[^\\s@]+\\.[^\\s@]+/.test(entry.by)) return entry.by;\n switch (entry.via) {\n case 'agent':\n return say('anAgent');\n case 'form':\n return say('aPublicForm');\n case 'workbench':\n return say('theWorkbench');\n case 'api':\n return say('theApi');\n case 'system':\n return say('theSystem');\n default:\n return say('someone');\n }\n}\n\n/** What a write did, in a word: the action or command by its label, else what any write is. */\nexport const whatWrote = (entry: Pick<HistoryEntry, 'action' | 'kind'>): string =>\n entry.action ?? (entry.kind === 'insert' ? say('created') : say('edited'));\n\n/* The names of the records a page's references point at, read as the\n reader: one query per referenced table, the values it holds. */\nfunction useReferenceNames(api: HistoryApi, base: TableMeta, entries: readonly HistoryEntry[]) {\n const wanted = new Map<string, { target: TableMeta; column: string; values: Set<string> }>();\n for (const entry of entries) {\n for (const field of entry.fields) {\n const col = base.columns.find((c) => c.name === field.column);\n const target = col?.references && (findTable(col.references.table) as TableMeta | undefined);\n if (!col?.references || !target) continue;\n const known = wanted.get(field.column) ?? { target, column: col.references.column, values: new Set<string>() };\n for (const value of [field.before, field.after]) if (value !== null && value !== undefined) known.values.add(String(value));\n wanted.set(field.column, known);\n }\n }\n const asks = [...wanted]\n .map(([column, ask]) => ({ column, table: ask.target.id, valueColumn: ask.column, ids: [...ask.values].sort() }))\n .filter((ask) => ask.ids.length);\n return useQuery({\n queryKey: ['page-history-names', base.id, asks],\n enabled: asks.length > 0,\n queryFn: async () => {\n const names = new Map<string, Map<string, string>>();\n await Promise.all(\n asks.map(async (ask) => {\n const table = findTable(ask.table) as TableMeta;\n const naming = labelPath(table) ?? ask.valueColumn;\n const columns = [...new Set([ask.valueColumn, naming, ...table.columns.filter((c) => c.primaryKey).map((c) => c.name)])];\n try {\n /* A path, or a name the catalog computes (a template's `$label`), is\n read where it is computed: a view. A plain read has no such\n column, and in a tenant App asking it for one was answered as a\n refused context, which ended the session. */\n const data =\n naming.includes('.') || naming === LABEL_SEGMENT\n ? await api('/api/view/run', {\n view: {\n id: `history:${table.id}`,\n name: '',\n base: table.id,\n columns: columns.map((path) => ({ path })),\n filter: { groups: [[{ path: ask.valueColumn, op: 'in', value: ask.ids }]] },\n limit: ask.ids.length,\n },\n })\n : await api('/api/query', {\n table: table.id,\n columns,\n filter: { groups: [[{ column: ask.valueColumn, op: 'in', value: ask.ids }]] },\n limit: ask.ids.length,\n offset: 0,\n });\n const rows = (data as { rows?: Array<Record<string, unknown>> }).rows ?? [];\n names.set(\n ask.column,\n new Map(\n rows.map((row) => [\n String(row[ask.valueColumn]),\n recordLabel(table) === undefined ? String(row[naming] ?? row[ask.valueColumn]) : rowLabel(table, row),\n ]),\n ),\n );\n } catch {\n /* A table the reader cannot read keeps its keys: the history is still true without the names. */\n }\n }),\n );\n return names;\n },\n staleTime: 60_000,\n }).data;\n}\n\n/** The record's own change history, newest first, with \"Show earlier changes\" while the store holds more. */\nexport function RecordHistory({ section, base, recordKey, api, preview, frame, loading }: HistoryProps) {\n const limit = section.limit ?? DEFAULT_HISTORY_LIMIT;\n const history = useInfiniteQuery({\n queryKey: ['page-history', base.id, recordKey, limit],\n initialPageParam: undefined as number | undefined,\n /* Its first page as the server asks it for the page's compose (shared/recordReads.ts). */\n queryFn: async ({ pageParam }) =>\n (await api('/api/record-history', {\n ...historyBody(base, recordKey, limit),\n ...(pageParam === undefined ? {} : { before: pageParam }),\n })) as HistoryPage,\n getNextPageParam: (last: HistoryPage) => last.more,\n enabled: !preview,\n staleTime: 0,\n });\n const entries = history.data?.pages.flatMap((page) => page.entries) ?? [];\n const names = useReferenceNames(api, base, entries);\n if (preview) return frame(<Empty text={say('changesToThisRecord')} />);\n if (history.isPending) return loading;\n if (history.isError) return frame(null, (history.error as Error).message);\n if (!entries.length) return frame(<Empty text={say('noChangesRecordedYet')} detail={say('eachChangeToThisRecord')} />);\n return frame(\n <>\n <ol className=\"history\">\n {entries.map((entry, i) => (\n <HistoryItem key={`${entry.at}-${i}`} entry={entry} base={base} names={names} />\n ))}\n </ol>\n {history.hasNextPage && (\n <div className=\"history-more\">\n <button type=\"button\" className=\"ghost\" disabled={history.isFetchingNextPage} onClick={() => void history.fetchNextPage()}>\n {history.isFetchingNextPage ? say('common.loading') : say('showEarlierChanges')}\n </button>\n </div>\n )}\n </>,\n );\n}\n\nfunction HistoryItem({ entry, base, names }: { entry: HistoryEntry; base: TableMeta; names?: Map<string, Map<string, string>> }) {\n const when = new Date(entry.at);\n const said = Number.isNaN(when.getTime()) ? entry.at : formatDateTime(when);\n return (\n <li className=\"history-entry\">\n <div className=\"history-head\">\n <span className=\"history-by\">{whoWrote(entry)}</span>\n <span className=\"history-what\">{whatWrote(entry)}</span>\n <time className=\"history-when\" dateTime={entry.at} title={entry.at}>\n {said}\n </time>\n </div>\n {entry.fields.length > 0 && (\n <dl className=\"history-fields\">\n {/* A move of the record's state reads first: \"Submitted → Approved\", by whom above. */}\n {[...entry.fields]\n .sort((a, b) => Number(b.column === machineOf(base.id)?.column) - Number(a.column === machineOf(base.id)?.column))\n .map((field) => (\n <HistoryFieldRow key={field.column} field={field} kind={entry.kind} base={base} names={names?.get(field.column)} />\n ))}\n </dl>\n )}\n </li>\n );\n}\n\nfunction HistoryFieldRow({\n field,\n kind,\n base,\n names,\n}: {\n field: HistoryField;\n kind: HistoryEntry['kind'];\n base: TableMeta;\n names?: Map<string, string>;\n}) {\n const col = base.columns.find((c) => c.name === field.column) as ColumnMeta | undefined;\n const caption = (columnLabel(base.id, field.column) as string | null) ?? field.label ?? humanName(field.column);\n const machine = machineOf(base.id);\n const draw = (value: Scalar | undefined): ReactNode => {\n const name = value !== null && value !== undefined ? names?.get(String(value)) : undefined;\n if (name !== undefined) return <span title={String(value)}>{name}</span>;\n const state = machine?.column === field.column ? machine.states.find((entry) => entry.value === String(value)) : undefined;\n if (state) return <span title={state.value}>{state.label}</span>;\n return <Value col={col} value={value ?? null} tableId={base.id} compact />;\n };\n let change: ReactNode;\n if (field.hidden || field.redacted) change = <span className=\"history-changed\">{say('changed')}</span>;\n else if (kind === 'insert' || !Object.hasOwn(field, 'before')) change = <span className=\"history-after\">{draw(field.after)}</span>;\n else {\n change = (\n <>\n <span className=\"history-before\">{draw(field.before)}</span>\n <span className=\"history-arrow\" aria-label={say('to')}>\n →\n </span>\n <span className=\"history-after\">{draw(field.after)}</span>\n </>\n );\n }\n return (\n <div className=\"history-field\">\n <dt>{caption}</dt>\n <dd>\n {change}\n {field.cut && (\n <span className=\"history-cut\" title={say('keptShortenedInTheHistory')}>\n {' '}\n {say('shortened')}\n </span>\n )}\n </dd>\n </div>\n );\n}\n"],"ignoreList":[0,1],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shared-BAXr20S-.js","names":["_Fragment"],"sources":["../../../../node_modules/@tanstack/query-core/build/modern/infiniteQueryObserver.js","../../../../node_modules/@tanstack/react-query/build/modern/useInfiniteQuery.js","../../../kit/src/client/copy/record/components/PageHistory.ts","../../../kit/src/client/components/PageHistory.tsx"],"sourcesContent":[null,null,"/** What PageHistory 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 anAgent: 'An agent',\n aPublicForm: 'A public form',\n theWorkbench: 'The Workbench',\n theApi: 'The API',\n theSystem: 'The system',\n someone: 'Someone',\n created: 'Created',\n edited: 'Edited',\n changesToThisRecord: 'Changes to this record appear here.',\n noChangesRecordedYet: 'No changes recorded yet.',\n eachChangeToThisRecord: 'Each change to this record from now on is listed here, with who made it.',\n showEarlierChanges: 'Show earlier changes',\n changed: 'changed',\n to: 'to',\n keptShortenedInTheHistory: 'Kept shortened in the history',\n shortened: '(shortened)',\n});\n","/**\n * A page's history section: the record's own changes, newest first, one\n * entry per write — who made it, when, the action or command it came from,\n * and each field from what to what, in the App's words.\n *\n * The server answers for this reader (server/recordHistory.ts): a field\n * their grant does not read, or one the App's `audit.redact` names, comes\n * back as \"changed\" with no values, and a record they cannot read has no\n * history for them at all. This module only says what it was handed.\n *\n * A reference is said by its record's name, read through the reader's own\n * `/api/query` as a picker's chosen value is, so a name they cannot read\n * stays the key it was stored as — never a name the history kept, since it\n * keeps none.\n *\n * The page hands it its reads and its frame (PageSections.tsx) rather than\n * this module importing the page's: a section reaching back into the page\n * would join the page's import cycle, which is only allowed to shrink.\n */\nimport type { ReactNode } from 'react';\nimport { historyBody } from '@mistriwork/engine/shared/recordReads.js';\nimport { DEFAULT_HISTORY_LIMIT } from '@mistriwork/engine/shared/pageModel.js';\nimport { useInfiniteQuery, useQuery } from '@tanstack/react-query';\nimport { columnLabel, findTable, labelPath, recordLabel, rowLabel } from '../core.js';\nimport { formatDateTime } from '../locale.js';\nimport { humanName } from '@mistriwork/engine/shared/model.js';\nimport { LABEL_SEGMENT } from '@mistriwork/engine/shared/recordLabel.js';\nimport type { ColumnMeta, TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport type { PageSection } from './pageModel.js';\nimport { Empty } from './Notes.js';\nimport { Value } from './Value.js';\nimport { say } from '../copy/record/components/PageHistory.js';\nimport { pageBridge } from '../uiBridge.js';\nimport type { ServedMachine } from '@mistriwork/engine/shared/servedApp.js';\n\n/* The machine of the record's resource, when it has one: its state's words, and its column leads a change. */\nconst machineOf = (tableId: string): ServedMachine | undefined =>\n (pageBridge.activeApp() as { resources?: Record<string, { machine?: ServedMachine }> } | null)?.resources?.[tableId]?.machine;\n\ntype Scalar = string | number | boolean | null;\nexport interface HistoryField {\n column: string;\n before?: Scalar;\n after?: Scalar;\n hidden?: true;\n redacted?: true;\n cut?: true;\n label?: string;\n}\nexport interface HistoryEntry {\n at: string;\n kind: 'insert' | 'update';\n via: 'app' | 'workbench' | 'agent' | 'api' | 'form' | 'system';\n action?: string;\n /** The writer's name when they wrote; never an email. */ by?: string;\n fields: HistoryField[];\n}\ninterface HistoryPage {\n entries: HistoryEntry[];\n more?: number;\n}\n/** A read through the page's connection, as `usePageApi` makes one. */\nexport type HistoryApi = (path: string, body: Record<string, unknown>) => Promise<unknown>;\ninterface HistoryProps {\n section: PageSection;\n base: TableMeta;\n recordKey: Record<string, unknown>;\n api: HistoryApi;\n /** An authoring preview has no record to read: the section shows its shape. */\n preview?: boolean;\n /** The section's frame: its heading around `body`, or its heading and a problem where the read failed. */\n frame: (body: ReactNode, broken?: string) => ReactNode;\n /** What stands in the section while the first read is out. */\n loading: ReactNode;\n}\n\n/** Who made a write, as a person reads it: their name when they wrote, else the door it came through.\n Never an address: the server sends none, and a name that reads as one is not said either. */\nexport function whoWrote(entry: Pick<HistoryEntry, 'by' | 'via'>): string {\n if (entry.by && !/[^\\s@]+@[^\\s@]+\\.[^\\s@]+/.test(entry.by)) return entry.by;\n switch (entry.via) {\n case 'agent':\n return say('anAgent');\n case 'form':\n return say('aPublicForm');\n case 'workbench':\n return say('theWorkbench');\n case 'api':\n return say('theApi');\n case 'system':\n return say('theSystem');\n default:\n return say('someone');\n }\n}\n\n/** What a write did, in a word: the action or command by its label, else what any write is. */\nexport const whatWrote = (entry: Pick<HistoryEntry, 'action' | 'kind'>): string =>\n entry.action ?? (entry.kind === 'insert' ? say('created') : say('edited'));\n\n/* The names of the records a page's references point at, read as the\n reader: one query per referenced table, the values it holds. */\nfunction useReferenceNames(api: HistoryApi, base: TableMeta, entries: readonly HistoryEntry[]) {\n const wanted = new Map<string, { target: TableMeta; column: string; values: Set<string> }>();\n for (const entry of entries) {\n for (const field of entry.fields) {\n const col = base.columns.find((c) => c.name === field.column);\n const target = col?.references && (findTable(col.references.table) as TableMeta | undefined);\n if (!col?.references || !target) continue;\n const known = wanted.get(field.column) ?? { target, column: col.references.column, values: new Set<string>() };\n for (const value of [field.before, field.after]) if (value !== null && value !== undefined) known.values.add(String(value));\n wanted.set(field.column, known);\n }\n }\n const asks = [...wanted]\n .map(([column, ask]) => ({ column, table: ask.target.id, valueColumn: ask.column, ids: [...ask.values].sort() }))\n .filter((ask) => ask.ids.length);\n return useQuery({\n queryKey: ['page-history-names', base.id, asks],\n enabled: asks.length > 0,\n queryFn: async () => {\n const names = new Map<string, Map<string, string>>();\n await Promise.all(\n asks.map(async (ask) => {\n const table = findTable(ask.table) as TableMeta;\n const naming = labelPath(table) ?? ask.valueColumn;\n const columns = [...new Set([ask.valueColumn, naming, ...table.columns.filter((c) => c.primaryKey).map((c) => c.name)])];\n try {\n /* A path, or a name the catalog computes (a template's `$label`), is\n read where it is computed: a view. A plain read has no such\n column, and in a tenant App asking it for one was answered as a\n refused context, which ended the session. */\n const data =\n naming.includes('.') || naming === LABEL_SEGMENT\n ? await api('/api/view/run', {\n view: {\n id: `history:${table.id}`,\n name: '',\n base: table.id,\n columns: columns.map((path) => ({ path })),\n filter: { groups: [[{ path: ask.valueColumn, op: 'in', value: ask.ids }]] },\n limit: ask.ids.length,\n },\n })\n : await api('/api/query', {\n table: table.id,\n columns,\n filter: { groups: [[{ column: ask.valueColumn, op: 'in', value: ask.ids }]] },\n limit: ask.ids.length,\n offset: 0,\n });\n const rows = (data as { rows?: Array<Record<string, unknown>> }).rows ?? [];\n names.set(\n ask.column,\n new Map(\n rows.map((row) => [\n String(row[ask.valueColumn]),\n recordLabel(table) === undefined ? String(row[naming] ?? row[ask.valueColumn]) : rowLabel(table, row),\n ]),\n ),\n );\n } catch {\n /* A table the reader cannot read keeps its keys: the history is still true without the names. */\n }\n }),\n );\n return names;\n },\n staleTime: 60_000,\n }).data;\n}\n\n/** The record's own change history, newest first, with \"Show earlier changes\" while the store holds more. */\nexport function RecordHistory({ section, base, recordKey, api, preview, frame, loading }: HistoryProps) {\n const limit = section.limit ?? DEFAULT_HISTORY_LIMIT;\n const history = useInfiniteQuery({\n queryKey: ['page-history', base.id, recordKey, limit],\n initialPageParam: undefined as number | undefined,\n /* Its first page as the server asks it for the page's compose (shared/recordReads.ts). */\n queryFn: async ({ pageParam }) =>\n (await api('/api/record-history', {\n ...historyBody(base, recordKey, limit),\n ...(pageParam === undefined ? {} : { before: pageParam }),\n })) as HistoryPage,\n getNextPageParam: (last: HistoryPage) => last.more,\n enabled: !preview,\n staleTime: 0,\n });\n const entries = history.data?.pages.flatMap((page) => page.entries) ?? [];\n const names = useReferenceNames(api, base, entries);\n if (preview) return frame(<Empty text={say('changesToThisRecord')} />);\n if (history.isPending) return loading;\n if (history.isError) return frame(null, (history.error as Error).message);\n if (!entries.length) return frame(<Empty text={say('noChangesRecordedYet')} detail={say('eachChangeToThisRecord')} />);\n return frame(\n <>\n <ol className=\"history\">\n {entries.map((entry, i) => (\n <HistoryItem key={`${entry.at}-${i}`} entry={entry} base={base} names={names} />\n ))}\n </ol>\n {history.hasNextPage && (\n <div className=\"history-more\">\n <button type=\"button\" className=\"ghost\" disabled={history.isFetchingNextPage} onClick={() => void history.fetchNextPage()}>\n {history.isFetchingNextPage ? say('common.loading') : say('showEarlierChanges')}\n </button>\n </div>\n )}\n </>,\n );\n}\n\nfunction HistoryItem({ entry, base, names }: { entry: HistoryEntry; base: TableMeta; names?: Map<string, Map<string, string>> }) {\n const when = new Date(entry.at);\n const said = Number.isNaN(when.getTime()) ? entry.at : formatDateTime(when);\n return (\n <li className=\"history-entry\">\n <div className=\"history-head\">\n <span className=\"history-by\">{whoWrote(entry)}</span>\n <span className=\"history-what\">{whatWrote(entry)}</span>\n <time className=\"history-when\" dateTime={entry.at} title={entry.at}>\n {said}\n </time>\n </div>\n {entry.fields.length > 0 && (\n <dl className=\"history-fields\">\n {/* A move of the record's state reads first: \"Submitted → Approved\", by whom above. */}\n {[...entry.fields]\n .sort((a, b) => Number(b.column === machineOf(base.id)?.column) - Number(a.column === machineOf(base.id)?.column))\n .map((field) => (\n <HistoryFieldRow key={field.column} field={field} kind={entry.kind} base={base} names={names?.get(field.column)} />\n ))}\n </dl>\n )}\n </li>\n );\n}\n\nfunction HistoryFieldRow({\n field,\n kind,\n base,\n names,\n}: {\n field: HistoryField;\n kind: HistoryEntry['kind'];\n base: TableMeta;\n names?: Map<string, string>;\n}) {\n const col = base.columns.find((c) => c.name === field.column) as ColumnMeta | undefined;\n const caption = (columnLabel(base.id, field.column) as string | null) ?? field.label ?? humanName(field.column);\n const machine = machineOf(base.id);\n const draw = (value: Scalar | undefined): ReactNode => {\n const name = value !== null && value !== undefined ? names?.get(String(value)) : undefined;\n if (name !== undefined) return <span title={String(value)}>{name}</span>;\n const state = machine?.column === field.column ? machine.states.find((entry) => entry.value === String(value)) : undefined;\n if (state) return <span title={state.value}>{state.label}</span>;\n return <Value col={col} value={value ?? null} tableId={base.id} compact />;\n };\n let change: ReactNode;\n if (field.hidden || field.redacted) change = <span className=\"history-changed\">{say('changed')}</span>;\n else if (kind === 'insert' || !Object.hasOwn(field, 'before')) change = <span className=\"history-after\">{draw(field.after)}</span>;\n else {\n change = (\n <>\n <span className=\"history-before\">{draw(field.before)}</span>\n <span className=\"history-arrow\" aria-label={say('to')}>\n →\n </span>\n <span className=\"history-after\">{draw(field.after)}</span>\n </>\n );\n }\n return (\n <div className=\"history-field\">\n <dt>{caption}</dt>\n <dd>\n {change}\n {field.cut && (\n <span className=\"history-cut\" title={say('keptShortenedInTheHistory')}>\n {' '}\n {say('shortened')}\n </span>\n )}\n </dd>\n </div>\n );\n}\n"],"ignoreList":[0,1],"mappings":"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"}
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
import { D as subscribeSessionIdentity, E as sessionIdentity, T as captureTenantLease, it as useQuery, nt as Button, w as captureSessionIdentity, x as fetchServer } from "./shared-poc11xxo.js";
|
|
2
2
|
import { At as removeHostListener, Ct as addHostListener, Kt as formatLocale, Mt as shellById, Pn as useQueryClient, Qt as formatTimezone, gt as defineMessages, kt as portalRoot, ut as humanName, wt as navFollow } from "./shared-DJZjSi3J.js";
|
|
3
3
|
import { t as useMutation } from "./shared-BSPDIjPQ.js";
|
|
4
|
-
import { L as DropItem, R as DropMenu, o as formProps, p as syncHash, ut as useQueries } from "./shared-
|
|
5
|
-
import { B as toast, L as state, U as writeAllowed, c as columnLabel, ct as scopeApiRequest, d as findTable, f as go, i as api, l as currentEntry, m as labelPath, st as ownedBy } from "./shared-
|
|
4
|
+
import { L as DropItem, R as DropMenu, o as formProps, p as syncHash, ut as useQueries } from "./shared-BHsjawAG.js";
|
|
5
|
+
import { B as toast, L as state, U as writeAllowed, c as columnLabel, ct as scopeApiRequest, d as findTable, f as go, i as api, l as currentEntry, m as labelPath, st as ownedBy } from "./shared-BoLbc2WD.js";
|
|
6
6
|
import { o as shown } from "./shared-sZ8B7ZTw.js";
|
|
7
7
|
import { Kn as viewportSize, Wn as viewportBox, t as Modal } from "./shared-CRr4kJXB.js";
|
|
8
|
-
import { t as onDemand } from "./shared-
|
|
8
|
+
import { t as onDemand } from "./shared-B-BUF9fx.js";
|
|
9
9
|
import { i as unmount, n as mount } from "./shared-C3MTHv9P.js";
|
|
10
|
-
import { c as updateAttempts, d as RefJump, f as Value, g as pageBridge, l as updateOwnerKey } from "./shared-
|
|
10
|
+
import { c as updateAttempts, d as RefJump, f as Value, g as pageBridge, l as updateOwnerKey } from "./shared-Chp88all.js";
|
|
11
11
|
import { t as commandFieldsDeep } from "./shared-Du2YAQk4.js";
|
|
12
12
|
import { n as pathEqualityFilter, r as recordKey } from "./shared-_IMKuuvy.js";
|
|
13
|
-
import { n as mayRunAny, t as grantedActionIds } from "./shared-
|
|
14
|
-
import { i as referenceProjection } from "./shared-
|
|
13
|
+
import { n as mayRunAny, t as grantedActionIds } from "./shared-eZ0SB_zm.js";
|
|
14
|
+
import { i as referenceProjection } from "./shared-C9DZtSFH.js";
|
|
15
15
|
import { i as dashViewKey, s as formViewKey, u as resourceOf } from "./shared-DpVb48sM.js";
|
|
16
|
-
import { l as rootMatches } from "./shared-
|
|
17
|
-
import { n as NewRecordDialog } from "./shared-
|
|
18
|
-
import { n as refreshAfterCommand } from "./shared-
|
|
19
|
-
import { t as activeApp } from "./shared-
|
|
20
|
-
import { t as assistantEntry } from "./shared-
|
|
21
|
-
import { r as takesSingleKeys, t as commandOperations } from "./shared-
|
|
22
|
-
import { _ as readyCommand, g as useCommandAnswers, v as sendCommand } from "./shared-
|
|
16
|
+
import { l as rootMatches } from "./shared-Bf30ZLoS.js";
|
|
17
|
+
import { n as NewRecordDialog } from "./shared-C4wSfz6k.js";
|
|
18
|
+
import { n as refreshAfterCommand } from "./shared-CdQOMD8J.js";
|
|
19
|
+
import { t as activeApp } from "./shared-DGaQZXnw.js";
|
|
20
|
+
import { t as assistantEntry } from "./shared-CiqNkoE1.js";
|
|
21
|
+
import { r as takesSingleKeys, t as commandOperations } from "./shared-Docl_0tq.js";
|
|
22
|
+
import { _ as readyCommand, g as useCommandAnswers, v as sendCommand } from "./shared-JvcI-LWp.js";
|
|
23
23
|
import { t as TENANT_HTTP_HEADERS } from "./shared-6oI9nNf0.js";
|
|
24
|
-
import { CommandForm as CommandForm$1 } from "./shared-
|
|
25
|
-
import { t as useWalk } from "./shared-
|
|
26
|
-
import "./shared-
|
|
24
|
+
import { CommandForm as CommandForm$1 } from "./shared-CBciTwm6.js";
|
|
25
|
+
import { t as useWalk } from "./shared-CSPhENq3.js";
|
|
26
|
+
import "./shared-CL3RLKDA.js";
|
|
27
27
|
import { createContext, createElement, useCallback, useContext, useEffect, useId, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
|
|
28
28
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
29
29
|
// packages/kit/src/client/components/recordKeys.ts
|
|
@@ -81,7 +81,7 @@ var say$2 = defineMessages({
|
|
|
81
81
|
* there, because a button that appears and then vanishes is worse than
|
|
82
82
|
* one that arrives late.
|
|
83
83
|
*/
|
|
84
|
-
var CommandForm = onDemand(() => import("./shared-
|
|
84
|
+
var CommandForm = onDemand(() => import("./shared-CBciTwm6.js"), "CommandForm", { quiet: true });
|
|
85
85
|
/**
|
|
86
86
|
* Who else is told when a verb drawn below this point has run, besides the
|
|
87
87
|
* toast: the assistant's conversation, whose cards and tables draw the
|
|
@@ -1394,7 +1394,7 @@ var say = defineMessages({
|
|
|
1394
1394
|
* rail. Its chunk is loaded when the trigger is first pressed
|
|
1395
1395
|
* (AssistantTrigger.tsx), or the room is first opened (Content.tsx).
|
|
1396
1396
|
*/
|
|
1397
|
-
var Dashboard = onDemand(() => import("./shared-
|
|
1397
|
+
var Dashboard = onDemand(() => import("./shared-DSUICuaJ.js").then((n) => n.t), "Dashboard");
|
|
1398
1398
|
var lastConversation = {
|
|
1399
1399
|
owner: "",
|
|
1400
1400
|
id: null
|
|
@@ -2500,4 +2500,4 @@ function Assistant({ app, record, mode, onClose, conversation: addressed }) {
|
|
|
2500
2500
|
}
|
|
2501
2501
|
export { AssistantPanel, AssistantRoom };
|
|
2502
2502
|
|
|
2503
|
-
//# sourceMappingURL=shared-
|
|
2503
|
+
//# sourceMappingURL=shared-BDDUzH-f.js.map
|