@perspective-dev/viewer-datagrid 4.4.0 → 4.5.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 (87) hide show
  1. package/dist/cdn/perspective-viewer-datagrid.js +4 -22
  2. package/dist/cdn/perspective-viewer-datagrid.js.map +4 -4
  3. package/dist/css/perspective-viewer-datagrid-toolbar.css +1 -1
  4. package/dist/css/perspective-viewer-datagrid.css +1 -1
  5. package/dist/esm/color_utils.d.ts +22 -0
  6. package/dist/esm/custom_elements/datagrid.d.ts +16 -21
  7. package/dist/esm/data_listener/format_cell.d.ts +1 -1
  8. package/dist/esm/data_listener/formatter_cache.d.ts +1 -1
  9. package/dist/esm/data_listener/index.d.ts +3 -2
  10. package/dist/esm/event_handlers/click/edit_click.d.ts +3 -2
  11. package/dist/esm/event_handlers/click.d.ts +4 -6
  12. package/dist/esm/event_handlers/dispatch_click.d.ts +3 -2
  13. package/dist/esm/event_handlers/expand_collapse.d.ts +1 -1
  14. package/dist/esm/event_handlers/focus.d.ts +4 -5
  15. package/dist/esm/event_handlers/header_click.d.ts +5 -3
  16. package/dist/esm/event_handlers/keydown/edit_keydown.d.ts +3 -4
  17. package/dist/esm/event_handlers/select_region.d.ts +3 -1
  18. package/dist/esm/event_handlers/sort.d.ts +8 -7
  19. package/dist/esm/model/create.d.ts +1 -1
  20. package/dist/esm/model/meta_columns.d.ts +1 -0
  21. package/dist/esm/perspective-viewer-datagrid.js +3 -3
  22. package/dist/esm/perspective-viewer-datagrid.js.map +4 -4
  23. package/dist/esm/plugin/activate.d.ts +1 -1
  24. package/dist/esm/plugin/column_config_schema.d.ts +31 -0
  25. package/dist/esm/style_handlers/body.d.ts +3 -3
  26. package/dist/esm/style_handlers/column_header.d.ts +4 -3
  27. package/dist/esm/style_handlers/consolidated.d.ts +3 -47
  28. package/dist/esm/style_handlers/editable.d.ts +3 -2
  29. package/dist/esm/style_handlers/focus.d.ts +4 -4
  30. package/dist/esm/style_handlers/group_header.d.ts +1 -1
  31. package/dist/esm/style_handlers/table_cell/boolean.d.ts +1 -1
  32. package/dist/esm/style_handlers/table_cell/cell_flash.d.ts +1 -1
  33. package/dist/esm/style_handlers/table_cell/datetime.d.ts +1 -1
  34. package/dist/esm/style_handlers/table_cell/numeric.d.ts +1 -1
  35. package/dist/esm/style_handlers/table_cell/row_header.d.ts +1 -1
  36. package/dist/esm/style_handlers/table_cell/string.d.ts +1 -1
  37. package/dist/esm/style_handlers/types.d.ts +0 -4
  38. package/dist/esm/types.d.ts +10 -17
  39. package/package.json +2 -4
  40. package/src/css/regular_table.css +87 -31
  41. package/src/css/row-hover.css +20 -7
  42. package/src/css/toolbar.css +11 -0
  43. package/src/ts/color_utils.ts +181 -16
  44. package/src/ts/custom_elements/datagrid.ts +70 -56
  45. package/src/ts/custom_elements/toolbar.ts +4 -5
  46. package/src/ts/data_listener/format_cell.ts +28 -9
  47. package/src/ts/data_listener/format_tree_header.ts +2 -2
  48. package/src/ts/data_listener/formatter_cache.ts +9 -96
  49. package/src/ts/data_listener/index.ts +13 -11
  50. package/src/ts/event_handlers/click/edit_click.ts +10 -6
  51. package/src/ts/event_handlers/click.ts +39 -68
  52. package/src/ts/event_handlers/dispatch_click.ts +27 -25
  53. package/src/ts/event_handlers/expand_collapse.ts +11 -8
  54. package/src/ts/event_handlers/focus.ts +38 -35
  55. package/src/ts/event_handlers/header_click.ts +107 -62
  56. package/src/ts/event_handlers/keydown/edit_keydown.ts +60 -54
  57. package/src/ts/event_handlers/select_region.ts +153 -131
  58. package/src/ts/event_handlers/sort.ts +20 -25
  59. package/src/ts/get_cell_config.ts +10 -3
  60. package/src/ts/model/column_overrides.ts +16 -9
  61. package/src/ts/model/create.ts +68 -55
  62. package/src/ts/{event_handlers/deselect_all.ts → model/meta_columns.ts} +33 -14
  63. package/src/ts/model/toolbar.ts +33 -8
  64. package/src/ts/plugin/activate.ts +122 -92
  65. package/src/ts/plugin/column_config_schema.ts +187 -0
  66. package/src/ts/plugin/draw.ts +1 -0
  67. package/src/ts/plugin/restore.ts +6 -2
  68. package/src/ts/plugin/save.ts +2 -5
  69. package/src/ts/style_handlers/body.ts +48 -51
  70. package/src/ts/style_handlers/column_header.ts +22 -21
  71. package/src/ts/style_handlers/consolidated.ts +23 -123
  72. package/src/ts/style_handlers/editable.ts +16 -10
  73. package/src/ts/style_handlers/focus.ts +7 -5
  74. package/src/ts/style_handlers/group_header.ts +13 -6
  75. package/src/ts/style_handlers/table_cell/boolean.ts +3 -3
  76. package/src/ts/style_handlers/table_cell/cell_flash.ts +11 -11
  77. package/src/ts/style_handlers/table_cell/datetime.ts +3 -3
  78. package/src/ts/style_handlers/table_cell/numeric.ts +24 -25
  79. package/src/ts/style_handlers/table_cell/row_header.ts +2 -2
  80. package/src/ts/style_handlers/table_cell/string.ts +20 -18
  81. package/src/ts/style_handlers/types.ts +0 -10
  82. package/src/ts/types.ts +28 -20
  83. package/dist/esm/event_handlers/deselect_all.d.ts +0 -5
  84. package/dist/esm/event_handlers/row_select_click.d.ts +0 -4
  85. package/dist/esm/plugin/column_style_controls.d.ts +0 -28
  86. package/src/ts/event_handlers/row_select_click.ts +0 -92
  87. package/src/ts/plugin/column_style_controls.ts +0 -76
