@gradio/dataframe 0.16.1 → 0.16.3

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @gradio/dataframe
2
2
 
3
+ ## 0.16.3
4
+
5
+ ### Features
6
+
7
+ - [#10646](https://github.com/gradio-app/gradio/pull/10646) [`b01ce47`](https://github.com/gradio-app/gradio/commit/b01ce47056f5752fbf03e44600bf0f7dab69b64c) - Fixes cell-selection logic in `Table.svelte`. Thanks @abidlabs!
8
+
9
+ ## 0.16.2
10
+
11
+ ### Fixes
12
+
13
+ - [#10597](https://github.com/gradio-app/gradio/pull/10597) [`8c87eb8`](https://github.com/gradio-app/gradio/commit/8c87eb83066278b0e28267a6648d4729d6f39aa9) - Fix issue where styling changes were overridden when value was updated simultaneously. Thanks @abidlabs!
14
+
15
+ ### Dependency updates
16
+
17
+ - @gradio/upload@0.15.2
18
+ - @gradio/statustracker@0.10.4
19
+ - @gradio/atoms@0.13.3
20
+ - @gradio/button@0.4.7
21
+
3
22
  ## 0.16.1
4
23
 
5
24
  ### Fixes
package/Index.svelte CHANGED
@@ -103,7 +103,8 @@
103
103
  {styling}
104
104
  headers={_headers}
105
105
  on:change={(e) => {
106
- value = e.detail;
106
+ value.data = e.detail.data;
107
+ value.headers = e.detail.headers;
107
108
  gradio.dispatch("change");
108
109
  }}
109
110
  on:input={(e) => gradio.dispatch("input")}
package/dist/Index.svelte CHANGED
@@ -81,7 +81,8 @@ $:
81
81
  {styling}
82
82
  headers={_headers}
83
83
  on:change={(e) => {
84
- value = e.detail;
84
+ value.data = e.detail.data;
85
+ value.headers = e.detail.headers;
85
86
  gradio.dispatch("change");
86
87
  }}
87
88
  on:input={(e) => gradio.dispatch("input")}
@@ -152,6 +152,7 @@ async function trigger_change() {
152
152
  data: data.map((row) => row.map((cell) => cell.value)),
153
153
  headers: _headers.map((h) => h.value),
154
154
  metadata: null
155
+ // the metadata (display value, styling) cannot be changed by the user so we don't need to pass it up
155
156
  });
156
157
  if (!value_is_output) {
157
158
  dispatch("input");
@@ -176,6 +177,7 @@ async function handle_keydown(event) {
176
177
  switch (event.key) {
177
178
  case "ArrowDown":
178
179
  selected = [0, selected_header];
180
+ selected_cells = [[0, selected_header]];
179
181
  selected_header = false;
180
182
  return;
181
183
  case "ArrowLeft":
@@ -190,6 +192,9 @@ async function handle_keydown(event) {
190
192
  break;
191
193
  case "Enter":
192
194
  event.preventDefault();
195
+ if (editable) {
196
+ header_edit = selected_header;
197
+ }
193
198
  break;
194
199
  }
195
200
  }
@@ -252,15 +257,13 @@ async function handle_keydown(event) {
252
257
  editing = false;
253
258
  } else {
254
259
  selected_cells = [next_coords];
255
- if (editable) {
256
- editing = next_coords;
257
- clear_on_focus = false;
258
- }
260
+ editing = false;
259
261
  }
260
262
  selected = next_coords;
261
263
  } else if (next_coords === false && event.key === "ArrowUp" && i === 0) {
262
264
  selected_header = j;
263
265
  selected = false;
266
+ selected_cells = [];
264
267
  editing = false;
265
268
  }
266
269
  break;
@@ -336,7 +339,7 @@ function handle_sort(col, direction) {
336
339
  }
337
340
  }
338
341
  async function edit_header(i, _select = false) {
339
- if (!editable || col_count[1] !== "dynamic" || header_edit === i)
342
+ if (!editable || header_edit === i)
340
343
  return;
341
344
  selected = false;
342
345
  selected_cells = [];
@@ -699,6 +702,23 @@ function commit_filter() {
699
702
  current_search_query = null;
700
703
  }
701
704
  }
705
+ function handle_header_click(event, col) {
706
+ if (event.target instanceof HTMLAnchorElement) {
707
+ return;
708
+ }
709
+ event.preventDefault();
710
+ event.stopPropagation();
711
+ if (!editable)
712
+ return;
713
+ clear_on_focus = false;
714
+ active_cell_menu = null;
715
+ active_header_menu = null;
716
+ selected = false;
717
+ selected_cells = [];
718
+ selected_header = col;
719
+ header_edit = col;
720
+ parent.focus();
721
+ }
702
722
  </script>
703
723
 
704
724
  <svelte:window on:resize={() => set_cell_widths()} />
@@ -776,14 +796,11 @@ function commit_filter() {
776
796
  {#each _headers as { value, id }, i (id)}
777
797
  <th
778
798
  class:frozen-column={i < actual_pinned_columns}
779
- class:last-frozen={show_row_numbers
780
- ? i === actual_pinned_columns - 1
781
- : i === actual_pinned_columns - 1}
782
- class:editing={header_edit === i}
799
+ class:last-frozen={i === actual_pinned_columns - 1}
800
+ class:focus={header_edit === i || selected_header === i}
783
801
  aria-sort={get_sort_status(value, sort_by, sort_direction)}
784
- style="width: {column_widths.length
785
- ? column_widths[i]
786
- : undefined}; left: {i < actual_pinned_columns
802
+ style="width: {get_cell_width(i)}; left: {i <
803
+ actual_pinned_columns
787
804
  ? i === 0
788
805
  ? show_row_numbers
789
806
  ? 'var(--cell-width-row-number)'
@@ -795,27 +812,56 @@ function commit_filter() {
795
812
  .map((_, idx) => `var(--cell-width-${idx})`)
796
813
  .join(' + ')})`
797
814
  : 'auto'};"
815
+ on:click={(event) => handle_header_click(event, i)}
816
+ on:mousedown={(event) => {
817
+ event.preventDefault();
818
+ event.stopPropagation();
819
+ }}
798
820
  >
799
821
  <div class="cell-wrap">
800
822
  <div class="header-content">
801
823
  <EditableCell
802
- {value}
824
+ {max_chars}
825
+ bind:value={_headers[i].value}
826
+ bind:el={els[id].input}
803
827
  {latex_delimiters}
804
828
  {line_breaks}
829
+ edit={header_edit === i}
830
+ on:keydown={end_header_edit}
805
831
  header
806
- edit={false}
807
- el={null}
808
832
  {root}
809
833
  {editable}
810
834
  />
811
- <div class="sort-buttons">
812
- <SortIcon
813
- direction={sort_by === i ? sort_direction : null}
814
- on:sort={({ detail }) => handle_sort(i, detail)}
815
- {i18n}
816
- />
817
- </div>
835
+ {#if header_edit !== i}
836
+ <div class="sort-buttons">
837
+ <SortIcon
838
+ direction={sort_by === i ? sort_direction : null}
839
+ on:sort={({ detail }) => handle_sort(i, detail)}
840
+ {i18n}
841
+ />
842
+ </div>
843
+ {/if}
818
844
  </div>
845
+ {#if editable}
846
+ <button
847
+ class="cell-menu-button"
848
+ on:click={(event) => toggle_header_menu(event, i)}
849
+ on:touchstart={(event) => {
850
+ event.preventDefault();
851
+ const touch = event.touches[0];
852
+ const mouseEvent = new MouseEvent("click", {
853
+ clientX: touch.clientX,
854
+ clientY: touch.clientY,
855
+ bubbles: true,
856
+ cancelable: true,
857
+ view: window
858
+ });
859
+ toggle_header_menu(mouseEvent, i);
860
+ }}
861
+ >
862
+ &#8942;
863
+ </button>
864
+ {/if}
819
865
  </div>
820
866
  </th>
821
867
  {/each}
@@ -913,8 +959,10 @@ function commit_filter() {
913
959
  .map((_, idx) => `var(--cell-width-${idx})`)
914
960
  .join(' + ')})`
915
961
  : 'auto'};"
916
- on:click={() => {
917
- toggle_header_button(i);
962
+ on:click={(event) => handle_header_click(event, i)}
963
+ on:mousedown={(event) => {
964
+ event.preventDefault();
965
+ event.stopPropagation();
918
966
  }}
919
967
  >
920
968
  <div class="cell-wrap">
@@ -926,19 +974,19 @@ function commit_filter() {
926
974
  {latex_delimiters}
927
975
  {line_breaks}
928
976
  edit={header_edit === i}
929
- on:keydown={end_header_edit}
930
- on:dblclick={() => edit_header(i)}
931
977
  header
932
978
  {root}
933
979
  {editable}
934
980
  />
935
- <div class="sort-buttons">
936
- <SortIcon
937
- direction={sort_by === i ? sort_direction : null}
938
- on:sort={({ detail }) => handle_sort(i, detail)}
939
- {i18n}
940
- />
941
- </div>
981
+ {#if header_edit !== i}
982
+ <div class="sort-buttons">
983
+ <SortIcon
984
+ direction={sort_by === i ? sort_direction : null}
985
+ on:sort={({ detail }) => handle_sort(i, detail)}
986
+ {i18n}
987
+ />
988
+ </div>
989
+ {/if}
942
990
  </div>
943
991
  {#if editable}
944
992
  <button
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gradio/dataframe",
3
- "version": "0.16.1",
3
+ "version": "0.16.3",
4
4
  "description": "Gradio UI packages",
5
5
  "type": "module",
6
6
  "author": "",
@@ -17,13 +17,13 @@
17
17
  "dompurify": "^3.0.3",
18
18
  "katex": "^0.16.7",
19
19
  "marked": "^12.0.0",
20
- "@gradio/atoms": "^0.13.2",
20
+ "@gradio/atoms": "^0.13.3",
21
21
  "@gradio/client": "^1.12.0",
22
22
  "@gradio/icons": "^0.10.0",
23
- "@gradio/button": "^0.4.6",
24
23
  "@gradio/markdown-code": "^0.4.0",
25
- "@gradio/upload": "^0.15.1",
26
- "@gradio/statustracker": "^0.10.3",
24
+ "@gradio/statustracker": "^0.10.4",
25
+ "@gradio/upload": "^0.15.2",
26
+ "@gradio/button": "^0.4.7",
27
27
  "@gradio/utils": "^0.10.1"
28
28
  },
29
29
  "exports": {
@@ -234,7 +234,7 @@
234
234
  dispatch("change", {
235
235
  data: data.map((row) => row.map((cell) => cell.value)),
236
236
  headers: _headers.map((h) => h.value),
237
- metadata: null
237
+ metadata: null // the metadata (display value, styling) cannot be changed by the user so we don't need to pass it up
238
238
  });
239
239
  if (!value_is_output) {
240
240
  dispatch("input");
@@ -263,6 +263,7 @@
263
263
  switch (event.key) {
264
264
  case "ArrowDown":
265
265
  selected = [0, selected_header];
266
+ selected_cells = [[0, selected_header]];
266
267
  selected_header = false;
267
268
  return;
268
269
  case "ArrowLeft":
@@ -281,6 +282,9 @@
281
282
  break;
282
283
  case "Enter":
283
284
  event.preventDefault();
285
+ if (editable) {
286
+ header_edit = selected_header;
287
+ }
284
288
  break;
285
289
  }
286
290
  }
@@ -351,10 +355,7 @@
351
355
  editing = false;
352
356
  } else {
353
357
  selected_cells = [next_coords];
354
- if (editable) {
355
- editing = next_coords;
356
- clear_on_focus = false;
357
- }
358
+ editing = false;
358
359
  }
359
360
  selected = next_coords;
360
361
  } else if (
@@ -364,6 +365,7 @@
364
365
  ) {
365
366
  selected_header = j;
366
367
  selected = false;
368
+ selected_cells = [];
367
369
  editing = false;
368
370
  }
369
371
  break;
@@ -445,7 +447,7 @@
445
447
  }
446
448
 
447
449
  async function edit_header(i: number, _select = false): Promise<void> {
448
- if (!editable || col_count[1] !== "dynamic" || header_edit === i) return;
450
+ if (!editable || header_edit === i) return;
449
451
  selected = false;
450
452
  selected_cells = [];
451
453
  selected_header = i;
@@ -896,6 +898,27 @@
896
898
  current_search_query = null;
897
899
  }
898
900
  }
901
+
902
+ function handle_header_click(event: MouseEvent, col: number): void {
903
+ if (event.target instanceof HTMLAnchorElement) {
904
+ return;
905
+ }
906
+
907
+ event.preventDefault();
908
+ event.stopPropagation();
909
+
910
+ if (!editable) return;
911
+
912
+ clear_on_focus = false;
913
+ active_cell_menu = null;
914
+ active_header_menu = null;
915
+ selected = false;
916
+ selected_cells = [];
917
+ selected_header = col;
918
+ header_edit = col;
919
+
920
+ parent.focus();
921
+ }
899
922
  </script>
900
923
 
901
924
  <svelte:window on:resize={() => set_cell_widths()} />
@@ -973,14 +996,11 @@
973
996
  {#each _headers as { value, id }, i (id)}
974
997
  <th
975
998
  class:frozen-column={i < actual_pinned_columns}
976
- class:last-frozen={show_row_numbers
977
- ? i === actual_pinned_columns - 1
978
- : i === actual_pinned_columns - 1}
979
- class:editing={header_edit === i}
999
+ class:last-frozen={i === actual_pinned_columns - 1}
1000
+ class:focus={header_edit === i || selected_header === i}
980
1001
  aria-sort={get_sort_status(value, sort_by, sort_direction)}
981
- style="width: {column_widths.length
982
- ? column_widths[i]
983
- : undefined}; left: {i < actual_pinned_columns
1002
+ style="width: {get_cell_width(i)}; left: {i <
1003
+ actual_pinned_columns
984
1004
  ? i === 0
985
1005
  ? show_row_numbers
986
1006
  ? 'var(--cell-width-row-number)'
@@ -992,27 +1012,56 @@
992
1012
  .map((_, idx) => `var(--cell-width-${idx})`)
993
1013
  .join(' + ')})`
994
1014
  : 'auto'};"
1015
+ on:click={(event) => handle_header_click(event, i)}
1016
+ on:mousedown={(event) => {
1017
+ event.preventDefault();
1018
+ event.stopPropagation();
1019
+ }}
995
1020
  >
996
1021
  <div class="cell-wrap">
997
1022
  <div class="header-content">
998
1023
  <EditableCell
999
- {value}
1024
+ {max_chars}
1025
+ bind:value={_headers[i].value}
1026
+ bind:el={els[id].input}
1000
1027
  {latex_delimiters}
1001
1028
  {line_breaks}
1029
+ edit={header_edit === i}
1030
+ on:keydown={end_header_edit}
1002
1031
  header
1003
- edit={false}
1004
- el={null}
1005
1032
  {root}
1006
1033
  {editable}
1007
1034
  />
1008
- <div class="sort-buttons">
1009
- <SortIcon
1010
- direction={sort_by === i ? sort_direction : null}
1011
- on:sort={({ detail }) => handle_sort(i, detail)}
1012
- {i18n}
1013
- />
1014
- </div>
1035
+ {#if header_edit !== i}
1036
+ <div class="sort-buttons">
1037
+ <SortIcon
1038
+ direction={sort_by === i ? sort_direction : null}
1039
+ on:sort={({ detail }) => handle_sort(i, detail)}
1040
+ {i18n}
1041
+ />
1042
+ </div>
1043
+ {/if}
1015
1044
  </div>
1045
+ {#if editable}
1046
+ <button
1047
+ class="cell-menu-button"
1048
+ on:click={(event) => toggle_header_menu(event, i)}
1049
+ on:touchstart={(event) => {
1050
+ event.preventDefault();
1051
+ const touch = event.touches[0];
1052
+ const mouseEvent = new MouseEvent("click", {
1053
+ clientX: touch.clientX,
1054
+ clientY: touch.clientY,
1055
+ bubbles: true,
1056
+ cancelable: true,
1057
+ view: window
1058
+ });
1059
+ toggle_header_menu(mouseEvent, i);
1060
+ }}
1061
+ >
1062
+ &#8942;
1063
+ </button>
1064
+ {/if}
1016
1065
  </div>
1017
1066
  </th>
1018
1067
  {/each}
@@ -1110,8 +1159,10 @@
1110
1159
  .map((_, idx) => `var(--cell-width-${idx})`)
1111
1160
  .join(' + ')})`
1112
1161
  : 'auto'};"
