@gradio/dataframe 0.22.0 → 0.23.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 (128) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/Dataframe.test.ts +777 -31
  3. package/Index.svelte +107 -106
  4. package/dist/Index.svelte +107 -106
  5. package/dist/Index.svelte.d.ts +0 -1
  6. package/dist/shared/BooleanCell.svelte +12 -6
  7. package/dist/shared/BooleanCell.svelte.d.ts +4 -18
  8. package/dist/shared/CellMenu.svelte +74 -49
  9. package/dist/shared/CellMenu.svelte.d.ts +5 -19
  10. package/dist/shared/CellMenuButton.svelte +3 -3
  11. package/dist/shared/CellMenuButton.svelte.d.ts +4 -18
  12. package/dist/shared/CellMenuIcons.svelte +1 -1
  13. package/dist/shared/CellMenuIcons.svelte.d.ts +4 -18
  14. package/dist/shared/DataCell.svelte +189 -0
  15. package/dist/shared/DataCell.svelte.d.ts +44 -0
  16. package/dist/shared/EditableCell.svelte +88 -64
  17. package/dist/shared/EditableCell.svelte.d.ts +8 -26
  18. package/dist/shared/EmptyRowButton.svelte +2 -2
  19. package/dist/shared/EmptyRowButton.svelte.d.ts +4 -18
  20. package/dist/shared/FilterMenu.svelte +26 -18
  21. package/dist/shared/FilterMenu.svelte.d.ts +5 -21
  22. package/dist/shared/HeaderCell.svelte +218 -0
  23. package/dist/shared/HeaderCell.svelte.d.ts +30 -0
  24. package/dist/shared/RowNumber.svelte +4 -2
  25. package/dist/shared/RowNumber.svelte.d.ts +4 -18
  26. package/dist/shared/Table.svelte +1037 -949
  27. package/dist/shared/Table.svelte.d.ts +12 -30
  28. package/dist/shared/Toolbar.svelte +32 -22
  29. package/dist/shared/Toolbar.svelte.d.ts +6 -21
  30. package/dist/shared/column_measurement.svelte.d.ts +20 -0
  31. package/dist/shared/column_measurement.svelte.js +79 -0
  32. package/dist/shared/icons/FilterIcon.svelte +14 -6
  33. package/dist/shared/icons/FilterIcon.svelte.d.ts +14 -6
  34. package/dist/shared/icons/Padlock.svelte +6 -2
  35. package/dist/shared/icons/Padlock.svelte.d.ts +4 -25
  36. package/dist/shared/icons/SelectionButtons.svelte +23 -8
  37. package/dist/shared/icons/SelectionButtons.svelte.d.ts +4 -18
  38. package/dist/shared/icons/SortButtonDown.svelte +15 -4
  39. package/dist/shared/icons/SortButtonDown.svelte.d.ts +4 -25
  40. package/dist/shared/icons/SortButtonUp.svelte +15 -5
  41. package/dist/shared/icons/SortButtonUp.svelte.d.ts +4 -25
  42. package/dist/shared/icons/SortIcon.svelte +13 -7
  43. package/dist/shared/icons/SortIcon.svelte.d.ts +7 -21
  44. package/dist/shared/tanstack/index.d.ts +3 -0
  45. package/dist/shared/tanstack/index.js +3 -0
  46. package/dist/shared/tanstack/table.svelte.d.ts +26 -0
  47. package/dist/shared/tanstack/table.svelte.js +102 -0
  48. package/dist/shared/tanstack/virtual.svelte.d.ts +14 -0
  49. package/dist/shared/tanstack/virtual.svelte.js +76 -0
  50. package/dist/shared/types.d.ts +2 -0
  51. package/dist/shared/utils/filter.d.ts +5 -0
  52. package/dist/shared/utils/filter.js +62 -0
  53. package/dist/shared/utils/selection_utils.js +1 -1
  54. package/dist/shared/utils/table_utils.d.ts +1 -14
  55. package/dist/shared/utils/table_utils.js +0 -61
  56. package/dist/standalone/Index.svelte +71 -46
  57. package/dist/standalone/Index.svelte.d.ts +4 -23
  58. package/dist/types.d.ts +32 -0
  59. package/dist/types.js +1 -0
  60. package/package.json +12 -11
  61. package/shared/BooleanCell.svelte +12 -6
  62. package/shared/CellMenu.svelte +74 -49
  63. package/shared/CellMenuButton.svelte +3 -3
  64. package/shared/CellMenuIcons.svelte +1 -1
  65. package/shared/DataCell.svelte +189 -0
  66. package/shared/EditableCell.svelte +88 -64
  67. package/shared/EmptyRowButton.svelte +2 -2
  68. package/shared/FilterMenu.svelte +26 -18
  69. package/shared/HeaderCell.svelte +218 -0
  70. package/shared/RowNumber.svelte +4 -2
  71. package/shared/Table.svelte +1037 -949
  72. package/shared/Toolbar.svelte +32 -22
  73. package/shared/column_measurement.svelte.ts +103 -0
  74. package/shared/icons/FilterIcon.svelte +14 -6
  75. package/shared/icons/Padlock.svelte +6 -2
  76. package/shared/icons/SelectionButtons.svelte +23 -8
  77. package/shared/icons/SortButtonDown.svelte +15 -4
  78. package/shared/icons/SortButtonUp.svelte +15 -5
  79. package/shared/icons/SortIcon.svelte +13 -7
  80. package/shared/tanstack/index.ts +23 -0
  81. package/shared/tanstack/table.svelte.ts +117 -0
  82. package/shared/tanstack/virtual.svelte.ts +105 -0
  83. package/shared/types.ts +3 -0
  84. package/shared/utils/filter.ts +66 -0
  85. package/shared/utils/selection_utils.ts +1 -1
  86. package/shared/utils/table_utils.ts +1 -100
  87. package/standalone/Index.svelte +71 -46
  88. package/test/filter.test.ts +350 -0
  89. package/test/selection_utils.test.ts +416 -0
  90. package/test/table_utils.test.ts +45 -112
  91. package/types.ts +34 -0
  92. package/dist/shared/TableCell.svelte +0 -330
  93. package/dist/shared/TableCell.svelte.d.ts +0 -66
  94. package/dist/shared/TableHeader.svelte +0 -344
  95. package/dist/shared/TableHeader.svelte.d.ts +0 -61
  96. package/dist/shared/VirtualTable.svelte +0 -379
  97. package/dist/shared/VirtualTable.svelte.d.ts +0 -42
  98. package/dist/shared/context/dataframe_context.d.ts +0 -180
  99. package/dist/shared/context/dataframe_context.js +0 -412
  100. package/dist/shared/icons/SortArrowDown.svelte +0 -25
  101. package/dist/shared/icons/SortArrowDown.svelte.d.ts +0 -20
  102. package/dist/shared/icons/SortArrowUp.svelte +0 -25
  103. package/dist/shared/icons/SortArrowUp.svelte.d.ts +0 -20
  104. package/dist/shared/utils/data_processing.d.ts +0 -14
  105. package/dist/shared/utils/data_processing.js +0 -47
  106. package/dist/shared/utils/drag_utils.d.ts +0 -15
  107. package/dist/shared/utils/drag_utils.js +0 -67
  108. package/dist/shared/utils/filter_utils.d.ts +0 -29
  109. package/dist/shared/utils/filter_utils.js +0 -123
  110. package/dist/shared/utils/keyboard_utils.d.ts +0 -3
  111. package/dist/shared/utils/keyboard_utils.js +0 -236
  112. package/dist/shared/utils/menu_utils.d.ts +0 -42
  113. package/dist/shared/utils/menu_utils.js +0 -58
  114. package/dist/shared/utils/sort_utils.d.ts +0 -26
  115. package/dist/shared/utils/sort_utils.js +0 -59
  116. package/shared/TableCell.svelte +0 -330
  117. package/shared/TableHeader.svelte +0 -344
  118. package/shared/VirtualTable.svelte +0 -379
  119. package/shared/context/dataframe_context.ts +0 -701
  120. package/shared/icons/SortArrowDown.svelte +0 -25
  121. package/shared/icons/SortArrowUp.svelte +0 -25
  122. package/shared/utils/data_processing.ts +0 -77
  123. package/shared/utils/drag_utils.ts +0 -105
  124. package/shared/utils/filter_utils.ts +0 -208
  125. package/shared/utils/keyboard_utils.ts +0 -309
  126. package/shared/utils/menu_utils.ts +0 -115
  127. package/shared/utils/sort_utils.ts +0 -91
  128. package/test/sort_utils.test.ts +0 -323
