@svgrid/enterprise 3.0.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.
Files changed (235) hide show
  1. package/README.md +95 -95
  2. package/dist/ExpressionEditorHarness.svelte.d.ts +2 -2
  3. package/dist/SvAdvancedFilter.svelte.d.ts +2 -2
  4. package/dist/SvAlertRuleEditor.svelte.d.ts +2 -2
  5. package/dist/SvAlertsManager.svelte.d.ts +3 -3
  6. package/dist/SvAlertsPanel.svelte.d.ts +1 -1
  7. package/dist/SvAuthGate.svelte +115 -115
  8. package/dist/SvAuthGate.svelte.d.ts +1 -1
  9. package/dist/SvBoard.svelte.d.ts +1 -1
  10. package/dist/SvExportMenu.svelte +553 -553
  11. package/dist/SvExportMenu.svelte.d.ts +2 -2
  12. package/dist/SvExpressionEditor.svelte.d.ts +2 -2
  13. package/dist/SvFileInput.svelte +113 -113
  14. package/dist/SvGridAlerts.svelte.d.ts +2 -2
  15. package/dist/SvGridBoard.svelte +2358 -2358
  16. package/dist/SvGridBulkEditDrawer.svelte.d.ts +1 -1
  17. package/dist/SvGridEditPanel.svelte +1157 -1157
  18. package/dist/SvGridEditPanel.svelte.d.ts +3 -3
  19. package/dist/SvGridMasterDetail.svelte +116 -116
  20. package/dist/SvGridMasterDetail.svelte.d.ts +1 -1
  21. package/dist/SvGridScheduler.svelte +5358 -5358
  22. package/dist/SvImportDialog.svelte +1020 -1020
  23. package/dist/SvImportDialog.svelte.d.ts +2 -2
  24. package/dist/SvLookupInput.svelte +180 -180
  25. package/dist/SvLookupInput.svelte.d.ts +1 -1
  26. package/dist/SvPivotDesigner.svelte +1990 -1990
  27. package/dist/SvPivotDesigner.svelte.d.ts +2 -2
  28. package/dist/SvRecordDetail.svelte.d.ts +1 -1
  29. package/dist/SvSchedule.svelte.d.ts +1 -1
  30. package/dist/SvSchemaChart.svelte +234 -234
  31. package/dist/SvSchemaChart.svelte.d.ts +2 -2
  32. package/dist/SvSchemaDashboard.svelte +130 -130
  33. package/dist/SvSchemaDashboard.svelte.d.ts +3 -3
  34. package/dist/advanced-filter/expr-columns-from-grid.d.ts +1 -1
  35. package/dist/advanced-filter-enable.js +3 -3
  36. package/dist/alerts/alert-engine-attach.d.ts +2 -2
  37. package/dist/alerts/alert-engine-attach.js +3 -3
  38. package/dist/alerts/alert-engine.d.ts +1 -1
  39. package/dist/alerts/alert-engine.js +2 -2
  40. package/dist/alerts/alert-formats.d.ts +1 -1
  41. package/dist/alerts/alert-formats.js +1 -1
  42. package/dist/alerts/alert-observer.d.ts +3 -3
  43. package/dist/alerts/alert-observer.js +1 -1
  44. package/dist/alerts/alert-storage.d.ts +1 -1
  45. package/dist/alerts/alert-store.svelte.d.ts +1 -1
  46. package/dist/alerts/alert-types.d.ts +2 -2
  47. package/dist/alerts.js +2 -2
  48. package/dist/board.js +2 -2
  49. package/dist/cdn/svgrid-enterprise.svelte-external.js +1161 -1144
  50. package/dist/designer/assets/GridMenus-B1JtIN21.js +8 -0
  51. package/dist/designer/assets/SvDateRangeInput-C0iCCZ8o.css +1 -0
  52. package/dist/designer/assets/{SvDateRangeInput-CVn-yqrQ.js → SvDateRangeInput-CjO7nn_x.js} +1 -1
  53. package/dist/designer/assets/SvDateTimePicker-ByBD_ov6.js +1 -0
  54. package/dist/designer/assets/SvDateTimePicker-DPv09DIT.css +1 -0
  55. package/dist/designer/assets/SvField-YDLipR6O.css +1 -0
  56. package/dist/designer/assets/{SvField-BsqiA5me.js → SvField-cj1PFNgZ.js} +1 -1
  57. package/dist/designer/assets/{preload-helper-CG0n22O7.js → SvGrid.helpers-BgT-gnCo.js} +1 -1
  58. package/dist/designer/assets/SvGridCellEditor-0W1L2hJ1.js +2 -0
  59. package/dist/designer/assets/SvGridChart-DBOR4xcz.js +2 -0
  60. package/dist/designer/assets/SvGridChart-fkMWeh1J.css +1 -0
  61. package/dist/designer/assets/SvGridChartPanel-symrhNnR.js +11 -0
  62. package/dist/designer/assets/SvGridChartView-BmRxq6mU.js +1 -0
  63. package/dist/designer/assets/SvGridChartView-DUc-1RUf.css +1 -0
  64. package/dist/designer/assets/SvGridDropdown-Bb3HH2Aj.js +1 -0
  65. package/dist/designer/assets/SvGridDropdown-CcidB3rm.css +1 -0
  66. package/dist/designer/assets/SvListBox-1oUF6Iav.js +110 -0
  67. package/dist/designer/assets/SvListBox-BXfyqy4a.css +1 -0
  68. package/dist/designer/assets/cell-formatting-wr5wm7US.js +1 -0
  69. package/dist/designer/assets/chart-DXFganU8.js +1 -0
  70. package/dist/designer/assets/date-format-DGagAqRc.css +1 -0
  71. package/dist/designer/assets/{date-format-4DJvNtG2.js → date-format-onlYDsrY.js} +1 -1
  72. package/dist/designer/assets/export-format-D-eP4b2l.js +6 -0
  73. package/dist/designer/assets/{index-zUBix-JQ.js → index-C_a9Cj8Y.js} +2984 -141
  74. package/dist/designer/assets/index-k2stW6L8.css +1 -0
  75. package/dist/designer/assets/preload-helper-HclGiUj8.js +1 -0
  76. package/dist/designer/assets/src-D9p27OGC.js +58 -0
  77. package/dist/designer/index.html +22 -22
  78. package/dist/export-conditional.d.ts +1 -1
  79. package/dist/export-print.js +19 -19
  80. package/dist/export-xls.d.ts +2 -2
  81. package/dist/export.d.ts +2 -2
  82. package/dist/export.js +7 -7
  83. package/dist/expressions/builder-tree.d.ts +2 -2
  84. package/dist/expressions/builder-tree.js +1 -1
  85. package/dist/expressions/compile.d.ts +1 -1
  86. package/dist/import.js +1 -1
  87. package/dist/index.d.ts +53 -53
  88. package/dist/index.js +50 -50
  89. package/dist/install.d.ts +4 -4
  90. package/dist/install.js +11 -11
  91. package/dist/license.d.ts +3 -2
  92. package/dist/license.js +9 -4
  93. package/dist/node/studio.js +123 -114
  94. package/dist/pivot-chart.d.ts +1 -1
  95. package/dist/pivot-designer.d.ts +1 -1
  96. package/dist/pivot-enable.js +3 -3
  97. package/dist/print.d.ts +1 -1
  98. package/dist/print.js +4 -4
  99. package/dist/scheduler-config.d.ts +5 -5
  100. package/dist/scheduler-freebusy.d.ts +1 -1
  101. package/dist/scheduler-freebusy.js +1 -1
  102. package/dist/scheduler.js +2 -2
  103. package/dist/schema-designer.d.ts +1 -1
  104. package/dist/schema-designer.js +2 -2
  105. package/dist/selection-bar.js +2 -2
  106. package/dist/sources/aggregate.d.ts +1 -1
  107. package/dist/sources/auth-supabase.js +1 -1
  108. package/dist/sources/dashboard.d.ts +2 -2
  109. package/dist/sources/dashboard.js +1 -1
  110. package/dist/sources/index.d.ts +13 -13
  111. package/dist/sources/index.js +13 -13
  112. package/dist/sources/realtime-supabase.js +1 -1
  113. package/dist/sources/relation-lookup.d.ts +1 -1
  114. package/dist/sources/relation-lookup.js +1 -1
  115. package/dist/sources/rest-adapters.d.ts +1 -1
  116. package/dist/sources/rest-adapters.js +1 -1
  117. package/dist/sources/rest.d.ts +2 -2
  118. package/dist/sources/rest.js +3 -3
  119. package/dist/sources/supabase.d.ts +2 -2
  120. package/dist/sources/supabase.js +3 -3
  121. package/dist/sources/with-entity-rules.d.ts +1 -1
  122. package/dist/sources/with-entity-rules.js +1 -1
  123. package/dist/sources/with-relation-labels.d.ts +1 -1
  124. package/dist/studio/emit-project.js +2161 -2127
  125. package/dist/studio/emit-schema.js +369 -369
  126. package/dist/studio/index.d.ts +1 -1
  127. package/dist/studio/index.js +1 -1
  128. package/dist/studio/introspect-db.js +45 -45
  129. package/dist/studio/project.d.ts +10 -0
  130. package/dist/studio/samples/crm.js +6 -6
  131. package/dist/studio/samples/fleet.js +7 -7
  132. package/dist/studio/samples/insurance.js +9 -9
  133. package/dist/studio/samples/inventory.js +12 -12
  134. package/dist/studio/samples/projects.js +5 -5
  135. package/dist/studio/samples/support.js +8 -8
  136. package/dist/studio/scaffold-app.js +104 -104
  137. package/dist/studio/scaffold.js +151 -151
  138. package/dist/studio/ui-components.d.ts +7 -0
  139. package/dist/studio/ui-components.js +35 -0
  140. package/dist/sveltekit/in-memory.d.ts +3 -3
  141. package/dist/sveltekit/in-memory.js +4 -4
  142. package/dist/sveltekit/index.d.ts +6 -6
  143. package/dist/sveltekit/index.js +5 -5
  144. package/dist/sveltekit/query-plan.d.ts +1 -1
  145. package/dist/sveltekit/sql-source.d.ts +4 -4
  146. package/dist/sveltekit/sql-source.js +4 -4
  147. package/dist/sveltekit/sql.d.ts +1 -1
  148. package/dist/sveltekit/transport.d.ts +2 -2
  149. package/dist/sveltekit/transport.js +1 -1
  150. package/dist/upgrade-prompt.js +25 -25
  151. package/package.json +6 -3
  152. package/dist/designer/assets/GridMenus-Cgilexpk.js +0 -8
  153. package/dist/designer/assets/SvDateRangeInput-BV5OXYQ2.css +0 -1
  154. package/dist/designer/assets/SvDateTimePicker-BdioTrJQ.js +0 -1
  155. package/dist/designer/assets/SvDateTimePicker-CY8TK4BT.css +0 -1
  156. package/dist/designer/assets/SvField-BF-9TJSd.css +0 -1
  157. package/dist/designer/assets/SvGridCellEditor-dLY7_kk9.js +0 -2
  158. package/dist/designer/assets/SvGridChart-BEDNTdc5.js +0 -2
  159. package/dist/designer/assets/SvGridChart-Vu4Nvjiv.css +0 -1
  160. package/dist/designer/assets/SvGridChartPanel-x3lzSxuf.js +0 -10
  161. package/dist/designer/assets/SvGridChartView-CAKhPELi.js +0 -1
  162. package/dist/designer/assets/SvGridChartView-DX9HfkBR.css +0 -1
  163. package/dist/designer/assets/SvGridDropdown-CAYG7Y-O.js +0 -1
  164. package/dist/designer/assets/SvGridDropdown-Crwb2P3Q.css +0 -1
  165. package/dist/designer/assets/SvListBox-CVYQcLX9.js +0 -1
  166. package/dist/designer/assets/SvListBox-DgN8kvjt.css +0 -1
  167. package/dist/designer/assets/chart-DHEgt4lN.js +0 -1
  168. package/dist/designer/assets/date-format-Dzy4mTGh.css +0 -1
  169. package/dist/designer/assets/export-format-DwjuTfrQ.js +0 -6
  170. package/dist/designer/assets/index-Cp7fDJ3b.css +0 -1
  171. package/dist/designer/assets/js-scroller.svelte-Bhxqb3-c.js +0 -110
  172. package/dist/designer/assets/src-B7DNcoQK.css +0 -1
  173. package/dist/designer/assets/src-BoYyigAC.js +0 -2896
  174. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -1
  175. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -178
  176. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js +0 -3875
  177. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js.map +0 -1
  178. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js +0 -21
  179. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js.map +0 -1
  180. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js +0 -1938
  181. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js.map +0 -1
  182. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js +0 -205
  183. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js.map +0 -1
  184. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js +0 -18
  185. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js.map +0 -1
  186. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js +0 -264
  187. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js.map +0 -1
  188. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js +0 -697
  189. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js.map +0 -1
  190. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -3
  191. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -134
  192. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -1
  193. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -55
  194. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -1
  195. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -2
  196. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -46843
  197. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -1
  198. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -237
  199. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -1
  200. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -2
  201. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -4
  202. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -1
  203. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -7
  204. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -4
  205. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -1
  206. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -5
  207. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -1
  208. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -5
  209. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -1
  210. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -5
  211. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -1
  212. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -6
  213. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -83
  214. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -1
  215. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -559
  216. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -1
  217. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -24
  218. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -1
  219. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -122
  220. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -1
  221. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -2
  222. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -89
  223. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -1
  224. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -241
  225. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -1
  226. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js +0 -4938
  227. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js.map +0 -1
  228. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js +0 -495
  229. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js.map +0 -1
  230. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js +0 -190
  231. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js.map +0 -1
  232. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js +0 -8
  233. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js.map +0 -1
  234. package/dist/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js +0 -138
  235. 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),
@@ -1,4 +1,4 @@
1
- import type { AlertEvent, AlertRule } from './alert-types';
1
+ import type { AlertEvent, AlertRule } from './alert-types.js';
2
2
  export type AlertEngineOptions<TData> = {
3
3
  rules: AlertRule[];
4
4
  getRowId: (row: TData) => string;
@@ -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>;
@@ -1,4 +1,4 @@
1
- import { evaluatePredicate } from '../expressions/evaluate';
1
+ import { evaluatePredicate } from '../expressions/evaluate.js';
2
2
  /** Which action kinds paint onto cells. */
3
3
  const STYLING_KINDS = new Set(['badge', 'highlight']);
4
4
  /**
@@ -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
  /**