@svgrid/grid 2.1.21 → 2.1.23

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 (219) 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/GridMenus.svelte +83 -3
  7. package/dist/SvAutoComplete.svelte +5 -3
  8. package/dist/SvCarousel.svelte +20 -42
  9. package/dist/SvColorInput.svelte +4 -3
  10. package/dist/SvColorInput.svelte.d.ts +1 -1
  11. package/dist/SvComboBox.svelte +7 -3
  12. package/dist/SvCommand.svelte +28 -85
  13. package/dist/SvCountryInput.svelte +1 -1
  14. package/dist/SvDateRangeInput.svelte +1 -1
  15. package/dist/SvDateTimePicker.svelte +9 -3
  16. package/dist/SvDateTimePicker.svelte.d.ts +3 -0
  17. package/dist/SvDockLayout.svelte +244 -0
  18. package/dist/SvDockLayout.svelte.d.ts +77 -0
  19. package/dist/SvDockManager.svelte +922 -0
  20. package/dist/SvDockManager.svelte.d.ts +106 -0
  21. package/dist/SvDrawer.svelte +69 -47
  22. package/dist/SvDrawer.svelte.d.ts +4 -0
  23. package/dist/SvDropDownList.svelte +85 -13
  24. package/dist/SvDropDownList.svelte.d.ts +3 -0
  25. package/dist/SvField.svelte +21 -4
  26. package/dist/SvField.svelte.d.ts +1 -0
  27. package/dist/SvForm.svelte +201 -91
  28. package/dist/SvForm.svelte.d.ts +15 -22
  29. package/dist/SvGrid.controller.svelte.d.ts +32 -1
  30. package/dist/SvGrid.controller.svelte.js +156 -27
  31. package/dist/SvGrid.css +193 -5
  32. package/dist/SvGrid.svelte +357 -12
  33. package/dist/SvGrid.types.d.ts +452 -1
  34. package/dist/SvGridDropdown.svelte +8 -1
  35. package/dist/SvGridSelect.svelte +1 -0
  36. package/dist/SvListBox.svelte +36 -14
  37. package/dist/SvMaskedInput.svelte +4 -3
  38. package/dist/SvMaskedInput.svelte.d.ts +1 -1
  39. package/dist/SvMenu.svelte +1 -1
  40. package/dist/SvMenuList.svelte +23 -71
  41. package/dist/SvMenuList.svelte.d.ts +2 -13
  42. package/dist/SvModal.svelte +12 -29
  43. package/dist/SvMultiSelect.svelte +1 -0
  44. package/dist/SvNumberInput.svelte +4 -3
  45. package/dist/SvNumberInput.svelte.d.ts +1 -1
  46. package/dist/SvPagination.svelte +18 -18
  47. package/dist/SvPasswordInput.svelte +3 -2
  48. package/dist/SvPasswordInput.svelte.d.ts +1 -1
  49. package/dist/SvPhoneInput.svelte +3 -2
  50. package/dist/SvPhoneInput.svelte.d.ts +1 -1
  51. package/dist/SvPopover.svelte +1 -1
  52. package/dist/SvStepper.svelte +6 -9
  53. package/dist/SvTagsInput.svelte +3 -2
  54. package/dist/SvTagsInput.svelte.d.ts +1 -1
  55. package/dist/SvTooltip.svelte +12 -23
  56. package/dist/SvTour.svelte +32 -4
  57. package/dist/SvTreeSelect.svelte +1 -0
  58. package/dist/build-api.js +76 -54
  59. package/dist/cdn/svgrid.js +10907 -6444
  60. package/dist/cdn/svgrid.svelte-external.js +9622 -5475
  61. package/dist/columns.js +6 -0
  62. package/dist/conditional-formatting.d.ts +67 -3
  63. package/dist/conditional-formatting.js +124 -17
  64. package/dist/createCarousel.svelte.d.ts +72 -0
  65. package/dist/createCarousel.svelte.js +80 -0
  66. package/dist/createCommand.svelte.d.ts +62 -0
  67. package/dist/createCommand.svelte.js +109 -0
  68. package/dist/createForm.svelte.d.ts +62 -0
  69. package/dist/createForm.svelte.js +374 -0
  70. package/dist/createMenu.svelte.d.ts +88 -0
  71. package/dist/createMenu.svelte.js +153 -0
  72. package/dist/createOverlay.svelte.d.ts +38 -0
  73. package/dist/createOverlay.svelte.js +68 -0
  74. package/dist/createPagination.d.ts +74 -0
  75. package/dist/createPagination.js +71 -0
  76. package/dist/createPopoverSelect.svelte.js +6 -12
  77. package/dist/createStepper.d.ts +44 -0
  78. package/dist/createStepper.js +26 -0
  79. package/dist/createTooltip.svelte.d.ts +32 -0
  80. package/dist/createTooltip.svelte.js +61 -0
  81. package/dist/datetime/timezone.d.ts +36 -0
  82. package/dist/datetime/timezone.js +110 -0
  83. package/dist/dock-context.d.ts +52 -0
  84. package/dist/dock-context.js +1 -0
  85. package/dist/dock-manager-model.d.ts +136 -0
  86. package/dist/dock-manager-model.js +514 -0
  87. package/dist/dock-model.d.ts +105 -0
  88. package/dist/dock-model.js +288 -0
  89. package/dist/dock-popout.d.ts +30 -0
  90. package/dist/dock-popout.js +81 -0
  91. package/dist/editor-contract.d.ts +2 -0
  92. package/dist/filter-operators.d.ts +6 -0
  93. package/dist/filter-operators.js +35 -2
  94. package/dist/filtering/excel-filters.d.ts +18 -1
  95. package/dist/filtering/excel-filters.js +56 -0
  96. package/dist/form-field.d.ts +73 -0
  97. package/dist/form-field.js +15 -0
  98. package/dist/index.d.ts +25 -5
  99. package/dist/index.js +40 -4
  100. package/dist/list-nav.d.ts +18 -0
  101. package/dist/list-nav.js +30 -0
  102. package/dist/list-option.d.ts +2 -0
  103. package/dist/menu-item.d.ts +20 -0
  104. package/dist/menu-item.js +1 -0
  105. package/dist/menus.d.ts +5 -0
  106. package/dist/menus.js +68 -16
  107. package/dist/panel-resize.d.ts +25 -0
  108. package/dist/panel-resize.js +40 -0
  109. package/dist/popover.d.ts +29 -3
  110. package/dist/popover.js +22 -6
  111. package/dist/recurrence.d.ts +33 -7
  112. package/dist/recurrence.js +151 -13
  113. package/dist/row-drag.d.ts +8 -0
  114. package/dist/row-drag.js +11 -0
  115. package/dist/scheduler-ical.d.ts +30 -0
  116. package/dist/scheduler-ical.js +180 -0
  117. package/dist/scheduler-model.d.ts +269 -0
  118. package/dist/scheduler-model.js +602 -0
  119. package/dist/scheduler-view.svelte.d.ts +22 -0
  120. package/dist/scheduler-view.svelte.js +13 -0
  121. package/dist/spreadsheet.js +20 -12
  122. package/dist/ui-app.types.d.ts +3 -0
  123. package/package.json +5 -1
  124. package/src/DockNodeView.svelte +306 -0
  125. package/src/DockPopoutHost.svelte +17 -0
  126. package/src/GridMenus.svelte +83 -3
  127. package/src/SvAutoComplete.svelte +5 -3
  128. package/src/SvCarousel.svelte +20 -42
  129. package/src/SvCarousel.test.ts +68 -0
  130. package/src/SvColorInput.svelte +4 -3
  131. package/src/SvComboBox.svelte +7 -3
  132. package/src/SvCommand.svelte +28 -85
  133. package/src/SvCommand.test.ts +78 -0
  134. package/src/SvCountryInput.svelte +1 -1
  135. package/src/SvDateRangeInput.svelte +1 -1
  136. package/src/SvDateTimePicker.svelte +9 -3
  137. package/src/SvDockLayout.svelte +244 -0
  138. package/src/SvDockManager.svelte +922 -0
  139. package/src/SvDrawer.svelte +69 -47
  140. package/src/SvDropDownList.svelte +85 -13
  141. package/src/SvField.svelte +21 -4
  142. package/src/SvForm.svelte +201 -91
  143. package/src/SvForm.test.ts +299 -0
  144. package/src/SvGrid.controller.svelte.ts +152 -28
  145. package/src/SvGrid.css +193 -5
  146. package/src/SvGrid.svelte +357 -12
  147. package/src/SvGrid.types.ts +463 -1
  148. package/src/SvGridDropdown.svelte +8 -1
  149. package/src/SvGridSelect.svelte +1 -0
  150. package/src/SvListBox.svelte +36 -14
  151. package/src/SvMaskedInput.svelte +4 -3
  152. package/src/SvMenu.svelte +1 -1
  153. package/src/SvMenu.test.ts +24 -0
  154. package/src/SvMenuList.svelte +23 -71
  155. package/src/SvModal.svelte +12 -29
  156. package/src/SvModal.test.ts +82 -0
  157. package/src/SvMultiSelect.svelte +1 -0
  158. package/src/SvNumberInput.svelte +4 -3
  159. package/src/SvPagination.svelte +18 -18
  160. package/src/SvPasswordInput.svelte +3 -2
  161. package/src/SvPhoneInput.svelte +3 -2
  162. package/src/SvPopover.svelte +1 -1
  163. package/src/SvStepper.svelte +6 -9
  164. package/src/SvTagsInput.svelte +3 -2
  165. package/src/SvTooltip.svelte +12 -23
  166. package/src/SvTooltip.test.ts +73 -0
  167. package/src/SvTour.svelte +32 -4
  168. package/src/SvTreeSelect.svelte +1 -0
  169. package/src/build-api.ts +74 -51
  170. package/src/columns.ts +5 -0
  171. package/src/conditional-formatting.test.ts +104 -0
  172. package/src/conditional-formatting.ts +176 -19
  173. package/src/createCarousel.svelte.ts +104 -0
  174. package/src/createCommand.svelte.ts +125 -0
  175. package/src/createForm.svelte.ts +333 -0
  176. package/src/createMenu.svelte.ts +202 -0
  177. package/src/createOverlay.svelte.ts +101 -0
  178. package/src/createPagination.test.ts +65 -0
  179. package/src/createPagination.ts +84 -0
  180. package/src/createPopoverSelect.svelte.ts +5 -9
  181. package/src/createStepper.test.ts +62 -0
  182. package/src/createStepper.ts +61 -0
  183. package/src/createTooltip.svelte.ts +86 -0
  184. package/src/datetime/timezone.test.ts +69 -0
  185. package/src/datetime/timezone.ts +134 -0
  186. package/src/dock-context.ts +47 -0
  187. package/src/dock-manager-model.test.ts +275 -0
  188. package/src/dock-manager-model.ts +593 -0
  189. package/src/dock-model.test.ts +163 -0
  190. package/src/dock-model.ts +368 -0
  191. package/src/dock-popout.ts +94 -0
  192. package/src/editor-contract.ts +2 -0
  193. package/src/filter-operators.test.ts +59 -0
  194. package/src/filter-operators.ts +35 -2
  195. package/src/filtering/excel-filters.test.ts +86 -1
  196. package/src/filtering/excel-filters.ts +65 -0
  197. package/src/form-field.ts +87 -0
  198. package/src/index.ts +158 -4
  199. package/src/list-nav.test.ts +49 -0
  200. package/src/list-nav.ts +29 -0
  201. package/src/list-option.ts +2 -0
  202. package/src/menu-item.ts +21 -0
  203. package/src/menus.test.ts +48 -0
  204. package/src/menus.ts +73 -16
  205. package/src/panel-resize.ts +52 -0
  206. package/src/popover.bounds.test.ts +93 -0
  207. package/src/popover.ts +51 -7
  208. package/src/recurrence.test.ts +88 -1
  209. package/src/recurrence.ts +166 -15
  210. package/src/row-drag.ts +10 -0
  211. package/src/scheduler-ical.test.ts +68 -0
  212. package/src/scheduler-ical.ts +180 -0
  213. package/src/scheduler-model.test.ts +546 -0
  214. package/src/scheduler-model.ts +853 -0
  215. package/src/scheduler-view.svelte.ts +33 -0
  216. package/src/spreadsheet.ts +20 -12
  217. package/src/svgrid.effect-driven-filter.svelte.test.ts +116 -0
  218. package/src/ui-app.types.ts +3 -0
  219. package/src/virtual.test.ts +6 -4
