@jxsuite/studio 6.1.1 → 8.0.0
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 +5 -5
- package/dist/chunks/2020-5wtzce5g.js +4 -0
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-5tphg7xe.js +4 -0
- package/dist/chunks/add-new-flow-psym14sn.js +4 -0
- package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
- package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
- package/dist/chunks/color-area-6rbra5dy.js +4 -0
- package/dist/chunks/color-field-gy56c94g.js +4 -0
- package/dist/chunks/color-m7r1vk54.js +4 -0
- package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
- package/dist/chunks/combobox-72h32ejk.js +4 -0
- package/dist/chunks/components-r22xca09.js +4 -0
- package/dist/chunks/content-source-mmppmcyg.js +4 -0
- package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-ccd9jwsa.js +4 -0
- package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
- package/dist/chunks/extension-sections-0egb88dm.js +4 -0
- package/dist/chunks/file-ops-qnab36ek.js +4 -0
- package/dist/chunks/files-rcn56qvm.js +4 -0
- package/dist/chunks/format-host-yxz0kjjs.js +4 -0
- package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
- package/dist/chunks/grid-open-4z1g062t.js +4 -0
- package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
- package/dist/chunks/icons-63bjtbs7.js +4 -0
- package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
- package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
- package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
- package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
- package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
- package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
- package/dist/chunks/index-f0jn7nnp.js +4 -0
- package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
- package/dist/chunks/jsonMode-njkvsa02.js +13 -0
- package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
- package/dist/chunks/layers-bgyr11tr.js +4 -0
- package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
- package/dist/chunks/listbox-c421cf8c.js +4 -0
- package/dist/chunks/lit-html-v9gh687x.js +4 -0
- package/dist/chunks/media-library-sq468wts.js +4 -0
- package/dist/chunks/media-picker-shfe59pt.js +4 -0
- package/dist/chunks/menu-bdpzbfvs.js +4 -0
- package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
- package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
- package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
- package/dist/chunks/notify-kzrjr3fv.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-v77xtwv7.js +4 -0
- package/dist/chunks/platform-7v4rtd7m.js +4 -0
- package/dist/chunks/popover-b89sfej7.js +4 -0
- package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
- package/dist/chunks/publish-quick-qx2455cj.js +4 -0
- package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
- package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
- package/dist/chunks/references-9547rg5s.js +4 -0
- package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/source-control-kwktr9y6.js +4 -0
- package/dist/chunks/split-c9zfdgxf.js +4 -0
- package/dist/chunks/studio-03ct6yfv.js +9 -0
- package/dist/chunks/studio-07rcfje3.js +5 -0
- package/dist/chunks/studio-3e54qh39.js +7 -0
- package/dist/chunks/studio-3exxhz5g.js +5 -0
- package/dist/chunks/studio-3q40e3rj.js +5 -0
- package/dist/chunks/studio-3qeh9t0h.js +6 -0
- package/dist/chunks/studio-3qqjeep5.js +6 -0
- package/dist/chunks/studio-43sd2mam.js +4 -0
- package/dist/chunks/studio-4hp8pkyt.js +5 -0
- package/dist/chunks/studio-58xg6j2q.js +9 -0
- package/dist/chunks/studio-5g0rprdt.js +7 -0
- package/dist/chunks/studio-6m380wp7.js +5 -0
- package/dist/chunks/studio-80jyh1xh.js +4 -0
- package/dist/chunks/studio-83mk4bgg.js +9 -0
- package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
- package/dist/chunks/studio-8m0y2qe7.js +5 -0
- package/dist/chunks/studio-8tr6cfrc.js +5 -0
- package/dist/chunks/studio-8vcvfs7r.js +6 -0
- package/dist/chunks/studio-9tmebf0s.js +5 -0
- package/dist/chunks/studio-a2bvaptz.js +5 -0
- package/dist/chunks/studio-b7y5mr30.js +5 -0
- package/dist/chunks/studio-bavb31r0.js +5 -0
- package/dist/chunks/studio-bbe4c90a.js +5 -0
- package/dist/chunks/studio-c05wdnt3.js +5 -0
- package/dist/chunks/studio-ccv2svc6.js +5 -0
- package/dist/chunks/studio-d5grtb9e.js +16 -0
- package/dist/chunks/studio-df0baea9.js +5 -0
- package/dist/chunks/studio-dgk4dqtx.js +7 -0
- package/dist/chunks/studio-e1g64q43.js +5 -0
- package/dist/chunks/studio-ed1hp6zf.js +6 -0
- package/dist/chunks/studio-ed3xx40h.js +7 -0
- package/dist/chunks/studio-f14e1zdj.js +5 -0
- package/dist/chunks/studio-fbhxxc5f.js +5 -0
- package/dist/chunks/studio-fyh0jc96.js +5 -0
- package/dist/chunks/studio-gcxk20n7.js +5 -0
- package/dist/chunks/studio-jaaz8ce9.js +5 -0
- package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
- package/dist/chunks/studio-jsgf2q5k.js +7 -0
- package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
- package/dist/chunks/studio-k7evxqh4.js +5 -0
- package/dist/chunks/studio-kt3pjkwd.js +5 -0
- package/dist/chunks/studio-m8g16bgz.js +5 -0
- package/dist/chunks/studio-mn0476ag.js +5 -0
- package/dist/chunks/studio-mx1smyq0.js +5 -0
- package/dist/chunks/studio-n0c5h6mf.js +5 -0
- package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
- package/dist/chunks/studio-nqxqf8p2.js +4 -0
- package/dist/chunks/studio-p4nrkvqr.js +5 -0
- package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
- package/dist/chunks/studio-pgmvdv7z.js +7 -0
- package/dist/chunks/studio-ph84avkf.js +5 -0
- package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
- package/dist/chunks/studio-q0tccd43.js +5 -0
- package/dist/chunks/studio-q7rtx6zq.js +14 -0
- package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
- package/dist/chunks/studio-qmn1xc24.js +5 -0
- package/dist/chunks/studio-qwdqwkj0.js +5 -0
- package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
- package/dist/chunks/studio-rj9eamf8.js +5 -0
- package/dist/chunks/studio-rptgsk96.js +5 -0
- package/dist/chunks/studio-rthyg42z.js +928 -0
- package/dist/chunks/studio-s19tp1xr.js +5 -0
- package/dist/chunks/studio-s32578pn.js +5 -0
- package/dist/chunks/studio-svb7yyve.js +5 -0
- package/dist/chunks/studio-syreb644.js +5 -0
- package/dist/chunks/studio-tf9jryb1.js +10 -0
- package/dist/chunks/studio-tfkznv39.js +5 -0
- package/dist/chunks/studio-tft6r105.js +5 -0
- package/dist/chunks/studio-txf2kysx.js +5 -0
- package/dist/chunks/studio-v8867ddv.js +12 -0
- package/dist/chunks/studio-vxq7fcvv.js +5 -0
- package/dist/chunks/studio-w4rz9hdk.js +5 -0
- package/dist/chunks/studio-wbcjbhy1.js +9 -0
- package/dist/chunks/studio-wc649wss.js +5 -0
- package/dist/chunks/studio-wys23mxz.js +5 -0
- package/dist/chunks/studio-x1x167jh.js +5 -0
- package/dist/chunks/studio-x9hsze61.js +5 -0
- package/dist/chunks/studio-y0n7yxea.js +9 -0
- package/dist/chunks/studio-y3ahhdpx.js +5 -0
- package/dist/chunks/studio-z97c48fk.js +5 -0
- package/dist/chunks/studio-zat62m0c.js +5 -0
- package/dist/chunks/studio-zcd2e7yz.js +5 -0
- package/dist/chunks/studio-zz9qe3rw.js +64 -0
- package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
- package/dist/chunks/tabs-f5cw3tgp.js +4 -0
- package/dist/chunks/textfield-wewc8rq2.js +4 -0
- package/dist/chunks/toast-1gv0h53h.js +4 -0
- package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-yypz28gq.js +4 -0
- package/dist/chunks/tree-9xa4hm7n.js +4 -0
- package/dist/chunks/tsMode-epyfz1hv.js +14 -0
- package/dist/chunks/workspace-dz7nxfhv.js +4 -0
- package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
- package/dist/chunks/ws-client-bv552sfx.js +4 -0
- package/dist/iframe-entry.js +20 -16
- package/dist/manifest.json +77 -63
- package/dist/studio.js +106 -107
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +17 -16
- package/src/about/about-modal.ts +4 -3
- package/src/account/action-flow.ts +45 -38
- package/src/account-status.ts +7 -2
- package/src/browse/component-examples.ts +272 -0
- package/src/browse/library-commands.ts +64 -104
- package/src/browse/library-layouts.ts +270 -53
- package/src/browse/library-model.ts +194 -134
- package/src/browse/library-pane.ts +748 -440
- package/src/browse/library-preview.ts +161 -26
- package/src/browse/library-source.ts +308 -41
- package/src/browse/preview-root.ts +78 -0
- package/src/browse/preview-style.ts +155 -0
- package/src/canvas/asset-refs.ts +40 -10
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +260 -77
- package/src/canvas/canvas-origin.ts +37 -12
- package/src/canvas/canvas-page-context.ts +112 -0
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +175 -148
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +147 -61
- package/src/canvas/dialog-path.ts +9 -4
- package/src/canvas/dialog-state.ts +1 -2
- package/src/canvas/diff-marks.ts +9 -16
- package/src/canvas/diff-toolbar.ts +8 -7
- package/src/canvas/edit-width-drag.ts +4 -1
- package/src/canvas/edit-width.ts +1 -3
- package/src/canvas/iframe-channel.ts +27 -13
- package/src/canvas/iframe-drop.ts +120 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +104 -75
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +269 -158
- package/src/canvas/iframe-inline-edit.ts +49 -30
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +30 -25
- package/src/canvas/iframe-keys.ts +11 -0
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +25 -21
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +36 -21
- package/src/canvas/iframe-render.ts +84 -35
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +10 -3
- package/src/canvas/npm-modules.ts +22 -0
- package/src/canvas/path-mapping.ts +19 -12
- package/src/canvas/popover-path.ts +7 -3
- package/src/canvas/popover-state.ts +1 -2
- package/src/canvas/preview-navigate.ts +16 -0
- package/src/canvas/repeater-sources.ts +200 -0
- package/src/canvas/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +7 -2
- package/src/canvas/surface-registry.ts +27 -3
- package/src/collab/collab-commands.ts +7 -2
- package/src/collab/collab-session.ts +84 -45
- package/src/collab/collab-state.ts +4 -3
- package/src/collab/monaco-binding.ts +16 -13
- package/src/collab/monaco-cursors.ts +5 -2
- package/src/commands/app-commands.ts +16 -6
- package/src/commands/budget.ts +13 -11
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +55 -28
- package/src/commands/defaults.ts +69 -45
- package/src/commands/keymap.ts +56 -43
- package/src/commands/levels.ts +14 -8
- package/src/commands/live-context.ts +9 -7
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +22 -11
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +11 -9
- package/src/content/collection-pages.ts +412 -0
- package/src/content/content-collections.ts +270 -0
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +54 -62
- package/src/content/entry-editor.ts +137 -32
- package/src/content/entry-fields.ts +25 -8
- package/src/content/entry-inspector.ts +225 -0
- package/src/content/entry-model.ts +38 -15
- package/src/content/entry-open.ts +80 -0
- package/src/content/entry-summaries.ts +440 -0
- package/src/content/file-record-ids.ts +80 -0
- package/src/content/file-records.ts +125 -0
- package/src/content/page-summaries.ts +129 -0
- package/src/content/record-entry.ts +201 -0
- package/src/content/writing-banner.ts +177 -0
- package/src/create/add-new-commands.ts +185 -0
- package/src/create/add-new-flow.ts +1116 -0
- package/src/create/add-new.ts +1014 -0
- package/src/create/element-name.ts +121 -0
- package/src/editor/canvas-context-menu.ts +1 -2
- package/src/editor/canvas-slash-bridge.ts +3 -6
- package/src/editor/content-slice.ts +16 -14
- package/src/editor/context-menu.ts +35 -22
- package/src/editor/convert-targets.ts +30 -35
- package/src/editor/convert-to-component.ts +78 -48
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +29 -22
- package/src/editor/inline-edit-apply.ts +79 -17
- package/src/editor/inline-edit.ts +76 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-component.ts +91 -0
- package/src/editor/insert-zone-action.ts +14 -5
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +76 -42
- package/src/editor/slash-menu.ts +52 -14
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +89 -20
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +92 -41
- package/src/files/files.ts +248 -239
- package/src/files/fs-events.ts +18 -7
- package/src/files/media-meta.ts +97 -2
- package/src/files/media-paths.ts +3 -0
- package/src/files/media-types.ts +55 -0
- package/src/files/media-upload.ts +209 -52
- package/src/files/new-file-name.ts +156 -0
- package/src/files/serialize-document.ts +15 -5
- package/src/format/constraints.ts +1 -1
- package/src/format/convert-file.ts +27 -13
- package/src/format/format-choices.ts +2 -1
- package/src/format/format-host.ts +91 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +21 -11
- package/src/github/github-publish.ts +28 -23
- package/src/grid/cell-editors.ts +46 -31
- package/src/grid/cell-popovers.ts +5 -3
- package/src/grid/edit-buffer.ts +10 -9
- package/src/grid/grid-controller.ts +25 -23
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -33
- package/src/grid/grid-panel.ts +65 -6
- package/src/grid/grid-reveal.ts +34 -0
- package/src/grid/grid-source.ts +9 -31
- package/src/grid/grid-view.ts +45 -23
- package/src/grid/redirects-grid.ts +14 -5
- package/src/grid/redirects.ts +16 -14
- package/src/grid/schema-columns.ts +25 -19
- package/src/grid/sources/connector-source.ts +47 -20
- package/src/grid/sources/content-source.ts +100 -31
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +61 -34
- package/src/hosting/document.ts +2 -2
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +3 -3
- package/src/media/media-commands.ts +181 -0
- package/src/media/media-library-model.ts +232 -0
- package/src/media/media-library.ts +1283 -0
- package/src/media/media-pane.ts +51 -20
- package/src/new-project/add-repo-modal.ts +20 -19
- package/src/new-project/import-tab.ts +10 -14
- package/src/new-project/location-fields.ts +2 -1
- package/src/new-project/new-project-modal.ts +12 -9
- package/src/packages/jxsuite-update.ts +4 -3
- package/src/packages/pull-package-sync.ts +26 -25
- package/src/page-params.ts +97 -68
- package/src/panels/activity-panel.ts +38 -14
- package/src/panels/ai-chat/attached-context.ts +13 -7
- package/src/panels/ai-chat/chat-markdown.ts +8 -8
- package/src/panels/ai-chat/chat-view.ts +80 -73
- package/src/panels/ai-chat/composer.ts +30 -33
- package/src/panels/ai-chat/sessions-view.ts +1 -2
- package/src/panels/ai-panel.ts +23 -20
- package/src/panels/block-action-bar.ts +57 -46
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +36 -26
- package/src/panels/chat-panel.ts +6 -6
- package/src/panels/collections-panel.ts +306 -0
- package/src/panels/component-preview.ts +35 -13
- package/src/panels/data-explorer.ts +63 -26
- package/src/panels/data-grid.ts +18 -11
- package/src/panels/dnd.ts +115 -138
- package/src/panels/editors.ts +52 -21
- package/src/panels/elements-panel.ts +19 -5
- package/src/panels/empty-state.ts +2 -2
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +78 -54
- package/src/panels/frontmatter-fields.ts +33 -28
- package/src/panels/git-diff-open.ts +10 -6
- package/src/panels/head-panel.ts +488 -202
- package/src/panels/i18n-panel.ts +20 -12
- package/src/panels/imports-panel.ts +25 -47
- package/src/panels/jump-bar.ts +75 -31
- package/src/panels/layers-panel.ts +130 -101
- package/src/panels/left-panel.ts +25 -11
- package/src/panels/navigator-panels.ts +23 -11
- package/src/panels/pane-context.ts +140 -49
- package/src/panels/pane-grid.ts +55 -26
- package/src/panels/panel-registry.ts +36 -46
- package/src/panels/properties-panel.ts +182 -124
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +201 -45
- package/src/panels/seo-modal.ts +54 -125
- package/src/panels/settings-menu.ts +63 -61
- package/src/panels/settings-pane.ts +268 -162
- package/src/panels/signals-panel.ts +156 -135
- package/src/panels/site-model.ts +367 -0
- package/src/panels/site-panel.ts +638 -0
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +253 -206
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +195 -60
- package/src/panels/stylebook-layers-panel.ts +48 -89
- package/src/panels/stylebook-panel.ts +60 -27
- package/src/panels/styles-panel.ts +327 -0
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +143 -49
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +59 -31
- package/src/platforms/cloud.ts +373 -176
- package/src/platforms/default-platform.ts +14 -8
- package/src/platforms/devserver.ts +180 -142
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +20 -9
- package/src/publish/pages-service.ts +66 -27
- package/src/publish/publish-changes.ts +491 -0
- package/src/publish/publish-commands.ts +88 -22
- package/src/publish/publish-ids.ts +49 -0
- package/src/publish/publish-panel.ts +10 -6
- package/src/publish/publish-quick.ts +148 -0
- package/src/publish/publish-workspace.ts +926 -0
- package/src/publish/source-control.ts +907 -0
- package/src/recent-projects.ts +15 -8
- package/src/resize-edges.ts +26 -36
- package/src/services/a11y-report.ts +26 -19
- package/src/services/agent-seed.ts +23 -11
- package/src/services/ai-ask.ts +9 -12
- package/src/services/ai-command-tools.ts +68 -62
- package/src/services/ai-import-tools.ts +80 -67
- package/src/services/ai-models.ts +17 -13
- package/src/services/ai-project-tools.ts +68 -32
- package/src/services/ai-session-store.ts +19 -10
- package/src/services/ai-system-prompt.ts +46 -20
- package/src/services/ai-tools.ts +71 -27
- package/src/services/ai-write-report.ts +20 -12
- package/src/services/ai-writes.ts +4 -4
- package/src/services/automation.ts +74 -51
- package/src/services/cem-export.ts +149 -58
- package/src/services/cf-settings.ts +4 -4
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- package/src/services/connection.ts +2 -2
- package/src/services/context-manager.ts +14 -10
- package/src/services/context-resolver.ts +20 -8
- package/src/services/data-service.ts +19 -15
- package/src/services/directory-picker.ts +20 -14
- package/src/services/document-assistant.ts +39 -19
- package/src/services/gated-registry.ts +10 -6
- package/src/services/harness/chat-reducer.ts +23 -1
- package/src/services/import-client.ts +91 -38
- package/src/services/import-seed.ts +8 -2
- package/src/services/jx-validate.ts +28 -31
- package/src/services/live-preview.ts +0 -0
- package/src/services/live-surfaces.ts +6 -3
- package/src/services/model-uri.ts +10 -2
- package/src/services/module-preloads.ts +12 -8
- package/src/services/monaco-buffer.ts +43 -24
- package/src/services/monaco-lazy.ts +7 -8
- package/src/services/monaco-setup.ts +23 -16
- package/src/services/notify.ts +44 -17
- package/src/services/popover-report.ts +25 -10
- package/src/services/preview-eval.ts +20 -8
- package/src/services/profile.ts +13 -6
- package/src/services/project-path.ts +13 -10
- package/src/services/references.ts +0 -0
- package/src/services/render-critic.ts +29 -9
- package/src/services/settings/definitions.ts +25 -14
- package/src/services/settings/kernel.ts +13 -4
- package/src/services/settings/write-queue.ts +9 -9
- package/src/services/token-lint.ts +12 -10
- package/src/services/tool-executor.ts +17 -5
- package/src/services/tool-outcomes.ts +44 -24
- package/src/services/trusted-types.ts +24 -7
- package/src/settings/contexts-section.ts +11 -8
- package/src/settings/contributed-section.ts +128 -70
- package/src/settings/css-vars-editor.ts +119 -32
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/developer-panels.ts +43 -0
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +42 -14
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +101 -28
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +17 -7
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +28 -11
- package/src/settings/schema-field-ui.ts +12 -1
- package/src/settings/section-registry.ts +116 -11
- package/src/settings/settings-dialog.ts +192 -0
- package/src/settings/settings-document.ts +186 -166
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +536 -477
- package/src/site-context.ts +101 -32
- package/src/state.ts +68 -57
- package/src/store.ts +54 -34
- package/src/studio.ts +219 -116
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +40 -7
- package/src/style/stylebook-specimens.ts +89 -0
- package/src/style/stylebook-target.ts +26 -0
- package/src/style/tag-inheritance.ts +105 -0
- package/src/style/token-ref.ts +5 -4
- package/src/style/variables-focus.ts +61 -0
- package/src/style/variables-view.ts +235 -0
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-new.json +1482 -0
- package/src/surfaces/add-new.ts +325 -0
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +33 -38
- package/src/surfaces/ai-credentials-form.ts +6 -16
- package/src/surfaces/ai-managed-connect.ts +3 -4
- package/src/surfaces/ai-model-picker.ts +3 -5
- package/src/surfaces/block-action-bar.ts +22 -11
- package/src/surfaces/boot-failure.json +4 -3
- package/src/surfaces/boot-failure.ts +4 -5
- package/src/surfaces/bottom-dock.json +1 -1
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.json +30 -19
- package/src/surfaces/canvas-stage.ts +17 -16
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/collections-panel.json +615 -0
- package/src/surfaces/collections-panel.ts +168 -0
- package/src/surfaces/commandbar.json +241 -96
- package/src/surfaces/commandbar.ts +145 -105
- package/src/surfaces/convert-repeater.ts +17 -19
- package/src/surfaces/data-actions.ts +9 -7
- package/src/surfaces/dialog.ts +26 -28
- package/src/surfaces/diff-toolbar.ts +9 -7
- package/src/surfaces/empty-state.json +1 -1
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.json +136 -0
- package/src/surfaces/entry-editor.ts +35 -11
- package/src/surfaces/entry-inspector.json +371 -0
- package/src/surfaces/entry-inspector.ts +143 -0
- package/src/surfaces/expression-editor.ts +11 -25
- package/src/surfaces/files-panel.ts +27 -14
- package/src/surfaces/formula-palette.ts +4 -5
- package/src/surfaces/github-auth.ts +16 -20
- package/src/surfaces/github-publish.ts +17 -22
- package/src/surfaces/grid-cell.ts +30 -31
- package/src/surfaces/grid-open.ts +10 -14
- package/src/surfaces/grid-panel.ts +13 -9
- package/src/surfaces/grid-replace.ts +13 -13
- package/src/surfaces/grid-views.ts +15 -18
- package/src/surfaces/inspector-dock.json +162 -14
- package/src/surfaces/inspector-dock.ts +59 -31
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.json +670 -437
- package/src/surfaces/library-pane.ts +111 -77
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.json +62 -6
- package/src/surfaces/media-browser.ts +26 -11
- package/src/surfaces/media-field.json +1 -1
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-library.json +1586 -0
- package/src/surfaces/media-library.ts +282 -0
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/media-pick-dialog.json +71 -0
- package/src/surfaces/media-pick-dialog.ts +132 -0
- package/src/surfaces/menu.ts +47 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.json +144 -77
- package/src/surfaces/pane-context.ts +44 -25
- package/src/surfaces/pane-grid.ts +15 -10
- package/src/surfaces/panel-activity.ts +5 -6
- package/src/surfaces/panel-data.ts +3 -4
- package/src/surfaces/panel-deploy-checklist.json +12 -6
- package/src/surfaces/panel-deploy-checklist.ts +8 -7
- package/src/surfaces/panel-elements.ts +5 -7
- package/src/surfaces/panel-i18n.ts +5 -7
- package/src/surfaces/panel-imports.ts +6 -13
- package/src/surfaces/panel-outline.ts +25 -19
- package/src/surfaces/panel-page.json +72 -2
- package/src/surfaces/panel-page.ts +49 -25
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.json +1 -1
- package/src/surfaces/panel-signals.ts +25 -39
- package/src/surfaces/panel-stylebook-layers.json +71 -204
- package/src/surfaces/panel-stylebook-layers.ts +5 -29
- package/src/surfaces/preferences.json +120 -48
- package/src/surfaces/preferences.ts +29 -11
- package/src/surfaces/progress-modal.ts +15 -9
- package/src/surfaces/properties-panel.json +1 -1
- package/src/surfaces/properties-panel.ts +20 -42
- package/src/surfaces/publish-quick.json +428 -0
- package/src/surfaces/publish-quick.ts +165 -0
- package/src/surfaces/publish-workspace.json +2892 -0
- package/src/surfaces/publish-workspace.ts +391 -0
- package/src/surfaces/publish.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.json +1 -159
- package/src/surfaces/rail.ts +22 -79
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.json +10 -2
- package/src/surfaces/schema-form.ts +17 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.json +1 -1
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.json +5 -5
- package/src/surfaces/settings-contributed.ts +32 -12
- package/src/surfaces/settings-css-vars.json +44 -36
- package/src/surfaces/settings-css-vars.ts +82 -16
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.json +2 -15
- package/src/surfaces/settings-deploy.ts +9 -16
- package/src/surfaces/settings-dialog.json +51 -0
- package/src/surfaces/settings-dialog.ts +169 -0
- package/src/surfaces/settings-extensions.ts +5 -6
- package/src/surfaces/settings-head.ts +33 -39
- package/src/surfaces/settings-locales.ts +8 -20
- package/src/surfaces/settings-overview.json +3 -3
- package/src/surfaces/settings-overview.ts +14 -8
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.json +269 -46
- package/src/surfaces/settings-pane.ts +88 -36
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.json +2 -1
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/site-panel.json +1029 -0
- package/src/surfaces/site-panel.ts +233 -0
- package/src/surfaces/slash-menu.json +63 -21
- package/src/surfaces/slash-menu.ts +42 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +56 -29
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/styles-panel.json +735 -0
- package/src/surfaces/styles-panel.ts +195 -0
- package/src/surfaces/styles-variables.json +149 -0
- package/src/surfaces/styles-variables.ts +145 -0
- package/src/surfaces/tab-strip.json +4 -4
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +6 -8
- package/src/surfaces/writing-banner.json +94 -0
- package/src/surfaces/writing-banner.ts +80 -0
- package/src/tabs/bare-repeaters.ts +101 -0
- package/src/tabs/patch-ops.ts +4 -3
- package/src/tabs/project-config.ts +32 -21
- package/src/tabs/selection.ts +36 -8
- package/src/tabs/tab.ts +99 -48
- package/src/tabs/transact.ts +98 -53
- package/src/types.ts +53 -43
- package/src/ui/ai-credentials-form.ts +10 -13
- package/src/ui/ai-model-picker.ts +3 -3
- package/src/ui/cf-account-picker.ts +7 -9
- package/src/ui/color-selector.ts +9 -5
- package/src/ui/dynamic-slot.ts +7 -8
- package/src/ui/expression-editor.ts +112 -105
- package/src/ui/form-controls.ts +104 -56
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +57 -31
- package/src/ui/media-picker.ts +300 -47
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +14 -12
- package/src/ui/schema-form.ts +372 -97
- package/src/ui/surface.ts +71 -8
- package/src/ui/timing.ts +9 -0
- package/src/ui/value-source.ts +44 -31
- package/src/ui/virtual-window.ts +29 -3
- package/src/utils/base64.ts +6 -4
- package/src/utils/edit-display.ts +366 -111
- package/src/utils/element-selectors.ts +3 -2
- package/src/utils/google-fonts.ts +15 -14
- package/src/utils/inherited-style.ts +18 -20
- package/src/utils/link-target.ts +1 -1
- package/src/utils/local-day.ts +18 -0
- package/src/utils/preview-format.ts +25 -3
- package/src/utils/strip-events.ts +49 -22
- package/src/utils/studio-utils.ts +29 -14
- package/src/view.ts +2 -3
- package/src/workspace/pane-derive.ts +14 -16
- package/src/workspace/session.ts +81 -50
- package/src/workspace/tab-workspace.ts +137 -0
- package/src/workspace/workspace-back.ts +189 -0
- package/src/workspace/workspace-home.ts +133 -0
- package/src/workspace/workspace-ids.ts +129 -0
- package/src/workspace/workspace-switch.ts +372 -0
- package/src/workspace/workspace.ts +165 -47
- package/styles/shell-frame.css +30 -7
- package/styles/shell-frame.json +15 -3
- package/dist/chunks/2020-va2wwra4.js +0 -4
- package/dist/chunks/adapter-f93pafd7.js +0 -4
- package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
- package/dist/chunks/cf-settings-125tdm0w.js +0 -4
- package/dist/chunks/color-area-jqhna8zy.js +0 -4
- package/dist/chunks/color-field-embq5ctg.js +0 -4
- package/dist/chunks/color-fpezvnkt.js +0 -4
- package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
- package/dist/chunks/combobox-773hdzyj.js +0 -4
- package/dist/chunks/components-ax2f1fnn.js +0 -4
- package/dist/chunks/content-source-108aqtk1.js +0 -4
- package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-pfgdmkb0.js +0 -4
- package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
- package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
- package/dist/chunks/file-ops-meej5mqf.js +0 -4
- package/dist/chunks/files-44vp8a2s.js +0 -4
- package/dist/chunks/format-host-7q1petb9.js +0 -4
- package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
- package/dist/chunks/git-panel-zngbymvd.js +0 -4
- package/dist/chunks/grid-view-sx9vynsp.js +0 -51
- package/dist/chunks/icons-p44xhjf0.js +0 -4
- package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
- package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
- package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
- package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
- package/dist/chunks/index-wkyfjeqz.js +0 -4
- package/dist/chunks/jsonMode-s8kt9dsj.js +0 -13
- package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
- package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
- package/dist/chunks/layers-xd92fg8d.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
- package/dist/chunks/media-picker-0svzkdyb.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/menu-5c55ea3d.js +0 -4
- package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
- package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
- package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
- package/dist/chunks/notify-0xgtn8q1.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-v1qctbe6.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
- package/dist/chunks/quick-search-a54e6t5n.js +0 -4
- package/dist/chunks/references-gmqp82fs.js +0 -4
- package/dist/chunks/right-panel-v7t9awbk.js +0 -4
- package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0bhx5hz6.js +0 -5
- package/dist/chunks/studio-0k1ddnyy.js +0 -6
- package/dist/chunks/studio-1b04pd0j.js +0 -64
- package/dist/chunks/studio-4dwbj6gb.js +0 -5
- package/dist/chunks/studio-4tanh828.js +0 -5
- package/dist/chunks/studio-55h4mstj.js +0 -4
- package/dist/chunks/studio-5tnvjkz4.js +0 -5
- package/dist/chunks/studio-60dqgb0c.js +0 -5
- package/dist/chunks/studio-61dp09qg.js +0 -9
- package/dist/chunks/studio-63epcrj2.js +0 -5
- package/dist/chunks/studio-74k29dy9.js +0 -5
- package/dist/chunks/studio-7vg6jcd3.js +0 -5
- package/dist/chunks/studio-7zx31knw.js +0 -9
- package/dist/chunks/studio-8bxk97km.js +0 -5
- package/dist/chunks/studio-933e30n4.js +0 -5
- package/dist/chunks/studio-98wnwhbg.js +0 -5
- package/dist/chunks/studio-9mccjwjh.js +0 -14
- package/dist/chunks/studio-a2ke1e4t.js +0 -5
- package/dist/chunks/studio-e3a2a6v3.js +0 -4
- package/dist/chunks/studio-e81q1vb9.js +0 -5
- package/dist/chunks/studio-epgrmqqm.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-g1shz58g.js +0 -5
- package/dist/chunks/studio-gf0fz03c.js +0 -5
- package/dist/chunks/studio-gjtpe62q.js +0 -6
- package/dist/chunks/studio-gkskhg7m.js +0 -5
- package/dist/chunks/studio-gx4dnjzd.js +0 -5
- package/dist/chunks/studio-j03zga3y.js +0 -9
- package/dist/chunks/studio-jhpxeckz.js +0 -5
- package/dist/chunks/studio-k01r7ykp.js +0 -5
- package/dist/chunks/studio-kk7h30ne.js +0 -7
- package/dist/chunks/studio-kt1zqney.js +0 -5
- package/dist/chunks/studio-m3cwhvye.js +0 -5
- package/dist/chunks/studio-mcayt6hz.js +0 -5
- package/dist/chunks/studio-myjcghv3.js +0 -5
- package/dist/chunks/studio-n8bxwc3y.js +0 -4
- package/dist/chunks/studio-ngm8gvpb.js +0 -5
- package/dist/chunks/studio-nj5a01jy.js +0 -928
- package/dist/chunks/studio-pcgz8heb.js +0 -5
- package/dist/chunks/studio-qcsq0t15.js +0 -5
- package/dist/chunks/studio-qkstvve9.js +0 -5
- package/dist/chunks/studio-qv1pwd3c.js +0 -5
- package/dist/chunks/studio-rc6dvxjb.js +0 -7
- package/dist/chunks/studio-s8dmmz66.js +0 -5
- package/dist/chunks/studio-sp5xzbj4.js +0 -6
- package/dist/chunks/studio-szsjbj0g.js +0 -5
- package/dist/chunks/studio-t1xzawhr.js +0 -16
- package/dist/chunks/studio-tdcprbqb.js +0 -5
- package/dist/chunks/studio-vrmcjf9g.js +0 -7
- package/dist/chunks/studio-vyc0b4he.js +0 -10
- package/dist/chunks/studio-w0cgf6jg.js +0 -5
- package/dist/chunks/studio-w3hskzqk.js +0 -5
- package/dist/chunks/studio-xgrgcdyh.js +0 -9
- package/dist/chunks/studio-xz2yxfcb.js +0 -5
- package/dist/chunks/studio-y6n42tgs.js +0 -5
- package/dist/chunks/studio-yb560vxr.js +0 -5
- package/dist/chunks/studio-yn9f8vtx.js +0 -5
- package/dist/chunks/studio-yw05w8f0.js +0 -7
- package/dist/chunks/studio-z16sgavc.js +0 -5
- package/dist/chunks/studio-zey7zsdw.js +0 -12
- package/dist/chunks/studio-zyqn40w4.js +0 -5
- package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
- package/dist/chunks/tabs-jwthg40w.js +0 -4
- package/dist/chunks/textfield-spy3hc77.js +0 -4
- package/dist/chunks/toast-4d35zd64.js +0 -4
- package/dist/chunks/toast-host-8sjmfed3.js +0 -4
- package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
- package/dist/chunks/tree-h19v1jfz.js +0 -4
- package/dist/chunks/tsMode-2frah6h1.js +0 -14
- package/dist/chunks/workspace-zt81g1ms.js +0 -4
- package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
- package/src/panels/frontmatter-panel.ts +0 -701
- package/src/panels/git-panel.ts +0 -1120
- package/src/surfaces/doc-header.json +0 -776
- package/src/surfaces/doc-header.ts +0 -231
- package/src/surfaces/git-panel.json +0 -1880
- package/src/surfaces/git-panel.ts +0 -272
|
@@ -9,9 +9,17 @@
|
|
|
9
9
|
* deletion. The server is authoritative — there are no file fingerprints; conflicts surface as
|
|
10
10
|
* per-row API errors.
|
|
11
11
|
*/
|
|
12
|
+
import { isJsonPrimitive, isNumber, isString } from "@jxsuite/schema/guards";
|
|
13
|
+
import type { JsonObject, JsonValue } from "@jxsuite/schema/types";
|
|
12
14
|
import { deleteRow, fetchRows, insertRow, updateRow } from "../../services/data-service";
|
|
13
15
|
import { makeGridTabId } from "../grid-source";
|
|
14
|
-
import type {
|
|
16
|
+
import type {
|
|
17
|
+
DataColumnMeta,
|
|
18
|
+
DataRowDelete,
|
|
19
|
+
DataRowInsert,
|
|
20
|
+
DataRowUpdate,
|
|
21
|
+
DataRowsQuery,
|
|
22
|
+
} from "../../types";
|
|
15
23
|
import type {
|
|
16
24
|
CommitResult,
|
|
17
25
|
GridCellValue,
|
|
@@ -48,11 +56,11 @@ function editableColumn(column: DataColumnMeta): boolean {
|
|
|
48
56
|
}
|
|
49
57
|
|
|
50
58
|
/** DB value → grid cell value (JSON-ish values surface as text). */
|
|
51
|
-
function toCellValue(value:
|
|
52
|
-
if (value ===
|
|
59
|
+
function toCellValue(value: JsonValue | undefined): GridCellValue {
|
|
60
|
+
if (value === undefined) {
|
|
53
61
|
return null;
|
|
54
62
|
}
|
|
55
|
-
if (
|
|
63
|
+
if (isJsonPrimitive(value)) {
|
|
56
64
|
return value;
|
|
57
65
|
}
|
|
58
66
|
return JSON.stringify(value);
|
|
@@ -72,17 +80,23 @@ export function createConnectorSource(connection: string | undefined, table: str
|
|
|
72
80
|
}
|
|
73
81
|
};
|
|
74
82
|
|
|
75
|
-
const toQuery = (query?: GridQuery): DataRowsQuery =>
|
|
76
|
-
table
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
83
|
+
const toQuery = (query?: GridQuery): DataRowsQuery => {
|
|
84
|
+
const rowsQuery: DataRowsQuery = { table };
|
|
85
|
+
if (connection) {
|
|
86
|
+
rowsQuery.connection = connection;
|
|
87
|
+
}
|
|
88
|
+
rowsQuery.limit = query?.limit ?? DATA_PAGE_SIZE;
|
|
89
|
+
rowsQuery.offset = query?.offset ?? 0;
|
|
90
|
+
if (query?.orderBy) {
|
|
91
|
+
rowsQuery.dir = query.dir ?? "asc";
|
|
92
|
+
rowsQuery.orderBy = query.orderBy;
|
|
93
|
+
}
|
|
94
|
+
return rowsQuery;
|
|
95
|
+
};
|
|
82
96
|
|
|
83
|
-
const rowKeyOf = (row:
|
|
97
|
+
const rowKeyOf = (row: JsonObject, index: number): string => {
|
|
84
98
|
const pk = row[pkName];
|
|
85
|
-
if (
|
|
99
|
+
if (isString(pk) || isNumber(pk)) {
|
|
86
100
|
pkValues.set(String(pk), pk);
|
|
87
101
|
return String(pk);
|
|
88
102
|
}
|
|
@@ -132,11 +146,15 @@ export function createConnectorSource(connection: string | undefined, table: str
|
|
|
132
146
|
continue;
|
|
133
147
|
}
|
|
134
148
|
try {
|
|
135
|
-
const set:
|
|
149
|
+
const set: JsonObject = {};
|
|
136
150
|
for (const patch of patches) {
|
|
137
151
|
set[patch.field] = patch.value;
|
|
138
152
|
}
|
|
139
|
-
|
|
153
|
+
const update: DataRowUpdate = { pk, set, table };
|
|
154
|
+
if (connection) {
|
|
155
|
+
update.connection = connection;
|
|
156
|
+
}
|
|
157
|
+
await updateRow(update);
|
|
140
158
|
outcome(true);
|
|
141
159
|
} catch (error) {
|
|
142
160
|
outcome(false, error instanceof Error ? error.message : String(error));
|
|
@@ -145,16 +163,21 @@ export function createConnectorSource(connection: string | undefined, table: str
|
|
|
145
163
|
|
|
146
164
|
for (const insert of batch.inserts) {
|
|
147
165
|
try {
|
|
148
|
-
const values:
|
|
166
|
+
const values: JsonObject = {};
|
|
149
167
|
for (const [field, value] of Object.entries(insert.cells)) {
|
|
150
168
|
if (value !== null) {
|
|
151
169
|
values[field] = value;
|
|
152
170
|
}
|
|
153
171
|
}
|
|
154
|
-
const
|
|
172
|
+
const request: DataRowInsert = { table, values };
|
|
173
|
+
if (connection) {
|
|
174
|
+
request.connection = connection;
|
|
175
|
+
}
|
|
176
|
+
const { row } = await insertRow(request);
|
|
155
177
|
const pk = row[pkName];
|
|
156
|
-
|
|
157
|
-
if (
|
|
178
|
+
let newKey: string | undefined;
|
|
179
|
+
if (isString(pk) || isNumber(pk)) {
|
|
180
|
+
newKey = String(pk);
|
|
158
181
|
pkValues.set(newKey, pk);
|
|
159
182
|
}
|
|
160
183
|
result.inserts.push({ newKey, ok: true, tempKey: insert.tempKey });
|
|
@@ -178,7 +201,11 @@ export function createConnectorSource(connection: string | undefined, table: str
|
|
|
178
201
|
continue;
|
|
179
202
|
}
|
|
180
203
|
try {
|
|
181
|
-
|
|
204
|
+
const request: DataRowDelete = { pk, table };
|
|
205
|
+
if (connection) {
|
|
206
|
+
request.connection = connection;
|
|
207
|
+
}
|
|
208
|
+
await deleteRow(request);
|
|
182
209
|
result.deletes.push({ ok: true, rowKey: del.rowKey });
|
|
183
210
|
} catch (error) {
|
|
184
211
|
result.deletes.push({
|
|
@@ -39,6 +39,10 @@ import {
|
|
|
39
39
|
loadFormats,
|
|
40
40
|
} from "../../format/format-host";
|
|
41
41
|
import { parseSourceForPath } from "../../files/file-ops";
|
|
42
|
+
import { collectionForDirectory } from "../../content/collection-match";
|
|
43
|
+
import { collectionSourceFile } from "../../content/content-collections";
|
|
44
|
+
import { fileRecordIds as recordIdsOf } from "../../content/file-record-ids";
|
|
45
|
+
import { LOCALE_PLACEHOLDER } from "../../canvas/asset-resolve";
|
|
42
46
|
import { columnsFromSchema, inferColumnsFromRows } from "../schema-columns";
|
|
43
47
|
import { makeGridTabId } from "../grid-source";
|
|
44
48
|
import type {
|
|
@@ -51,13 +55,16 @@ import type {
|
|
|
51
55
|
GridSource,
|
|
52
56
|
} from "../grid-source";
|
|
53
57
|
import type { ContentSectionEntry } from "../../types";
|
|
58
|
+
import type { EntryFields } from "../../content/entry-fields";
|
|
59
|
+
import type { JxDocumentValue, JxMutableNode } from "@jxsuite/schema/types";
|
|
60
|
+
import { isJsonPrimitive, isNonNullObject, isString } from "@jxsuite/schema/guards";
|
|
54
61
|
|
|
55
62
|
/** The synthetic identity column: the entry's project path. Editable only on pending inserts. */
|
|
56
63
|
export const PATH_FIELD = "__path";
|
|
57
64
|
|
|
58
65
|
interface EntryRecord {
|
|
59
|
-
frontmatter:
|
|
60
|
-
document:
|
|
66
|
+
frontmatter: EntryFields;
|
|
67
|
+
document: JxMutableNode;
|
|
61
68
|
rawText: string;
|
|
62
69
|
formatName: string;
|
|
63
70
|
}
|
|
@@ -69,13 +76,17 @@ interface CollectionInfo {
|
|
|
69
76
|
ext: string;
|
|
70
77
|
}
|
|
71
78
|
|
|
79
|
+
/** The open project's `content` section (collection name → entry), or an empty one. */
|
|
80
|
+
function contentSection(): Record<string, ContentSectionEntry> {
|
|
81
|
+
/* SAFETY: `content` is the parser extension's section — collection name → entry object, its
|
|
82
|
+
project fragment schema the source of truth. `ContentSectionEntry` names only the fields Studio
|
|
83
|
+
reads, every one optional, and both readers below test `source` before using it. */
|
|
84
|
+
return (projectState?.projectConfig?.content ?? {}) as Record<string, ContentSectionEntry>;
|
|
85
|
+
}
|
|
86
|
+
|
|
72
87
|
/** Resolve a content type's definition, source dir, and entry extension from project config. */
|
|
73
88
|
export function collectionInfo(typeName: string): CollectionInfo | null {
|
|
74
|
-
const
|
|
75
|
-
string,
|
|
76
|
-
ContentSectionEntry
|
|
77
|
-
>;
|
|
78
|
-
const def = content[typeName];
|
|
89
|
+
const def = contentSection()[typeName];
|
|
79
90
|
if (!def?.source) {
|
|
80
91
|
return null;
|
|
81
92
|
}
|
|
@@ -91,11 +102,7 @@ export function collectionInfo(typeName: string): CollectionInfo | null {
|
|
|
91
102
|
|
|
92
103
|
/** Directory-backed collections in the project (for "Edit collection in Grid" affordances). */
|
|
93
104
|
export function collectionDirs(): { name: string; dir: string }[] {
|
|
94
|
-
|
|
95
|
-
string,
|
|
96
|
-
ContentSectionEntry
|
|
97
|
-
>;
|
|
98
|
-
return Object.entries(content)
|
|
105
|
+
return Object.entries(contentSection())
|
|
99
106
|
.filter(([, def]) => {
|
|
100
107
|
const source = def.source?.replace(/^\.\//, "") ?? "";
|
|
101
108
|
return source !== "" && !/\.[a-z0-9]+$/i.test(source);
|
|
@@ -126,14 +133,77 @@ async function listEntryFiles(dir: string, exts: string[]): Promise<string[]> {
|
|
|
126
133
|
return results.toSorted();
|
|
127
134
|
}
|
|
128
135
|
|
|
129
|
-
/**
|
|
136
|
+
/**
|
|
137
|
+
* The real directories a collection's entries live in.
|
|
138
|
+
*
|
|
139
|
+
* A plain source is its one directory. A localized source (`content/exhibitions/{locale}`) is one
|
|
140
|
+
* directory per language, and the literal path with the placeholder is a directory nobody has:
|
|
141
|
+
* listing it is a 500 from the dev server and an empty collection on screen. So the placeholder's
|
|
142
|
+
* parent is listed, and each subdirectory is kept when the one collection matcher
|
|
143
|
+
* (`content/collection-match.ts`) says that directory IS this collection's, which is what keeps an
|
|
144
|
+
* undeclared language or a co-located `images/` folder out.
|
|
145
|
+
*/
|
|
146
|
+
export async function collectionSourceDirs(info: { dir: string; name: string }): Promise<string[]> {
|
|
147
|
+
const cut = info.dir.indexOf(LOCALE_PLACEHOLDER);
|
|
148
|
+
if (cut === -1) {
|
|
149
|
+
return [info.dir];
|
|
150
|
+
}
|
|
151
|
+
const head = info.dir.slice(0, cut).replace(/\/$/, "");
|
|
152
|
+
const tail = info.dir.slice(cut + LOCALE_PLACEHOLDER.length);
|
|
153
|
+
let children;
|
|
154
|
+
try {
|
|
155
|
+
children = await getPlatform().listDirectory(head);
|
|
156
|
+
} catch {
|
|
157
|
+
return []; // No parent directory yet: a localized collection with no entries in any language.
|
|
158
|
+
}
|
|
159
|
+
return children
|
|
160
|
+
.filter((entry) => entry.type === "directory")
|
|
161
|
+
.map((entry) => `${entry.path}${tail}`.replace(/\/$/, ""))
|
|
162
|
+
.filter((dir) => collectionForDirectory(dir)?.name === info.name)
|
|
163
|
+
.toSorted();
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/** Every entry file of a collection, across all of its directories. */
|
|
167
|
+
async function listCollectionFiles(info: CollectionInfo): Promise<string[]> {
|
|
168
|
+
const dirs = await collectionSourceDirs(info);
|
|
169
|
+
const lists = await Promise.all(dirs.map((dir) => listEntryFiles(dir, [info.ext])));
|
|
170
|
+
return lists.flat().toSorted();
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* The ids of a file-backed collection's records (`content/file-records.ts`), or `null` when the
|
|
175
|
+
* source is a directory. A source that names a file is read, never listed: listing a CSV as a
|
|
176
|
+
* directory is a 500 from the dev server and a collection of no entries on screen.
|
|
177
|
+
*/
|
|
178
|
+
async function fileRecordIds(info: CollectionInfo): Promise<string[] | null> {
|
|
179
|
+
const file = collectionSourceFile(info.name);
|
|
180
|
+
if (file === null) {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
let text: string;
|
|
184
|
+
try {
|
|
185
|
+
text = await getPlatform().readFile(file);
|
|
186
|
+
} catch {
|
|
187
|
+
return []; // A source file not written yet: an empty collection.
|
|
188
|
+
}
|
|
189
|
+
return recordIdsOf(file, text, info.def.idField);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Entry ids of a collection (file stems, or a file-backed collection's record ids), used by
|
|
194
|
+
* relationship cell editors and the Site panel's counts.
|
|
195
|
+
*/
|
|
130
196
|
export async function listCollectionEntryIds(typeName: string): Promise<string[]> {
|
|
131
197
|
await loadFormats().catch(() => {}); // Extension resolution needs the format registry.
|
|
132
198
|
const info = collectionInfo(typeName);
|
|
133
199
|
if (!info) {
|
|
134
200
|
return [];
|
|
135
201
|
}
|
|
136
|
-
const
|
|
202
|
+
const recordIds = await fileRecordIds(info);
|
|
203
|
+
if (recordIds !== null) {
|
|
204
|
+
return recordIds;
|
|
205
|
+
}
|
|
206
|
+
const files = await listCollectionFiles(info);
|
|
137
207
|
return files.map((path) => {
|
|
138
208
|
const base = path.split("/").pop() ?? path;
|
|
139
209
|
return base.slice(0, base.length - info.ext.length);
|
|
@@ -160,14 +230,14 @@ async function mapLimit<T, R>(
|
|
|
160
230
|
}
|
|
161
231
|
|
|
162
232
|
/** Frontmatter value → grid cell value. Nested objects surface as read-only JSON text. */
|
|
163
|
-
function toCellValue(value:
|
|
164
|
-
if (value ===
|
|
233
|
+
function toCellValue(value: JxDocumentValue | undefined): GridCellValue {
|
|
234
|
+
if (value === undefined) {
|
|
165
235
|
return null;
|
|
166
236
|
}
|
|
167
|
-
if (
|
|
237
|
+
if (isJsonPrimitive(value)) {
|
|
168
238
|
return value;
|
|
169
239
|
}
|
|
170
|
-
if (Array.isArray(value) && value.every((v) =>
|
|
240
|
+
if (Array.isArray(value) && value.every((v) => !isNonNullObject(v))) {
|
|
171
241
|
return value.map(String);
|
|
172
242
|
}
|
|
173
243
|
return JSON.stringify(value);
|
|
@@ -187,9 +257,7 @@ function openTabFor(path: string) {
|
|
|
187
257
|
function extraRowsAreStrings(rows: Record<string, GridCellValue>[], field: string): boolean {
|
|
188
258
|
return rows.every((row) => {
|
|
189
259
|
const value = row[field];
|
|
190
|
-
return value
|
|
191
|
-
? true
|
|
192
|
-
: !value.startsWith("{") && !value.startsWith("[");
|
|
260
|
+
return !isString(value) || (!value.startsWith("{") && !value.startsWith("["));
|
|
193
261
|
});
|
|
194
262
|
}
|
|
195
263
|
|
|
@@ -294,7 +362,7 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
|
|
|
294
362
|
return {
|
|
295
363
|
document: parsed.document,
|
|
296
364
|
formatName: parsed.format.name,
|
|
297
|
-
frontmatter: parsed.frontmatter
|
|
365
|
+
frontmatter: parsed.frontmatter,
|
|
298
366
|
rawText: text,
|
|
299
367
|
};
|
|
300
368
|
} catch {
|
|
@@ -393,7 +461,7 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
|
|
|
393
461
|
};
|
|
394
462
|
|
|
395
463
|
const rowFor = (path: string, entry: EntryRecord): GridRow => {
|
|
396
|
-
const cells:
|
|
464
|
+
const cells: GridRow["cells"] = { [PATH_FIELD]: path };
|
|
397
465
|
for (const column of buildColumns()) {
|
|
398
466
|
if (column.field === PATH_FIELD) {
|
|
399
467
|
continue;
|
|
@@ -420,7 +488,11 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
|
|
|
420
488
|
}
|
|
421
489
|
const doc = entry.document;
|
|
422
490
|
const fullDoc = { ...frontmatter, ...doc, children: doc.children ?? [] };
|
|
423
|
-
|
|
491
|
+
// The entry's own text, so only the patched keys are re-spelled.
|
|
492
|
+
const text = await formatSerialize(entry.formatName, fullDoc, {
|
|
493
|
+
mode: "roundtrip",
|
|
494
|
+
source: entry.rawText,
|
|
495
|
+
});
|
|
424
496
|
markLocalMutation(path);
|
|
425
497
|
await platform.writeFile(path, text);
|
|
426
498
|
entries.set(path, { ...entry, frontmatter, rawText: text });
|
|
@@ -490,7 +562,7 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
|
|
|
490
562
|
// Inserts: new entry files from the Path cell.
|
|
491
563
|
for (const insert of batch.inserts) {
|
|
492
564
|
const rawPath = insert.cells[PATH_FIELD];
|
|
493
|
-
if (
|
|
565
|
+
if (!isString(rawPath) || rawPath.trim() === "") {
|
|
494
566
|
result.inserts.push({ error: "Path is required", ok: false, tempKey: insert.tempKey });
|
|
495
567
|
continue;
|
|
496
568
|
}
|
|
@@ -522,7 +594,7 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
|
|
|
522
594
|
continue;
|
|
523
595
|
}
|
|
524
596
|
try {
|
|
525
|
-
const frontmatter: Record<string,
|
|
597
|
+
const frontmatter: Record<string, GridCellValue> = {};
|
|
526
598
|
for (const [field, value] of Object.entries(insert.cells)) {
|
|
527
599
|
if (field !== PATH_FIELD && value !== null) {
|
|
528
600
|
frontmatter[field] = value;
|
|
@@ -539,7 +611,7 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
|
|
|
539
611
|
entries.set(path, {
|
|
540
612
|
document: parsed.document,
|
|
541
613
|
formatName: parsed.format.name,
|
|
542
|
-
frontmatter: parsed.frontmatter
|
|
614
|
+
frontmatter: parsed.frontmatter,
|
|
543
615
|
rawText: text,
|
|
544
616
|
});
|
|
545
617
|
result.inserts.push({ newKey: path, ok: true, tempKey: insert.tempKey });
|
|
@@ -627,10 +699,7 @@ export function createCollectionSource(typeName: string): GridSource {
|
|
|
627
699
|
);
|
|
628
700
|
},
|
|
629
701
|
label: typeName,
|
|
630
|
-
list: () =>
|
|
631
|
-
const info = requireInfo();
|
|
632
|
-
return listEntryFiles(info.dir, [info.ext]);
|
|
633
|
-
},
|
|
702
|
+
list: () => listCollectionFiles(requireInfo()),
|
|
634
703
|
resolveInsertPath: (raw) => {
|
|
635
704
|
const info = requireInfo();
|
|
636
705
|
let path = raw.trim().replace(/^\.\//, "").replace(/^\//, "");
|
|
@@ -84,7 +84,7 @@ function buildModel(text: string, path: string): CsvModel {
|
|
|
84
84
|
|
|
85
85
|
// Typed columns when this CSV is a collection source; sniffed kinds otherwise.
|
|
86
86
|
const contentType = findContentTypeSchema(path, projectState?.projectConfig);
|
|
87
|
-
const schemaProps = contentType?.schema
|
|
87
|
+
const schemaProps = contentType?.schema.properties ?? {};
|
|
88
88
|
const sampleRows = doc.rows.slice(0, 50).map((row) => {
|
|
89
89
|
const cells: Record<string, GridCellValue> = {};
|
|
90
90
|
for (const [i, field] of fields.entries()) {
|
|
@@ -116,7 +116,7 @@ function buildModel(text: string, path: string): CsvModel {
|
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
/** Typed cell values for one matrix row. */
|
|
119
|
-
function rowCells(model: CsvModel, rowIndex: number):
|
|
119
|
+
function rowCells(model: CsvModel, rowIndex: number): GridRow["cells"] {
|
|
120
120
|
const cells: Record<string, GridCellValue> = {};
|
|
121
121
|
const row = model.doc.rows[rowIndex] ?? [];
|
|
122
122
|
for (const [i, field] of model.fields.entries()) {
|
|
@@ -1,26 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Minimal ambient types for tabulator-tables 6.x — the package ships no declarations. Only the
|
|
3
3
|
* surface grid-view.ts touches is typed; extend here as usage grows.
|
|
4
|
+
*
|
|
5
|
+
* Every component is generic over `Value`, the type of one cell value. Tabulator stores the row
|
|
6
|
+
* objects it is handed (`data`, `replaceData`) and gives the same values back (`getValue`,
|
|
7
|
+
* `getData`, sorter and filter arguments), so the caller that builds the table names the value type
|
|
8
|
+
* once and reads it back from every component. Values written in (`setValue`, an editor's
|
|
9
|
+
* `success`, `selectableRangeClearCellsValue`) must be of that same type for the promise to hold.
|
|
4
10
|
*/
|
|
5
11
|
declare module "tabulator-tables" {
|
|
6
|
-
|
|
7
|
-
|
|
12
|
+
/** One row object as the table stores it: cell values keyed by field. */
|
|
13
|
+
export type RowData<Value> = Record<string, Value>;
|
|
14
|
+
|
|
15
|
+
export interface CellComponent<Value> {
|
|
16
|
+
getValue: () => Value;
|
|
8
17
|
getField: () => string;
|
|
9
18
|
getElement: () => HTMLElement;
|
|
10
|
-
getRow: () => RowComponent
|
|
11
|
-
setValue: (value:
|
|
19
|
+
getRow: () => RowComponent<Value>;
|
|
20
|
+
setValue: (value: Value, mutate?: boolean) => void;
|
|
12
21
|
}
|
|
13
22
|
|
|
14
|
-
export interface RowComponent {
|
|
15
|
-
getData: () =>
|
|
23
|
+
export interface RowComponent<Value> {
|
|
24
|
+
getData: () => RowData<Value>;
|
|
16
25
|
getElement: () => HTMLElement;
|
|
17
|
-
getCells: () => CellComponent[];
|
|
26
|
+
getCells: () => CellComponent<Value>[];
|
|
18
27
|
reformat: () => void;
|
|
19
28
|
}
|
|
20
29
|
|
|
21
|
-
export interface RangeComponent {
|
|
22
|
-
getRows: () => RowComponent[];
|
|
23
|
-
getCells: () => CellComponent[][];
|
|
30
|
+
export interface RangeComponent<Value> {
|
|
31
|
+
getRows: () => RowComponent<Value>[];
|
|
32
|
+
getCells: () => CellComponent<Value>[][];
|
|
24
33
|
}
|
|
25
34
|
|
|
26
35
|
export interface ColumnComponent {
|
|
@@ -28,28 +37,29 @@ declare module "tabulator-tables" {
|
|
|
28
37
|
getWidth: () => number;
|
|
29
38
|
}
|
|
30
39
|
|
|
31
|
-
export type CellEditor = (
|
|
32
|
-
cell: CellComponent
|
|
40
|
+
export type CellEditor<Value> = (
|
|
41
|
+
cell: CellComponent<Value>,
|
|
33
42
|
onRendered: (fn: () => void) => void,
|
|
34
|
-
success: (value:
|
|
43
|
+
success: (value: Value) => void,
|
|
35
44
|
cancel: () => void,
|
|
36
45
|
) => HTMLElement | false;
|
|
37
46
|
|
|
38
|
-
export type CellFormatter = (
|
|
39
|
-
cell: CellComponent
|
|
40
|
-
formatterParams
|
|
47
|
+
export type CellFormatter<Value> = (
|
|
48
|
+
cell: CellComponent<Value>,
|
|
49
|
+
/** Always `{}`: no column definition here declares `formatterParams`. */
|
|
50
|
+
formatterParams: Record<string, never>,
|
|
41
51
|
onRendered: (fn: () => void) => void,
|
|
42
52
|
) => HTMLElement | string;
|
|
43
53
|
|
|
44
|
-
export interface ColumnDefinition {
|
|
54
|
+
export interface ColumnDefinition<Value> {
|
|
45
55
|
title: string;
|
|
46
56
|
field?: string | undefined;
|
|
47
57
|
width?: number | undefined;
|
|
48
58
|
frozen?: boolean | undefined;
|
|
49
|
-
editor?: CellEditor | undefined;
|
|
50
|
-
editable?: boolean | ((cell: CellComponent) => boolean) | undefined;
|
|
51
|
-
formatter?: CellFormatter | undefined;
|
|
52
|
-
sorter?: string | ((a:
|
|
59
|
+
editor?: CellEditor<Value> | undefined;
|
|
60
|
+
editable?: boolean | ((cell: CellComponent<Value>) => boolean) | undefined;
|
|
61
|
+
formatter?: CellFormatter<Value> | undefined;
|
|
62
|
+
sorter?: string | ((a: Value, b: Value) => number) | undefined;
|
|
53
63
|
headerSort?: boolean | undefined;
|
|
54
64
|
headerFilter?: string | undefined;
|
|
55
65
|
cssClass?: string | undefined;
|
|
@@ -57,9 +67,20 @@ declare module "tabulator-tables" {
|
|
|
57
67
|
headerSortTristate?: boolean | undefined;
|
|
58
68
|
}
|
|
59
69
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
70
|
+
/** Which table regions a clipboard copy includes. */
|
|
71
|
+
export interface ClipboardCopyConfig {
|
|
72
|
+
columnHeaders?: boolean;
|
|
73
|
+
columnGroups?: boolean;
|
|
74
|
+
rowHeaders?: boolean;
|
|
75
|
+
rowGroups?: boolean;
|
|
76
|
+
columnCalcs?: boolean;
|
|
77
|
+
dataTree?: boolean;
|
|
78
|
+
formatCells?: boolean;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface Options<Value> {
|
|
82
|
+
data?: RowData<Value>[];
|
|
83
|
+
columns?: ColumnDefinition<Value>[];
|
|
63
84
|
index?: string;
|
|
64
85
|
layout?: string;
|
|
65
86
|
height?: string | number;
|
|
@@ -73,27 +94,33 @@ declare module "tabulator-tables" {
|
|
|
73
94
|
selectableRangeColumns?: boolean;
|
|
74
95
|
selectableRangeRows?: boolean;
|
|
75
96
|
selectableRangeClearCells?: boolean;
|
|
76
|
-
selectableRangeClearCellsValue?:
|
|
97
|
+
selectableRangeClearCellsValue?: Value;
|
|
77
98
|
clipboard?: boolean;
|
|
78
99
|
clipboardCopyStyled?: boolean;
|
|
79
|
-
clipboardCopyConfig?:
|
|
100
|
+
clipboardCopyConfig?: ClipboardCopyConfig;
|
|
80
101
|
clipboardCopyRowRange?: string;
|
|
81
102
|
clipboardPasteParser?: string;
|
|
82
103
|
clipboardPasteAction?: string;
|
|
83
104
|
movableColumns?: boolean;
|
|
84
|
-
columnDefaults?: Partial<ColumnDefinition
|
|
85
|
-
rowFormatter?: (row: RowComponent) => void;
|
|
105
|
+
columnDefaults?: Partial<ColumnDefinition<Value>>;
|
|
106
|
+
rowFormatter?: (row: RowComponent<Value>) => void;
|
|
86
107
|
placeholder?: string;
|
|
87
108
|
}
|
|
88
109
|
|
|
89
|
-
export class Tabulator {
|
|
90
|
-
constructor(host: HTMLElement, options: Options);
|
|
110
|
+
export class Tabulator<Value> {
|
|
111
|
+
constructor(host: HTMLElement, options: Options<Value>);
|
|
91
112
|
static registerModule(modules: unknown[]): void;
|
|
92
113
|
on(event: string, callback: (...args: never[]) => void): void;
|
|
93
|
-
replaceData(data:
|
|
94
|
-
getRows(activeOnly?: string): RowComponent[];
|
|
95
|
-
getRanges(): RangeComponent[];
|
|
96
|
-
|
|
114
|
+
replaceData(data: RowData<Value>[]): Promise<void>;
|
|
115
|
+
getRows(activeOnly?: string): RowComponent<Value>[];
|
|
116
|
+
getRanges(): RangeComponent<Value>[];
|
|
117
|
+
/** The row whose `index` field holds `index`, or `false` for none. */
|
|
118
|
+
getRow(index: string): RowComponent<Value> | false;
|
|
119
|
+
/** Scroll a row into view; rejects when no row holds `index`. */
|
|
120
|
+
scrollToRow(index: string, position?: string, ifVisible?: boolean): Promise<void>;
|
|
121
|
+
/** Select the range between two cells, replacing the oldest range past `selectableRange`. */
|
|
122
|
+
addRange(start: CellComponent<Value>, end: CellComponent<Value>): RangeComponent<Value>;
|
|
123
|
+
setFilter(filter: (data: RowData<Value>) => boolean): void;
|
|
97
124
|
clearFilter(includeHeaderFilters?: boolean): void;
|
|
98
125
|
redraw(force?: boolean): void;
|
|
99
126
|
destroy(): void;
|
package/src/hosting/document.ts
CHANGED
|
@@ -109,8 +109,8 @@ export function studioShellHtml(options: DocumentOptions = {}): string {
|
|
|
109
109
|
const boot = (options.boot ?? []).map((mod) => ` ${scriptTag(mod)}`).join("\n");
|
|
110
110
|
/* Only when there IS a boot module: `packages/studio/index.html` is generated with none and CI
|
|
111
111
|
diffs it byte for byte, and the dev server it is served by is the one host that should fall
|
|
112
|
-
back. The `<head>` below stays a literal, attribute-free tag —
|
|
113
|
-
injects
|
|
112
|
+
back. The `<head>` below stays a literal, attribute-free tag — a host that
|
|
113
|
+
injects a preload splices it in after that exact string. */
|
|
114
114
|
const bootMeta = boot
|
|
115
115
|
? ` <meta name="${BOOT_META.name}" content="${BOOT_META.content}" />\n`
|
|
116
116
|
: "";
|
package/src/hosting/stage.ts
CHANGED
|
@@ -15,6 +15,7 @@ import { cp, mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
|
|
|
15
15
|
import { existsSync } from "node:fs";
|
|
16
16
|
import { dirname, join, resolve } from "node:path";
|
|
17
17
|
import { Glob } from "bun";
|
|
18
|
+
import { isNonNullObject } from "@jxsuite/schema/guards";
|
|
18
19
|
import { STUDIO_ASSETS, STUDIO_CANVAS, STUDIO_SHELL } from "./layout";
|
|
19
20
|
import type { AssetBase, StudioAsset, StudioAssetKind, StudioLayoutMode } from "./layout";
|
|
20
21
|
import { canvasShellHtml } from "./document";
|
|
@@ -193,11 +194,10 @@ export async function writeAssetManifest(
|
|
|
193
194
|
): Promise<void> {
|
|
194
195
|
const out = manifestPath(root);
|
|
195
196
|
await mkdir(dirname(out), { recursive: true });
|
|
196
|
-
const manifest =
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
};
|
|
197
|
+
const manifest =
|
|
198
|
+
extra.preload === undefined
|
|
199
|
+
? { assets: STUDIO_ASSETS, shell: STUDIO_SHELL }
|
|
200
|
+
: { assets: STUDIO_ASSETS, preload: extra.preload, shell: STUDIO_SHELL };
|
|
201
201
|
await writeFile(out, `${JSON.stringify(manifest, null, 2)}\n`);
|
|
202
202
|
}
|
|
203
203
|
|
|
@@ -231,8 +231,8 @@ export async function studioPreload(root: string = STUDIO_PACKAGE_DIR): Promise<
|
|
|
231
231
|
if (!existsSync(path)) {
|
|
232
232
|
return [];
|
|
233
233
|
}
|
|
234
|
-
const manifest = JSON.parse(await readFile(path, "utf8"))
|
|
235
|
-
const
|
|
234
|
+
const manifest: unknown = JSON.parse(await readFile(path, "utf8"));
|
|
235
|
+
const preload = isNonNullObject(manifest) && "preload" in manifest ? manifest.preload : undefined;
|
|
236
236
|
if (!Array.isArray(preload)) {
|
|
237
237
|
return [];
|
|
238
238
|
}
|
|
@@ -47,7 +47,6 @@ import {
|
|
|
47
47
|
} from "../commands/command-args";
|
|
48
48
|
import type { CommandArgValues } from "../commands/command-args";
|
|
49
49
|
import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
50
|
-
import type { Tab } from "../tabs/tab";
|
|
51
50
|
|
|
52
51
|
/** The tags a translation verb may be asked for — the project's declared locales, read live. */
|
|
53
52
|
function declaredLocales(): string[] {
|
|
@@ -98,7 +97,7 @@ function addressedDocument(commandId: string, args: CommandArgValues): string {
|
|
|
98
97
|
}
|
|
99
98
|
return path;
|
|
100
99
|
}
|
|
101
|
-
const tab = paneId === undefined ?
|
|
100
|
+
const tab = paneId === undefined ? activeTab.value : tabOfPane(paneId);
|
|
102
101
|
if (!tab) {
|
|
103
102
|
throw new RangeError(
|
|
104
103
|
paneId === undefined
|
|
@@ -128,6 +127,7 @@ function siblingPath(documentPath: string, locale: string): string | null {
|
|
|
128
127
|
if (i18n === null || !i18n.locales.includes(locale)) {
|
|
129
128
|
notify.error(`This project does not declare ${localeLabel(locale)}.`, {
|
|
130
129
|
action: "settings.open",
|
|
130
|
+
actionArgs: { section: "locales" },
|
|
131
131
|
detail: "Add it in Settings › Locales, or with the Add Language command.",
|
|
132
132
|
source: "Languages",
|
|
133
133
|
});
|
|
@@ -322,7 +322,7 @@ export function i18nCommands(): AnyCommand[] {
|
|
|
322
322
|
when: (ctx) => ctx.project.isMultilingual,
|
|
323
323
|
/* No `aiTool`, by studio-ui-guidelines.md §12.4's first deletion rule: the panel is a surface
|
|
324
324
|
for a person. */
|
|
325
|
-
/* The panel is off the rail — it spends no rail slot
|
|
325
|
+
/* The panel is off the rail — it spends no rail slot — so this
|
|
326
326
|
command and the generated `panel.focus.i18n` are its only two doors, and both open the
|
|
327
327
|
same one. The TITLES must differ even though the behaviour does not: the palette is a flat
|
|
328
328
|
searchable list where "View: Show Languages" twice is two rows a reader cannot choose
|