@svgrid/enterprise 2.5.2 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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/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/dist/SvGridEditPanel.svelte.d.ts +73 -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 +2987 -2981
- package/dist/designer/assets/{index-CM5xvaOy.js → index-BF0UH638.js} +3 -3
- package/dist/designer/assets/{src-D-ET9Mmo.js → src-BPJruwB9.js} +184 -184
- package/dist/designer/index.html +2 -2
- 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 +1 -1
- 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 +369 -0
- package/dist/schema.js +216 -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 +5389 -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 +38 -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 +1327 -0
- package/dist/studio/project.js +1798 -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 +7139 -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 +26 -24
- 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 -127
- package/src/license.ts +0 -137
- 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}/SvExpressionEditor.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}/SvGridEditPanel.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/src/pivot.ts
DELETED
|
@@ -1,578 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pivot table (@svgrid/enterprise).
|
|
3
|
-
*
|
|
4
|
-
* Turns a flat array of rows + a pivot config into:
|
|
5
|
-
* - `rows`: a flat array of pivot rows (group, subtotal, leaf, grand
|
|
6
|
-
* total) suitable for `<SvGrid data={rows} />`.
|
|
7
|
-
* - `columns`: a nested-header column tree suitable for
|
|
8
|
-
* `<SvGrid columns={columns} />` - one column per (col-axis path
|
|
9
|
-
* × value-measure) plus the row-axis "Header" first column.
|
|
10
|
-
*
|
|
11
|
-
* No DOM, no rendering. The grid renders the result with its
|
|
12
|
-
* `columns: ColumnDef[]` + `data: PivotRow[]` like any other dataset.
|
|
13
|
-
*
|
|
14
|
-
* Usage:
|
|
15
|
-
*
|
|
16
|
-
* ```ts
|
|
17
|
-
* import { createPivotModel } from '@svgrid/enterprise'
|
|
18
|
-
*
|
|
19
|
-
* const pivot = createPivotModel(orders, {
|
|
20
|
-
* rows: ['region', 'salesPerson'],
|
|
21
|
-
* cols: ['quarter'],
|
|
22
|
-
* values: [
|
|
23
|
-
* { field: 'amount', agg: 'sum', label: 'Total', format: { type: 'currency', currency: 'USD' } },
|
|
24
|
-
* { field: 'amount', agg: 'avg', label: 'Avg' },
|
|
25
|
-
* ],
|
|
26
|
-
* })
|
|
27
|
-
*
|
|
28
|
-
* // then:
|
|
29
|
-
* <SvGrid data={pivot.rows} columns={pivot.columns} features={features} />
|
|
30
|
-
* ```
|
|
31
|
-
*/
|
|
32
|
-
import type { ColumnDef, CellFormatConfig, RowData, TableFeatures } from '@svgrid/grid'
|
|
33
|
-
|
|
34
|
-
// ---------------------------------------------------------------- types
|
|
35
|
-
|
|
36
|
-
export type PivotAggregatorId =
|
|
37
|
-
| 'sum'
|
|
38
|
-
| 'avg'
|
|
39
|
-
| 'min'
|
|
40
|
-
| 'max'
|
|
41
|
-
| 'count'
|
|
42
|
-
| 'countDistinct'
|
|
43
|
-
| 'first'
|
|
44
|
-
| 'last'
|
|
45
|
-
|
|
46
|
-
export type PivotAggregator = (values: ReadonlyArray<unknown>) => unknown
|
|
47
|
-
|
|
48
|
-
export type PivotValueConfig<TData> = {
|
|
49
|
-
/** Row field whose values get aggregated. */
|
|
50
|
-
field: keyof TData & string
|
|
51
|
-
/** Built-in aggregator id, or a custom reducer. */
|
|
52
|
-
agg: PivotAggregatorId | PivotAggregator
|
|
53
|
-
/** Display name in the column header. Defaults to `${field} (${agg})`. */
|
|
54
|
-
label?: string
|
|
55
|
-
/** Optional cell formatter. */
|
|
56
|
-
format?: CellFormatConfig
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export type PivotConfig<TData> = {
|
|
60
|
-
/** Outer-most first. Each entry becomes one level of row grouping. */
|
|
61
|
-
rows: ReadonlyArray<keyof TData & string>
|
|
62
|
-
/** Outer-most first. Each entry becomes one level of column grouping. */
|
|
63
|
-
cols: ReadonlyArray<keyof TData & string>
|
|
64
|
-
/** One or more measures aggregated under each column-axis leaf. */
|
|
65
|
-
values: ReadonlyArray<PivotValueConfig<TData>>
|
|
66
|
-
/** Grand-total row at the bottom. Default `true`. */
|
|
67
|
-
grandTotalRow?: boolean
|
|
68
|
-
/** Grand-total column on the right. Default `true`. */
|
|
69
|
-
grandTotalCol?: boolean
|
|
70
|
-
/** Subtotal rows between row groups. Default `true`. */
|
|
71
|
-
rowSubtotals?: boolean
|
|
72
|
-
/** Optional sort for column-axis values per dim level (defaults to alpha). */
|
|
73
|
-
colSort?: (a: unknown, b: unknown, level: number) => number
|
|
74
|
-
/** Optional sort for row-axis values per dim level (defaults to alpha). */
|
|
75
|
-
rowSort?: (a: unknown, b: unknown, level: number) => number
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export type PivotRowKind = 'group' | 'subtotal' | 'leaf' | 'grandTotal'
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Shape of one entry in `result.rows`. The first-column label lives at
|
|
82
|
-
* `__pivotLabel`; every value cell lives at the column id matching the
|
|
83
|
-
* leaf column generated for its (col-path × measure).
|
|
84
|
-
*
|
|
85
|
-
* `__pivotParentId` is the `__pivotId` of the row's row-axis parent
|
|
86
|
-
* (or `null` for top-level groups, the grand-total row, and the one
|
|
87
|
-
* synthetic "All" row when no row dims are configured). Use it with
|
|
88
|
-
* `filterCollapsedPivotRows` to hide leaves whose ancestor is
|
|
89
|
-
* collapsed - that's how expandable pivots are built on top of the
|
|
90
|
-
* model.
|
|
91
|
-
*
|
|
92
|
-
* `__pivotExpandable` is `true` for `group` rows that have at least
|
|
93
|
-
* one descendant. A renderer uses this to decide whether to show a
|
|
94
|
-
* chevron next to the label.
|
|
95
|
-
*/
|
|
96
|
-
export type PivotRow = {
|
|
97
|
-
__pivotId: string
|
|
98
|
-
__pivotKind: PivotRowKind
|
|
99
|
-
__pivotDepth: number
|
|
100
|
-
__pivotLabel: string
|
|
101
|
-
__pivotParentId: string | null
|
|
102
|
-
__pivotExpandable: boolean
|
|
103
|
-
/** Aggregated value cells - keyed by leaf column id. */
|
|
104
|
-
[columnId: string]: unknown
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
export type PivotResult<TFeatures extends TableFeatures> = {
|
|
108
|
-
rows: PivotRow[]
|
|
109
|
-
columns: Array<ColumnDef<TFeatures, PivotRow>>
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// -------------------------------------------------------- aggregators
|
|
113
|
-
|
|
114
|
-
const numeric = (vs: ReadonlyArray<unknown>): number[] =>
|
|
115
|
-
vs
|
|
116
|
-
.map((v) => (typeof v === 'number' ? v : Number(v)))
|
|
117
|
-
.filter((n): n is number => !Number.isNaN(n))
|
|
118
|
-
|
|
119
|
-
const BUILT_IN_AGGS: Record<PivotAggregatorId, PivotAggregator> = {
|
|
120
|
-
sum: (vs) => numeric(vs).reduce((a, b) => a + b, 0),
|
|
121
|
-
avg: (vs) => {
|
|
122
|
-
const ns = numeric(vs)
|
|
123
|
-
return ns.length === 0 ? null : ns.reduce((a, b) => a + b, 0) / ns.length
|
|
124
|
-
},
|
|
125
|
-
min: (vs) => (numeric(vs).length === 0 ? null : Math.min(...numeric(vs))),
|
|
126
|
-
max: (vs) => (numeric(vs).length === 0 ? null : Math.max(...numeric(vs))),
|
|
127
|
-
count: (vs) => vs.length,
|
|
128
|
-
countDistinct: (vs) => new Set(vs).size,
|
|
129
|
-
first: (vs) => vs[0] ?? null,
|
|
130
|
-
last: (vs) => vs[vs.length - 1] ?? null,
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
function resolveAgg(agg: PivotAggregatorId | PivotAggregator): PivotAggregator {
|
|
134
|
-
if (typeof agg === 'function') return agg
|
|
135
|
-
const fn = BUILT_IN_AGGS[agg]
|
|
136
|
-
if (!fn) throw new Error(`pivot: unknown aggregator '${String(agg)}'`)
|
|
137
|
-
return fn
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// --------------------------------------------------- axis-tree helpers
|
|
141
|
-
|
|
142
|
-
type AxisNode = {
|
|
143
|
-
/** Dimension level (index into config.cols / config.rows). 0 at root. */
|
|
144
|
-
level: number
|
|
145
|
-
/** Dim value at this node (root has value `null`). */
|
|
146
|
-
value: unknown
|
|
147
|
-
/** Path of values from root to this node (excluding root). */
|
|
148
|
-
path: ReadonlyArray<unknown>
|
|
149
|
-
/** Stable string id for the path. */
|
|
150
|
-
pathKey: string
|
|
151
|
-
/** Direct children, keyed by stringified value. */
|
|
152
|
-
children: Map<string, AxisNode>
|
|
153
|
-
/** Rows reaching this node (leaf or otherwise). */
|
|
154
|
-
rows: unknown[]
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
function defaultCompare(a: unknown, b: unknown): number {
|
|
158
|
-
if (a === b) return 0
|
|
159
|
-
if (a == null) return -1
|
|
160
|
-
if (b == null) return 1
|
|
161
|
-
if (typeof a === 'number' && typeof b === 'number') return a - b
|
|
162
|
-
return String(a).localeCompare(String(b), undefined, { numeric: true })
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
function buildAxisTree<TData>(
|
|
166
|
-
rows: ReadonlyArray<TData>,
|
|
167
|
-
fields: ReadonlyArray<string>,
|
|
168
|
-
sortBy: ((a: unknown, b: unknown, level: number) => number) | undefined,
|
|
169
|
-
): AxisNode {
|
|
170
|
-
const root: AxisNode = {
|
|
171
|
-
level: 0, value: null, path: [], pathKey: '__root',
|
|
172
|
-
children: new Map(), rows: rows as unknown[],
|
|
173
|
-
}
|
|
174
|
-
for (const row of rows as ReadonlyArray<Record<string, unknown>>) {
|
|
175
|
-
let node = root
|
|
176
|
-
for (let i = 0; i < fields.length; i += 1) {
|
|
177
|
-
const field = fields[i]!
|
|
178
|
-
const value = row[field]
|
|
179
|
-
const key = `${i}:${value === null ? '__null' : String(value)}`
|
|
180
|
-
let child = node.children.get(key)
|
|
181
|
-
if (!child) {
|
|
182
|
-
child = {
|
|
183
|
-
level: i + 1,
|
|
184
|
-
value,
|
|
185
|
-
path: [...node.path, value],
|
|
186
|
-
pathKey: node.pathKey === '__root' ? key : `${node.pathKey}|${key}`,
|
|
187
|
-
children: new Map(),
|
|
188
|
-
rows: [],
|
|
189
|
-
}
|
|
190
|
-
node.children.set(key, child)
|
|
191
|
-
}
|
|
192
|
-
child.rows.push(row)
|
|
193
|
-
node = child
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
// Stable, predictable child order at every level.
|
|
197
|
-
sortNode(root, sortBy)
|
|
198
|
-
return root
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
function sortNode(
|
|
202
|
-
node: AxisNode,
|
|
203
|
-
sortBy: ((a: unknown, b: unknown, level: number) => number) | undefined,
|
|
204
|
-
): void {
|
|
205
|
-
const entries = Array.from(node.children.entries())
|
|
206
|
-
entries.sort(([, a], [, b]) => (sortBy ?? defaultCompare)(a.value, b.value, a.level - 1))
|
|
207
|
-
node.children = new Map(entries)
|
|
208
|
-
for (const child of node.children.values()) sortNode(child, sortBy)
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// --------------------------------------------------- column id helpers
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Generate stable leaf column ids by joining the column-axis path and the
|
|
215
|
-
* measure index. The id is what appears as `data-col-id` and as the key
|
|
216
|
-
* inside each pivot row. Kept short and deterministic.
|
|
217
|
-
*/
|
|
218
|
-
function leafColumnId(colPath: ReadonlyArray<unknown>, measureIndex: number): string {
|
|
219
|
-
const path = colPath.length === 0 ? 'all' : colPath.map((v) => safe(v)).join('__')
|
|
220
|
-
return `pv__${path}__m${measureIndex}`
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
function safe(v: unknown): string {
|
|
224
|
-
if (v === null || v === undefined) return 'null'
|
|
225
|
-
return String(v).replace(/[^a-zA-Z0-9_-]/g, '_')
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// --------------------------------------------------- column-tree build
|
|
229
|
-
|
|
230
|
-
function buildColumnTree<TFeatures extends TableFeatures>(
|
|
231
|
-
colRoot: AxisNode,
|
|
232
|
-
values: ReadonlyArray<PivotValueConfig<unknown>>,
|
|
233
|
-
config: PivotConfig<unknown>,
|
|
234
|
-
rowHeaderLabel: string,
|
|
235
|
-
): Array<ColumnDef<TFeatures, PivotRow>> {
|
|
236
|
-
// First column: the row-axis tree as a single column. The label per row
|
|
237
|
-
// comes from `__pivotLabel`, with `__pivotDepth` driving the indent.
|
|
238
|
-
const headerCol: ColumnDef<TFeatures, PivotRow> = {
|
|
239
|
-
id: '__pivotRowHeader',
|
|
240
|
-
header: rowHeaderLabel,
|
|
241
|
-
fieldFn: (row) => row.__pivotLabel,
|
|
242
|
-
width: 240,
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
function recurse(node: AxisNode): Array<ColumnDef<TFeatures, PivotRow>> {
|
|
246
|
-
// If this is a column-axis leaf (no children), emit one value column
|
|
247
|
-
// per measure.
|
|
248
|
-
if (node.children.size === 0) {
|
|
249
|
-
return values.map((value, i) => {
|
|
250
|
-
const id = leafColumnId(node.path, i)
|
|
251
|
-
const label = value.label ?? `${value.field} (${typeof value.agg === 'function' ? 'custom' : value.agg})`
|
|
252
|
-
return {
|
|
253
|
-
id,
|
|
254
|
-
header: label,
|
|
255
|
-
fieldFn: (row) => row[id],
|
|
256
|
-
format: value.format,
|
|
257
|
-
width: 130,
|
|
258
|
-
} as ColumnDef<TFeatures, PivotRow>
|
|
259
|
-
})
|
|
260
|
-
}
|
|
261
|
-
// Otherwise emit a header group with this node's value as the label
|
|
262
|
-
// and recurse for its children.
|
|
263
|
-
return Array.from(node.children.values()).map((child) => ({
|
|
264
|
-
id: `pv_group_${child.pathKey}`,
|
|
265
|
-
header: String(child.value ?? '(blank)'),
|
|
266
|
-
columns: recurse(child),
|
|
267
|
-
} as unknown as ColumnDef<TFeatures, PivotRow>))
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
const valueCols = colRoot.children.size === 0
|
|
271
|
-
// No col dims at all: emit measures as flat columns under no group.
|
|
272
|
-
? recurse(colRoot)
|
|
273
|
-
: recurse(colRoot)
|
|
274
|
-
|
|
275
|
-
const grandTotalCol = config.grandTotalCol !== false
|
|
276
|
-
if (!grandTotalCol) return [headerCol, ...valueCols]
|
|
277
|
-
|
|
278
|
-
// Grand total column: one measure column per value config, with no
|
|
279
|
-
// col-path filter.
|
|
280
|
-
const totalCols: Array<ColumnDef<TFeatures, PivotRow>> = values.map((value, i) => {
|
|
281
|
-
const id = leafColumnId(['__total'], i)
|
|
282
|
-
const label = value.label ?? `${value.field} (${typeof value.agg === 'function' ? 'custom' : value.agg})`
|
|
283
|
-
return {
|
|
284
|
-
id,
|
|
285
|
-
header: label,
|
|
286
|
-
fieldFn: (row) => row[id],
|
|
287
|
-
format: value.format,
|
|
288
|
-
width: 140,
|
|
289
|
-
} as ColumnDef<TFeatures, PivotRow>
|
|
290
|
-
})
|
|
291
|
-
const grandTotal: ColumnDef<TFeatures, PivotRow> = {
|
|
292
|
-
id: 'pv_group__grand_total',
|
|
293
|
-
header: 'Total',
|
|
294
|
-
columns: totalCols,
|
|
295
|
-
} as unknown as ColumnDef<TFeatures, PivotRow>
|
|
296
|
-
|
|
297
|
-
return [headerCol, ...valueCols, grandTotal]
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
// --------------------------------------------------- row-axis materialise
|
|
301
|
-
|
|
302
|
-
function collectColLeafPaths(node: AxisNode, into: Array<ReadonlyArray<unknown>>): void {
|
|
303
|
-
if (node.children.size === 0) {
|
|
304
|
-
into.push(node.path)
|
|
305
|
-
return
|
|
306
|
-
}
|
|
307
|
-
for (const child of node.children.values()) collectColLeafPaths(child, into)
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
/**
|
|
311
|
-
* For one source-row set (a row-axis node) compute the value at each
|
|
312
|
-
* column-axis leaf for each measure. Returns a map keyed by column id.
|
|
313
|
-
*/
|
|
314
|
-
function computeRowValues(
|
|
315
|
-
sourceRows: ReadonlyArray<Record<string, unknown>>,
|
|
316
|
-
colLeafPaths: ReadonlyArray<ReadonlyArray<unknown>>,
|
|
317
|
-
colFields: ReadonlyArray<string>,
|
|
318
|
-
values: ReadonlyArray<PivotValueConfig<unknown>>,
|
|
319
|
-
includeGrandTotalCol: boolean,
|
|
320
|
-
): Record<string, unknown> {
|
|
321
|
-
const result: Record<string, unknown> = {}
|
|
322
|
-
|
|
323
|
-
// For each col-axis leaf path, filter the source rows to those matching
|
|
324
|
-
// every dim value, then run each measure aggregator.
|
|
325
|
-
for (const colPath of colLeafPaths) {
|
|
326
|
-
const matched = colPath.length === 0
|
|
327
|
-
? sourceRows
|
|
328
|
-
: sourceRows.filter((r) =>
|
|
329
|
-
colPath.every((value, i) => r[colFields[i]!] === value),
|
|
330
|
-
)
|
|
331
|
-
for (let i = 0; i < values.length; i += 1) {
|
|
332
|
-
const value = values[i]!
|
|
333
|
-
const fn = resolveAgg(value.agg)
|
|
334
|
-
const id = leafColumnId(colPath, i)
|
|
335
|
-
result[id] = fn(matched.map((r) => r[value.field]))
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
// Grand-total column: run each measure across the entire source set.
|
|
340
|
-
if (includeGrandTotalCol) {
|
|
341
|
-
for (let i = 0; i < values.length; i += 1) {
|
|
342
|
-
const value = values[i]!
|
|
343
|
-
const fn = resolveAgg(value.agg)
|
|
344
|
-
const id = leafColumnId(['__total'], i)
|
|
345
|
-
result[id] = fn(sourceRows.map((r) => r[value.field]))
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
return result
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
/**
|
|
353
|
-
* Build the same value-column keys as `computeRowValues`, but with every cell
|
|
354
|
-
* `null`. Used for group HEADER rows when `rowSubtotals` is off: the row keeps
|
|
355
|
-
* its place in the hierarchy (label + expand/collapse) yet shows no aggregate
|
|
356
|
-
* numbers. Cells are `null` rather than absent so consumers can distinguish a
|
|
357
|
-
* deliberately-blank subtotal from a missing column.
|
|
358
|
-
*/
|
|
359
|
-
function blankRowValues(
|
|
360
|
-
colLeafPaths: ReadonlyArray<ReadonlyArray<unknown>>,
|
|
361
|
-
values: ReadonlyArray<PivotValueConfig<unknown>>,
|
|
362
|
-
includeGrandTotalCol: boolean,
|
|
363
|
-
): Record<string, null> {
|
|
364
|
-
const result: Record<string, null> = {}
|
|
365
|
-
for (const colPath of colLeafPaths) {
|
|
366
|
-
for (let i = 0; i < values.length; i += 1) result[leafColumnId(colPath, i)] = null
|
|
367
|
-
}
|
|
368
|
-
if (includeGrandTotalCol) {
|
|
369
|
-
for (let i = 0; i < values.length; i += 1) result[leafColumnId(['__total'], i)] = null
|
|
370
|
-
}
|
|
371
|
-
return result
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
function walkRowTree(
|
|
375
|
-
node: AxisNode,
|
|
376
|
-
out: PivotRow[],
|
|
377
|
-
colLeafPaths: ReadonlyArray<ReadonlyArray<unknown>>,
|
|
378
|
-
colFields: ReadonlyArray<string>,
|
|
379
|
-
values: ReadonlyArray<PivotValueConfig<unknown>>,
|
|
380
|
-
config: PivotConfig<unknown>,
|
|
381
|
-
rowFields: ReadonlyArray<string>,
|
|
382
|
-
/**
|
|
383
|
-
* The id of the row-axis ancestor that should be reported as
|
|
384
|
-
* `__pivotParentId` on every row emitted under this subtree. `null`
|
|
385
|
-
* at the top level.
|
|
386
|
-
*/
|
|
387
|
-
parentId: string | null,
|
|
388
|
-
): void {
|
|
389
|
-
const includeGrandTotalCol = config.grandTotalCol !== false
|
|
390
|
-
const wantSubtotals = config.rowSubtotals !== false
|
|
391
|
-
|
|
392
|
-
// The "leaf" case: this is a row-axis leaf - no further row dimensions.
|
|
393
|
-
if (node.children.size === 0) {
|
|
394
|
-
out.push({
|
|
395
|
-
__pivotId: `row__${node.pathKey}`,
|
|
396
|
-
__pivotKind: 'leaf',
|
|
397
|
-
__pivotDepth: node.level,
|
|
398
|
-
__pivotLabel: node.value === null ? '(All)' : String(node.value),
|
|
399
|
-
__pivotParentId: parentId,
|
|
400
|
-
__pivotExpandable: false,
|
|
401
|
-
...computeRowValues(
|
|
402
|
-
node.rows as ReadonlyArray<Record<string, unknown>>,
|
|
403
|
-
colLeafPaths,
|
|
404
|
-
colFields,
|
|
405
|
-
values,
|
|
406
|
-
includeGrandTotalCol,
|
|
407
|
-
),
|
|
408
|
-
})
|
|
409
|
-
return
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
// Group node. Emit the group HEADER row whenever this node is a real group
|
|
413
|
-
// (not the synthetic root, not the deepest level). The header is emitted
|
|
414
|
-
// regardless of `rowSubtotals` so the grouping hierarchy and the
|
|
415
|
-
// expand/collapse parent chain stay intact; the flag only controls whether
|
|
416
|
-
// the header carries its aggregate (subtotal) values or renders as a
|
|
417
|
-
// label-only row. This matches Excel / AG Grid, where hiding subtotals never
|
|
418
|
-
// removes a grouping level from the row axis.
|
|
419
|
-
const isRealGroup = node.level > 0 && node.level < rowFields.length
|
|
420
|
-
let nextParentId: string | null = parentId
|
|
421
|
-
if (isRealGroup) {
|
|
422
|
-
const id = `group__${node.pathKey}`
|
|
423
|
-
out.push({
|
|
424
|
-
__pivotId: id,
|
|
425
|
-
__pivotKind: 'group',
|
|
426
|
-
__pivotDepth: node.level,
|
|
427
|
-
__pivotLabel: String(node.value ?? '(All)'),
|
|
428
|
-
__pivotParentId: parentId,
|
|
429
|
-
__pivotExpandable: true,
|
|
430
|
-
...(wantSubtotals
|
|
431
|
-
? computeRowValues(
|
|
432
|
-
node.rows as ReadonlyArray<Record<string, unknown>>,
|
|
433
|
-
colLeafPaths,
|
|
434
|
-
colFields,
|
|
435
|
-
values,
|
|
436
|
-
includeGrandTotalCol,
|
|
437
|
-
)
|
|
438
|
-
: blankRowValues(colLeafPaths, values, includeGrandTotalCol)),
|
|
439
|
-
})
|
|
440
|
-
// Children of this group point at this row as their parent so a
|
|
441
|
-
// collapse hides the whole subtree, not just the immediate leaves.
|
|
442
|
-
nextParentId = id
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
for (const child of node.children.values()) {
|
|
446
|
-
walkRowTree(
|
|
447
|
-
child, out, colLeafPaths, colFields, values, config, rowFields, nextParentId,
|
|
448
|
-
)
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
// ------------------------------------------------------------ public API
|
|
453
|
-
|
|
454
|
-
export function createPivotModel<
|
|
455
|
-
TFeatures extends TableFeatures,
|
|
456
|
-
TData extends RowData,
|
|
457
|
-
>(
|
|
458
|
-
data: ReadonlyArray<TData>,
|
|
459
|
-
config: PivotConfig<TData>,
|
|
460
|
-
): PivotResult<TFeatures> {
|
|
461
|
-
if (config.values.length === 0) {
|
|
462
|
-
throw new Error('pivot: at least one value config is required')
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
const rowFields = config.rows as ReadonlyArray<string>
|
|
466
|
-
const colFields = config.cols as ReadonlyArray<string>
|
|
467
|
-
const values = config.values as ReadonlyArray<PivotValueConfig<unknown>>
|
|
468
|
-
|
|
469
|
-
// 1. axis trees
|
|
470
|
-
const rowRoot = buildAxisTree(data, rowFields, config.rowSort)
|
|
471
|
-
const colRoot = buildAxisTree(data, colFields, config.colSort)
|
|
472
|
-
|
|
473
|
-
// 2. collect col-axis leaf paths (one per value column header chain)
|
|
474
|
-
const colLeafPaths: Array<ReadonlyArray<unknown>> = []
|
|
475
|
-
collectColLeafPaths(colRoot, colLeafPaths)
|
|
476
|
-
|
|
477
|
-
// 3. flatten row-axis to pivot rows
|
|
478
|
-
const rows: PivotRow[] = []
|
|
479
|
-
if (rowFields.length === 0) {
|
|
480
|
-
// No row dims: one synthetic "All" row.
|
|
481
|
-
rows.push({
|
|
482
|
-
__pivotId: 'row__all',
|
|
483
|
-
__pivotKind: 'leaf',
|
|
484
|
-
__pivotDepth: 0,
|
|
485
|
-
__pivotLabel: '(All)',
|
|
486
|
-
__pivotParentId: null,
|
|
487
|
-
__pivotExpandable: false,
|
|
488
|
-
...computeRowValues(
|
|
489
|
-
data as unknown as ReadonlyArray<Record<string, unknown>>,
|
|
490
|
-
colLeafPaths,
|
|
491
|
-
colFields,
|
|
492
|
-
values,
|
|
493
|
-
config.grandTotalCol !== false,
|
|
494
|
-
),
|
|
495
|
-
})
|
|
496
|
-
} else {
|
|
497
|
-
walkRowTree(
|
|
498
|
-
rowRoot, rows, colLeafPaths, colFields, values,
|
|
499
|
-
config as PivotConfig<unknown>, rowFields, null,
|
|
500
|
-
)
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
// 4. grand-total row at bottom
|
|
504
|
-
if (config.grandTotalRow !== false) {
|
|
505
|
-
rows.push({
|
|
506
|
-
__pivotId: 'row__grand_total',
|
|
507
|
-
__pivotKind: 'grandTotal',
|
|
508
|
-
__pivotDepth: 0,
|
|
509
|
-
__pivotLabel: 'Grand total',
|
|
510
|
-
__pivotParentId: null,
|
|
511
|
-
__pivotExpandable: false,
|
|
512
|
-
...computeRowValues(
|
|
513
|
-
data as unknown as ReadonlyArray<Record<string, unknown>>,
|
|
514
|
-
colLeafPaths,
|
|
515
|
-
colFields,
|
|
516
|
-
values,
|
|
517
|
-
config.grandTotalCol !== false,
|
|
518
|
-
),
|
|
519
|
-
})
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
// 5. column tree
|
|
523
|
-
const columns = buildColumnTree<TFeatures>(
|
|
524
|
-
colRoot,
|
|
525
|
-
values,
|
|
526
|
-
config as PivotConfig<unknown>,
|
|
527
|
-
rowFields.length > 0 ? rowFields.join(' / ') : '',
|
|
528
|
-
)
|
|
529
|
-
|
|
530
|
-
return { rows, columns }
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
/**
|
|
534
|
-
* Public registry of built-in aggregators. Useful for surfacing the
|
|
535
|
-
* available options in a pivot designer UI.
|
|
536
|
-
*/
|
|
537
|
-
export const pivotAggregators: Record<PivotAggregatorId, PivotAggregator> = { ...BUILT_IN_AGGS }
|
|
538
|
-
|
|
539
|
-
/**
|
|
540
|
-
* Filter a `result.rows` array down to only the rows the user should
|
|
541
|
-
* see given the current expansion state. A row stays in the output if
|
|
542
|
-
* its entire ancestor chain (via `__pivotParentId`) is in `expandedIds`.
|
|
543
|
-
*
|
|
544
|
-
* Pass `true` to bypass filtering (everything visible - the default
|
|
545
|
-
* shape `createPivotModel` already returns). Pass an empty array /
|
|
546
|
-
* empty Set to collapse every group to its subtotal row.
|
|
547
|
-
*
|
|
548
|
-
* The result is a new array; the input is not mutated.
|
|
549
|
-
*/
|
|
550
|
-
export function filterCollapsedPivotRows(
|
|
551
|
-
rows: ReadonlyArray<PivotRow>,
|
|
552
|
-
expandedIds: ReadonlyArray<string> | Set<string> | true,
|
|
553
|
-
): PivotRow[] {
|
|
554
|
-
if (expandedIds === true) return rows.slice()
|
|
555
|
-
const expanded =
|
|
556
|
-
expandedIds instanceof Set ? expandedIds : new Set(expandedIds)
|
|
557
|
-
// Parent-of index so the ancestor walk is O(depth) instead of O(rows × depth).
|
|
558
|
-
const parentOf = new Map<string, string | null>()
|
|
559
|
-
for (const r of rows) parentOf.set(r.__pivotId, r.__pivotParentId)
|
|
560
|
-
|
|
561
|
-
const out: PivotRow[] = []
|
|
562
|
-
for (const row of rows) {
|
|
563
|
-
// The grand-total row, top-level groups, and the (All) row are
|
|
564
|
-
// always visible (their parent is null).
|
|
565
|
-
if (row.__pivotParentId === null) {
|
|
566
|
-
out.push(row)
|
|
567
|
-
continue
|
|
568
|
-
}
|
|
569
|
-
let parentId: string | null = row.__pivotParentId
|
|
570
|
-
let visible = true
|
|
571
|
-
while (parentId !== null) {
|
|
572
|
-
if (!expanded.has(parentId)) { visible = false; break }
|
|
573
|
-
parentId = parentOf.get(parentId) ?? null
|
|
574
|
-
}
|
|
575
|
-
if (visible) out.push(row)
|
|
576
|
-
}
|
|
577
|
-
return out
|
|
578
|
-
}
|
package/src/print.ts
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import type { RowData, TableFeatures, SvGridApi } from '@svgrid/grid'
|
|
2
|
-
import { assertEnterpriseLicensed } from './license'
|
|
3
|
-
import {
|
|
4
|
-
buildLinkResolver,
|
|
5
|
-
projectRows,
|
|
6
|
-
resolveColumns,
|
|
7
|
-
resolveRowSource,
|
|
8
|
-
type ExportColumn,
|
|
9
|
-
type ExportRowSource,
|
|
10
|
-
} from './export'
|
|
11
|
-
import { buildPrintDocument, type PrintDocOptions } from './export-print'
|
|
12
|
-
import { buildConditionalResolver } from './export-conditional'
|
|
13
|
-
import type { ConditionalFormat } from '@svgrid/grid/format'
|
|
14
|
-
|
|
15
|
-
export type PrintOptions<TData> = {
|
|
16
|
-
/** Title placed above the printed grid. Defaults to "Grid". */
|
|
17
|
-
title?: string
|
|
18
|
-
/** Smaller line under the title. */
|
|
19
|
-
subtitle?: string
|
|
20
|
-
/** Logo data URL, shown above the title. */
|
|
21
|
-
logo?: string
|
|
22
|
-
/** Columns to print. Defaults to the grid's own visible columns (with their
|
|
23
|
-
* header labels + `format`, so values print formatted). */
|
|
24
|
-
columns?: ReadonlyArray<ExportColumn<TData>>
|
|
25
|
-
/** Rows to print. Defaults to the current view; accepts the same
|
|
26
|
-
* `'displayed' | 'selected' | 'all'` shorthand as `exportData`. */
|
|
27
|
-
rows?: ExportRowSource<TData>
|
|
28
|
-
/** Write raw underlying values instead of the formatted display values. */
|
|
29
|
-
rawValues?: boolean
|
|
30
|
-
/** Print orientation. Browsers honor it via `@page { size }`. Default "portrait". */
|
|
31
|
-
orientation?: 'portrait' | 'landscape'
|
|
32
|
-
/** `@page` size keyword, e.g. 'A4' | 'Letter'. Combined with orientation. */
|
|
33
|
-
pageSize?: string
|
|
34
|
-
/** Page margin, e.g. '14mm'. Default '14mm'. */
|
|
35
|
-
margin?: string
|
|
36
|
-
/** Zebra-stripe rows. Default true. */
|
|
37
|
-
zebra?: boolean
|
|
38
|
-
/** Header row background color. */
|
|
39
|
-
headerColor?: string
|
|
40
|
-
/** Conditional formatting rules (same array as `<SvGrid conditionalFormats>`);
|
|
41
|
-
* carried into the print view as cell background / color / bold + icons. */
|
|
42
|
-
conditionalFormats?: ReadonlyArray<ConditionalFormat<TData>>
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export async function printGrid<
|
|
46
|
-
TFeatures extends TableFeatures,
|
|
47
|
-
TData extends RowData,
|
|
48
|
-
>(api: SvGridApi<TFeatures, TData>, opts?: PrintOptions<TData>): Promise<void> {
|
|
49
|
-
assertEnterpriseLicensed('Print')
|
|
50
|
-
if (typeof window === 'undefined') {
|
|
51
|
-
throw new Error('@svgrid/enterprise: print requires a browser environment')
|
|
52
|
-
}
|
|
53
|
-
const sourceRows = resolveRowSource(api, opts?.rows)
|
|
54
|
-
if (sourceRows.length === 0) {
|
|
55
|
-
throw new Error('@svgrid/enterprise: nothing to print - the grid has no rows')
|
|
56
|
-
}
|
|
57
|
-
const cols = resolveColumns(api, { columns: opts?.columns }, sourceRows)
|
|
58
|
-
const fields = cols.map((c) => c.field)
|
|
59
|
-
// Formatted display values (or raw when asked) so the print matches the grid.
|
|
60
|
-
const projected = await projectRows(sourceRows, cols, { rawValues: opts?.rawValues })
|
|
61
|
-
const dataRows = projected.slice(1).map((r) => fields.map((f) => String(r[f] ?? '')))
|
|
62
|
-
const columns = cols.map((c) => ({ header: c.header ?? c.field, align: c.align }))
|
|
63
|
-
|
|
64
|
-
const docOpts: PrintDocOptions = {
|
|
65
|
-
title: opts?.title ?? 'Grid',
|
|
66
|
-
subtitle: opts?.subtitle,
|
|
67
|
-
logo: opts?.logo,
|
|
68
|
-
orientation: opts?.orientation ?? 'portrait',
|
|
69
|
-
pageSize: opts?.pageSize,
|
|
70
|
-
margin: opts?.margin,
|
|
71
|
-
zebra: opts?.zebra,
|
|
72
|
-
headerColor: opts?.headerColor,
|
|
73
|
-
}
|
|
74
|
-
const visual = buildConditionalResolver(cols, sourceRows, opts?.conditionalFormats)
|
|
75
|
-
const link = buildLinkResolver(cols, sourceRows)
|
|
76
|
-
const html = buildPrintDocument({
|
|
77
|
-
columns,
|
|
78
|
-
rows: dataRows,
|
|
79
|
-
cellStyle: (r, c) => visual(r, c),
|
|
80
|
-
cellLink: link,
|
|
81
|
-
opts: docOpts,
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
const w = window.open('', '_blank', 'width=900,height=700')
|
|
85
|
-
if (!w) {
|
|
86
|
-
throw new Error(
|
|
87
|
-
'@svgrid/enterprise: print() could not open a window - the browser blocked the popup',
|
|
88
|
-
)
|
|
89
|
-
}
|
|
90
|
-
w.document.open()
|
|
91
|
-
w.document.write(html)
|
|
92
|
-
w.document.close()
|
|
93
|
-
// Give the new window one tick to paint before invoking print.
|
|
94
|
-
w.focus()
|
|
95
|
-
w.addEventListener('load', () => {
|
|
96
|
-
setTimeout(() => w.print(), 50)
|
|
97
|
-
})
|
|
98
|
-
// Some browsers fire 'load' before the listener attaches if the document was
|
|
99
|
-
// already complete. Fall back: try a print after a short delay regardless.
|
|
100
|
-
setTimeout(() => {
|
|
101
|
-
try {
|
|
102
|
-
w.print()
|
|
103
|
-
} catch {
|
|
104
|
-
// ignore - the listener path will have fired
|
|
105
|
-
}
|
|
106
|
-
}, 300)
|
|
107
|
-
}
|