@@ -1,123 +0,0 @@
1
- import { filter_table_data } from "./table_utils";
2
- export function filter_data(data, filter_columns) {
3
- if (!data || !data.length || !data[0]) {
4
- return [];
5
- }
6
- let row_indices = [...Array(data.length)].map((_, i) => i);
7
- if (filter_columns.length > 0) {
8
- filter_columns.forEach((column) => {
9
- if (column.datatype === "string") {
10
- switch (column.filter) {
11
- case "Contains":
12
- row_indices = row_indices.filter((i) => data[i][column.col]?.value.toString().includes(column.value));
13
- break;
14
- case "Does not contain":
15
- row_indices = row_indices.filter((i) => !data[i][column.col]?.value.toString().includes(column.value));
16
- break;
17
- case "Starts with":
18
- row_indices = row_indices.filter((i) => data[i][column.col]?.value.toString().startsWith(column.value));
19
- break;
20
- case "Ends with":
21
- row_indices = row_indices.filter((i) => data[i][column.col]?.value.toString().endsWith(column.value));
22
- break;
23
- case "Is":
24
- row_indices = row_indices.filter((i) => data[i][column.col]?.value.toString() === column.value);
25
- break;
26
- case "Is not":
27
- row_indices = row_indices.filter((i) => !(data[i][column.col]?.value.toString() === column.value));
28
- break;
29
- case "Is empty":
30
- row_indices = row_indices.filter((i) => data[i][column.col]?.value.toString() === "");
31
- break;
32
- case "Is not empty":
33
- row_indices = row_indices.filter((i) => !(data[i][column.col]?.value.toString() === ""));
34
- break;
35
- }
36
- }
37
- else if (column.datatype === "number") {
38
- switch (column.filter) {
39
- case "=":
40
- row_indices = row_indices.filter((i) => {
41
- if (!isNaN(Number(data[i][column.col]?.value)) &&
42
- !isNaN(Number(column.value))) {
43
- return (Number(data[i][column.col]?.value) === Number(column.value));
44
- }
45
- return false;
46
- });
47
- break;
48
- case "≠":
49
- row_indices = row_indices.filter((i) => {
50
- if (!isNaN(Number(data[i][column.col]?.value)) &&
51
- !isNaN(Number(column.value))) {
52
- return !(Number(data[i][column.col]?.value) === Number(column.value));
53
- }
54
- return false;
55
- });
56
- break;
57
- case ">":
58
- row_indices = row_indices.filter((i) => {
59
- if (!isNaN(Number(data[i][column.col]?.value)) &&
60
- !isNaN(Number(column.value))) {
61
- return (Number(data[i][column.col]?.value) > Number(column.value));
62
- }
63
- return false;
64
- });
65
- break;
66
- case "<":
67
- row_indices = row_indices.filter((i) => {
68
- if (!isNaN(Number(data[i][column.col]?.value)) &&
69
- !isNaN(Number(column.value))) {
70
- return (Number(data[i][column.col]?.value) < Number(column.value));
71
- }
72
- return false;
73
- });
74
- break;
75
- case "≥":
76
- row_indices = row_indices.filter((i) => {
77
- if (!isNaN(Number(data[i][column.col]?.value)) &&
78
- !isNaN(Number(column.value))) {
79
- return (Number(data[i][column.col]?.value) >= Number(column.value));
80
- }
81
- return false;
82
- });
83
- break;
84
- case "≤":
85
- row_indices = row_indices.filter((i) => {
86
- if (!isNaN(Number(data[i][column.col]?.value)) &&
87
- !isNaN(Number(column.value))) {
88
- return (Number(data[i][column.col]?.value) <= Number(column.value));
89
- }
90
- return false;
91
- });
92
- break;
93
- case "Is empty":
94
- row_indices = row_indices.filter((i) => data[i][column.col]?.value.toString() === "");
95
- break;
96
- case "Is not empty":
97
- row_indices = row_indices.filter((i) => {
98
- if (!isNaN(Number(data[i][column.col]?.value))) {
99
- return !(data[i][column.col]?.value.toString() === "");
100
- }
101
- return false;
102
- });
103
- break;
104
- }
105
- }
106
- });
107
- return row_indices;
108
- }
109
- return [...Array(data.length)].map((_, i) => i);
110
- }
111
- export function filter_data_and_preserve_selection(data, display_value, styling, filter_columns, selected, get_current_indices, original_data, original_display_value, original_styling) {
112
- let id = null;
113
- if (selected && selected[0] in data && selected[1] in data[selected[0]]) {
114
- id = data[selected[0]][selected[1]].id;
115
- }
116
- filter_table_data(data, display_value, styling, filter_columns, original_data, original_display_value, original_styling);
117
- let new_selected = selected;
118
- if (id) {
119
- const [i, j] = get_current_indices(id, data);
120
- new_selected = [i, j];
121
- }
122
- return { data, selected: new_selected };
123
- }
@@ -1,3 +0,0 @@
1
- import type { DataFrameContext } from "../context/dataframe_context";
2
- export declare function handle_cell_blur(event: FocusEvent, ctx: DataFrameContext, coords: [number, number]): Promise<void>;
3
- export declare function handle_keydown(event: KeyboardEvent, context: DataFrameContext): Promise<void>;
@@ -1,236 +0,0 @@
1
- import { dequal } from "dequal/lite";
2
- import { handle_delete_key } from "../utils/selection_utils";
3
- import { tick } from "svelte";
4
- import { get } from "svelte/store";
5
- import { copy_table_data } from "./table_utils";
6
- async function save_cell_value(input_value, ctx, row, col) {
7
- if (!ctx.data || !ctx.data[row] || !ctx.data[row][col])
8
- return;
9
- const old_value = ctx.data[row][col].value;
10
- ctx.data[row][col].value = input_value;
11
- if (ctx.data[row][col].display_value !== undefined) {
12
- ctx.data[row][col].display_value = input_value;
13
- }
14
- if (old_value !== input_value && ctx.dispatch) {
15
- ctx.dispatch("change", {
16
- data: ctx.data.map((row) => row.map((cell) => cell.value)),
17
- headers: ctx.headers?.map((h) => h.value) || [],
18
- metadata: null
19
- });
20
- }
21
- ctx.actions.set_selected([row, col]);
22
- }
23
- export async function handle_cell_blur(event, ctx, coords) {
24
- if (!ctx.data || !ctx.headers || !ctx.els)
25
- return;
26
- const input_el = event.target;
27
- if (!input_el || input_el.value === undefined)
28
- return;
29
- await save_cell_value(input_el.value, ctx, coords[0], coords[1]);
30
- }
31
- function handle_header_navigation(event, ctx) {
32
- const state = get(ctx.state);
33
- const selected_header = state.ui_state.selected_header;
34
- const header_edit = state.ui_state.header_edit;
35
- const headers = ctx.headers || [];
36
- if (selected_header === false || header_edit !== false)
37
- return false;
38
- switch (event.key) {
39
- case "ArrowDown":
40
- ctx.actions.set_selected_header(false);
41
- ctx.actions.set_selected([0, selected_header]);
42
- ctx.actions.set_selected_cells([[0, selected_header]]);
43
- return true;
44
- case "ArrowLeft":
45
- ctx.actions.set_selected_header(selected_header > 0 ? selected_header - 1 : selected_header);
46
- return true;
47
- case "ArrowRight":
48
- ctx.actions.set_selected_header(selected_header < headers.length - 1
49
- ? selected_header + 1
50
- : selected_header);
51
- return true;
52
- case "Escape":
53
- event.preventDefault();
54
- ctx.actions.set_selected_header(false);
55
- return true;
56
- case "Enter":
57
- event.preventDefault();
58
- if (state.config.editable) {
59
- ctx.actions.set_header_edit(selected_header);
60
- }
61
- return true;
62
- }
63
- return false;
64
- }
65
- // eslint-disable-next-line complexity
66
- function handle_delete_operation(event, ctx) {
67
- if (!ctx.data || !ctx.headers || !ctx.els || !ctx.dispatch)
68
- return false;
69
- const state = get(ctx.state);
70
- if (!state.config.editable)
71
- return false;
72
- if (event.key !== "Delete" && event.key !== "Backspace")
73
- return false;
74
- const editing = state.ui_state.editing;
75
- const selected_cells = state.ui_state.selected_cells;
76
- const static_columns = state.config.static_columns || [];
77
- if (selected_cells.some(([_, col]) => static_columns.includes(col))) {
78
- return false;
79
- }
80
- if (editing) {
81
- const [row, col] = editing;
82
- const input_el = ctx.els[ctx.data[row][col].id]?.input;
83
- if (input_el && input_el.selectionStart !== input_el.selectionEnd) {
84
- return false;
85
- }
86
- if (event.key === "Delete" &&
87
- input_el?.selectionStart !== input_el?.value.length) {
88
- return false;
89
- }
90
- if (event.key === "Backspace" && input_el?.selectionStart !== 0) {
91
- return false;
92
- }
93
- }
94
- event.preventDefault();
95
- if (selected_cells.length > 0) {
96
- const new_data = handle_delete_key(ctx.data, selected_cells);
97
- ctx.dispatch("change", {
98
- data: new_data.map((row) => row.map((cell) => cell.value)),
99
- headers: ctx.headers.map((h) => h.value),
100
- metadata: null
101
- });
102
- }
103
- return true;
104
- }
105
- function handle_arrow_keys(event, ctx, i, j) {
106
- const state = get(ctx.state);
107
- const editing = state.ui_state.editing;
108
- const selected_cells = state.ui_state.selected_cells;
109
- if (editing)
110
- return false;
111
- if (!ctx.data)
112
- return false;
113
- event.preventDefault();
114
- const next_coords = ctx.actions.move_cursor(event, [i, j], ctx.data);
115
- if (next_coords) {
116
- if (event.shiftKey) {
117
- ctx.actions.set_selected_cells(ctx.actions.get_range_selection(selected_cells.length > 0 ? selected_cells[0] : [i, j], next_coords));
118
- ctx.actions.set_editing(false);
119
- }
120
- else {
121
- ctx.actions.set_selected_cells([next_coords]);
122
- ctx.actions.set_editing(false);
123
- }
124
- ctx.actions.set_selected(next_coords);
125
- }
126
- else if (next_coords === false && event.key === "ArrowUp" && i === 0) {
127
- ctx.actions.set_selected_header(j);
128
- ctx.actions.set_selected(false);
129
- ctx.actions.set_selected_cells([]);
130
- ctx.actions.set_editing(false);
131
- }
132
- return true;
133
- }
134
- async function handle_enter_key(event, ctx, i, j) {
135
- if (!ctx.data || !ctx.els)
136
- return false;
137
- const state = get(ctx.state);
138
- if (!state.config.editable)
139
- return false;
140
- const editing = state.ui_state.editing;
141
- if (editing && event.shiftKey)
142
- return false;
143
- event.preventDefault();
144
- if (editing && dequal(editing, [i, j])) {
145
- const cell_id = ctx.data[i][j].id;
146
- const input_el = ctx.els[cell_id]?.input;
147
- if (input_el) {
148
- await save_cell_value(input_el.value, ctx, i, j);
149
- }
150
- ctx.actions.set_editing(false);
151
- await tick();
152
- ctx.parent_element?.focus();
153
- }
154
- else {
155
- ctx.actions.set_editing([i, j]);
156
- }
157
- return true;
158
- }
159
- function handle_tab_key(event, ctx, i, j) {
160
- if (!ctx.data)
161
- return false;
162
- event.preventDefault();
163
- ctx.actions.set_editing(false);
164
- const next_cell = ctx.actions.get_next_cell_coordinates([i, j], ctx.data, event.shiftKey);
165
- if (next_cell) {
166
- ctx.actions.set_selected_cells([next_cell]);
167
- ctx.actions.set_selected(next_cell);
168
- if (get(ctx.state).config.editable) {
169
- ctx.actions.set_editing(next_cell);
170
- }
171
- }
172
- return true;
173
- }
174
- function handle_default_key(event, ctx, i, j) {
175
- const state = get(ctx.state);
176
- if (!state.config.editable)
177
- return false;
178
- const editing = state.ui_state.editing;
179
- if (event.key.length === 1 && (!editing || !dequal(editing, [i, j]))) {
180
- ctx.actions.set_editing([i, j]);
181
- return true;
182
- }
183
- return false;
184
- }
185
- async function handle_cell_navigation(event, ctx) {
186
- if (!ctx.data)
187
- return false;
188
- const state = get(ctx.state);
189
- const selected = state.ui_state.selected;
190
- const selected_cells = state.ui_state.selected_cells;
191
- if (!selected)
192
- return false;
193
- if (event.key === "c" && (event.metaKey || event.ctrlKey)) {
194
- event.preventDefault();
195
- if (selected_cells.length > 0) {
196
- await copy_table_data(ctx.data, selected_cells);
197
- }
198
- ctx.actions.set_copy_flash(true);
199
- return true;
200
- }
201
- const [i, j] = selected;
202
- switch (event.key) {
203
- case "ArrowRight":
204
- case "ArrowLeft":
205
- case "ArrowDown":
206
- case "ArrowUp":
207
- return handle_arrow_keys(event, ctx, i, j);
208
- case "Escape":
209
- if (!state.config.editable)
210
- return false;
211
- event.preventDefault();
212
- ctx.actions.set_editing(false);
213
- tick().then(() => {
214
- if (ctx.parent_element) {
215
- ctx.parent_element.focus();
216
- }
217
- });
218
- return true;
219
- case "Enter":
220
- return await handle_enter_key(event, ctx, i, j);
221
- case "Tab":
222
- return handle_tab_key(event, ctx, i, j);
223
- case "Delete":
224
- case "Backspace":
225
- return handle_delete_operation(event, ctx);
226
- default:
227
- return handle_default_key(event, ctx, i, j);
228
- }
229
- }
230
- export async function handle_keydown(event, context) {
231
- if (handle_header_navigation(event, context))
232
- return;
233
- if (handle_delete_operation(event, context))
234
- return;
235
- await handle_cell_navigation(event, context);
236
- }
@@ -1,42 +0,0 @@
1
- export declare function toggle_header_menu(event: MouseEvent, col: number, active_header_menu: {
2
- col: number;
3
- x: number;
4
- y: number;
5
- } | null, set_active_header_menu: (menu: {
6
- col: number;
7
- x: number;
8
- y: number;
9
- } | null) => void): void;
10
- export declare function toggle_cell_menu(event: MouseEvent, row: number, col: number, active_cell_menu: {
11
- row: number;
12
- col: number;
13
- x: number;
14
- y: number;
15
- } | null, set_active_cell_menu: (menu: {
16
- row: number;
17
- col: number;
18
- x: number;
19
- y: number;
20
- } | null) => void): void;
21
- export declare function add_row_at(index: number, position: "above" | "below", add_row: (index?: number) => void, clear_menus: () => void): void;
22
- export declare function add_col_at(index: number, position: "left" | "right", add_col: (index?: number) => void, clear_menus: () => void): void;
23
- export declare function delete_row_at(index: number, delete_row: (index: number) => void, clear_menus: () => void): void;
24
- export declare function delete_col_at(index: number, delete_col: (index: number) => void, clear_menus: () => void): void;
25
- export declare function toggle_header_button(col: number, active_button: {
26
- type: "header" | "cell";
27
- row?: number;
28
- col: number;
29
- } | null, set_active_button: (button: {
30
- type: "header" | "cell";
31
- row?: number;
32
- col: number;
33
- } | null) => void): void;
34
- export declare function toggle_cell_button(row: number, col: number, active_button: {
35
- type: "header" | "cell";
36
- row?: number;
37
- col: number;
38
- } | null, set_active_button: (button: {
39
- type: "header" | "cell";
40
- row?: number;
41
- col: number;
42
- } | null) => void): void;
@@ -1,58 +0,0 @@
1
- export function toggle_header_menu(event, col, active_header_menu, set_active_header_menu) {
2
- event.stopPropagation();
3
- if (active_header_menu && active_header_menu.col === col) {
4
- set_active_header_menu(null);
5
- }
6
- else {
7
- const header = event.target.closest("th");
8
- if (header) {
9
- const rect = header.getBoundingClientRect();
10
- set_active_header_menu({ col, x: rect.right, y: rect.bottom });
11
- }
12
- }
13
- }
14
- export function toggle_cell_menu(event, row, col, active_cell_menu, set_active_cell_menu) {
15
- event.stopPropagation();
16
- if (active_cell_menu &&
17
- active_cell_menu.row === row &&
18
- active_cell_menu.col === col) {
19
- set_active_cell_menu(null);
20
- }
21
- else {
22
- const cell = event.target.closest("td");
23
- if (cell) {
24
- const rect = cell.getBoundingClientRect();
25
- set_active_cell_menu({ row, col, x: rect.right, y: rect.bottom });
26
- }
27
- }
28
- }
29
- export function add_row_at(index, position, add_row, clear_menus) {
30
- const row_index = position === "above" ? index : index + 1;
31
- add_row(row_index);
32
- clear_menus();
33
- }
34
- export function add_col_at(index, position, add_col, clear_menus) {
35
- const col_index = position === "left" ? index : index + 1;
36
- add_col(col_index);
37
- clear_menus();
38
- }
39
- export function delete_row_at(index, delete_row, clear_menus) {
40
- delete_row(index);
41
- clear_menus();
42
- }
43
- export function delete_col_at(index, delete_col, clear_menus) {
44
- delete_col(index);
45
- clear_menus();
46
- }
47
- export function toggle_header_button(col, active_button, set_active_button) {
48
- set_active_button(active_button?.type === "header" && active_button.col === col
49
- ? null
50
- : { type: "header", col });
51
- }
52
- export function toggle_cell_button(row, col, active_button, set_active_button) {
53
- set_active_button(active_button?.type === "cell" &&
54
- active_button.row === row &&
55
- active_button.col === col
56
- ? null
57
- : { type: "cell", row, col });
58
- }
@@ -1,26 +0,0 @@
1
- import type { Headers, CellValue } from "../types";
2
- export type SortDirection = "asc" | "desc";
3
- export declare function get_sort_status(name: string, sort_columns: {
4
- col: number;
5
- direction: SortDirection;
6
- }[], headers: Headers): "none" | "asc" | "desc";
7
- export declare function sort_data(data: {
8
- id: string;
9
- value: CellValue;
10
- }[][], sort_columns: {
11
- col: number;
12
- direction: SortDirection;
13
- }[]): number[];
14
- export declare function sort_data_and_preserve_selection(data: {
15
- id: string;
16
- value: CellValue;
17
- }[][], display_value: string[][] | null, styling: string[][] | null, sort_columns: {
18
- col: number;
19
- direction: SortDirection;
20
- }[], selected: [number, number] | false, get_current_indices: (id: string, data: {
21
- id: string;
22
- value: CellValue;
23
- }[][]) => [number, number]): {
24
- data: typeof data;
25
- selected: [number, number] | false;
26
- };
@@ -1,59 +0,0 @@
1
- import { sort_table_data } from "./table_utils";
2
- export function get_sort_status(name, sort_columns, headers) {
3
- if (!sort_columns.length)
4
- return "none";
5
- const sort_item = sort_columns.find((item) => {
6
- const col = item.col;
7
- if (col < 0 || col >= headers.length)
8
- return false;
9
- return headers[col] === name;
10
- });
11
- if (!sort_item)
12
- return "none";
13
- return sort_item.direction;
14
- }
15
- export function sort_data(data, sort_columns) {
16
- if (!data || !data.length || !data[0]) {
17
- return [];
18
- }
19
- if (sort_columns.length > 0) {
20
- const row_indices = [...Array(data.length)].map((_, i) => i);
21
- row_indices.sort((row_a_idx, row_b_idx) => {
22
- const row_a = data[row_a_idx];
23
- const row_b = data[row_b_idx];
24
- for (const { col: sort_by, direction } of sort_columns) {
25
- if (!row_a ||
26
- !row_b ||
27
- sort_by < 0 ||
28
- sort_by >= row_a.length ||
29
- sort_by >= row_b.length ||
30
- !row_a[sort_by] ||
31
- !row_b[sort_by]) {
32
- continue;
33
- }
34
- const val_a = row_a[sort_by].value;
35
- const val_b = row_b[sort_by].value;
36
- const comparison = val_a < val_b ? -1 : val_a > val_b ? 1 : 0;
37
- if (comparison !== 0) {
38
- return direction === "asc" ? comparison : -comparison;
39
- }
40
- }
41
- return 0;
42
- });
43
- return row_indices;
44
- }
45
- return [...Array(data.length)].map((_, i) => i);
46
- }
47
- export function sort_data_and_preserve_selection(data, display_value, styling, sort_columns, selected, get_current_indices) {
48
- let id = null;
49
- if (selected && selected[0] in data && selected[1] in data[selected[0]]) {
50
- id = data[selected[0]][selected[1]].id;
51
- }
52
- sort_table_data(data, display_value, styling, sort_columns);
53
- let new_selected = selected;
54
- if (id) {
55
- const [i, j] = get_current_indices(id, data);
56
- new_selected = [i, j];
57
- }
58
- return { data, selected: new_selected };
59
- }