@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.
- 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 +6 -2
- 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 +3 -5
- package/src/css/mitered-headers.css +64 -0
- package/src/css/perspective-viewer-datagrid.css +6 -0
- package/src/{less/pro.less → css/pro.css} +32 -31
- package/src/css/regular_table.css +589 -0
- package/src/{less/row-hover.less → css/row-hover.css} +48 -29
- package/src/{less/scrollbar.less → css/scrollbar.css} +16 -15
- package/src/{less/sub-cell-scroll.less → css/sub-cell-scroll.css} +14 -13
- package/src/{less/toolbar.less → css/toolbar.css} +57 -39
- 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 +55 -59
- 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 +56 -61
- 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 +14 -11
- 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/less/mitered-headers.less +0 -65
- package/src/less/regular_table.less +0 -526
- package/src/ts/event_handlers/deselect_all.ts +0 -28
- package/src/ts/event_handlers/row_select_click.ts +0 -92
|
@@ -14,69 +14,19 @@ import { RegularTableElement } from "regular-table";
|
|
|
14
14
|
import { PRIVATE_PLUGIN_SYMBOL } from "../model/index.js";
|
|
15
15
|
import type {
|
|
16
16
|
DatagridModel,
|
|
17
|
-
PerspectiveViewerElement,
|
|
18
17
|
ColumnsConfig,
|
|
19
18
|
DatagridPluginElement,
|
|
20
|
-
|
|
19
|
+
SelectedPositionMap,
|
|
21
20
|
} from "../types.js";
|
|
21
|
+
import { isEditableMode } from "../types.js";
|
|
22
|
+
import type { HTMLPerspectiveViewerElement } from "@perspective-dev/viewer";
|
|
22
23
|
|
|
23
24
|
import { applyFocusStyle } from "./focus.js";
|
|
24
|
-
import { styleColumnHeaderRow } from "./column_header.js";
|
|
25
25
|
import { applyColumnHeaderStyles } from "./editable.js";
|
|
26
26
|
import { applyGroupHeaderStyles } from "./group_header.js";
|
|
27
27
|
import { applyBodyCellStyles } from "./body.js";
|
|
28
28
|
import { CellMetadata } from "regular-table/dist/esm/types.js";
|
|
29
|
-
|
|
30
|
-
interface CollectedCell {
|
|
31
|
-
element: HTMLElement;
|
|
32
|
-
metadata: CellMetadata;
|
|
33
|
-
isHeader: boolean;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
interface CollectedHeaderRow {
|
|
37
|
-
row: HTMLTableRowElement;
|
|
38
|
-
cells: Array<{
|
|
39
|
-
element: HTMLTableCellElement;
|
|
40
|
-
metadata: CellMetadata | undefined;
|
|
41
|
-
}>;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Context object passed through consolidated styling
|
|
46
|
-
*/
|
|
47
|
-
export interface StyleContext {
|
|
48
|
-
model: DatagridModel;
|
|
49
|
-
regularTable: RegularTableElement;
|
|
50
|
-
viewer: PerspectiveViewerElement;
|
|
51
|
-
datagrid: DatagridPluginElement;
|
|
52
|
-
plugins: ColumnsConfig;
|
|
53
|
-
isSettingsOpen: boolean;
|
|
54
|
-
isSelectable: boolean;
|
|
55
|
-
isEditable: boolean;
|
|
56
|
-
selectedRowsMap: Map<RegularTableElement, unknown[]>;
|
|
57
|
-
selectedPositionMap: Map<RegularTableElement, SelectedPosition>;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Local types for selection maps - match the actual runtime usage
|
|
61
|
-
// (activate.ts uses `as any` casts when passing these)
|
|
62
|
-
type LocalSelectedRowsMap = WeakMap<RegularTableElement, unknown[]>;
|
|
63
|
-
type LocalSelectedPositionMap = WeakMap<RegularTableElement, SelectedPosition>;
|
|
64
|
-
|
|
65
|
-
function isEditableMode(
|
|
66
|
-
model: DatagridModel,
|
|
67
|
-
viewer: PerspectiveViewerElement,
|
|
68
|
-
allowed: boolean = false,
|
|
69
|
-
): boolean {
|
|
70
|
-
const has_pivots =
|
|
71
|
-
model._config.group_by.length === 0 &&
|
|
72
|
-
model._config.split_by.length === 0;
|
|
73
|
-
const selectable = viewer.hasAttribute("selectable");
|
|
74
|
-
const plugin = viewer.children[0] as
|
|
75
|
-
| (DatagridPluginElement & { dataset: DOMStringMap })
|
|
76
|
-
| undefined;
|
|
77
|
-
const editable = allowed || plugin?.dataset?.editMode === "EDIT";
|
|
78
|
-
return has_pivots && !selectable && editable;
|
|
79
|
-
}
|
|
29
|
+
import { CollectedCell, CollectedHeaderRow } from "./types.js";
|
|
80
30
|
|
|
81
31
|
/**
|
|
82
32
|
* Consolidated style listener that handles all cell styling in a single pass.
|
|
@@ -86,24 +36,18 @@ function isEditableMode(
|
|
|
86
36
|
*/
|
|
87
37
|
export function createConsolidatedStyleListener(
|
|
88
38
|
datagrid: DatagridPluginElement,
|
|
89
|
-
|
|
90
|
-
selectedPositionMap: LocalSelectedPositionMap,
|
|
91
|
-
): (
|
|
92
|
-
this: DatagridModel,
|
|
39
|
+
model: DatagridModel,
|
|
93
40
|
regularTable: RegularTableElement,
|
|
94
|
-
viewer:
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
regularTable: RegularTableElement,
|
|
99
|
-
viewer: PerspectiveViewerElement,
|
|
100
|
-
): void {
|
|
41
|
+
viewer: HTMLPerspectiveViewerElement,
|
|
42
|
+
selectedPositionMap: SelectedPositionMap,
|
|
43
|
+
): () => void {
|
|
44
|
+
return function consolidatedStyleListener(): void {
|
|
101
45
|
const plugins: ColumnsConfig =
|
|
102
46
|
(regularTable as any)[PRIVATE_PLUGIN_SYMBOL] || {};
|
|
103
47
|
const isSettingsOpen = viewer.hasAttribute("settings");
|
|
104
|
-
const isSelectable =
|
|
105
|
-
const isEditable = isEditableMode(
|
|
106
|
-
const isEditableAllowed = isEditableMode(
|
|
48
|
+
const isSelectable = model._edit_mode === "SELECT_ROW_TREE";
|
|
49
|
+
const isEditable = isEditableMode(model, viewer);
|
|
50
|
+
const isEditableAllowed = isEditableMode(model, viewer, true);
|
|
107
51
|
|
|
108
52
|
// Toggle edit mode class on datagrid
|
|
109
53
|
datagrid.classList.toggle("edit-mode-allowed", isEditableAllowed);
|
|
@@ -117,7 +61,11 @@ export function createConsolidatedStyleListener(
|
|
|
117
61
|
cell as HTMLElement,
|
|
118
62
|
) as CellMetadata | undefined;
|
|
119
63
|
|
|
120
|
-
if (
|
|
64
|
+
if (
|
|
65
|
+
metadata &&
|
|
66
|
+
(metadata.type === "body" ||
|
|
67
|
+
metadata.type === "row_header")
|
|
68
|
+
) {
|
|
121
69
|
const isHeader = cell.tagName === "TH";
|
|
122
70
|
bodyCells.push({
|
|
123
71
|
element: cell as HTMLElement,
|
|
@@ -152,67 +100,18 @@ export function createConsolidatedStyleListener(
|
|
|
152
100
|
}
|
|
153
101
|
}
|
|
154
102
|
|
|
155
|
-
|
|
103
|
+
applyBodyCellStyles(
|
|
104
|
+
model,
|
|
156
105
|
bodyCells,
|
|
157
106
|
plugins,
|
|
158
107
|
isSettingsOpen,
|
|
159
108
|
isSelectable,
|
|
160
109
|
isEditable,
|
|
161
110
|
regularTable,
|
|
162
|
-
selectedRowsMap,
|
|
163
|
-
selectedPositionMap,
|
|
164
|
-
viewer,
|
|
165
111
|
);
|
|
166
112
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
113
|
+
applyGroupHeaderStyles(model, groupHeaderRows, regularTable);
|
|
114
|
+
applyColumnHeaderStyles(model, groupHeaderRows, regularTable, viewer);
|
|
115
|
+
applyFocusStyle(model, bodyCells, regularTable, selectedPositionMap);
|
|
170
116
|
};
|
|
171
117
|
}
|
|
172
|
-
|
|
173
|
-
declare module "../types.js" {
|
|
174
|
-
interface DatagridModel {
|
|
175
|
-
_applyBodyCellStyles(
|
|
176
|
-
cells: CollectedCell[],
|
|
177
|
-
plugins: ColumnsConfig,
|
|
178
|
-
isSettingsOpen: boolean,
|
|
179
|
-
isSelectable: boolean,
|
|
180
|
-
isEditable: boolean,
|
|
181
|
-
regularTable: RegularTableElement,
|
|
182
|
-
selectedRowsMap: LocalSelectedRowsMap,
|
|
183
|
-
selectedPositionMap: LocalSelectedPositionMap,
|
|
184
|
-
viewer: PerspectiveViewerElement,
|
|
185
|
-
): void;
|
|
186
|
-
_applyGroupHeaderStyles(
|
|
187
|
-
headerRows: CollectedHeaderRow[],
|
|
188
|
-
regularTable: RegularTableElement,
|
|
189
|
-
): void;
|
|
190
|
-
_applyColumnHeaderStyles(
|
|
191
|
-
headerRows: CollectedHeaderRow[],
|
|
192
|
-
regularTable: RegularTableElement,
|
|
193
|
-
viewer: PerspectiveViewerElement,
|
|
194
|
-
): void;
|
|
195
|
-
_applyFocusStyle(
|
|
196
|
-
cells: CollectedCell[],
|
|
197
|
-
regularTable: RegularTableElement,
|
|
198
|
-
selectedPositionMap: LocalSelectedPositionMap,
|
|
199
|
-
): void;
|
|
200
|
-
_styleColumnHeaderRow(
|
|
201
|
-
headerRow: CollectedHeaderRow,
|
|
202
|
-
regularTable: RegularTableElement,
|
|
203
|
-
is_menu_row: boolean,
|
|
204
|
-
): void;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Install the styling methods on the DatagridModel prototype.
|
|
210
|
-
* This should be called once during module initialization.
|
|
211
|
-
*/
|
|
212
|
-
export function installConsolidatedStyleMethods(modelPrototype: any): void {
|
|
213
|
-
modelPrototype._applyBodyCellStyles = applyBodyCellStyles;
|
|
214
|
-
modelPrototype._applyGroupHeaderStyles = applyGroupHeaderStyles;
|
|
215
|
-
modelPrototype._applyColumnHeaderStyles = applyColumnHeaderStyles;
|
|
216
|
-
modelPrototype._applyFocusStyle = applyFocusStyle;
|
|
217
|
-
modelPrototype._styleColumnHeaderRow = styleColumnHeaderRow;
|
|
218
|
-
}
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
|
|
13
13
|
import { RegularTableElement } from "regular-table";
|
|
14
14
|
|
|
15
|
-
import type { DatagridModel
|
|
15
|
+
import type { DatagridModel } from "../types.js";
|
|
16
|
+
import type { HTMLPerspectiveViewerElement } from "@perspective-dev/viewer";
|
|
17
|
+
import { styleColumnHeaderRow } from "./column_header.js";
|
|
16
18
|
|
|
17
19
|
import { CollectedHeaderRow } from "./types.js";
|
|
18
20
|
|
|
@@ -20,15 +22,15 @@ import { CollectedHeaderRow } from "./types.js";
|
|
|
20
22
|
* Apply styles to column header rows.
|
|
21
23
|
*/
|
|
22
24
|
export function applyColumnHeaderStyles(
|
|
23
|
-
|
|
25
|
+
model: DatagridModel,
|
|
24
26
|
headerRows: CollectedHeaderRow[],
|
|
25
27
|
regularTable: RegularTableElement,
|
|
26
|
-
viewer:
|
|
28
|
+
viewer: HTMLPerspectiveViewerElement,
|
|
27
29
|
): void {
|
|
28
30
|
if (headerRows.length === 0) return;
|
|
29
31
|
|
|
30
32
|
// Style selected column for settings panel
|
|
31
|
-
const selectedColumn =
|
|
33
|
+
const selectedColumn = model._column_settings_selected_column;
|
|
32
34
|
const len = headerRows.length;
|
|
33
35
|
const settings_open = viewer.hasAttribute("settings");
|
|
34
36
|
|
|
@@ -76,19 +78,19 @@ export function applyColumnHeaderStyles(
|
|
|
76
78
|
}
|
|
77
79
|
|
|
78
80
|
// Style the actual column header rows
|
|
79
|
-
const colHeadersIndex =
|
|
81
|
+
const colHeadersIndex = model._config.split_by.length;
|
|
80
82
|
if (colHeadersIndex < headerRows.length) {
|
|
81
83
|
const colHeaders = headerRows[colHeadersIndex];
|
|
82
84
|
if (colHeaders) {
|
|
83
|
-
|
|
85
|
+
styleColumnHeaderRow(model, colHeaders, regularTable, false);
|
|
84
86
|
}
|
|
85
87
|
}
|
|
86
88
|
|
|
87
|
-
const menuHeadersIndex =
|
|
89
|
+
const menuHeadersIndex = model._config.split_by.length + 1;
|
|
88
90
|
if (menuHeadersIndex < headerRows.length) {
|
|
89
91
|
const menuHeaders = headerRows[menuHeadersIndex];
|
|
90
92
|
if (menuHeaders) {
|
|
91
|
-
|
|
93
|
+
styleColumnHeaderRow(model, menuHeaders, regularTable, true);
|
|
92
94
|
}
|
|
93
95
|
}
|
|
94
96
|
}
|
|
@@ -11,18 +11,18 @@
|
|
|
11
11
|
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
12
|
|
|
13
13
|
import { RegularTableElement } from "regular-table";
|
|
14
|
-
import type { DatagridModel,
|
|
15
|
-
import { CollectedCell
|
|
14
|
+
import type { DatagridModel, SelectedPositionMap } from "../types.js";
|
|
15
|
+
import { CollectedCell } from "./types.js";
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* Apply focus style to the selected cell.
|
|
19
19
|
* Optimized to use collected cells instead of querySelectorAll.
|
|
20
20
|
*/
|
|
21
21
|
export function applyFocusStyle(
|
|
22
|
-
|
|
22
|
+
_model: DatagridModel,
|
|
23
23
|
cells: CollectedCell[],
|
|
24
24
|
regularTable: RegularTableElement,
|
|
25
|
-
selectedPositionMap:
|
|
25
|
+
selectedPositionMap: SelectedPositionMap,
|
|
26
26
|
): void {
|
|
27
27
|
const selected_position = selectedPositionMap.get(regularTable);
|
|
28
28
|
const host = regularTable.getRootNode() as Document;
|
|
@@ -60,7 +60,7 @@ export function applyFocusStyle(
|
|
|
60
60
|
*/
|
|
61
61
|
export function focusSelectedCell(
|
|
62
62
|
regularTable: RegularTableElement,
|
|
63
|
-
selectedPositionMap:
|
|
63
|
+
selectedPositionMap: SelectedPositionMap,
|
|
64
64
|
): boolean {
|
|
65
65
|
const selected_position = selectedPositionMap.get(regularTable);
|
|
66
66
|
if (!selected_position) {
|
|
@@ -19,11 +19,11 @@ import { CollectedHeaderRow } from "./types.js";
|
|
|
19
19
|
* Apply styles to group header rows.
|
|
20
20
|
*/
|
|
21
21
|
export function applyGroupHeaderStyles(
|
|
22
|
-
|
|
22
|
+
model: DatagridModel,
|
|
23
23
|
headerRows: CollectedHeaderRow[],
|
|
24
24
|
regularTable: RegularTableElement,
|
|
25
25
|
): void {
|
|
26
|
-
const header_depth =
|
|
26
|
+
const header_depth = model._config.group_by.length;
|
|
27
27
|
const m: boolean[][] = [];
|
|
28
28
|
let marked = new Set<number>();
|
|
29
29
|
|
|
@@ -54,6 +54,7 @@ export function applyGroupHeaderStyles(
|
|
|
54
54
|
);
|
|
55
55
|
|
|
56
56
|
td.classList.toggle("psp-color-mode-bar", false);
|
|
57
|
+
td.classList.toggle("psp-color-mode-label-bar", false);
|
|
57
58
|
td.classList.toggle("psp-header-sort-asc", false);
|
|
58
59
|
td.classList.toggle("psp-header-sort-desc", false);
|
|
59
60
|
td.classList.toggle("psp-header-sort-col-asc", false);
|
|
@@ -14,7 +14,7 @@ import { CellMetadata } from "regular-table/dist/esm/types.js";
|
|
|
14
14
|
import type { DatagridModel, ColumnConfig, ColorRecord } from "../../types.js";
|
|
15
15
|
|
|
16
16
|
export function cell_style_boolean(
|
|
17
|
-
|
|
17
|
+
model: DatagridModel,
|
|
18
18
|
_plugin: ColumnConfig | undefined,
|
|
19
19
|
td: HTMLElement,
|
|
20
20
|
metadata: CellMetadata,
|
|
@@ -26,9 +26,9 @@ export function cell_style_boolean(
|
|
|
26
26
|
} else {
|
|
27
27
|
const [hex]: ColorRecord | [string, number, number, number, string] =
|
|
28
28
|
metadata.user === true
|
|
29
|
-
?
|
|
29
|
+
? model._pos_fg_color
|
|
30
30
|
: metadata.user === false
|
|
31
|
-
?
|
|
31
|
+
? model._neg_fg_color
|
|
32
32
|
: ["", 0, 0, 0, ""];
|
|
33
33
|
td.style.backgroundColor = "";
|
|
34
34
|
td.style.color = hex;
|
|
@@ -14,14 +14,14 @@ import { CellMetadataBody } from "regular-table/dist/esm/types.js";
|
|
|
14
14
|
import type { DatagridModel, ColorRecord } from "../../types.js";
|
|
15
15
|
|
|
16
16
|
export function style_cell_flash(
|
|
17
|
-
|
|
17
|
+
model: DatagridModel,
|
|
18
18
|
metadata: CellMetadataBody,
|
|
19
19
|
td: HTMLElement,
|
|
20
20
|
[, , , , , pos_s, pos_e]: ColorRecord,
|
|
21
21
|
[, , , , , neg_s, neg_e]: ColorRecord,
|
|
22
22
|
is_settings_open: boolean,
|
|
23
23
|
): void {
|
|
24
|
-
const id =
|
|
24
|
+
const id = model._ids?.[metadata.dy ?? 0]?.join("|");
|
|
25
25
|
const metadata_path = (
|
|
26
26
|
is_settings_open
|
|
27
27
|
? (metadata.column_header ?? []).slice(0, -1)
|
|
@@ -29,19 +29,19 @@ export function style_cell_flash(
|
|
|
29
29
|
).join("|");
|
|
30
30
|
|
|
31
31
|
if (
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
model.last_reverse_columns?.has(metadata_path) &&
|
|
33
|
+
model.last_reverse_ids?.has(id)
|
|
34
34
|
) {
|
|
35
|
-
const row_idx =
|
|
36
|
-
const col_idx =
|
|
37
|
-
if (!
|
|
35
|
+
const row_idx = model.last_reverse_ids?.get(id);
|
|
36
|
+
const col_idx = model.last_reverse_columns.get(metadata_path);
|
|
37
|
+
if (!model._is_old_viewport) {
|
|
38
38
|
td.style.animation = "";
|
|
39
39
|
} else if (
|
|
40
40
|
col_idx !== undefined &&
|
|
41
41
|
row_idx !== undefined &&
|
|
42
|
-
(
|
|
42
|
+
(model.last_meta?.[col_idx]?.[row_idx] as number | undefined) !==
|
|
43
43
|
undefined &&
|
|
44
|
-
(
|
|
44
|
+
(model.last_meta![col_idx]![row_idx] as number) >
|
|
45
45
|
((metadata.user ?? 0) as number)
|
|
46
46
|
) {
|
|
47
47
|
td.style.setProperty("--pulse--background-color-start", neg_s);
|
|
@@ -54,9 +54,9 @@ export function style_cell_flash(
|
|
|
54
54
|
} else if (
|
|
55
55
|
col_idx !== undefined &&
|
|
56
56
|
row_idx !== undefined &&
|
|
57
|
-
(
|
|
57
|
+
(model.last_meta?.[col_idx]?.[row_idx] as number | undefined) !==
|
|
58
58
|
undefined &&
|
|
59
|
-
(
|
|
59
|
+
(model.last_meta![col_idx]![row_idx] as number) <
|
|
60
60
|
((metadata.user ?? 0) as number)
|
|
61
61
|
) {
|
|
62
62
|
td.style.setProperty("--pulse--background-color-start", pos_s);
|
|
@@ -17,20 +17,23 @@ import {
|
|
|
17
17
|
} from "../../color_utils.js";
|
|
18
18
|
import type { DatagridModel, ColumnConfig, ColorRecord } from "../../types.js";
|
|
19
19
|
|
|
20
|
+
interface PluginWithColor extends Omit<ColumnConfig, "color"> {
|
|
21
|
+
color?: ColorRecord;
|
|
22
|
+
}
|
|
23
|
+
|
|
20
24
|
export function cell_style_datetime(
|
|
21
|
-
|
|
22
|
-
plugin:
|
|
25
|
+
model: DatagridModel,
|
|
26
|
+
plugin: PluginWithColor,
|
|
23
27
|
td: HTMLElement,
|
|
24
28
|
metadata: CellMetadata,
|
|
25
29
|
): void {
|
|
26
|
-
const colorRecord: ColorRecord =
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
// })();
|
|
30
|
+
const colorRecord: ColorRecord = (() => {
|
|
31
|
+
if (plugin?.color !== undefined) {
|
|
32
|
+
return plugin.color;
|
|
33
|
+
} else {
|
|
34
|
+
return model._color;
|
|
35
|
+
}
|
|
36
|
+
})();
|
|
34
37
|
|
|
35
38
|
const [hex, r, g, b] = colorRecord;
|
|
36
39
|
|
|
@@ -48,7 +51,7 @@ export function cell_style_datetime(
|
|
|
48
51
|
plugin?.datetime_color_mode === "background" &&
|
|
49
52
|
metadata.user !== null
|
|
50
53
|
) {
|
|
51
|
-
const source =
|
|
54
|
+
const source = model._plugin_background as [number, number, number];
|
|
52
55
|
const foreground = infer_foreground_from_background(
|
|
53
56
|
rgbaToRgb([r, g, b, 1], source),
|
|
54
57
|
);
|
|
@@ -36,7 +36,7 @@ interface PluginWithColors
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
export function cell_style_numeric(
|
|
39
|
-
|
|
39
|
+
model: DatagridModel,
|
|
40
40
|
plugin: PluginWithColors | undefined,
|
|
41
41
|
td: HTMLElement,
|
|
42
42
|
metadata: CellMetaWithExtras,
|
|
@@ -49,14 +49,14 @@ export function cell_style_numeric(
|
|
|
49
49
|
if (plugin?.pos_bg_color !== undefined) {
|
|
50
50
|
pos_bg_color = plugin.pos_bg_color;
|
|
51
51
|
} else {
|
|
52
|
-
pos_bg_color =
|
|
52
|
+
pos_bg_color = model._pos_bg_color;
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
let neg_bg_color: ColorRecord;
|
|
56
56
|
if (plugin?.neg_bg_color !== undefined) {
|
|
57
57
|
neg_bg_color = plugin.neg_bg_color;
|
|
58
58
|
} else {
|
|
59
|
-
neg_bg_color =
|
|
59
|
+
neg_bg_color = model._neg_bg_color;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
const bg_tuple: ColorRecord = is_positive
|
|
@@ -65,9 +65,9 @@ export function cell_style_numeric(
|
|
|
65
65
|
? neg_bg_color
|
|
66
66
|
: [
|
|
67
67
|
"",
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
model._plugin_background[0],
|
|
69
|
+
model._plugin_background[1],
|
|
70
|
+
model._plugin_background[2],
|
|
71
71
|
"",
|
|
72
72
|
"",
|
|
73
73
|
"",
|
|
@@ -91,7 +91,7 @@ export function cell_style_numeric(
|
|
|
91
91
|
Math.abs((metadata.user ?? 0) / (plugin.bg_gradient ?? 1)),
|
|
92
92
|
),
|
|
93
93
|
);
|
|
94
|
-
const source =
|
|
94
|
+
const source = model._plugin_background as [number, number, number];
|
|
95
95
|
const foreground = infer_foreground_from_background(
|
|
96
96
|
rgbaToRgb([r, g, b, a], source),
|
|
97
97
|
);
|
|
@@ -100,8 +100,8 @@ export function cell_style_numeric(
|
|
|
100
100
|
td.style.color = foreground;
|
|
101
101
|
td.style.backgroundColor = `rgba(${r},${g},${b},${a})`;
|
|
102
102
|
} else if (plugin?.number_bg_mode === "pulse") {
|
|
103
|
-
style_cell_flash
|
|
104
|
-
|
|
103
|
+
style_cell_flash(
|
|
104
|
+
model,
|
|
105
105
|
metadata as any,
|
|
106
106
|
td,
|
|
107
107
|
pos_bg_color,
|
|
@@ -129,23 +129,23 @@ export function cell_style_numeric(
|
|
|
129
129
|
? plugin.neg_fg_color!
|
|
130
130
|
: [
|
|
131
131
|
"",
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
132
|
+
model._plugin_background[0],
|
|
133
|
+
model._plugin_background[1],
|
|
134
|
+
model._plugin_background[2],
|
|
135
135
|
"",
|
|
136
136
|
"",
|
|
137
137
|
"",
|
|
138
138
|
];
|
|
139
139
|
} else {
|
|
140
140
|
return is_positive
|
|
141
|
-
?
|
|
141
|
+
? model._pos_fg_color
|
|
142
142
|
: is_negative
|
|
143
|
-
?
|
|
143
|
+
? model._neg_fg_color
|
|
144
144
|
: [
|
|
145
145
|
"",
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
146
|
+
model._plugin_background[0],
|
|
147
|
+
model._plugin_background[1],
|
|
148
|
+
model._plugin_background[2],
|
|
149
149
|
"",
|
|
150
150
|
"",
|
|
151
151
|
"",
|
|
@@ -160,7 +160,7 @@ export function cell_style_numeric(
|
|
|
160
160
|
td.style.color = "";
|
|
161
161
|
} else if (plugin?.number_fg_mode === "disabled") {
|
|
162
162
|
if (plugin?.number_bg_mode === "color") {
|
|
163
|
-
const source =
|
|
163
|
+
const source = model._plugin_background as [number, number, number];
|
|
164
164
|
const foreground = infer_foreground_from_background(
|
|
165
165
|
rgbaToRgb([bg_tuple[1], bg_tuple[2], bg_tuple[3], 1], source),
|
|
166
166
|
);
|
|
@@ -173,13 +173,12 @@ export function cell_style_numeric(
|
|
|
173
173
|
} else if (plugin?.number_fg_mode === "bar") {
|
|
174
174
|
td.style.color = "";
|
|
175
175
|
td.style.position = "relative";
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
)
|
|
181
|
-
|
|
182
|
-
}
|
|
176
|
+
td.style.setProperty("--psp-label-bar-color", gradhex);
|
|
177
|
+
td.style.setProperty("--psp-label-bar-bg", hex);
|
|
178
|
+
} else if (plugin?.number_fg_mode === "label-bar") {
|
|
179
|
+
td.style.color = "";
|
|
180
|
+
td.style.setProperty("--psp-label-bar-color", gradhex);
|
|
181
|
+
td.style.setProperty("--psp-label-bar-bg", hex);
|
|
183
182
|
} else if (plugin?.number_fg_mode === "color" || !plugin?.number_fg_mode) {
|
|
184
183
|
td.style.color = hex;
|
|
185
184
|
}
|
|
@@ -18,7 +18,7 @@ import type { DatagridModel } from "../../types.js";
|
|
|
18
18
|
import { RegularTableElement } from "regular-table";
|
|
19
19
|
|
|
20
20
|
export function cell_style_row_header(
|
|
21
|
-
|
|
21
|
+
model: DatagridModel,
|
|
22
22
|
regularTable: RegularTableElement,
|
|
23
23
|
td: HTMLElement,
|
|
24
24
|
metadata: CellMetadataRowHeader,
|
|
@@ -28,7 +28,7 @@ export function cell_style_row_header(
|
|
|
28
28
|
metadata.value !== null &&
|
|
29
29
|
metadata.value?.toString()?.trim().length > 0;
|
|
30
30
|
const is_leaf =
|
|
31
|
-
(metadata.row_header_x ?? 0) >=
|
|
31
|
+
(metadata.row_header_x ?? 0) >= model._config.group_by.length;
|
|
32
32
|
const next = regularTable.getMeta({
|
|
33
33
|
dx: 0,
|
|
34
34
|
dy: (metadata.y ?? 0) - (metadata.y0 ?? 0) + 1,
|
|
@@ -10,10 +10,13 @@
|
|
|
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 {
|
|
15
|
-
|
|
14
|
+
hslToRgb,
|
|
16
15
|
infer_foreground_from_background,
|
|
16
|
+
parseColor,
|
|
17
|
+
rgbaToRgb,
|
|
18
|
+
rgbToHex,
|
|
19
|
+
rgbToHsl,
|
|
17
20
|
} from "../../color_utils.js";
|
|
18
21
|
import type { DatagridModel, ColumnConfig, ColorRecord } from "../../types.js";
|
|
19
22
|
|
|
@@ -28,17 +31,17 @@ interface PluginWithColor extends Omit<ColumnConfig, "color"> {
|
|
|
28
31
|
}
|
|
29
32
|
|
|
30
33
|
export function cell_style_string(
|
|
31
|
-
|
|
34
|
+
model: DatagridModel,
|
|
32
35
|
plugin: PluginWithColor | undefined,
|
|
33
36
|
td: HTMLElement,
|
|
34
37
|
metadata: CellMetaWithExtras,
|
|
35
38
|
): void {
|
|
36
|
-
const column_name = metadata.column_header?.[
|
|
39
|
+
const column_name = metadata.column_header?.[model._config.split_by.length];
|
|
37
40
|
const colorRecord: ColorRecord = (() => {
|
|
38
41
|
if (plugin?.color !== undefined) {
|
|
39
42
|
return plugin.color;
|
|
40
43
|
} else {
|
|
41
|
-
return
|
|
44
|
+
return model._color;
|
|
42
45
|
}
|
|
43
46
|
})();
|
|
44
47
|
|
|
@@ -60,7 +63,7 @@ export function cell_style_string(
|
|
|
60
63
|
plugin?.string_color_mode === "background" &&
|
|
61
64
|
metadata.user !== null
|
|
62
65
|
) {
|
|
63
|
-
const source =
|
|
66
|
+
const source = model._plugin_background as [number, number, number];
|
|
64
67
|
const foreground = infer_foreground_from_background(
|
|
65
68
|
rgbaToRgb([r, g, b, 1], source),
|
|
66
69
|
);
|
|
@@ -71,25 +74,24 @@ export function cell_style_string(
|
|
|
71
74
|
metadata.user !== null &&
|
|
72
75
|
column_name
|
|
73
76
|
) {
|
|
74
|
-
if (!
|
|
75
|
-
|
|
76
|
-
|
|
77
|
+
if (!model._series_color_map.has(column_name)) {
|
|
78
|
+
model._series_color_map.set(column_name, new Map());
|
|
79
|
+
model._series_color_seed.set(column_name, 0);
|
|
77
80
|
}
|
|
78
81
|
|
|
79
|
-
const series_map =
|
|
82
|
+
const series_map = model._series_color_map.get(column_name)!;
|
|
80
83
|
if (metadata.user && !series_map.has(metadata.user)) {
|
|
81
|
-
const seed =
|
|
84
|
+
const seed = model._series_color_seed.get(column_name) ?? 0;
|
|
82
85
|
series_map.set(metadata.user, seed);
|
|
83
|
-
|
|
86
|
+
model._series_color_seed.set(column_name, seed + 1);
|
|
84
87
|
}
|
|
85
88
|
|
|
86
89
|
const color_seed = series_map.get(metadata.user!) ?? 0;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
const
|
|
90
|
-
const
|
|
91
|
-
const
|
|
92
|
-
const source = this._plugin_background as [number, number, number];
|
|
90
|
+
const [h, s, l] = rgbToHsl(parseColor(hex));
|
|
91
|
+
const rotated = hslToRgb([h + ((color_seed * 150) % 360), s, l]);
|
|
92
|
+
const [r2, g2, b2] = rotated;
|
|
93
|
+
const hex2 = rgbToHex(rotated);
|
|
94
|
+
const source = model._plugin_background as [number, number, number];
|
|
93
95
|
const foreground = infer_foreground_from_background(
|
|
94
96
|
rgbaToRgb([r2, g2, b2, 1], source),
|
|
95
97
|
);
|
|
@@ -10,13 +10,11 @@
|
|
|
10
10
|
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
11
|
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
12
|
|
|
13
|
-
import { RegularTableElement } from "regular-table";
|
|
14
13
|
import {
|
|
15
14
|
CellMetadata,
|
|
16
15
|
CellMetadataBody,
|
|
17
16
|
CellMetadataRowHeader,
|
|
18
17
|
} from "regular-table/dist/esm/types.js";
|
|
19
|
-
import type { SelectedPosition } from "../types.js";
|
|
20
18
|
|
|
21
19
|
export interface CollectedCell {
|
|
22
20
|
element: HTMLElement;
|
|
@@ -31,11 +29,3 @@ export interface CollectedHeaderRow {
|
|
|
31
29
|
metadata: CellMetadata | undefined;
|
|
32
30
|
}>;
|
|
33
31
|
}
|
|
34
|
-
|
|
35
|
-
// Local types for selection maps - match the actual runtime usage
|
|
36
|
-
// (activate.ts uses `as any` casts when passing these)
|
|
37
|
-
export type LocalSelectedRowsMap = WeakMap<RegularTableElement, unknown[]>;
|
|
38
|
-
export type LocalSelectedPositionMap = WeakMap<
|
|
39
|
-
RegularTableElement,
|
|
40
|
-
SelectedPosition
|
|
41
|
-
>;
|