@svgrid/grid 2.1.22 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/README.md +9 -2
  2. package/dist/DockNodeView.svelte +306 -0
  3. package/dist/DockNodeView.svelte.d.ts +7 -0
  4. package/dist/DockPopoutHost.svelte +17 -0
  5. package/dist/DockPopoutHost.svelte.d.ts +14 -0
  6. package/dist/FlexRender.svelte +96 -96
  7. package/dist/GridFooter.svelte +178 -178
  8. package/dist/GridMenus.svelte +83 -3
  9. package/dist/SvAutoComplete.svelte +5 -3
  10. package/dist/SvCarousel.svelte +141 -163
  11. package/dist/SvColorInput.svelte +187 -186
  12. package/dist/SvColorInput.svelte.d.ts +1 -1
  13. package/dist/SvComboBox.svelte +7 -3
  14. package/dist/SvCommand.svelte +28 -85
  15. package/dist/SvContextMenu.svelte +116 -116
  16. package/dist/SvCountryInput.svelte +1 -1
  17. package/dist/SvDateRangeInput.svelte +1 -1
  18. package/dist/SvDateTimePicker.svelte +9 -3
  19. package/dist/SvDateTimePicker.svelte.d.ts +3 -0
  20. package/dist/SvDockLayout.svelte +244 -0
  21. package/dist/SvDockLayout.svelte.d.ts +77 -0
  22. package/dist/SvDockManager.svelte +922 -0
  23. package/dist/SvDockManager.svelte.d.ts +106 -0
  24. package/dist/SvDrawer.svelte +250 -228
  25. package/dist/SvDrawer.svelte.d.ts +4 -0
  26. package/dist/SvDropDownList.svelte +85 -13
  27. package/dist/SvDropDownList.svelte.d.ts +3 -0
  28. package/dist/SvField.svelte +21 -4
  29. package/dist/SvField.svelte.d.ts +1 -0
  30. package/dist/SvForm.svelte +201 -91
  31. package/dist/SvForm.svelte.d.ts +15 -22
  32. package/dist/SvGrid.controller.svelte.d.ts +32 -1
  33. package/dist/SvGrid.controller.svelte.js +156 -27
  34. package/dist/SvGrid.css +193 -5
  35. package/dist/SvGrid.svelte +3131 -2786
  36. package/dist/SvGrid.types.d.ts +452 -1
  37. package/dist/SvGridBoard.svelte +2339 -2339
  38. package/dist/SvGridChart.svelte +1724 -1724
  39. package/dist/SvGridChartPanel.svelte +485 -485
  40. package/dist/SvGridDropdown.svelte +689 -682
  41. package/dist/SvGridSelect.svelte +1 -0
  42. package/dist/SvGroupCell.svelte +109 -109
  43. package/dist/SvListBox.svelte +36 -14
  44. package/dist/SvMaskedInput.svelte +4 -3
  45. package/dist/SvMaskedInput.svelte.d.ts +1 -1
  46. package/dist/SvMenu.svelte +124 -124
  47. package/dist/SvMenuList.svelte +117 -165
  48. package/dist/SvMenuList.svelte.d.ts +2 -13
  49. package/dist/SvModal.svelte +12 -29
  50. package/dist/SvMultiSelect.svelte +1 -0
  51. package/dist/SvNumberInput.svelte +131 -130
  52. package/dist/SvNumberInput.svelte.d.ts +1 -1
  53. package/dist/SvOtpInput.svelte +158 -158
  54. package/dist/SvPagination.svelte +18 -18
  55. package/dist/SvPasswordInput.svelte +3 -2
  56. package/dist/SvPasswordInput.svelte.d.ts +1 -1
  57. package/dist/SvPhoneInput.svelte +3 -2
  58. package/dist/SvPhoneInput.svelte.d.ts +1 -1
  59. package/dist/SvPopover.svelte +139 -139
  60. package/dist/SvRowGroupPanel.svelte +170 -170
  61. package/dist/SvScrollArea.svelte +61 -61
  62. package/dist/SvStepper.svelte +6 -9
  63. package/dist/SvTagsInput.svelte +3 -2
  64. package/dist/SvTagsInput.svelte.d.ts +1 -1
  65. package/dist/SvTooltip.svelte +127 -138
  66. package/dist/SvTour.svelte +204 -176
  67. package/dist/SvTree.svelte +377 -377
  68. package/dist/SvTreeSelect.svelte +230 -229
  69. package/dist/build-api.js +76 -54
  70. package/dist/cdn/svgrid.js +10913 -6450
  71. package/dist/cdn/svgrid.svelte-external.js +9628 -5481
  72. package/dist/chart-export.js +8 -8
  73. package/dist/columns.js +6 -0
  74. package/dist/conditional-formatting.d.ts +67 -3
  75. package/dist/conditional-formatting.js +124 -17
  76. package/dist/createCarousel.svelte.d.ts +72 -0
  77. package/dist/createCarousel.svelte.js +80 -0
  78. package/dist/createCommand.svelte.d.ts +62 -0
  79. package/dist/createCommand.svelte.js +109 -0
  80. package/dist/createForm.svelte.d.ts +62 -0
  81. package/dist/createForm.svelte.js +374 -0
  82. package/dist/createMenu.svelte.d.ts +88 -0
  83. package/dist/createMenu.svelte.js +153 -0
  84. package/dist/createOverlay.svelte.d.ts +38 -0
  85. package/dist/createOverlay.svelte.js +68 -0
  86. package/dist/createPagination.d.ts +74 -0
  87. package/dist/createPagination.js +71 -0
  88. package/dist/createPopoverSelect.svelte.js +6 -12
  89. package/dist/createStepper.d.ts +44 -0
  90. package/dist/createStepper.js +26 -0
  91. package/dist/createTooltip.svelte.d.ts +32 -0
  92. package/dist/createTooltip.svelte.js +61 -0
  93. package/dist/datetime/timezone.d.ts +36 -0
  94. package/dist/datetime/timezone.js +110 -0
  95. package/dist/dock-context.d.ts +52 -0
  96. package/dist/dock-context.js +1 -0
  97. package/dist/dock-manager-model.d.ts +136 -0
  98. package/dist/dock-manager-model.js +514 -0
  99. package/dist/dock-model.d.ts +105 -0
  100. package/dist/dock-model.js +288 -0
  101. package/dist/dock-popout.d.ts +30 -0
  102. package/dist/dock-popout.js +81 -0
  103. package/dist/editor-contract.d.ts +2 -0
  104. package/dist/filter-operators.d.ts +6 -0
  105. package/dist/filter-operators.js +35 -2
  106. package/dist/filtering/excel-filters.d.ts +18 -1
  107. package/dist/filtering/excel-filters.js +56 -0
  108. package/dist/form-field.d.ts +73 -0
  109. package/dist/form-field.js +15 -0
  110. package/dist/index.d.ts +25 -5
  111. package/dist/index.js +40 -4
  112. package/dist/list-nav.d.ts +18 -0
  113. package/dist/list-nav.js +30 -0
  114. package/dist/list-option.d.ts +2 -0
  115. package/dist/menu-item.d.ts +20 -0
  116. package/dist/menu-item.js +1 -0
  117. package/dist/menus.d.ts +5 -0
  118. package/dist/menus.js +68 -16
  119. package/dist/panel-resize.d.ts +25 -0
  120. package/dist/panel-resize.js +40 -0
  121. package/dist/popover.d.ts +29 -3
  122. package/dist/popover.js +22 -6
  123. package/dist/recurrence.d.ts +33 -7
  124. package/dist/recurrence.js +151 -13
  125. package/dist/row-drag.d.ts +8 -0
  126. package/dist/row-drag.js +11 -0
  127. package/dist/scheduler-ical.d.ts +30 -0
  128. package/dist/scheduler-ical.js +180 -0
  129. package/dist/scheduler-model.d.ts +269 -0
  130. package/dist/scheduler-model.js +602 -0
  131. package/dist/scheduler-view.svelte.d.ts +22 -0
  132. package/dist/scheduler-view.svelte.js +13 -0
  133. package/dist/spreadsheet.js +20 -12
  134. package/dist/ui-app.types.d.ts +3 -0
  135. package/package.json +14 -10
  136. package/src/DockNodeView.svelte +306 -0
  137. package/src/DockPopoutHost.svelte +17 -0
  138. package/src/FlexRender.svelte +96 -96
  139. package/src/GridFooter.svelte +178 -178
  140. package/src/GridMenus.svelte +83 -3
  141. package/src/SvAutoComplete.svelte +5 -3
  142. package/src/SvCarousel.svelte +141 -163
  143. package/src/SvCarousel.test.ts +68 -0
  144. package/src/SvColorInput.svelte +187 -186
  145. package/src/SvComboBox.svelte +7 -3
  146. package/src/SvCommand.svelte +28 -85
  147. package/src/SvCommand.test.ts +78 -0
  148. package/src/SvContextMenu.svelte +116 -116
  149. package/src/SvCountryInput.svelte +1 -1
  150. package/src/SvDateRangeInput.svelte +1 -1
  151. package/src/SvDateTimePicker.svelte +9 -3
  152. package/src/SvDockLayout.svelte +244 -0
  153. package/src/SvDockManager.svelte +922 -0
  154. package/src/SvDrawer.svelte +250 -228
  155. package/src/SvDropDownList.svelte +85 -13
  156. package/src/SvField.svelte +21 -4
  157. package/src/SvForm.svelte +201 -91
  158. package/src/SvForm.test.ts +299 -0
  159. package/src/SvGrid.controller.svelte.ts +3158 -3034
  160. package/src/SvGrid.css +193 -5
  161. package/src/SvGrid.svelte +3131 -2786
  162. package/src/SvGrid.types.ts +1489 -1027
  163. package/src/SvGridBoard.svelte +2339 -2339
  164. package/src/SvGridChart.svelte +1724 -1724
  165. package/src/SvGridChartPanel.svelte +485 -485
  166. package/src/SvGridDropdown.svelte +689 -682
  167. package/src/SvGridSelect.svelte +1 -0
  168. package/src/SvGroupCell.svelte +109 -109
  169. package/src/SvListBox.svelte +36 -14
  170. package/src/SvMaskedInput.svelte +4 -3
  171. package/src/SvMenu.svelte +124 -124
  172. package/src/SvMenu.test.ts +97 -73
  173. package/src/SvMenuList.svelte +117 -165
  174. package/src/SvModal.svelte +12 -29
  175. package/src/SvModal.test.ts +82 -0
  176. package/src/SvMultiSelect.svelte +1 -0
  177. package/src/SvNumberInput.svelte +131 -130
  178. package/src/SvOtpInput.svelte +158 -158
  179. package/src/SvPagination.svelte +18 -18
  180. package/src/SvPasswordInput.svelte +3 -2
  181. package/src/SvPhoneInput.svelte +3 -2
  182. package/src/SvPopover.svelte +139 -139
  183. package/src/SvRowGroupPanel.svelte +170 -170
  184. package/src/SvScrollArea.svelte +61 -61
  185. package/src/SvStepper.svelte +6 -9
  186. package/src/SvTagsInput.svelte +3 -2
  187. package/src/SvTooltip.svelte +127 -138
  188. package/src/SvTooltip.test.ts +73 -0
  189. package/src/SvTour.svelte +204 -176
  190. package/src/SvTree.svelte +377 -377
  191. package/src/SvTreeSelect.svelte +230 -229
  192. package/src/a11y.contract.test.ts +49 -49
  193. package/src/a11y.test.ts +59 -59
  194. package/src/a11y.ts +61 -61
  195. package/src/build-api.ts +870 -847
  196. package/src/cell-formatting.ts +169 -169
  197. package/src/cell-render.ts +469 -469
  198. package/src/chart-export.ts +201 -201
  199. package/src/chart.ts +2296 -2296
  200. package/src/collaboration.test.ts +104 -104
  201. package/src/collaboration.ts +167 -167
  202. package/src/columns.ts +5 -0
  203. package/src/conditional-formatting.test.ts +104 -0
  204. package/src/conditional-formatting.ts +176 -19
  205. package/src/core.performance.test.ts +30 -30
  206. package/src/core.ts +1111 -1111
  207. package/src/createAutocomplete.svelte.ts +132 -132
  208. package/src/createCarousel.svelte.ts +104 -0
  209. package/src/createCombobox.svelte.ts +179 -179
  210. package/src/createCommand.svelte.ts +125 -0
  211. package/src/createCountryInput.svelte.ts +157 -157
  212. package/src/createDropdownList.svelte.ts +162 -162
  213. package/src/createForm.svelte.ts +333 -0
  214. package/src/createGrid.svelte.ts +42 -42
  215. package/src/createGrid.test.ts +10 -10
  216. package/src/createGridState.svelte.ts +17 -17
  217. package/src/createMenu.svelte.ts +202 -0
  218. package/src/createOverlay.svelte.ts +101 -0
  219. package/src/createPagination.test.ts +65 -0
  220. package/src/createPagination.ts +84 -0
  221. package/src/createPopoverSelect.svelte.ts +206 -210
  222. package/src/createStepper.test.ts +62 -0
  223. package/src/createStepper.ts +61 -0
  224. package/src/createTooltip.svelte.ts +86 -0
  225. package/src/createTree.svelte.ts +319 -319
  226. package/src/datetime/timezone.test.ts +69 -0
  227. package/src/datetime/timezone.ts +134 -0
  228. package/src/dock-context.ts +47 -0
  229. package/src/dock-manager-model.test.ts +275 -0
  230. package/src/dock-manager-model.ts +593 -0
  231. package/src/dock-model.test.ts +163 -0
  232. package/src/dock-model.ts +368 -0
  233. package/src/dock-popout.ts +94 -0
  234. package/src/editing.test.ts +859 -859
  235. package/src/editing.ts +675 -675
  236. package/src/editor-contract.ts +2 -0
  237. package/src/export-data-api.test.ts +126 -126
  238. package/src/export-format.test.ts +107 -107
  239. package/src/export-format.ts +598 -598
  240. package/src/filter-operators.test.ts +59 -0
  241. package/src/filter-operators.ts +35 -2
  242. package/src/filtering/excel-filters.test.ts +86 -1
  243. package/src/filtering/excel-filters.ts +65 -0
  244. package/src/flex-render.ts +3 -3
  245. package/src/form-field.ts +87 -0
  246. package/src/index.ts +623 -469
  247. package/src/keyboard.test.ts +59 -59
  248. package/src/keyboard.ts +97 -97
  249. package/src/list-nav.test.ts +49 -0
  250. package/src/list-nav.ts +29 -0
  251. package/src/list-option.ts +2 -0
  252. package/src/menu-item.ts +21 -0
  253. package/src/menus.test.ts +48 -0
  254. package/src/menus.ts +639 -582
  255. package/src/merge-objects.ts +48 -48
  256. package/src/overlays.test.ts +90 -90
  257. package/src/panel-resize.ts +52 -0
  258. package/src/popover.bounds.test.ts +93 -0
  259. package/src/popover.ts +51 -7
  260. package/src/recurrence.test.ts +88 -1
  261. package/src/recurrence.ts +166 -15
  262. package/src/render-component.ts +28 -28
  263. package/src/row-drag.ts +10 -0
  264. package/src/scheduler-ical.test.ts +68 -0
  265. package/src/scheduler-ical.ts +180 -0
  266. package/src/scheduler-model.test.ts +546 -0
  267. package/src/scheduler-model.ts +853 -0
  268. package/src/scheduler-view.svelte.ts +33 -0
  269. package/src/selection.test.ts +754 -754
  270. package/src/selection.ts +600 -600
  271. package/src/server-data-source.test.ts +289 -289
  272. package/src/server-data-source.ts +413 -413
  273. package/src/sparkline.test.ts +68 -68
  274. package/src/sparkline.ts +169 -169
  275. package/src/spreadsheet.test.ts +489 -489
  276. package/src/spreadsheet.ts +312 -304
  277. package/src/static-functions.ts +11 -11
  278. package/src/subscribe.ts +38 -38
  279. package/src/svgrid-wrapper.types.ts +501 -501
  280. package/src/svgrid.behavior.test.ts +706 -706
  281. package/src/svgrid.charting.test.ts +527 -527
  282. package/src/svgrid.effect-driven-filter.svelte.test.ts +116 -0
  283. package/src/svgrid.features.test.ts +157 -157
  284. package/src/svgrid.new-features.wrapper.test.ts +251 -251
  285. package/src/svgrid.wrapper.test.ts +40 -40
  286. package/src/test-setup.ts +62 -62
  287. package/src/themes/index.ts +159 -159
  288. package/src/ui-app.types.ts +3 -0
  289. package/src/virtual.test.ts +6 -4
  290. package/src/virtualization/column-virtualizer.test.ts +27 -27
  291. package/src/virtualization/column-virtualizer.ts +30 -30
  292. package/src/virtualization/svelte-virtualizer.svelte.ts +26 -26
  293. package/src/virtualization/types.ts +30 -30
  294. package/src/virtualization/virtualizer.test.ts +47 -47
  295. package/src/virtualization/virtualizer.ts +296 -296
