@perspective-dev/viewer-datagrid 4.4.0 → 4.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) 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 +5 -5
  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/perspective-viewer-datagrid.js +3 -3
  21. package/dist/esm/perspective-viewer-datagrid.js.map +4 -4
  22. package/dist/esm/plugin/activate.d.ts +1 -1
  23. package/dist/esm/plugin/column_style_controls.d.ts +1 -1
  24. package/dist/esm/style_handlers/body.d.ts +3 -3
  25. package/dist/esm/style_handlers/column_header.d.ts +4 -3
  26. package/dist/esm/style_handlers/consolidated.d.ts +3 -47
  27. package/dist/esm/style_handlers/editable.d.ts +3 -2
  28. package/dist/esm/style_handlers/focus.d.ts +4 -4
  29. package/dist/esm/style_handlers/group_header.d.ts +1 -1
  30. package/dist/esm/style_handlers/table_cell/boolean.d.ts +1 -1
  31. package/dist/esm/style_handlers/table_cell/cell_flash.d.ts +1 -1
  32. package/dist/esm/style_handlers/table_cell/datetime.d.ts +1 -1
  33. package/dist/esm/style_handlers/table_cell/numeric.d.ts +1 -1
  34. package/dist/esm/style_handlers/table_cell/row_header.d.ts +1 -1
  35. package/dist/esm/style_handlers/table_cell/string.d.ts +1 -1
  36. package/dist/esm/style_handlers/types.d.ts +0 -4
  37. package/dist/esm/types.d.ts +10 -17
  38. package/package.json +2 -4
  39. package/src/css/regular_table.css +87 -31
  40. package/src/css/row-hover.css +20 -7
  41. package/src/css/toolbar.css +11 -0
  42. package/src/ts/color_utils.ts +144 -16
  43. package/src/ts/custom_elements/datagrid.ts +11 -12
  44. package/src/ts/custom_elements/toolbar.ts +4 -5
  45. package/src/ts/data_listener/format_cell.ts +28 -9
  46. package/src/ts/data_listener/formatter_cache.ts +1 -1
  47. package/src/ts/data_listener/index.ts +4 -8
  48. package/src/ts/event_handlers/click/edit_click.ts +7 -6
  49. package/src/ts/event_handlers/click.ts +39 -68
  50. package/src/ts/event_handlers/dispatch_click.ts +24 -25
  51. package/src/ts/event_handlers/expand_collapse.ts +7 -7
  52. package/src/ts/event_handlers/focus.ts +38 -35
  53. package/src/ts/event_handlers/header_click.ts +101 -62
  54. package/src/ts/event_handlers/keydown/edit_keydown.ts +49 -52
  55. package/src/ts/event_handlers/select_region.ts +144 -133
  56. package/src/ts/event_handlers/sort.ts +16 -24
  57. package/src/ts/model/column_overrides.ts +13 -4
  58. package/src/ts/model/create.ts +51 -55
  59. package/src/ts/model/toolbar.ts +23 -7
  60. package/src/ts/plugin/activate.ts +120 -92
  61. package/src/ts/plugin/column_style_controls.ts +1 -1
  62. package/src/ts/plugin/save.ts +1 -0
  63. package/src/ts/style_handlers/body.ts +44 -51
  64. package/src/ts/style_handlers/column_header.ts +16 -19
  65. package/src/ts/style_handlers/consolidated.ts +22 -123
  66. package/src/ts/style_handlers/editable.ts +10 -8
  67. package/src/ts/style_handlers/focus.ts +5 -5
  68. package/src/ts/style_handlers/group_header.ts +3 -2
  69. package/src/ts/style_handlers/table_cell/boolean.ts +3 -3
  70. package/src/ts/style_handlers/table_cell/cell_flash.ts +11 -11
  71. package/src/ts/style_handlers/table_cell/datetime.ts +3 -3
  72. package/src/ts/style_handlers/table_cell/numeric.ts +24 -25
  73. package/src/ts/style_handlers/table_cell/row_header.ts +2 -2
  74. package/src/ts/style_handlers/table_cell/string.ts +20 -18
  75. package/src/ts/style_handlers/types.ts +0 -10
  76. package/src/ts/types.ts +28 -20
  77. package/dist/esm/event_handlers/deselect_all.d.ts +0 -5
  78. package/dist/esm/event_handlers/row_select_click.d.ts +0 -4
  79. package/src/ts/event_handlers/deselect_all.ts +0 -28
  80. package/src/ts/event_handlers/row_select_click.ts +0 -92
