@gradio/dataframe 0.15.0 → 0.16.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 (47) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/Dataframe.stories.svelte +183 -2
  3. package/Example.svelte +7 -0
  4. package/Index.svelte +20 -3
  5. package/dist/Example.svelte +7 -0
  6. package/dist/Index.svelte +16 -4
  7. package/dist/Index.svelte.d.ts +12 -0
  8. package/dist/shared/CellMenu.svelte +1 -1
  9. package/dist/shared/EditableCell.svelte +1 -6
  10. package/dist/shared/Table.svelte +620 -319
  11. package/dist/shared/Table.svelte.d.ts +3 -0
  12. package/dist/shared/Toolbar.svelte +122 -30
  13. package/dist/shared/Toolbar.svelte.d.ts +4 -0
  14. package/dist/shared/VirtualTable.svelte +70 -26
  15. package/dist/shared/VirtualTable.svelte.d.ts +1 -0
  16. package/dist/shared/icons/FilterIcon.svelte +11 -0
  17. package/dist/shared/icons/FilterIcon.svelte.d.ts +16 -0
  18. package/dist/shared/icons/SortIcon.svelte +90 -0
  19. package/dist/shared/icons/SortIcon.svelte.d.ts +20 -0
  20. package/dist/shared/selection_utils.d.ts +12 -2
  21. package/dist/shared/selection_utils.js +33 -5
  22. package/dist/shared/types.d.ts +16 -0
  23. package/dist/shared/types.js +1 -0
  24. package/dist/shared/utils/menu_utils.d.ts +42 -0
  25. package/dist/shared/utils/menu_utils.js +58 -0
  26. package/dist/shared/utils/sort_utils.d.ts +7 -0
  27. package/dist/shared/utils/sort_utils.js +39 -0
  28. package/dist/shared/utils/table_utils.d.ts +12 -0
  29. package/dist/shared/utils/table_utils.js +148 -0
  30. package/package.json +8 -8
  31. package/shared/CellMenu.svelte +1 -1
  32. package/shared/EditableCell.svelte +1 -6
  33. package/shared/Table.svelte +649 -322
  34. package/shared/Toolbar.svelte +125 -30
  35. package/shared/VirtualTable.svelte +73 -26
  36. package/shared/icons/FilterIcon.svelte +12 -0
  37. package/shared/icons/SortIcon.svelte +95 -0
  38. package/shared/selection_utils.ts +51 -9
  39. package/shared/types.ts +27 -0
  40. package/shared/utils/menu_utils.ts +115 -0
  41. package/shared/utils/sort_utils.test.ts +71 -0
  42. package/shared/utils/sort_utils.ts +55 -0
  43. package/shared/utils/table_utils.test.ts +114 -0
  44. package/shared/utils/table_utils.ts +206 -0
  45. package/dist/shared/table_utils.d.ts +0 -12
  46. package/dist/shared/table_utils.js +0 -113
  47. package/shared/table_utils.ts +0 -148