@@ -2,6 +2,51 @@ import type { Snippet } from "svelte";
2
2
  import type { CellEditorType, ColumnDef, RowData, SvGridApi, TableFeatures } from "./index";
3
3
  import type { ConditionalFormat } from "./conditional-formatting";
4
4
  import type { MenuItem } from "./SvMenuList.svelte";
5
+ /** The calendar views the scheduler can render. {@link SchedulerConfig}. The
6
+ * `timeline*` views are horizontal: time runs left→right and resources are
7
+ * rows (a single "All" row without `resourceField`). */
8
+ export type SchedulerView = "month" | "week" | "day" | "agenda" | "timelineDay" | "timelineWeek" | "timelineMonth" | "timelineYear";
9
+ /**
10
+ * How overlapping ("colliding") time-grid events are laid out:
11
+ * - `split` - every collision divides the column width evenly (default).
12
+ * - `cap` - show up to `maxColumns` columns; the rest collapse into a
13
+ * clickable `+N more` overflow tile.
14
+ * - `stack` - overlapping events overlap with a horizontal offset + z-order
15
+ * instead of shrinking, so each stays readable (hover to raise).
16
+ */
17
+ export type SchedulerCollisionMode = "split" | "cap" | "stack";
18
+ /** A scheduler resource - a person / room / machine an event can be assigned to. */
19
+ export type SchedulerResource = {
20
+ id: string;
21
+ title?: string;
22
+ color?: string;
23
+ /**
24
+ * This resource's own working windows (hours), optionally per weekday - e.g. a
25
+ * doctor available Mon/Wed/Fri 9-13 and Tue/Thu 14-18. Overrides the global
26
+ * `businessHours` / `nonWorkingDays` for this resource's columns: time outside
27
+ * every matching window is shaded, and (with `restrictToBusinessHours`)
28
+ * non-bookable. A weekday with no matching window is a full day off.
29
+ */
30
+ availability?: ReadonlyArray<{
31
+ days?: ReadonlyArray<number>;
32
+ start: number;
33
+ end: number;
34
+ }>;
35
+ /**
36
+ * Per-date overrides to this resource's weekly `availability` - a specific day
37
+ * off (`off: true`, e.g. vacation) or custom hours (`windows`) for that one
38
+ * date. Matched by calendar date; takes precedence over `availability` for the
39
+ * matching day.
40
+ */
41
+ dateOverrides?: ReadonlyArray<{
42
+ date: Date | number | string;
43
+ off?: boolean;
44
+ windows?: ReadonlyArray<{
45
+ start: number;
46
+ end: number;
47
+ }>;
48
+ }>;
49
+ };
5
50
  import type { ChartType, ChartSpec, ChartAnnotation, ChartReferenceLine } from "./chart";
