@gradio/dataframe 0.21.7 → 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 +27 -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 +1039 -947
  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 +1039 -947
  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,330 +0,0 @@
1
- <script lang="ts">
2
- import EditableCell from "./EditableCell.svelte";
3
- import CellMenuButton from "./CellMenuButton.svelte";
4
- import type { I18nFormatter } from "js/core/src/gradio_helper";
5
- import type { Datatype } from "./utils/utils";
6
- import type { CellValue } from "./types";
7
- import { is_cell_in_selection } from "./utils/selection_utils";
8
-
9
- export let value: CellValue;
10
- export let index: number;
11
- export let j: number;
12
- export let actual_pinned_columns: number;
13
- export let get_cell_width: (index: number) => string;
14
- export let handle_cell_click: (
15
- event: MouseEvent,
16
- row: number,
17
- col: number
18
- ) => void;
19
- export let handle_blur: (
20
- event: CustomEvent<{
21
- blur_event: FocusEvent;
22
- coords: [number, number];
23
- }>
24
- ) => void;
25
- export let toggle_cell_menu: (
26
- event: MouseEvent,
27
- row: number,
28
- col: number
29
- ) => void;
30
- export let is_cell_selected: (
31
- coords: [number, number],
32
- selected_cells: [number, number][]
33
- ) => string;
34
- export let should_show_cell_menu: (
35
- coords: [number, number],
36
- selected_cells: [number, number][],
37
- editable: boolean
38
- ) => boolean;
39
- export let selected_cells: [number, number][];
40
- export let copy_flash: boolean;
41
- export let active_cell_menu: {
42
- row: number;
43
- col: number;
44
- x: number;
45
- y: number;
46
- } | null;
47
- export let styling: string | undefined;
48
- export let latex_delimiters: {
49
- left: string;
50
- right: string;
51
- display: boolean;
52
- }[];
53
- export let line_breaks: boolean;
54
- export let datatype: Datatype;
55
- export let editing: [number, number] | false;
56
- export let max_chars: number | undefined;
57
- export let editable: boolean;
58
- export let is_static = false;
59
- export let i18n: I18nFormatter;
60
- export let components: Record<string, any> = {};
61
- export let el: {
62
- cell: HTMLTableCellElement | null;
63
- input: HTMLTextAreaElement | null;
64
- };
65
- export let handle_select_column: (col: number) => void;
66
- export let handle_select_row: (row: number) => void;
67
- export let is_dragging: boolean;
68
- export let display_value: string | undefined;
69
- export let wrap = false;
70
-
71
- function get_cell_position(col_index: number): string {
72
- if (col_index >= actual_pinned_columns) {
73
- return "auto";
74
- }
75
-
76
- if (col_index === 0) {
77
- return "0";
78
- }
79
-
80
- const previous_widths = Array(col_index)
81
- .fill(0)
82
- .map((_, idx) => {
83
- return get_cell_width(idx);
84
- })
85
- .join(" + ");
86
-
87
- return `calc(${previous_widths})`;
88
- }
89
-
90
- $: cell_classes = is_cell_selected([index, j], selected_cells || []);
91
- $: is_in_selection = is_cell_in_selection([index, j], selected_cells);
92
- $: has_no_top = cell_classes.includes("no-top");
93
- $: has_no_bottom = cell_classes.includes("no-bottom");
94
- $: has_no_left = cell_classes.includes("no-left");
95
- $: has_no_right = cell_classes.includes("no-right");
96
- </script>
97
-
98
- <td
99
- class:pinned-column={j < actual_pinned_columns}
100
- class:last-pinned={j === actual_pinned_columns - 1}
101
- tabindex={j < actual_pinned_columns ? -1 : 0}
102
- bind:this={el.cell}
103
- data-row={index}
104
- data-col={j}
105
- data-testid={`cell-${index}-${j}`}
106
- on:mousedown={(e) => handle_cell_click(e, index, j)}
107
- on:contextmenu|preventDefault={(e) => toggle_cell_menu(e, index, j)}
108
- style="width: {get_cell_width(j)}; left: {get_cell_position(j)}; {styling ||
109
- ''}"
110
- class:flash={copy_flash && is_in_selection}
111
- class:cell-selected={is_in_selection}
112
- class:no-top={has_no_top}
113
- class:no-bottom={has_no_bottom}
114
- class:no-left={has_no_left}
115
- class:no-right={has_no_right}
116
- class:menu-active={active_cell_menu &&
117
- active_cell_menu.row === index &&
118
- active_cell_menu.col === j}
119
- class:dragging={is_dragging}
120
- >
121
- <div class="cell-wrap">
122
- <EditableCell
123
- bind:value
124
- bind:el={el.input}
125
- display_value={display_value !== undefined
126
- ? display_value
127
- : String(value)}
128
- {latex_delimiters}
129
- {line_breaks}
130
- {editable}
131
- {is_static}
132
- edit={editing && editing[0] === index && editing[1] === j}
133
- {datatype}
134
- on:focus={() => {
135
- const row = index;
136
- const col = j;
137
- if (!selected_cells.some(([r, c]) => r === row && c === col)) {
138
- selected_cells = [[row, col]];
139
- }
140
- }}
141
- on:blur={handle_blur}
142
- {max_chars}
143
- {i18n}
144
- {components}
145
- show_selection_buttons={selected_cells.length === 1 &&
146
- selected_cells[0][0] === index &&
147
- selected_cells[0][1] === j}
148
- coords={[index, j]}
149
- on_select_column={handle_select_column}
150
- on_select_row={handle_select_row}
151
- {is_dragging}
152
- wrap_text={wrap}
153
- />
154
- {#if editable && should_show_cell_menu([index, j], selected_cells, editable)}
155
- <CellMenuButton on_click={(event) => toggle_cell_menu(event, index, j)} />
156
- {/if}
157
- </div>
158
- </td>
159
-
160
- <style>
161
- td {
162
- --ring-color: transparent;
163
- position: relative;
164
- outline: none;
165
- box-shadow: inset 0 0 0 1px var(--ring-color);
166
- padding: 0;
167
- border-right-width: 0px;
168
- border-left-width: 1px;
169
- border-style: solid;
170
- border-color: var(--border-color-primary);
171
- }
172
-
173
- .cell-wrap {
174
- display: flex;
175
- align-items: center;
176
- justify-content: flex-start;
177
- outline: none;
178
- min-height: var(--size-9);
179
- position: relative;
180
- height: 100%;
181
- padding: var(--size-2);
182
- box-sizing: border-box;
183
- margin: 0;
184
- gap: var(--size-1);
185
- overflow: visible;
186
- min-width: 0;
187
- border-radius: var(--table-radius);
188
- }
189
-
190
- .cell-selected {
191
- --ring-color: var(--color-accent);
192
- box-shadow: inset 0 0 0 2px var(--ring-color);
193
- z-index: 2;
194
- position: relative;
195
- }
196
-
197
- .cell-selected :global(.cell-menu-button) {
198
- display: flex;
199
- }
200
-
201
- .flash.cell-selected {
202
- animation: flash-color 700ms ease-out;
203
- }
204
-
205
- @keyframes flash-color {
206
- 0%,
207
- 30% {
208
- background: var(--color-accent-copied);
209
- }
210
-
211
- 100% {
212
- background: transparent;
213
- }
214
- }
215
-
216
- .pinned-column {
217
- position: sticky;
218
- z-index: 3;
219
- border-right: none;
220
- }
221
-
222
- .pinned-column:nth-child(odd) {
223
- background: var(--table-odd-background-fill);
224
- }
225
-
226
- .pinned-column:nth-child(even) {
227
- background: var(--table-even-background-fill);
228
- }
229
-
230
- td:first-child {
231
- border-left-width: 0px;
232
- }
233
-
234
- :global(tr:last-child) td:first-child {
235
- border-bottom-left-radius: var(--table-radius);
236
- }
237
-
238
- :global(tr:last-child) td:last-child {
239
- border-bottom-right-radius: var(--table-radius);
240
- }
241
-
242
- .dragging {
243
- cursor: crosshair;
244
- }
245
-
246
- /* Add back the cell selection border styles */
247
- .cell-selected.no-top {
248
- box-shadow:
249
- inset 2px 0 0 var(--ring-color),
250
- inset -2px 0 0 var(--ring-color),
251
- inset 0 -2px 0 var(--ring-color);
252
- }
253
-
254
- .cell-selected.no-bottom {
255
- box-shadow:
256
- inset 2px 0 0 var(--ring-color),
257
- inset -2px 0 0 var(--ring-color),
258
- inset 0 2px 0 var(--ring-color);
259
- }
260
-
261
- .cell-selected.no-left {
262
- box-shadow:
263
- inset 0 2px 0 var(--ring-color),
264
- inset -2px 0 0 var(--ring-color),
265
- inset 0 -2px 0 var(--ring-color);
266
- }
267
-
268
- .cell-selected.no-right {
269
- box-shadow:
270
- inset 0 2px 0 var(--ring-color),
271
- inset 2px 0 0 var(--ring-color),
272
- inset 0 -2px 0 var(--ring-color);
273
- }
274
-
275
- .cell-selected.no-top.no-left {
276
- box-shadow:
277
- inset -2px 0 0 var(--ring-color),
278
- inset 0 -2px 0 var(--ring-color);
279
- }
280
-
281
- .cell-selected.no-top.no-right {
282
- box-shadow:
283
- inset 2px 0 0 var(--ring-color),
284
- inset 0 -2px 0 var(--ring-color);
285
- }
286
-
287
- .cell-selected.no-bottom.no-left {
288
- box-shadow:
289
- inset -2px 0 0 var(--ring-color),
290
- inset 0 2px 0 var(--ring-color);
291
- }
292
-
293
- .cell-selected.no-bottom.no-right {
294
- box-shadow:
295
- inset 2px 0 0 var(--ring-color),
296
- inset 0 2px 0 var(--ring-color);
297
- }
298
-
299
- .cell-selected.no-top.no-bottom {
300
- box-shadow:
301
- inset 2px 0 0 var(--ring-color),
302
- inset -2px 0 0 var(--ring-color);
303
- }
304
-
305
- .cell-selected.no-left.no-right {
306
- box-shadow:
307
- inset 0 2px 0 var(--ring-color),
308
- inset 0 -2px 0 var(--ring-color);
309
- }
310
-
311
- .cell-selected.no-top.no-left.no-right {
312
- box-shadow: inset 0 -2px 0 var(--ring-color);
313
- }
314
-
315
- .cell-selected.no-bottom.no-left.no-right {
316
- box-shadow: inset 0 2px 0 var(--ring-color);
317
- }
318
-
319
- .cell-selected.no-left.no-top.no-bottom {
320
- box-shadow: inset -2px 0 0 var(--ring-color);
321
- }
322
-
323
- .cell-selected.no-right.no-top.no-bottom {
324
- box-shadow: inset 2px 0 0 var(--ring-color);
325
- }
326
-
327
- .cell-selected.no-top.no-bottom.no-left.no-right {
328
- box-shadow: none;
329
- }
330
- </style>
@@ -1,344 +0,0 @@
1
- <script lang="ts">
2
- import EditableCell from "./EditableCell.svelte";
3
- import CellMenuButton from "./CellMenuButton.svelte";
4
- import type { I18nFormatter } from "js/core/src/gradio_helper";
5
- import { get_sort_status } from "./utils/sort_utils";
6
- import Padlock from "./icons/Padlock.svelte";
7
- import SortArrowUp from "./icons/SortArrowUp.svelte";
8
- import SortArrowDown from "./icons/SortArrowDown.svelte";
9
- import type { SortDirection } from "./context/dataframe_context";
10
- import CellMenuIcons from "./CellMenuIcons.svelte";
11
- import type { FilterDatatype } from "./context/dataframe_context";
12
- import type { Datatype } from "./utils/utils";
13
- import { BaseCheckbox } from "@gradio/checkbox";
14
- export let value: string;
15
- export let i: number;
16
- export let datatype: Datatype = "str";
17
- export let actual_pinned_columns: number;
18
- export let header_edit: number | false;
19
- export let selected_header: number | false;
20
- export let headers: string[];
21
- export let get_cell_width: (index: number) => string;
22
- export let handle_header_click: (event: MouseEvent, col: number) => void;
23
- export let toggle_header_menu: (event: MouseEvent, col: number) => void;
24
- export let end_header_edit: (event: CustomEvent<KeyboardEvent>) => void;
25
- export let sort_columns: { col: number; direction: SortDirection }[] = [];
26
- export let filter_columns: {
27
- col: number;
28
- datatype: FilterDatatype;
29
- filter: string;
30
- value: string;
31
- }[] = [];
32
-
33
- export let latex_delimiters: {
34
- left: string;
35
- right: string;
36
- display: boolean;
37
- }[];
38
- export let line_breaks: boolean;
39
- export let max_chars: number | undefined;
40
- export let editable: boolean;
41
- export let i18n: I18nFormatter;
42
- export let el: HTMLTextAreaElement | null;
43
- export let is_static: boolean;
44
- export let col_count: [number, "fixed" | "dynamic"];
45
- export let data: any[] = [];
46
- export let on_select_all:
47
- | ((col: number, checked: boolean) => void)
48
- | undefined = undefined;
49
-
50
- $: can_add_columns = col_count && col_count[1] === "dynamic";
51
- $: is_bool_column = datatype === "bool";
52
-
53
- $: select_all_state = (() => {
54
- if (!is_bool_column || data.length === 0) return "unchecked";
55
- const true_count = data.filter(
56
- (row) => row[i]?.value === true || row[i]?.value === "true"
57
- ).length;
58
- if (true_count === 0) return "unchecked";
59
- if (true_count === data.length) return "checked";
60
- return "indeterminate";
61
- })();
62
-
63
- $: sort_index = sort_columns.findIndex((item) => item.col === i);
64
- $: filter_index = filter_columns.findIndex((item) => item.col === i);
65
- $: sort_priority = sort_index !== -1 ? sort_index + 1 : null;
66
- $: current_direction =
67
- sort_index !== -1 ? sort_columns[sort_index].direction : null;
68
-
69
- function get_header_position(col_index: number): string {
70
- if (col_index >= actual_pinned_columns) {
71
- return "auto";
72
- }
73
-
74
- if (col_index === 0) {
75
- return "0";
76
- }
77
-
78
- const previous_widths = Array(col_index)
79
- .fill(0)
80
- .map((_, idx) => {
81
- return get_cell_width(idx);
82
- })
83
- .join(" + ");
84
-
85
- return `calc(${previous_widths})`;
86
- }
87
- </script>
88
-
89
- <th
90
- class:pinned-column={i < actual_pinned_columns}
91
- class:last-pinned={i === actual_pinned_columns - 1}
92
- class:focus={header_edit === i || selected_header === i}
93
- class:sorted={sort_index !== -1}
94
- class:filtered={filter_index !== -1}
95
- aria-sort={get_sort_status(value, sort_columns, headers) === "none"
96
- ? "none"
97
- : get_sort_status(value, sort_columns, headers) === "asc"
98
- ? "ascending"
99
- : "descending"}
100
- style="width: {get_cell_width(i)}; left: {get_header_position(i)};"
101
- on:click={(event) => handle_header_click(event, i)}
102
- on:mousedown={(event) => {
103
- event.preventDefault();
104
- event.stopPropagation();
105
- }}
106
- title={value}
107
- >
108
- <div class="cell-wrap">
109
- <div class="header-content">
110
- {#if is_bool_column && editable && on_select_all}
111
- <div
112
- class="select-all-checkbox"
113
- role="button"
114
- tabindex="0"
115
- on:click|stopPropagation
116
- on:keydown|stopPropagation={(e) => {
117
- if (e.key === "Enter" || e.key === " ") {
118
- e.preventDefault();
119
- }
120
- }}
121
- on:mousedown|stopPropagation
122
- >
123
- <BaseCheckbox
124
- value={select_all_state === "checked"}
125
- indeterminate={select_all_state === "indeterminate"}
126
- label=""
127
- interactive={true}
128
- on:select={() => {
129
- if (on_select_all) {
130
- const new_value = select_all_state !== "checked";
131
- on_select_all(i, new_value);
132
- }
133
- }}
134
- />
135
- </div>
136
- {/if}
137
- <button
138
- class="header-button"
139
- on:click={(event) => handle_header_click(event, i)}
140
- on:mousedown={(event) => {
141
- event.preventDefault();
142
- event.stopPropagation();
143
- }}
144
- title={value}
145
- >
146
- <EditableCell
147
- {max_chars}
148
- bind:value
149
- bind:el
150
- {latex_delimiters}
151
- {line_breaks}
152
- edit={header_edit === i}
153
- on:keydown={(event) => {
154
- if (
155
- event.detail.key === "Enter" ||
156
- event.detail.key === "Escape" ||
157
- event.detail.key === "Tab"
158
- ) {
159
- end_header_edit(event);
160
- }
161
- }}
162
- header
163
- {editable}
164
- {is_static}
165
- {i18n}
166
- coords={[i, 0]}
167
- />
168
- {#if sort_index !== -1}
169
- <div class="sort-indicators">
170
- <span class="sort-arrow">
171
- {#if current_direction === "asc"}
172
- <SortArrowUp size={12} />
173
- {:else}
174
- <SortArrowDown size={12} />
175
- {/if}
176
- </span>
177
- {#if sort_columns.length > 1}
178
- <span class="sort-priority">
179
- {sort_priority}
180
- </span>
181
- {/if}
182
- </div>
183
- {/if}
184
- {#if filter_index !== -1}
185
- <div class="filter-indicators">
186
- <span class="filter-icon">
187
- <CellMenuIcons icon="filter" />
188
- </span>
189
- </div>
190
- {/if}
191
- </button>
192
- {#if is_static}
193
- <Padlock />
194
- {/if}
195
- </div>
196
- {#if can_add_columns}
197
- <CellMenuButton on_click={(event) => toggle_header_menu(event, i)} />
198
- {/if}
199
- </div>
200
- </th>
201
-
202
- <style>
203
- th {
204
- --ring-color: transparent;
205
- position: relative;
206
- outline: none;
207
- box-shadow: inset 0 0 0 1px var(--ring-color);
208
- padding: 0;
209
- background: var(--table-even-background-fill);
210
- border-right-width: 0px;
211
- border-left-width: 1px;
212
- border-style: solid;
213
- border-color: var(--border-color-primary);
214
- }
215
-
216
- th:first-child {
217
- border-top-left-radius: var(--table-radius);
218
- border-bottom-left-radius: var(--table-radius);
219
- border-left-width: 0px;
220
- }
221
-
222
- th:last-child {
223
- border-top-right-radius: var(--table-radius);
224
- border-bottom-right-radius: var(--table-radius);
225
- }
226
-
227
- th.focus {
228
- --ring-color: var(--color-accent);
229
- box-shadow: inset 0 0 0 2px var(--ring-color);
230
- z-index: 4;
231
- }
232
-
233
- th.focus :global(.cell-menu-button) {
234
- display: flex;
235
- }
236
-
237
- th:hover :global(.cell-menu-button) {
238
- display: flex;
239
- }
240
-
241
- .cell-wrap {
242
- display: flex;
243
- align-items: center;
244
- justify-content: flex-start;
245
- outline: none;
246
- min-height: var(--size-9);
247
- position: relative;
248
- height: 100%;
249
- padding: var(--size-2);
250
- box-sizing: border-box;
251
- margin: 0;
252
- gap: var(--size-1);
253
- overflow: visible;
254
- min-width: 0;
255
- border-radius: var(--table-radius);
256
- }
257
-
258
- .header-content {
259
- display: flex;
260
- align-items: center;
261
- overflow: hidden;
262
- flex-grow: 1;
263
- min-width: 0;
264
- white-space: normal;
265
- overflow-wrap: break-word;
266
- word-break: normal;
267
- height: 100%;
268
- gap: var(--size-1);
269
- }
270
-
271
- .header-button {
272
- display: flex;
273
- text-align: left;
274
- width: 100%;
275
- overflow: hidden;
276
- text-overflow: ellipsis;
277
- display: flex;
278
- align-items: center;
279
- position: relative;
280
- }
281
-
282
- .sort-indicators {
283
- display: flex;
284
- align-items: center;
285
- margin-left: var(--size-1);
286
- gap: var(--size-1);
287
- }
288
-
289
- .sort-arrow {
290
- display: flex;
291
- align-items: center;
292
- justify-content: center;
293
- color: var(--body-text-color);
294
- }
295
-
296
- .sort-priority {
297
- display: flex;
298
- align-items: center;
299
- justify-content: center;
300
- font-size: var(--size-2);
301
- background-color: var(--button-secondary-background-fill);
302
- color: var(--body-text-color);
303
- border-radius: var(--radius-sm);
304
- width: var(--size-2-5);
305
- height: var(--size-2-5);
306
- padding: var(--size-1-5);
307
- }
308
-
309
- .filter-indicators {
310
- display: flex;
311
- align-items: center;
312
- margin-left: var(--size-1);
313
- gap: var(--size-1);
314
- }
315
-
316
- .filter-icon {
317
- display: flex;
318
- align-items: center;
319
- justify-content: center;
320
- color: var(--body-text-color);
321
- }
322
-
323
- .pinned-column {
324
- position: sticky;
325
- z-index: 5;
326
- border-right: none;
327
- }
328
-
329
- .select-all-checkbox {
330
- display: flex;
331
- align-items: center;
332
- justify-content: center;
333
- margin-right: var(--size-1);
334
- flex-shrink: 0;
335
- }
336
-
337
- .select-all-checkbox :global(label) {
338
- margin: 0;
339
- }
340
-
341
- .select-all-checkbox :global(span) {
342
- display: none;
343
- }
344
- </style>