@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
|
@@ -0,0 +1,179 @@
|
|
|
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
|
+
const MS_MIN = 60000;
|
|
19
|
+
/** Sub-second slack so exact-touching links (successor.start == pred.end) are legal. */
|
|
20
|
+
const EPS_MS = 1000;
|
|
21
|
+
/** Build the adjacency indexes for `deps`. */
|
|
22
|
+
export function buildDependencyGraph(deps) {
|
|
23
|
+
const succ = new Map();
|
|
24
|
+
const pred = new Map();
|
|
25
|
+
const byId = new Map();
|
|
26
|
+
const nodes = new Set();
|
|
27
|
+
const list = [];
|
|
28
|
+
for (const d of deps) {
|
|
29
|
+
if (!d || !d.from || !d.to || d.from === d.to)
|
|
30
|
+
continue; // ignore malformed / self links
|
|
31
|
+
list.push(d);
|
|
32
|
+
byId.set(d.id, d);
|
|
33
|
+
nodes.add(d.from);
|
|
34
|
+
nodes.add(d.to);
|
|
35
|
+
(succ.get(d.from) ?? succ.set(d.from, []).get(d.from)).push(d);
|
|
36
|
+
(pred.get(d.to) ?? pred.set(d.to, []).get(d.to)).push(d);
|
|
37
|
+
}
|
|
38
|
+
return { deps: list, succ, pred, byId, nodes };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Kahn topological order of the graph's nodes. Returns `{ order, cyclicIds }`:
|
|
42
|
+
* `order` is a safe processing order for the acyclic part (predecessors before
|
|
43
|
+
* successors); `cyclicIds` are the ids of links that could not be ordered because
|
|
44
|
+
* they take part in a cycle (cascade ignores them so it can never loop).
|
|
45
|
+
*/
|
|
46
|
+
export function topoOrder(graph) {
|
|
47
|
+
const indeg = new Map();
|
|
48
|
+
for (const n of graph.nodes)
|
|
49
|
+
indeg.set(n, 0);
|
|
50
|
+
for (const d of graph.deps)
|
|
51
|
+
indeg.set(d.to, (indeg.get(d.to) ?? 0) + 1);
|
|
52
|
+
const queue = [];
|
|
53
|
+
for (const [n, deg] of indeg)
|
|
54
|
+
if (deg === 0)
|
|
55
|
+
queue.push(n);
|
|
56
|
+
// Stable: process in insertion order for deterministic output.
|
|
57
|
+
const order = [];
|
|
58
|
+
const settled = new Set();
|
|
59
|
+
while (queue.length) {
|
|
60
|
+
const n = queue.shift();
|
|
61
|
+
order.push(n);
|
|
62
|
+
settled.add(n);
|
|
63
|
+
for (const d of graph.succ.get(n) ?? []) {
|
|
64
|
+
const deg = (indeg.get(d.to) ?? 0) - 1;
|
|
65
|
+
indeg.set(d.to, deg);
|
|
66
|
+
if (deg === 0)
|
|
67
|
+
queue.push(d.to);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Any node not settled sits inside (or downstream of) a cycle; links whose
|
|
71
|
+
// successor never settled are the cyclic ones.
|
|
72
|
+
const cyclicIds = new Set();
|
|
73
|
+
for (const d of graph.deps)
|
|
74
|
+
if (!settled.has(d.to))
|
|
75
|
+
cyclicIds.add(d.id);
|
|
76
|
+
return { order, cyclicIds };
|
|
77
|
+
}
|
|
78
|
+
/** True when `deps` contain a cycle. */
|
|
79
|
+
export function hasCycle(deps) {
|
|
80
|
+
return topoOrder(buildDependencyGraph(deps)).cyclicIds.size > 0;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The earliest legal start for the successor of `dep`, given the predecessor's
|
|
84
|
+
* resolved times and the successor's own `durationMs` (kept constant). Encodes the
|
|
85
|
+
* FS / SS / FF / SF semantics plus `lag` (minutes).
|
|
86
|
+
*/
|
|
87
|
+
export function requiredStart(predTimes, dep, successorDurationMs) {
|
|
88
|
+
const lagMs = (dep.lag ?? 0) * MS_MIN;
|
|
89
|
+
const type = dep.type ?? 'FS';
|
|
90
|
+
let t;
|
|
91
|
+
switch (type) {
|
|
92
|
+
case 'FS':
|
|
93
|
+
t = predTimes.end.getTime() + lagMs;
|
|
94
|
+
break;
|
|
95
|
+
case 'SS':
|
|
96
|
+
t = predTimes.start.getTime() + lagMs;
|
|
97
|
+
break;
|
|
98
|
+
case 'FF':
|
|
99
|
+
t = predTimes.end.getTime() + lagMs - successorDurationMs;
|
|
100
|
+
break;
|
|
101
|
+
case 'SF':
|
|
102
|
+
t = predTimes.start.getTime() + lagMs - successorDurationMs;
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
return new Date(t);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Forward-cascade successors so every dependency is satisfied. `times` maps row
|
|
109
|
+
* key -> current [start,end] (the just-moved predecessor already carries its NEW
|
|
110
|
+
* time). Processing runs in topological order, so multi-hop chains and diamonds
|
|
111
|
+
* (two paths into one successor) resolve to the latest required start in a single
|
|
112
|
+
* pass. Each shifted event keeps its duration. Returns ONLY the events whose times
|
|
113
|
+
* changed (never the untouched ones, never the moved predecessor itself unless a
|
|
114
|
+
* link also forces it). Cyclic links are ignored.
|
|
115
|
+
*/
|
|
116
|
+
export function cascade(times, deps, opts = {}) {
|
|
117
|
+
const graph = buildDependencyGraph(deps);
|
|
118
|
+
const { order, cyclicIds } = topoOrder(graph);
|
|
119
|
+
// Working copy we mutate as we walk downstream.
|
|
120
|
+
const cur = new Map();
|
|
121
|
+
for (const [k, v] of times)
|
|
122
|
+
cur.set(k, { start: v.start, end: v.end });
|
|
123
|
+
const changed = new Map();
|
|
124
|
+
for (const key of order) {
|
|
125
|
+
const links = graph.pred.get(key);
|
|
126
|
+
if (!links || !links.length)
|
|
127
|
+
continue;
|
|
128
|
+
const self = cur.get(key);
|
|
129
|
+
if (!self)
|
|
130
|
+
continue;
|
|
131
|
+
const durationMs = self.end.getTime() - self.start.getTime();
|
|
132
|
+
let minStartMs = self.start.getTime();
|
|
133
|
+
for (const dep of links) {
|
|
134
|
+
if (cyclicIds.has(dep.id))
|
|
135
|
+
continue;
|
|
136
|
+
const pred = cur.get(dep.from);
|
|
137
|
+
if (!pred)
|
|
138
|
+
continue;
|
|
139
|
+
const req = requiredStart(pred, dep, durationMs).getTime();
|
|
140
|
+
if (req > minStartMs)
|
|
141
|
+
minStartMs = req;
|
|
142
|
+
}
|
|
143
|
+
if (minStartMs <= self.start.getTime())
|
|
144
|
+
continue; // already legal - never pull earlier
|
|
145
|
+
let newStart = new Date(minStartMs);
|
|
146
|
+
if (opts.snapForward)
|
|
147
|
+
newStart = opts.snapForward(newStart);
|
|
148
|
+
const newEnd = new Date(newStart.getTime() + durationMs);
|
|
149
|
+
const next = { start: newStart, end: newEnd };
|
|
150
|
+
cur.set(key, next);
|
|
151
|
+
changed.set(key, next);
|
|
152
|
+
}
|
|
153
|
+
return changed;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* The dependencies currently unsatisfied by `times` (successor starts too early
|
|
157
|
+
* for the link). Used to paint violation-state arrows. Cyclic links are skipped.
|
|
158
|
+
*/
|
|
159
|
+
export function violations(times, deps) {
|
|
160
|
+
const graph = buildDependencyGraph(deps);
|
|
161
|
+
const { cyclicIds } = topoOrder(graph);
|
|
162
|
+
const out = [];
|
|
163
|
+
for (const dep of graph.deps) {
|
|
164
|
+
if (cyclicIds.has(dep.id))
|
|
165
|
+
continue;
|
|
166
|
+
const pred = times.get(dep.from);
|
|
167
|
+
const succ = times.get(dep.to);
|
|
168
|
+
if (!pred || !succ)
|
|
169
|
+
continue;
|
|
170
|
+
const durationMs = succ.end.getTime() - succ.start.getTime();
|
|
171
|
+
const req = requiredStart(pred, dep, durationMs).getTime();
|
|
172
|
+
// A link on end (FF / SF) constrains the successor's end; compare that edge.
|
|
173
|
+
const type = dep.type ?? 'FS';
|
|
174
|
+
const actual = type === 'FF' || type === 'SF' ? succ.end.getTime() - durationMs : succ.start.getTime();
|
|
175
|
+
if (actual + EPS_MS < req)
|
|
176
|
+
out.push(dep);
|
|
177
|
+
}
|
|
178
|
+
return out;
|
|
179
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scheduler-freebusy - the pure core behind Scheduler Pro's *free/busy* and
|
|
3
|
+
* *cross-attendee find-a-time*. No Svelte, no DOM. Merges each attendee's busy
|
|
4
|
+
* intervals and finds the windows when EVERYONE is free (long enough for a meeting).
|
|
5
|
+
* Deterministic - the caller supplies all dates. Reuses the interval algebra from
|
|
6
|
+
* scheduler-slots (`mergeIntervals` / `subtractIntervals`).
|
|
7
|
+
*/
|
|
8
|
+
import { type Interval } from './scheduler-slots';
|
|
9
|
+
export type { Interval };
|
|
10
|
+
/** Union of a set of busy intervals into a sorted, disjoint list (an alias of the
|
|
11
|
+
* slots merge, named for the free/busy domain). */
|
|
12
|
+
export declare function mergeBusy(intervals: ReadonlyArray<Interval>): Interval[];
|
|
13
|
+
/**
|
|
14
|
+
* The windows within `[dayStart, dayEnd]` when EVERY attendee is free, each at
|
|
15
|
+
* least `durationMin` long. `busyByPerson` is one busy list per attendee; a person
|
|
16
|
+
* with no entry is treated as fully free. The result is the complement of the union
|
|
17
|
+
* of all busy time, filtered to windows that can fit the meeting.
|
|
18
|
+
*/
|
|
19
|
+
export declare function commonFree(busyByPerson: ReadonlyArray<ReadonlyArray<Interval>>, dayStart: Date, dayEnd: Date, durationMin: number): Interval[];
|
|
@@ -5,32 +5,22 @@
|
|
|
5
5
|
* Deterministic - the caller supplies all dates. Reuses the interval algebra from
|
|
6
6
|
* scheduler-slots (`mergeIntervals` / `subtractIntervals`).
|
|
7
7
|
*/
|
|
8
|
-
import { mergeIntervals, subtractIntervals
|
|
9
|
-
|
|
10
|
-
export type { Interval }
|
|
11
|
-
|
|
12
|
-
const MS_MIN = 60_000
|
|
13
|
-
|
|
8
|
+
import { mergeIntervals, subtractIntervals } from './scheduler-slots';
|
|
9
|
+
const MS_MIN = 60000;
|
|
14
10
|
/** Union of a set of busy intervals into a sorted, disjoint list (an alias of the
|
|
15
11
|
* slots merge, named for the free/busy domain). */
|
|
16
|
-
export function mergeBusy(intervals
|
|
17
|
-
|
|
12
|
+
export function mergeBusy(intervals) {
|
|
13
|
+
return mergeIntervals(intervals);
|
|
18
14
|
}
|
|
19
|
-
|
|
20
15
|
/**
|
|
21
16
|
* The windows within `[dayStart, dayEnd]` when EVERY attendee is free, each at
|
|
22
17
|
* least `durationMin` long. `busyByPerson` is one busy list per attendee; a person
|
|
23
18
|
* with no entry is treated as fully free. The result is the complement of the union
|
|
24
19
|
* of all busy time, filtered to windows that can fit the meeting.
|
|
25
20
|
*/
|
|
26
|
-
export function commonFree(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
): Interval[] {
|
|
32
|
-
const allBusy = mergeIntervals(busyByPerson.flat())
|
|
33
|
-
const free = subtractIntervals({ start: dayStart, end: dayEnd }, allBusy)
|
|
34
|
-
const minMs = Math.max(0, durationMin) * MS_MIN
|
|
35
|
-
return free.filter((f) => f.end.getTime() - f.start.getTime() >= minMs)
|
|
21
|
+
export function commonFree(busyByPerson, dayStart, dayEnd, durationMin) {
|
|
22
|
+
const allBusy = mergeIntervals(busyByPerson.flat());
|
|
23
|
+
const free = subtractIntervals({ start: dayStart, end: dayEnd }, allBusy);
|
|
24
|
+
const minMs = Math.max(0, durationMin) * MS_MIN;
|
|
25
|
+
return free.filter((f) => f.end.getTime() - f.start.getTime() >= minMs);
|
|
36
26
|
}
|
|
@@ -8,17 +8,15 @@
|
|
|
8
8
|
* intensity (0..1) + an over-capacity flag per cell; it then paints the cell with
|
|
9
9
|
* a theme colour at that intensity.
|
|
10
10
|
*/
|
|
11
|
-
|
|
12
11
|
/** One background cell: its axis geometry + normalized load intensity. */
|
|
13
12
|
export type HeatCell = {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
|
|
13
|
+
leftPct: number;
|
|
14
|
+
widthPct: number;
|
|
15
|
+
/** 0..1, load scaled against `peak` (clamped). */
|
|
16
|
+
intensity: number;
|
|
17
|
+
/** True when the raw load exceeds capacity. */
|
|
18
|
+
over: boolean;
|
|
19
|
+
};
|
|
22
20
|
/**
|
|
23
21
|
* Build the per-tick heat cells for one resource row. `ticks` supply the axis
|
|
24
22
|
* geometry, `loads` the load in each tick (same length/order), `capacity` the
|
|
@@ -26,30 +24,9 @@ export type HeatCell = {
|
|
|
26
24
|
* (usually a global peak so rows are comparable). Zero-load ticks are still
|
|
27
25
|
* emitted (intensity 0) so the caller can decide whether to paint them.
|
|
28
26
|
*/
|
|
29
|
-
export function heatCells(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
peak: number,
|
|
34
|
-
): HeatCell[] {
|
|
35
|
-
const scale = Math.max(peak, capacity, 1)
|
|
36
|
-
const out: HeatCell[] = []
|
|
37
|
-
for (let i = 0; i < ticks.length; i++) {
|
|
38
|
-
const t = ticks[i]!
|
|
39
|
-
const load = loads[i] ?? 0
|
|
40
|
-
out.push({
|
|
41
|
-
leftPct: t.leftPct,
|
|
42
|
-
widthPct: t.widthPct,
|
|
43
|
-
intensity: Math.max(0, Math.min(1, load / scale)),
|
|
44
|
-
over: load > capacity + 1e-9,
|
|
45
|
-
})
|
|
46
|
-
}
|
|
47
|
-
return out
|
|
48
|
-
}
|
|
49
|
-
|
|
27
|
+
export declare function heatCells(ticks: ReadonlyArray<{
|
|
28
|
+
leftPct: number;
|
|
29
|
+
widthPct: number;
|
|
30
|
+
}>, loads: ReadonlyArray<number>, capacity: number, peak: number): HeatCell[];
|
|
50
31
|
/** The peak load across a set of per-resource load rows (for a shared scale). */
|
|
51
|
-
export function heatPeak(loadRows: ReadonlyArray<ReadonlyArray<number>>, floor
|
|
52
|
-
let peak = floor
|
|
53
|
-
for (const row of loadRows) for (const v of row) if (v > peak) peak = v
|
|
54
|
-
return peak
|
|
55
|
-
}
|
|
32
|
+
export declare function heatPeak(loadRows: ReadonlyArray<ReadonlyArray<number>>, floor?: number): number;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scheduler-heatmap - the pure core behind Scheduler Pro's *utilization heatmap*.
|
|
3
|
+
* No Svelte, no DOM. Distinct from the histogram (a bar strip): the heatmap tints
|
|
4
|
+
* a resource row's BACKGROUND per time-bucket by how loaded that resource is.
|
|
5
|
+
*
|
|
6
|
+
* The renderer computes each bucket's load (with `resourceLoad` / `overlapCount`
|
|
7
|
+
* from the assignment / model helpers) and passes it here to get a normalized
|
|
8
|
+
* intensity (0..1) + an over-capacity flag per cell; it then paints the cell with
|
|
9
|
+
* a theme colour at that intensity.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Build the per-tick heat cells for one resource row. `ticks` supply the axis
|
|
13
|
+
* geometry, `loads` the load in each tick (same length/order), `capacity` the
|
|
14
|
+
* resource's capacity (over that = `over`), and `peak` the normalization scale
|
|
15
|
+
* (usually a global peak so rows are comparable). Zero-load ticks are still
|
|
16
|
+
* emitted (intensity 0) so the caller can decide whether to paint them.
|
|
17
|
+
*/
|
|
18
|
+
export function heatCells(ticks, loads, capacity, peak) {
|
|
19
|
+
const scale = Math.max(peak, capacity, 1);
|
|
20
|
+
const out = [];
|
|
21
|
+
for (let i = 0; i < ticks.length; i++) {
|
|
22
|
+
const t = ticks[i];
|
|
23
|
+
const load = loads[i] ?? 0;
|
|
24
|
+
out.push({
|
|
25
|
+
leftPct: t.leftPct,
|
|
26
|
+
widthPct: t.widthPct,
|
|
27
|
+
intensity: Math.max(0, Math.min(1, load / scale)),
|
|
28
|
+
over: load > capacity + 1e-9,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
/** The peak load across a set of per-resource load rows (for a shared scale). */
|
|
34
|
+
export function heatPeak(loadRows, floor = 1) {
|
|
35
|
+
let peak = floor;
|
|
36
|
+
for (const row of loadRows)
|
|
37
|
+
for (const v of row)
|
|
38
|
+
if (v > peak)
|
|
39
|
+
peak = v;
|
|
40
|
+
return peak;
|
|
41
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scheduler-resource-tree - the pure core behind Scheduler Pro *grouped / tree
|
|
3
|
+
* resources*. No Svelte, no DOM. Resources are flat in the base grid; this builds
|
|
4
|
+
* a hierarchy of collapsible GROUP header rows (departments -> teams -> people)
|
|
5
|
+
* interleaved with the resource rows, so the timeline gutter can render a tree.
|
|
6
|
+
*
|
|
7
|
+
* Groups nest via `parentId`; each resource is mapped to a group by a `groupOf`
|
|
8
|
+
* accessor. Resources whose group is unknown / unset fall into a trailing
|
|
9
|
+
* "ungrouped" section (rendered without a header). Collapsing a group drops its
|
|
10
|
+
* whole subtree from the output (the header stays).
|
|
11
|
+
*/
|
|
12
|
+
/** A group node in the resource tree. `parentId` nests it under another group. */
|
|
13
|
+
export type SchedulerResourceGroup = {
|
|
14
|
+
id: string;
|
|
15
|
+
title: string;
|
|
16
|
+
parentId?: string;
|
|
17
|
+
color?: string;
|
|
18
|
+
};
|
|
19
|
+
/** One rendered row: a group header, or a leaf resource. */
|
|
20
|
+
export type ResourceRow<R = unknown> = {
|
|
21
|
+
kind: 'group' | 'resource';
|
|
22
|
+
id: string;
|
|
23
|
+
title: string;
|
|
24
|
+
/** Indent depth (0 = top level). */
|
|
25
|
+
depth: number;
|
|
26
|
+
color?: string;
|
|
27
|
+
/** Present for `kind: 'resource'`. */
|
|
28
|
+
resource?: R;
|
|
29
|
+
/** Present for `kind: 'group'`: whether it is collapsed. */
|
|
30
|
+
collapsed?: boolean;
|
|
31
|
+
/** Present for `kind: 'group'`: every leaf resource id in its subtree (for roll-ups). */
|
|
32
|
+
childResourceIds?: string[];
|
|
33
|
+
};
|
|
34
|
+
type MinResource = {
|
|
35
|
+
id: string;
|
|
36
|
+
title?: string;
|
|
37
|
+
color?: string;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Build the ordered tree rows. `groups` define the hierarchy; `groupOf(resource)`
|
|
41
|
+
* returns the group id a resource belongs to (or undefined = ungrouped). `collapsed`
|
|
42
|
+
* is the set of collapsed group ids. Order: for each group, its child groups
|
|
43
|
+
* (recursively) then its direct resources; ungrouped resources trail at the end.
|
|
44
|
+
*/
|
|
45
|
+
export declare function buildResourceRows<R extends MinResource>(resources: ReadonlyArray<R>, groups: ReadonlyArray<SchedulerResourceGroup>, groupOf: (r: R) => string | undefined, collapsed?: ReadonlySet<string>): ResourceRow<R>[];
|
|
46
|
+
/** The leaf resource ids actually visible (resource rows only) in tree order. */
|
|
47
|
+
export declare function visibleResourceIds<R extends MinResource>(rows: ReadonlyArray<ResourceRow<R>>): string[];
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scheduler-resource-tree - the pure core behind Scheduler Pro *grouped / tree
|
|
3
|
+
* resources*. No Svelte, no DOM. Resources are flat in the base grid; this builds
|
|
4
|
+
* a hierarchy of collapsible GROUP header rows (departments -> teams -> people)
|
|
5
|
+
* interleaved with the resource rows, so the timeline gutter can render a tree.
|
|
6
|
+
*
|
|
7
|
+
* Groups nest via `parentId`; each resource is mapped to a group by a `groupOf`
|
|
8
|
+
* accessor. Resources whose group is unknown / unset fall into a trailing
|
|
9
|
+
* "ungrouped" section (rendered without a header). Collapsing a group drops its
|
|
10
|
+
* whole subtree from the output (the header stays).
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Build the ordered tree rows. `groups` define the hierarchy; `groupOf(resource)`
|
|
14
|
+
* returns the group id a resource belongs to (or undefined = ungrouped). `collapsed`
|
|
15
|
+
* is the set of collapsed group ids. Order: for each group, its child groups
|
|
16
|
+
* (recursively) then its direct resources; ungrouped resources trail at the end.
|
|
17
|
+
*/
|
|
18
|
+
export function buildResourceRows(resources, groups, groupOf, collapsed = new Set()) {
|
|
19
|
+
const groupById = new Map();
|
|
20
|
+
for (const g of groups)
|
|
21
|
+
if (g && g.id)
|
|
22
|
+
groupById.set(g.id, g);
|
|
23
|
+
// parentId -> child groups (root groups keyed under '' ). A parentId that is not
|
|
24
|
+
// a known group is treated as a root.
|
|
25
|
+
const childGroups = new Map();
|
|
26
|
+
for (const g of groupById.values()) {
|
|
27
|
+
const p = g.parentId && groupById.has(g.parentId) ? g.parentId : '';
|
|
28
|
+
(childGroups.get(p) ?? childGroups.set(p, []).get(p)).push(g);
|
|
29
|
+
}
|
|
30
|
+
// group id -> resources ('' = ungrouped / unknown group).
|
|
31
|
+
const resByGroup = new Map();
|
|
32
|
+
for (const r of resources) {
|
|
33
|
+
const gid = groupOf(r);
|
|
34
|
+
const key = gid && groupById.has(gid) ? gid : '';
|
|
35
|
+
(resByGroup.get(key) ?? resByGroup.set(key, []).get(key)).push(r);
|
|
36
|
+
}
|
|
37
|
+
// Every leaf resource id under a group's subtree (recursive), for roll-ups.
|
|
38
|
+
const leafSeen = new Set();
|
|
39
|
+
const leafIds = (gid) => {
|
|
40
|
+
if (leafSeen.has(gid))
|
|
41
|
+
return []; // cycle guard
|
|
42
|
+
leafSeen.add(gid);
|
|
43
|
+
const ids = [];
|
|
44
|
+
for (const r of resByGroup.get(gid) ?? [])
|
|
45
|
+
ids.push(r.id);
|
|
46
|
+
for (const cg of childGroups.get(gid) ?? [])
|
|
47
|
+
ids.push(...leafIds(cg.id));
|
|
48
|
+
leafSeen.delete(gid);
|
|
49
|
+
return ids;
|
|
50
|
+
};
|
|
51
|
+
const out = [];
|
|
52
|
+
const walked = new Set();
|
|
53
|
+
const walk = (g, depth) => {
|
|
54
|
+
if (walked.has(g.id))
|
|
55
|
+
return; // cycle guard
|
|
56
|
+
walked.add(g.id);
|
|
57
|
+
const isCollapsed = collapsed.has(g.id);
|
|
58
|
+
out.push({ kind: 'group', id: g.id, title: g.title, depth, color: g.color, collapsed: isCollapsed, childResourceIds: leafIds(g.id) });
|
|
59
|
+
if (isCollapsed)
|
|
60
|
+
return;
|
|
61
|
+
for (const cg of childGroups.get(g.id) ?? [])
|
|
62
|
+
walk(cg, depth + 1);
|
|
63
|
+
for (const r of resByGroup.get(g.id) ?? []) {
|
|
64
|
+
out.push({ kind: 'resource', id: r.id, title: r.title ?? r.id, depth: depth + 1, color: r.color, resource: r });
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
for (const g of childGroups.get('') ?? [])
|
|
68
|
+
walk(g, 0);
|
|
69
|
+
// Ungrouped resources trail at the end (no header).
|
|
70
|
+
for (const r of resByGroup.get('') ?? []) {
|
|
71
|
+
out.push({ kind: 'resource', id: r.id, title: r.title ?? r.id, depth: 0, color: r.color, resource: r });
|
|
72
|
+
}
|
|
73
|
+
return out;
|
|
74
|
+
}
|
|
75
|
+
/** The leaf resource ids actually visible (resource rows only) in tree order. */
|
|
76
|
+
export function visibleResourceIds(rows) {
|
|
77
|
+
return rows.filter((r) => r.kind === 'resource').map((r) => r.id);
|
|
78
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scheduler-slots - the pure core behind Scheduler Pro's *bookable slots /
|
|
3
|
+
* find-a-time* (Calendly-style). No Svelte, no DOM. Given a resource's working
|
|
4
|
+
* windows and its busy intervals, it produces the open, bookable slots of a fixed
|
|
5
|
+
* duration - subtracting busy time (widened by buffers) and anything before a
|
|
6
|
+
* minimum start (now + lead). Deterministic: the caller supplies all dates.
|
|
7
|
+
*/
|
|
8
|
+
export type Interval = {
|
|
9
|
+
start: Date;
|
|
10
|
+
end: Date;
|
|
11
|
+
};
|
|
12
|
+
export type Slot = {
|
|
13
|
+
start: Date;
|
|
14
|
+
end: Date;
|
|
15
|
+
};
|
|
16
|
+
/** Merge overlapping / touching intervals into a sorted, disjoint list. */
|
|
17
|
+
export declare function mergeIntervals(intervals: ReadonlyArray<Interval>): Interval[];
|
|
18
|
+
/** The parts of `[base]` not covered by any of the (merged) `occupied` intervals. */
|
|
19
|
+
export declare function subtractIntervals(base: Interval, occupied: ReadonlyArray<Interval>): Interval[];
|
|
20
|
+
export type SlotOptions = {
|
|
21
|
+
working: ReadonlyArray<Interval>;
|
|
22
|
+
busy: ReadonlyArray<Interval>;
|
|
23
|
+
durationMin: number;
|
|
24
|
+
/** Slot start granularity (minutes). Default = `durationMin` (back-to-back slots). */
|
|
25
|
+
stepMin?: number;
|
|
26
|
+
/** Clear minutes required before / after a busy booking (widens what it blocks). */
|
|
27
|
+
bufferBeforeMin?: number;
|
|
28
|
+
bufferAfterMin?: number;
|
|
29
|
+
/** Earliest allowed slot start (e.g. now + lead time). Slots before it are dropped. */
|
|
30
|
+
minStart?: Date;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* The bookable slots. For each working window, subtract busy time (each busy
|
|
34
|
+
* interval widened by the buffers) and anything before `minStart`, then step
|
|
35
|
+
* through the remaining free space emitting `durationMin` slots every `stepMin`.
|
|
36
|
+
*/
|
|
37
|
+
export declare function availableSlots(opts: SlotOptions): Slot[];
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scheduler-slots - the pure core behind Scheduler Pro's *bookable slots /
|
|
3
|
+
* find-a-time* (Calendly-style). No Svelte, no DOM. Given a resource's working
|
|
4
|
+
* windows and its busy intervals, it produces the open, bookable slots of a fixed
|
|
5
|
+
* duration - subtracting busy time (widened by buffers) and anything before a
|
|
6
|
+
* minimum start (now + lead). Deterministic: the caller supplies all dates.
|
|
7
|
+
*/
|
|
8
|
+
const MS_MIN = 60000;
|
|
9
|
+
/** Merge overlapping / touching intervals into a sorted, disjoint list. */
|
|
10
|
+
export function mergeIntervals(intervals) {
|
|
11
|
+
const sorted = [...intervals]
|
|
12
|
+
.filter((i) => i.end.getTime() > i.start.getTime())
|
|
13
|
+
.sort((a, b) => a.start.getTime() - b.start.getTime());
|
|
14
|
+
const out = [];
|
|
15
|
+
for (const iv of sorted) {
|
|
16
|
+
const last = out[out.length - 1];
|
|
17
|
+
if (last && iv.start.getTime() <= last.end.getTime()) {
|
|
18
|
+
if (iv.end.getTime() > last.end.getTime())
|
|
19
|
+
last.end = iv.end;
|
|
20
|
+
}
|
|
21
|
+
else
|
|
22
|
+
out.push({ start: iv.start, end: iv.end });
|
|
23
|
+
}
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
/** The parts of `[base]` not covered by any of the (merged) `occupied` intervals. */
|
|
27
|
+
export function subtractIntervals(base, occupied) {
|
|
28
|
+
const occ = mergeIntervals(occupied);
|
|
29
|
+
const out = [];
|
|
30
|
+
let cursor = base.start.getTime();
|
|
31
|
+
const end = base.end.getTime();
|
|
32
|
+
for (const o of occ) {
|
|
33
|
+
const os = o.start.getTime();
|
|
34
|
+
const oe = o.end.getTime();
|
|
35
|
+
if (oe <= cursor || os >= end)
|
|
36
|
+
continue; // outside base
|
|
37
|
+
if (os > cursor)
|
|
38
|
+
out.push({ start: new Date(cursor), end: new Date(Math.min(os, end)) });
|
|
39
|
+
cursor = Math.max(cursor, oe);
|
|
40
|
+
if (cursor >= end)
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
if (cursor < end)
|
|
44
|
+
out.push({ start: new Date(cursor), end: new Date(end) });
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The bookable slots. For each working window, subtract busy time (each busy
|
|
49
|
+
* interval widened by the buffers) and anything before `minStart`, then step
|
|
50
|
+
* through the remaining free space emitting `durationMin` slots every `stepMin`.
|
|
51
|
+
*/
|
|
52
|
+
export function availableSlots(opts) {
|
|
53
|
+
const durMs = Math.max(1, opts.durationMin) * MS_MIN;
|
|
54
|
+
const stepMs = Math.max(1, opts.stepMin ?? opts.durationMin) * MS_MIN;
|
|
55
|
+
const bufB = (opts.bufferBeforeMin ?? 0) * MS_MIN;
|
|
56
|
+
const bufA = (opts.bufferAfterMin ?? 0) * MS_MIN;
|
|
57
|
+
const floor = opts.minStart ? opts.minStart.getTime() : -Infinity;
|
|
58
|
+
const occupied = opts.busy.map((b) => ({
|
|
59
|
+
start: new Date(b.start.getTime() - bufB),
|
|
60
|
+
end: new Date(b.end.getTime() + bufA),
|
|
61
|
+
}));
|
|
62
|
+
const out = [];
|
|
63
|
+
for (const w of mergeIntervals(opts.working)) {
|
|
64
|
+
// Clip the window to `minStart` before subtracting busy.
|
|
65
|
+
const wStart = Math.max(w.start.getTime(), floor);
|
|
66
|
+
if (wStart >= w.end.getTime())
|
|
67
|
+
continue;
|
|
68
|
+
const free = subtractIntervals({ start: new Date(wStart), end: w.end }, occupied);
|
|
69
|
+
for (const gap of free) {
|
|
70
|
+
let s = gap.start.getTime();
|
|
71
|
+
const gEnd = gap.end.getTime();
|
|
72
|
+
let guard = 0;
|
|
73
|
+
while (s + durMs <= gEnd && guard++ < 5000) {
|
|
74
|
+
out.push({ start: new Date(s), end: new Date(s + durMs) });
|
|
75
|
+
s += stepMs;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scheduler-summary - the pure core behind Scheduler Pro's *per-time-column
|
|
3
|
+
* summary* strip (counts / sums / a custom roll-up aligned to the timeline axis).
|
|
4
|
+
* No Svelte, no DOM. Each event is clipped to the column it falls in before the
|
|
5
|
+
* reducer runs, so duration-based reducers (busy minutes) are per-column.
|
|
6
|
+
*/
|
|
7
|
+
/** One event clipped to a column: its row plus the clipped [start, end). */
|
|
8
|
+
export type SummaryItem<TData> = {
|
|
9
|
+
row: TData;
|
|
10
|
+
start: Date;
|
|
11
|
+
end: Date;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* How a column's overlapping events roll up to one cell value:
|
|
15
|
+
* - `'count'` - number of events touching the column
|
|
16
|
+
* - `{ sum }` - sum of a numeric row field over those events
|
|
17
|
+
* - function - custom, receives the column-clipped items
|
|
18
|
+
*/
|
|
19
|
+
export type ColumnReducer<TData> = 'count' | {
|
|
20
|
+
sum: keyof TData & string;
|
|
21
|
+
} | ((items: SummaryItem<TData>[]) => string | number);
|
|
22
|
+
export type SummaryOptions<E, TData> = {
|
|
23
|
+
startOf: (e: E) => Date;
|
|
24
|
+
endOf: (e: E) => Date;
|
|
25
|
+
rowOf: (e: E) => TData;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* One summary value per column. For each column, collect the events overlapping
|
|
29
|
+
* it, clip each to the column bounds, then apply `reducer`. Empty columns yield
|
|
30
|
+
* `0` for `count` / `sum` and `reducer([])` for the function form.
|
|
31
|
+
*/
|
|
32
|
+
export declare function columnSummaries<E, TData>(events: ReadonlyArray<E>, columns: ReadonlyArray<{
|
|
33
|
+
start: Date;
|
|
34
|
+
end: Date;
|
|
35
|
+
}>, reducer: ColumnReducer<TData>, opts: SummaryOptions<E, TData>): Array<string | number>;
|
|
36
|
+
/** Built-in reducer: sum a numeric row field. */
|
|
37
|
+
export declare function sumReducer<TData>(field: keyof TData & string): ColumnReducer<TData>;
|
|
38
|
+
/** Built-in reducer: count events. */
|
|
39
|
+
export declare const countReducer: "count";
|
|
40
|
+
/** Built-in reducer: total column-clipped busy minutes across the column's events. */
|
|
41
|
+
export declare function busyMinutesReducer<TData>(): (items: SummaryItem<TData>[]) => number;
|