@svgrid/enterprise 2.7.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +95 -95
- package/dist/ExpressionEditorHarness.svelte.d.ts +2 -2
- package/dist/SvAdvancedFilter.svelte.d.ts +2 -2
- package/dist/SvAlertRuleEditor.svelte.d.ts +2 -2
- package/dist/SvAlertsManager.svelte.d.ts +3 -3
- package/dist/SvAlertsPanel.svelte.d.ts +1 -1
- package/dist/SvAuthGate.svelte +115 -115
- package/dist/SvAuthGate.svelte.d.ts +1 -1
- package/dist/SvBoard.svelte.d.ts +1 -1
- package/dist/SvExportMenu.svelte +553 -553
- package/dist/SvExportMenu.svelte.d.ts +2 -2
- package/dist/SvExpressionEditor.svelte.d.ts +2 -2
- package/dist/SvFileInput.svelte +113 -113
- package/dist/SvGridAlerts.svelte.d.ts +2 -2
- package/dist/SvGridBoard.svelte +2358 -2358
- package/dist/SvGridBulkEditDrawer.svelte.d.ts +1 -1
- package/dist/SvGridEditPanel.svelte +1157 -1157
- package/dist/SvGridEditPanel.svelte.d.ts +3 -3
- package/dist/SvGridMasterDetail.svelte +116 -116
- package/dist/SvGridMasterDetail.svelte.d.ts +1 -1
- package/dist/SvGridScheduler.svelte +5358 -5358
- package/dist/SvImportDialog.svelte +1020 -1020
- package/dist/SvImportDialog.svelte.d.ts +2 -2
- package/dist/SvLookupInput.svelte +180 -180
- package/dist/SvLookupInput.svelte.d.ts +1 -1
- package/dist/SvPivotDesigner.svelte +1990 -1990
- package/dist/SvPivotDesigner.svelte.d.ts +2 -2
- package/dist/SvRecordDetail.svelte.d.ts +1 -1
- package/dist/SvSchedule.svelte.d.ts +1 -1
- package/dist/SvSchemaChart.svelte +234 -234
- package/dist/SvSchemaChart.svelte.d.ts +2 -2
- package/dist/SvSchemaDashboard.svelte +130 -130
- package/dist/SvSchemaDashboard.svelte.d.ts +3 -3
- package/dist/advanced-filter/expr-columns-from-grid.d.ts +1 -1
- package/dist/advanced-filter-enable.js +3 -3
- package/dist/alerts/alert-engine-attach.d.ts +2 -2
- package/dist/alerts/alert-engine-attach.js +3 -3
- package/dist/alerts/alert-engine.d.ts +1 -1
- package/dist/alerts/alert-engine.js +2 -2
- package/dist/alerts/alert-formats.d.ts +1 -1
- package/dist/alerts/alert-formats.js +1 -1
- package/dist/alerts/alert-observer.d.ts +3 -3
- package/dist/alerts/alert-observer.js +1 -1
- package/dist/alerts/alert-storage.d.ts +1 -1
- package/dist/alerts/alert-store.svelte.d.ts +1 -1
- package/dist/alerts/alert-types.d.ts +2 -2
- package/dist/alerts.js +2 -2
- package/dist/board.js +2 -2
- package/dist/cdn/svgrid-enterprise.svelte-external.js +1162 -1145
- package/dist/designer/assets/GridMenus-B1JtIN21.js +8 -0
- package/dist/designer/assets/SvDateRangeInput-C0iCCZ8o.css +1 -0
- package/dist/designer/assets/{SvDateRangeInput-CVn-yqrQ.js → SvDateRangeInput-CjO7nn_x.js} +1 -1
- package/dist/designer/assets/SvDateTimePicker-ByBD_ov6.js +1 -0
- package/dist/designer/assets/SvDateTimePicker-DPv09DIT.css +1 -0
- package/dist/designer/assets/SvField-YDLipR6O.css +1 -0
- package/dist/designer/assets/{SvField-BsqiA5me.js → SvField-cj1PFNgZ.js} +1 -1
- package/dist/designer/assets/{preload-helper-CG0n22O7.js → SvGrid.helpers-BgT-gnCo.js} +1 -1
- package/dist/designer/assets/SvGridCellEditor-0W1L2hJ1.js +2 -0
- package/dist/designer/assets/SvGridChart-DBOR4xcz.js +2 -0
- package/dist/designer/assets/SvGridChart-fkMWeh1J.css +1 -0
- package/dist/designer/assets/SvGridChartPanel-symrhNnR.js +11 -0
- package/dist/designer/assets/SvGridChartView-BmRxq6mU.js +1 -0
- package/dist/designer/assets/SvGridChartView-DUc-1RUf.css +1 -0
- package/dist/designer/assets/SvGridDropdown-Bb3HH2Aj.js +1 -0
- package/dist/designer/assets/SvGridDropdown-CcidB3rm.css +1 -0
- package/dist/designer/assets/SvListBox-1oUF6Iav.js +110 -0
- package/dist/designer/assets/SvListBox-BXfyqy4a.css +1 -0
- package/dist/designer/assets/cell-formatting-wr5wm7US.js +1 -0
- package/dist/designer/assets/chart-DXFganU8.js +1 -0
- package/dist/designer/assets/date-format-DGagAqRc.css +1 -0
- package/dist/designer/assets/{date-format-4DJvNtG2.js → date-format-onlYDsrY.js} +1 -1
- package/dist/designer/assets/export-format-D-eP4b2l.js +6 -0
- package/dist/designer/assets/{index-BvaLmQSd.js → index-C_a9Cj8Y.js} +2984 -141
- package/dist/designer/assets/index-k2stW6L8.css +1 -0
- package/dist/designer/assets/preload-helper-HclGiUj8.js +1 -0
- package/dist/designer/assets/{row-drag-touch-IuJPEt0z.js → row-drag-touch-BdknxBNL.js} +1 -1
- package/dist/designer/assets/src-D9p27OGC.js +58 -0
- package/dist/designer/index.html +22 -22
- package/dist/export-conditional.d.ts +1 -1
- package/dist/export-print.js +19 -19
- package/dist/export-xls.d.ts +2 -2
- package/dist/export.d.ts +2 -2
- package/dist/export.js +7 -7
- package/dist/expressions/builder-tree.d.ts +2 -2
- package/dist/expressions/builder-tree.js +1 -1
- package/dist/expressions/compile.d.ts +1 -1
- package/dist/import.js +1 -1
- package/dist/index.d.ts +53 -53
- package/dist/index.js +50 -50
- package/dist/install.d.ts +4 -4
- package/dist/install.js +11 -11
- package/dist/license.d.ts +3 -2
- package/dist/license.js +9 -4
- package/dist/node/studio.js +124 -115
- package/dist/pivot-chart.d.ts +1 -1
- package/dist/pivot-designer.d.ts +1 -1
- package/dist/pivot-enable.js +3 -3
- package/dist/print.d.ts +1 -1
- package/dist/print.js +4 -4
- package/dist/scheduler-config.d.ts +5 -5
- package/dist/scheduler-freebusy.d.ts +1 -1
- package/dist/scheduler-freebusy.js +1 -1
- package/dist/scheduler.js +2 -2
- package/dist/schema-designer.d.ts +1 -1
- package/dist/schema-designer.js +2 -2
- package/dist/selection-bar.js +2 -2
- package/dist/sources/aggregate.d.ts +1 -1
- package/dist/sources/auth-supabase.js +1 -1
- package/dist/sources/dashboard.d.ts +2 -2
- package/dist/sources/dashboard.js +1 -1
- package/dist/sources/index.d.ts +13 -13
- package/dist/sources/index.js +13 -13
- package/dist/sources/realtime-supabase.js +1 -1
- package/dist/sources/relation-lookup.d.ts +1 -1
- package/dist/sources/relation-lookup.js +1 -1
- package/dist/sources/rest-adapters.d.ts +1 -1
- package/dist/sources/rest-adapters.js +1 -1
- package/dist/sources/rest.d.ts +2 -2
- package/dist/sources/rest.js +3 -3
- package/dist/sources/supabase.d.ts +2 -2
- package/dist/sources/supabase.js +3 -3
- package/dist/sources/with-entity-rules.d.ts +1 -1
- package/dist/sources/with-entity-rules.js +1 -1
- package/dist/sources/with-relation-labels.d.ts +1 -1
- package/dist/studio/emit-project.js +2161 -2127
- package/dist/studio/emit-schema.js +369 -369
- package/dist/studio/index.d.ts +1 -1
- package/dist/studio/index.js +1 -1
- package/dist/studio/introspect-db.js +45 -45
- package/dist/studio/project.d.ts +10 -0
- package/dist/studio/samples/crm.js +6 -6
- package/dist/studio/samples/fleet.js +7 -7
- package/dist/studio/samples/insurance.js +9 -9
- package/dist/studio/samples/inventory.js +12 -12
- package/dist/studio/samples/projects.js +5 -5
- package/dist/studio/samples/support.js +8 -8
- package/dist/studio/scaffold-app.js +104 -104
- package/dist/studio/scaffold.js +151 -151
- package/dist/studio/ui-components.d.ts +7 -0
- package/dist/studio/ui-components.js +35 -0
- package/dist/sveltekit/in-memory.d.ts +3 -3
- package/dist/sveltekit/in-memory.js +4 -4
- package/dist/sveltekit/index.d.ts +6 -6
- package/dist/sveltekit/index.js +5 -5
- package/dist/sveltekit/query-plan.d.ts +1 -1
- package/dist/sveltekit/sql-source.d.ts +4 -4
- package/dist/sveltekit/sql-source.js +4 -4
- package/dist/sveltekit/sql.d.ts +1 -1
- package/dist/sveltekit/transport.d.ts +2 -2
- package/dist/sveltekit/transport.js +1 -1
- package/dist/upgrade-prompt.js +25 -25
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +6 -3
- package/dist/designer/assets/GridMenus-Cgilexpk.js +0 -8
- package/dist/designer/assets/SvDateRangeInput-BV5OXYQ2.css +0 -1
- package/dist/designer/assets/SvDateTimePicker-BdioTrJQ.js +0 -1
- package/dist/designer/assets/SvDateTimePicker-CY8TK4BT.css +0 -1
- package/dist/designer/assets/SvField-BF-9TJSd.css +0 -1
- package/dist/designer/assets/SvGridCellEditor-dLY7_kk9.js +0 -2
- package/dist/designer/assets/SvGridChart-BEDNTdc5.js +0 -2
- package/dist/designer/assets/SvGridChart-Vu4Nvjiv.css +0 -1
- package/dist/designer/assets/SvGridChartPanel-x3lzSxuf.js +0 -10
- package/dist/designer/assets/SvGridChartView-CAKhPELi.js +0 -1
- package/dist/designer/assets/SvGridChartView-DX9HfkBR.css +0 -1
- package/dist/designer/assets/SvGridDropdown-CAYG7Y-O.js +0 -1
- package/dist/designer/assets/SvGridDropdown-Crwb2P3Q.css +0 -1
- package/dist/designer/assets/SvListBox-CVYQcLX9.js +0 -1
- package/dist/designer/assets/SvListBox-DgN8kvjt.css +0 -1
- package/dist/designer/assets/chart-DHEgt4lN.js +0 -1
- package/dist/designer/assets/date-format-Dzy4mTGh.css +0 -1
- package/dist/designer/assets/export-format-DwjuTfrQ.js +0 -6
- package/dist/designer/assets/index-Cp7fDJ3b.css +0 -1
- package/dist/designer/assets/js-scroller.svelte-Bhxqb3-c.js +0 -110
- package/dist/designer/assets/src-7qOYsBug.js +0 -2896
- package/dist/designer/assets/src-B7DNcoQK.css +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -178
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js +0 -3875
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js +0 -21
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js +0 -1938
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js +0 -205
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js +0 -18
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js +0 -264
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js +0 -697
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -3
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -134
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -55
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -2
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -46843
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -237
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -2
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -4
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -7
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -4
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -5
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -5
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -5
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -6
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -83
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -559
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -24
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -122
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -2
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -89
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -241
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js +0 -4938
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js +0 -495
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js +0 -190
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js +0 -8
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js.map +0 -1
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js +0 -138
- package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js.map +0 -1
|
@@ -1,130 +1,130 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
type DashRow = Record<string, unknown>
|
|
3
|
-
</script>
|
|
4
|
-
|
|
5
|
-
<script lang="ts" generics="TData extends DashRow">
|
|
6
|
-
/**
|
|
7
|
-
* SvSchemaDashboard - a schema-driven dashboard: KPI tiles + charts composed
|
|
8
|
-
* from a declarative `DashboardSpec` (defaults to `dashboardFromSchema`). It's
|
|
9
|
-
* a data *view*, not a page builder - the spec is plain data and every chart is
|
|
10
|
-
* an `SvSchemaChart` with its controls off. KPI tiles reduce over the passed
|
|
11
|
-
* `rows`; charts prefer a server `getAggregate` when given, else `rows`.
|
|
12
|
-
*/
|
|
13
|
-
import SvSchemaChart from './SvSchemaChart.svelte'
|
|
14
|
-
import type { EntitySchema } from './schema'
|
|
15
|
-
import { dashboardFromSchema, reduceValue, type DashboardSpec } from './sources/dashboard'
|
|
16
|
-
import type { AggregateBucket, AggregateRequest, AggregateReduce } from './sources/aggregate'
|
|
17
|
-
|
|
18
|
-
type Props = {
|
|
19
|
-
schema: EntitySchema<TData>
|
|
20
|
-
/** Rows for KPI tiles (and charts when there's no `getAggregate`). */
|
|
21
|
-
rows?: ReadonlyArray<TData>
|
|
22
|
-
/**
|
|
23
|
-
* Server-side aggregation (a data source's `getAggregate`). When set, KPI
|
|
24
|
-
* tiles AND charts are computed server-side (KPIs via a dimension-less
|
|
25
|
-
* request), so they're correct over the whole table, not just a page.
|
|
26
|
-
*/
|
|
27
|
-
getAggregate?: (request: AggregateRequest) => Promise<AggregateBucket[]>
|
|
28
|
-
/** Filter applied to every widget (KPIs + charts), same shape the grid emits. */
|
|
29
|
-
filterModel?: AggregateRequest['filterModel']
|
|
30
|
-
/** Widget layout. Defaults to a sensible set from the schema. */
|
|
31
|
-
spec?: DashboardSpec
|
|
32
|
-
/** Bump to re-fetch server aggregates after a mutation. */
|
|
33
|
-
refreshKey?: unknown
|
|
34
|
-
onDrill?: (category: string, dimension: string) => void
|
|
35
|
-
title?: string
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
let { schema, rows, getAggregate, filterModel, spec, refreshKey, onDrill, title }: Props = $props()
|
|
39
|
-
|
|
40
|
-
const widgets = $derived((spec ?? dashboardFromSchema(schema as EntitySchema)).widgets)
|
|
41
|
-
const data = $derived((rows ?? []) as ReadonlyArray<TData>)
|
|
42
|
-
|
|
43
|
-
const compact = new Intl.NumberFormat(undefined, { notation: 'compact', maximumFractionDigits: 1 })
|
|
44
|
-
const fmt = (v: number, f?: (v: number) => string) => (f ? f(v) : compact.format(v))
|
|
45
|
-
|
|
46
|
-
// Server KPIs: when `getAggregate` is set, fetch each KPI as a dimension-less
|
|
47
|
-
// aggregate (a grand total over the whole table), re-running on refresh/filter.
|
|
48
|
-
let serverKpis = $state<number[]>([])
|
|
49
|
-
let kpiToken = 0
|
|
50
|
-
$effect(() => {
|
|
51
|
-
if (!getAggregate) return
|
|
52
|
-
void refreshKey
|
|
53
|
-
const reqs = widgets.map((w) =>
|
|
54
|
-
w.kind === 'kpi' ? getAggregate({ measure: w.measure, reduce: w.reduce, filterModel }) : null,
|
|
55
|
-
)
|
|
56
|
-
const token = ++kpiToken
|
|
57
|
-
Promise.all(reqs.map((r) => (r ? r.then((bs) => bs[0]?.value ?? 0) : Promise.resolve(0)))).then((vals) => {
|
|
58
|
-
if (token === kpiToken) serverKpis = vals
|
|
59
|
-
})
|
|
60
|
-
})
|
|
61
|
-
const kpiValue = (w: { measure?: string; reduce: AggregateReduce }, i: number) =>
|
|
62
|
-
getAggregate ? (serverKpis[i] ?? 0) : reduceValue(data, { measure: w.measure, reduce: w.reduce })
|
|
63
|
-
</script>
|
|
64
|
-
|
|
65
|
-
<section class="dash">
|
|
66
|
-
{#if title}<h3 class="dash__title">{title}</h3>{/if}
|
|
67
|
-
<div class="dash__grid">
|
|
68
|
-
{#each widgets as w, i (i)}
|
|
69
|
-
{#if w.kind === 'kpi'}
|
|
70
|
-
<div class="dash__kpi">
|
|
71
|
-
<span class="dash__kpi-label">{w.label}</span>
|
|
72
|
-
<span class="dash__kpi-value">{fmt(kpiValue(w, i), w.format)}</span>
|
|
73
|
-
</div>
|
|
74
|
-
{:else}
|
|
75
|
-
<div class="dash__chart" style="grid-column: span {Math.min(w.span ?? 2, 3)}">
|
|
76
|
-
{#if w.label}<span class="dash__chart-label">{w.label}</span>{/if}
|
|
77
|
-
<SvSchemaChart
|
|
78
|
-
schema={schema as EntitySchema}
|
|
79
|
-
rows={getAggregate ? undefined : (data as ReadonlyArray<DashRow>)}
|
|
80
|
-
{getAggregate}
|
|
81
|
-
{filterModel}
|
|
82
|
-
dimension={w.dimension}
|
|
83
|
-
measure={w.measure}
|
|
84
|
-
reduce={w.reduce}
|
|
85
|
-
type={w.type}
|
|
86
|
-
controls={false}
|
|
87
|
-
height={230}
|
|
88
|
-
width={420}
|
|
89
|
-
{refreshKey}
|
|
90
|
-
onDrill={(category, dimension) => onDrill?.(category, dimension)}
|
|
91
|
-
/>
|
|
92
|
-
</div>
|
|
93
|
-
{/if}
|
|
94
|
-
{/each}
|
|
95
|
-
</div>
|
|
96
|
-
</section>
|
|
97
|
-
|
|
98
|
-
<style>
|
|
99
|
-
.dash { display: flex; flex-direction: column; gap: 12px; }
|
|
100
|
-
.dash__title { margin: 0; font-size: 15px; font-weight: 650; color: var(--sg-fg, #0f172a); }
|
|
101
|
-
.dash__grid {
|
|
102
|
-
display: grid;
|
|
103
|
-
grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
|
|
104
|
-
/* Size rows to content; otherwise implicit auto rows stretch to fill a
|
|
105
|
-
bounded-height container and shrink below each widget, overlapping them. */
|
|
106
|
-
grid-auto-rows: max-content;
|
|
107
|
-
gap: 12px;
|
|
108
|
-
align-items: start;
|
|
109
|
-
}
|
|
110
|
-
.dash__kpi {
|
|
111
|
-
display: flex; flex-direction: column; gap: 6px;
|
|
112
|
-
padding: 16px 16px 18px;
|
|
113
|
-
border: 1px solid var(--sg-border, #e6e8ec); border-radius: 12px;
|
|
114
|
-
background: var(--sg-bg, #fff);
|
|
115
|
-
box-shadow: 0 1px 2px rgba(15, 23, 42, 0.05);
|
|
116
|
-
}
|
|
117
|
-
.dash__kpi-label { font-size: 12.5px; font-weight: 550; color: var(--sg-muted, #64748b); }
|
|
118
|
-
.dash__kpi-value { font-size: 26px; font-weight: 720; letter-spacing: -0.02em; color: var(--sg-fg, #0f172a); }
|
|
119
|
-
.dash__chart {
|
|
120
|
-
display: flex; flex-direction: column; gap: 8px;
|
|
121
|
-
padding: 14px 14px 12px; min-width: 0;
|
|
122
|
-
border: 1px solid var(--sg-border, #e6e8ec); border-radius: 12px;
|
|
123
|
-
background: var(--sg-bg, #fff);
|
|
124
|
-
box-shadow: 0 1px 2px rgba(15, 23, 42, 0.05);
|
|
125
|
-
}
|
|
126
|
-
.dash__chart-label { font-size: 13px; font-weight: 600; color: var(--sg-fg, #0f172a); }
|
|
127
|
-
@media (max-width: 620px) {
|
|
128
|
-
.dash__chart { grid-column: span 1 !important; }
|
|
129
|
-
}
|
|
130
|
-
</style>
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
type DashRow = Record<string, unknown>
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<script lang="ts" generics="TData extends DashRow">
|
|
6
|
+
/**
|
|
7
|
+
* SvSchemaDashboard - a schema-driven dashboard: KPI tiles + charts composed
|
|
8
|
+
* from a declarative `DashboardSpec` (defaults to `dashboardFromSchema`). It's
|
|
9
|
+
* a data *view*, not a page builder - the spec is plain data and every chart is
|
|
10
|
+
* an `SvSchemaChart` with its controls off. KPI tiles reduce over the passed
|
|
11
|
+
* `rows`; charts prefer a server `getAggregate` when given, else `rows`.
|
|
12
|
+
*/
|
|
13
|
+
import SvSchemaChart from './SvSchemaChart.svelte'
|
|
14
|
+
import type { EntitySchema } from './schema'
|
|
15
|
+
import { dashboardFromSchema, reduceValue, type DashboardSpec } from './sources/dashboard'
|
|
16
|
+
import type { AggregateBucket, AggregateRequest, AggregateReduce } from './sources/aggregate'
|
|
17
|
+
|
|
18
|
+
type Props = {
|
|
19
|
+
schema: EntitySchema<TData>
|
|
20
|
+
/** Rows for KPI tiles (and charts when there's no `getAggregate`). */
|
|
21
|
+
rows?: ReadonlyArray<TData>
|
|
22
|
+
/**
|
|
23
|
+
* Server-side aggregation (a data source's `getAggregate`). When set, KPI
|
|
24
|
+
* tiles AND charts are computed server-side (KPIs via a dimension-less
|
|
25
|
+
* request), so they're correct over the whole table, not just a page.
|
|
26
|
+
*/
|
|
27
|
+
getAggregate?: (request: AggregateRequest) => Promise<AggregateBucket[]>
|
|
28
|
+
/** Filter applied to every widget (KPIs + charts), same shape the grid emits. */
|
|
29
|
+
filterModel?: AggregateRequest['filterModel']
|
|
30
|
+
/** Widget layout. Defaults to a sensible set from the schema. */
|
|
31
|
+
spec?: DashboardSpec
|
|
32
|
+
/** Bump to re-fetch server aggregates after a mutation. */
|
|
33
|
+
refreshKey?: unknown
|
|
34
|
+
onDrill?: (category: string, dimension: string) => void
|
|
35
|
+
title?: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
let { schema, rows, getAggregate, filterModel, spec, refreshKey, onDrill, title }: Props = $props()
|
|
39
|
+
|
|
40
|
+
const widgets = $derived((spec ?? dashboardFromSchema(schema as EntitySchema)).widgets)
|
|
41
|
+
const data = $derived((rows ?? []) as ReadonlyArray<TData>)
|
|
42
|
+
|
|
43
|
+
const compact = new Intl.NumberFormat(undefined, { notation: 'compact', maximumFractionDigits: 1 })
|
|
44
|
+
const fmt = (v: number, f?: (v: number) => string) => (f ? f(v) : compact.format(v))
|
|
45
|
+
|
|
46
|
+
// Server KPIs: when `getAggregate` is set, fetch each KPI as a dimension-less
|
|
47
|
+
// aggregate (a grand total over the whole table), re-running on refresh/filter.
|
|
48
|
+
let serverKpis = $state<number[]>([])
|
|
49
|
+
let kpiToken = 0
|
|
50
|
+
$effect(() => {
|
|
51
|
+
if (!getAggregate) return
|
|
52
|
+
void refreshKey
|
|
53
|
+
const reqs = widgets.map((w) =>
|
|
54
|
+
w.kind === 'kpi' ? getAggregate({ measure: w.measure, reduce: w.reduce, filterModel }) : null,
|
|
55
|
+
)
|
|
56
|
+
const token = ++kpiToken
|
|
57
|
+
Promise.all(reqs.map((r) => (r ? r.then((bs) => bs[0]?.value ?? 0) : Promise.resolve(0)))).then((vals) => {
|
|
58
|
+
if (token === kpiToken) serverKpis = vals
|
|
59
|
+
})
|
|
60
|
+
})
|
|
61
|
+
const kpiValue = (w: { measure?: string; reduce: AggregateReduce }, i: number) =>
|
|
62
|
+
getAggregate ? (serverKpis[i] ?? 0) : reduceValue(data, { measure: w.measure, reduce: w.reduce })
|
|
63
|
+
</script>
|
|
64
|
+
|
|
65
|
+
<section class="dash">
|
|
66
|
+
{#if title}<h3 class="dash__title">{title}</h3>{/if}
|
|
67
|
+
<div class="dash__grid">
|
|
68
|
+
{#each widgets as w, i (i)}
|
|
69
|
+
{#if w.kind === 'kpi'}
|
|
70
|
+
<div class="dash__kpi">
|
|
71
|
+
<span class="dash__kpi-label">{w.label}</span>
|
|
72
|
+
<span class="dash__kpi-value">{fmt(kpiValue(w, i), w.format)}</span>
|
|
73
|
+
</div>
|
|
74
|
+
{:else}
|
|
75
|
+
<div class="dash__chart" style="grid-column: span {Math.min(w.span ?? 2, 3)}">
|
|
76
|
+
{#if w.label}<span class="dash__chart-label">{w.label}</span>{/if}
|
|
77
|
+
<SvSchemaChart
|
|
78
|
+
schema={schema as EntitySchema}
|
|
79
|
+
rows={getAggregate ? undefined : (data as ReadonlyArray<DashRow>)}
|
|
80
|
+
{getAggregate}
|
|
81
|
+
{filterModel}
|
|
82
|
+
dimension={w.dimension}
|
|
83
|
+
measure={w.measure}
|
|
84
|
+
reduce={w.reduce}
|
|
85
|
+
type={w.type}
|
|
86
|
+
controls={false}
|
|
87
|
+
height={230}
|
|
88
|
+
width={420}
|
|
89
|
+
{refreshKey}
|
|
90
|
+
onDrill={(category, dimension) => onDrill?.(category, dimension)}
|
|
91
|
+
/>
|
|
92
|
+
</div>
|
|
93
|
+
{/if}
|
|
94
|
+
{/each}
|
|
95
|
+
</div>
|
|
96
|
+
</section>
|
|
97
|
+
|
|
98
|
+
<style>
|
|
99
|
+
.dash { display: flex; flex-direction: column; gap: 12px; }
|
|
100
|
+
.dash__title { margin: 0; font-size: 15px; font-weight: 650; color: var(--sg-fg, #0f172a); }
|
|
101
|
+
.dash__grid {
|
|
102
|
+
display: grid;
|
|
103
|
+
grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
|
|
104
|
+
/* Size rows to content; otherwise implicit auto rows stretch to fill a
|
|
105
|
+
bounded-height container and shrink below each widget, overlapping them. */
|
|
106
|
+
grid-auto-rows: max-content;
|
|
107
|
+
gap: 12px;
|
|
108
|
+
align-items: start;
|
|
109
|
+
}
|
|
110
|
+
.dash__kpi {
|
|
111
|
+
display: flex; flex-direction: column; gap: 6px;
|
|
112
|
+
padding: 16px 16px 18px;
|
|
113
|
+
border: 1px solid var(--sg-border, #e6e8ec); border-radius: 12px;
|
|
114
|
+
background: var(--sg-bg, #fff);
|
|
115
|
+
box-shadow: 0 1px 2px rgba(15, 23, 42, 0.05);
|
|
116
|
+
}
|
|
117
|
+
.dash__kpi-label { font-size: 12.5px; font-weight: 550; color: var(--sg-muted, #64748b); }
|
|
118
|
+
.dash__kpi-value { font-size: 26px; font-weight: 720; letter-spacing: -0.02em; color: var(--sg-fg, #0f172a); }
|
|
119
|
+
.dash__chart {
|
|
120
|
+
display: flex; flex-direction: column; gap: 8px;
|
|
121
|
+
padding: 14px 14px 12px; min-width: 0;
|
|
122
|
+
border: 1px solid var(--sg-border, #e6e8ec); border-radius: 12px;
|
|
123
|
+
background: var(--sg-bg, #fff);
|
|
124
|
+
box-shadow: 0 1px 2px rgba(15, 23, 42, 0.05);
|
|
125
|
+
}
|
|
126
|
+
.dash__chart-label { font-size: 13px; font-weight: 600; color: var(--sg-fg, #0f172a); }
|
|
127
|
+
@media (max-width: 620px) {
|
|
128
|
+
.dash__chart { grid-column: span 1 !important; }
|
|
129
|
+
}
|
|
130
|
+
</style>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
type DashRow = Record<string, unknown>;
|
|
2
|
-
import type { EntitySchema } from './schema';
|
|
3
|
-
import { type DashboardSpec } from './sources/dashboard';
|
|
4
|
-
import type { AggregateBucket, AggregateRequest } from './sources/aggregate';
|
|
2
|
+
import type { EntitySchema } from './schema.js';
|
|
3
|
+
import { type DashboardSpec } from './sources/dashboard.js';
|
|
4
|
+
import type { AggregateBucket, AggregateRequest } from './sources/aggregate.js';
|
|
5
5
|
declare function $$render<TData extends DashRow>(): {
|
|
6
6
|
props: {
|
|
7
7
|
schema: EntitySchema<TData>;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Saves every consumer from hand-writing an `ExprColumn[]` that mirrors their
|
|
5
5
|
* column defs and then drifting from it.
|
|
6
6
|
*/
|
|
7
|
-
import type { ExprColumn } from '../expressions/expression-columns';
|
|
7
|
+
import type { ExprColumn } from '../expressions/expression-columns.js';
|
|
8
8
|
/** Grid columns as `api.getColumns()` reports them. */
|
|
9
9
|
type GridColumnInfo = {
|
|
10
10
|
id: string;
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
* compiler that turns an expression into a row predicate.
|
|
7
7
|
*/
|
|
8
8
|
import { registerAdvancedFilterEngine } from '@svgrid/grid';
|
|
9
|
-
import { isLicenseKeySet } from './license';
|
|
10
|
-
import { emitUnlicensedNudge } from './watermark';
|
|
11
|
-
import { compilePredicate } from './expressions/compile';
|
|
9
|
+
import { isLicenseKeySet } from './license.js';
|
|
10
|
+
import { emitUnlicensedNudge } from './watermark.js';
|
|
11
|
+
import { compilePredicate } from './expressions/compile.js';
|
|
12
12
|
let enabled = false;
|
|
13
13
|
const advancedFilterEngine = (expr, ctx) => {
|
|
14
14
|
// The grid treats null as "do not filter" and never surfaces a partially
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
* same as a plain-JS interval poll for non-Svelte hosts.
|
|
13
13
|
*/
|
|
14
14
|
import type { ConditionalFormat } from '@svgrid/grid/format';
|
|
15
|
-
import { type AlertEngine } from './alert-engine';
|
|
16
|
-
import type { AlertEvent, AlertRule } from './alert-types';
|
|
15
|
+
import { type AlertEngine } from './alert-engine.js';
|
|
16
|
+
import type { AlertEvent, AlertRule } from './alert-types.js';
|
|
17
17
|
export type FlashTarget = {
|
|
18
18
|
rowId: string;
|
|
19
19
|
columnId?: string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { toast } from '@svgrid/grid';
|
|
2
|
-
import { alertStore } from './alert-store.svelte';
|
|
3
|
-
import { toConditionalFormats } from './alert-formats';
|
|
4
|
-
import { createAlertEngine } from './alert-engine';
|
|
2
|
+
import { alertStore } from './alert-store.svelte.js';
|
|
3
|
+
import { toConditionalFormats } from './alert-formats.js';
|
|
4
|
+
import { createAlertEngine } from './alert-engine.js';
|
|
5
5
|
/**
|
|
6
6
|
* Perform the side effects of a batch of fired events and return the visual
|
|
7
7
|
* output: every event is recorded in the log (so the badge/panel stay accurate),
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* once when a row starts matching (not on every re-evaluation while it keeps
|
|
5
5
|
* matching). The reactive/observing wrapper lives in `alert-engine-attach.ts`.
|
|
6
6
|
*/
|
|
7
|
-
import { evaluateChange, evaluatePredicate } from '../expressions/evaluate';
|
|
8
|
-
import { collectColumnRefs } from '../expressions/parse';
|
|
7
|
+
import { evaluateChange, evaluatePredicate } from '../expressions/evaluate.js';
|
|
8
|
+
import { collectColumnRefs } from '../expressions/parse.js';
|
|
9
9
|
const AGG_ROW_KEY = '*';
|
|
10
10
|
/** Fill message-template tokens from the firing context. */
|
|
11
11
|
export function renderTemplate(template, ctx) {
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* already uses for color scales and data bars. No new rendering path.
|
|
6
6
|
*/
|
|
7
7
|
import type { ConditionalFormat } from '@svgrid/grid/format';
|
|
8
|
-
import type { AlertEvent, AlertRule } from './alert-types';
|
|
8
|
+
import type { AlertEvent, AlertRule } from './alert-types.js';
|
|
9
9
|
export type StylingContext<TData> = {
|
|
10
10
|
getValue?: (row: TData, columnId: string) => unknown;
|
|
11
11
|
locale?: string | ReadonlyArray<string>;
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
* instance to a scheduler and an `onEvents` sink; `attachAlertEngine` wraps it
|
|
26
26
|
* for non-Svelte hosts.
|
|
27
27
|
*/
|
|
28
|
-
import type { AlertEngine } from './alert-engine';
|
|
29
|
-
import type { AlertEvent, AlertRule } from './alert-types';
|
|
30
|
-
import { type AlertScheduler, type AlertSchedulerMode } from './alert-scheduler';
|
|
28
|
+
import type { AlertEngine } from './alert-engine.js';
|
|
29
|
+
import type { AlertEvent, AlertRule } from './alert-types.js';
|
|
30
|
+
import { type AlertScheduler, type AlertSchedulerMode } from './alert-scheduler.js';
|
|
31
31
|
export type AlertObserverOptions<TData> = {
|
|
32
32
|
engine: AlertEngine<TData>;
|
|
33
33
|
getRowId: (row: TData) => string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createAlertScheduler } from './alert-scheduler';
|
|
1
|
+
import { createAlertScheduler } from './alert-scheduler.js';
|
|
2
2
|
const clone = (r) => r && typeof r === 'object' ? { ...r } : r;
|
|
3
3
|
export function createAlertObserver(opts) {
|
|
4
4
|
const { engine, getRowId, onEvents } = opts;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* a small CRUD manager. `export()` / `import()` make a rule set shareable as
|
|
5
5
|
* JSON, so a team lead can hand round a set of alerts.
|
|
6
6
|
*/
|
|
7
|
-
import type { AlertRule } from './alert-types';
|
|
7
|
+
import type { AlertRule } from './alert-types.js';
|
|
8
8
|
export type AlertRulesStorage = {
|
|
9
9
|
read(): AlertRule[];
|
|
10
10
|
write(rules: AlertRule[]): void;
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* `pushMany` (not one reassignment per event), and `activeCount` is a maintained
|
|
9
9
|
* counter - not an O(n) reduce recomputed on every render.
|
|
10
10
|
*/
|
|
11
|
-
import type { AlertEvent } from './alert-types';
|
|
11
|
+
import type { AlertEvent } from './alert-types.js';
|
|
12
12
|
/** The shared alerts log. Read `.events` / `.activeCount` inside a component. */
|
|
13
13
|
export declare const alertStore: {
|
|
14
14
|
readonly events: AlertEvent[];
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Predicates and change tests come from the expression layer (`../expressions`).
|
|
11
11
|
*/
|
|
12
|
-
import type { ChangeExpr, PredicateExpr } from '../expressions/expression-types';
|
|
13
|
-
import type { Schedule } from '../scheduling';
|
|
12
|
+
import type { ChangeExpr, PredicateExpr } from '../expressions/expression-types.js';
|
|
13
|
+
import type { Schedule } from '../scheduling.js';
|
|
14
14
|
/** Maps onto the toast variants + conditional-format intent. */
|
|
15
15
|
export type AlertSeverity = 'info' | 'success' | 'warning' | 'error';
|
|
16
16
|
/** What the rule watches over. */
|
package/dist/alerts.js
CHANGED
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
* // spread `formats` into <SvGrid conditionalFormats={[...base, ...formats]} />
|
|
16
16
|
* ```
|
|
17
17
|
*/
|
|
18
|
-
import { isLicenseKeySet } from './license';
|
|
19
|
-
import { emitUnlicensedNudge } from './watermark';
|
|
18
|
+
import { isLicenseKeySet } from './license.js';
|
|
19
|
+
import { emitUnlicensedNudge } from './watermark.js';
|
|
20
20
|
let enabled = false;
|
|
21
21
|
/** Turn on the alerts feature (soft-gated). Idempotent. */
|
|
22
22
|
export function enableAlerts() {
|
package/dist/board.js
CHANGED
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
* ```
|
|
16
16
|
*/
|
|
17
17
|
import { registerBoardView } from '@svgrid/grid';
|
|
18
|
-
import { isLicenseKeySet } from './license';
|
|
19
|
-
import { emitUnlicensedNudge } from './watermark';
|
|
18
|
+
import { isLicenseKeySet } from './license.js';
|
|
19
|
+
import { emitUnlicensedNudge } from './watermark.js';
|
|
20
20
|
import SvGridBoard from './SvGridBoard.svelte';
|
|
21
21
|
let enabled = false;
|
|
22
22
|
/**
|