@@ -12,33 +12,41 @@
12
12
 
13
13
  import { style_selected_column } from "../style_handlers/column_header.js";
14
14
  import {
15
- click_listener,
16
- mousedown_listener,
15
+ createMousedownListener,
16
+ createClickListener,
17
+ createDblclickListener,
17
18
  } from "../event_handlers/header_click.js";
18
19
 
19
- import { focusinListener, focusoutListener } from "../event_handlers/focus.js";
20
- import { keydownListener, clickListener } from "../event_handlers/click.js";
21
-
22
- import { selectionListener } from "../event_handlers/row_select_click.js";
23
- import { deselect_all_listener } from "../event_handlers/deselect_all.js";
20
+ import {
21
+ createFocusinListener,
22
+ createFocusoutListener,
23
+ } from "../event_handlers/focus.js";
24
+ import {
25
+ createKeydownListener,
26
+ createEditClickListener,
27
+ } from "../event_handlers/click.js";
24
28
 
25
29
  import { createModel } from "../model/create.js";
26
- import { dispatch_click_listener } from "../event_handlers/dispatch_click.js";
27
-
28
- import { addAreaMouseSelection } from "../event_handlers/select_region.js";
30
+ import { createDispatchClickListener } from "../event_handlers/dispatch_click.js";
29
31
 
30
32
  import {
31
- createConsolidatedStyleListener,
32
- installConsolidatedStyleMethods,
33
- } from "../style_handlers/consolidated.js";
33
+ addAreaMouseSelection,
34
+ type OnSelectCallback,
35
+ } from "../event_handlers/select_region.js";
36
+
37
+ import { createConsolidatedStyleListener } from "../style_handlers/consolidated.js";
38
+
39
+ import getCellConfig from "../get_cell_config.js";
34
40
 
35
41
  import type { View } from "@perspective-dev/client";