6
51
  /** One aggregated bucket returned by a server-side `getAggregate`. */
7
52
  export type ChartAggregateBucket = {
@@ -422,6 +467,399 @@ export type BoardConfig<TFeatures extends TableFeatures = TableFeatures, TData e
422
467
  /** Called whenever the board layout changes, with the serializable state. */
423
468
  onLayoutChange?: (layout: BoardLayout) => void;
424
469
  };
470
+ /**
471
+ * The built-in event detail drawer for the scheduler. Set `scheduler.drawer`
472
+ * (`true` for all fields, or this object) and clicking an event opens a drawer
473
+ * with an `SvForm` of its fields. Mirrors {@link BoardDrawerConfig}.
474
+ */
475
+ export type SchedulerDrawerConfig<TData extends RowData = RowData> = {
476
+ /** Fields to show, in order. Omit for every column that has a `field`. */
477
+ fields?: ReadonlyArray<keyof TData & string>;
478
+ /** Drawer title - a string or derived from the row. Defaults to the title field. */
479
+ title?: string | ((row: TData) => string);
480
+ /** Which edge the drawer opens from. Defaults to `'right'`. */
481
+ side?: "right" | "left" | "top" | "bottom";
482
+ /** Drawer size (any CSS length). Defaults to `'380px'`. */
483
+ size?: string;
484
+ /** Save button label. Defaults to `'Save'`. */
485
+ submitLabel?: string;
486
+ /** Form columns inside the drawer. Defaults to `1`. */
487
+ columns?: number;
488
+ };
489
+ /** Emitted when an event is dragged to a new time (and/or resource). */
490
+ export type SchedulerEventMoveEvent<TData extends RowData = RowData> = {
491
+ /** The dragged row. */
492
+ row: TData;
493
+ /** New start / end after the move. */
494
+ start: Date;
495
+ end: Date;
496
+ /** Whether the event is all-day after the move. */
497
+ allDay: boolean;
498
+ /** Resource it came from (only with `resourceField`). */
499
+ fromResource?: string;
500
+ /** Resource it was dropped on (only with `resourceField`). */
501
+ toResource?: string;
502
+ };
503
+ /** Emitted when an event's start or end edge is dragged to resize it. */
504
+ export type SchedulerEventResizeEvent<TData extends RowData = RowData> = {
505
+ row: TData;
506
+ start: Date;
507
+ end: Date;
508
+ };
509
+ /**
510
+ * A drag-selected range (see `rangeSelectable`). `start`/`end` are a single
511
+ * CONTINUOUS datetime range - dragging across days makes it a longer span, not a
512
+ * per-day rectangle. `days` / `resourceIds` list the days / resources the range
513
+ * touched (for reference); `allDay` is true when the all-day row was dragged.
514
+ */
515
+ export type SchedulerRangeSelection = {
516
+ start: Date;
517
+ end: Date;
518
+ allDay?: boolean;
519
+ /** Every day the range touched (one entry for a within-a-day drag). */
520
+ days: Date[];
521
+ /** Every resource the range touched (empty without `resourceField`). */
522
+ resourceIds: string[];
523
+ };
524
+ /** Emitted when an event's built-in editor/drawer is saved. */
525
+ export type SchedulerEventCommitEvent<TData extends RowData = RowData> = {
526
+ row: TData;
527
+ /** Only the fields that changed, `{ field: newValue }`. */
528
+ changes: Record<string, unknown>;
529
+ /** The full set of edited field values. */
530
+ values: Record<string, unknown>;
531
+ };
532
+ /**
533
+ * One override of a single occurrence of a recurring event (stored in the row's
534
+ * `recurrenceExceptionsField`). `occurrenceStart` identifies the occurrence (its
535
+ * original start, like an iCal `RECURRENCE-ID`); `deleted` removes just that one,
536
+ * otherwise the given fields override it. Times are the same ISO / Date shape you
537
+ * store on the row.
538
+ */
539
+ export type SchedulerException = {
540
+ occurrenceStart: string | number | Date;
541
+ deleted?: boolean;
542
+ start?: string | number | Date;
543
+ end?: string | number | Date;
544
+ title?: string;
545
+ allDay?: boolean;
546
+ };
547
+ /** How a change to a recurring event should apply. */
548
+ export type SchedulerEditScope = "occurrence" | "following" | "series";
549
+ /**
550
+ * Fired when a single occurrence of a recurring event is edited or deleted (the
551
+ * user chose "This event"). Append/merge `exception` into the row's
552
+ * `recurrenceExceptionsField`; for `deleted` it carries `{ deleted: true }`.
553
+ */
554
+ export type SchedulerOccurrenceChangeEvent<TData extends RowData = RowData> = {
555
+ row: TData;
556
+ /** The occurrence's original start (its identity within the series). */
557
+ occurrenceStart: Date;
558
+ /** The override to store (already in real-instant time). */
559
+ exception: SchedulerException;
560
+ /**
561
+ * Which scope the user chose. `'occurrence'` (default): merge `exception` into
562
+ * the row. `'following'` ("this and all following"): split the series - stop
563
+ * the original series before `occurrenceStart` and start a NEW series at it
564
+ * carrying `exception`'s start/end/deleted. `'series'` never reaches here (it
565
+ * edits the base row directly). Handle `'following'` in your own data.
566
+ */
567
+ scope: SchedulerEditScope;
568
+ };
569
+ /**
570
+ * Turns the grid into a calendar / scheduler. Set `scheduler` and the grid
571
+ * renders its rows as events on a Month / Week / Day / Agenda calendar (bucketed
572
+ * by time, and optionally split into per-resource columns) instead of a table.
573
+ * Dragging an event fires {@link SchedulerConfig.onEventMove} where you reassign
574
+ * the start / end (and resource) on your own data. Like the Kanban board, it is
575
+ * a pure *view of the grid*: it renders the grid's filtered + sorted rows and
576
+ * writes back only through callbacks, never mutating your data.
577
+ */
578
+ export type SchedulerConfig<TFeatures extends TableFeatures = TableFeatures, TData extends RowData = RowData> = {
579
+ /** Field holding each event's start (`Date` | epoch-ms | ISO string). Required. */
580
+ startField: keyof TData & string;
581
+ /** Field holding the end. Omit to use `defaultDurationMin` from the start. */
582
+ endField?: keyof TData & string;
583
+ /** Boolean field marking an event as all-day (rendered in the all-day row). */
584
+ allDayField?: keyof TData & string;
585
+ /** Field for the event title. Defaults to the first column's field. */
586
+ titleField?: keyof TData & string;
587
+ /** Field holding a per-event accent color (any CSS color). Else `color`. */
588
+ colorField?: keyof TData & string;
589
+ /** Fallback accent color for every event. */
590
+ color?: string;
591
+ /**
592
+ * Field holding a SECONDARY accent color, rendered as a strip on the LEFT edge
593
+ * of the event - distinct from the main `colorField`. Lets an event encode two
594
+ * dimensions at once (e.g. main color = person, left strip = role).
595
+ */
596
+ secondaryColorField?: keyof TData & string;
597
+ /**
598
+ * Field holding a free/busy status that drives a distinct visual treatment
599
+ * (Outlook-style): `'busy'` (default solid), `'free'` (hollow / outline),
600
+ * `'tentative'` (hatched), `'oof'` / `'outOfOffice'` (distinct tint). Ties to
601
+ * iCal `STATUS`. Unrecognised values render as busy.
602
+ */
603
+ statusField?: keyof TData & string;
604
+ /**
605
+ * Field holding minutes-before-start for a reminder. When set (and the event
606
+ * is upcoming) the scheduler fires `onReminder` once as that lead time is
607
+ * crossed - pair it with a toast. Ties to iCal `VALARM`.
608
+ */
609
+ reminderField?: keyof TData & string;
610
+ /** Fired once when an event's reminder lead time is crossed (see `reminderField`). */
611
+ onReminder?: (row: TData, minutesUntil: number) => void;
612
+ /**
613
+ * Field holding a {@link RecurrenceRule} (or array) - the row renders as one
614
+ * event per matching day in view, keeping its time-of-day + duration.
615
+ */
616
+ recurrenceField?: keyof TData & string;
617
+ /**
618
+ * Field holding an array of {@link SchedulerException} - per-occurrence
619
+ * overrides of a recurring event (a moved / edited / deleted single instance).
620
+ * When set, editing a recurring occurrence offers "This event" vs "All events"
621
+ * and "This event" fires {@link onOccurrenceChange}.
622
+ */
623
+ recurrenceExceptionsField?: keyof TData & string;
624
+ /** Event length in minutes when a row has a start but no `endField`. Default 60. */
625
+ defaultDurationMin?: number;
626
+ /** Which views to offer in the toolbar. Default all four. */
627
+ views?: ReadonlyArray<SchedulerView>;
628
+ /** The view shown first. Default `'month'`. */
629
+ initialView?: SchedulerView;
630
+ /** The date the calendar opens on. Defaults to "today". */
631
+ initialDate?: Date | number | string;
632
+ /**
633
+ * Controlled anchor date - when this changes the calendar navigates to it (a
634
+ * mini date-picker or external "go to" can drive the view). Pair with
635
+ * {@link onNavigate} for two-way sync.
636
+ */
637
+ date?: Date | number | string;
638
+ /** Fired when the visible date changes (prev / next / today). */
639
+ onNavigate?: (date: Date) => void;
640
+ /** First day of the week, 0-6 (0 = Sunday). Default 0. */
641
+ weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
642
+ /** Time-grid slot size in minutes (week / day snap granularity). Default 30. */
643
+ slotMinutes?: number;
644
+ /**
645
+ * Slot sizes (minutes) offered as a runtime picker in the Week / Day time-grid
646
+ * ruler, e.g. `[60, 30, 15, 5]`. When set, a size selector appears in the
647
+ * toolbar and the ruler subdivides accordingly; the active size starts at
648
+ * `slotMinutes`. Omit to hide the picker (the ruler still uses `slotMinutes`).
649
+ */
650
+ slotSizes?: ReadonlyArray<number>;
651
+ /** First / last hour shown in the time-grid band (0-24). Default 0..24. */
652
+ dayStartHour?: number;
653
+ dayEndHour?: number;
654
+ /**
655
+ * Working-hours window (hours, e.g. `{ start: 9, end: 17 }`). Time outside it
656
+ * is shaded in the Week / Day time-grid. Visual only - see `disableConflicts`
657
+ * to enforce.
658
+ */
659
+ businessHours?: {
660
+ start: number;
661
+ end: number;
662
+ };
663
+ /** Weekday numbers (0 = Sun … 6 = Sat) shaded as non-working (e.g. `[0, 6]`). */
664
+ nonWorkingDays?: ReadonlyArray<number>;
665
+ /** Shade elapsed time on today's column (the past is "used up"). */
666
+ shadeUntilNow?: boolean;
667
+ /**
668
+ * Enforce the shaded time: reject a drag / resize / create that lands outside
669
+ * `businessHours` or on a `nonWorkingDays` day (snap back + flash). Without
670
+ * this the shading is a visual hint only.
671
+ */
672
+ restrictToBusinessHours?: boolean;
673
+ /**
674
+ * Prevent double-booking: dragging / resizing / creating an event so it
675
+ * overlaps another event **on the same resource** is rejected and reverted.
676
+ */
677
+ disableConflicts?: boolean;
678
+ /**
679
+ * Hard-blocked hour bands (e.g. a daily maintenance window `[{ start: 12, end: 13 }]`).
680
+ * Unlike `businessHours` these are ALWAYS non-bookable (drop / create rejected,
681
+ * no opt-in needed) and rendered as a distinct restricted (hatched) band.
682
+ */
683
+ restrictedHours?: ReadonlyArray<{
684
+ start: number;
685
+ end: number;
686
+ }>;
687
+ /** Specific calendar dates that are fully blocked (no bookings) - e.g. closures. */
688
+ restrictedDates?: ReadonlyArray<Date | number | string>;
689
+ /**
690
+ * Highlighted dates (holidays, launches …) - a coloured strip + optional label
691
+ * on that day's column / month cell. Decorative; does not block booking.
692
+ */
693
+ specialDates?: ReadonlyArray<{
694
+ date: Date | number | string;
695
+ label?: string;
696
+ color?: string;
697
+ }>;
698
+ /** Earliest navigable / bookable date. Prev-nav stops here and creates are blocked before it. */
699
+ minDate?: Date | number | string;
700
+ /** Latest navigable / bookable date. Next-nav stops here and creates are blocked after it. */
701
+ maxDate?: Date | number | string;
702
+ /**
703
+ * Cap concurrent events per resource at any moment: a drag / resize / create
704
+ * that would make more than N events overlap on the same resource is rejected.
705
+ */
706
+ maxEventsPerSlot?: number;
707
+ /**
708
+ * Enable **undo / redo** of drag-move + resize with `Ctrl/Cmd+Z` and
709
+ * `Ctrl/Cmd+Shift+Z` (or `Ctrl+Y`). The scheduler re-emits the move/resize
710
+ * callbacks with the reversed values, so your data follows.
711
+ */
712
+ history?: boolean;
713
+ /**
714
+ * Show the current-time indicator - a line across today's column(s) in the
715
+ * Week / Day time-grid and the Day timeline, tracking the local time. On by
716
+ * default; set to `false` to hide it.
717
+ */
718
+ nowIndicator?: boolean;
719
+ /**
720
+ * IANA time zone (e.g. `'America/New_York'`) the whole calendar is shown in -
721
+ * the hour ruler, event positions, day boundaries, all-day grouping and the
722
+ * now-line. Defaults to the browser's local zone. Event `start`/`end` must be
723
+ * instant-unambiguous (UTC / offset ISO or epoch ms) for this to be correct;
724
+ * bare local strings are read as wall-clock in this zone.
725
+ */
726
+ timeZone?: string;
727
+ /**
728
+ * Extra read-only hour rulers for other zones (a "world clock"), shown left of
729
+ * the primary ruler in the Week / Day time-grid. Each entry's `label` heads its
730
+ * column (defaults to a short zone abbreviation).
731
+ */
732
+ secondaryTimeZones?: ReadonlyArray<{
733
+ id: string;
734
+ label?: string;
735
+ }>;
736
+ /**
737
+ * How overlapping time-grid events are laid out. `split` (default) divides the
738
+ * width evenly per collision; `cap` shows up to `maxColumns` then a clickable
739
+ * `+N more` tile; `stack` overlaps them with an offset instead of shrinking.
740
+ */
741
+ collisionMode?: SchedulerCollisionMode;
742
+ /** For `collisionMode: 'cap'`: max side-by-side columns before overflow (min 2). Default 3. */
743
+ maxColumns?: number;
744
+ /** How many days the agenda view spans. Default 30. */
745
+ agendaDays?: number;
746
+ /**
747
+ * Field whose value groups events by resource (people, rooms, machines). In
748
+ * the Week / Day time-grid the columns split into resource x day groups; a
749
+ * resource filter/legend appears in every view. See {@link SchedulerResource}.
750
+ */
751
+ resourceField?: keyof TData & string;
752
+ /** Explicit, ordered resources (with colors). Omit to derive from the data. */
753
+ resources?: ReadonlyArray<SchedulerResource>;
754
+ /**
755
+ * Time-grid resource grouping order. `false` (default) groups by resource then
756
+ * day (resource-major); `true` groups by day then resource (date-major), like
757
+ * Smart's `groupByDate`. Only affects Week / Day when `resourceField` is set.
758
+ */
759
+ groupByDate?: boolean;
760
+ /** Timeline views only: width (px) of the left resource-label gutter. Default 160. */
761
+ resourceAreaWidth?: number;
762
+ /** `timelineDay` tick size + move/resize snap, in minutes. Default = `slotMinutes`. */
763
+ timelineSlotMinutes?: number;
764
+ /** Timeline views only: height (px) of one event lane inside a resource row. Default 26. */
765
+ timelineLaneHeight?: number;
766
+ /** Enable drag-to-move and edge-resize. Without it the calendar is read-only. */
767
+ editable?: boolean;
768
+ /** Fired when an event is dragged to a new time / resource. */
769
+ onEventMove?: (event: SchedulerEventMoveEvent<TData>) => void;
770
+ /** Fired when an event edge is dragged to resize it. */
771
+ onEventResize?: (event: SchedulerEventResizeEvent<TData>) => void;
772
+ /**
773
+ * Fired to create an event - double-clicking an empty slot, or confirming a
774
+ * pending range when no {@link onRangeSelect} is set. `allDay` is `true` when
775
+ * the slot / range is an all-day one (the all-day row, a month day cell, or a
776
+ * multi-day timeline zoom), so the handler can set the `allDayField`.
777
+ */
778
+ onEventAdd?: (start: Date, end: Date, resourceId?: string, allDay?: boolean) => void;
779
+ /**
780
+ * Fired when the event's Delete button is used. Setting this shows a Delete
781
+ * button in the detail drawer (and a `Delete` item is easy to add via
782
+ * `eventMenu`). Remove the row from your data in the handler.
783
+ */
784
+ onEventDelete?: (row: TData) => void;
785
+ /**
786
+ * Fired when a single occurrence of a recurring event is moved / resized /
787
+ * deleted with scope "This event". Merge `event.exception` into the row's
788
+ * `recurrenceExceptionsField` array (keyed by `occurrenceStart`).
789
+ */
790
+ onOccurrenceChange?: (event: SchedulerOccurrenceChangeEvent<TData>) => void;
791
+ /**
792
+ * Selecting empty cells: click or drag across the time-grid / timeline to mark
793
+ * a time range (and, across days / resources, a rectangle of cells). Arrow keys
794
+ * move the selection and `Shift`+arrows extend it. Marking only *marks* the
795
+ * range - it does NOT create anything. The event is created on an explicit
796
+ * confirm: press `Enter`, or right-click the selection and choose "Add Event".
797
+ * Confirming fires {@link onRangeSelect}, or falls back to `onEventAdd` for the
798
+ * first cell; `Escape` cancels the marker.
799
+ *
800
+ * On by default; set to `false` to disable.
801
+ */
802
+ rangeSelectable?: boolean;
803
+ /**
804
+ * Fired when a pending cell range is confirmed with `Enter` or the "Add Event"
805
+ * context menu (see {@link rangeSelectable}) - not on drag release.
806
+ */
807
+ onRangeSelect?: (selection: SchedulerRangeSelection) => void;
808
+ /**
809
+ * Multi-selecting existing events: Ctrl/Cmd-click toggles, Shift-click
810
+ * range-selects; a plain click clears. Selected events move together when one
811
+ * is dragged, and `Delete` removes them (via `onEventDelete`).
812
+ *
813
+ * On by default; set to `false` to disable.
814
+ */
815
+ eventSelectable?: boolean;
816
+ /** Fired when the set of multi-selected events changes. */
817
+ onEventSelectionChange?: (rows: TData[]) => void;
818
+ /**
819
+ * An "unscheduled" backlog list shown beside the Week / Day grid: drag an item
820
+ * onto the calendar to schedule it. Each item is `{ id, title, durationMin?,
821
+ * color? }`. Dropping fires {@link onSchedule} with the drop time + resource.
822
+ */
823
+ unscheduled?: ReadonlyArray<{
824
+ id: string;
825
+ title: string;
826
+ durationMin?: number;
827
+ color?: string;
828
+ }>;
829
+ /** Optional heading for the unscheduled backlog panel. Default "Unscheduled". */
830
+ backlogTitle?: string;
831
+ /** Fired when an unscheduled item is dropped on the grid - create an event from it. */
832
+ onSchedule?: (item: {
833
+ id: string;
834
+ title: string;
835
+ durationMin?: number;
836
+ color?: string;
837
+ }, start: Date, resourceId?: string) => void;
838
+ /**
839
+ * Fired when an event is dragged OFF the calendar onto the backlog panel -
840
+ * remove it from the schedule (and typically push it back to `unscheduled`).
841
+ * Requires the backlog panel (an `unscheduled` list) to be visible.
842
+ */
843
+ onUnschedule?: (row: TData) => void;
844
+ /** Custom event body. Receives the row. Omit for the built-in default (title). */
845
+ event?: Snippet<[TData]>;
846
+ /**
847
+ * Hover tooltip for an event. Set a `Snippet<[TData]>` for custom content, or
848
+ * `true` for the built-in tooltip (title + time + resource). Omit to disable.
849
+ */
850
+ tooltip?: boolean | Snippet<[TData]>;
851
+ /** Delay (ms) before the hover tooltip opens. Default 400. */
852
+ tooltipDelay?: number;
853
+ /** Built-in detail drawer: `true` for all fields, or a config object. */
854
+ drawer?: boolean | SchedulerDrawerConfig<TData>;
855
+ /** Fired when the drawer / editor is saved. */
856
+ onEventCommit?: (event: SchedulerEventCommitEvent<TData>) => void;
857
+ /** Right-click menu for an event. Return items or `undefined` to suppress. */
858
+ eventMenu?: (row: TData) => MenuItem[] | undefined;
859
+ /** Show the search box (binds to the grid's global filter). Default `true`. */
860
+ searchable?: boolean;
861
+ searchPlaceholder?: string;
862
+ };
425
863
  export type Props<TFeatures extends TableFeatures = TableFeatures, TData extends RowData = RowData> = {
426
864
  data: ReadonlyArray<TData>;
427
865
  columns: Array<ColumnDef<TFeatures, TData>>;
@@ -431,6 +869,12 @@ export type Props<TFeatures extends TableFeatures = TableFeatures, TData extends
431
869
  * {@link BoardConfig}.
432
870
  */
433
871
  board?: BoardConfig<TFeatures, TData>;
872
+ /**
873
+ * Scheduler / calendar mode. When set, the grid renders its rows as events on
874
+ * a Month / Week / Day / Agenda calendar instead of a table. See
875
+ * {@link SchedulerConfig}.
876
+ */
877
+ scheduler?: SchedulerConfig<TFeatures, TData>;
434
878
  /**
435
879
  * Right-click context menu. `true` shows the default item set (copy, cut,
436
880
  * paste, clear, insert row above/below, remove row, remove column). Pass an
@@ -783,6 +1227,13 @@ export type Props<TFeatures extends TableFeatures = TableFeatures, TData extends
783
1227
  * or omit it to apply to every column. Later entries win on conflict.
784
1228
  */
785
1229
  conditionalFormats?: ReadonlyArray<ConditionalFormat<TData>>;
1230
+ /**
1231
+ * Which rows feed the min/max range that `colorScale` / `dataBar` formats
1232
+ * scale against. `visible` (default): the currently displayed rows (after
1233
+ * filtering + paging), so the heat map adapts to what's on screen. `all`:
1234
+ * the full unfiltered dataset, for a scale that stays put as you filter.
1235
+ */
1236
+ conditionalStatScope?: "visible" | "all";
786
1237
  onCellValueChange?: (event: {
787
1238
  rowIndex: number;
788
1239
  columnId: string;
@@ -991,7 +1442,7 @@ export type CellEditState = {
991
1442
  editorType: CellEditorType;
992
1443
  value: unknown;
993
1444
  } | null;
994
- export type FilterOperator = "contains" | "equals" | "startsWith" | "greaterThan" | "lessThan" | "between" | "isBlank";
1445
+ export type FilterOperator = "contains" | "notContains" | "equals" | "notEquals" | "startsWith" | "endsWith" | "regex" | "in" | "notIn" | "greaterThan" | "lessThan" | "between" | "isBlank" | "isNotBlank";
995
1446
  export type FilterOption = {
996
1447
  value: FilterOperator;
997
1448
  label: string;