1113
- on:click={() => {
1114
- toggle_header_button(i);
1162
+ on:click={(event) => handle_header_click(event, i)}
1163
+ on:mousedown={(event) => {
1164
+ event.preventDefault();
1165
+ event.stopPropagation();
1115
1166
  }}
1116
1167
  >
1117
1168
  <div class="cell-wrap">
@@ -1123,19 +1174,19 @@
1123
1174
  {latex_delimiters}
1124
1175
  {line_breaks}
1125
1176
  edit={header_edit === i}
1126
- on:keydown={end_header_edit}
1127
- on:dblclick={() => edit_header(i)}
1128
1177
  header
1129
1178
  {root}
1130
1179
  {editable}
1131
1180
  />
1132
- <div class="sort-buttons">
1133
- <SortIcon
1134
- direction={sort_by === i ? sort_direction : null}
1135
- on:sort={({ detail }) => handle_sort(i, detail)}
1136
- {i18n}
1137
- />
1138
- </div>
1181
+ {#if header_edit !== i}
1182
+ <div class="sort-buttons">
1183
+ <SortIcon
1184
+ direction={sort_by === i ? sort_direction : null}
1185
+ on:sort={({ detail }) => handle_sort(i, detail)}
1186
+ {i18n}
1187
+ />
1188
+ </div>
1189
+ {/if}
1139
1190
  </div>
1140
1191
  {#if editable}
1141
1192
  <button