@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.
- package/dist/cdn/perspective-viewer-datagrid.js +4 -22
- package/dist/cdn/perspective-viewer-datagrid.js.map +4 -4
- package/dist/css/perspective-viewer-datagrid-toolbar.css +1 -1
- package/dist/css/perspective-viewer-datagrid.css +1 -1
- package/dist/esm/color_utils.d.ts +22 -0
- package/dist/esm/custom_elements/datagrid.d.ts +5 -5
- package/dist/esm/data_listener/format_cell.d.ts +1 -1
- package/dist/esm/data_listener/formatter_cache.d.ts +1 -1
- package/dist/esm/data_listener/index.d.ts +3 -2
- package/dist/esm/event_handlers/click/edit_click.d.ts +3 -2
- package/dist/esm/event_handlers/click.d.ts +4 -6
- package/dist/esm/event_handlers/dispatch_click.d.ts +3 -2
- package/dist/esm/event_handlers/expand_collapse.d.ts +1 -1
- package/dist/esm/event_handlers/focus.d.ts +4 -5
- package/dist/esm/event_handlers/header_click.d.ts +5 -3
- package/dist/esm/event_handlers/keydown/edit_keydown.d.ts +3 -4
- package/dist/esm/event_handlers/select_region.d.ts +3 -1
- package/dist/esm/event_handlers/sort.d.ts +8 -7
- package/dist/esm/model/create.d.ts +1 -1
- package/dist/esm/perspective-viewer-datagrid.js +3 -3
- package/dist/esm/perspective-viewer-datagrid.js.map +4 -4
- package/dist/esm/plugin/activate.d.ts +1 -1
- package/dist/esm/plugin/column_style_controls.d.ts +1 -1
- package/dist/esm/style_handlers/body.d.ts +3 -3
- package/dist/esm/style_handlers/column_header.d.ts +4 -3
- package/dist/esm/style_handlers/consolidated.d.ts +3 -47
- package/dist/esm/style_handlers/editable.d.ts +3 -2
- package/dist/esm/style_handlers/focus.d.ts +4 -4
- package/dist/esm/style_handlers/group_header.d.ts +1 -1
- package/dist/esm/style_handlers/table_cell/boolean.d.ts +1 -1
- package/dist/esm/style_handlers/table_cell/cell_flash.d.ts +1 -1
- package/dist/esm/style_handlers/table_cell/datetime.d.ts +1 -1
- package/dist/esm/style_handlers/table_cell/numeric.d.ts +1 -1
- package/dist/esm/style_handlers/table_cell/row_header.d.ts +1 -1
- package/dist/esm/style_handlers/table_cell/string.d.ts +1 -1
- package/dist/esm/style_handlers/types.d.ts +0 -4
- package/dist/esm/types.d.ts +10 -17
- package/package.json +2 -4
- package/src/css/regular_table.css +87 -31
- package/src/css/row-hover.css +20 -7
- package/src/css/toolbar.css +11 -0
- package/src/ts/color_utils.ts +144 -16
- package/src/ts/custom_elements/datagrid.ts +11 -12
- package/src/ts/custom_elements/toolbar.ts +4 -5
- package/src/ts/data_listener/format_cell.ts +28 -9
- package/src/ts/data_listener/formatter_cache.ts +1 -1
- package/src/ts/data_listener/index.ts +4 -8
- package/src/ts/event_handlers/click/edit_click.ts +7 -6
- package/src/ts/event_handlers/click.ts +39 -68
- package/src/ts/event_handlers/dispatch_click.ts +24 -25
- package/src/ts/event_handlers/expand_collapse.ts +7 -7
- package/src/ts/event_handlers/focus.ts +38 -35
- package/src/ts/event_handlers/header_click.ts +101 -62
- package/src/ts/event_handlers/keydown/edit_keydown.ts +49 -52
- package/src/ts/event_handlers/select_region.ts +144 -133
- package/src/ts/event_handlers/sort.ts +16 -24
- package/src/ts/model/column_overrides.ts +13 -4
- package/src/ts/model/create.ts +51 -55
- package/src/ts/model/toolbar.ts +23 -7
- package/src/ts/plugin/activate.ts +120 -92
- package/src/ts/plugin/column_style_controls.ts +1 -1
- package/src/ts/plugin/save.ts +1 -0
- package/src/ts/style_handlers/body.ts +44 -51
- package/src/ts/style_handlers/column_header.ts +16 -19
- package/src/ts/style_handlers/consolidated.ts +22 -123
- package/src/ts/style_handlers/editable.ts +10 -8
- package/src/ts/style_handlers/focus.ts +5 -5
- package/src/ts/style_handlers/group_header.ts +3 -2
- package/src/ts/style_handlers/table_cell/boolean.ts +3 -3
- package/src/ts/style_handlers/table_cell/cell_flash.ts +11 -11
- package/src/ts/style_handlers/table_cell/datetime.ts +3 -3
- package/src/ts/style_handlers/table_cell/numeric.ts +24 -25
- package/src/ts/style_handlers/table_cell/row_header.ts +2 -2
- package/src/ts/style_handlers/table_cell/string.ts +20 -18
- package/src/ts/style_handlers/types.ts +0 -10
- package/src/ts/types.ts +28 -20
- package/dist/esm/event_handlers/deselect_all.d.ts +0 -5
- package/dist/esm/event_handlers/row_select_click.d.ts +0 -4
- package/src/ts/event_handlers/deselect_all.ts +0 -28
- package/src/ts/event_handlers/row_select_click.ts +0 -92
package/src/ts/model/create.ts
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
|
140
|
+
(this.parentElement as HTMLPerspectiveViewerElement).getEditPort(),
|
|
152
141
|
]);
|
|
153
142
|
|
|
154
|
-
const _plugin_background =
|
|
143
|
+
const _plugin_background = parseColor(
|
|
155
144
|
get_rule(regular, "--psp--background-color", "#FFFFFF"),
|
|
156
|
-
)
|
|
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(
|
|
228
|
-
|
|
229
|
-
|
|
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)
|
package/src/ts/model/toolbar.ts
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
16
|
-
|
|
15
|
+
createMousedownListener,
|
|
16
|
+
createClickListener,
|
|
17
|
+
createDblclickListener,
|
|
17
18
|
} from "../event_handlers/header_click.js";
|
|
18
19
|
|
|
19
|
-
import {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
import {
|
|
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 {
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
} from "../
|
|
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
|
|
37
|
-
DatagridPluginElement,
|
|
38
|
-
|
|
39
|
-
|
|
42
|
+
import {
|
|
43
|
+
type DatagridPluginElement,
|
|
44
|
+
type SelectedPositionMap,
|
|
45
|
+
type SelectionArea,
|
|
46
|
+
PerspectiveSelectDetail,
|
|
40
47
|
} from "../types.js";
|
|
41
|
-
|
|
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
|
|
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
|
|
84
|
-
const
|
|
85
|
-
|
|
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
|
-
|
|
127
|
-
)
|
|
166
|
+
selected_position_map,
|
|
167
|
+
),
|
|
128
168
|
);
|
|
129
169
|
|
|
130
170
|
this.regular_table.addEventListener(
|
|
131
|
-
"
|
|
132
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
161
|
-
|
|
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
|
-
|
|
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
|
-
|
|
200
|
+
createFocusinListener(
|
|
174
201
|
this.model,
|
|
175
202
|
this.regular_table,
|
|
176
203
|
viewer,
|
|
177
|
-
selected_position_map
|
|
178
|
-
)
|
|
204
|
+
selected_position_map,
|
|
205
|
+
),
|
|
179
206
|
);
|
|
180
207
|
|
|
181
208
|
this.regular_table.addEventListener(
|
|
182
209
|
"focusout",
|
|
183
|
-
|
|
210
|
+
createFocusoutListener(
|
|
184
211
|
this.model,
|
|
185
212
|
this.regular_table,
|
|
186
213
|
viewer,
|
|
187
|
-
selected_position_map
|
|
188
|
-
)
|
|
214
|
+
selected_position_map,
|
|
215
|
+
),
|
|
189
216
|
);
|
|
190
217
|
|
|
191
218
|
this.regular_table.addEventListener(
|
|
192
219
|
"keydown",
|
|
193
|
-
|
|
220
|
+
createKeydownListener(
|
|
194
221
|
this.model,
|
|
195
222
|
this.regular_table,
|
|
196
223
|
viewer,
|
|
197
|
-
selected_position_map
|
|
198
|
-
)
|
|
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
|
|
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 {
|