@@ -10,9 +10,8 @@
10
10
  // ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
11
  // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
12
 
13
- import chroma from "chroma-js";
14
13
  import { createDataListener } from "../data_listener/index.js";
15
- import { blend, make_color_record } from "../color_utils.js";
14
+ import { blend, make_color_record, parseColor } from "../color_utils.js";
16
15
  import type {
17
16
  ColumnType,
18
17
  Table,
@@ -26,10 +25,27 @@ import {
26
25
  type Schema,
27
26
  type ElemFactory,
28
27
  type EditMode,
29
- type PerspectiveViewerElement,
30
- get_psp_type,
31
28
  } from "../types.js";
32
- import { CellMetadata } from "regular-table/dist/esm/types.js";
29
+ import type { HTMLPerspectiveViewerElement } from "@perspective-dev/viewer";
30
+
31
+ function arraysChanged<T>(a: T[], b: T[]): boolean {
32
+ if (a.length !== b.length) return true;
33
+ for (let i = 0; i < a.length; i++) {
34
+ if (a[i] !== b[i]) return true;
35
+ }
36
+ return false;
37
+ }
38
+
39
+ function nestedArraysChanged<T>(a: T[][], b: T[][]): boolean {
40
+ if (a.length !== b.length) return true;
41
+ for (let i = 0; i < a.length; i++) {
42
+ if (a[i].length !== b[i].length) return true;
43
+ for (let j = 0; j < a[i].length; j++) {
44
+ if (a[i][j] !== b[i][j]) return true;
45
+ }
46
+ }
47
+ return false;
48
+ }
33
49
 
34
50
  function get_rule(regular: HTMLElement, tag: string, def: string): string {
35
51
  const color = window.getComputedStyle(regular).getPropertyValue(tag).trim();
@@ -70,61 +86,33 @@ export async function createModel(
70
86
  regular: RegularTable,
71
87
  table: Table,
72
88
  view: View,
89
+ theme: string,
73
90
  extend: Partial<DatagridModel> = {},
74
91
  ): Promise<DatagridModel> {
75
92
  const config = (await view.get_config()) as ViewConfig;
76
93
  if (this?.model?._config) {
77
94
  const old = this.model._config;
78
- let group_by_changed = old.group_by.length !== config.group_by.length;
95
+ const group_by_changed = arraysChanged(old.group_by, config.group_by);
79
96
  const type_changed =
80
97
  (old.group_by.length === 0 || config.group_by.length === 0) &&
81
98
  group_by_changed;
82
99
 
83
- if (!group_by_changed) {
84
- for (const lvl in old.group_by) {
85
- group_by_changed ||= config.group_by[lvl] !== old.group_by[lvl];
86
- }
87
- }
88
-
89
- let split_by_changed = old.split_by.length !== config.split_by.length;
90
- if (!split_by_changed) {
91
- for (const lvl in old.split_by) {
92
- split_by_changed ||= config.split_by[lvl] !== old.split_by[lvl];
93
- }
94
- }
100
+ const split_by_changed = arraysChanged(old.split_by, config.split_by);
101
+ const columns_changed = arraysChanged(old.columns, config.columns);
102
+ const filter_changed = nestedArraysChanged(
103
+ old.filter as unknown[][],
104
+ config.filter as unknown[][],
105
+ );
95
106
 
96
- let columns_changed = old.columns.length !== config.columns.length;
97
- if (!columns_changed) {
98
- for (const lvl in old.columns) {
99
- columns_changed ||= config.columns[lvl] !== old.columns[lvl];
100
- }
101
- }
102
-
103
- let filter_changed = old.filter.length !== config.filter.length;
104
- if (!filter_changed) {
105
- for (const lvl in old.filter) {
106
- for (const i in config.filter[lvl]) {
107
- filter_changed ||=
108
- config.filter[lvl][i as unknown as number] !==
109
- old.filter[lvl][i as unknown as number];
110
- }
111
- }
112
- }
113
-
114
- let sort_changed = old.sort.length !== config.sort.length;
115
- if (!sort_changed) {
116
- for (const lvl in old.sort) {
117
- for (const i in config.sort[lvl]) {
118
- sort_changed ||=
119
- config.sort[lvl][i as unknown as number] !==
120
- old.sort[lvl][i as unknown as number];
121
- }
122
- }
123
- }
107
+ const sort_changed = nestedArraysChanged(
108
+ old.sort as unknown[][],
109
+ config.sort as unknown[][],
110
+ );
124
111
 
125
112
  const group_rollup_mode_changed =
126
113
  old.group_rollup_mode !== config.group_rollup_mode;
127
114
 
115
+ const theme_changed = this.model._theme !== theme;
128
116
  this._reset_scroll_top = group_by_changed;
129
117
  this._reset_scroll_left = split_by_changed;
130
118
  this._reset_select =
@@ -139,6 +127,7 @@ export async function createModel(
139
127
  split_by_changed ||
140
128
  group_by_changed ||
141
129
  columns_changed ||
130
+ theme_changed ||
142
131
  type_changed;
143
132
  }
144
133
 
@@ -148,12 +137,12 @@ export async function createModel(
148
137
  view.num_rows(),
149
138
  view.schema(),
150
139
  view.expression_schema(),
151
- (this.parentElement as PerspectiveViewerElement).getEditPort(),
140
+ (this.parentElement as HTMLPerspectiveViewerElement).getEditPort(),
152
141
  ]);
153
142
 
154
- const _plugin_background = chroma(
143
+ const _plugin_background = parseColor(
155
144
  get_rule(regular, "--psp--background-color", "#FFFFFF"),
156
- ).rgb();
145
+ );
157
146
 
158
147
  const _pos_fg_color = make_color_record(
159
148
  get_rule(regular, "--psp-datagrid--pos-cell--color", "#338DCD"),
@@ -187,10 +176,17 @@ export async function createModel(
187
176
  const _column_paths: string[] = [];
188
177
  const _is_editable: boolean[] = [];
189
178
  const _column_types: ColumnType[] = [];
179
+ let _edit_mode: EditMode = this._edit_mode || "READ_ONLY";
180
+
181
+ if (
182
+ _edit_mode === "SELECT_ROW_TREE" &&
183
+ (config.group_by.length === 0 || config.group_rollup_mode === "flat")
184
+ ) {
185
+ _edit_mode = "READ_ONLY";
186
+ this._edit_mode = _edit_mode;
187
+ }
190
188
 
191
- const _edit_mode: EditMode = this._edit_mode || "READ_ONLY";
192
189
  this._edit_button!.dataset.editMode = _edit_mode;
193
-
194
190
  const model: DatagridModel = Object.assign(extend, {
195
191
  _edit_port,
196
192
  _view: view,
@@ -208,6 +204,7 @@ export async function createModel(
208
204
  _neg_bg_color,
209
205
  _column_paths,
210
206
  _column_types,
207
+ _theme: theme,
211
208
  _is_editable,
212
209
  _edit_mode,
213
210
  _selection_state: {
@@ -224,10 +221,9 @@ export async function createModel(
224
221
  }) as DatagridModel;
225
222
 
226
223
  regular.setDataListener(
227
- createDataListener(this.parentElement as PerspectiveViewerElement).bind(
228
- model,
229
- regular,
230
- ) as any,
224
+ createDataListener(
225
+ this.parentElement as HTMLPerspectiveViewerElement,
226
+ ).bind(model, regular) as any,
231
227
  {
232
228
  virtual_mode: (window
233
229
  .getComputedStyle(regular)
@@ -10,7 +10,11 @@
10
10
  // ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
11
  // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
12
 
13
- import type { DatagridPluginElement, EditMode } from "../types.js";
13
+ import type {
14
+ DatagridModel,
15
+ DatagridPluginElement,
16
+ EditMode,
17
+ } from "../types.js";
14
18
 
15
19
  export const EDIT_MODES: readonly EditMode[] = [
16
20
  "READ_ONLY",
@@ -18,23 +22,37 @@ export const EDIT_MODES: readonly EditMode[] = [
18
22
  "SELECT_ROW",
19
23
  "SELECT_COLUMN",
20
24
  "SELECT_REGION",
25
+ "SELECT_ROW_TREE",
21
26
  ] as const;
22
27
 
28
+ function isSelectRowTreeAvailable(model?: DatagridModel): boolean {
29
+ if (!model) return false;
30
+ return (
31
+ model._config.group_by.length > 0 &&
32
+ model._config.group_rollup_mode !== "flat"
33
+ );
34
+ }
35
+
23
36
  export function toggle_edit_mode(
24
37
  this: DatagridPluginElement,
25
38
  mode?: EditMode,
26
39
  ): void {
27
40
  if (typeof mode === "undefined") {
28
- mode =
29
- EDIT_MODES[
30
- (EDIT_MODES.indexOf(this._edit_mode) + 1) % EDIT_MODES.length
31
- ];
41
+ let idx = EDIT_MODES.indexOf(this._edit_mode);
42
+ do {
43
+ idx = (idx + 1) % EDIT_MODES.length;
44
+ } while (
45
+ EDIT_MODES[idx] === "SELECT_ROW_TREE" &&
46
+ !isSelectRowTreeAvailable(this.model)
47
+ );
48
+ mode = EDIT_MODES[idx];
32
49
  }
33
50
 
34
51
  (this.parentElement as any)?.setSelection?.();
35
52
  this._edit_mode = mode;
36
53
  if (this.model) {
37
54
  this.model._edit_mode = mode;
55
+ this.model._tree_selection_id = undefined;
38
56
  this.model._selection_state = {
39
57
  selected_areas: [],
40
58
  dirty: true,
@@ -44,8 +62,6 @@ export function toggle_edit_mode(
44
62
  if (this._edit_button !== undefined) {
45
63
  this._edit_button.dataset.editMode = mode;
46
64
  }
47
-
48
- this.dataset.editMode = mode;
49
65
  }
50
66
 
51
67
  export function toggle_scroll_lock(
@@ -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,151 @@ 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") return;
95
+
96
+ // Store the selected row identity on the model so it persists
97
+ // even when the selected row scrolls out of the viewport.
98
+ if (isDeselect) {
99
+ model._tree_selection_id = undefined;
100
+ } else {
101
+ const idx = area.y0 - (model._last_window?.start_row ?? 0);
102
+ if (idx >= 0 && idx < model._ids.length) {
103
+ model._tree_selection_id = model._ids[idx];
104
+ }
105
+ }
106
+
107
+ const { row, column_names, config } = await getCellConfig(
108
+ model,
109
+ area.y0,
110
+ 0,
111
+ );
112
+
113
+ let detail: PerspectiveSelectDetail;
114
+ if (isDeselect) {
115
+ if ((model._last_insert_configs?.length || 0) > 0) {
116
+ detail = new PerspectiveSelectDetail(
117
+ false,
118
+ row,
119
+ [],
120
+ model._last_insert_configs ?? [],
121
+ [],
122
+ );
123
+ } else {
124
+ throw new Error("Suprious deselect");
125
+ }
126
+
127
+ model._last_insert_configs = undefined;
128
+ } else {
129
+ detail = new PerspectiveSelectDetail(
130
+ true,
131
+ row,
132
+ column_names,
133
+ model._last_insert_configs ?? [],
134
+ [config],
135
+ );
136
+ model._last_insert_configs = [config];
137
+ }
138
+
139
+ await regularTable.draw({ preserve_width: true });
140
+ viewer.dispatchEvent(
141
+ new CustomEvent<PerspectiveSelectDetail>(
142
+ "perspective-global-filter",
143
+ {
144
+ bubbles: true,
145
+ composed: true,
146
+ detail,
147
+ },
148
+ ),
149
+ );
150
+ };
151
+
79
152
  addAreaMouseSelection(this, this.regular_table, {
80
153
  className: "psp-select-region",
154
+ onSelect,
81
155
  });
82
156
 
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
157
+ // Create shared state map for focus tracking
158
+ const selected_position_map: SelectedPositionMap = new WeakMap();
159
+
103
160
  this.regular_table.addStyleListener(
104
161
  createConsolidatedStyleListener(
105
162
  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
163
  this.model,
124
164
  this.regular_table,
125
165
  viewer,
126
- selected_rows_map as any,
127
- ) as unknown as EventListener,
166
+ selected_position_map,
167
+ ),
128
168
  );
129
169
 
130
170
  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,
171
+ "click",
172
+ createClickListener(this.regular_table),
138
173
  );
139
174
 
140
175
  // User event click
141
176
  this.regular_table.addEventListener(
142
177
  "click",
143
- dispatch_click_listener.bind(
144
- this.model,
145
- this.regular_table,
146
- viewer,
147
- ) as unknown as EventListener,
178
+ createDispatchClickListener(this.model, this.regular_table, viewer),
148
179
  );
149
180
 
150
181
  // tree collapse, expand, edit button headers
151
182
  this.regular_table.addEventListener(
152
183
  "mousedown",
153
- mousedown_listener.bind(
154
- this.model,
155
- this.regular_table,
156
- viewer,
157
- ) as unknown as EventListener,
184
+ createMousedownListener(this.model, this.regular_table, viewer),
158
185
  );
159
186
 
160
- // Editing event handlers (style handling is now in consolidated listener)
161
- // TODO relies on this.model._is_editable
187
+ this.regular_table.addEventListener(
188
+ "dblclick",
189
+ createDblclickListener(this.model, this.regular_table, viewer),
190
+ );
191
+
192
+ // Editing event handlers
162
193
  this.regular_table.addEventListener(
163
194
  "click",
164
- clickListener.bind(
165
- this.model,
166
- this.regular_table,
167
- viewer,
168
- ) as EventListener,
195
+ createEditClickListener(this.model, this.regular_table, viewer),
169
196
  );
170
197
 
171
198
  this.regular_table.addEventListener(
172
199
  "focusin",
173
- focusinListener.bind(
200
+ createFocusinListener(
174
201
  this.model,
175
202
  this.regular_table,
176
203
  viewer,
177
- selected_position_map as any,
178
- ) as EventListener,
204
+ selected_position_map,
205
+ ),
179
206
  );
180
207
 
181
208
  this.regular_table.addEventListener(
182
209
  "focusout",
183
- focusoutListener.bind(
210
+ createFocusoutListener(
184
211
  this.model,
185
212
  this.regular_table,
186
213
  viewer,
187
- selected_position_map as any,
188
- ) as EventListener,
214
+ selected_position_map,
215
+ ),
189
216
  );
190
217
 
191
218
  this.regular_table.addEventListener(
192
219
  "keydown",
193
- keydownListener.bind(
220
+ createKeydownListener(
194
221
  this.model,
195
222
  this.regular_table,
196
223
  viewer,
197
- selected_position_map as any,
198
- ) as EventListener,
224
+ selected_position_map,
225
+ ),
199
226
  );
200
227
 
201
228
  // viewer event listeners
@@ -204,7 +231,7 @@ export async function activate(
204
231
  (event: Event) => {
205
232
  const toggleEvent = event as ToggleColumnSettingsEvent;
206
233
  if (this.isConnected) {
207
- style_selected_column.call(
234
+ style_selected_column(
208
235
  this.model!,
209
236
  this.regular_table,
210
237
  viewer,
@@ -229,6 +256,7 @@ export async function activate(
229
256
  this.regular_table,
230
257
  table,
231
258
  view,
259
+ viewer.getAttribute("theme")!,
232
260
  this.model,
233
261
  );
234
262
  }
@@ -10,7 +10,7 @@
10
10
  // ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
11
  // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
12
 
13
- import { ColumnType } from "@perspective-dev/client";
13
+ import type { ColumnType } from "@perspective-dev/client";
14
14
  import type { DatagridPluginElement } from "../types.js";
15
15
 
16
16
  interface NumberStyleOpts {
@@ -41,5 +41,6 @@ export function save(
41
41
 
42
42
  return JSON.parse(JSON.stringify(token));
43
43
  }
44
+
44
45
  return {};
45
46
  }