@gradio/dataframe 0.18.1 → 0.18.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,25 @@
1
1
  # @gradio/dataframe
2
2
 
3
+ ## 0.18.3
4
+
5
+ ### Fixes
6
+
7
+ - [#11534](https://github.com/gradio-app/gradio/pull/11534) [`5259f22`](https://github.com/gradio-app/gradio/commit/5259f229939177cc2027db5164c9321566fb3eeb) - Allow changing value with single click instead of double click. Thanks @hannahblair!
8
+
9
+ ### Dependency updates
10
+
11
+ - @gradio/client@1.15.6
12
+ - @gradio/statustracker@0.10.15
13
+ - @gradio/button@0.5.7
14
+ - @gradio/upload@0.16.11
15
+ - @gradio/checkbox@0.4.26
16
+
17
+ ## 0.18.2
18
+
19
+ ### Fixes
20
+
21
+ - [#11496](https://github.com/gradio-app/gradio/pull/11496) [`ee0da48`](https://github.com/gradio-app/gradio/commit/ee0da481446da5ffd79151a457cd3847db645bfb) - Prevent deletion of values in static columns. Thanks @hannahblair!
22
+
3
23
  ## 0.18.1
4
24
 
5
25
  ### Fixes
@@ -5,25 +5,13 @@ export let on_change;
5
5
  $:
6
6
  bool_value = typeof value === "string" ? value.toLowerCase() === "true" : !!value;
7
7
  function handle_change(event) {
8
- on_change(event.detail);
9
- }
10
- function handle_click(event) {
11
- event.stopPropagation();
12
- }
13
- function handle_keydown(event) {
14
- if (event.key === "Enter" || event.key === " ") {
15
- event.stopPropagation();
8
+ if (editable) {
9
+ on_change(event.detail);
16
10
  }
17
11
  }
18
12
  </script>
19
13
 
20
- <div
21
- class="bool-cell checkbox"
22
- on:click={handle_click}
23
- on:keydown={handle_keydown}
24
- role="button"
25
- tabindex="-1"
26
- >
14
+ <div class="bool-cell" role="button" tabindex="-1">
27
15
  <BaseCheckbox
28
16
  bind:value={bool_value}
29
17
  label=""
@@ -37,15 +25,13 @@ function handle_keydown(event) {
37
25
  display: flex;
38
26
  align-items: center;
39
27
  justify-content: center;
40
- width: var(--size-full);
28
+ width: min-content;
41
29
  height: var(--size-full);
42
- }
43
- .bool-cell :global(input:disabled) {
44
- opacity: 0.8;
30
+ margin: 0 auto;
45
31
  }
46
32
 
47
- .bool-cell.checkbox {
48
- justify-content: center;
33
+ .bool-cell :global(input:disabled) {
34
+ cursor: not-allowed;
49
35
  }
50
36
 
51
37
  .bool-cell :global(label) {
@@ -73,7 +73,8 @@ const df_ctx = create_dataframe_context({
73
73
  wrap,
74
74
  max_height,
75
75
  column_widths,
76
- max_chars
76
+ max_chars,
77
+ static_columns
77
78
  });
78
79
  const { state: df_state, actions: df_actions } = df_ctx;
79
80
  $:
@@ -18,6 +18,7 @@ interface DataFrameState {
18
18
  max_height: number;
19
19
  column_widths: string[];
20
20
  max_chars?: number;
21
+ static_columns?: (string | number)[];
21
22
  };
22
23
  current_search_query: string | null;
23
24
  sort_state: {
@@ -1,8 +1,13 @@
1
1
  import { get_range_selection } from "../selection_utils";
2
2
  export function create_drag_handlers(state, set_is_dragging, set_selected_cells, set_selected, handle_cell_click, show_row_numbers, parent_element) {
3
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");
4
8
  if (event.target instanceof HTMLAnchorElement ||
5
- (show_row_numbers && col === -1))
9
+ (show_row_numbers && col === -1) ||
10
+ is_checkbox_click)
6
11
  return;
7
12
  event.preventDefault();
8
13
  event.stopPropagation();
@@ -59,6 +59,7 @@ function handle_header_navigation(event, ctx) {
59
59
  }
60
60
  return false;
61
61
  }
62
+ // eslint-disable-next-line complexity
62
63
  function handle_delete_operation(event, ctx) {
63
64
  if (!ctx.data || !ctx.headers || !ctx.els || !ctx.dispatch)
64
65
  return false;
@@ -69,6 +70,10 @@ function handle_delete_operation(event, ctx) {
69
70
  return false;
70
71
  const editing = state.ui_state.editing;
71
72
  const selected_cells = state.ui_state.selected_cells;
73
+ const static_columns = state.config.static_columns || [];
74
+ if (selected_cells.some(([_, col]) => static_columns.includes(col))) {
75
+ return false;
76
+ }
72
77
  if (editing) {
73
78
  const [row, col] = editing;
74
79
  const input_el = ctx.els[ctx.data[row][col].id]?.input;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gradio/dataframe",
3
- "version": "0.18.1",
3
+ "version": "0.18.3",
4
4
  "description": "Gradio UI packages",
5
5
  "type": "module",
6
6
  "author": "",
@@ -17,15 +17,15 @@
17
17
  "dompurify": "^3.0.3",
18
18
  "katex": "^0.16.7",
19
19
  "marked": "^12.0.0",
20
- "@gradio/atoms": "^0.16.3",
21
- "@gradio/button": "^0.5.6",
22
- "@gradio/checkbox": "^0.4.25",
23
- "@gradio/client": "^1.15.5",
20
+ "@gradio/button": "^0.5.7",
21
+ "@gradio/checkbox": "^0.4.26",
24
22
  "@gradio/icons": "^0.12.0",
25
23
  "@gradio/markdown-code": "^0.5.0",
26
- "@gradio/statustracker": "^0.10.14",
24
+ "@gradio/statustracker": "^0.10.15",
25
+ "@gradio/upload": "^0.16.11",
27
26
  "@gradio/utils": "^0.10.2",
28
- "@gradio/upload": "^0.16.10"
27
+ "@gradio/atoms": "^0.16.3",
28
+ "@gradio/client": "^1.15.6"
29
29
  },
30
30
  "exports": {
31
31
  ".": {
@@ -9,27 +9,13 @@
9
9
  typeof value === "string" ? value.toLowerCase() === "true" : !!value;
10
10
 
11
11
  function handle_change(event: CustomEvent<boolean>): void {
12
- on_change(event.detail);
13
- }
14
-
15
- function handle_click(event: MouseEvent): void {
16
- event.stopPropagation();
17
- }
18
-
19
- function handle_keydown(event: KeyboardEvent): void {
20
- if (event.key === "Enter" || event.key === " ") {
21
- event.stopPropagation();
12
+ if (editable) {
13
+ on_change(event.detail);
22
14
  }
23
15
  }
24
16
  </script>
25
17
 
26
- <div
27
- class="bool-cell checkbox"
28
- on:click={handle_click}
29
- on:keydown={handle_keydown}
30
- role="button"
31
- tabindex="-1"
32
- >
18
+ <div class="bool-cell" role="button" tabindex="-1">
33
19
  <BaseCheckbox
34
20
  bind:value={bool_value}
35
21
  label=""
@@ -43,15 +29,13 @@
43
29
  display: flex;
44
30
  align-items: center;
45
31
  justify-content: center;
46
- width: var(--size-full);
32
+ width: min-content;
47
33
  height: var(--size-full);
48
- }
49
- .bool-cell :global(input:disabled) {
50
- opacity: 0.8;
34
+ margin: 0 auto;
51
35
  }
52
36
 
53
- .bool-cell.checkbox {
54
- justify-content: center;
37
+ .bool-cell :global(input:disabled) {
38
+ cursor: not-allowed;
55
39
  }
56
40
 
57
41
  .bool-cell :global(label) {
@@ -92,7 +92,8 @@
92
92
  wrap,
93
93
  max_height,
94
94
  column_widths,
95
- max_chars
95
+ max_chars,
96
+ static_columns
96
97
  });
97
98
 
98
99
  const { state: df_state, actions: df_actions } = df_ctx;
@@ -30,6 +30,7 @@ interface DataFrameState {
30
30
  max_height: number;
31
31
  column_widths: string[];
32
32
  max_chars?: number;
33
+ static_columns?: (string | number)[];
33
34
  };
34
35
  current_search_query: string | null;
35
36
  sort_state: {
@@ -23,9 +23,16 @@ export function create_drag_handlers(
23
23
  parent_element?: HTMLElement
24
24
  ): DragHandlers {
25
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
+
26
32
  if (
27
33
  event.target instanceof HTMLAnchorElement ||
28
- (show_row_numbers && col === -1)
34
+ (show_row_numbers && col === -1) ||
35
+ is_checkbox_click
29
36
  )
30
37
  return;
31
38
 
@@ -88,6 +88,7 @@ function handle_header_navigation(
88
88
  return false;
89
89
  }
90
90
 
91
+ // eslint-disable-next-line complexity
91
92
  function handle_delete_operation(
92
93
  event: KeyboardEvent,
93
94
  ctx: DataFrameContext
@@ -101,6 +102,11 @@ function handle_delete_operation(
101
102
  const editing = state.ui_state.editing;
102
103
  const selected_cells = state.ui_state.selected_cells;
103
104
 
105
+ const static_columns = state.config.static_columns || [];
106
+ if (selected_cells.some(([_, col]) => static_columns.includes(col))) {
107
+ return false;
108
+ }
109
+
104
110
  if (editing) {
105
111
  const [row, col] = editing;
106
112
  const input_el = ctx.els[ctx.data[row][col].id]?.input;