@@ -1,148 +0,0 @@
1
- import type { HeadersWithIDs } from "./utils";
2
- import type { CellCoordinate } from "./selection_utils";
3
- import { dsvFormat } from "d3-dsv";
4
-
5
- export type TableData = {
6
- value: string | number;
7
- id: string;
8
- }[][];
9
-
10
- export function get_max(_d: TableData): TableData[0] {
11
- if (!_d || _d.length === 0 || !_d[0]) return [];
12
- let max = _d[0].slice();
13
- for (let i = 0; i < _d.length; i++) {
14
- for (let j = 0; j < _d[i].length; j++) {
15
- if (`${max[j].value}`.length < `${_d[i][j].value}`.length) {
16
- max[j] = _d[i][j];
17
- }
18
- }
19
- }
20
- return max;
21
- }
22
-
23
- export function guess_delimiter(
24
- text: string,
25
- possibleDelimiters: string[]
26
- ): string[] {
27
- return possibleDelimiters.filter(weedOut);
28
-
29
- function weedOut(delimiter: string): boolean {
30
- var cache = -1;
31
- return text.split("\n").every(checkLength);
32
-
33
- function checkLength(line: string): boolean {
34
- if (!line) return true;
35
- var length = line.split(delimiter).length;
36
- if (cache < 0) cache = length;
37
- return cache === length && length > 1;
38
- }
39
- }
40
- }
41
-
42
- export function data_uri_to_blob(data_uri: string): Blob {
43
- const byte_str = atob(data_uri.split(",")[1]);
44
- const mime_str = data_uri.split(",")[0].split(":")[1].split(";")[0];
45
- const ab = new ArrayBuffer(byte_str.length);
46
- const ia = new Uint8Array(ab);
47
- for (let i = 0; i < byte_str.length; i++) {
48
- ia[i] = byte_str.charCodeAt(i);
49
- }
50
- return new Blob([ab], { type: mime_str });
51
- }
52
-
53
- export async function copy_table_data(
54
- data: TableData,
55
- headers?: HeadersWithIDs,
56
- selected_cells?: CellCoordinate[]
57
- ): Promise<void> {
58
- if (!selected_cells || selected_cells.length === 0) {
59
- const header_row = headers
60
- ? headers.map((h) => String(h.value)).join(",")
61
- : "";
62
- const table_data = data
63
- .map((row) => row.map((cell) => String(cell.value)).join(","))
64
- .join("\n");
65
-
66
- const all_data = header_row ? `${header_row}\n${table_data}` : table_data;
67
- await write_to_clipboard(all_data);
68
- return;
69
- }
70
-
71
- const min_row = Math.min(...selected_cells.map(([r]) => r));
72
- const max_row = Math.max(...selected_cells.map(([r]) => r));
73
- const min_col = Math.min(...selected_cells.map(([_, c]) => c));
74
- const max_col = Math.max(...selected_cells.map(([_, c]) => c));
75
-
76
- const selected_data = [];
77
- for (let i = min_row; i <= max_row; i++) {
78
- const row = [];
79
- for (let j = min_col; j <= max_col; j++) {
80
- const is_selected = selected_cells.some(([r, c]) => r === i && c === j);
81
- row.push(is_selected ? String(data[i][j].value) : "");
82
- }
83
- selected_data.push(row.join(","));
84
- }
85
-
86
- await write_to_clipboard(selected_data.join("\n"));
87
- }
88
-
89
- async function write_to_clipboard(csv_data: string): Promise<void> {
90
- try {
91
- if ("clipboard" in navigator) {
92
- await navigator.clipboard.writeText(csv_data);
93
- } else {
94
- const textArea = document.createElement("textarea");
95
- textArea.value = csv_data;
96
- textArea.style.position = "absolute";
97
- textArea.style.left = "-999999px";
98
- document.body.prepend(textArea);
99
- textArea.select();
100
-
101
- document.execCommand("copy");
102
- textArea.remove();
103
- }
104
- } catch (error) {
105
- console.error("Failed to copy table data:", error);
106
- }
107
- }
108
-
109
- export function blob_to_string(
110
- blob: Blob,
111
- col_count: [number, "fixed" | "dynamic"],
112
- make_headers: (head: string[]) => HeadersWithIDs,
113
- set_values: (values: (string | number)[][]) => void
114
- ): void {
115
- const reader = new FileReader();
116
-
117
- function handle_read(e: ProgressEvent<FileReader>): void {
118
- if (!e?.target?.result || typeof e.target.result !== "string") return;
119
-
120
- const [delimiter] = guess_delimiter(e.target.result, [",", "\t"]);
121
- const [head, ...rest] = dsvFormat(delimiter).parseRows(e.target.result);
122
-
123
- make_headers(col_count[1] === "fixed" ? head.slice(0, col_count[0]) : head);
124
- set_values(rest);
125
- reader.removeEventListener("loadend", handle_read);
126
- }
127
-
128
- reader.addEventListener("loadend", handle_read);
129
- reader.readAsText(blob);
130
- }
131
-
132
- export function handle_file_upload(
133
- data_uri: string,
134
- col_count: [number, "fixed" | "dynamic"],
135
- make_headers: (head: string[]) => HeadersWithIDs,
136
- set_values: (values: (string | number)[][]) => void
137
- ): void {
138
- const blob = data_uri_to_blob(data_uri);
139
- const reader = new FileReader();
140
- reader.addEventListener("loadend", (e) => {
141
- if (!e?.target?.result || typeof e.target.result !== "string") return;
142
- const [delimiter] = guess_delimiter(e.target.result, [",", "\t"]);
143
- const [head, ...rest] = dsvFormat(delimiter).parseRows(e.target.result);
144
- make_headers(col_count[1] === "fixed" ? head.slice(0, col_count[0]) : head);
145
- set_values(rest);
146
- });
147
- reader.readAsText(blob);
148
- }