@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/scheduler-config.ts
DELETED
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SchedulerProConfig - the Enterprise ("Scheduler Pro") superset of the free grid
|
|
3
|
-
* {@link SchedulerConfig}. The base scheduler prop + its config type ship in
|
|
4
|
-
* `@svgrid/grid`; the Pro renderer (SvGridScheduler) reads these extra fields at
|
|
5
|
-
* runtime (the renderer is registered untyped, so nothing in the free grid needs
|
|
6
|
-
* to know about them). Consumers using Pro features type their config as
|
|
7
|
-
* `SchedulerProConfig` - it is structurally assignable to the `scheduler` prop.
|
|
8
|
-
*
|
|
9
|
-
* All three feature waves live here:
|
|
10
|
-
* - Wave A: event dependencies + auto-reschedule
|
|
11
|
-
* - Wave B: multi-assignment + resource histogram + column summary
|
|
12
|
-
* - Wave C: non-working-time collapse + continuous zoom
|
|
13
|
-
*/
|
|
14
|
-
import type {
|
|
15
|
-
SchedulerConfig,
|
|
16
|
-
SchedulerResource,
|
|
17
|
-
TableFeatures,
|
|
18
|
-
RowData,
|
|
19
|
-
} from '@svgrid/grid'
|
|
20
|
-
import type { SchedulerDependency } from './scheduler-dependencies'
|
|
21
|
-
import type { SchedulerAssignment } from './scheduler-assignments'
|
|
22
|
-
import type { ColumnReducer } from './scheduler-summary'
|
|
23
|
-
import type { ZoomLevel } from './scheduler-axis'
|
|
24
|
-
import type { SchedulerResourceGroup } from './scheduler-resource-tree'
|
|
25
|
-
|
|
26
|
-
export type SchedulerProConfig<
|
|
27
|
-
TFeatures extends TableFeatures = TableFeatures,
|
|
28
|
-
TData extends RowData = RowData,
|
|
29
|
-
> = SchedulerConfig<TFeatures, TData> & {
|
|
30
|
-
// --- Wave A: dependencies + auto-reschedule --------------------------------
|
|
31
|
-
/**
|
|
32
|
-
* Event dependency links (predecessor -> successor). `from` / `to` are row ids
|
|
33
|
-
* (the grid's `getRowId`). Draw arrows between linked events and, with
|
|
34
|
-
* `autoReschedule`, push successors forward when a predecessor moves.
|
|
35
|
-
*/
|
|
36
|
-
dependencies?: ReadonlyArray<SchedulerDependency>;
|
|
37
|
-
/**
|
|
38
|
-
* Per-row field holding this row's dependency links (as `SchedulerDependency[]`
|
|
39
|
-
* or a `to`-key list). An alternative to the flat `dependencies` list.
|
|
40
|
-
*/
|
|
41
|
-
dependencyField?: keyof TData & string;
|
|
42
|
-
/**
|
|
43
|
-
* Cascade successors forward on move / resize to keep every link legal.
|
|
44
|
-
* Defaults to `true` when any dependency is present.
|
|
45
|
-
*/
|
|
46
|
-
autoReschedule?: boolean;
|
|
47
|
-
/** When cascading, skip non-working intervals (business hours / shifts). */
|
|
48
|
-
dependencyRespectWorkingTime?: boolean;
|
|
49
|
-
/** Fired with the cascaded shifts after a move / resize (never mutates rows). */
|
|
50
|
-
onDependenciesChange?: (moves: Array<{ id: string; start: Date; end: Date }>) => void;
|
|
51
|
-
/** Fired when the user draws a new link (drag from one event edge onto another). */
|
|
52
|
-
onDependencyAdd?: (dep: SchedulerDependency) => void;
|
|
53
|
-
/** Fired when the user removes a link (arrow context menu). */
|
|
54
|
-
onDependencyRemove?: (id: string) => void;
|
|
55
|
-
|
|
56
|
-
// --- Grouped / tree resources (timeline) -----------------------------------
|
|
57
|
-
/**
|
|
58
|
-
* Group the timeline's resource rows into a collapsible tree. `resourceGroups`
|
|
59
|
-
* defines the group nodes (nest via `parentId`); `resourceGroupOf` maps each
|
|
60
|
-
* resource to its group id. Resources with no / unknown group trail ungrouped.
|
|
61
|
-
*/
|
|
62
|
-
resourceGroups?: ReadonlyArray<SchedulerResourceGroup>;
|
|
63
|
-
resourceGroupOf?: (resource: SchedulerResource) => string | undefined;
|
|
64
|
-
/** Allow collapsing group headers (default true when `resourceGroups` is set). */
|
|
65
|
-
collapsibleGroups?: boolean;
|
|
66
|
-
/** localStorage key to persist which groups are collapsed. */
|
|
67
|
-
groupPersistKey?: string;
|
|
68
|
-
|
|
69
|
-
// --- Eligibility / skill matching (a booking rule) --------------------------
|
|
70
|
-
/**
|
|
71
|
-
* Restrict which events may be placed on which resources (provider matching,
|
|
72
|
-
* room type, technician skills). Return `false` and a drag / resize / create
|
|
73
|
-
* onto that resource is rejected + a "Not eligible" flash. The most flexible
|
|
74
|
-
* form; takes precedence over the declarative `requiresField` shortcut.
|
|
75
|
-
*/
|
|
76
|
-
eligible?: (event: TData, resource: SchedulerResource) => boolean;
|
|
77
|
-
/**
|
|
78
|
-
* Declarative shortcut: a per-event field holding the required skill tag(s).
|
|
79
|
-
* An event is eligible for a resource only if the resource's skills (via
|
|
80
|
-
* `resourceSkillsOf`, or a `skills` array on the resource) include every tag.
|
|
81
|
-
*/
|
|
82
|
-
requiresField?: keyof TData & string;
|
|
83
|
-
/** Where a resource's skill tags come from (default: a `skills` array on it). */
|
|
84
|
-
resourceSkillsOf?: (resource: SchedulerResource) => ReadonlyArray<string> | undefined;
|
|
85
|
-
|
|
86
|
-
// --- Booking-rule depth (buffers / lead time / duration / travel) ----------
|
|
87
|
-
/** Required clear minutes before / after each booking on a resource (a flat
|
|
88
|
-
* number, or a function of the event). A move / create that breaks it is rejected. */
|
|
89
|
-
bufferBeforeMin?: number | ((event: TData) => number);
|
|
90
|
-
bufferAfterMin?: number | ((event: TData) => number);
|
|
91
|
-
/** Minimum notice: a booking must start at least this many minutes after "now". */
|
|
92
|
-
minLeadMin?: number;
|
|
93
|
-
/** Min / max booking duration in minutes. */
|
|
94
|
-
minDurationMin?: number;
|
|
95
|
-
maxDurationMin?: number;
|
|
96
|
-
/** Travel time (minutes) required between two consecutive bookings on the same
|
|
97
|
-
* resource - widens the buffer by the trip between their locations. */
|
|
98
|
-
travelTimeOf?: (from: TData, to: TData) => number;
|
|
99
|
-
|
|
100
|
-
// --- Bookable slots / find-a-time (Calendly-style) --------------------------
|
|
101
|
-
/**
|
|
102
|
-
* Show the open, bookable slots of a fixed duration per resource in the Day
|
|
103
|
-
* timeline - the free time left after existing bookings, buffers and lead time.
|
|
104
|
-
* Clicking a slot books it (via `onSlotPick`, else `onEventAdd`).
|
|
105
|
-
*/
|
|
106
|
-
bookable?: { durationMin: number; stepMin?: number };
|
|
107
|
-
/** Fired when a bookable slot is clicked. Falls back to `onEventAdd`. */
|
|
108
|
-
onSlotPick?: (start: Date, end: Date, resourceId?: string) => void;
|
|
109
|
-
|
|
110
|
-
// --- Multi-calendar overlay -------------------------------------------------
|
|
111
|
-
/**
|
|
112
|
-
* Overlay several calendars, each colour-coded and toggleable from a legend.
|
|
113
|
-
* Events map to a calendar via `calendarField`; a calendar's colour becomes the
|
|
114
|
-
* event's default (unless `colorField` overrides), and hiding a calendar filters
|
|
115
|
-
* its events out of every view.
|
|
116
|
-
*/
|
|
117
|
-
calendars?: ReadonlyArray<{ id: string; title: string; color?: string; hidden?: boolean }>;
|
|
118
|
-
calendarField?: keyof TData & string;
|
|
119
|
-
|
|
120
|
-
// --- Free/busy availability (for find-a-time) -------------------------------
|
|
121
|
-
/**
|
|
122
|
-
* External busy intervals to shade on a resource's timeline row - times it is
|
|
123
|
-
* unavailable that aren't events in this scheduler (its own calendar). Combine
|
|
124
|
-
* with the exported `commonFree` helper to find a meeting time across attendees.
|
|
125
|
-
*/
|
|
126
|
-
freeBusyOf?: (resource: SchedulerResource) => ReadonlyArray<{ start: Date; end: Date }>;
|
|
127
|
-
|
|
128
|
-
// --- Wave B: multi-assignment + summaries ----------------------------------
|
|
129
|
-
/**
|
|
130
|
-
* Many-to-many event <-> resource assignments. When set, one event can appear
|
|
131
|
-
* under several resources; drives the timeline / resource-column bucketing
|
|
132
|
-
* instead of the single `resourceField`.
|
|
133
|
-
*/
|
|
134
|
-
assignments?: ReadonlyArray<SchedulerAssignment>;
|
|
135
|
-
/** Per-row field holding an array of resource ids (alt to the flat `assignments`). */
|
|
136
|
-
assignmentField?: keyof TData & string;
|
|
137
|
-
/**
|
|
138
|
-
* Show a per-resource utilization histogram band (timeline views). `true` uses
|
|
139
|
-
* defaults; the object form sets a capacity field + band height (px).
|
|
140
|
-
*/
|
|
141
|
-
resourceHistogram?: boolean | { capacityField?: keyof SchedulerResource & string; height?: number };
|
|
142
|
-
/**
|
|
143
|
-
* Tint each resource row's BACKGROUND by load per time-bucket (a utilization
|
|
144
|
-
* heatmap) - distinct from the histogram bar strip. `true` uses defaults; the
|
|
145
|
-
* object form sets the capacity field (over that = a hot / red cell).
|
|
146
|
-
*/
|
|
147
|
-
utilizationHeatmap?: boolean | { capacityField?: keyof SchedulerResource & string };
|
|
148
|
-
/**
|
|
149
|
-
* A per-time-column summary strip (counts / sums / a custom reducer) aligned to
|
|
150
|
-
* the axis. `false` (default) hides it.
|
|
151
|
-
*/
|
|
152
|
-
columnSummary?: false | {
|
|
153
|
-
reducer: ColumnReducer<TData>;
|
|
154
|
-
label?: string;
|
|
155
|
-
position?: 'top' | 'bottom';
|
|
156
|
-
};
|
|
157
|
-
/** Fired when an event is dragged from one resource column to another (reassign). */
|
|
158
|
-
onAssignmentChange?: (change: { eventId: string; from?: string; to?: string }) => void;
|
|
159
|
-
|
|
160
|
-
// --- Wave C: axis collapse + zoom ------------------------------------------
|
|
161
|
-
/** Compress non-working hours out of the time axis (nights collapse to a gap). */
|
|
162
|
-
collapseNonWorking?: boolean;
|
|
163
|
-
/** Compress `nonWorkingDays` (e.g. weekends) out of the timeline axis. */
|
|
164
|
-
collapseWeekends?: boolean;
|
|
165
|
-
/** Width (px) of a collapsed-gap marker. Default 12; `0` omits it entirely. */
|
|
166
|
-
collapsedGapPx?: number;
|
|
167
|
-
/**
|
|
168
|
-
* Minimum width (px) of one timeline minor tick (a day in Week / Month). Widens
|
|
169
|
-
* the timeline - and scrolls it horizontally - so narrow, sub-day events (e.g.
|
|
170
|
-
* hour-scale shifts) have room for their label. Overrides the per-view default.
|
|
171
|
-
*/
|
|
172
|
-
timelineTickMinWidth?: number;
|
|
173
|
-
/** Continuous zoom preset - supersedes `slotSizes` when set (minute .. year). */
|
|
174
|
-
zoom?: number | ZoomLevel;
|
|
175
|
-
/** Custom zoom-preset ladder (replaces the built-in one). */
|
|
176
|
-
zoomLevels?: ReadonlyArray<ZoomLevel>;
|
|
177
|
-
/** Fired when the zoom level changes (slider / wheel). */
|
|
178
|
-
onZoomChange?: (level: ZoomLevel) => void;
|
|
179
|
-
}
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest'
|
|
2
|
-
import {
|
|
3
|
-
buildDependencyGraph,
|
|
4
|
-
cascade,
|
|
5
|
-
hasCycle,
|
|
6
|
-
requiredStart,
|
|
7
|
-
topoOrder,
|
|
8
|
-
violations,
|
|
9
|
-
type EventTimes,
|
|
10
|
-
type SchedulerDependency,
|
|
11
|
-
} from './scheduler-dependencies'
|
|
12
|
-
|
|
13
|
-
// A fixed base day so the tests are deterministic (no Date.now()).
|
|
14
|
-
const D = (h: number, m = 0) => new Date(2026, 0, 5, h, m, 0, 0)
|
|
15
|
-
const ev = (startH: number, endH: number): EventTimes => ({ start: D(startH), end: D(endH) })
|
|
16
|
-
const times = (m: Record<string, EventTimes>) => new Map(Object.entries(m))
|
|
17
|
-
|
|
18
|
-
describe('requiredStart', () => {
|
|
19
|
-
const pred = ev(9, 11) // 09:00 - 11:00
|
|
20
|
-
const durMs = 60 * 60_000 // 1h successor
|
|
21
|
-
|
|
22
|
-
it('FS: successor starts at predecessor end', () => {
|
|
23
|
-
expect(requiredStart(pred, { id: 'd', from: 'a', to: 'b', type: 'FS' }, durMs)).toEqual(D(11))
|
|
24
|
-
})
|
|
25
|
-
it('FS honours lag (minutes)', () => {
|
|
26
|
-
expect(requiredStart(pred, { id: 'd', from: 'a', to: 'b', type: 'FS', lag: 30 }, durMs)).toEqual(D(11, 30))
|
|
27
|
-
})
|
|
28
|
-
it('FS honours negative lag (lead)', () => {
|
|
29
|
-
expect(requiredStart(pred, { id: 'd', from: 'a', to: 'b', type: 'FS', lag: -60 }, durMs)).toEqual(D(10))
|
|
30
|
-
})
|
|
31
|
-
it('SS: successor starts with predecessor start', () => {
|
|
32
|
-
expect(requiredStart(pred, { id: 'd', from: 'a', to: 'b', type: 'SS' }, durMs)).toEqual(D(9))
|
|
33
|
-
})
|
|
34
|
-
it('FF: successor ENDS at predecessor end (start = end - duration)', () => {
|
|
35
|
-
expect(requiredStart(pred, { id: 'd', from: 'a', to: 'b', type: 'FF' }, durMs)).toEqual(D(10))
|
|
36
|
-
})
|
|
37
|
-
it('SF: successor ENDS at predecessor start', () => {
|
|
38
|
-
expect(requiredStart(pred, { id: 'd', from: 'a', to: 'b', type: 'SF' }, durMs)).toEqual(D(8))
|
|
39
|
-
})
|
|
40
|
-
it('defaults to FS when type omitted', () => {
|
|
41
|
-
expect(requiredStart(pred, { id: 'd', from: 'a', to: 'b' }, durMs)).toEqual(D(11))
|
|
42
|
-
})
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
describe('buildDependencyGraph', () => {
|
|
46
|
-
it('indexes successors, predecessors and nodes; drops malformed/self links', () => {
|
|
47
|
-
const deps: SchedulerDependency[] = [
|
|
48
|
-
{ id: '1', from: 'a', to: 'b' },
|
|
49
|
-
{ id: '2', from: 'b', to: 'c' },
|
|
50
|
-
{ id: '3', from: 'x', to: 'x' }, // self - dropped
|
|
51
|
-
{ id: '4', from: '', to: 'z' }, // malformed - dropped
|
|
52
|
-
]
|
|
53
|
-
const g = buildDependencyGraph(deps)
|
|
54
|
-
expect(g.deps).toHaveLength(2)
|
|
55
|
-
expect(g.succ.get('a')?.[0]?.to).toBe('b')
|
|
56
|
-
expect(g.pred.get('c')?.[0]?.from).toBe('b')
|
|
57
|
-
expect([...g.nodes].sort()).toEqual(['a', 'b', 'c'])
|
|
58
|
-
})
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
describe('topoOrder / hasCycle', () => {
|
|
62
|
-
it('orders predecessors before successors', () => {
|
|
63
|
-
const g = buildDependencyGraph([
|
|
64
|
-
{ id: '1', from: 'a', to: 'b' },
|
|
65
|
-
{ id: '2', from: 'b', to: 'c' },
|
|
66
|
-
])
|
|
67
|
-
const { order, cyclicIds } = topoOrder(g)
|
|
68
|
-
expect(cyclicIds.size).toBe(0)
|
|
69
|
-
expect(order.indexOf('a')).toBeLessThan(order.indexOf('b'))
|
|
70
|
-
expect(order.indexOf('b')).toBeLessThan(order.indexOf('c'))
|
|
71
|
-
})
|
|
72
|
-
it('flags cyclic links and reports hasCycle', () => {
|
|
73
|
-
const deps: SchedulerDependency[] = [
|
|
74
|
-
{ id: '1', from: 'a', to: 'b' },
|
|
75
|
-
{ id: '2', from: 'b', to: 'a' },
|
|
76
|
-
]
|
|
77
|
-
expect(hasCycle(deps)).toBe(true)
|
|
78
|
-
expect(topoOrder(buildDependencyGraph(deps)).cyclicIds.size).toBeGreaterThan(0)
|
|
79
|
-
})
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
describe('cascade', () => {
|
|
83
|
-
it('pushes an FS successor forward to the predecessor end', () => {
|
|
84
|
-
const t = times({ a: ev(9, 11), b: ev(9, 10) }) // b overlaps a - illegal
|
|
85
|
-
const out = cascade(t, [{ id: '1', from: 'a', to: 'b', type: 'FS' }])
|
|
86
|
-
expect(out.get('b')).toEqual({ start: D(11), end: D(12) }) // duration (1h) preserved
|
|
87
|
-
expect(out.has('a')).toBe(false) // predecessor untouched
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
it('never pulls a successor earlier when already legal', () => {
|
|
91
|
-
const t = times({ a: ev(9, 10), b: ev(14, 15) }) // b already after a
|
|
92
|
-
const out = cascade(t, [{ id: '1', from: 'a', to: 'b', type: 'FS' }])
|
|
93
|
-
expect(out.size).toBe(0)
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
it('cascades multi-hop chains in one pass', () => {
|
|
97
|
-
const t = times({ a: ev(9, 11), b: ev(9, 10), c: ev(9, 10) })
|
|
98
|
-
const out = cascade(t, [
|
|
99
|
-
{ id: '1', from: 'a', to: 'b', type: 'FS' },
|
|
100
|
-
{ id: '2', from: 'b', to: 'c', type: 'FS' },
|
|
101
|
-
])
|
|
102
|
-
expect(out.get('b')).toEqual({ start: D(11), end: D(12) })
|
|
103
|
-
expect(out.get('c')).toEqual({ start: D(12), end: D(13) })
|
|
104
|
-
})
|
|
105
|
-
|
|
106
|
-
it('diamond: a successor with two predecessors takes the later constraint', () => {
|
|
107
|
-
// a ends 11, b ends 13; both feed d. d must start at max(11,13) = 13.
|
|
108
|
-
const t = times({ a: ev(9, 11), b: ev(9, 13), d: ev(9, 10) })
|
|
109
|
-
const out = cascade(t, [
|
|
110
|
-
{ id: '1', from: 'a', to: 'd', type: 'FS' },
|
|
111
|
-
{ id: '2', from: 'b', to: 'd', type: 'FS' },
|
|
112
|
-
])
|
|
113
|
-
expect(out.get('d')).toEqual({ start: D(13), end: D(14) })
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
it('respects lag when cascading', () => {
|
|
117
|
-
const t = times({ a: ev(9, 11), b: ev(9, 10) })
|
|
118
|
-
const out = cascade(t, [{ id: '1', from: 'a', to: 'b', type: 'FS', lag: 15 }])
|
|
119
|
-
expect(out.get('b')).toEqual({ start: D(11, 15), end: D(12, 15) })
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
it('applies the snapForward hook (working-time skip)', () => {
|
|
123
|
-
// Snap any start at/after 12:00 forward to 13:00 (a lunch break).
|
|
124
|
-
const snapForward = (s: Date) => (s.getHours() === 12 ? new Date(2026, 0, 5, 13, 0) : s)
|
|
125
|
-
const t = times({ a: ev(10, 12), b: ev(9, 10) })
|
|
126
|
-
const out = cascade(t, [{ id: '1', from: 'a', to: 'b', type: 'FS' }], { snapForward })
|
|
127
|
-
expect(out.get('b')?.start).toEqual(new Date(2026, 0, 5, 13, 0))
|
|
128
|
-
expect(out.get('b')?.end).toEqual(new Date(2026, 0, 5, 14, 0)) // duration preserved past the break
|
|
129
|
-
})
|
|
130
|
-
|
|
131
|
-
it('ignores cyclic links without looping', () => {
|
|
132
|
-
const t = times({ a: ev(9, 11), b: ev(9, 10) })
|
|
133
|
-
const out = cascade(t, [
|
|
134
|
-
{ id: '1', from: 'a', to: 'b' },
|
|
135
|
-
{ id: '2', from: 'b', to: 'a' }, // cycle - both ignored
|
|
136
|
-
])
|
|
137
|
-
expect(out.size).toBe(0)
|
|
138
|
-
})
|
|
139
|
-
})
|
|
140
|
-
|
|
141
|
-
describe('violations', () => {
|
|
142
|
-
it('reports a link whose successor starts too early', () => {
|
|
143
|
-
const t = times({ a: ev(9, 11), b: ev(10, 11) }) // b starts before a ends
|
|
144
|
-
const bad = violations(t, [{ id: '1', from: 'a', to: 'b', type: 'FS' }])
|
|
145
|
-
expect(bad.map((d) => d.id)).toEqual(['1'])
|
|
146
|
-
})
|
|
147
|
-
it('reports nothing when the link is satisfied', () => {
|
|
148
|
-
const t = times({ a: ev(9, 11), b: ev(11, 12) })
|
|
149
|
-
expect(violations(t, [{ id: '1', from: 'a', to: 'b', type: 'FS' }])).toHaveLength(0)
|
|
150
|
-
})
|
|
151
|
-
it('treats exact touching (start == pred end) as legal', () => {
|
|
152
|
-
const t = times({ a: ev(9, 11), b: ev(11, 12) })
|
|
153
|
-
expect(violations(t, [{ id: '1', from: 'a', to: 'b', type: 'FS' }])).toHaveLength(0)
|
|
154
|
-
})
|
|
155
|
-
})
|
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* scheduler-dependencies - the pure, framework-free core behind the Scheduler Pro
|
|
3
|
-
* *event dependencies* feature (predecessor / successor links + auto-reschedule).
|
|
4
|
-
* No Svelte, no DOM: just graph + date math over the native `Date`, so every rule
|
|
5
|
-
* here is unit-tested directly (mirrors scheduler-model.ts in @svgrid/grid).
|
|
6
|
-
*
|
|
7
|
-
* A dependency links a predecessor event to a successor with one of the four
|
|
8
|
-
* classic types (FS / SS / FF / SF) and an optional `lag` (minutes; negative = a
|
|
9
|
-
* lead). When a predecessor moves or resizes, {@link cascade} pushes successors
|
|
10
|
-
* forward just enough to keep every link legal, preserving each event's duration.
|
|
11
|
-
* Cascading never pulls an event earlier - it only resolves violations forward,
|
|
12
|
-
* the standard auto-schedule behaviour.
|
|
13
|
-
*
|
|
14
|
-
* Deliberately avoids the arg-less `new Date()` / `Date.now()` - callers pass the
|
|
15
|
-
* current event times in; working-time skipping is injected as a `snapForward`
|
|
16
|
-
* hook so this file needs no knowledge of shifts / business hours.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
/** The four dependency kinds. `FS` (finish-to-start) is the default. */
|
|
20
|
-
export type DependencyType = 'FS' | 'SS' | 'FF' | 'SF'
|
|
21
|
-
|
|
22
|
-
/** A link from a predecessor event (`from`) to a successor (`to`). Keys are row
|
|
23
|
-
* keys (the scheduler's `getRowId`). `lag` is minutes; negative = a lead. */
|
|
24
|
-
export type SchedulerDependency = {
|
|
25
|
-
id: string
|
|
26
|
-
from: string
|
|
27
|
-
to: string
|
|
28
|
-
type?: DependencyType
|
|
29
|
-
lag?: number
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/** The resolved [start, end) of one event, keyed by row key in a time map. */
|
|
33
|
-
export type EventTimes = { start: Date; end: Date }
|
|
34
|
-
|
|
35
|
-
const MS_MIN = 60_000
|
|
36
|
-
/** Sub-second slack so exact-touching links (successor.start == pred.end) are legal. */
|
|
37
|
-
const EPS_MS = 1_000
|
|
38
|
-
|
|
39
|
-
/** Indexed view of a dependency set: successors by predecessor, predecessors by
|
|
40
|
-
* successor, and lookup by id. Built once, reused by cascade / violations. */
|
|
41
|
-
export type DependencyGraph = {
|
|
42
|
-
deps: SchedulerDependency[]
|
|
43
|
-
/** predecessor key -> outgoing links */
|
|
44
|
-
succ: Map<string, SchedulerDependency[]>
|
|
45
|
-
/** successor key -> incoming links */
|
|
46
|
-
pred: Map<string, SchedulerDependency[]>
|
|
47
|
-
byId: Map<string, SchedulerDependency>
|
|
48
|
-
/** every key that appears as a `from` or `to`. */
|
|
49
|
-
nodes: Set<string>
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/** Build the adjacency indexes for `deps`. */
|
|
53
|
-
export function buildDependencyGraph(
|
|
54
|
-
deps: ReadonlyArray<SchedulerDependency>,
|
|
55
|
-
): DependencyGraph {
|
|
56
|
-
const succ = new Map<string, SchedulerDependency[]>()
|
|
57
|
-
const pred = new Map<string, SchedulerDependency[]>()
|
|
58
|
-
const byId = new Map<string, SchedulerDependency>()
|
|
59
|
-
const nodes = new Set<string>()
|
|
60
|
-
const list: SchedulerDependency[] = []
|
|
61
|
-
for (const d of deps) {
|
|
62
|
-
if (!d || !d.from || !d.to || d.from === d.to) continue // ignore malformed / self links
|
|
63
|
-
list.push(d)
|
|
64
|
-
byId.set(d.id, d)
|
|
65
|
-
nodes.add(d.from)
|
|
66
|
-
nodes.add(d.to)
|
|
67
|
-
;(succ.get(d.from) ?? succ.set(d.from, []).get(d.from)!).push(d)
|
|
68
|
-
;(pred.get(d.to) ?? pred.set(d.to, []).get(d.to)!).push(d)
|
|
69
|
-
}
|
|
70
|
-
return { deps: list, succ, pred, byId, nodes }
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Kahn topological order of the graph's nodes. Returns `{ order, cyclicIds }`:
|
|
75
|
-
* `order` is a safe processing order for the acyclic part (predecessors before
|
|
76
|
-
* successors); `cyclicIds` are the ids of links that could not be ordered because
|
|
77
|
-
* they take part in a cycle (cascade ignores them so it can never loop).
|
|
78
|
-
*/
|
|
79
|
-
export function topoOrder(graph: DependencyGraph): { order: string[]; cyclicIds: Set<string> } {
|
|
80
|
-
const indeg = new Map<string, number>()
|
|
81
|
-
for (const n of graph.nodes) indeg.set(n, 0)
|
|
82
|
-
for (const d of graph.deps) indeg.set(d.to, (indeg.get(d.to) ?? 0) + 1)
|
|
83
|
-
|
|
84
|
-
const queue: string[] = []
|
|
85
|
-
for (const [n, deg] of indeg) if (deg === 0) queue.push(n)
|
|
86
|
-
// Stable: process in insertion order for deterministic output.
|
|
87
|
-
const order: string[] = []
|
|
88
|
-
const settled = new Set<string>()
|
|
89
|
-
while (queue.length) {
|
|
90
|
-
const n = queue.shift()!
|
|
91
|
-
order.push(n)
|
|
92
|
-
settled.add(n)
|
|
93
|
-
for (const d of graph.succ.get(n) ?? []) {
|
|
94
|
-
const deg = (indeg.get(d.to) ?? 0) - 1
|
|
95
|
-
indeg.set(d.to, deg)
|
|
96
|
-
if (deg === 0) queue.push(d.to)
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
// Any node not settled sits inside (or downstream of) a cycle; links whose
|
|
100
|
-
// successor never settled are the cyclic ones.
|
|
101
|
-
const cyclicIds = new Set<string>()
|
|
102
|
-
for (const d of graph.deps) if (!settled.has(d.to)) cyclicIds.add(d.id)
|
|
103
|
-
return { order, cyclicIds }
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/** True when `deps` contain a cycle. */
|
|
107
|
-
export function hasCycle(deps: ReadonlyArray<SchedulerDependency>): boolean {
|
|
108
|
-
return topoOrder(buildDependencyGraph(deps)).cyclicIds.size > 0
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* The earliest legal start for the successor of `dep`, given the predecessor's
|
|
113
|
-
* resolved times and the successor's own `durationMs` (kept constant). Encodes the
|
|
114
|
-
* FS / SS / FF / SF semantics plus `lag` (minutes).
|
|
115
|
-
*/
|
|
116
|
-
export function requiredStart(
|
|
117
|
-
predTimes: EventTimes,
|
|
118
|
-
dep: SchedulerDependency,
|
|
119
|
-
successorDurationMs: number,
|
|
120
|
-
): Date {
|
|
121
|
-
const lagMs = (dep.lag ?? 0) * MS_MIN
|
|
122
|
-
const type = dep.type ?? 'FS'
|
|
123
|
-
let t: number
|
|
124
|
-
switch (type) {
|
|
125
|
-
case 'FS':
|
|
126
|
-
t = predTimes.end.getTime() + lagMs
|
|
127
|
-
break
|
|
128
|
-
case 'SS':
|
|
129
|
-
t = predTimes.start.getTime() + lagMs
|
|
130
|
-
break
|
|
131
|
-
case 'FF':
|
|
132
|
-
t = predTimes.end.getTime() + lagMs - successorDurationMs
|
|
133
|
-
break
|
|
134
|
-
case 'SF':
|
|
135
|
-
t = predTimes.start.getTime() + lagMs - successorDurationMs
|
|
136
|
-
break
|
|
137
|
-
}
|
|
138
|
-
return new Date(t)
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/** Options for {@link cascade}. */
|
|
142
|
-
export type CascadeOptions = {
|
|
143
|
-
/**
|
|
144
|
-
* Optional working-time snap: given a proposed start, return the next start that
|
|
145
|
-
* begins inside working time (the renderer supplies this from the scheduler's
|
|
146
|
-
* shifts / business hours; omit for calendar-time scheduling).
|
|
147
|
-
*/
|
|
148
|
-
snapForward?: (start: Date) => Date
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Forward-cascade successors so every dependency is satisfied. `times` maps row
|
|
153
|
-
* key -> current [start,end] (the just-moved predecessor already carries its NEW
|
|
154
|
-
* time). Processing runs in topological order, so multi-hop chains and diamonds
|
|
155
|
-
* (two paths into one successor) resolve to the latest required start in a single
|
|
156
|
-
* pass. Each shifted event keeps its duration. Returns ONLY the events whose times
|
|
157
|
-
* changed (never the untouched ones, never the moved predecessor itself unless a
|
|
158
|
-
* link also forces it). Cyclic links are ignored.
|
|
159
|
-
*/
|
|
160
|
-
export function cascade(
|
|
161
|
-
times: ReadonlyMap<string, EventTimes>,
|
|
162
|
-
deps: ReadonlyArray<SchedulerDependency>,
|
|
163
|
-
opts: CascadeOptions = {},
|
|
164
|
-
): Map<string, EventTimes> {
|
|
165
|
-
const graph = buildDependencyGraph(deps)
|
|
166
|
-
const { order, cyclicIds } = topoOrder(graph)
|
|
167
|
-
// Working copy we mutate as we walk downstream.
|
|
168
|
-
const cur = new Map<string, EventTimes>()
|
|
169
|
-
for (const [k, v] of times) cur.set(k, { start: v.start, end: v.end })
|
|
170
|
-
|
|
171
|
-
const changed = new Map<string, EventTimes>()
|
|
172
|
-
for (const key of order) {
|
|
173
|
-
const links = graph.pred.get(key)
|
|
174
|
-
if (!links || !links.length) continue
|
|
175
|
-
const self = cur.get(key)
|
|
176
|
-
if (!self) continue
|
|
177
|
-
const durationMs = self.end.getTime() - self.start.getTime()
|
|
178
|
-
|
|
179
|
-
let minStartMs = self.start.getTime()
|
|
180
|
-
for (const dep of links) {
|
|
181
|
-
if (cyclicIds.has(dep.id)) continue
|
|
182
|
-
const pred = cur.get(dep.from)
|
|
183
|
-
if (!pred) continue
|
|
184
|
-
const req = requiredStart(pred, dep, durationMs).getTime()
|
|
185
|
-
if (req > minStartMs) minStartMs = req
|
|
186
|
-
}
|
|
187
|
-
if (minStartMs <= self.start.getTime()) continue // already legal - never pull earlier
|
|
188
|
-
|
|
189
|
-
let newStart = new Date(minStartMs)
|
|
190
|
-
if (opts.snapForward) newStart = opts.snapForward(newStart)
|
|
191
|
-
const newEnd = new Date(newStart.getTime() + durationMs)
|
|
192
|
-
const next = { start: newStart, end: newEnd }
|
|
193
|
-
cur.set(key, next)
|
|
194
|
-
changed.set(key, next)
|
|
195
|
-
}
|
|
196
|
-
return changed
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* The dependencies currently unsatisfied by `times` (successor starts too early
|
|
201
|
-
* for the link). Used to paint violation-state arrows. Cyclic links are skipped.
|
|
202
|
-
*/
|
|
203
|
-
export function violations(
|
|
204
|
-
times: ReadonlyMap<string, EventTimes>,
|
|
205
|
-
deps: ReadonlyArray<SchedulerDependency>,
|
|
206
|
-
): SchedulerDependency[] {
|
|
207
|
-
const graph = buildDependencyGraph(deps)
|
|
208
|
-
const { cyclicIds } = topoOrder(graph)
|
|
209
|
-
const out: SchedulerDependency[] = []
|
|
210
|
-
for (const dep of graph.deps) {
|
|
211
|
-
if (cyclicIds.has(dep.id)) continue
|
|
212
|
-
const pred = times.get(dep.from)
|
|
213
|
-
const succ = times.get(dep.to)
|
|
214
|
-
if (!pred || !succ) continue
|
|
215
|
-
const durationMs = succ.end.getTime() - succ.start.getTime()
|
|
216
|
-
const req = requiredStart(pred, dep, durationMs).getTime()
|
|
217
|
-
// A link on end (FF / SF) constrains the successor's end; compare that edge.
|
|
218
|
-
const type = dep.type ?? 'FS'
|
|
219
|
-
const actual = type === 'FF' || type === 'SF' ? succ.end.getTime() - durationMs : succ.start.getTime()
|
|
220
|
-
if (actual + EPS_MS < req) out.push(dep)
|
|
221
|
-
}
|
|
222
|
-
return out
|
|
223
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest'
|
|
2
|
-
import { commonFree, mergeBusy } from './scheduler-freebusy'
|
|
3
|
-
import type { Interval } from './scheduler-slots'
|
|
4
|
-
|
|
5
|
-
const D = (h: number, m = 0) => new Date(2026, 0, 5, h, m, 0, 0)
|
|
6
|
-
const iv = (sh: number, sm: number, eh: number, em: number): Interval => ({ start: D(sh, sm), end: D(eh, em) })
|
|
7
|
-
const hhmm = (d: Date) => `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`
|
|
8
|
-
const show = (list: Interval[]) => list.map((s) => `${hhmm(s.start)}-${hhmm(s.end)}`)
|
|
9
|
-
|
|
10
|
-
describe('mergeBusy', () => {
|
|
11
|
-
it('unions overlapping busy blocks', () => {
|
|
12
|
-
expect(show(mergeBusy([iv(9, 0, 10, 0), iv(9, 30, 11, 0)]))).toEqual(['09:00-11:00'])
|
|
13
|
-
})
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
describe('commonFree', () => {
|
|
17
|
-
const day = [D(9, 0), D(17, 0)] as const
|
|
18
|
-
|
|
19
|
-
it('finds windows when everyone is free', () => {
|
|
20
|
-
// A busy 9-10 and 14-15; B busy 11-12. Common free: 10-11, 12-14, 15-17.
|
|
21
|
-
const busy = [[iv(9, 0, 10, 0), iv(14, 0, 15, 0)], [iv(11, 0, 12, 0)]]
|
|
22
|
-
expect(show(commonFree(busy, day[0], day[1], 30))).toEqual(['10:00-11:00', '12:00-14:00', '15:00-17:00'])
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
it('drops windows too short for the meeting', () => {
|
|
26
|
-
// Leaves only 10:00-10:30 free between busy blocks -> a 60-min meeting has none.
|
|
27
|
-
const busy = [[iv(9, 0, 10, 0)], [iv(10, 30, 17, 0)]]
|
|
28
|
-
expect(commonFree(busy, day[0], day[1], 60)).toEqual([])
|
|
29
|
-
expect(show(commonFree(busy, day[0], day[1], 30))).toEqual(['10:00-10:30'])
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
it('treats an attendee with no busy list as fully free', () => {
|
|
33
|
-
const busy = [[iv(12, 0, 13, 0)], []]
|
|
34
|
-
expect(show(commonFree(busy, day[0], day[1], 60))).toEqual(['09:00-12:00', '13:00-17:00'])
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
it('returns nothing when the union covers the whole day', () => {
|
|
38
|
-
const busy = [[iv(9, 0, 13, 0)], [iv(13, 0, 17, 0)]]
|
|
39
|
-
expect(commonFree(busy, day[0], day[1], 15)).toEqual([])
|
|
40
|
-
})
|
|
41
|
-
})
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest'
|
|
2
|
-
import { heatCells, heatPeak } from './scheduler-heatmap'
|
|
3
|
-
|
|
4
|
-
const ticks = [
|
|
5
|
-
{ leftPct: 0, widthPct: 25 },
|
|
6
|
-
{ leftPct: 25, widthPct: 25 },
|
|
7
|
-
{ leftPct: 50, widthPct: 25 },
|
|
8
|
-
{ leftPct: 75, widthPct: 25 },
|
|
9
|
-
]
|
|
10
|
-
|
|
11
|
-
describe('heatCells', () => {
|
|
12
|
-
it('scales load to 0..1 intensity against the peak', () => {
|
|
13
|
-
const cells = heatCells(ticks, [0, 1, 2, 4], 4, 4)
|
|
14
|
-
expect(cells.map((c) => c.intensity)).toEqual([0, 0.25, 0.5, 1])
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
it('flags over-capacity cells', () => {
|
|
18
|
-
const cells = heatCells(ticks, [1, 2, 3, 5], 3, 5)
|
|
19
|
-
expect(cells.map((c) => c.over)).toEqual([false, false, false, true]) // 5 > capacity 3
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
it('clamps intensity to 1 when load exceeds the peak', () => {
|
|
23
|
-
const cells = heatCells(ticks, [8], 2, 4)
|
|
24
|
-
expect(cells[0]!.intensity).toBe(1)
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
it('carries the axis geometry through', () => {
|
|
28
|
-
const cells = heatCells(ticks, [1, 1, 1, 1], 1, 1)
|
|
29
|
-
expect(cells.map((c) => c.leftPct)).toEqual([0, 25, 50, 75])
|
|
30
|
-
expect(cells.every((c) => c.widthPct === 25)).toBe(true)
|
|
31
|
-
})
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
describe('heatPeak', () => {
|
|
35
|
-
it('returns the max load across rows (>= floor)', () => {
|
|
36
|
-
expect(heatPeak([[0, 1, 2], [3, 0], [1]])).toBe(3)
|
|
37
|
-
expect(heatPeak([[0, 0]], 1)).toBe(1) // floor
|
|
38
|
-
})
|
|
39
|
-
})
|