@svgrid/enterprise 2.5.3 → 2.6.1
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/dist/SvAlertRuleEditor.svelte.d.ts +13 -0
- package/dist/SvAlertsManager.svelte.d.ts +14 -0
- package/dist/SvAlertsPanel.svelte.d.ts +9 -0
- package/dist/SvAuthGate.svelte.d.ts +22 -0
- package/dist/SvBoard.svelte.d.ts +35 -0
- package/dist/SvExportMenu.svelte.d.ts +61 -0
- package/{src → dist}/SvExpressionEditor.svelte +4 -1
- package/dist/SvExpressionEditor.svelte.d.ts +12 -0
- package/dist/SvFileInput.svelte.d.ts +20 -0
- package/dist/SvGridAlerts.svelte.d.ts +77 -0
- package/dist/SvGridBoard.svelte.d.ts +30 -0
- package/{src → dist}/SvGridEditPanel.svelte +173 -28
- package/dist/SvGridEditPanel.svelte.d.ts +75 -0
- package/dist/SvGridMasterDetail.svelte.d.ts +49 -0
- package/dist/SvGridScheduler.svelte.d.ts +30 -0
- package/dist/SvImportDialog.svelte.d.ts +88 -0
- package/dist/SvLookupInput.svelte.d.ts +21 -0
- package/dist/SvPivotDesigner.svelte.d.ts +176 -0
- package/dist/SvRecordDetail.svelte.d.ts +58 -0
- package/dist/SvSchedule.svelte.d.ts +29 -0
- package/dist/SvSchemaChart.svelte.d.ts +61 -0
- package/dist/SvSchemaDashboard.svelte.d.ts +46 -0
- package/dist/alerts/alert-engine-attach.d.ts +79 -0
- package/dist/alerts/alert-engine-attach.js +106 -0
- package/dist/alerts/alert-engine.d.ts +42 -0
- package/dist/alerts/alert-engine.js +196 -0
- package/dist/alerts/alert-formats.d.ts +26 -0
- package/dist/alerts/alert-formats.js +58 -0
- package/dist/alerts/alert-observer.d.ts +54 -0
- package/dist/alerts/alert-observer.js +156 -0
- package/dist/alerts/alert-scheduler.d.ts +30 -0
- package/dist/alerts/alert-scheduler.js +54 -0
- package/dist/alerts/alert-storage.d.ts +31 -0
- package/dist/alerts/alert-storage.js +92 -0
- package/dist/alerts/alert-store.svelte.d.ts +24 -0
- package/dist/alerts/alert-store.svelte.js +69 -0
- package/dist/alerts/alert-types.d.ts +86 -0
- package/dist/alerts/alert-types.js +1 -0
- package/dist/alerts.d.ts +2 -0
- package/{src/alerts.ts → dist/alerts.js} +9 -9
- package/dist/board.d.ts +7 -0
- package/{src/board.ts → dist/board.js} +13 -14
- package/dist/cdn/svgrid-enterprise.svelte-external.js +3220 -2607
- package/dist/designer/assets/index-BfzoL904.css +1 -0
- package/dist/designer/assets/{index-CBYU-KNn.js → index-CKdwDseq.js} +139 -139
- package/dist/designer/assets/src-DCKhP5Xy.css +1 -0
- package/dist/designer/assets/{src-i309BeJb.js → src-DLsSdh3J.js} +213 -193
- package/dist/designer/index.html +4 -4
- package/dist/edit-panel.d.ts +105 -0
- package/dist/edit-panel.js +350 -0
- package/dist/export-conditional.d.ts +31 -0
- package/dist/export-conditional.js +65 -0
- package/dist/export-ooxml.d.ts +93 -0
- package/dist/export-ooxml.js +385 -0
- package/dist/export-pdf.d.ts +107 -0
- package/dist/export-pdf.js +144 -0
- package/dist/export-print.d.ts +55 -0
- package/dist/export-print.js +91 -0
- package/{src/export-serialize.ts → dist/export-serialize.d.ts} +11 -24
- package/dist/export-serialize.js +11 -0
- package/dist/export-xls.d.ts +26 -0
- package/dist/export-xls.js +157 -0
- package/dist/export.d.ts +323 -0
- package/dist/export.js +1021 -0
- package/dist/expressions/evaluate.d.ts +17 -0
- package/dist/expressions/evaluate.js +214 -0
- package/dist/expressions/expression-columns.d.ts +61 -0
- package/dist/expressions/expression-columns.js +72 -0
- package/dist/expressions/expression-types.d.ts +125 -0
- package/dist/expressions/expression-types.js +1 -0
- package/dist/expressions/parse.d.ts +25 -0
- package/dist/expressions/parse.js +537 -0
- package/dist/import.d.ts +232 -0
- package/dist/import.js +846 -0
- package/dist/index.d.ts +66 -0
- package/dist/index.js +91 -0
- package/dist/install.d.ts +70 -0
- package/dist/install.js +61 -0
- package/dist/license-core.d.ts +37 -0
- package/dist/license-core.js +81 -0
- package/dist/license.d.ts +30 -0
- package/dist/license.js +139 -0
- package/dist/master-detail.d.ts +23 -0
- package/dist/master-detail.js +35 -0
- package/dist/node/studio.js +683 -13
- package/dist/pivot-chart.d.ts +28 -0
- package/dist/pivot-chart.js +71 -0
- package/dist/pivot-designer.d.ts +69 -0
- package/dist/pivot-designer.js +38 -0
- package/dist/pivot-enable.d.ts +6 -0
- package/{src/pivot-enable.ts → dist/pivot-enable.js} +13 -18
- package/dist/pivot.d.ts +111 -0
- package/dist/pivot.js +353 -0
- package/dist/print.d.ts +33 -0
- package/dist/print.js +61 -0
- package/dist/revoked.d.ts +1 -0
- package/{src/revoked.ts → dist/revoked.js} +5 -6
- package/dist/scheduler-assignments.d.ts +64 -0
- package/dist/scheduler-assignments.js +92 -0
- package/dist/scheduler-axis.d.ts +81 -0
- package/dist/scheduler-axis.js +180 -0
- package/{src/scheduler-booking.ts → dist/scheduler-booking.d.ts} +10 -43
- package/dist/scheduler-booking.js +50 -0
- package/dist/scheduler-config.d.ts +177 -0
- package/dist/scheduler-config.js +1 -0
- package/dist/scheduler-dependencies.d.ts +89 -0
- package/dist/scheduler-dependencies.js +179 -0
- package/dist/scheduler-freebusy.d.ts +19 -0
- package/{src/scheduler-freebusy.ts → dist/scheduler-freebusy.js} +9 -19
- package/{src/scheduler-heatmap.ts → dist/scheduler-heatmap.d.ts} +12 -35
- package/dist/scheduler-heatmap.js +41 -0
- package/dist/scheduler-resource-tree.d.ts +48 -0
- package/dist/scheduler-resource-tree.js +78 -0
- package/dist/scheduler-slots.d.ts +37 -0
- package/dist/scheduler-slots.js +80 -0
- package/dist/scheduler-summary.d.ts +41 -0
- package/dist/scheduler-summary.js +54 -0
- package/dist/scheduler.d.ts +7 -0
- package/{src/scheduler.ts → dist/scheduler.js} +13 -14
- package/dist/scheduling.d.ts +132 -0
- package/dist/scheduling.js +228 -0
- package/dist/schema-designer.d.ts +42 -0
- package/dist/schema-designer.js +117 -0
- package/dist/schema.d.ts +408 -0
- package/dist/schema.js +225 -0
- package/dist/smart-shim.d.ts +62 -0
- package/dist/smart-shim.js +34 -0
- package/dist/sources/aggregate.d.ts +43 -0
- package/dist/sources/aggregate.js +60 -0
- package/dist/sources/auth-supabase.d.ts +69 -0
- package/dist/sources/auth-supabase.js +39 -0
- package/dist/sources/dashboard.d.ts +65 -0
- package/dist/sources/dashboard.js +95 -0
- package/dist/sources/field-inference.d.ts +23 -0
- package/dist/sources/field-inference.js +52 -0
- package/dist/sources/filters.d.ts +35 -0
- package/dist/sources/filters.js +52 -0
- package/dist/sources/index.d.ts +18 -0
- package/dist/sources/index.js +18 -0
- package/dist/sources/introspect-supabase.d.ts +30 -0
- package/dist/sources/introspect-supabase.js +134 -0
- package/dist/sources/realtime-supabase.d.ts +37 -0
- package/dist/sources/realtime-supabase.js +52 -0
- package/dist/sources/relation-lookup.d.ts +50 -0
- package/dist/sources/relation-lookup.js +77 -0
- package/dist/sources/rest-adapters.d.ts +48 -0
- package/dist/sources/rest-adapters.js +85 -0
- package/dist/sources/rest.d.ts +38 -0
- package/dist/sources/rest.js +86 -0
- package/dist/sources/schema-from-columns.d.ts +37 -0
- package/dist/sources/schema-from-columns.js +48 -0
- package/dist/sources/supabase.d.ts +33 -0
- package/dist/sources/supabase.js +74 -0
- package/dist/sources/with-entity-rules.d.ts +25 -0
- package/dist/sources/with-entity-rules.js +47 -0
- package/dist/sources/with-relation-labels.d.ts +26 -0
- package/dist/sources/with-relation-labels.js +38 -0
- package/dist/staged-editing.d.ts +85 -0
- package/dist/staged-editing.js +0 -0
- package/dist/studio/bug-report.d.ts +61 -0
- package/dist/studio/bug-report.js +126 -0
- package/dist/studio/cli.d.ts +56 -0
- package/dist/studio/cli.js +70 -0
- package/dist/studio/copilot-core.d.ts +22 -0
- package/{src/studio/copilot-core.ts → dist/studio/copilot-core.js} +34 -38
- package/dist/studio/csv.d.ts +36 -0
- package/dist/studio/csv.js +173 -0
- package/dist/studio/db-connect-string.d.ts +45 -0
- package/dist/studio/db-connect-string.js +113 -0
- package/dist/studio/deploy-cli.d.ts +35 -0
- package/dist/studio/deploy-cli.js +81 -0
- package/dist/studio/emit-project.d.ts +77 -0
- package/dist/studio/emit-project.js +5463 -0
- package/dist/studio/emit-schema.d.ts +110 -0
- package/dist/studio/emit-schema.js +1128 -0
- package/dist/studio/index.d.ts +35 -0
- package/dist/studio/index.js +41 -0
- package/dist/studio/init-flow.d.ts +58 -0
- package/dist/studio/init-flow.js +451 -0
- package/dist/studio/introspect-db.d.ts +47 -0
- package/dist/studio/introspect-db.js +255 -0
- package/dist/studio/introspect-openapi.d.ts +19 -0
- package/dist/studio/introspect-openapi.js +244 -0
- package/dist/studio/introspect-prisma.d.ts +25 -0
- package/dist/studio/introspect-prisma.js +164 -0
- package/dist/studio/introspect.d.ts +35 -0
- package/dist/studio/introspect.js +306 -0
- package/dist/studio/project.d.ts +1448 -0
- package/dist/studio/project.js +2187 -0
- package/dist/studio/sample-data.d.ts +19 -0
- package/dist/studio/sample-data.js +207 -0
- package/dist/studio/samples/ats.d.ts +2 -0
- package/dist/studio/samples/ats.js +194 -0
- package/dist/studio/samples/clinic.d.ts +2 -0
- package/dist/studio/samples/clinic.js +171 -0
- package/dist/studio/samples/crm.d.ts +2 -0
- package/dist/studio/samples/crm.js +280 -0
- package/dist/studio/samples/datasets.d.ts +38 -0
- package/dist/studio/samples/datasets.js +296 -0
- package/dist/studio/samples/ecommerce.d.ts +2 -0
- package/dist/studio/samples/ecommerce.js +178 -0
- package/dist/studio/samples/events.d.ts +2 -0
- package/dist/studio/samples/events.js +192 -0
- package/dist/studio/samples/fleet.d.ts +2 -0
- package/dist/studio/samples/fleet.js +203 -0
- package/dist/studio/samples/gym.d.ts +2 -0
- package/dist/studio/samples/gym.js +205 -0
- package/dist/studio/samples/hr.d.ts +2 -0
- package/dist/studio/samples/hr.js +186 -0
- package/dist/studio/samples/index.d.ts +13 -0
- package/dist/studio/samples/index.js +44 -0
- package/dist/studio/samples/insurance.d.ts +2 -0
- package/dist/studio/samples/insurance.js +220 -0
- package/dist/studio/samples/inventory.d.ts +2 -0
- package/dist/studio/samples/inventory.js +204 -0
- package/dist/studio/samples/invoicing.d.ts +2 -0
- package/dist/studio/samples/invoicing.js +154 -0
- package/dist/studio/samples/library.d.ts +2 -0
- package/dist/studio/samples/library.js +171 -0
- package/dist/studio/samples/live-data.d.ts +5 -0
- package/dist/studio/samples/live-data.js +261 -0
- package/dist/studio/samples/projects.d.ts +2 -0
- package/dist/studio/samples/projects.js +203 -0
- package/dist/studio/samples/realestate.d.ts +2 -0
- package/dist/studio/samples/realestate.js +187 -0
- package/dist/studio/samples/restaurant.d.ts +2 -0
- package/dist/studio/samples/restaurant.js +180 -0
- package/dist/studio/samples/school.d.ts +2 -0
- package/dist/studio/samples/school.js +188 -0
- package/dist/studio/samples/shared.d.ts +142 -0
- package/dist/studio/samples/shared.js +164 -0
- package/dist/studio/samples/starter.d.ts +4 -0
- package/dist/studio/samples/starter.js +237 -0
- package/dist/studio/samples/subscriptions.d.ts +2 -0
- package/dist/studio/samples/subscriptions.js +175 -0
- package/dist/studio/samples/support.d.ts +2 -0
- package/dist/studio/samples/support.js +209 -0
- package/dist/studio/scaffold-app.d.ts +22 -0
- package/{src/studio/scaffold-app.ts → dist/studio/scaffold-app.js} +45 -63
- package/dist/studio/scaffold.d.ts +63 -0
- package/dist/studio/scaffold.js +346 -0
- package/dist/studio/screen-suites.d.ts +193 -0
- package/dist/studio/screen-suites.js +297 -0
- package/dist/studio/themes.d.ts +34 -0
- package/dist/studio/themes.js +41 -0
- package/dist/studio/ui-components.d.ts +89 -0
- package/dist/studio/ui-components.generated.d.ts +29 -0
- package/dist/studio/ui-components.generated.js +7319 -0
- package/dist/studio/ui-components.js +673 -0
- package/dist/studio/user-error.d.ts +23 -0
- package/{src/studio/user-error.ts → dist/studio/user-error.js} +10 -13
- package/dist/studio/verify.d.ts +34 -0
- package/dist/studio/verify.js +47 -0
- package/dist/sveltekit/in-memory.d.ts +14 -0
- package/dist/sveltekit/in-memory.js +113 -0
- package/dist/sveltekit/index.d.ts +6 -0
- package/dist/sveltekit/index.js +5 -0
- package/dist/sveltekit/query-plan.d.ts +44 -0
- package/dist/sveltekit/query-plan.js +76 -0
- package/dist/sveltekit/sql-source.d.ts +47 -0
- package/dist/sveltekit/sql-source.js +106 -0
- package/dist/sveltekit/sql.d.ts +48 -0
- package/dist/sveltekit/sql.js +73 -0
- package/dist/sveltekit/transport.d.ts +209 -0
- package/dist/sveltekit/transport.js +219 -0
- package/{src/sveltekit/types.ts → dist/sveltekit/types.d.ts} +8 -11
- package/dist/sveltekit/types.js +1 -0
- package/dist/upgrade-prompt.d.ts +16 -0
- package/dist/upgrade-prompt.js +141 -0
- package/dist/version.d.ts +13 -0
- package/{src/version.ts → dist/version.js} +1 -1
- package/dist/watermark.d.ts +2 -0
- package/dist/watermark.js +146 -0
- package/package.json +28 -26
- package/dist/designer/assets/index-oYok52zd.css +0 -1
- package/dist/designer/assets/src-D-O2F805.css +0 -1
- package/src/SvBoard.dom.test.ts +0 -67
- package/src/SvGridAlerts.dom.test.ts +0 -113
- package/src/SvGridEditPanel.dom.test.ts +0 -320
- package/src/SvRecordDetail.dom.test.ts +0 -137
- package/src/SvSchedule.dom.test.ts +0 -57
- package/src/ai-export-pdf.dom.test.ts +0 -77
- package/src/ai-export-xlsx.dom.test.ts +0 -90
- package/src/ai-export.dom.test.ts +0 -114
- package/src/alerts/alert-engine-attach.ts +0 -165
- package/src/alerts/alert-engine.test.ts +0 -135
- package/src/alerts/alert-engine.ts +0 -260
- package/src/alerts/alert-formats.test.ts +0 -87
- package/src/alerts/alert-formats.ts +0 -77
- package/src/alerts/alert-observer.test.ts +0 -189
- package/src/alerts/alert-observer.ts +0 -208
- package/src/alerts/alert-scheduler.ts +0 -96
- package/src/alerts/alert-storage.test.ts +0 -54
- package/src/alerts/alert-storage.ts +0 -116
- package/src/alerts/alert-store.svelte.ts +0 -80
- package/src/alerts/alert-types.ts +0 -94
- package/src/board.dom.test.ts +0 -941
- package/src/edit-panel.test.ts +0 -322
- package/src/edit-panel.ts +0 -379
- package/src/export-conditional.test.ts +0 -60
- package/src/export-conditional.ts +0 -94
- package/src/export-ooxml.test.ts +0 -152
- package/src/export-ooxml.ts +0 -489
- package/src/export-pdf.test.ts +0 -138
- package/src/export-pdf.ts +0 -245
- package/src/export-print.test.ts +0 -66
- package/src/export-print.ts +0 -132
- package/src/export-serialize.test.ts +0 -56
- package/src/export-xls.ts +0 -199
- package/src/export-xlsx-roundtrip.test.ts +0 -120
- package/src/export-xlsx.test.ts +0 -150
- package/src/export.test.ts +0 -349
- package/src/export.ts +0 -1464
- package/src/expressions/evaluate.test.ts +0 -111
- package/src/expressions/evaluate.ts +0 -237
- package/src/expressions/expression-columns.ts +0 -133
- package/src/expressions/expression-types.ts +0 -84
- package/src/expressions/parse.test.ts +0 -106
- package/src/expressions/parse.ts +0 -610
- package/src/import-automap.test.ts +0 -131
- package/src/import-hardening.test.ts +0 -158
- package/src/import.test.ts +0 -415
- package/src/import.ts +0 -1044
- package/src/index.ts +0 -569
- package/src/install.ts +0 -154
- package/src/license-core.test.ts +0 -23
- package/src/license-core.ts +0 -107
- package/src/license-expiry.test.ts +0 -144
- package/src/license.ts +0 -157
- package/src/master-detail.test.ts +0 -61
- package/src/master-detail.ts +0 -42
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -178
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js +0 -3875
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js +0 -21
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js +0 -1938
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js +0 -205
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js +0 -18
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js +0 -264
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js +0 -697
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -134
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -55
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -2
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -46843
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -237
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -2
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -4
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -7
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -4
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -5
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -5
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -5
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -6
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -83
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -559
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -24
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -122
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -2
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -89
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -241
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js +0 -4938
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js +0 -495
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js +0 -190
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js +0 -8
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js +0 -138
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js.map +0 -1
- package/src/pivot-chart.test.ts +0 -86
- package/src/pivot-chart.ts +0 -112
- package/src/pivot-designer.ts +0 -101
- package/src/pivot.test.ts +0 -335
- package/src/pivot.ts +0 -578
- package/src/print.ts +0 -107
- package/src/scheduler-assignments.test.ts +0 -97
- package/src/scheduler-assignments.ts +0 -134
- package/src/scheduler-axis.test.ts +0 -108
- package/src/scheduler-axis.ts +0 -238
- package/src/scheduler-booking.test.ts +0 -57
- package/src/scheduler-config.ts +0 -179
- package/src/scheduler-dependencies.test.ts +0 -155
- package/src/scheduler-dependencies.ts +0 -223
- package/src/scheduler-freebusy.test.ts +0 -41
- package/src/scheduler-heatmap.test.ts +0 -39
- package/src/scheduler-resource-tree.test.ts +0 -84
- package/src/scheduler-resource-tree.ts +0 -107
- package/src/scheduler-slots.test.ts +0 -53
- package/src/scheduler-slots.ts +0 -94
- package/src/scheduler-summary.test.ts +0 -47
- package/src/scheduler-summary.ts +0 -81
- package/src/scheduling.test.ts +0 -194
- package/src/scheduling.ts +0 -293
- package/src/schema-designer.test.ts +0 -121
- package/src/schema-designer.ts +0 -142
- package/src/schema.test.ts +0 -268
- package/src/schema.ts +0 -562
- package/src/smart-shim.ts +0 -107
- package/src/sources/aggregate.test.ts +0 -79
- package/src/sources/aggregate.ts +0 -102
- package/src/sources/auth-supabase.test.ts +0 -80
- package/src/sources/auth-supabase.ts +0 -87
- package/src/sources/dashboard.kpi.test.ts +0 -50
- package/src/sources/dashboard.test.ts +0 -61
- package/src/sources/dashboard.ts +0 -136
- package/src/sources/field-inference.test.ts +0 -60
- package/src/sources/field-inference.ts +0 -63
- package/src/sources/filters.test.ts +0 -58
- package/src/sources/filters.ts +0 -70
- package/src/sources/index.ts +0 -67
- package/src/sources/introspect-supabase.test.ts +0 -112
- package/src/sources/introspect-supabase.ts +0 -139
- package/src/sources/realtime-supabase.test.ts +0 -93
- package/src/sources/realtime-supabase.ts +0 -99
- package/src/sources/relation-lookup.test.ts +0 -99
- package/src/sources/relation-lookup.ts +0 -128
- package/src/sources/rest-adapters.test.ts +0 -95
- package/src/sources/rest-adapters.ts +0 -120
- package/src/sources/rest.test.ts +0 -104
- package/src/sources/rest.ts +0 -129
- package/src/sources/schema-from-columns.test.ts +0 -106
- package/src/sources/schema-from-columns.ts +0 -88
- package/src/sources/supabase.test.ts +0 -110
- package/src/sources/supabase.ts +0 -99
- package/src/sources/with-entity-rules.test.ts +0 -104
- package/src/sources/with-entity-rules.ts +0 -78
- package/src/sources/with-relation-labels.test.ts +0 -75
- package/src/sources/with-relation-labels.ts +0 -73
- package/src/staged-editing.ts +0 -0
- package/src/studio/bug-report.test.ts +0 -101
- package/src/studio/bug-report.ts +0 -165
- package/src/studio/cli.test.ts +0 -187
- package/src/studio/cli.ts +0 -117
- package/src/studio/copilot-core.test.ts +0 -45
- package/src/studio/csv.test.ts +0 -90
- package/src/studio/csv.ts +0 -165
- package/src/studio/db-connect-string.test.ts +0 -94
- package/src/studio/db-connect-string.ts +0 -128
- package/src/studio/deploy-cli.test.ts +0 -56
- package/src/studio/deploy-cli.ts +0 -100
- package/src/studio/emit-project.test.ts +0 -3324
- package/src/studio/emit-project.ts +0 -5377
- package/src/studio/emit-schema.test.ts +0 -111
- package/src/studio/emit-schema.ts +0 -1181
- package/src/studio/index.ts +0 -380
- package/src/studio/init-flow.test.ts +0 -514
- package/src/studio/init-flow.ts +0 -556
- package/src/studio/introspect-db.test.ts +0 -186
- package/src/studio/introspect-db.ts +0 -312
- package/src/studio/introspect-openapi.test.ts +0 -84
- package/src/studio/introspect-openapi.ts +0 -252
- package/src/studio/introspect-prisma.test.ts +0 -99
- package/src/studio/introspect-prisma.ts +0 -175
- package/src/studio/introspect.test.ts +0 -172
- package/src/studio/introspect.ts +0 -310
- package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -1
- package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -3
- package/src/studio/pipeline.test.ts +0 -42
- package/src/studio/project-robust.test.ts +0 -157
- package/src/studio/project.test.ts +0 -929
- package/src/studio/project.ts +0 -2394
- package/src/studio/sample-data.test.ts +0 -58
- package/src/studio/sample-data.ts +0 -203
- package/src/studio/samples/ats.ts +0 -202
- package/src/studio/samples/clinic.ts +0 -179
- package/src/studio/samples/crm.ts +0 -291
- package/src/studio/samples/datasets.test.ts +0 -84
- package/src/studio/samples/datasets.ts +0 -340
- package/src/studio/samples/ecommerce.ts +0 -187
- package/src/studio/samples/events.ts +0 -201
- package/src/studio/samples/fleet.ts +0 -213
- package/src/studio/samples/gym.ts +0 -215
- package/src/studio/samples/hr.ts +0 -195
- package/src/studio/samples/index.ts +0 -55
- package/src/studio/samples/insurance.ts +0 -229
- package/src/studio/samples/inventory.ts +0 -213
- package/src/studio/samples/invoicing.ts +0 -162
- package/src/studio/samples/library.ts +0 -180
- package/src/studio/samples/live-data.test.ts +0 -99
- package/src/studio/samples/live-data.ts +0 -306
- package/src/studio/samples/projects.ts +0 -212
- package/src/studio/samples/realestate.ts +0 -196
- package/src/studio/samples/restaurant.ts +0 -189
- package/src/studio/samples/samples.test.ts +0 -304
- package/src/studio/samples/school.ts +0 -197
- package/src/studio/samples/seed-floor.test.ts +0 -25
- package/src/studio/samples/shared.ts +0 -237
- package/src/studio/samples/starter.ts +0 -251
- package/src/studio/samples/subscriptions.ts +0 -183
- package/src/studio/samples/support.ts +0 -216
- package/src/studio/scaffold-app.test.ts +0 -91
- package/src/studio/scaffold.test.ts +0 -192
- package/src/studio/scaffold.ts +0 -390
- package/src/studio/screen-suites.test.ts +0 -269
- package/src/studio/screen-suites.ts +0 -448
- package/src/studio/themes.ts +0 -62
- package/src/studio/ui-components-surface.test.ts +0 -185
- package/src/studio/ui-components.generated.ts +0 -7154
- package/src/studio/ui-components.ts +0 -742
- package/src/studio/verify.test.ts +0 -47
- package/src/studio/verify.ts +0 -79
- package/src/sveltekit/in-memory.test.ts +0 -104
- package/src/sveltekit/in-memory.ts +0 -129
- package/src/sveltekit/index.ts +0 -24
- package/src/sveltekit/query-plan.test.ts +0 -109
- package/src/sveltekit/query-plan.ts +0 -125
- package/src/sveltekit/sql-source.test.ts +0 -198
- package/src/sveltekit/sql-source.ts +0 -171
- package/src/sveltekit/sql.test.ts +0 -80
- package/src/sveltekit/sql.ts +0 -131
- package/src/sveltekit/transport-scope.test.ts +0 -125
- package/src/sveltekit/transport.test.ts +0 -201
- package/src/sveltekit/transport.ts +0 -373
- package/src/upgrade-prompt.test.ts +0 -71
- package/src/upgrade-prompt.ts +0 -162
- package/src/version.test.ts +0 -17
- package/src/watermark.test.ts +0 -97
- package/src/watermark.ts +0 -156
- /package/{src → dist}/SvAlertRuleEditor.svelte +0 -0
- /package/{src → dist}/SvAlertsManager.svelte +0 -0
- /package/{src → dist}/SvAlertsPanel.svelte +0 -0
- /package/{src → dist}/SvAuthGate.svelte +0 -0
- /package/{src → dist}/SvBoard.svelte +0 -0
- /package/{src → dist}/SvExportMenu.svelte +0 -0
- /package/{src → dist}/SvFileInput.svelte +0 -0
- /package/{src → dist}/SvGridAlerts.svelte +0 -0
- /package/{src → dist}/SvGridBoard.svelte +0 -0
- /package/{src → dist}/SvGridMasterDetail.svelte +0 -0
- /package/{src → dist}/SvGridScheduler.svelte +0 -0
- /package/{src → dist}/SvImportDialog.svelte +0 -0
- /package/{src → dist}/SvLookupInput.svelte +0 -0
- /package/{src → dist}/SvPivotDesigner.svelte +0 -0
- /package/{src → dist}/SvRecordDetail.svelte +0 -0
- /package/{src → dist}/SvSchedule.svelte +0 -0
- /package/{src → dist}/SvSchemaChart.svelte +0 -0
- /package/{src → dist}/SvSchemaDashboard.svelte +0 -0
- /package/{src → dist}/pdfmake-shims.d.ts +0 -0
- /package/{src → dist}/smart.export.d.ts +0 -0
- /package/{src → dist}/smart.export.js +0 -0
- /package/{src → dist}/studio/HANDLERS-DESIGN.md +0 -0
- /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js.map +0 -0
- /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js.map +0 -0
package/dist/node/studio.js
CHANGED
|
@@ -66,6 +66,15 @@ function hiddenFor(field, surface) {
|
|
|
66
66
|
return false;
|
|
67
67
|
}
|
|
68
68
|
/**
|
|
69
|
+
* Whether a field is hidden from one surface. Public because the `hidden`
|
|
70
|
+
* union (`true` means both surfaces, an object names them) is exactly the kind
|
|
71
|
+
* of logic that drifts when every caller re-derives it - the form builder's
|
|
72
|
+
* "Hidden from this form" tray is one such caller.
|
|
73
|
+
*/
|
|
74
|
+
function isFieldHidden(field, surface) {
|
|
75
|
+
return hiddenFor(field, surface);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
69
78
|
* Derive grid columns from a schema. Read-only fields become non-editable
|
|
70
79
|
* columns; `enum` carries its options through as `editorOptions`. The
|
|
71
80
|
* per-field `column` escape hatch is merged last, so any explicit grid prop
|
|
@@ -2552,6 +2561,13 @@ var GENERATED_UI_SURFACE = {
|
|
|
2552
2561
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
2553
2562
|
"group": "behavior"
|
|
2554
2563
|
},
|
|
2564
|
+
{
|
|
2565
|
+
"key": "block",
|
|
2566
|
+
"label": "Block",
|
|
2567
|
+
"type": "boolean",
|
|
2568
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
2569
|
+
"group": "appearance"
|
|
2570
|
+
},
|
|
2555
2571
|
{
|
|
2556
2572
|
"key": "error",
|
|
2557
2573
|
"label": "Error",
|
|
@@ -2674,6 +2690,13 @@ var GENERATED_UI_SURFACE = {
|
|
|
2674
2690
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
2675
2691
|
"group": "behavior"
|
|
2676
2692
|
},
|
|
2693
|
+
{
|
|
2694
|
+
"key": "block",
|
|
2695
|
+
"label": "Block",
|
|
2696
|
+
"type": "boolean",
|
|
2697
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
2698
|
+
"group": "appearance"
|
|
2699
|
+
},
|
|
2677
2700
|
{
|
|
2678
2701
|
"key": "error",
|
|
2679
2702
|
"label": "Error",
|
|
@@ -2809,6 +2832,14 @@ var GENERATED_UI_SURFACE = {
|
|
|
2809
2832
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
2810
2833
|
"group": "behavior"
|
|
2811
2834
|
},
|
|
2835
|
+
{
|
|
2836
|
+
"key": "block",
|
|
2837
|
+
"label": "Block",
|
|
2838
|
+
"type": "boolean",
|
|
2839
|
+
"default": false,
|
|
2840
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
2841
|
+
"group": "appearance"
|
|
2842
|
+
},
|
|
2812
2843
|
{
|
|
2813
2844
|
"key": "error",
|
|
2814
2845
|
"label": "Error",
|
|
@@ -3039,6 +3070,13 @@ var GENERATED_UI_SURFACE = {
|
|
|
3039
3070
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
3040
3071
|
"group": "behavior"
|
|
3041
3072
|
},
|
|
3073
|
+
{
|
|
3074
|
+
"key": "block",
|
|
3075
|
+
"label": "Block",
|
|
3076
|
+
"type": "boolean",
|
|
3077
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
3078
|
+
"group": "appearance"
|
|
3079
|
+
},
|
|
3042
3080
|
{
|
|
3043
3081
|
"key": "error",
|
|
3044
3082
|
"label": "Error",
|
|
@@ -3214,6 +3252,14 @@ var GENERATED_UI_SURFACE = {
|
|
|
3214
3252
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
3215
3253
|
"group": "behavior"
|
|
3216
3254
|
},
|
|
3255
|
+
{
|
|
3256
|
+
"key": "block",
|
|
3257
|
+
"label": "Block",
|
|
3258
|
+
"type": "boolean",
|
|
3259
|
+
"default": false,
|
|
3260
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
3261
|
+
"group": "appearance"
|
|
3262
|
+
},
|
|
3217
3263
|
{
|
|
3218
3264
|
"key": "error",
|
|
3219
3265
|
"label": "Error",
|
|
@@ -3438,6 +3484,14 @@ var GENERATED_UI_SURFACE = {
|
|
|
3438
3484
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
3439
3485
|
"group": "behavior"
|
|
3440
3486
|
},
|
|
3487
|
+
{
|
|
3488
|
+
"key": "block",
|
|
3489
|
+
"label": "Block",
|
|
3490
|
+
"type": "boolean",
|
|
3491
|
+
"default": false,
|
|
3492
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
3493
|
+
"group": "appearance"
|
|
3494
|
+
},
|
|
3441
3495
|
{
|
|
3442
3496
|
"key": "error",
|
|
3443
3497
|
"label": "Error",
|
|
@@ -3612,6 +3666,14 @@ var GENERATED_UI_SURFACE = {
|
|
|
3612
3666
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
3613
3667
|
"group": "behavior"
|
|
3614
3668
|
},
|
|
3669
|
+
{
|
|
3670
|
+
"key": "block",
|
|
3671
|
+
"label": "Block",
|
|
3672
|
+
"type": "boolean",
|
|
3673
|
+
"default": false,
|
|
3674
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
3675
|
+
"group": "appearance"
|
|
3676
|
+
},
|
|
3615
3677
|
{
|
|
3616
3678
|
"key": "error",
|
|
3617
3679
|
"label": "Error",
|
|
@@ -3763,6 +3825,13 @@ var GENERATED_UI_SURFACE = {
|
|
|
3763
3825
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
3764
3826
|
"group": "behavior"
|
|
3765
3827
|
},
|
|
3828
|
+
{
|
|
3829
|
+
"key": "block",
|
|
3830
|
+
"label": "Block",
|
|
3831
|
+
"type": "boolean",
|
|
3832
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
3833
|
+
"group": "appearance"
|
|
3834
|
+
},
|
|
3766
3835
|
{
|
|
3767
3836
|
"key": "error",
|
|
3768
3837
|
"label": "Error",
|
|
@@ -3898,6 +3967,13 @@ var GENERATED_UI_SURFACE = {
|
|
|
3898
3967
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
3899
3968
|
"group": "behavior"
|
|
3900
3969
|
},
|
|
3970
|
+
{
|
|
3971
|
+
"key": "block",
|
|
3972
|
+
"label": "Block",
|
|
3973
|
+
"type": "boolean",
|
|
3974
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
3975
|
+
"group": "appearance"
|
|
3976
|
+
},
|
|
3901
3977
|
{
|
|
3902
3978
|
"key": "error",
|
|
3903
3979
|
"label": "Error",
|
|
@@ -4049,6 +4125,14 @@ var GENERATED_UI_SURFACE = {
|
|
|
4049
4125
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
4050
4126
|
"group": "behavior"
|
|
4051
4127
|
},
|
|
4128
|
+
{
|
|
4129
|
+
"key": "block",
|
|
4130
|
+
"label": "Block",
|
|
4131
|
+
"type": "boolean",
|
|
4132
|
+
"default": false,
|
|
4133
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
4134
|
+
"group": "appearance"
|
|
4135
|
+
},
|
|
4052
4136
|
{
|
|
4053
4137
|
"key": "error",
|
|
4054
4138
|
"label": "Error",
|
|
@@ -4770,6 +4854,14 @@ var GENERATED_UI_SURFACE = {
|
|
|
4770
4854
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
4771
4855
|
"group": "behavior"
|
|
4772
4856
|
},
|
|
4857
|
+
{
|
|
4858
|
+
"key": "block",
|
|
4859
|
+
"label": "Block",
|
|
4860
|
+
"type": "boolean",
|
|
4861
|
+
"default": false,
|
|
4862
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
4863
|
+
"group": "appearance"
|
|
4864
|
+
},
|
|
4773
4865
|
{
|
|
4774
4866
|
"key": "error",
|
|
4775
4867
|
"label": "Error",
|
|
@@ -4944,6 +5036,14 @@ var GENERATED_UI_SURFACE = {
|
|
|
4944
5036
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
4945
5037
|
"group": "behavior"
|
|
4946
5038
|
},
|
|
5039
|
+
{
|
|
5040
|
+
"key": "block",
|
|
5041
|
+
"label": "Block",
|
|
5042
|
+
"type": "boolean",
|
|
5043
|
+
"default": false,
|
|
5044
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
5045
|
+
"group": "appearance"
|
|
5046
|
+
},
|
|
4947
5047
|
{
|
|
4948
5048
|
"key": "error",
|
|
4949
5049
|
"label": "Error",
|
|
@@ -5103,6 +5203,14 @@ var GENERATED_UI_SURFACE = {
|
|
|
5103
5203
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
5104
5204
|
"group": "behavior"
|
|
5105
5205
|
},
|
|
5206
|
+
{
|
|
5207
|
+
"key": "block",
|
|
5208
|
+
"label": "Block",
|
|
5209
|
+
"type": "boolean",
|
|
5210
|
+
"default": false,
|
|
5211
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
5212
|
+
"group": "appearance"
|
|
5213
|
+
},
|
|
5106
5214
|
{
|
|
5107
5215
|
"key": "error",
|
|
5108
5216
|
"label": "Error",
|
|
@@ -5252,6 +5360,14 @@ var GENERATED_UI_SURFACE = {
|
|
|
5252
5360
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
5253
5361
|
"group": "behavior"
|
|
5254
5362
|
},
|
|
5363
|
+
{
|
|
5364
|
+
"key": "block",
|
|
5365
|
+
"label": "Block",
|
|
5366
|
+
"type": "boolean",
|
|
5367
|
+
"default": false,
|
|
5368
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
5369
|
+
"group": "appearance"
|
|
5370
|
+
},
|
|
5255
5371
|
{
|
|
5256
5372
|
"key": "error",
|
|
5257
5373
|
"label": "Error",
|
|
@@ -5434,6 +5550,13 @@ var GENERATED_UI_SURFACE = {
|
|
|
5434
5550
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
5435
5551
|
"group": "behavior"
|
|
5436
5552
|
},
|
|
5553
|
+
{
|
|
5554
|
+
"key": "block",
|
|
5555
|
+
"label": "Block",
|
|
5556
|
+
"type": "boolean",
|
|
5557
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
5558
|
+
"group": "appearance"
|
|
5559
|
+
},
|
|
5437
5560
|
{
|
|
5438
5561
|
"key": "error",
|
|
5439
5562
|
"label": "Error",
|
|
@@ -5568,6 +5691,13 @@ var GENERATED_UI_SURFACE = {
|
|
|
5568
5691
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
5569
5692
|
"group": "behavior"
|
|
5570
5693
|
},
|
|
5694
|
+
{
|
|
5695
|
+
"key": "block",
|
|
5696
|
+
"label": "Block",
|
|
5697
|
+
"type": "boolean",
|
|
5698
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
5699
|
+
"group": "appearance"
|
|
5700
|
+
},
|
|
5571
5701
|
{
|
|
5572
5702
|
"key": "error",
|
|
5573
5703
|
"label": "Error",
|
|
@@ -5719,6 +5849,14 @@ var GENERATED_UI_SURFACE = {
|
|
|
5719
5849
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
5720
5850
|
"group": "behavior"
|
|
5721
5851
|
},
|
|
5852
|
+
{
|
|
5853
|
+
"key": "block",
|
|
5854
|
+
"label": "Block",
|
|
5855
|
+
"type": "boolean",
|
|
5856
|
+
"default": false,
|
|
5857
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
5858
|
+
"group": "appearance"
|
|
5859
|
+
},
|
|
5722
5860
|
{
|
|
5723
5861
|
"key": "error",
|
|
5724
5862
|
"label": "Error",
|
|
@@ -5901,6 +6039,13 @@ var GENERATED_UI_SURFACE = {
|
|
|
5901
6039
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
5902
6040
|
"group": "behavior"
|
|
5903
6041
|
},
|
|
6042
|
+
{
|
|
6043
|
+
"key": "block",
|
|
6044
|
+
"label": "Block",
|
|
6045
|
+
"type": "boolean",
|
|
6046
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
6047
|
+
"group": "appearance"
|
|
6048
|
+
},
|
|
5904
6049
|
{
|
|
5905
6050
|
"key": "error",
|
|
5906
6051
|
"label": "Error",
|
|
@@ -6082,6 +6227,13 @@ var GENERATED_UI_SURFACE = {
|
|
|
6082
6227
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
6083
6228
|
"group": "behavior"
|
|
6084
6229
|
},
|
|
6230
|
+
{
|
|
6231
|
+
"key": "block",
|
|
6232
|
+
"label": "Block",
|
|
6233
|
+
"type": "boolean",
|
|
6234
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
6235
|
+
"group": "appearance"
|
|
6236
|
+
},
|
|
6085
6237
|
{
|
|
6086
6238
|
"key": "error",
|
|
6087
6239
|
"label": "Error",
|
|
@@ -6269,6 +6421,13 @@ var GENERATED_UI_SURFACE = {
|
|
|
6269
6421
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
6270
6422
|
"group": "behavior"
|
|
6271
6423
|
},
|
|
6424
|
+
{
|
|
6425
|
+
"key": "block",
|
|
6426
|
+
"label": "Block",
|
|
6427
|
+
"type": "boolean",
|
|
6428
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
6429
|
+
"group": "appearance"
|
|
6430
|
+
},
|
|
6272
6431
|
{
|
|
6273
6432
|
"key": "error",
|
|
6274
6433
|
"label": "Error",
|
|
@@ -6830,6 +6989,14 @@ var GENERATED_UI_SURFACE = {
|
|
|
6830
6989
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
6831
6990
|
"group": "behavior"
|
|
6832
6991
|
},
|
|
6992
|
+
{
|
|
6993
|
+
"key": "block",
|
|
6994
|
+
"label": "Block",
|
|
6995
|
+
"type": "boolean",
|
|
6996
|
+
"default": false,
|
|
6997
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
6998
|
+
"group": "appearance"
|
|
6999
|
+
},
|
|
6833
7000
|
{
|
|
6834
7001
|
"key": "error",
|
|
6835
7002
|
"label": "Error",
|
|
@@ -7504,6 +7671,14 @@ var GENERATED_UI_SURFACE = {
|
|
|
7504
7671
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
7505
7672
|
"group": "behavior"
|
|
7506
7673
|
},
|
|
7674
|
+
{
|
|
7675
|
+
"key": "block",
|
|
7676
|
+
"label": "Block",
|
|
7677
|
+
"type": "boolean",
|
|
7678
|
+
"default": false,
|
|
7679
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
7680
|
+
"group": "appearance"
|
|
7681
|
+
},
|
|
7507
7682
|
{
|
|
7508
7683
|
"key": "error",
|
|
7509
7684
|
"label": "Error",
|
|
@@ -7905,6 +8080,13 @@ var GENERATED_UI_SURFACE = {
|
|
|
7905
8080
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
7906
8081
|
"group": "behavior"
|
|
7907
8082
|
},
|
|
8083
|
+
{
|
|
8084
|
+
"key": "block",
|
|
8085
|
+
"label": "Block",
|
|
8086
|
+
"type": "boolean",
|
|
8087
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
8088
|
+
"group": "appearance"
|
|
8089
|
+
},
|
|
7908
8090
|
{
|
|
7909
8091
|
"key": "error",
|
|
7910
8092
|
"label": "Error",
|
|
@@ -8201,6 +8383,13 @@ var GENERATED_UI_SURFACE = {
|
|
|
8201
8383
|
"description": "Marks the control invalid (`aria-invalid` + error styling).",
|
|
8202
8384
|
"group": "behavior"
|
|
8203
8385
|
},
|
|
8386
|
+
{
|
|
8387
|
+
"key": "block",
|
|
8388
|
+
"label": "Block",
|
|
8389
|
+
"type": "boolean",
|
|
8390
|
+
"description": "Fill the container instead of the control's own default width. A default width is right for a control sitting on its own; in a form grid a row of inputs each stopping at a different width reads as broken.",
|
|
8391
|
+
"group": "appearance"
|
|
8392
|
+
},
|
|
8204
8393
|
{
|
|
8205
8394
|
"key": "error",
|
|
8206
8395
|
"label": "Error",
|
|
@@ -11064,6 +11253,18 @@ function gridApiSettableProps() {
|
|
|
11064
11253
|
}
|
|
11065
11254
|
//#endregion
|
|
11066
11255
|
//#region src/studio/project.ts
|
|
11256
|
+
/**
|
|
11257
|
+
* Studio project model - the declarative spine the visual designer edits and the
|
|
11258
|
+
* codegen emits. A project is a multi-entity app: `entities` (the data model) +
|
|
11259
|
+
* `screens` (one per entity by default), where a screen is an ordered list of
|
|
11260
|
+
* data-bound `blocks` (grid, form, chart, dashboard, KPI, master-detail, lookup).
|
|
11261
|
+
*
|
|
11262
|
+
* Pure + node-safe (lives in the `./studio` subtree - `.js` imports, no Svelte,
|
|
11263
|
+
* no `sources/`), mirroring the immutable-ops style of `schema-designer.ts`:
|
|
11264
|
+
* every mutation returns a NEW project so Svelte reactivity + undo stay simple.
|
|
11265
|
+
* Block-config unions are defined here (not imported from `sources/`) to keep the
|
|
11266
|
+
* module resolvable under node16.
|
|
11267
|
+
*/
|
|
11067
11268
|
/** Block kinds allowed inside a Tabs / Accordion container: the controller-free,
|
|
11068
11269
|
* `allRows`-driven display blocks (no grid / form / master-detail, which need the
|
|
11069
11270
|
* screen controller). `component` covers any UI-kit component added by key. */
|
|
@@ -11652,13 +11853,18 @@ function setJob(project, id, job) {
|
|
|
11652
11853
|
jobs: next.length ? next : void 0
|
|
11653
11854
|
};
|
|
11654
11855
|
}
|
|
11655
|
-
/** The designer's block palette, in menu order.
|
|
11656
|
-
*
|
|
11856
|
+
/** The designer's block palette, in menu order. A grid owns edit-in-popup and a
|
|
11857
|
+
* record panel edits the selected row, so the standalone Form block is the one
|
|
11858
|
+
* that creates: a form on its own page, with no grid behind it. */
|
|
11657
11859
|
var blockPalette = [
|
|
11658
11860
|
{
|
|
11659
11861
|
kind: "grid",
|
|
11660
11862
|
label: "Grid"
|
|
11661
11863
|
},
|
|
11864
|
+
{
|
|
11865
|
+
kind: "form",
|
|
11866
|
+
label: "Form"
|
|
11867
|
+
},
|
|
11662
11868
|
{
|
|
11663
11869
|
kind: "chart",
|
|
11664
11870
|
label: "Chart",
|
|
@@ -11779,7 +11985,8 @@ function defaultBlockConfig(kind, entity) {
|
|
|
11779
11985
|
};
|
|
11780
11986
|
case "form": return {
|
|
11781
11987
|
kind,
|
|
11782
|
-
presentation: "
|
|
11988
|
+
presentation: "inline",
|
|
11989
|
+
afterSave: "reset"
|
|
11783
11990
|
};
|
|
11784
11991
|
case "chart": {
|
|
11785
11992
|
const measure = pickMeasure(entity);
|
|
@@ -12398,6 +12605,403 @@ function removeEntity(project, name) {
|
|
|
12398
12605
|
screens: project.screens.filter((s) => s.entity !== name)
|
|
12399
12606
|
};
|
|
12400
12607
|
}
|
|
12608
|
+
/**
|
|
12609
|
+
* The fields a form actually renders, in schema order. Arranging anything else
|
|
12610
|
+
* would be a lie: a field hidden from the form cannot be put in a section and
|
|
12611
|
+
* then appear there.
|
|
12612
|
+
*/
|
|
12613
|
+
function formFieldNames(schema) {
|
|
12614
|
+
return schemaToFormFields(schema).map((f) => f.field);
|
|
12615
|
+
}
|
|
12616
|
+
/**
|
|
12617
|
+
* The sections as a builder should show them, plus the fields no section claims.
|
|
12618
|
+
*
|
|
12619
|
+
* Sections name their fields by string, so a rename, a delete, or hiding a field
|
|
12620
|
+
* from the form can leave a name behind. Those are dropped here rather than
|
|
12621
|
+
* drawn as ghosts, and a field in no section comes back in `unassigned` - which
|
|
12622
|
+
* is where the form itself puts it too, in a trailing untitled group.
|
|
12623
|
+
*/
|
|
12624
|
+
function formPlan(schema, override) {
|
|
12625
|
+
const inForm = formFieldNames(schema);
|
|
12626
|
+
const known = new Set(inForm);
|
|
12627
|
+
const source = override ?? schema.form?.sections ?? [];
|
|
12628
|
+
const seen = /* @__PURE__ */ new Set();
|
|
12629
|
+
return {
|
|
12630
|
+
sections: source.map((section) => {
|
|
12631
|
+
const fields = section.fields.filter((f) => {
|
|
12632
|
+
if (!known.has(f) || seen.has(f)) return false;
|
|
12633
|
+
seen.add(f);
|
|
12634
|
+
return true;
|
|
12635
|
+
});
|
|
12636
|
+
return {
|
|
12637
|
+
...section,
|
|
12638
|
+
fields
|
|
12639
|
+
};
|
|
12640
|
+
}),
|
|
12641
|
+
unassigned: inForm.filter((f) => !seen.has(f))
|
|
12642
|
+
};
|
|
12643
|
+
}
|
|
12644
|
+
/** Replace an entity's form layout. `undefined` drops it back to the default. */
|
|
12645
|
+
function setEntityForm(project, entityName, form) {
|
|
12646
|
+
return mapEntity(project, entityName, (schema) => {
|
|
12647
|
+
const next = { ...schema };
|
|
12648
|
+
if (form && (form.columns !== void 0 || form.sections?.length)) next.form = form;
|
|
12649
|
+
else delete next.form;
|
|
12650
|
+
return next;
|
|
12651
|
+
});
|
|
12652
|
+
}
|
|
12653
|
+
/** Set the form's column count, or clear it back to the default. */
|
|
12654
|
+
function setFormColumns(project, entityName, columns) {
|
|
12655
|
+
const schema = entityOf(project, entityName);
|
|
12656
|
+
if (!schema) return project;
|
|
12657
|
+
return setEntityForm(project, entityName, {
|
|
12658
|
+
...schema.form,
|
|
12659
|
+
columns
|
|
12660
|
+
});
|
|
12661
|
+
}
|
|
12662
|
+
/** Append a section. New sections start empty - fields move in afterwards. */
|
|
12663
|
+
function addFormSection(project, entityName, title = "Section") {
|
|
12664
|
+
const schema = entityOf(project, entityName);
|
|
12665
|
+
if (!schema) return project;
|
|
12666
|
+
return setEntityForm(project, entityName, {
|
|
12667
|
+
...schema.form,
|
|
12668
|
+
sections: [...schema.form?.sections ?? [], {
|
|
12669
|
+
title,
|
|
12670
|
+
fields: []
|
|
12671
|
+
}]
|
|
12672
|
+
});
|
|
12673
|
+
}
|
|
12674
|
+
/** Patch one section. An out-of-range index is a no-op rather than an error. */
|
|
12675
|
+
function updateFormSection(project, entityName, index, patch) {
|
|
12676
|
+
const schema = entityOf(project, entityName);
|
|
12677
|
+
const sections = schema?.form?.sections;
|
|
12678
|
+
if (!sections?.[index]) return project;
|
|
12679
|
+
const next = sections.map((s, i) => {
|
|
12680
|
+
if (i !== index) return s;
|
|
12681
|
+
const merged = {
|
|
12682
|
+
...s,
|
|
12683
|
+
...patch
|
|
12684
|
+
};
|
|
12685
|
+
if (!merged.title) delete merged.title;
|
|
12686
|
+
if (!merged.description) delete merged.description;
|
|
12687
|
+
if (!merged.visibleWhen) delete merged.visibleWhen;
|
|
12688
|
+
if (!merged.columns) delete merged.columns;
|
|
12689
|
+
if (!merged.collapsible) {
|
|
12690
|
+
delete merged.collapsible;
|
|
12691
|
+
delete merged.collapsed;
|
|
12692
|
+
}
|
|
12693
|
+
if (!merged.collapsed) delete merged.collapsed;
|
|
12694
|
+
return merged;
|
|
12695
|
+
});
|
|
12696
|
+
return setEntityForm(project, entityName, {
|
|
12697
|
+
...schema.form,
|
|
12698
|
+
sections: next
|
|
12699
|
+
});
|
|
12700
|
+
}
|
|
12701
|
+
/**
|
|
12702
|
+
* Remove a section. Its fields stay in the form - they fall back to the trailing
|
|
12703
|
+
* untitled group, so deleting a heading never deletes the questions under it.
|
|
12704
|
+
*/
|
|
12705
|
+
function removeFormSection(project, entityName, index) {
|
|
12706
|
+
const schema = entityOf(project, entityName);
|
|
12707
|
+
const sections = schema?.form?.sections;
|
|
12708
|
+
if (!sections?.[index]) return project;
|
|
12709
|
+
return setEntityForm(project, entityName, {
|
|
12710
|
+
...schema.form,
|
|
12711
|
+
sections: sections.filter((_, i) => i !== index)
|
|
12712
|
+
});
|
|
12713
|
+
}
|
|
12714
|
+
/** Reorder the sections themselves. */
|
|
12715
|
+
function moveFormSection(project, entityName, from, to) {
|
|
12716
|
+
const schema = entityOf(project, entityName);
|
|
12717
|
+
const sections = schema?.form?.sections;
|
|
12718
|
+
if (!sections?.[from] || to < 0 || to >= sections.length || from === to) return project;
|
|
12719
|
+
const next = [...sections];
|
|
12720
|
+
next.splice(to, 0, next.splice(from, 1)[0]);
|
|
12721
|
+
return setEntityForm(project, entityName, {
|
|
12722
|
+
...schema.form,
|
|
12723
|
+
sections: next
|
|
12724
|
+
});
|
|
12725
|
+
}
|
|
12726
|
+
/**
|
|
12727
|
+
* Move a field into a section at a position, or out of every section when
|
|
12728
|
+
* `toSection` is null. The field is pulled out of wherever it was first, so it
|
|
12729
|
+
* can never end up in two sections - which would render the control twice.
|
|
12730
|
+
*/
|
|
12731
|
+
function moveFormField(project, entityName, field, toSection, toIndex = Number.MAX_SAFE_INTEGER) {
|
|
12732
|
+
const schema = entityOf(project, entityName);
|
|
12733
|
+
if (!schema || !formFieldNames(schema).includes(field)) return project;
|
|
12734
|
+
const sections = schema.form?.sections ?? [];
|
|
12735
|
+
if (toSection !== null && !sections[toSection]) return project;
|
|
12736
|
+
const stripped = sections.map((s) => ({
|
|
12737
|
+
...s,
|
|
12738
|
+
fields: s.fields.filter((f) => f !== field)
|
|
12739
|
+
}));
|
|
12740
|
+
if (toSection === null) return setEntityForm(project, entityName, {
|
|
12741
|
+
...schema.form,
|
|
12742
|
+
sections: stripped
|
|
12743
|
+
});
|
|
12744
|
+
const target = stripped[toSection];
|
|
12745
|
+
const at = Math.max(0, Math.min(toIndex, target.fields.length));
|
|
12746
|
+
const fields = [...target.fields];
|
|
12747
|
+
fields.splice(at, 0, field);
|
|
12748
|
+
return setEntityForm(project, entityName, {
|
|
12749
|
+
...schema.form,
|
|
12750
|
+
sections: stripped.map((s, i) => i === toSection ? {
|
|
12751
|
+
...s,
|
|
12752
|
+
fields
|
|
12753
|
+
} : s)
|
|
12754
|
+
});
|
|
12755
|
+
}
|
|
12756
|
+
/**
|
|
12757
|
+
* Move several fields at once, as one contiguous block in the order given.
|
|
12758
|
+
*
|
|
12759
|
+
* Not a loop of {@link moveFormField}: each single move both shifts the target
|
|
12760
|
+
* indices and re-resolves the plan, so a loop lands the group scattered or
|
|
12761
|
+
* reversed. Strip every named field first, then splice the whole group at the
|
|
12762
|
+
* index computed against the stripped target.
|
|
12763
|
+
*
|
|
12764
|
+
* Unknown and hidden-from-form names are dropped, duplicates keep their first
|
|
12765
|
+
* position, and an input that resolves to nothing returns the project
|
|
12766
|
+
* unchanged (same reference), so an undo stack never records a no-op.
|
|
12767
|
+
*/
|
|
12768
|
+
function moveFormFields(project, entityName, fields, toSection, toIndex = Number.MAX_SAFE_INTEGER) {
|
|
12769
|
+
const schema = entityOf(project, entityName);
|
|
12770
|
+
if (!schema) return project;
|
|
12771
|
+
const movable = new Set(formFieldNames(schema));
|
|
12772
|
+
const group = [];
|
|
12773
|
+
for (const f of fields) if (movable.has(f) && !group.includes(f)) group.push(f);
|
|
12774
|
+
if (!group.length) return project;
|
|
12775
|
+
const sections = schema.form?.sections ?? [];
|
|
12776
|
+
if (toSection !== null && !sections[toSection]) return project;
|
|
12777
|
+
const moving = new Set(group);
|
|
12778
|
+
const stripped = sections.map((s) => ({
|
|
12779
|
+
...s,
|
|
12780
|
+
fields: s.fields.filter((f) => !moving.has(f))
|
|
12781
|
+
}));
|
|
12782
|
+
if (toSection === null) return setEntityForm(project, entityName, {
|
|
12783
|
+
...schema.form,
|
|
12784
|
+
sections: stripped
|
|
12785
|
+
});
|
|
12786
|
+
const target = stripped[toSection];
|
|
12787
|
+
const at = Math.max(0, Math.min(toIndex, target.fields.length));
|
|
12788
|
+
const next = [...target.fields];
|
|
12789
|
+
next.splice(at, 0, ...group);
|
|
12790
|
+
return setEntityForm(project, entityName, {
|
|
12791
|
+
...schema.form,
|
|
12792
|
+
sections: stripped.map((s, i) => i === toSection ? {
|
|
12793
|
+
...s,
|
|
12794
|
+
fields: next
|
|
12795
|
+
} : s)
|
|
12796
|
+
});
|
|
12797
|
+
}
|
|
12798
|
+
/**
|
|
12799
|
+
* Set (or clear) a field's value-driven conditions. Each is a `PredicateExpr`,
|
|
12800
|
+
* so it stays data all the way into the generated app - see `EntityField.when`.
|
|
12801
|
+
*/
|
|
12802
|
+
function setFieldConditions(project, entityName, field, when) {
|
|
12803
|
+
return mapEntity(project, entityName, (schema) => ({
|
|
12804
|
+
...schema,
|
|
12805
|
+
fields: schema.fields.map((f) => {
|
|
12806
|
+
if (f.field !== field) return f;
|
|
12807
|
+
const next = { ...f };
|
|
12808
|
+
if (when?.visible || when?.disabled || when?.required) next.when = {
|
|
12809
|
+
...when.visible && { visible: when.visible },
|
|
12810
|
+
...when.disabled && { disabled: when.disabled },
|
|
12811
|
+
...when.required && { required: when.required }
|
|
12812
|
+
};
|
|
12813
|
+
else delete next.when;
|
|
12814
|
+
return next;
|
|
12815
|
+
})
|
|
12816
|
+
}));
|
|
12817
|
+
}
|
|
12818
|
+
/**
|
|
12819
|
+
* Patch one field of one entity. The form builder edits an entity that is not
|
|
12820
|
+
* necessarily the selected screen's, so it needs the project-level door rather
|
|
12821
|
+
* than the schema-level `updateField`.
|
|
12822
|
+
*
|
|
12823
|
+
* Deliberately shallow: `type` changes belong to the schema designer, which also
|
|
12824
|
+
* has to clean up `options` / `relation` when the type moves.
|
|
12825
|
+
*/
|
|
12826
|
+
function updateEntityField(project, entityName, field, patch) {
|
|
12827
|
+
return mapEntity(project, entityName, (schema) => ({
|
|
12828
|
+
...schema,
|
|
12829
|
+
fields: schema.fields.map((f) => f.field === field ? {
|
|
12830
|
+
...f,
|
|
12831
|
+
...patch
|
|
12832
|
+
} : f)
|
|
12833
|
+
}));
|
|
12834
|
+
}
|
|
12835
|
+
/**
|
|
12836
|
+
* Patch a field's form presentation (`EntityField.input`). Merges rather than
|
|
12837
|
+
* replaces, and a key set to `undefined` or `''` is removed - so clearing a
|
|
12838
|
+
* placeholder leaves no empty string behind, and emptying the last key drops
|
|
12839
|
+
* `input` itself rather than persisting `input: {}`.
|
|
12840
|
+
*/
|
|
12841
|
+
function setFieldInput(project, entityName, field, patch) {
|
|
12842
|
+
return mapEntity(project, entityName, (schema) => ({
|
|
12843
|
+
...schema,
|
|
12844
|
+
fields: schema.fields.map((f) => {
|
|
12845
|
+
if (f.field !== field) return f;
|
|
12846
|
+
const input = { ...f.input };
|
|
12847
|
+
for (const [key, value] of Object.entries(patch)) if (value === void 0 || value === "") delete input[key];
|
|
12848
|
+
else input[key] = value;
|
|
12849
|
+
const next = { ...f };
|
|
12850
|
+
if (Object.keys(input).length) next.input = input;
|
|
12851
|
+
else delete next.input;
|
|
12852
|
+
return next;
|
|
12853
|
+
})
|
|
12854
|
+
}));
|
|
12855
|
+
}
|
|
12856
|
+
/**
|
|
12857
|
+
* Show or hide a field on one surface, keeping the other surface's answer.
|
|
12858
|
+
* `hidden: true` means both, so it is expanded before one half is changed -
|
|
12859
|
+
* otherwise hiding a field from the form would silently un-hide its column.
|
|
12860
|
+
*/
|
|
12861
|
+
function setFieldHidden(project, entityName, field, surface, hidden) {
|
|
12862
|
+
return mapEntity(project, entityName, (schema) => ({
|
|
12863
|
+
...schema,
|
|
12864
|
+
fields: schema.fields.map((f) => {
|
|
12865
|
+
if (f.field !== field) return f;
|
|
12866
|
+
const merged = {
|
|
12867
|
+
...f.hidden === true ? {
|
|
12868
|
+
grid: true,
|
|
12869
|
+
form: true
|
|
12870
|
+
} : { ...f.hidden || {} },
|
|
12871
|
+
[surface]: hidden
|
|
12872
|
+
};
|
|
12873
|
+
const next = { ...f };
|
|
12874
|
+
if (merged.grid && merged.form) next.hidden = true;
|
|
12875
|
+
else if (merged.grid || merged.form) next.hidden = {
|
|
12876
|
+
...merged.grid && { grid: true },
|
|
12877
|
+
...merged.form && { form: true }
|
|
12878
|
+
};
|
|
12879
|
+
else delete next.hidden;
|
|
12880
|
+
return next;
|
|
12881
|
+
})
|
|
12882
|
+
}));
|
|
12883
|
+
}
|
|
12884
|
+
/**
|
|
12885
|
+
* The form controls worth offering for a field type. A form builder that listed
|
|
12886
|
+
* every editor for every type would be a wall of mostly-wrong choices - a date
|
|
12887
|
+
* field has no business rendering as a colour picker. The first entry is what
|
|
12888
|
+
* the field renders as when `input.editorType` is unset.
|
|
12889
|
+
*/
|
|
12890
|
+
function formControlsFor(type) {
|
|
12891
|
+
switch (type) {
|
|
12892
|
+
case "number": return [
|
|
12893
|
+
"number",
|
|
12894
|
+
"slider",
|
|
12895
|
+
"rating",
|
|
12896
|
+
"text"
|
|
12897
|
+
];
|
|
12898
|
+
case "boolean": return ["checkbox"];
|
|
12899
|
+
case "date":
|
|
12900
|
+
case "dateString": return ["date", "date-native"];
|
|
12901
|
+
case "datetime": return [
|
|
12902
|
+
"datetime",
|
|
12903
|
+
"datetime-native",
|
|
12904
|
+
"time"
|
|
12905
|
+
];
|
|
12906
|
+
case "enum": return [
|
|
12907
|
+
"select",
|
|
12908
|
+
"rich-select",
|
|
12909
|
+
"list",
|
|
12910
|
+
"chips",
|
|
12911
|
+
"autocomplete"
|
|
12912
|
+
];
|
|
12913
|
+
case "relation": return ["select", "autocomplete"];
|
|
12914
|
+
case "json": return ["textarea", "text"];
|
|
12915
|
+
default: return [
|
|
12916
|
+
"text",
|
|
12917
|
+
"textarea",
|
|
12918
|
+
"password",
|
|
12919
|
+
"phone",
|
|
12920
|
+
"country",
|
|
12921
|
+
"mask",
|
|
12922
|
+
"color",
|
|
12923
|
+
"autocomplete",
|
|
12924
|
+
"chips"
|
|
12925
|
+
];
|
|
12926
|
+
}
|
|
12927
|
+
}
|
|
12928
|
+
function formControlSettings(control, type) {
|
|
12929
|
+
const kind = control ?? formControlsFor(type)[0];
|
|
12930
|
+
if (kind === "mask") return ["mask"];
|
|
12931
|
+
if (kind === "slider" || kind === "rating") return ["range", "step"];
|
|
12932
|
+
if (kind === "number" || type === "number" && kind !== "text") return [
|
|
12933
|
+
"range",
|
|
12934
|
+
"step",
|
|
12935
|
+
"precision",
|
|
12936
|
+
"affix"
|
|
12937
|
+
];
|
|
12938
|
+
return [];
|
|
12939
|
+
}
|
|
12940
|
+
/**
|
|
12941
|
+
* A first pass at sectioning an unarranged form, by what the field names say
|
|
12942
|
+
* they are. Studio's promise is a working app in a few clicks, and an entity of
|
|
12943
|
+
* fifteen fields in one flat list is not that.
|
|
12944
|
+
*
|
|
12945
|
+
* A guess, offered once: it returns sections for a builder to drop in and then
|
|
12946
|
+
* edit, and it never invents a group for a form small enough not to need one.
|
|
12947
|
+
*/
|
|
12948
|
+
var SECTION_HINTS = [
|
|
12949
|
+
{
|
|
12950
|
+
title: "Contact",
|
|
12951
|
+
match: /^(email|phone|mobile|fax|website|url|contact)/i
|
|
12952
|
+
},
|
|
12953
|
+
{
|
|
12954
|
+
title: "Address",
|
|
12955
|
+
match: /(address|street|city|state|province|zip|postcode|postal|country|region)/i
|
|
12956
|
+
},
|
|
12957
|
+
{
|
|
12958
|
+
title: "Money",
|
|
12959
|
+
match: /(amount|price|cost|total|revenue|mrr|arr|salary|budget|value|balance|fee|tax|discount)/i
|
|
12960
|
+
},
|
|
12961
|
+
{
|
|
12962
|
+
title: "Dates",
|
|
12963
|
+
match: /(date|_at$|At$|deadline|due|expires|starts|ends)/i
|
|
12964
|
+
},
|
|
12965
|
+
{
|
|
12966
|
+
title: "Notes",
|
|
12967
|
+
match: /(note|notes|comment|comments|description|summary|remark)/i
|
|
12968
|
+
}
|
|
12969
|
+
];
|
|
12970
|
+
function suggestFormSections(schema) {
|
|
12971
|
+
const names = formFieldNames(schema);
|
|
12972
|
+
if (names.length < 6) return [];
|
|
12973
|
+
const buckets = /* @__PURE__ */ new Map();
|
|
12974
|
+
const rest = [];
|
|
12975
|
+
for (const name of names) {
|
|
12976
|
+
const hint = SECTION_HINTS.find((h) => h.match.test(name));
|
|
12977
|
+
if (!hint) {
|
|
12978
|
+
rest.push(name);
|
|
12979
|
+
continue;
|
|
12980
|
+
}
|
|
12981
|
+
const bucket = buckets.get(hint.title);
|
|
12982
|
+
if (bucket) bucket.push(name);
|
|
12983
|
+
else buckets.set(hint.title, [name]);
|
|
12984
|
+
}
|
|
12985
|
+
const sections = [];
|
|
12986
|
+
for (const [title, fields] of buckets) if (fields.length > 1) sections.push({
|
|
12987
|
+
title,
|
|
12988
|
+
fields
|
|
12989
|
+
});
|
|
12990
|
+
else rest.push(...fields);
|
|
12991
|
+
if (!sections.length) return [];
|
|
12992
|
+
return rest.length ? [{
|
|
12993
|
+
title: "Details",
|
|
12994
|
+
fields: rest
|
|
12995
|
+
}, ...sections] : sections;
|
|
12996
|
+
}
|
|
12997
|
+
/** Apply a change to one entity's schema, leaving the project alone if it is unknown. */
|
|
12998
|
+
function mapEntity(project, entityName, fn) {
|
|
12999
|
+
if (!entityOf(project, entityName)) return project;
|
|
13000
|
+
return {
|
|
13001
|
+
...project,
|
|
13002
|
+
entities: project.entities.map((e) => e.name === entityName ? fn(e) : e)
|
|
13003
|
+
};
|
|
13004
|
+
}
|
|
12401
13005
|
/** Append a screen, making its id AND route unique against the existing set. */
|
|
12402
13006
|
function appendScreen(project, base, keyBase) {
|
|
12403
13007
|
const ids = new Set(project.screens.map((s) => s.id));
|
|
@@ -13550,7 +14154,13 @@ function validateProject(project) {
|
|
|
13550
14154
|
block: b.id
|
|
13551
14155
|
});
|
|
13552
14156
|
const c = b.config;
|
|
13553
|
-
if (c.kind === "
|
|
14157
|
+
if (c.kind === "form") {
|
|
14158
|
+
if (!s.entity) issues.push(at("A Form block needs a screen bound to an entity.", "error"));
|
|
14159
|
+
if (c.afterSave === "navigate") {
|
|
14160
|
+
if (!c.navigateTo) issues.push(at("The form is set to open a screen after saving, but no screen is chosen."));
|
|
14161
|
+
else if (!project.screens.some((x) => x.id === c.navigateTo)) issues.push(at(`The form opens a missing screen "${c.navigateTo}" after saving.`, "error"));
|
|
14162
|
+
}
|
|
14163
|
+
} else if (c.kind === "master-detail") {
|
|
13554
14164
|
if (!c.childEntity || !c.foreignKey) issues.push(at("Master/detail needs a child entity + foreign key."));
|
|
13555
14165
|
else if (!entityOf(project, c.childEntity)) issues.push(at(`Master/detail points at a missing child entity "${c.childEntity}".`));
|
|
13556
14166
|
} else if (c.kind === "tree") {
|
|
@@ -15130,7 +15740,7 @@ function hasFieldConditions(schema) {
|
|
|
15130
15740
|
*
|
|
15131
15741
|
* `version.test.ts` asserts this matches `package.json`, so the two cannot drift.
|
|
15132
15742
|
*/
|
|
15133
|
-
var SVGRID_VERSION = "2.
|
|
15743
|
+
var SVGRID_VERSION = "2.6.0";
|
|
15134
15744
|
//#endregion
|
|
15135
15745
|
//#region src/studio/emit-project.ts
|
|
15136
15746
|
var has = (blocks, kind) => blocks.some((b) => b.config.kind === kind);
|
|
@@ -15528,9 +16138,35 @@ ${panels}
|
|
|
15528
16138
|
}
|
|
15529
16139
|
case "lookup": return ` <div ${span}${cls}><!-- lookup (${cfg.field}): shown in the edit form --></div>`;
|
|
15530
16140
|
case "component": return componentBlockMarkup(block, cfg, ctx.handleNames?.get(block.id), rowsExpr);
|
|
16141
|
+
case "form": return createFormMarkup(entity, schemaVar, block, cfg);
|
|
15531
16142
|
default: return "";
|
|
15532
16143
|
}
|
|
15533
16144
|
}
|
|
16145
|
+
/**
|
|
16146
|
+
* A standalone create form: blank, always on the page, submits a new row.
|
|
16147
|
+
*
|
|
16148
|
+
* Keyed on `formSaves` so a successful create remounts the panel with empty
|
|
16149
|
+
* values - the panel seeds itself from `row` once, so without the key the
|
|
16150
|
+
* previous entry would still be sitting in the fields.
|
|
16151
|
+
*/
|
|
16152
|
+
function createFormMarkup(entity, schemaVar, block, cfg) {
|
|
16153
|
+
const span = wrapperStyle(block);
|
|
16154
|
+
const cls = wrapperClass(block);
|
|
16155
|
+
const attrs = [
|
|
16156
|
+
`schema={${schemaVar}}`,
|
|
16157
|
+
"row={null}",
|
|
16158
|
+
"presentation=\"inline\""
|
|
16159
|
+
];
|
|
16160
|
+
attrs.push(`title={${jsStr(cfg.title ?? `New ${entity.label ?? entity.name}`)}}`);
|
|
16161
|
+
if (cfg.submitLabel) attrs.push(`submitLabel={${jsStr(cfg.submitLabel)}}`);
|
|
16162
|
+
if (cfg.width && cfg.width !== "md") attrs.push(`formSize=${jsStr(cfg.width)}`);
|
|
16163
|
+
return ` <div ${span}${cls}>${cfg.afterSave === "navigate" ? "" : `
|
|
16164
|
+
{#if formSaves}<p class="st-form__done" role="status">Saved. Add another below.</p>{/if}`}
|
|
16165
|
+
{#key formSaves}
|
|
16166
|
+
<SvGridEditPanel ${attrs.join(" ")} onSubmit={createRecord} />
|
|
16167
|
+
{/key}
|
|
16168
|
+
</div>`;
|
|
16169
|
+
}
|
|
15534
16170
|
/** Emits a UI-kit component block (see `UI_COMPONENT_REGISTRY`): a literal
|
|
15535
16171
|
* `<SvXxx .../>` tag carrying its configured "chrome" props + optional text
|
|
15536
16172
|
* content. Entity-agnostic - used both from `blockMarkup` (mixed onto an
|
|
@@ -16707,14 +17343,14 @@ function screenPage(schema, rawSchema, screen, resolve, rawResolve, accessEnable
|
|
|
16707
17343
|
const codeGridBlockId = firstGridBlockId(screen);
|
|
16708
17344
|
const handleNames = handleNameMap(screen);
|
|
16709
17345
|
const codeWire = codeEnabled ? codeWiring(screen, n.type, void 0) : null;
|
|
16710
|
-
const
|
|
17346
|
+
const createForm = blocks.map((b) => b.config).find((c) => c.kind === "form");
|
|
16711
17347
|
const gridConfigs = blocks.map((b) => b.config).filter((c) => c.kind === "grid");
|
|
16712
17348
|
const formGrid = gridConfigs.find((c) => c.editing === "form");
|
|
16713
17349
|
const hasEditAction = gridConfigs.some((c) => c.rowActions?.some((a) => a.kind === "edit"));
|
|
16714
17350
|
const hasRowActions = gridConfigs.some((c) => (c.rowActions?.length ?? 0) > 0);
|
|
16715
17351
|
const cellRenderKinds = new Set(gridConfigs.flatMap((c) => c.columns.filter((col) => col.show && col.cellType).map((col) => col.cellType.kind)));
|
|
16716
17352
|
const hasCellRenderers = cellRenderKinds.size > 0;
|
|
16717
|
-
const wantsForm = !!formGrid ||
|
|
17353
|
+
const wantsForm = !!formGrid || hasEditAction;
|
|
16718
17354
|
const gridPageSize = gridConfigs[0] ? gridConfigs[0].paginated !== false ? gridConfigs[0].pageSize ?? 10 : 1e3 : 10;
|
|
16719
17355
|
const formPres = formGrid?.formPresentation ?? "modal";
|
|
16720
17356
|
const formLayoutProps = editPanelLayoutProps(formGrid);
|
|
@@ -16722,7 +17358,7 @@ function screenPage(schema, rawSchema, screen, resolve, rawResolve, accessEnable
|
|
|
16722
17358
|
const hasFilter = has(blocks, "filter");
|
|
16723
17359
|
const hasRecord = has(blocks, "record");
|
|
16724
17360
|
const recordEditable = blocks.some((b) => b.config.kind === "record" && b.config.editable);
|
|
16725
|
-
const needsController = hasGrid || wantsForm || hasFilter || hasRecord;
|
|
17361
|
+
const needsController = hasGrid || wantsForm || hasFilter || hasRecord || !!createForm;
|
|
16726
17362
|
const rtSupabase = !ssrData && needsController && entSource?.kind === "supabase" && entSource.realtime === true;
|
|
16727
17363
|
const rtTable = rtSupabase ? entSource.table : "";
|
|
16728
17364
|
const hasAgg = has(allBlocks, "chart") || has(allBlocks, "dashboard") || has(allBlocks, "kpi") || has(allBlocks, "gauge") || has(allBlocks, "tree");
|
|
@@ -16790,7 +17426,7 @@ function screenPage(schema, rawSchema, screen, resolve, rawResolve, accessEnable
|
|
|
16790
17426
|
...childSourceVars,
|
|
16791
17427
|
...wantsForm ? [...lookupVars, "nextId"] : []
|
|
16792
17428
|
])].filter(Boolean);
|
|
16793
|
-
const usesGoto = blocks.some((b) => b.config.kind === "grid" && b.config.rowLink && routeById.has(b.config.rowLink.screen) || b.config.kind === "grid" && b.config.rowActions?.some((a) => a.kind === "navigate" && a.screen && routeById.has(a.screen)) || b.config.kind === "chart" && b.config.drillScreen && routeById.has(b.config.drillScreen) || (b.config.kind === "board" || b.config.kind === "calendar") && b.config.openScreen != null && routeById.has(b.config.openScreen) || b.config.kind === "master-detail" && b.config.linkScreen != null && routeById.has(b.config.linkScreen));
|
|
17429
|
+
const usesGoto = blocks.some((b) => b.config.kind === "grid" && b.config.rowLink && routeById.has(b.config.rowLink.screen) || b.config.kind === "grid" && b.config.rowActions?.some((a) => a.kind === "navigate" && a.screen && routeById.has(a.screen)) || b.config.kind === "chart" && b.config.drillScreen && routeById.has(b.config.drillScreen) || (b.config.kind === "board" || b.config.kind === "calendar") && b.config.openScreen != null && routeById.has(b.config.openScreen) || b.config.kind === "master-detail" && b.config.linkScreen != null && routeById.has(b.config.linkScreen) || b.config.kind === "form" && b.config.afterSave === "navigate" && b.config.navigateTo != null && routeById.has(b.config.navigateTo));
|
|
16794
17430
|
const applyUrlFilters = drillEnabled && needsController;
|
|
16795
17431
|
const filterableFieldNames = schema.fields.filter((f) => !f.primaryKey).map((f) => f.field);
|
|
16796
17432
|
const gatesUi = accessEnabled && (wantsForm || gridConfigs.some((c) => c.editing === "inline") || hasRowActions);
|
|
@@ -16877,6 +17513,15 @@ function screenPage(schema, rawSchema, screen, resolve, rawResolve, accessEnable
|
|
|
16877
17513
|
if (mode === 'create') { await controller.createRow({ [idField]: nextId('${n.idPrefix}'), ...values } as Partial<${n.type}>); controller.setPage(view.pageCount - 1) }
|
|
16878
17514
|
else if (id) { await controller.updateRow(id, values) }${submitBody}
|
|
16879
17515
|
editing = undefined${needsAllRows ? "\n await loadAll()" : ""}
|
|
17516
|
+
}`);
|
|
17517
|
+
}
|
|
17518
|
+
if (createForm) {
|
|
17519
|
+
const nav = createForm.afterSave === "navigate" && createForm.navigateTo ? routeById.get(createForm.navigateTo) : void 0;
|
|
17520
|
+
const after = nav ? `\n await goto('/${nav}')` : "";
|
|
17521
|
+
parts.push(`let formSaves = $state(0)
|
|
17522
|
+
async function createRecord({ values }: { mode: 'create' | 'edit'; id: string | null; values: Partial<${n.type}> }) {
|
|
17523
|
+
await controller.createRow({ [idField]: nextId('${n.idPrefix}'), ...values } as Partial<${n.type}>)${submitBody}
|
|
17524
|
+
formSaves += 1${after}
|
|
16880
17525
|
}`);
|
|
16881
17526
|
}
|
|
16882
17527
|
if (hasRecord) parts.push(`let selectedRecord = $state<${n.type} | null>(null)${recordEditable ? `
|
|
@@ -17303,14 +17948,19 @@ ${hint ? ` {#if !form?.errors?.[${key}]}<small class="sk-hint">${htmlEs
|
|
|
17303
17948
|
const ssrSections = layout?.sections?.length ? (() => {
|
|
17304
17949
|
const assigned = /* @__PURE__ */ new Set();
|
|
17305
17950
|
const groups = layout.sections.map((s) => {
|
|
17951
|
+
const names = [];
|
|
17306
17952
|
const items = s.fields.map((name) => {
|
|
17307
17953
|
assigned.add(name);
|
|
17954
|
+
names.push(name);
|
|
17308
17955
|
return blockFor(name);
|
|
17309
17956
|
}).filter(Boolean);
|
|
17310
17957
|
return {
|
|
17311
17958
|
title: s.title,
|
|
17312
17959
|
description: s.description,
|
|
17313
17960
|
columns: s.columns,
|
|
17961
|
+
collapsible: s.collapsible,
|
|
17962
|
+
collapsed: s.collapsed,
|
|
17963
|
+
names,
|
|
17314
17964
|
items
|
|
17315
17965
|
};
|
|
17316
17966
|
}).filter((g) => g.items.length);
|
|
@@ -17319,13 +17969,26 @@ ${hint ? ` {#if !form?.errors?.[${key}]}<small class="sk-hint">${htmlEs
|
|
|
17319
17969
|
title: void 0,
|
|
17320
17970
|
description: void 0,
|
|
17321
17971
|
columns: void 0,
|
|
17972
|
+
collapsible: false,
|
|
17973
|
+
collapsed: false,
|
|
17974
|
+
names: [],
|
|
17322
17975
|
items: rest
|
|
17323
17976
|
}] : groups;
|
|
17324
17977
|
})() : null;
|
|
17325
17978
|
const formCols = layout?.columns ?? 1;
|
|
17326
|
-
const fieldsMarkup = ssrSections ? ssrSections.map((g) =>
|
|
17327
|
-
|
|
17328
|
-
|
|
17979
|
+
const fieldsMarkup = ssrSections ? ssrSections.map((g) => {
|
|
17980
|
+
const inner = `${g.description ? ` <p class="sk-group__desc">${htmlEsc(g.description)}</p>\n` : ""}${g.items.join("\n")}`;
|
|
17981
|
+
if (g.collapsible && g.title) {
|
|
17982
|
+
const open = g.collapsed ? `{${JSON.stringify(g.names)}.some((f) => form?.errors?.[f])}` : "{true}";
|
|
17983
|
+
return ` <details class="sk-group sk-group--fold" style="--sk-cols: ${g.columns ?? formCols}" open=${open}>
|
|
17984
|
+
<summary>${htmlEsc(g.title)}</summary>
|
|
17985
|
+
${inner}
|
|
17986
|
+
</details>`;
|
|
17987
|
+
}
|
|
17988
|
+
return ` <fieldset class="sk-group" style="--sk-cols: ${g.columns ?? formCols}">
|
|
17989
|
+
${g.title ? ` <legend>${htmlEsc(g.title)}</legend>\n` : ""}${inner}
|
|
17990
|
+
</fieldset>`;
|
|
17991
|
+
}).join("\n") : ` <div class="sk-group" style="--sk-cols: ${formCols}">\n${fieldBlocks.join("\n")}\n </div>`;
|
|
17329
17992
|
const page = `<script lang="ts">
|
|
17330
17993
|
import { SvGrid, renderSnippet, type ColumnDef, type CellContext } from '@svgrid/grid'
|
|
17331
17994
|
import { schemaToColumns } from '@svgrid/enterprise'
|
|
@@ -17437,6 +18100,13 @@ ${facetCss} .sk-rowact { display: flex; gap: 10px; }
|
|
|
17437
18100
|
.sk-group + .sk-group { margin-top: 14px; padding-top: 14px; border-top: 1px solid var(--sg-border, #e2e8f0); }
|
|
17438
18101
|
.sk-group legend { grid-column: 1 / -1; padding: 0; font-size: 12px; font-weight: 700; letter-spacing: 0.02em; text-transform: uppercase; color: var(--sg-muted, #64748b); }
|
|
17439
18102
|
.sk-group__desc { grid-column: 1 / -1; margin: 0; font-size: 12px; color: var(--sg-muted, #64748b); }
|
|
18103
|
+
/* A foldable group is a native <details>, so it works with JavaScript off.
|
|
18104
|
+
display:grid on the element itself would lay the <summary> out as a grid
|
|
18105
|
+
item and break the disclosure, so the grid moves to [open] children. */
|
|
18106
|
+
.sk-group--fold { display: block; }
|
|
18107
|
+
.sk-group--fold > summary { grid-column: 1 / -1; margin-bottom: 12px; font-size: 13.5px; font-weight: 650; color: var(--sg-fg, #0f172a); cursor: pointer; list-style-position: inside; }
|
|
18108
|
+
.sk-group--fold[open] { display: grid; }
|
|
18109
|
+
.sk-group--fold[open] > summary { margin-bottom: 0; }
|
|
17440
18110
|
.sk-field--wide { grid-column: 1 / -1; }
|
|
17441
18111
|
.sk-hint { color: var(--sg-muted, #64748b); font-size: 11.5px; }
|
|
17442
18112
|
@media (max-width: 560px) { .sk-group { grid-template-columns: 1fr; } }
|
|
@@ -40770,4 +41440,4 @@ function checkLicenseKey(key, now = /* @__PURE__ */ new Date()) {
|
|
|
40770
41440
|
};
|
|
40771
41441
|
}
|
|
40772
41442
|
//#endregion
|
|
40773
|
-
export { CANVAS_COLS, CANVAS_GAP_PX, CANVAS_ROW_PX, CONTAINER_CHILD_KINDS, CONTAINER_DISPLAY_KINDS, CRUD_ACTIONS, DEFAULT_PORT, DRIVER_PACKAGE, FORM_SUBMIT, GRID_API_MEMBERS, GRID_CURATED_PROPS, GRID_EVENTS, GRID_PRESETS, MANAGED_END, MANAGED_START, ON_LOAD, PANE_LAYOUTS, STANDARD_UI_EVENTS, TAB_CHILD_KINDS, TRIGGER_EVENTS, UI_COMPONENT_REGISTRY, UserError, addAccordionBlock, addAccordionComponent, addAccordionSection, addBlock, addBlockAt, addComponentBlock, addCrudSuite, addEntity, addFreestandingScreen, addHandlerStep, addScreen, addScreenAction, addScreenFromTemplate, addStateVar, addTab, addTabBlock, addTabComponent, applyGridPreset, blockClassName, blockColumns, blockPalette, blockStyleCss, buildCanvasLayout, buildConnectionString, buildCopilotMessages, buildDockLayout, buildStudioBugReport, canvasOpts, canvasRectOf, changeSlot, checkLicenseKey, clickSlot, compileCondition, compileHandlerSteps, compileStep, compileTriggerStep, compileTriggerSteps, compileValue, componentHandleMembers, componentHandleName, componentHasBindings, countTableRows, createProject, crudAppFromSchemas, crudSuiteScreens, csvToEntity, ctxAmbientDts, ctxCompletions, dashScreen, defaultBlockConfig, defaultEntitySource, defaultScreenFor, defaultStudioTheme, deployCommands, detailScreen, detectDelimiter, disableScreenCode, dockOpts, dockPaneIds, dockPaneTitleOf, duplicateBlock, duplicateScreen, emitEntityModules, emitStudioApp, emitStudioAppBundle, emitStudioFragment, emitStudioProject, enableScreenCode, entityDataSource, entityOf, entityScreenPage, eventSlot, flattenBlocks, formScreen, generateRows, generateValue, getLiveDataSample, getSampleApp, getStarterDataset, getStudioTheme, gridApiSettableProps, gridColumns, gridConfig, gridOpts, gridPresetLabel, gridPropSurface, inferType, insertBlock, introspectDatabase, introspectDrizzle, introspectDrizzleAll, introspectJson, introspectOpenApi, introspectPrisma, introspectPrismaAll, isDarkTheme, isFileDialect, isPaneLayout, isProjectValid, isTenantScoped, isUserError, linkRelationLabels, listDatabaseTables, listScreen, liveDataSamples, mapSqlType, mergeBlockStyle, mergeManaged, missingEnvKeys, moveBlock, moveHandlerStep, parseConnectionString, parseCsv, parseProject, parseSelection, pickLabelField, prepareEntities, probeConnection, projectFromModelText, reconcileDock, redactConnectionString, refineField, refineFields, removeAccordionBlock, removeAccordionSection, removeBlock, removeEntity, removeScreen, removeScreenAction, removeStateVar, removeTab, removeTabBlock, renameAccordionSection, renameTab, reorderBlock, reorderScreen, reseedScreenDock, resolveDeployTarget, resolveIdField, resolveSchema, resolveSchemas, resolveThemeTokens, resolveThemeTokensFor, roleCanAction, roleCanScreen, rowSelectSlot, runStudioAdd, runStudioAddApp, runStudioInit, runtimeDeps, sampleApps, sanitizeClassName, sanitizeProject, sanitizeStudioProject, scaffold, scaffoldApp, schemaToColumns, schemaToFormFields, screenDataset, screenFromTemplate, screenHandles, screenLayoutOf, seedUsers, serializeProject, setAccordionMultiple, setAuth, setCanvasRect, setComponentBinding, setComponentName, setDataLayer, setDataSource, setDeployTarget, setDockPaneTitle, setEntityDataSource, setHandlerBody, setHandlerSteps, setJob, setLayoutOpts, setScreenDock, setScreenHandlersSource, setScreenLayout, setScreenRenderGrid, setScreenRenderMode, setShell, setTenancy, setTheme, setThemePreset, setTrigger, skipUserOwned, splitOpts, ssrEligible, ssrScreenShape, stackOpts, starterDatasets, starterProject, stateInitExpr, stateTsType, statusPills, stepsToCode, studioDeployInfo, studioThemes, summarizeVerify, syncDockPanes, tenantField, themeStyleString, triggersOf, uiComponentSpec, updateBlock, updateEntity, updateHandlerStep, updateScreen, updateStateVar, validateProject, verifyScaffold, withSsrDefaults };
|
|
41443
|
+
export { CANVAS_COLS, CANVAS_GAP_PX, CANVAS_ROW_PX, CONTAINER_CHILD_KINDS, CONTAINER_DISPLAY_KINDS, CRUD_ACTIONS, DEFAULT_PORT, DRIVER_PACKAGE, FORM_SUBMIT, GRID_API_MEMBERS, GRID_CURATED_PROPS, GRID_EVENTS, GRID_PRESETS, MANAGED_END, MANAGED_START, ON_LOAD, PANE_LAYOUTS, STANDARD_UI_EVENTS, TAB_CHILD_KINDS, TRIGGER_EVENTS, UI_COMPONENT_REGISTRY, UserError, addAccordionBlock, addAccordionComponent, addAccordionSection, addBlock, addBlockAt, addComponentBlock, addCrudSuite, addEntity, addFormSection, addFreestandingScreen, addHandlerStep, addScreen, addScreenAction, addScreenFromTemplate, addStateVar, addTab, addTabBlock, addTabComponent, applyGridPreset, blockClassName, blockColumns, blockPalette, blockStyleCss, buildCanvasLayout, buildConnectionString, buildCopilotMessages, buildDockLayout, buildStudioBugReport, canvasOpts, canvasRectOf, changeSlot, checkLicenseKey, clickSlot, compileCondition, compileHandlerSteps, compileStep, compileTriggerStep, compileTriggerSteps, compileValue, componentHandleMembers, componentHandleName, componentHasBindings, countTableRows, createProject, crudAppFromSchemas, crudSuiteScreens, csvToEntity, ctxAmbientDts, ctxCompletions, dashScreen, defaultBlockConfig, defaultEntitySource, defaultScreenFor, defaultStudioTheme, deployCommands, detailScreen, detectDelimiter, disableScreenCode, dockOpts, dockPaneIds, dockPaneTitleOf, duplicateBlock, duplicateScreen, emitEntityModules, emitStudioApp, emitStudioAppBundle, emitStudioFragment, emitStudioProject, enableScreenCode, entityDataSource, entityOf, entityScreenPage, eventSlot, flattenBlocks, formControlSettings, formControlsFor, formPlan, formScreen, generateRows, generateValue, getLiveDataSample, getSampleApp, getStarterDataset, getStudioTheme, gridApiSettableProps, gridColumns, gridConfig, gridOpts, gridPresetLabel, gridPropSurface, inferType, insertBlock, introspectDatabase, introspectDrizzle, introspectDrizzleAll, introspectJson, introspectOpenApi, introspectPrisma, introspectPrismaAll, isDarkTheme, isFieldHidden, isFileDialect, isPaneLayout, isProjectValid, isTenantScoped, isUserError, linkRelationLabels, listDatabaseTables, listScreen, liveDataSamples, mapSqlType, mergeBlockStyle, mergeManaged, missingEnvKeys, moveBlock, moveFormField, moveFormFields, moveFormSection, moveHandlerStep, parseConnectionString, parseCsv, parseProject, parseSelection, pickLabelField, prepareEntities, probeConnection, projectFromModelText, reconcileDock, redactConnectionString, refineField, refineFields, removeAccordionBlock, removeAccordionSection, removeBlock, removeEntity, removeFormSection, removeScreen, removeScreenAction, removeStateVar, removeTab, removeTabBlock, renameAccordionSection, renameTab, reorderBlock, reorderScreen, reseedScreenDock, resolveDeployTarget, resolveIdField, resolveSchema, resolveSchemas, resolveThemeTokens, resolveThemeTokensFor, roleCanAction, roleCanScreen, rowSelectSlot, runStudioAdd, runStudioAddApp, runStudioInit, runtimeDeps, sampleApps, sanitizeClassName, sanitizeProject, sanitizeStudioProject, scaffold, scaffoldApp, schemaToColumns, schemaToFormFields, screenDataset, screenFromTemplate, screenHandles, screenLayoutOf, seedUsers, serializeProject, setAccordionMultiple, setAuth, setCanvasRect, setComponentBinding, setComponentName, setDataLayer, setDataSource, setDeployTarget, setDockPaneTitle, setEntityDataSource, setEntityForm, setFieldConditions, setFieldHidden, setFieldInput, setFormColumns, setHandlerBody, setHandlerSteps, setJob, setLayoutOpts, setScreenDock, setScreenHandlersSource, setScreenLayout, setScreenRenderGrid, setScreenRenderMode, setShell, setTenancy, setTheme, setThemePreset, setTrigger, skipUserOwned, splitOpts, ssrEligible, ssrScreenShape, stackOpts, starterDatasets, starterProject, stateInitExpr, stateTsType, statusPills, stepsToCode, studioDeployInfo, studioThemes, suggestFormSections, summarizeVerify, syncDockPanes, tenantField, themeStyleString, triggersOf, uiComponentSpec, updateBlock, updateEntity, updateEntityField, updateFormSection, updateHandlerStep, updateScreen, updateStateVar, validateProject, verifyScaffold, withSsrDefaults };
|