package/dist/build-api.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import "./sv-grid-scrollbar";
2
+ import { untrack } from "svelte";
2
3
  import { projectGridRows, serializeDelimited, serializeJson, serializeMarkdown, downloadTextFile, copyTextToClipboard, } from "./export-format";
3
4
  import { isGroupRow, getColumnAlign, columnDefMatchesId, } from "./cell-values";
4
5
  export function createGridApi(ctx) {
@@ -226,65 +227,79 @@ export function createGridApi(ctx) {
226
227
  ctx.grid.setGrouping([...columnIds]);
227
228
  },
228
229
  setFilter(columnId, filter) {
229
- // Honour the column's `filterable` opt-out. Same approach as
230
- // `setSort` - `getCanFilter()` already combines the feature flag
231
- // and the per-column field.
232
- const col = ctx.allColumns.find((c) => c.id === columnId);
233
- if (col && !col.getCanFilter?.())
234
- return;
235
- if (!filter) {
236
- this.clearFilter(columnId);
237
- return;
238
- }
239
- ctx.filterMenuValues = {
240
- ...ctx.filterMenuValues,
241
- [columnId]: {
242
- operator: filter.operator,
243
- value: filter.value ?? "",
244
- ...(filter.operator === "between"
245
- ? { valueTo: filter.valueTo ?? "" }
246
- : {}),
247
- // Optional second condition + join (multi-condition filtering).
248
- ...(filter.operator2
249
- ? {
250
- operator2: filter.operator2,
251
- value2: filter.value2 ?? "",
252
- join: filter.join ?? "AND",
253
- ...(filter.operator2 === "between"
254
- ? { valueTo2: filter.valueTo2 ?? "" }
255
- : {}),
256
- }
257
- : {}),
258
- },
259
- };
230
+ // `untrack`: these imperative mutators read the same filter state they
231
+ // write (read-modify-write on `filterMenuValues`). When a consumer
232
+ // calls them from inside a reactive `$effect`, that internal read would
233
+ // otherwise be captured as a dependency of the caller's effect, and the
234
+ // write would re-dirty it - an infinite update loop. Untracking the
235
+ // body keeps the API safe to drive from an effect.
236
+ untrack(() => {
237
+ // Honour the column's `filterable` opt-out. Same approach as
238
+ // `setSort` - `getCanFilter()` already combines the feature flag
239
+ // and the per-column field.
240
+ const col = ctx.allColumns.find((c) => c.id === columnId);
241
+ if (col && !col.getCanFilter?.())
242
+ return;
243
+ if (!filter) {
244
+ this.clearFilter(columnId);
245
+ return;
246
+ }
247
+ ctx.filterMenuValues = {
248
+ ...ctx.filterMenuValues,
249
+ [columnId]: {
250
+ operator: filter.operator,
251
+ value: filter.value ?? "",
252
+ ...(filter.operator === "between"
253
+ ? { valueTo: filter.valueTo ?? "" }
254
+ : {}),
255
+ // Optional second condition + join (multi-condition filtering).
256
+ ...(filter.operator2
257
+ ? {
258
+ operator2: filter.operator2,
259
+ value2: filter.value2 ?? "",
260
+ join: filter.join ?? "AND",
261
+ ...(filter.operator2 === "between"
262
+ ? { valueTo2: filter.valueTo2 ?? "" }
263
+ : {}),
264
+ }
265
+ : {}),
266
+ },
267
+ };
268
+ });
260
269
  },
261
270
  setFacetFilter(columnId, values) {
262
- // Empty array OR null both mean "clear this column's facet" -
263
- // mirrors how the column menu treats unchecking the last value.
264
- if (!values || values.length === 0) {
265
- if (ctx.valueFilters[columnId]) {
266
- const next = { ...ctx.valueFilters };
267
- delete next[columnId];
268
- ctx.valueFilters = next;
271
+ // See `setFilter` for why the read-modify-write is untracked.
272
+ untrack(() => {
273
+ // Empty array OR null both mean "clear this column's facet" -
274
+ // mirrors how the column menu treats unchecking the last value.
275
+ if (!values || values.length === 0) {
276
+ if (ctx.valueFilters[columnId]) {
277
+ const next = { ...ctx.valueFilters };
278
+ delete next[columnId];
279
+ ctx.valueFilters = next;
280
+ }
281
+ return;
269
282
  }
270
- return;
271
- }
272
- ctx.valueFilters = {
273
- ...ctx.valueFilters,
274
- [columnId]: new Set(values),
275
- };
283
+ ctx.valueFilters = {
284
+ ...ctx.valueFilters,
285
+ [columnId]: new Set(values),
286
+ };
287
+ });
276
288
  },
277
289
  clearFilter(columnId) {
278
290
  ctx.clearColumnFilter(columnId);
279
291
  },
280
292
  clearAllFilters() {
281
- // Wipe every filter surface in one go: column-menu, filter-row, set
282
- // filters, and the global search box.
283
- ctx.filterMenuValues = {};
284
- ctx.filterRowValues = {};
285
- ctx.valueFilters = {};
286
- if (ctx.globalFilter !== "")
287
- ctx.globalFilter = "";
293
+ // See `setFilter` for why the read-modify-write is untracked.
294
+ untrack(() => {
295
+ // Wipe every filter surface in one go: column-menu, filter-row, set
296
+ // filters, and the global search box.
297
+ ctx.filterMenuValues = {};
298
+ ctx.filterRowValues = {};
299
+ ctx.valueFilters = {};
300
+ if (ctx.globalFilter !== "")
301
+ ctx.globalFilter = "";
302
+ });
288
303
  },
289
304
  getFilters() {
290
305
  // Return a defensive copy so callers can't mutate internal state.
@@ -627,8 +642,12 @@ export function createGridApi(ctx) {
627
642
  const sorting = state.sorting.map((s) => ({ id: s.id, desc: s.desc }));
628
643
  ctx.grid.store.setState((prev) => ({ ...prev, sorting }));
629
644
  }
630
- if (state.grouping)
631
- ctx.grid.setGrouping([...state.grouping]);
645
+ if (state.grouping) {
646
+ // Drop grouping by columns that no longer exist (#53) - otherwise a
647
+ // saved view collapses every row into a group named 'undefined'.
648
+ const existing = new Set(ctx.grid.getAllColumns().map((c) => c.id));
649
+ ctx.grid.setGrouping(state.grouping.filter((id) => existing.has(id)));
650
+ }
632
651
  if (state.pagination) {
633
652
  const p = state.pagination;
634
653
  ctx.grid.setPagination((prev) => ({ ...prev, ...p }));
@@ -643,7 +662,10 @@ export function createGridApi(ctx) {
643
662
  if (state.columnOrder)
644
663
  ctx.setColumnOrderInternal(state.columnOrder);
645
664
  if (state.hiddenColumns) {
646
- const next = {};
665
+ // Seed from columns declared `visible: false` so a partial/empty saved
666
+ // state never un-hides an app-declared-hidden column (#54); then layer
667
+ // the saved user-driven hides on top.
668
+ const next = { ...ctx.declaredHiddenColumns };
647
669
  for (const id of state.hiddenColumns)
648
670
  next[id] = true;
649
671
  ctx.hiddenColumns = next;