@perspective-dev/viewer-datagrid 4.3.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 (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 +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 +6 -2
  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 +3 -5
  39. package/src/css/mitered-headers.css +64 -0
  40. package/src/css/perspective-viewer-datagrid.css +6 -0
  41. package/src/{less/pro.less → css/pro.css} +32 -31
  42. package/src/css/regular_table.css +589 -0
  43. package/src/{less/row-hover.less → css/row-hover.css} +48 -29
  44. package/src/{less/scrollbar.less → css/scrollbar.css} +16 -15
  45. package/src/{less/sub-cell-scroll.less → css/sub-cell-scroll.css} +14 -13
  46. package/src/{less/toolbar.less → css/toolbar.css} +57 -39
  47. package/src/ts/color_utils.ts +144 -16
  48. package/src/ts/custom_elements/datagrid.ts +11 -12
  49. package/src/ts/custom_elements/toolbar.ts +4 -5
  50. package/src/ts/data_listener/format_cell.ts +28 -9
  51. package/src/ts/data_listener/formatter_cache.ts +1 -1
  52. package/src/ts/data_listener/index.ts +4 -8
  53. package/src/ts/event_handlers/click/edit_click.ts +7 -6
  54. package/src/ts/event_handlers/click.ts +39 -68
  55. package/src/ts/event_handlers/dispatch_click.ts +24 -25
  56. package/src/ts/event_handlers/expand_collapse.ts +7 -7
  57. package/src/ts/event_handlers/focus.ts +38 -35
  58. package/src/ts/event_handlers/header_click.ts +101 -62
  59. package/src/ts/event_handlers/keydown/edit_keydown.ts +49 -52
  60. package/src/ts/event_handlers/select_region.ts +144 -133
  61. package/src/ts/event_handlers/sort.ts +16 -24
  62. package/src/ts/model/column_overrides.ts +13 -4
  63. package/src/ts/model/create.ts +55 -59
  64. package/src/ts/model/toolbar.ts +23 -7
  65. package/src/ts/plugin/activate.ts +120 -92
  66. package/src/ts/plugin/column_style_controls.ts +1 -1
  67. package/src/ts/plugin/save.ts +1 -0
  68. package/src/ts/style_handlers/body.ts +56 -61
  69. package/src/ts/style_handlers/column_header.ts +16 -19
  70. package/src/ts/style_handlers/consolidated.ts +22 -123
  71. package/src/ts/style_handlers/editable.ts +10 -8
  72. package/src/ts/style_handlers/focus.ts +5 -5
  73. package/src/ts/style_handlers/group_header.ts +3 -2
  74. package/src/ts/style_handlers/table_cell/boolean.ts +3 -3
  75. package/src/ts/style_handlers/table_cell/cell_flash.ts +11 -11
  76. package/src/ts/style_handlers/table_cell/datetime.ts +14 -11
  77. package/src/ts/style_handlers/table_cell/numeric.ts +24 -25
  78. package/src/ts/style_handlers/table_cell/row_header.ts +2 -2
  79. package/src/ts/style_handlers/table_cell/string.ts +20 -18
  80. package/src/ts/style_handlers/types.ts +0 -10
  81. package/src/ts/types.ts +28 -20
  82. package/dist/esm/event_handlers/deselect_all.d.ts +0 -5
  83. package/dist/esm/event_handlers/row_select_click.d.ts +0 -4
  84. package/src/less/mitered-headers.less +0 -65
  85. package/src/less/regular_table.less +0 -526
  86. package/src/ts/event_handlers/deselect_all.ts +0 -28
  87. package/src/ts/event_handlers/row_select_click.ts +0 -92
@@ -17,14 +17,10 @@ import {
17
17
  format_tree_header,
18
18
  format_tree_header_row_path,
19
19
  } from "./format_tree_header.js";
20
- import type {
21
- DatagridModel,
22
- PerspectiveViewerElement,
23
- RegularTable,
24
- Schema,
25
- } from "../types.js";
20
+ import type { DatagridModel, RegularTable, Schema } from "../types.js";
26
21
  import type { CellScalar, DataResponse } from "regular-table/dist/esm/types.js";
27
- import { ViewConfig, ViewWindow } from "@perspective-dev/client";
22
+ import type { ViewConfig, ViewWindow } from "@perspective-dev/client";
23
+ import type { HTMLPerspectiveViewerElement } from "@perspective-dev/viewer";
28
24
 
29
25
  interface ColumnData {
30
26
  __ROW_PATH__?: unknown[][];
@@ -40,7 +36,7 @@ interface ColumnData {
40
36
  * @returns A data listener for the plugin.
41
37
  */
42
38
  export function createDataListener(
43
- viewer: PerspectiveViewerElement,
39
+ viewer: HTMLPerspectiveViewerElement,
44
40
  ): (
45
41
  regularTable: RegularTable,
46
42
  x0: number,
@@ -14,10 +14,11 @@ import { CellMetadataBody } from "regular-table/dist/esm/types.js";
14
14
  import {
15
15
  type RegularTable,
16
16
  type DatagridModel,
17
- type PerspectiveViewerElement,
18
17
  get_psp_type,
19
18
  } from "../../types.js";
20
19
 
20
+ import type { HTMLPerspectiveViewerElement } from "@perspective-dev/viewer";
21
+
21
22
  export function write_cell(
22
23
  table: RegularTable,
23
24
  model: DatagridModel,
@@ -56,21 +57,21 @@ export function write_cell(
56
57
  }
57
58
 
58
59
  export function clickListener(
59
- this: DatagridModel,
60
+ model: DatagridModel,
60
61
  table: RegularTable,
61
- _viewer: PerspectiveViewerElement,
62
+ _viewer: HTMLPerspectiveViewerElement,
62
63
  event: MouseEvent,
63
64
  ): void {
64
65
  const meta = table.getMeta(event.target as HTMLElement);
65
66
  if (meta?.type === "body" || meta?.type === "column_header") {
66
- const is_editable2 = this._is_editable[meta.x];
67
- const is_bool = get_psp_type(this, meta) === "boolean";
67
+ const is_editable2 = model._is_editable[meta.x];
68
+ const is_bool = get_psp_type(model, meta) === "boolean";
68
69
  const is_null = (event.target as Element).classList.contains(
69
70
  "psp-null",
70
71
  );
71
72
 
72
73
  if (is_editable2 && is_bool && !is_null) {
73
- write_cell(table, this, event.target as HTMLElement);
74
+ write_cell(table, model, event.target as HTMLElement);
74
75
  }
75
76
  }
76
77
  }
@@ -12,81 +12,52 @@
12
12
 
13
13
  import * as edit_click from "./click/edit_click.js";
14
14
  import * as edit_keydown from "./keydown/edit_keydown.js";
15
- import type {
16
- DatagridModel,
17
- PerspectiveViewerElement,
18
- SelectedPosition,
19
- } from "../types.js";
15
+ import type { DatagridModel, SelectedPositionMap } from "../types.js";
16
+ import { isEditableMode } from "../types.js";
20
17
  import { RegularTableElement } from "regular-table";
21
- import { HTMLPerspectiveViewerDatagridPluginElement } from "../custom_elements/datagrid.js";
18
+ import type { HTMLPerspectiveViewerElement } from "@perspective-dev/viewer";
22
19
 
23
- type SelectedPositionMap = Map<RegularTableElement, SelectedPosition>;
24
-
25
- export function is_editable(
26
- this: DatagridModel,
27
- viewer: PerspectiveViewerElement,
28
- allowed: boolean = false,
29
- ): boolean {
30
- const has_pivots =
31
- this._config.group_by.length === 0 &&
32
- this._config.split_by.length === 0;
33
- const selectable = viewer.hasAttribute("selectable");
34
- const plugin = viewer.children[0] as
35
- | HTMLPerspectiveViewerDatagridPluginElement
36
- | undefined;
37
- const editable = allowed || !!(plugin?._edit_mode === "EDIT");
38
- return has_pivots && !selectable && editable;
39
- }
40
-
41
- export function keydownListener(
42
- this: DatagridModel,
20
+ export function createKeydownListener(
21
+ model: DatagridModel,
43
22
  table: RegularTableElement,
44
- viewer: PerspectiveViewerElement,
23
+ viewer: HTMLPerspectiveViewerElement,
45
24
  selected_position_map: SelectedPositionMap,
46
- event: KeyboardEvent,
47
- ): void {
48
- if (this._edit_mode === "EDIT") {
49
- if (!is_editable.call(this, viewer)) {
50
- return;
51
- }
25
+ ): EventListener {
26
+ return (event: Event): void => {
27
+ const keyEvent = event as KeyboardEvent;
28
+ if (model._edit_mode === "EDIT") {
29
+ if (!isEditableMode(model, viewer)) {
30
+ return;
31
+ }
52
32
 
53
- edit_keydown.keydownListener.call(
54
- this,
55
- table,
56
- viewer,
57
- selected_position_map,
58
- event,
59
- );
60
- } else {
61
- console.debug(
62
- `Mode ${this._edit_mode} for "keydown" event not yet implemented`,
63
- );
64
- }
33
+ edit_keydown.keydownListener(
34
+ model,
35
+ table,
36
+ viewer,
37
+ selected_position_map,
38
+ keyEvent,
39
+ );
40
+ } else {
41
+ console.debug(
42
+ `Mode ${model._edit_mode} for "keydown" event not yet implemented`,
43
+ );
44
+ }
45
+ };
65
46
  }
66
47
 
67
- export function clickListener(
68
- this: DatagridModel,
48
+ export function createEditClickListener(
49
+ model: DatagridModel,
69
50
  table: RegularTableElement,
70
- viewer: PerspectiveViewerElement,
71
- event: MouseEvent,
72
- ): void {
73
- if (this._edit_mode === "EDIT") {
74
- if (!is_editable.call(this, viewer)) {
75
- return;
76
- }
51
+ viewer: HTMLPerspectiveViewerElement,
52
+ ): EventListener {
53
+ return (event: Event): void => {
54
+ const mouseEvent = event as MouseEvent;
55
+ if (model._edit_mode === "EDIT") {
56
+ if (!isEditableMode(model, viewer)) {
57
+ return;
58
+ }
77
59
 
78
- edit_click.clickListener.call(this, table, viewer, event);
79
- } else if (this._edit_mode === "READ_ONLY") {
80
- // No-op for read-only mode
81
- } else if (this._edit_mode === "SELECT_COLUMN") {
82
- // Not yet implemented
83
- } else if (this._edit_mode === "SELECT_ROW") {
84
- // Not yet implemented
85
- } else if (this._edit_mode === "SELECT_REGION") {
86
- // Not yet implemented
87
- } else {
88
- console.debug(
89
- `Mode ${this._edit_mode} for "click" event not yet implemented`,
90
- );
91
- }
60
+ edit_click.clickListener(model, table, viewer, mouseEvent);
61
+ }
62
+ };
92
63
  }
@@ -12,31 +12,30 @@
12
12
 
13
13
  import { RegularTableElement } from "regular-table";
14
14
  import getCellConfig from "../get_cell_config.js";
15
- import type {
16
- DatagridModel,
17
- PerspectiveViewerElement,
18
- PerspectiveClickDetail,
19
- } from "../types.js";
15
+ import type { DatagridModel, PerspectiveClickDetail } from "../types.js";
16
+ import type { HTMLPerspectiveViewerElement } from "@perspective-dev/viewer";
20
17
 
21
- export async function dispatch_click_listener(
22
- this: DatagridModel,
18
+ export function createDispatchClickListener(
19
+ model: DatagridModel,
23
20
  table: RegularTableElement,
24
- viewer: PerspectiveViewerElement,
25
- event: MouseEvent,
26
- ): Promise<void> {
27
- const meta = table.getMeta(event.target as HTMLElement);
28
- if (!meta || meta.type !== "body") return;
29
- const { x, y } = meta;
30
- const { row, column_names, config } = await getCellConfig(this, y, x);
31
- viewer.dispatchEvent(
32
- new CustomEvent<PerspectiveClickDetail>("perspective-click", {
33
- bubbles: true,
34
- composed: true,
35
- detail: {
36
- row,
37
- column_names,
38
- config,
39
- },
40
- }),
41
- );
21
+ viewer: HTMLPerspectiveViewerElement,
22
+ ): EventListener {
23
+ return async (event: Event): Promise<void> => {
24
+ const mouseEvent = event as MouseEvent;
25
+ const meta = table.getMeta(mouseEvent.target as HTMLElement);
26
+ if (!meta || meta.type !== "body") return;
27
+ const { x, y } = meta;
28
+ const { row, column_names, config } = await getCellConfig(model, y, x);
29
+ viewer.dispatchEvent(
30
+ new CustomEvent<PerspectiveClickDetail>("perspective-click", {
31
+ bubbles: true,
32
+ composed: true,
33
+ detail: {
34
+ row,
35
+ column_names,
36
+ config,
37
+ },
38
+ }),
39
+ );
40
+ };
42
41
  }
@@ -13,7 +13,7 @@
13
13
  import type { RegularTable, DatagridModel } from "../types.js";
14
14
 
15
15
  export async function expandCollapseHandler(
16
- this: DatagridModel,
16
+ model: DatagridModel,
17
17
  regularTable: RegularTable,
18
18
  event: MouseEvent,
19
19
  ): Promise<void> {
@@ -24,22 +24,22 @@ export async function expandCollapseHandler(
24
24
  );
25
25
 
26
26
  if (event.shiftKey && is_collapse) {
27
- this._view.set_depth(
27
+ model._view.set_depth(
28
28
  (meta.row_header as unknown[]).filter((x) => x !== undefined)
29
29
  .length - 2,
30
30
  );
31
31
  } else if (event.shiftKey) {
32
- this._view.set_depth(
32
+ model._view.set_depth(
33
33
  (meta.row_header as unknown[]).filter((x) => x !== undefined)
34
34
  .length - 1,
35
35
  );
36
36
  } else if (is_collapse) {
37
- this._view.collapse(meta.y);
37
+ model._view.collapse(meta.y);
38
38
  } else {
39
- this._view.expand(meta.y);
39
+ model._view.expand(meta.y);
40
40
  }
41
41
 
42
- this._num_rows = await this._view.num_rows();
43
- this._num_columns = await this._view.num_columns();
42
+ model._num_rows = await model._view.num_rows();
43
+ model._num_columns = await model._view.num_columns();
44
44
  regularTable.draw();
45
45
  }
@@ -10,54 +10,57 @@
10
10
  // ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
11
  // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
12
 
13
- import { is_editable } from "./click.js";
14
13
  import { write_cell } from "./click/edit_click.js";
15
14
  import type {
16
15
  RegularTable,
17
16
  DatagridModel,
18
- PerspectiveViewerElement,
19
17
  SelectedPosition,
18
+ SelectedPositionMap,
20
19
  } from "../types.js";
20
+ import { isEditableMode } from "../types.js";
21
+ import type { HTMLPerspectiveViewerElement } from "@perspective-dev/viewer";
21
22
 
22
- type SelectedPositionMap = Map<RegularTable, SelectedPosition>;
23
-
24
- export function focusoutListener(
25
- this: DatagridModel,
23
+ export function createFocusoutListener(
24
+ model: DatagridModel,
26
25
  table: RegularTable,
27
- viewer: PerspectiveViewerElement,
26
+ viewer: HTMLPerspectiveViewerElement,
28
27
  selected_position_map: SelectedPositionMap,
29
- event: FocusEvent,
30
- ): void {
31
- if (is_editable.call(this, viewer) && selected_position_map.has(table)) {
32
- const target = event.target as HTMLElement;
33
- target.classList.remove("psp-error");
34
- const selectedPosition = selected_position_map.get(table)!;
35
- selected_position_map.delete(table);
36
- if (selectedPosition.content !== target.textContent) {
37
- if (!write_cell(table, this, target)) {
38
- target.textContent = selectedPosition.content || "";
39
- target.classList.add("psp-error");
40
- target.focus();
28
+ ): EventListener {
29
+ return (event: Event): void => {
30
+ const focusEvent = event as FocusEvent;
31
+ if (isEditableMode(model, viewer) && selected_position_map.has(table)) {
32
+ const target = focusEvent.target as HTMLElement;
33
+ target.classList.remove("psp-error");
34
+ const selectedPosition = selected_position_map.get(table)!;
35
+ selected_position_map.delete(table);
36
+ if (selectedPosition.content !== target.textContent) {
37
+ if (!write_cell(table, model, target)) {
38
+ target.textContent = selectedPosition.content || "";
39
+ target.classList.add("psp-error");
40
+ target.focus();
41
+ }
41
42
  }
42
43
  }
43
- }
44
+ };
44
45
  }
45
46
 
46
- export function focusinListener(
47
- this: DatagridModel,
47
+ export function createFocusinListener(
48
+ _model: DatagridModel,
48
49
  table: RegularTable,
49
- _viewer: PerspectiveViewerElement,
50
+ _viewer: HTMLPerspectiveViewerElement,
50
51
  selected_position_map: SelectedPositionMap,
51
- event: FocusEvent,
52
- ): void {
53
- const target = event.target as HTMLElement;
54
- const meta = table.getMeta(target);
55
- if (meta?.type === "body") {
56
- const new_state: SelectedPosition = {
57
- x: meta.x,
58
- y: meta.y,
59
- content: target.textContent || undefined,
60
- };
61
- selected_position_map.set(table, new_state);
62
- }
52
+ ): EventListener {
53
+ return (event: Event): void => {
54
+ const focusEvent = event as FocusEvent;
55
+ const target = focusEvent.target as HTMLElement;
56
+ const meta = table.getMeta(target);
57
+ if (meta?.type === "body") {
58
+ const new_state: SelectedPosition = {
59
+ x: meta.x,
60
+ y: meta.y,
61
+ content: target.textContent || undefined,
62
+ };
63
+ selected_position_map.set(table, new_state);
64
+ }
65
+ };
63
66
  }
@@ -12,74 +12,113 @@
12
12
 
13
13
  import { sortHandler } from "./sort.js";
14
14
  import { expandCollapseHandler } from "./expand_collapse.js";
15
- import type {
16
- RegularTable,
17
- DatagridModel,
18
- PerspectiveViewerElement,
19
- } from "../types.js";
20
-
21
- export async function mousedown_listener(
22
- this: DatagridModel,
15
+ import type { RegularTable, DatagridModel } from "../types.js";
16
+ import type { HTMLPerspectiveViewerElement } from "@perspective-dev/viewer";
17
+
18
+ export function createMousedownListener(
19
+ model: DatagridModel,
23
20
  regularTable: RegularTable,
24
- viewer: PerspectiveViewerElement,
25
- event: MouseEvent,
26
- ): Promise<void> {
27
- if (event.which !== 1) {
28
- return;
29
- }
30
-
31
- let target = event.target as HTMLElement | null;
32
- if (target?.tagName === "A") {
33
- return;
34
- }
35
-
36
- while (target && target.tagName !== "TD" && target.tagName !== "TH") {
37
- target = target.parentElement;
38
- if (!target || !regularTable.contains(target)) {
21
+ viewer: HTMLPerspectiveViewerElement,
22
+ ): EventListener {
23
+ return async (event: Event): Promise<void> => {
24
+ const mouseEvent = event as MouseEvent;
25
+ if (mouseEvent.which !== 1) {
26
+ return;
27
+ }
28
+
29
+ let target = mouseEvent.target as HTMLElement | null;
30
+ if (target?.tagName === "A") {
39
31
  return;
40
32
  }
41
- }
42
-
43
- if (!target) return;
44
-
45
- if (target.classList.contains("psp-tree-label")) {
46
- expandCollapseHandler.call(this, regularTable, event);
47
- return;
48
- }
49
-
50
- if (target.classList.contains("psp-menu-enabled")) {
51
- const meta = regularTable.getMeta(target);
52
- const column_name = meta?.column_header?.[this._config.split_by.length];
53
- await viewer.toggleColumnSettings(`${column_name}`);
54
- } else if (target.classList.contains("psp-sort-enabled")) {
55
- sortHandler.call(this, regularTable, viewer, event, target);
56
- }
33
+
34
+ while (target && target.tagName !== "TD" && target.tagName !== "TH") {
35
+ target = target.parentElement;
36
+ if (!target || !regularTable.contains(target)) {
37
+ return;
38
+ }
39
+ }
40
+
41
+ if (!target) return;
42
+
43
+ if (target.classList.contains("psp-tree-label")) {
44
+ if (model._edit_mode !== "SELECT_ROW_TREE") {
45
+ expandCollapseHandler(model, regularTable, mouseEvent);
46
+ }
47
+
48
+ return;
49
+ }
50
+
51
+ if (target.classList.contains("psp-menu-enabled")) {
52
+ const meta = regularTable.getMeta(target);
53
+ const column_name =
54
+ meta?.column_header?.[model._config.split_by.length];
55
+ await viewer.toggleColumnSettings(`${column_name}`);
56
+ } else if (target.classList.contains("psp-sort-enabled")) {
57
+ sortHandler(model, regularTable, viewer, mouseEvent, target);
58
+ }
59
+ };
57
60
  }
58
61
 
59
- export function click_listener(
62
+ export function createDblclickListener(
63
+ model: DatagridModel,
60
64
  regularTable: RegularTable,
61
- event: MouseEvent,
62
- ): void {
63
- if (event.which !== 1) {
64
- return;
65
- }
66
-
67
- let target = event.target as HTMLElement | null;
68
- while (target && target.tagName !== "TD" && target.tagName !== "TH") {
69
- target = target.parentElement;
70
- if (!target || !regularTable.contains(target)) {
65
+ viewer: HTMLPerspectiveViewerElement,
66
+ ): EventListener {
67
+ return async (event: Event): Promise<void> => {
68
+ const mouseEvent = event as MouseEvent;
69
+ if (mouseEvent.which !== 1) {
70
+ return;
71
+ }
72
+
73
+ let target = mouseEvent.target as HTMLElement | null;
74
+ if (target?.tagName === "A") {
71
75
  return;
72
76
  }
73
- }
74
-
75
- if (!target) return;
76
-
77
- if (target.classList.contains("psp-tree-label") && event.offsetX < 26) {
78
- event.stopImmediatePropagation();
79
- } else if (
80
- target.classList.contains("psp-header-leaf") &&
81
- !target.classList.contains("psp-header-corner")
82
- ) {
83
- event.stopImmediatePropagation();
84
- }
77
+
78
+ while (target && target.tagName !== "TD" && target.tagName !== "TH") {
79
+ target = target.parentElement;
80
+ if (!target || !regularTable.contains(target)) {
81
+ return;
82
+ }
83
+ }
84
+
85
+ if (!target) return;
86
+
87
+ if (target.classList.contains("psp-tree-label")) {
88
+ if (model._edit_mode === "SELECT_ROW_TREE") {
89
+ expandCollapseHandler(model, regularTable, mouseEvent);
90
+ }
91
+ }
92
+ };
93
+ }
94
+
95
+ export function createClickListener(regularTable: RegularTable): EventListener {
96
+ return (event: Event): void => {
97
+ const mouseEvent = event as MouseEvent;
98
+ if (mouseEvent.which !== 1) {
99
+ return;
100
+ }
101
+
102
+ let target = mouseEvent.target as HTMLElement | null;
103
+ while (target && target.tagName !== "TD" && target.tagName !== "TH") {
104
+ target = target.parentElement;
105
+ if (!target || !regularTable.contains(target)) {
106
+ return;
107
+ }
108
+ }
109
+
110
+ if (!target) return;
111
+
112
+ if (
113
+ target.classList.contains("psp-tree-label") &&
114
+ mouseEvent.offsetX < 26
115
+ ) {
116
+ mouseEvent.stopImmediatePropagation();
117
+ } else if (
118
+ target.classList.contains("psp-header-leaf") &&
119
+ !target.classList.contains("psp-header-corner")
120
+ ) {
121
+ mouseEvent.stopImmediatePropagation();
122
+ }
123
+ };
85
124
  }