@gradio/dataframe 0.22.0 → 0.23.0

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 +14 -0
  2. package/Dataframe.test.ts +697 -32
  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 +10 -9
  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,412 +0,0 @@
1
- import { getContext, setContext } from "svelte";
2
- import { dequal } from "dequal";
3
- import { writable, get } from "svelte/store";
4
- import { sort_table_data } from "../utils/table_utils";
5
- import { tick } from "svelte";
6
- import { handle_selection, get_next_cell_coordinates, get_range_selection, move_cursor } from "../utils/selection_utils";
7
- export const DATAFRAME_KEY = Symbol("dataframe");
8
- function create_actions(state, context) {
9
- const update_state = (updater) => state.update((s) => ({ ...s, ...updater(s) }));
10
- const add_row = (data, make_id, index) => {
11
- const new_row = data[0]?.length
12
- ? Array(data[0].length)
13
- .fill(null)
14
- .map(() => ({ value: "", id: make_id() }))
15
- : [{ value: "", id: make_id() }];
16
- const new_data = [...data];
17
- index !== undefined
18
- ? new_data.splice(index, 0, new_row)
19
- : new_data.push(new_row);
20
- return new_data;
21
- };
22
- const add_col = (data, headers, make_id, index) => {
23
- const new_headers = [...headers, `Header ${headers.length + 1}`];
24
- const new_data = data.map((row) => [...row, { value: "", id: make_id() }]);
25
- if (index !== undefined) {
26
- new_headers.splice(index, 0, new_headers.pop());
27
- new_data.forEach((row) => row.splice(index, 0, row.pop()));
28
- }
29
- return { data: new_data, headers: new_headers };
30
- };
31
- const update_array = (source, target) => {
32
- if (source && target) {
33
- target.splice(0, target.length, ...JSON.parse(JSON.stringify(source)));
34
- }
35
- };
36
- return {
37
- handle_search: (query) => update_state((s) => ({ current_search_query: query })),
38
- handle_sort: (col, direction) => update_state((s) => {
39
- const sort_cols = s.sort_state.sort_columns.filter((c) => c.col !== col);
40
- if (!s.sort_state.sort_columns.some((c) => c.col === col && c.direction === direction)) {
41
- sort_cols.push({ col, direction });
42
- }
43
- const initial_data = s.sort_state.initial_data ||
44
- (context.data && sort_cols.length > 0
45
- ? {
46
- data: JSON.parse(JSON.stringify(context.data)),
47
- display_value: context.display_value
48
- ? JSON.parse(JSON.stringify(context.display_value))
49
- : null,
50
- styling: context.styling
51
- ? JSON.parse(JSON.stringify(context.styling))
52
- : null
53
- }
54
- : null);
55
- return {
56
- sort_state: {
57
- ...s.sort_state,
58
- sort_columns: sort_cols.slice(-3),
59
- initial_data: initial_data
60
- }
61
- };
62
- }),
63
- handle_filter: (col, datatype, filter, value) => update_state((s) => {
64
- const filter_cols = s.filter_state.filter_columns.some((c) => c.col === col)
65
- ? s.filter_state.filter_columns.filter((c) => c.col !== col)
66
- : [
67
- ...s.filter_state.filter_columns,
68
- { col, datatype, filter, value }
69
- ];
70
- const initial_data = s.filter_state.initial_data ||
71
- (context.data && filter_cols.length > 0
72
- ? {
73
- data: JSON.parse(JSON.stringify(context.data)),
74
- display_value: context.display_value
75
- ? JSON.parse(JSON.stringify(context.display_value))
76
- : null,
77
- styling: context.styling
78
- ? JSON.parse(JSON.stringify(context.styling))
79
- : null
80
- }
81
- : null);
82
- return {
83
- filter_state: {
84
- ...s.filter_state,
85
- filter_columns: filter_cols,
86
- initial_data: initial_data
87
- }
88
- };
89
- }),
90
- get_sort_status: (name, headers) => {
91
- const s = get(state);
92
- const sort_item = s.sort_state.sort_columns.find((item) => headers[item.col] === name);
93
- return sort_item ? sort_item.direction : "none";
94
- },
95
- sort_data: (data, display_value, styling) => {
96
- const { sort_state: { sort_columns } } = get(state);
97
- if (sort_columns.length)
98
- sort_table_data(data, display_value, styling, sort_columns);
99
- },
100
- update_row_order: (data) => update_state((s) => ({
101
- sort_state: {
102
- ...s.sort_state,
103
- row_order: s.sort_state.sort_columns.length && data[0]
104
- ? [...Array(data.length)]
105
- .map((_, i) => i)
106
- .sort((a, b) => {
107
- for (const { col, direction } of s.sort_state
108
- .sort_columns) {
109
- const comp = (data[a]?.[col]?.value ?? "") <
110
- (data[b]?.[col]?.value ?? "")
111
- ? -1
112
- : 1;
113
- if (comp)
114
- return direction === "asc" ? comp : -comp;
115
- }
116
- return 0;
117
- })
118
- : [...Array(data.length)].map((_, i) => i)
119
- }
120
- })),
121
- filter_data: (data) => {
122
- const query = get(state).current_search_query?.toLowerCase();
123
- return query
124
- ? data.filter((row) => row.some((cell) => String(cell?.value).toLowerCase().includes(query)))
125
- : data;
126
- },
127
- add_row,
128
- add_col,
129
- add_row_at: (data, index, position, make_id) => add_row(data, make_id, position === "above" ? index : index + 1),
130
- add_col_at: (data, headers, index, position, make_id) => add_col(data, headers, make_id, position === "left" ? index : index + 1),
131
- delete_row: (data, index) => data.length > 1 ? data.filter((_, i) => i !== index) : data,
132
- delete_col: (data, headers, index) => headers.length > 1
133
- ? {
134
- data: data.map((row) => row.filter((_, i) => i !== index)),
135
- headers: headers.filter((_, i) => i !== index)
136
- }
137
- : { data, headers },
138
- delete_row_at: (data, index) => data.length > 1
139
- ? [...data.slice(0, index), ...data.slice(index + 1)]
140
- : data,
141
- delete_col_at: (data, headers, index) => headers.length > 1
142
- ? {
143
- data: data.map((row) => [
144
- ...row.slice(0, index),
145
- ...row.slice(index + 1)
146
- ]),
147
- headers: [...headers.slice(0, index), ...headers.slice(index + 1)]
148
- }
149
- : { data, headers },
150
- trigger_change: async (data, headers, previous_data, previous_headers, value_is_output, dispatch) => {
151
- const s = get(state);
152
- if (s.current_search_query)
153
- return;
154
- const current_headers = headers.map((h) => h.value);
155
- const current_data = data.map((row) => row.map((cell) => cell.value));
156
- if (!dequal(current_data, previous_data) ||
157
- !dequal(current_headers, previous_headers)) {
158
- if (!dequal(current_headers, previous_headers)) {
159
- update_state((s) => ({
160
- sort_state: { sort_columns: [], row_order: [], initial_data: null },
161
- filter_state: { filter_columns: [], initial_data: null }
162
- }));
163
- }
164
- dispatch("change", {
165
- data: data.map((row) => row.map((cell) => cell.value)),
166
- headers: current_headers,
167
- metadata: null
168
- });
169
- const index = s.ui_state.selected;
170
- if (index) {
171
- dispatch("edit", {
172
- index,
173
- value: data[index[0]][index[1]].value,
174
- previous_value: previous_data[index[0]][index[1]]
175
- });
176
- }
177
- if (!value_is_output)
178
- dispatch("input");
179
- }
180
- },
181
- reset_sort_state: () => update_state((s) => {
182
- if (s.sort_state.initial_data && context.data) {
183
- const original = s.sort_state.initial_data;
184
- update_array(original.data, context.data);
185
- update_array(original.display_value, context.display_value);
186
- update_array(original.styling, context.styling);
187
- }
188
- return {
189
- sort_state: { sort_columns: [], row_order: [], initial_data: null }
190
- };
191
- }),
192
- reset_filter_state: () => update_state((s) => {
193
- if (s.filter_state.initial_data && context.data) {
194
- const original = s.filter_state.initial_data;
195
- update_array(original.data, context.data);
196
- update_array(original.display_value, context.display_value);
197
- update_array(original.styling, context.styling);
198
- }
199
- return {
200
- filter_state: { filter_columns: [], initial_data: null }
201
- };
202
- }),
203
- set_active_cell_menu: (menu) => update_state((s) => ({
204
- ui_state: { ...s.ui_state, active_cell_menu: menu }
205
- })),
206
- set_active_header_menu: (menu) => update_state((s) => ({
207
- ui_state: { ...s.ui_state, active_header_menu: menu }
208
- })),
209
- set_selected_cells: (cells) => update_state((s) => ({
210
- ui_state: { ...s.ui_state, selected_cells: cells }
211
- })),
212
- set_selected: (selected) => update_state((s) => ({ ui_state: { ...s.ui_state, selected } })),
213
- set_editing: (editing) => update_state((s) => ({ ui_state: { ...s.ui_state, editing } })),
214
- clear_ui_state: () => update_state((s) => ({
215
- ui_state: {
216
- active_cell_menu: null,
217
- active_header_menu: null,
218
- selected_cells: [],
219
- selected: false,
220
- editing: false,
221
- header_edit: false,
222
- selected_header: false,
223
- active_button: null,
224
- copy_flash: false
225
- }
226
- })),
227
- set_header_edit: (header_index) => update_state((s) => ({
228
- ui_state: {
229
- ...s.ui_state,
230
- selected_cells: [],
231
- selected_header: header_index,
232
- header_edit: header_index
233
- }
234
- })),
235
- set_selected_header: (header_index) => update_state((s) => ({
236
- ui_state: {
237
- ...s.ui_state,
238
- selected_header: header_index,
239
- selected: false,
240
- selected_cells: []
241
- }
242
- })),
243
- handle_header_click: (col, editable) => update_state((s) => ({
244
- ui_state: {
245
- ...s.ui_state,
246
- active_cell_menu: null,
247
- active_header_menu: null,
248
- selected: false,
249
- selected_cells: [],
250
- selected_header: col,
251
- header_edit: editable ? col : false
252
- }
253
- })),
254
- end_header_edit: (key) => {
255
- if (["Escape", "Enter", "Tab"].includes(key)) {
256
- update_state((s) => ({
257
- ui_state: { ...s.ui_state, selected: false, header_edit: false }
258
- }));
259
- }
260
- },
261
- get_selected_cells: () => get(state).ui_state.selected_cells,
262
- get_active_cell_menu: () => get(state).ui_state.active_cell_menu,
263
- get_active_button: () => get(state).ui_state.active_button,
264
- set_active_button: (button) => update_state((s) => ({
265
- ui_state: { ...s.ui_state, active_button: button }
266
- })),
267
- set_copy_flash: (value) => update_state((s) => ({ ui_state: { ...s.ui_state, copy_flash: value } })),
268
- handle_cell_click: (event, row, col) => {
269
- event.preventDefault();
270
- event.stopPropagation();
271
- const s = get(state);
272
- if (s.config.show_row_numbers && col === -1)
273
- return;
274
- let actual_row = row;
275
- if (s.current_search_query && context.data) {
276
- const filtered_indices = [];
277
- context.data.forEach((dataRow, idx) => {
278
- if (dataRow.some((cell) => String(cell?.value)
279
- .toLowerCase()
280
- .includes(s.current_search_query?.toLowerCase() || ""))) {
281
- filtered_indices.push(idx);
282
- }
283
- });
284
- actual_row = filtered_indices[row] ?? row;
285
- }
286
- const cells = handle_selection([actual_row, col], s.ui_state.selected_cells, event);
287
- update_state((s) => ({
288
- ui_state: {
289
- ...s.ui_state,
290
- active_cell_menu: null,
291
- active_header_menu: null,
292
- selected_header: false,
293
- header_edit: false,
294
- selected_cells: cells,
295
- selected: cells[0]
296
- }
297
- }));
298
- if (s.config.editable && cells.length === 1) {
299
- update_state((s) => ({
300
- ui_state: { ...s.ui_state, editing: [actual_row, col] }
301
- }));
302
- tick().then(() => context.els[context.data[actual_row][col].id]?.input?.focus());
303
- }
304
- else {
305
- // ensure parent has focus for keyboard navigation
306
- tick().then(() => {
307
- if (context.parent_element) {
308
- context.parent_element.focus();
309
- }
310
- });
311
- }
312
- context.dispatch?.("select", {
313
- index: [actual_row, col],
314
- col_value: context.get_column(col),
315
- row_value: context.get_row(actual_row),
316
- value: context.get_data_at(actual_row, col)
317
- });
318
- },
319
- toggle_cell_menu: (event, row, col) => {
320
- event.stopPropagation();
321
- const current_menu = get(state).ui_state.active_cell_menu;
322
- if (current_menu?.row === row && current_menu.col === col) {
323
- update_state((s) => ({
324
- ui_state: { ...s.ui_state, active_cell_menu: null }
325
- }));
326
- }
327
- else {
328
- const cell = event.target.closest("td");
329
- if (cell) {
330
- const rect = cell.getBoundingClientRect();
331
- update_state((s) => ({
332
- ui_state: {
333
- ...s.ui_state,
334
- active_cell_menu: { row, col, x: rect.right, y: rect.bottom }
335
- }
336
- }));
337
- }
338
- }
339
- },
340
- toggle_cell_button: (row, col) => {
341
- const current_button = get(state).ui_state.active_button;
342
- const new_button = current_button?.type === "cell" &&
343
- current_button.row === row &&
344
- current_button.col === col
345
- ? null
346
- : { type: "cell", row, col };
347
- update_state((s) => ({
348
- ui_state: { ...s.ui_state, active_button: new_button }
349
- }));
350
- },
351
- handle_select_column: (col) => {
352
- if (!context.data)
353
- return;
354
- const cells = context.data.map((_, row) => [row, col]);
355
- update_state((s) => ({
356
- ui_state: {
357
- ...s.ui_state,
358
- selected_cells: cells,
359
- selected: cells[0],
360
- editing: false
361
- }
362
- }));
363
- setTimeout(() => context.parent_element?.focus(), 0);
364
- },
365
- handle_select_row: (row) => {
366
- if (!context.data || !context.data[0])
367
- return;
368
- const cells = context.data[0].map((_, col) => [row, col]);
369
- update_state((s) => ({
370
- ui_state: {
371
- ...s.ui_state,
372
- selected_cells: cells,
373
- selected: cells[0],
374
- editing: false
375
- }
376
- }));
377
- setTimeout(() => context.parent_element?.focus(), 0);
378
- },
379
- get_next_cell_coordinates,
380
- get_range_selection,
381
- move_cursor
382
- };
383
- }
384
- export function create_dataframe_context(config) {
385
- const state = writable({
386
- config,
387
- current_search_query: null,
388
- sort_state: { sort_columns: [], row_order: [], initial_data: null },
389
- filter_state: { filter_columns: [], initial_data: null },
390
- ui_state: {
391
- active_cell_menu: null,
392
- active_header_menu: null,
393
- selected_cells: [],
394
- selected: false,
395
- editing: false,
396
- header_edit: false,
397
- selected_header: false,
398
- active_button: null,
399
- copy_flash: false
400
- }
401
- });
402
- const context = { state, actions: null };
403
- context.actions = create_actions(state, context);
404
- const instance_id = Symbol(`dataframe_${Math.random().toString(36).substring(2)}`);
405
- setContext(instance_id, context);
406
- setContext(DATAFRAME_KEY, { instance_id, context });
407
- return context;
408
- }
409
- export function get_dataframe_context() {
410
- const ctx = getContext(DATAFRAME_KEY);
411
- return ctx?.context ?? getContext(DATAFRAME_KEY);
412
- }
@@ -1,25 +0,0 @@
1
- <script lang="ts">
2
- export let size = 16;
3
- </script>
4
-
5
- <svg
6
- width={size}
7
- height={size}
8
- viewBox="0 0 16 16"
9
- fill="none"
10
- xmlns="http://www.w3.org/2000/svg"
11
- >
12
- <path
13
- d="M4 8L8 12L12 8"
14
- stroke="currentColor"
15
- stroke-width="1.5"
16
- stroke-linecap="round"
17
- stroke-linejoin="round"
18
- />
19
- <path
20
- d="M8 12V4"
21
- stroke="currentColor"
22
- stroke-width="1.5"
23
- stroke-linecap="round"
24
- />
25
- </svg>
@@ -1,20 +0,0 @@
1
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
- $$bindings?: Bindings;
4
- } & Exports;
5
- (internal: unknown, props: Props & {
6
- $$events?: Events;
7
- $$slots?: Slots;
8
- }): Exports & {
9
- $set?: any;
10
- $on?: any;
11
- };
12
- z_$$bindings?: Bindings;
13
- }
14
- declare const SortArrowDown: $$__sveltets_2_IsomorphicComponent<{
15
- size?: number;
16
- }, {
17
- [evt: string]: CustomEvent<any>;
18
- }, {}, {}, string>;
19
- type SortArrowDown = InstanceType<typeof SortArrowDown>;
20
- export default SortArrowDown;
@@ -1,25 +0,0 @@
1
- <script lang="ts">
2
- export let size = 16;
3
- </script>
4
-
5
- <svg
6
- width={size}
7
- height={size}
8
- viewBox="0 0 16 16"
9
- fill="none"
10
- xmlns="http://www.w3.org/2000/svg"
11
- >
12
- <path
13
- d="M4 8L8 4L12 8"
14
- stroke="currentColor"
15
- stroke-width="1.5"
16
- stroke-linecap="round"
17
- stroke-linejoin="round"
18
- />
19
- <path
20
- d="M8 4V12"
21
- stroke="currentColor"
22
- stroke-width="1.5"
23
- stroke-linecap="round"
24
- />
25
- </svg>
@@ -1,20 +0,0 @@
1
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
- $$bindings?: Bindings;
4
- } & Exports;
5
- (internal: unknown, props: Props & {
6
- $$events?: Events;
7
- $$slots?: Slots;
8
- }): Exports & {
9
- $set?: any;
10
- $on?: any;
11
- };
12
- z_$$bindings?: Bindings;
13
- }
14
- declare const SortArrowUp: $$__sveltets_2_IsomorphicComponent<{
15
- size?: number;
16
- }, {
17
- [evt: string]: CustomEvent<any>;
18
- }, {}, {}, string>;
19
- type SortArrowUp = InstanceType<typeof SortArrowUp>;
20
- export default SortArrowUp;
@@ -1,14 +0,0 @@
1
- import type { Datatype, Headers, HeadersWithIDs } from "./utils";
2
- import type { CellValue } from "../types";
3
- export declare function make_headers(_head: Headers, col_count: [number, "fixed" | "dynamic"], els: Record<string, {
4
- cell: null | HTMLTableCellElement;
5
- input: null | HTMLTextAreaElement;
6
- }>, make_id: () => string): HeadersWithIDs;
7
- export declare function process_data(values: CellValue[][], els: Record<string, {
8
- cell: null | HTMLTableCellElement;
9
- input: null | HTMLTextAreaElement;
10
- }>, data_binding: Record<string, any>, make_id: () => string, display_value: string[][] | null | undefined, datatype: Datatype | Datatype[]): {
11
- id: string;
12
- value: CellValue;
13
- display_value?: string;
14
- }[][];
@@ -1,47 +0,0 @@
1
- import { cast_value_to_type } from "./utils";
2
- export function make_headers(_head, col_count, els, make_id) {
3
- let _h = _head || [];
4
- if (col_count[1] === "fixed" && _h.length < col_count[0]) {
5
- const fill = Array(col_count[0] - _h.length)
6
- .fill("")
7
- .map((_, i) => `${i + _h.length}`);
8
- _h = _h.concat(fill);
9
- }
10
- if (!_h || _h.length === 0) {
11
- return Array(col_count[0])
12
- .fill(0)
13
- .map((_, i) => {
14
- const _id = make_id();
15
- els[_id] = { cell: null, input: null };
16
- return { id: _id, value: JSON.stringify(i + 1) };
17
- });
18
- }
19
- return _h.map((h, i) => {
20
- const _id = make_id();
21
- els[_id] = { cell: null, input: null };
22
- return { id: _id, value: h ?? "" };
23
- });
24
- }
25
- export function process_data(values, els, data_binding, make_id, display_value = null, datatype) {
26
- if (!values || values.length === 0) {
27
- return [];
28
- }
29
- const result = values.map((row, i) => {
30
- return row.map((value, j) => {
31
- const _id = make_id();
32
- els[_id] = { cell: null, input: null };
33
- data_binding[_id] = value;
34
- let display = display_value?.[i]?.[j];
35
- if (display === undefined) {
36
- display = String(value);
37
- }
38
- const dtype = Array.isArray(datatype) ? datatype[j] : datatype;
39
- return {
40
- id: _id,
41
- value: cast_value_to_type(value, dtype),
42
- display_value: display
43
- };
44
- });
45
- });
46
- return result;
47
- }
@@ -1,15 +0,0 @@
1
- import type { CellCoordinate } from "../types";
2
- export type DragState = {
3
- is_dragging: boolean;
4
- drag_start: CellCoordinate | null;
5
- mouse_down_pos: {
6
- x: number;
7
- y: number;
8
- } | null;
9
- };
10
- export type DragHandlers = {
11
- handle_mouse_down: (event: MouseEvent, row: number, col: number) => void;
12
- handle_mouse_move: (event: MouseEvent) => void;
13
- handle_mouse_up: (event: MouseEvent) => void;
14
- };
15
- export declare function create_drag_handlers(state: DragState, set_is_dragging: (value: boolean) => void, set_selected_cells: (cells: CellCoordinate[]) => void, set_selected: (cell: CellCoordinate | false) => void, handle_cell_click: (event: MouseEvent, row: number, col: number) => void, show_row_numbers: boolean, parent_element?: HTMLElement): DragHandlers;
@@ -1,67 +0,0 @@
1
- import { get_range_selection } from "../utils/selection_utils";
2
- export function create_drag_handlers(state, set_is_dragging, set_selected_cells, set_selected, handle_cell_click, show_row_numbers, parent_element) {
3
- const start_drag = (event, row, col) => {
4
- const target = event.target;
5
- const is_checkbox_click = target.type === "checkbox" ||
6
- target.closest('input[type="checkbox"]') ||
7
- target.closest(".bool-cell");
8
- if (event.target instanceof HTMLAnchorElement ||
9
- (show_row_numbers && col === -1) ||
10
- is_checkbox_click)
11
- return;
12
- event.preventDefault();
13
- event.stopPropagation();
14
- state.mouse_down_pos = { x: event.clientX, y: event.clientY };
15
- state.drag_start = [row, col];
16
- if (!event.shiftKey && !event.metaKey && !event.ctrlKey) {
17
- set_selected_cells([[row, col]]);
18
- set_selected([row, col]);
19
- handle_cell_click(event, row, col);
20
- }
21
- };
22
- const update_selection = (event) => {
23
- const cell = event.target.closest("td");
24
- if (!cell)
25
- return;
26
- const row = parseInt(cell.getAttribute("data-row") || "0");
27
- const col = parseInt(cell.getAttribute("data-col") || "0");
28
- if (isNaN(row) || isNaN(col))
29
- return;
30
- const selection_range = get_range_selection(state.drag_start, [row, col]);
31
- set_selected_cells(selection_range);
32
- set_selected([row, col]);
33
- };
34
- const end_drag = (event) => {
35
- if (!state.is_dragging && state.drag_start) {
36
- handle_cell_click(event, state.drag_start[0], state.drag_start[1]);
37
- }
38
- else if (state.is_dragging && parent_element) {
39
- parent_element.focus();
40
- }
41
- state.is_dragging = false;
42
- set_is_dragging(false);
43
- state.drag_start = null;
44
- state.mouse_down_pos = null;
45
- };
46
- return {
47
- handle_mouse_down: start_drag,
48
- handle_mouse_move(event) {
49
- if (!state.drag_start || !state.mouse_down_pos)
50
- return;
51
- if (!(event.buttons & 1)) {
52
- end_drag(event);
53
- return;
54
- }
55
- const dx = Math.abs(event.clientX - state.mouse_down_pos.x);
56
- const dy = Math.abs(event.clientY - state.mouse_down_pos.y);
57
- if (!state.is_dragging && (dx > 3 || dy > 3)) {
58
- state.is_dragging = true;
59
- set_is_dragging(true);
60
- }
61
- if (state.is_dragging) {
62
- update_selection(event);
63
- }
64
- },
65
- handle_mouse_up: end_drag
66
- };
67
- }
@@ -1,29 +0,0 @@
1
- import type { CellValue } from "../types";
2
- export type FilterDatatype = "string" | "number";
3
- export declare function filter_data(data: {
4
- id: string;
5
- value: CellValue;
6
- }[][], filter_columns: {
7
- col: number;
8
- datatype: FilterDatatype;
9
- filter: string;
10
- value: string;
11
- }[]): number[];
12
- export declare function filter_data_and_preserve_selection(data: {
13
- id: string;
14
- value: CellValue;
15
- }[][], display_value: string[][] | null, styling: string[][] | null, filter_columns: {
16
- col: number;
17
- datatype: FilterDatatype;
18
- filter: string;
19
- value: string;
20
- }[], selected: [number, number] | false, get_current_indices: (id: string, data: {
21
- id: string;
22
- value: CellValue;
23
- }[][]) => [number, number], original_data?: {
24
- id: string;
25
- value: CellValue;
26
- }[][], original_display_value?: string[][] | null, original_styling?: string[][] | null): {
27
- data: typeof data;
28
- selected: [number, number] | false;
29
- };