36
- import type {
37
- DatagridPluginElement,
38
- PerspectiveViewerElement,
39
- SelectedPosition,
42
+ import {
43
+ type DatagridPluginElement,
44
+ type SelectedPositionMap,
45
+ type SelectionArea,
46
+ PerspectiveSelectDetail,
40
47
  } from "../types.js";
41
- import type { RegularTableElement } from "regular-table";
48
+
49
+ import type { HTMLPerspectiveViewerElement } from "@perspective-dev/viewer";
42
50
 
43
51
  interface ToggleColumnSettingsEvent extends CustomEvent {
44
52
  detail: {
@@ -54,7 +62,7 @@ export async function activate(
54
62
  this: DatagridPluginElement,
55
63
  view: View,
56
64
  ): Promise<void> {
57
- const viewer = this.parentElement as PerspectiveViewerElement;
65
+ const viewer = this.parentElement as HTMLPerspectiveViewerElement;
58
66
  const table = await viewer.getTable();
59
67
 
60
68
  if (!this._initialized) {
@@ -70,132 +78,153 @@ export async function activate(
70
78
  this.regular_table,
71
79
  table,
72
80
  view,
81
+ viewer.getAttribute("theme")!,
73
82
  );
74
83
 
75
84
  if (!this.model) {
76
85
  return;
77
86
  }
78
87
 
88
+ const model = this.model;
89
+ const regularTable = this.regular_table;
90
+ const onSelect: OnSelectCallback = async (
91
+ area: SelectionArea,
92
+ isDeselect: boolean,
93
+ ) => {
94
+ if (model._edit_mode !== "SELECT_ROW_TREE") {
95
+ return;
96
+ }
97
+
98
+ // Store the selected row identity on the model so it persists
99
+ // even when the selected row scrolls out of the viewport.
100
+ if (isDeselect) {
101
+ model._tree_selection_id = undefined;
102
+ } else {
103
+ const idx = area.y0 - (model._last_window?.start_row ?? 0);
104
+ if (idx >= 0 && idx < model._ids.length) {
105
+ model._tree_selection_id = model._ids[idx];
106
+ }
107
+ }
108
+
109
+ const { row, column_names, config } = await getCellConfig(
110
+ model,
111
+ area.y0,
112
+ 0,
113
+ );
114
+
115
+ let detail: PerspectiveSelectDetail;
116
+ if (isDeselect) {
117
+ if ((model._last_insert_configs?.length || 0) > 0) {
118
+ detail = new PerspectiveSelectDetail(
119
+ false,
120
+ row,
121
+ [],
122
+ model._last_insert_configs ?? [],
123
+ [],
124
+ );
125
+ } else {
126
+ throw new Error("Suprious deselect");
127
+ }
128
+
129
+ model._last_insert_configs = undefined;
130
+ } else {
131
+ detail = new PerspectiveSelectDetail(
132
+ true,
133
+ row,
134
+ column_names,
135
+ model._last_insert_configs ?? [],
136
+ [config],
137
+ );
138
+ model._last_insert_configs = [config];
139
+ }
140
+
141
+ await regularTable.draw({ preserve_width: true });
142
+ viewer.dispatchEvent(
143
+ new CustomEvent<PerspectiveSelectDetail>(
144
+ "perspective-global-filter",
145
+ {
146
+ bubbles: true,
147
+ composed: true,
148
+ detail,
149
+ },
150
+ ),
151
+ );
152
+ };
153
+
79
154
  addAreaMouseSelection(this, this.regular_table, {
80
155
  className: "psp-select-region",
156
+ onSelect,
81
157
  });
82
158
 
83
- // Create shared state maps for selection and focus tracking
84
- const selected_rows_map = new WeakMap<
85
- RegularTableElement,
86
- Set<number>
87
- >();
88
- const selected_position_map = new WeakMap<
89
- RegularTableElement,
90
- SelectedPosition
91
- >();
92
-
93
- // Install consolidated style methods on model prototype
94
- installConsolidatedStyleMethods(this.model);
95
-
96
- // Single consolidated style listener replaces:
97
- // - table_cell_style_listener
98
- // - group_header_style_listener
99
- // - column_header_style_listener
100
- // - selectionStyleListener
101
- // - editable_style_listener
102
- // - focus_style_listener
159
+ // Create shared state map for focus tracking
160
+ const selected_position_map: SelectedPositionMap = new WeakMap();
161
+
103
162
  this.regular_table.addStyleListener(
104
163
  createConsolidatedStyleListener(
105
164
  this,
106
- selected_rows_map as any,
107
- selected_position_map as any,
108
- ).bind(this.model, this.regular_table, viewer),
109
- );
110
-
111
- // uh ..
112
- this.regular_table.addEventListener(
113
- "click",
114
- click_listener.bind(
115
- this.model,
116
- this.regular_table,
117
- ) as EventListener,
118
- );
119
-
120
- this.regular_table.addEventListener(
121
- "mousedown",
122
- selectionListener.bind(
123
165
  this.model,
124
166
  this.regular_table,
125
167
  viewer,
126
- selected_rows_map as any,
127
- ) as unknown as EventListener,
168
+ selected_position_map,
169
+ ),
128
170
  );
129
171
 
130
172
  this.regular_table.addEventListener(
131
- "psp-deselect-all",
132
- deselect_all_listener.bind(
133
- this.model,
134
- this.regular_table,
135
- viewer,
136
- selected_rows_map as any,
137
- ) as unknown as EventListener,
173
+ "click",
174
+ createClickListener(this.regular_table),
138
175
  );
139
176
 
140
177
  // User event click
141
178
  this.regular_table.addEventListener(
142
179
  "click",
143
- dispatch_click_listener.bind(
144
- this.model,
145
- this.regular_table,
146
- viewer,
147
- ) as unknown as EventListener,
180
+ createDispatchClickListener(this.model, this.regular_table, viewer),
148
181
  );
149
182
 
150
183
  // tree collapse, expand, edit button headers
151
184
  this.regular_table.addEventListener(
152
185
  "mousedown",
153
- mousedown_listener.bind(
154
- this.model,
155
- this.regular_table,
156
- viewer,
157
- ) as unknown as EventListener,
186
+ createMousedownListener(this.model, this.regular_table, viewer),
158
187
  );
159
188
 
160
- // Editing event handlers (style handling is now in consolidated listener)
161
- // TODO relies on this.model._is_editable
189
+ this.regular_table.addEventListener(
190
+ "dblclick",
191
+ createDblclickListener(this.model, this.regular_table, viewer),
192
+ );
193
+
194
+ // Editing event handlers
162
195
  this.regular_table.addEventListener(
163
196
  "click",
164
- clickListener.bind(
165
- this.model,
166
- this.regular_table,
167
- viewer,
168
- ) as EventListener,
197
+ createEditClickListener(this.model, this.regular_table, viewer),
169
198
  );
170
199
 
171
200
  this.regular_table.addEventListener(
172
201
  "focusin",
173
- focusinListener.bind(
202
+ createFocusinListener(
174
203
  this.model,
175
204
  this.regular_table,
176
205
  viewer,
177
- selected_position_map as any,
178
- ) as EventListener,
206
+ selected_position_map,
207
+ ),
179
208
  );
180
209
 
181
210
  this.regular_table.addEventListener(
182
211
  "focusout",
183
- focusoutListener.bind(
212
+ createFocusoutListener(
184
213
  this.model,
185
214
  this.regular_table,
186
215
  viewer,
187
- selected_position_map as any,
188
- ) as EventListener,
216
+ selected_position_map,
217
+ ),
189
218
  );
190
219
 
191
220
  this.regular_table.addEventListener(
192
221
  "keydown",
193
- keydownListener.bind(
222
+ createKeydownListener(
194
223
  this.model,
195
224
  this.regular_table,
196
225
  viewer,
197
- selected_position_map as any,
198
- ) as EventListener,
226
+ selected_position_map,
227
+ ),
199
228
  );
200
229
 
201
230
  // viewer event listeners
@@ -204,7 +233,7 @@ export async function activate(
204
233
  (event: Event) => {
205
234
  const toggleEvent = event as ToggleColumnSettingsEvent;
206
235
  if (this.isConnected) {
207
- style_selected_column.call(
236
+ style_selected_column(
208
237
  this.model!,
209
238
  this.regular_table,
210
239
  viewer,
@@ -229,6 +258,7 @@ export async function activate(
229
258
  this.regular_table,
230
259
  table,
231
260
  view,
261
+ viewer.getAttribute("theme")!,
232
262
  this.model,
233
263
  );
234
264
  }
@@ -0,0 +1,187 @@
1
+ // ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2
+ // ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
3
+ // ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
4
+ // ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
5
+ // ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
6
+ // ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
7
+ // ┃ Copyright (c) 2017, the Perspective Authors. ┃
8
+ // ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
9
+ // ┃ This file is part of the Perspective library, distributed under the terms ┃
10
+ // ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
+ // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
+
13
+ import type { ColumnType } from "@perspective-dev/client";
14
+ import type { DatagridPluginElement } from "../types.js";
15
+
16
+ interface ViewerConfigLike {
17
+ group_by?: string[];
18
+ group_rollup_mode?: string;
19
+ }
20
+
21
+ type ControlSpec = Record<string, unknown> & { kind: string };
22
+
23
+ export interface ColumnConfigSchema {
24
+ fields: ControlSpec[];
25
+ }
26
+
27
+ /**
28
+ * Plugin schema for the Datagrid column-settings sidebar. Returns the
29
+ * controls the viewer should render in the Style tab for a given column.
30
+ *
31
+ * Each entry in `fields` is a `ControlSpec` discriminated by `kind`.
32
+ * Composite kinds (`NumberStyle`, `DatetimeFormat`, `StringFormat`,
33
+ * `NumberFormat`, `AggregateDepth`) own a fixed key namespace and
34
+ * carry only their `default`. Primitive kinds (`Enum`, `Bool`, `Color`,
35
+ * etc.) carry their own `key` (storage) and `label` (UI) inline.
36
+ *
37
+ * Aggregate Depth is plugin-owned — surfaced only inside the Datagrid
38
+ * because rollup-mode pivots are a Datagrid concern. Emitted only when
39
+ * the active view has a non-empty `group_by` and rollup mode is `Rollup`.
40
+ */
41
+ interface ColumnStats {
42
+ abs_max?: number;
43
+ }
44
+
45
+ export default function column_config_schema(
46
+ this: DatagridPluginElement,
47
+ type: ColumnType,
48
+ _group: string | undefined,
49
+ _column_name: string,
50
+ current_value: Record<string, unknown> | null,
51
+ viewer_config?: ViewerConfigLike,
52
+ column_stats?: ColumnStats,
53
+ ): ColumnConfigSchema {
54
+ const fields: ControlSpec[] = [];
55
+
56
+ if (type === "integer" || type === "float") {
57
+ const pos_fg = this.model!._pos_fg_color[0];
58
+ const neg_fg = this.model!._neg_fg_color[0];
59
+ const pos_bg = this.model!._pos_bg_color[0];
60
+ const neg_bg = this.model!._neg_bg_color[0];
61
+
62
+ fields.push({
63
+ kind: "Enum",
64
+ key: "number_fg_mode",
65
+ default: "color",
66
+ variants: [
67
+ { value: "disabled", label: "Disabled" },
68
+ { value: "color", label: "Color" },
69
+ { value: "bar", label: "Bar" },
70
+ { value: "label-bar", label: "Gradient" },
71
+ ],
72
+ });
73
+
74
+ const fg_mode = (current_value?.number_fg_mode as string) ?? "color";
75
+ if (fg_mode !== "disabled") {
76
+ fields.push({
77
+ kind: "ColorRange",
78
+ key_pos: "pos_fg_color",
79
+ key_neg: "neg_fg_color",
80
+ default_pos: pos_fg,
81
+ default_neg: neg_fg,
82
+ is_gradient: false,
83
+ });
84
+ }
85
+
86
+ if (fg_mode === "bar" || fg_mode === "label-bar") {
87
+ fields.push({
88
+ kind: "Number",
89
+ key: "fg_gradient",
90
+ default: column_stats?.abs_max ?? 0,
91
+ include: true,
92
+ });
93
+ }
94
+
95
+ fields.push({
96
+ kind: "Enum",
97
+ key: "number_bg_mode",
98
+ default: "disabled",
99
+ variants: [
100
+ { value: "disabled", label: "Disabled" },
101
+ { value: "color", label: "Color" },
102
+ { value: "gradient", label: "Gradient" },
103
+ { value: "pulse", label: "Pulse" },
104
+ ],
105
+ });
106
+
107
+ const bg_mode = (current_value?.number_bg_mode as string) ?? "disabled";
108
+ if (bg_mode !== "disabled") {
109
+ fields.push({
110
+ kind: "ColorRange",
111
+ key_pos: "pos_bg_color",
112
+ key_neg: "neg_bg_color",
113
+ default_pos: pos_bg,
114
+ default_neg: neg_bg,
115
+ is_gradient: bg_mode === "gradient" || bg_mode === "pulse",
116
+ });
117
+ }
118
+
119
+ if (bg_mode === "gradient") {
120
+ fields.push({
121
+ kind: "Number",
122
+ key: "bg_gradient",
123
+ include: true,
124
+ default: column_stats?.abs_max ?? 0,
125
+ });
126
+ }
127
+
128
+ fields.push({ kind: "NumberFormat" });
129
+ } else if (type === "date" || type === "datetime") {
130
+ fields.push({ kind: "DatetimeFormat" });
131
+
132
+ fields.push({
133
+ kind: "Enum",
134
+ key: "datetime_color_mode",
135
+ default: "none",
136
+ variants: [
137
+ { value: "none", label: "None" },
138
+ { value: "foreground", label: "Foreground" },
139
+ { value: "background", label: "Background" },
140
+ ],
141
+ });
142
+
143
+ const dt_mode =
144
+ (current_value?.datetime_color_mode as string) ?? "none";
145
+
146
+ if (dt_mode !== "none") {
147
+ fields.push({
148
+ kind: "Color",
149
+ key: "color",
150
+ default: this.model!._color[0],
151
+ });
152
+ }
153
+ } else if (type === "string") {
154
+ fields.push({ kind: "StringFormat" });
155
+
156
+ fields.push({
157
+ kind: "Enum",
158
+ key: "string_color_mode",
159
+ default: "none",
160
+ variants: [
161
+ { value: "none", label: "None" },
162
+ { value: "foreground", label: "Foreground" },
163
+ { value: "background", label: "Background" },
164
+ { value: "series", label: "Series" },
165
+ ],
166
+ });
167
+
168
+ const str_mode = (current_value?.string_color_mode as string) ?? "none";
169
+ if (str_mode !== "none") {
170
+ fields.push({
171
+ kind: "Color",
172
+ key: "color",
173
+ default: this.model!._color[0],
174
+ });
175
+ }
176
+ }
177
+
178
+ const group_by = viewer_config?.group_by ?? [];
179
+ const is_rollup =
180
+ (viewer_config?.group_rollup_mode ?? "rollup") === "rollup";
181
+
182
+ if (group_by.length > 0 && is_rollup) {
183
+ fields.push({ kind: "AggregateDepth" });
184
+ }
185
+
186
+ return { fields };
187
+ }
@@ -47,6 +47,7 @@ export async function draw(
47
47
  this.regular_table.scrollLeft = 0;
48
48
  this._reset_scroll_left = false;
49
49
  }
50
+
50
51
  if (this._reset_select) {
51
52
  this.regular_table.dispatchEvent(
52
53
  new CustomEvent("psp-deselect-all", { bubbles: false }),
@@ -92,16 +92,20 @@ export function restore(
92
92
  }
93
93
  }
94
94
 
95
- if ("edit_mode" in token && token.edit_mode) {
96
- if (EDIT_MODES.indexOf(token.edit_mode) !== -1) {
95
+ if ("edit_mode" in token) {
96
+ if (EDIT_MODES.indexOf(token.edit_mode!) !== -1) {
97
97
  toggle_edit_mode.call(this, token.edit_mode);
98
98
  } else {
99
99
  console.error("Unknown edit mode " + token.edit_mode);
100
100
  }
101
+ } else {
102
+ toggle_edit_mode.call(this, "READ_ONLY");
101
103
  }
102
104
 
103
105
  if ("scroll_lock" in token) {
104
106
  toggle_scroll_lock.call(this, token.scroll_lock);
107
+ } else {
108
+ toggle_scroll_lock.call(this, false);
105
109
  }
106
110
 
107
111
  const datagrid = this.regular_table;
@@ -11,11 +11,7 @@
11
11
  // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
12
 
13
13
  import { save_column_size_overrides } from "../model/column_overrides.js";
14
- import type {
15
- DatagridPluginElement,
16
- DatagridPluginConfig,
17
- EditMode,
18
- } from "../types.js";
14
+ import type { DatagridPluginElement, DatagridPluginConfig } from "../types.js";
19
15
 
20
16
  export function save(
21
17
  this: DatagridPluginElement,
@@ -41,5 +37,6 @@ export function save(
41
37
 
42
38
  return JSON.parse(JSON.stringify(token));
43
39
  }
40
+
44
41
  return {};
45
42
  }