@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,8 +1,8 @@
|
|
|
1
1
|
type EditRow = Record<string, unknown>;
|
|
2
2
|
import { type CellEditorOption } from '@svgrid/grid';
|
|
3
|
-
import { type EntitySchema, type FormSection } from './schema';
|
|
4
|
-
import { type EditMode } from './edit-panel';
|
|
5
|
-
import type { RelationLookup } from './sources/relation-lookup';
|
|
3
|
+
import { type EntitySchema, type FormSection } from './schema.js';
|
|
4
|
+
import { type EditMode } from './edit-panel.js';
|
|
5
|
+
import type { RelationLookup } from './sources/relation-lookup.js';
|
|
6
6
|
declare function $$render<TData extends EditRow>(): {
|
|
7
7
|
props: {
|
|
8
8
|
schema: EntitySchema<TData>;
|
|
@@ -1,116 +1,116 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
type MdRow = Record<string, unknown>
|
|
3
|
-
</script>
|
|
4
|
-
|
|
5
|
-
<script lang="ts" generics="TParent extends MdRow, TChild extends MdRow">
|
|
6
|
-
/**
|
|
7
|
-
* SvGridMasterDetail - expand a master row into a nested grid of related
|
|
8
|
-
* records. A feature of the grid's data stack (built on SvGrid's own
|
|
9
|
-
* `isDetailRow` / `renderDetailRow`), not a separate widget. Click a master
|
|
10
|
-
* row to expand or collapse its detail region.
|
|
11
|
-
*
|
|
12
|
-
* Minimal wire-up:
|
|
13
|
-
* <SvGridMasterDetail
|
|
14
|
-
* schema={orderSchema}
|
|
15
|
-
* data={orders}
|
|
16
|
-
* detailSchema={lineItemSchema}
|
|
17
|
-
* getChildren={(order) => lineItems.filter((li) => li.orderId === order.id)}
|
|
18
|
-
* />
|
|
19
|
-
*/
|
|
20
|
-
import { SvGrid } from '@svgrid/grid'
|
|
21
|
-
import { resolveIdField, schemaToColumns, type EntitySchema } from './schema'
|
|
22
|
-
import { buildDisplayRows, isDetailRow, toggleExpanded, type DetailRow } from './master-detail'
|
|
23
|
-
|
|
24
|
-
type Props = {
|
|
25
|
-
/** The master entity. */
|
|
26
|
-
schema: EntitySchema<TParent>
|
|
27
|
-
/** Master rows. */
|
|
28
|
-
data: ReadonlyArray<TParent>
|
|
29
|
-
/** The detail entity, rendered in the nested grid. */
|
|
30
|
-
detailSchema: EntitySchema<TChild>
|
|
31
|
-
/** Return the child rows for a given master row. */
|
|
32
|
-
getChildren: (parent: TParent) => ReadonlyArray<TChild>
|
|
33
|
-
/** Height of the outer grid. Default 320. */
|
|
34
|
-
containerHeight?: number | string
|
|
35
|
-
/** Height of each nested detail grid. Default 200. */
|
|
36
|
-
detailHeight?: number | string
|
|
37
|
-
/** When set, a parent row click calls this (with the row id) to drill into a
|
|
38
|
-
* detail page, instead of expanding the inline child grid. */
|
|
39
|
-
onParentClick?: (id: string) => void
|
|
40
|
-
/** Stretch columns to fill the width, like a standard grid. Default `true` so the
|
|
41
|
-
* master + detail cells match a plain `<SvGrid>` instead of using natural widths. */
|
|
42
|
-
fitColumns?: boolean
|
|
43
|
-
/** Row height (px) - keep in sync with your other grids. Defaults to the grid's own 30. */
|
|
44
|
-
rowHeight?: number
|
|
45
|
-
/** Zebra-stripe the rows (match a striped grid). */
|
|
46
|
-
zebraRows?: boolean
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
let {
|
|
50
|
-
schema,
|
|
51
|
-
data,
|
|
52
|
-
detailSchema,
|
|
53
|
-
getChildren,
|
|
54
|
-
containerHeight = 320,
|
|
55
|
-
detailHeight = 200,
|
|
56
|
-
onParentClick,
|
|
57
|
-
fitColumns = true,
|
|
58
|
-
rowHeight,
|
|
59
|
-
zebraRows = false,
|
|
60
|
-
}: Props = $props()
|
|
61
|
-
|
|
62
|
-
const parentIdOf = (p: TParent) => String(p[resolveIdField(schema)])
|
|
63
|
-
const columns = $derived(schemaToColumns(schema))
|
|
64
|
-
const detailColumns = $derived(schemaToColumns(detailSchema))
|
|
65
|
-
|
|
66
|
-
let expanded = $state<Set<string>>(new Set())
|
|
67
|
-
// Detail rows are woven in; SvGrid renders them full-width via isDetailRow.
|
|
68
|
-
const displayRows = $derived(buildDisplayRows(data, expanded, parentIdOf) as unknown as TParent[])
|
|
69
|
-
|
|
70
|
-
function handleRowClick(row: unknown) {
|
|
71
|
-
if (isDetailRow(row)) return
|
|
72
|
-
// When wired to a detail page, a parent row navigates there (the detail page
|
|
73
|
-
// shows this record's children); otherwise it expands the child grid inline.
|
|
74
|
-
if (onParentClick) { onParentClick(parentIdOf(row as TParent)); return }
|
|
75
|
-
expanded = toggleExpanded(expanded, parentIdOf(row as TParent))
|
|
76
|
-
}
|
|
77
|
-
</script>
|
|
78
|
-
|
|
79
|
-
<SvGrid
|
|
80
|
-
data={displayRows}
|
|
81
|
-
{columns}
|
|
82
|
-
{containerHeight}
|
|
83
|
-
{fitColumns}
|
|
84
|
-
{rowHeight}
|
|
85
|
-
{zebraRows}
|
|
86
|
-
virtualization={false}
|
|
87
|
-
isDetailRow={(row) => isDetailRow(row)}
|
|
88
|
-
onRowClick={(e) => handleRowClick(e.row)}
|
|
89
|
-
>
|
|
90
|
-
{#snippet renderDetailRow({ row })}
|
|
91
|
-
{@const parent = (row as unknown as DetailRow<TParent>).parent}
|
|
92
|
-
<div class="sv-md-detail">
|
|
93
|
-
<SvGrid data={getChildren(parent)} columns={detailColumns} containerHeight={detailHeight} {fitColumns} {rowHeight} {zebraRows} />
|
|
94
|
-
</div>
|
|
95
|
-
{/snippet}
|
|
96
|
-
</SvGrid>
|
|
97
|
-
|
|
98
|
-
<style>
|
|
99
|
-
/* `:global` because this div lives in the `renderDetailRow` snippet, which SvGrid
|
|
100
|
-
renders inside ITS OWN tree - a scoped rule can get pruned / not match there, which
|
|
101
|
-
left the detail region with no padding / background. Global keeps it reliable. */
|
|
102
|
-
:global(.sv-md-detail) {
|
|
103
|
-
/* Sit the detail as a separated, inset card below its master row - the margin
|
|
104
|
-
spaces it off the surrounding master rows; the radius + border read as a nested block. */
|
|
105
|
-
margin: 10px 12px;
|
|
106
|
-
padding: 12px 14px;
|
|
107
|
-
/* Fall back to the themed header surface (not a fixed light grey) so the
|
|
108
|
-
detail region tracks light/dark - `--sg-bg-subtle` is unset by default,
|
|
109
|
-
which used to leave this white on every dark theme. */
|
|
110
|
-
background: var(--sg-bg-subtle, var(--sg-header-bg, #f8fafc));
|
|
111
|
-
color: var(--sg-fg, inherit);
|
|
112
|
-
border: 1px solid var(--sg-border, #e2e8f0);
|
|
113
|
-
border-left: 3px solid var(--sg-accent, #2563eb);
|
|
114
|
-
border-radius: 8px;
|
|
115
|
-
}
|
|
116
|
-
</style>
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
type MdRow = Record<string, unknown>
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<script lang="ts" generics="TParent extends MdRow, TChild extends MdRow">
|
|
6
|
+
/**
|
|
7
|
+
* SvGridMasterDetail - expand a master row into a nested grid of related
|
|
8
|
+
* records. A feature of the grid's data stack (built on SvGrid's own
|
|
9
|
+
* `isDetailRow` / `renderDetailRow`), not a separate widget. Click a master
|
|
10
|
+
* row to expand or collapse its detail region.
|
|
11
|
+
*
|
|
12
|
+
* Minimal wire-up:
|
|
13
|
+
* <SvGridMasterDetail
|
|
14
|
+
* schema={orderSchema}
|
|
15
|
+
* data={orders}
|
|
16
|
+
* detailSchema={lineItemSchema}
|
|
17
|
+
* getChildren={(order) => lineItems.filter((li) => li.orderId === order.id)}
|
|
18
|
+
* />
|
|
19
|
+
*/
|
|
20
|
+
import { SvGrid } from '@svgrid/grid'
|
|
21
|
+
import { resolveIdField, schemaToColumns, type EntitySchema } from './schema'
|
|
22
|
+
import { buildDisplayRows, isDetailRow, toggleExpanded, type DetailRow } from './master-detail'
|
|
23
|
+
|
|
24
|
+
type Props = {
|
|
25
|
+
/** The master entity. */
|
|
26
|
+
schema: EntitySchema<TParent>
|
|
27
|
+
/** Master rows. */
|
|
28
|
+
data: ReadonlyArray<TParent>
|
|
29
|
+
/** The detail entity, rendered in the nested grid. */
|
|
30
|
+
detailSchema: EntitySchema<TChild>
|
|
31
|
+
/** Return the child rows for a given master row. */
|
|
32
|
+
getChildren: (parent: TParent) => ReadonlyArray<TChild>
|
|
33
|
+
/** Height of the outer grid. Default 320. */
|
|
34
|
+
containerHeight?: number | string
|
|
35
|
+
/** Height of each nested detail grid. Default 200. */
|
|
36
|
+
detailHeight?: number | string
|
|
37
|
+
/** When set, a parent row click calls this (with the row id) to drill into a
|
|
38
|
+
* detail page, instead of expanding the inline child grid. */
|
|
39
|
+
onParentClick?: (id: string) => void
|
|
40
|
+
/** Stretch columns to fill the width, like a standard grid. Default `true` so the
|
|
41
|
+
* master + detail cells match a plain `<SvGrid>` instead of using natural widths. */
|
|
42
|
+
fitColumns?: boolean
|
|
43
|
+
/** Row height (px) - keep in sync with your other grids. Defaults to the grid's own 30. */
|
|
44
|
+
rowHeight?: number
|
|
45
|
+
/** Zebra-stripe the rows (match a striped grid). */
|
|
46
|
+
zebraRows?: boolean
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
let {
|
|
50
|
+
schema,
|
|
51
|
+
data,
|
|
52
|
+
detailSchema,
|
|
53
|
+
getChildren,
|
|
54
|
+
containerHeight = 320,
|
|
55
|
+
detailHeight = 200,
|
|
56
|
+
onParentClick,
|
|
57
|
+
fitColumns = true,
|
|
58
|
+
rowHeight,
|
|
59
|
+
zebraRows = false,
|
|
60
|
+
}: Props = $props()
|
|
61
|
+
|
|
62
|
+
const parentIdOf = (p: TParent) => String(p[resolveIdField(schema)])
|
|
63
|
+
const columns = $derived(schemaToColumns(schema))
|
|
64
|
+
const detailColumns = $derived(schemaToColumns(detailSchema))
|
|
65
|
+
|
|
66
|
+
let expanded = $state<Set<string>>(new Set())
|
|
67
|
+
// Detail rows are woven in; SvGrid renders them full-width via isDetailRow.
|
|
68
|
+
const displayRows = $derived(buildDisplayRows(data, expanded, parentIdOf) as unknown as TParent[])
|
|
69
|
+
|
|
70
|
+
function handleRowClick(row: unknown) {
|
|
71
|
+
if (isDetailRow(row)) return
|
|
72
|
+
// When wired to a detail page, a parent row navigates there (the detail page
|
|
73
|
+
// shows this record's children); otherwise it expands the child grid inline.
|
|
74
|
+
if (onParentClick) { onParentClick(parentIdOf(row as TParent)); return }
|
|
75
|
+
expanded = toggleExpanded(expanded, parentIdOf(row as TParent))
|
|
76
|
+
}
|
|
77
|
+
</script>
|
|
78
|
+
|
|
79
|
+
<SvGrid
|
|
80
|
+
data={displayRows}
|
|
81
|
+
{columns}
|
|
82
|
+
{containerHeight}
|
|
83
|
+
{fitColumns}
|
|
84
|
+
{rowHeight}
|
|
85
|
+
{zebraRows}
|
|
86
|
+
virtualization={false}
|
|
87
|
+
isDetailRow={(row) => isDetailRow(row)}
|
|
88
|
+
onRowClick={(e) => handleRowClick(e.row)}
|
|
89
|
+
>
|
|
90
|
+
{#snippet renderDetailRow({ row })}
|
|
91
|
+
{@const parent = (row as unknown as DetailRow<TParent>).parent}
|
|
92
|
+
<div class="sv-md-detail">
|
|
93
|
+
<SvGrid data={getChildren(parent)} columns={detailColumns} containerHeight={detailHeight} {fitColumns} {rowHeight} {zebraRows} />
|
|
94
|
+
</div>
|
|
95
|
+
{/snippet}
|
|
96
|
+
</SvGrid>
|
|
97
|
+
|
|
98
|
+
<style>
|
|
99
|
+
/* `:global` because this div lives in the `renderDetailRow` snippet, which SvGrid
|
|
100
|
+
renders inside ITS OWN tree - a scoped rule can get pruned / not match there, which
|
|
101
|
+
left the detail region with no padding / background. Global keeps it reliable. */
|
|
102
|
+
:global(.sv-md-detail) {
|
|
103
|
+
/* Sit the detail as a separated, inset card below its master row - the margin
|
|
104
|
+
spaces it off the surrounding master rows; the radius + border read as a nested block. */
|
|
105
|
+
margin: 10px 12px;
|
|
106
|
+
padding: 12px 14px;
|
|
107
|
+
/* Fall back to the themed header surface (not a fixed light grey) so the
|
|
108
|
+
detail region tracks light/dark - `--sg-bg-subtle` is unset by default,
|
|
109
|
+
which used to leave this white on every dark theme. */
|
|
110
|
+
background: var(--sg-bg-subtle, var(--sg-header-bg, #f8fafc));
|
|
111
|
+
color: var(--sg-fg, inherit);
|
|
112
|
+
border: 1px solid var(--sg-border, #e2e8f0);
|
|
113
|
+
border-left: 3px solid var(--sg-accent, #2563eb);
|
|
114
|
+
border-radius: 8px;
|
|
115
|
+
}
|
|
116
|
+
</style>
|