@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,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,77 +0,0 @@
1
- import type { Datatype, Headers, HeadersWithIDs } from "./utils";
2
- import type { CellValue } from "../types";
3
- import { cast_value_to_type } from "./utils";
4
-
5
- export function make_headers(
6
- _head: Headers,
7
- col_count: [number, "fixed" | "dynamic"],
8
- els: Record<
9
- string,
10
- { cell: null | HTMLTableCellElement; input: null | HTMLTextAreaElement }
11
- >,
12
- make_id: () => string
13
- ): HeadersWithIDs {
14
- let _h = _head || [];
15
- if (col_count[1] === "fixed" && _h.length < col_count[0]) {
16
- const fill = Array(col_count[0] - _h.length)
17
- .fill("")
18
- .map((_, i) => `${i + _h.length}`);
19
- _h = _h.concat(fill);
20
- }
21
-
22
- if (!_h || _h.length === 0) {
23
- return Array(col_count[0])
24
- .fill(0)
25
- .map((_, i) => {
26
- const _id = make_id();
27
- els[_id] = { cell: null, input: null };
28
- return { id: _id, value: JSON.stringify(i + 1) };
29
- });
30
- }
31
-
32
- return _h.map((h, i) => {
33
- const _id = make_id();
34
- els[_id] = { cell: null, input: null };
35
- return { id: _id, value: h ?? "" };
36
- });
37
- }
38
-
39
- export function process_data(
40
- values: CellValue[][],
41
- els: Record<
42
- string,
43
- { cell: null | HTMLTableCellElement; input: null | HTMLTextAreaElement }
44
- >,
45
- data_binding: Record<string, any>,
46
- make_id: () => string,
47
- display_value: string[][] | null = null,
48
- datatype: Datatype | Datatype[]
49
- ): { id: string; value: CellValue; display_value?: string }[][] {
50
- if (!values || values.length === 0) {
51
- return [];
52
- }
53
-
54
- const result = values.map((row, i) => {
55
- return row.map((value, j) => {
56
- const _id = make_id();
57
- els[_id] = { cell: null, input: null };
58
- data_binding[_id] = value;
59
-
60
- let display = display_value?.[i]?.[j];
61
-
62
- if (display === undefined) {
63
- display = String(value);
64
- }
65
-
66
- const dtype = Array.isArray(datatype) ? datatype[j] : datatype;
67
-
68
- return {
69
- id: _id,
70
- value: cast_value_to_type(value, dtype),
71
- display_value: display
72
- };
73
- });
74
- });
75
-
76
- return result;
77
- }
@@ -1,105 +0,0 @@
1
- import type { CellCoordinate } from "../types";
2
- import { get_range_selection } from "../utils/selection_utils";
3
-
4
- export type DragState = {
5
- is_dragging: boolean;
6
- drag_start: CellCoordinate | null;
7
- mouse_down_pos: { x: number; y: number } | null;
8
- };
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
-
16
- export function create_drag_handlers(
17
- state: DragState,
18
- set_is_dragging: (value: boolean) => void,
19
- set_selected_cells: (cells: CellCoordinate[]) => void,
20
- set_selected: (cell: CellCoordinate | false) => void,
21
- handle_cell_click: (event: MouseEvent, row: number, col: number) => void,
22
- show_row_numbers: boolean,
23
- parent_element?: HTMLElement
24
- ): DragHandlers {
25
- const start_drag = (event: MouseEvent, row: number, col: number): void => {
26
- const target = event.target as HTMLElement;
27
- const is_checkbox_click =
28
- (target as HTMLInputElement).type === "checkbox" ||
29
- target.closest('input[type="checkbox"]') ||
30
- target.closest(".bool-cell");
31
-
32
- if (
33
- event.target instanceof HTMLAnchorElement ||
34
- (show_row_numbers && col === -1) ||
35
- is_checkbox_click
36
- )
37
- return;
38
-
39
- event.preventDefault();
40
- event.stopPropagation();
41
-
42
- state.mouse_down_pos = { x: event.clientX, y: event.clientY };
43
- state.drag_start = [row, col];
44
-
45
- if (!event.shiftKey && !event.metaKey && !event.ctrlKey) {
46
- set_selected_cells([[row, col]]);
47
- set_selected([row, col]);
48
- handle_cell_click(event, row, col);
49
- }
50
- };
51
-
52
- const update_selection = (event: MouseEvent): void => {
53
- const cell = (event.target as HTMLElement).closest("td");
54
- if (!cell) return;
55
-
56
- const row = parseInt(cell.getAttribute("data-row") || "0");
57
- const col = parseInt(cell.getAttribute("data-col") || "0");
58
-
59
- if (isNaN(row) || isNaN(col)) return;
60
-
61
- const selection_range = get_range_selection(state.drag_start!, [row, col]);
62
- set_selected_cells(selection_range);
63
- set_selected([row, col]);
64
- };
65
-
66
- const end_drag = (event: MouseEvent): void => {
67
- if (!state.is_dragging && state.drag_start) {
68
- handle_cell_click(event, state.drag_start[0], state.drag_start[1]);
69
- } else if (state.is_dragging && parent_element) {
70
- parent_element.focus();
71
- }
72
-
73
- state.is_dragging = false;
74
- set_is_dragging(false);
75
- state.drag_start = null;
76
- state.mouse_down_pos = null;
77
- };
78
-
79
- return {
80
- handle_mouse_down: start_drag,
81
-
82
- handle_mouse_move(event: MouseEvent): void {
83
- if (!state.drag_start || !state.mouse_down_pos) return;
84
-
85
- if (!(event.buttons & 1)) {
86
- end_drag(event);
87
- return;
88
- }
89
-
90
- const dx = Math.abs(event.clientX - state.mouse_down_pos.x);
91
- const dy = Math.abs(event.clientY - state.mouse_down_pos.y);
92
-
93
- if (!state.is_dragging && (dx > 3 || dy > 3)) {
94
- state.is_dragging = true;
95
- set_is_dragging(true);
96
- }
97
-
98
- if (state.is_dragging) {
99
- update_selection(event);
100
- }
101
- },
102
-
103
- handle_mouse_up: end_drag
104
- };
105
- }
@@ -1,208 +0,0 @@
1
- import { filter_table_data } from "./table_utils";
2
- import type { CellValue } from "../types";
3
-
4
- export type FilterDatatype = "string" | "number";
5
-
6
- export function filter_data(
7
- data: { id: string; value: CellValue }[][],
8
- filter_columns: {
9
- col: number;
10
- datatype: FilterDatatype;
11
- filter: string;
12
- value: string;
13
- }[]
14
- ): number[] {
15
- if (!data || !data.length || !data[0]) {
16
- return [];
17
- }
18
- let row_indices = [...Array(data.length)].map((_, i) => i);
19
-
20
- if (filter_columns.length > 0) {
21
- filter_columns.forEach((column) => {
22
- if (column.datatype === "string") {
23
- switch (column.filter) {
24
- case "Contains":
25
- row_indices = row_indices.filter((i) =>
26
- data[i][column.col]?.value.toString().includes(column.value)
27
- );
28
- break;
29
- case "Does not contain":
30
- row_indices = row_indices.filter(
31
- (i) =>
32
- !data[i][column.col]?.value.toString().includes(column.value)
33
- );
34
- break;
35
- case "Starts with":
36
- row_indices = row_indices.filter((i) =>
37
- data[i][column.col]?.value.toString().startsWith(column.value)
38
- );
39
- break;
40
- case "Ends with":
41
- row_indices = row_indices.filter((i) =>
42
- data[i][column.col]?.value.toString().endsWith(column.value)
43
- );
44
- break;
45
- case "Is":
46
- row_indices = row_indices.filter(
47
- (i) => data[i][column.col]?.value.toString() === column.value
48
- );
49
- break;
50
- case "Is not":
51
- row_indices = row_indices.filter(
52
- (i) => !(data[i][column.col]?.value.toString() === column.value)
53
- );
54
- break;
55
- case "Is empty":
56
- row_indices = row_indices.filter(
57
- (i) => data[i][column.col]?.value.toString() === ""
58
- );
59
- break;
60
- case "Is not empty":
61
- row_indices = row_indices.filter(
62
- (i) => !(data[i][column.col]?.value.toString() === "")
63
- );
64
- break;
65
- }
66
- } else if (column.datatype === "number") {
67
- switch (column.filter) {
68
- case "=":
69
- row_indices = row_indices.filter((i) => {
70
- if (
71
- !isNaN(Number(data[i][column.col]?.value)) &&
72
- !isNaN(Number(column.value))
73
- ) {
74
- return (
75
- Number(data[i][column.col]?.value) === Number(column.value)
76
- );
77
- }
78
- return false;
79
- });
80
- break;
81
- case "≠":
82
- row_indices = row_indices.filter((i) => {
83
- if (
84
- !isNaN(Number(data[i][column.col]?.value)) &&
85
- !isNaN(Number(column.value))
86
- ) {
87
- return !(
88
- Number(data[i][column.col]?.value) === Number(column.value)
89
- );
90
- }
91
- return false;
92
- });
93
- break;
94
- case ">":
95
- row_indices = row_indices.filter((i) => {
96
- if (
97
- !isNaN(Number(data[i][column.col]?.value)) &&
98
- !isNaN(Number(column.value))
99
- ) {
100
- return (
101
- Number(data[i][column.col]?.value) > Number(column.value)
102
- );
103
- }
104
- return false;
105
- });
106
- break;
107
- case "<":
108
- row_indices = row_indices.filter((i) => {
109
- if (
110
- !isNaN(Number(data[i][column.col]?.value)) &&
111
- !isNaN(Number(column.value))
112
- ) {
113
- return (
114
- Number(data[i][column.col]?.value) < Number(column.value)
115
- );
116
- }
117
- return false;
118
- });
119
- break;
120
- case "≥":
121
- row_indices = row_indices.filter((i) => {
122
- if (
123
- !isNaN(Number(data[i][column.col]?.value)) &&
124
- !isNaN(Number(column.value))
125
- ) {
126
- return (
127
- Number(data[i][column.col]?.value) >= Number(column.value)
128
- );
129
- }
130
- return false;
131
- });
132
- break;
133
- case "≤":
134
- row_indices = row_indices.filter((i) => {
135
- if (
136
- !isNaN(Number(data[i][column.col]?.value)) &&
137
- !isNaN(Number(column.value))
138
- ) {
139
- return (
140
- Number(data[i][column.col]?.value) <= Number(column.value)
141
- );
142
- }
143
- return false;
144
- });
145
- break;
146
- case "Is empty":
147
- row_indices = row_indices.filter(
148
- (i) => data[i][column.col]?.value.toString() === ""
149
- );
150
- break;
151
- case "Is not empty":
152
- row_indices = row_indices.filter((i) => {
153
- if (!isNaN(Number(data[i][column.col]?.value))) {
154
- return !(data[i][column.col]?.value.toString() === "");
155
- }
156
- return false;
157
- });
158
- break;
159
- }
160
- }
161
- });
162
- return row_indices;
163
- }
164
- return [...Array(data.length)].map((_, i) => i);
165
- }
166
-
167
- export function filter_data_and_preserve_selection(
168
- data: { id: string; value: CellValue }[][],
169
- display_value: string[][] | null,
170
- styling: string[][] | null,
171
- filter_columns: {
172
- col: number;
173
- datatype: FilterDatatype;
174
- filter: string;
175
- value: string;
176
- }[],
177
- selected: [number, number] | false,
178
- get_current_indices: (
179
- id: string,
180
- data: { id: string; value: CellValue }[][]
181
- ) => [number, number],
182
- original_data?: { id: string; value: CellValue }[][],
183
- original_display_value?: string[][] | null,
184
- original_styling?: string[][] | null
185
- ): { data: typeof data; selected: [number, number] | false } {
186
- let id = null;
187
- if (selected && selected[0] in data && selected[1] in data[selected[0]]) {
188
- id = data[selected[0]][selected[1]].id;
189
- }
190
-
191
- filter_table_data(
192
- data,
193
- display_value,
194
- styling,
195
- filter_columns,
196
- original_data,
197
- original_display_value,
198
- original_styling
199
- );
200
-
201
- let new_selected = selected;
202
- if (id) {
203
- const [i, j] = get_current_indices(id, data);
204
- new_selected = [i, j];
205
- }
206
-
207
- return { data, selected: new_selected };
208
- }