@gradio/dataframe 0.20.1 → 0.21.0-dev.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.
Files changed (58) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/Dataframe.stories.svelte +0 -25
  3. package/Example.svelte +17 -13
  4. package/Index.svelte +114 -110
  5. package/dist/Example.svelte +26 -20
  6. package/dist/Example.svelte.d.ts +21 -19
  7. package/dist/Index.svelte +121 -99
  8. package/dist/Index.svelte.d.ts +4 -168
  9. package/dist/shared/BooleanCell.svelte +12 -9
  10. package/dist/shared/BooleanCell.svelte.d.ts +20 -18
  11. package/dist/shared/CellMenu.svelte +82 -64
  12. package/dist/shared/CellMenu.svelte.d.ts +39 -37
  13. package/dist/shared/CellMenuButton.svelte +2 -1
  14. package/dist/shared/CellMenuButton.svelte.d.ts +18 -16
  15. package/dist/shared/CellMenuIcons.svelte +2 -1
  16. package/dist/shared/CellMenuIcons.svelte.d.ts +18 -16
  17. package/dist/shared/EditableCell.svelte +97 -56
  18. package/dist/shared/EditableCell.svelte.d.ts +50 -48
  19. package/dist/shared/EmptyRowButton.svelte +2 -1
  20. package/dist/shared/EmptyRowButton.svelte.d.ts +18 -16
  21. package/dist/shared/Example.svelte +2 -1
  22. package/dist/shared/Example.svelte.d.ts +18 -16
  23. package/dist/shared/FilterMenu.svelte +53 -39
  24. package/dist/shared/FilterMenu.svelte.d.ts +20 -18
  25. package/dist/shared/RowNumber.svelte +3 -2
  26. package/dist/shared/RowNumber.svelte.d.ts +19 -17
  27. package/dist/shared/Table.svelte +826 -624
  28. package/dist/shared/Table.svelte.d.ts +59 -57
  29. package/dist/shared/TableCell.svelte +95 -50
  30. package/dist/shared/TableCell.svelte.d.ts +61 -59
  31. package/dist/shared/TableHeader.svelte +86 -58
  32. package/dist/shared/TableHeader.svelte.d.ts +55 -53
  33. package/dist/shared/Toolbar.svelte +49 -39
  34. package/dist/shared/Toolbar.svelte.d.ts +27 -25
  35. package/dist/shared/VirtualTable.svelte +207 -154
  36. package/dist/shared/VirtualTable.svelte.d.ts +40 -37
  37. package/dist/shared/icons/FilterIcon.svelte +2 -1
  38. package/dist/shared/icons/FilterIcon.svelte.d.ts +16 -14
  39. package/dist/shared/icons/Padlock.svelte.d.ts +22 -21
  40. package/dist/shared/icons/SelectionButtons.svelte +15 -5
  41. package/dist/shared/icons/SelectionButtons.svelte.d.ts +20 -18
  42. package/dist/shared/icons/SortArrowDown.svelte +2 -1
  43. package/dist/shared/icons/SortArrowDown.svelte.d.ts +18 -16
  44. package/dist/shared/icons/SortArrowUp.svelte +2 -1
  45. package/dist/shared/icons/SortArrowUp.svelte.d.ts +18 -16
  46. package/dist/shared/icons/SortButtonDown.svelte.d.ts +22 -21
  47. package/dist/shared/icons/SortButtonUp.svelte.d.ts +22 -21
  48. package/dist/shared/icons/SortIcon.svelte +12 -8
  49. package/dist/shared/icons/SortIcon.svelte.d.ts +22 -20
  50. package/dist/shared/utils/data_processing.d.ts +1 -1
  51. package/dist/standalone/Index.svelte +104 -78
  52. package/dist/standalone/Index.svelte.d.ts +41 -41
  53. package/dist/standalone/stubs/Upload.svelte +5 -4
  54. package/dist/standalone/stubs/Upload.svelte.d.ts +35 -25
  55. package/package.json +15 -14
  56. package/shared/Table.svelte +13 -11
  57. package/shared/VirtualTable.svelte +1 -1
  58. package/standalone/Index.svelte +17 -19
package/dist/Index.svelte CHANGED
@@ -1,105 +1,127 @@
1
1
  <svelte:options accessors={true} />
2
2
 
3
- <script context="module">export { default as BaseDataFrame } from "./shared/Table.svelte";
4
- export { default as BaseExample } from "./Example.svelte";
3
+ <script context="module" lang="ts">
4
+ export { default as BaseDataFrame } from "./shared/Table.svelte";
5
+ export { default as BaseExample } from "./Example.svelte";
5
6
  </script>
6
7
 
7
- <script>import { Block } from "@gradio/atoms";
8
- import Table from "./shared/Table.svelte";
9
- import { StatusTracker } from "@gradio/statustracker";
10
- import Image from "@gradio/image";
11
- export let elem_id = "";
12
- export let elem_classes = [];
13
- export let visible = true;
14
- export let value = {
15
- data: [["", "", ""]],
16
- headers: ["1", "2", "3"],
17
- metadata: null
18
- };
19
- export let value_is_output = false;
20
- export let col_count;
21
- export let row_count;
22
- export let label = null;
23
- export let show_label = true;
24
- export let wrap;
25
- export let datatype;
26
- export let scale = null;
27
- export let min_width = void 0;
28
- export let root;
29
- export let line_breaks = true;
30
- export let column_widths = [];
31
- export let gradio;
32
- export let latex_delimiters;
33
- export let max_height = void 0;
34
- export let loading_status;
35
- export let interactive;
36
- export let show_fullscreen_button = false;
37
- export let max_chars = void 0;
38
- export let show_copy_button = false;
39
- export let show_row_numbers = false;
40
- export let show_search = "none";
41
- export let pinned_columns = 0;
42
- export let static_columns = [];
43
- export let fullscreen = false;
8
+ <script lang="ts">
9
+ import type { SharedProps } from "@gradio/utils";
10
+ import { Gradio } from "@gradio/utils";
11
+
12
+ import type { DataframeProps, DataframeEvents } from "./types";
13
+ import { dequal } from "dequal";
14
+ import { onMount } from "svelte";
15
+ import DF from "@gradio/dataframe-interim";
16
+ import "@gradio/dataframe-interim/css";
17
+
18
+ let prev_data: any = null;
19
+
20
+ let changed = false;
21
+
22
+ class DataframeGradio extends Gradio<DataframeEvents, DataframeProps> {
23
+ async set_data(data: Partial<DataframeProps & SharedProps>): Promise<void> {
24
+ console.log("DataframeGradio set_data called", data);
25
+ if (data.value) {
26
+ changed = true;
27
+ }
28
+
29
+ super.set_data(data);
30
+ if (data.value && dequal(data.value, JSON.parse(prev_data)) === false) {
31
+ // this.dispatch("change");
32
+ prev_data = JSON.stringify(data.value);
33
+ }
34
+ }
35
+ }
36
+
37
+ let props = $props();
38
+
39
+ let gradio = new DataframeGradio(props);
40
+ let el: HTMLDivElement;
41
+ let Component: typeof DF | null = null;
42
+ onMount(() => {
43
+ Component = new DF({
44
+ target: el,
45
+ props: {
46
+ elem_id: gradio.shared.elem_id,
47
+ elem_classes: gradio.shared.elem_classes,
48
+ visible: gradio.shared.visible,
49
+ value: gradio.props.value,
50
+
51
+ col_count: gradio.props.col_count,
52
+ row_count: gradio.props.row_count,
53
+ label: gradio.shared.label,
54
+ show_label: gradio.shared.show_label,
55
+ wrap: gradio.props.wrap,
56
+ datatype: gradio.props.datatype,
57
+ scale: gradio.shared.scale,
58
+ min_width: gradio.shared.min_width,
59
+ root: gradio.shared.root,
60
+ line_breaks: gradio.props.line_breaks,
61
+ column_widths: gradio.props.column_widths,
62
+ gradio: compat_gradio,
63
+ latex_delimiters: gradio.props.latex_delimiters,
64
+ max_height: gradio.props.max_height,
65
+ loading_status: gradio.shared.loading_status,
66
+ interactive: gradio.shared.interactive,
67
+ buttons: gradio.props.buttons,
68
+ max_chars: gradio.props.max_chars,
69
+ show_row_numbers: gradio.props.show_row_numbers,
70
+ show_search: gradio.props.show_search,
71
+ pinned_columns: gradio.props.pinned_columns,
72
+ static_columns: gradio.props.static_columns,
73
+ fullscreen: gradio.props.fullscreen
74
+ }
75
+ });
76
+ });
77
+
78
+ const compat_gradio = {
79
+ i18n: gradio.i18n,
80
+ client: gradio.shared.client,
81
+ dispatch(name: keyof DataframeEvents, detail?: any) {
82
+ if (name === "input" && changed) {
83
+ console.log("Skipping duplicate input event");
84
+ changed = false;
85
+ return;
86
+ }
87
+ gradio.dispatch(name, detail);
88
+ },
89
+ autoscroll: gradio.shared.autoscroll
90
+ };
91
+ $effect(() => {
92
+ if (Component) {
93
+ Component.$set({
94
+ elem_id: gradio.shared.elem_id,
95
+ elem_classes: gradio.shared.elem_classes,
96
+ visible: gradio.shared.visible,
97
+ value: gradio.props.value,
98
+
99
+ col_count: gradio.props.col_count,
100
+ row_count: gradio.props.row_count,
101
+ label: gradio.shared.label,
102
+ show_label: gradio.shared.show_label,
103
+ wrap: gradio.props.wrap,
104
+ datatype: gradio.props.datatype,
105
+ scale: gradio.shared.scale,
106
+ min_width: gradio.shared.min_width,
107
+ root: gradio.shared.root,
108
+ line_breaks: gradio.props.line_breaks,
109
+ column_widths: gradio.props.column_widths,
110
+ gradio: compat_gradio,
111
+ latex_delimiters: gradio.props.latex_delimiters,
112
+ max_height: gradio.props.max_height,
113
+ loading_status: gradio.shared.loading_status,
114
+ interactive: gradio.shared.interactive,
115
+ buttons: gradio.props.buttons,
116
+ max_chars: gradio.props.max_chars,
117
+ show_row_numbers: gradio.props.show_row_numbers,
118
+ show_search: gradio.props.show_search,
119
+ pinned_columns: gradio.props.pinned_columns,
120
+ static_columns: gradio.props.static_columns,
121
+ fullscreen: gradio.props.fullscreen
122
+ });
123
+ }
124
+ });
44
125
  </script>
45
126
 
46
- <Block
47
- {visible}
48
- padding={false}
49
- {elem_id}
50
- {elem_classes}
51
- container={false}
52
- {scale}
53
- {min_width}
54
- overflow_behavior="visible"
55
- bind:fullscreen
56
- >
57
- <StatusTracker
58
- autoscroll={gradio.autoscroll}
59
- i18n={gradio.i18n}
60
- {...loading_status}
61
- on:clear_status={() => gradio.dispatch("clear_status", loading_status)}
62
- />
63
- <Table
64
- {root}
65
- {label}
66
- {show_label}
67
- {row_count}
68
- {col_count}
69
- values={value.data}
70
- display_value={value.metadata?.display_value}
71
- styling={value.metadata?.styling}
72
- headers={value.headers}
73
- {fullscreen}
74
- on:change={(e) => {
75
- value.data = e.detail.data;
76
- value.headers = e.detail.headers;
77
- gradio.dispatch("change");
78
- }}
79
- on:input={(e) => gradio.dispatch("input")}
80
- on:select={(e) => gradio.dispatch("select", e.detail)}
81
- on:edit={(e) => gradio.dispatch("edit", e.detail)}
82
- on:fullscreen={({ detail }) => {
83
- fullscreen = detail;
84
- }}
85
- {wrap}
86
- {datatype}
87
- {latex_delimiters}
88
- editable={interactive}
89
- {max_height}
90
- i18n={gradio.i18n}
91
- {line_breaks}
92
- {column_widths}
93
- upload={(...args) => gradio.client.upload(...args)}
94
- stream_handler={(...args) => gradio.client.stream(...args)}
95
- bind:value_is_output
96
- {show_fullscreen_button}
97
- {max_chars}
98
- {show_copy_button}
99
- {show_row_numbers}
100
- {show_search}
101
- {pinned_columns}
102
- components={{ image: Image }}
103
- {static_columns}
104
- />
105
- </Block>
127
+ <div bind:this={el} />
@@ -1,170 +1,6 @@
1
- import { SvelteComponent } from "svelte";
2
1
  export { default as BaseDataFrame } from "./shared/Table.svelte";
3
2
  export { default as BaseExample } from "./Example.svelte";
4
- import type { Gradio, SelectData } from "@gradio/utils";
5
- import type { LoadingStatus } from "@gradio/statustracker";
6
- import type { Datatype, DataframeValue } from "./shared/utils/utils";
7
- declare const __propDef: {
8
- props: {
9
- elem_id?: string;
10
- elem_classes?: string[];
11
- visible?: boolean | "hidden";
12
- value?: DataframeValue;
13
- value_is_output?: boolean;
14
- col_count: [number, "fixed" | "dynamic"];
15
- row_count: [number, "fixed" | "dynamic"];
16
- label?: string | null;
17
- show_label?: boolean;
18
- wrap: boolean;
19
- datatype: Datatype | Datatype[];
20
- scale?: number | null;
21
- min_width?: number | undefined;
22
- root: string;
23
- line_breaks?: boolean;
24
- column_widths?: string[];
25
- gradio: Gradio<{
26
- change: never;
27
- select: SelectData;
28
- input: never;
29
- clear_status: LoadingStatus;
30
- search: string | null;
31
- edit: SelectData;
32
- }>;
33
- latex_delimiters: {
34
- left: string;
35
- right: string;
36
- display: boolean;
37
- }[];
38
- max_height?: number | undefined;
39
- loading_status: LoadingStatus;
40
- interactive: boolean;
41
- show_fullscreen_button?: boolean;
42
- max_chars?: number | undefined;
43
- show_copy_button?: boolean;
44
- show_row_numbers?: boolean;
45
- show_search?: "none" | "search" | "filter";
46
- pinned_columns?: number;
47
- static_columns?: (string | number)[];
48
- fullscreen?: boolean;
49
- };
50
- events: {
51
- [evt: string]: CustomEvent<any>;
52
- };
53
- slots: {};
54
- exports?: {} | undefined;
55
- bindings?: string | undefined;
56
- };
57
- export type IndexProps = typeof __propDef.props;
58
- export type IndexEvents = typeof __propDef.events;
59
- export type IndexSlots = typeof __propDef.slots;
60
- export default class Index extends SvelteComponent<IndexProps, IndexEvents, IndexSlots> {
61
- get elem_id(): string | undefined;
62
- /**accessor*/
63
- set elem_id(_: string | undefined);
64
- get elem_classes(): string[] | undefined;
65
- /**accessor*/
66
- set elem_classes(_: string[] | undefined);
67
- get visible(): boolean | "hidden" | undefined;
68
- /**accessor*/
69
- set visible(_: boolean | "hidden" | undefined);
70
- get value(): DataframeValue | undefined;
71
- /**accessor*/
72
- set value(_: DataframeValue | undefined);
73
- get value_is_output(): boolean | undefined;
74
- /**accessor*/
75
- set value_is_output(_: boolean | undefined);
76
- get col_count(): [number, "fixed" | "dynamic"];
77
- /**accessor*/
78
- set col_count(_: [number, "fixed" | "dynamic"]);
79
- get row_count(): [number, "fixed" | "dynamic"];
80
- /**accessor*/
81
- set row_count(_: [number, "fixed" | "dynamic"]);
82
- get label(): string | null | undefined;
83
- /**accessor*/
84
- set label(_: string | null | undefined);
85
- get show_label(): boolean | undefined;
86
- /**accessor*/
87
- set show_label(_: boolean | undefined);
88
- get wrap(): boolean;
89
- /**accessor*/
90
- set wrap(_: boolean);
91
- get datatype(): Datatype | Datatype[];
92
- /**accessor*/
93
- set datatype(_: Datatype | Datatype[]);
94
- get scale(): number | null | undefined;
95
- /**accessor*/
96
- set scale(_: number | null | undefined);
97
- get min_width(): number | undefined;
98
- /**accessor*/
99
- set min_width(_: number | undefined);
100
- get root(): string;
101
- /**accessor*/
102
- set root(_: string);
103
- get line_breaks(): boolean | undefined;
104
- /**accessor*/
105
- set line_breaks(_: boolean | undefined);
106
- get column_widths(): string[] | undefined;
107
- /**accessor*/
108
- set column_widths(_: string[] | undefined);
109
- get gradio(): Gradio<{
110
- change: never;
111
- select: SelectData;
112
- input: never;
113
- clear_status: LoadingStatus;
114
- search: string | null;
115
- edit: SelectData;
116
- }>;
117
- /**accessor*/
118
- set gradio(_: Gradio<{
119
- change: never;
120
- select: SelectData;
121
- input: never;
122
- clear_status: LoadingStatus;
123
- search: string | null;
124
- edit: SelectData;
125
- }>);
126
- get latex_delimiters(): {
127
- left: string;
128
- right: string;
129
- display: boolean;
130
- }[];
131
- /**accessor*/
132
- set latex_delimiters(_: {
133
- left: string;
134
- right: string;
135
- display: boolean;
136
- }[]);
137
- get max_height(): number | undefined;
138
- /**accessor*/
139
- set max_height(_: number | undefined);
140
- get loading_status(): LoadingStatus;
141
- /**accessor*/
142
- set loading_status(_: LoadingStatus);
143
- get interactive(): boolean;
144
- /**accessor*/
145
- set interactive(_: boolean);
146
- get show_fullscreen_button(): boolean | undefined;
147
- /**accessor*/
148
- set show_fullscreen_button(_: boolean | undefined);
149
- get max_chars(): number | undefined;
150
- /**accessor*/
151
- set max_chars(_: number | undefined);
152
- get show_copy_button(): boolean | undefined;
153
- /**accessor*/
154
- set show_copy_button(_: boolean | undefined);
155
- get show_row_numbers(): boolean | undefined;
156
- /**accessor*/
157
- set show_row_numbers(_: boolean | undefined);
158
- get show_search(): "none" | "filter" | "search" | undefined;
159
- /**accessor*/
160
- set show_search(_: "none" | "filter" | "search" | undefined);
161
- get pinned_columns(): number | undefined;
162
- /**accessor*/
163
- set pinned_columns(_: number | undefined);
164
- get static_columns(): (string | number)[] | undefined;
165
- /**accessor*/
166
- set static_columns(_: (string | number)[] | undefined);
167
- get fullscreen(): boolean | undefined;
168
- /**accessor*/
169
- set fullscreen(_: boolean | undefined);
170
- }
3
+ import "@gradio/dataframe-interim/css";
4
+ declare const Index: import("svelte").Component<$$ComponentProps, {}, "">;
5
+ type Index = ReturnType<typeof Index>;
6
+ export default Index;
@@ -1,12 +1,15 @@
1
- <script>import { BaseCheckbox } from "@gradio/checkbox";
2
- export let value = false;
3
- export let editable = true;
4
- export let on_change;
5
- function handle_change(event) {
6
- if (editable) {
7
- on_change(event.detail);
8
- }
9
- }
1
+ <script lang="ts">
2
+ import { BaseCheckbox } from "@gradio/checkbox";
3
+
4
+ export let value = false;
5
+ export let editable = true;
6
+ export let on_change: (value: boolean) => void;
7
+
8
+ function handle_change(event: CustomEvent<boolean>): void {
9
+ if (editable) {
10
+ on_change(event.detail);
11
+ }
12
+ }
10
13
  </script>
11
14
 
12
15
  <div class="bool-cell" role="button" tabindex="-1">
@@ -1,20 +1,22 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- value?: boolean;
5
- editable?: boolean;
6
- on_change: (value: boolean) => void;
1
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: Props & {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
7
11
  };
8
- events: {
9
- [evt: string]: CustomEvent<any>;
10
- };
11
- slots: {};
12
- exports?: {} | undefined;
13
- bindings?: string | undefined;
14
- };
15
- export type BooleanCellProps = typeof __propDef.props;
16
- export type BooleanCellEvents = typeof __propDef.events;
17
- export type BooleanCellSlots = typeof __propDef.slots;
18
- export default class BooleanCell extends SvelteComponent<BooleanCellProps, BooleanCellEvents, BooleanCellSlots> {
12
+ z_$$bindings?: Bindings;
19
13
  }
20
- export {};
14
+ declare const BooleanCell: $$__sveltets_2_IsomorphicComponent<{
15
+ value?: boolean;
16
+ editable?: boolean;
17
+ on_change: (value: boolean) => void;
18
+ }, {
19
+ [evt: string]: CustomEvent<any>;
20
+ }, {}, {}, string>;
21
+ type BooleanCell = InstanceType<typeof BooleanCell>;
22
+ export default BooleanCell;
@@ -1,67 +1,85 @@
1
- <script>import { onMount } from "svelte";
2
- import CellMenuIcons from "./CellMenuIcons.svelte";
3
- import FilterMenu from "./FilterMenu.svelte";
4
- export let x;
5
- export let y;
6
- export let on_add_row_above;
7
- export let on_add_row_below;
8
- export let on_add_column_left;
9
- export let on_add_column_right;
10
- export let row;
11
- export let col_count;
12
- export let row_count;
13
- export let on_delete_row;
14
- export let on_delete_col;
15
- export let can_delete_rows;
16
- export let can_delete_cols;
17
- export let on_sort = () => {
18
- };
19
- export let on_clear_sort = () => {
20
- };
21
- export let sort_direction = null;
22
- export let sort_priority = null;
23
- export let on_filter = () => {
24
- };
25
- export let on_clear_filter = () => {
26
- };
27
- export let filter_active = null;
28
- export let editable = true;
29
- export let i18n;
30
- let menu_element;
31
- let active_filter_menu = null;
32
- $: is_header = row === -1;
33
- $: can_add_rows = editable && row_count[1] === "dynamic";
34
- $: can_add_columns = editable && col_count[1] === "dynamic";
35
- onMount(() => {
36
- position_menu();
37
- });
38
- function position_menu() {
39
- if (!menu_element) return;
40
- const viewport_width = window.innerWidth;
41
- const viewport_height = window.innerHeight;
42
- const menu_rect = menu_element.getBoundingClientRect();
43
- let new_x = x - 30;
44
- let new_y = y - 20;
45
- if (new_x + menu_rect.width > viewport_width) {
46
- new_x = x - menu_rect.width + 10;
47
- }
48
- if (new_y + menu_rect.height > viewport_height) {
49
- new_y = y - menu_rect.height + 10;
50
- }
51
- menu_element.style.left = `${new_x}px`;
52
- menu_element.style.top = `${new_y}px`;
53
- }
54
- function toggle_filter_menu() {
55
- if (filter_active) {
56
- on_filter("string", "", "");
57
- return;
58
- }
59
- const menu_rect = menu_element.getBoundingClientRect();
60
- active_filter_menu = {
61
- x: menu_rect.right,
62
- y: menu_rect.top + menu_rect.height / 2
63
- };
64
- }
1
+ <script lang="ts">
2
+ import { onMount } from "svelte";
3
+ import CellMenuIcons from "./CellMenuIcons.svelte";
4
+ import FilterMenu from "./FilterMenu.svelte";
5
+ import type { I18nFormatter } from "@gradio/utils";
6
+ import type {
7
+ SortDirection,
8
+ FilterDatatype
9
+ } from "./context/dataframe_context";
10
+
11
+ export let x: number;
12
+ export let y: number;
13
+ export let on_add_row_above: () => void;
14
+ export let on_add_row_below: () => void;
15
+ export let on_add_column_left: () => void;
16
+ export let on_add_column_right: () => void;
17
+ export let row: number;
18
+ export let col_count: [number, "fixed" | "dynamic"];
19
+ export let row_count: [number, "fixed" | "dynamic"];
20
+ export let on_delete_row: () => void;
21
+ export let on_delete_col: () => void;
22
+ export let can_delete_rows: boolean;
23
+ export let can_delete_cols: boolean;
24
+ export let on_sort: (direction: SortDirection) => void = () => {};
25
+ export let on_clear_sort: () => void = () => {};
26
+ export let sort_direction: SortDirection | null = null;
27
+ export let sort_priority: number | null = null;
28
+ export let on_filter: (
29
+ datatype: FilterDatatype,
30
+ selected_filter: string,
31
+ value: string
32
+ ) => void = () => {};
33
+ export let on_clear_filter: () => void = () => {};
34
+ export let filter_active: boolean | null = null;
35
+ export let editable = true;
36
+
37
+ export let i18n: I18nFormatter;
38
+ let menu_element: HTMLDivElement;
39
+ let active_filter_menu: { x: number; y: number } | null = null;
40
+
41
+ $: is_header = row === -1;
42
+ $: can_add_rows = editable && row_count[1] === "dynamic";
43
+ $: can_add_columns = editable && col_count[1] === "dynamic";
44
+
45
+ onMount(() => {
46
+ position_menu();
47
+ });
48
+
49
+ function position_menu(): void {
50
+ if (!menu_element) return;
51
+
52
+ const viewport_width = window.innerWidth;
53
+ const viewport_height = window.innerHeight;
54
+ const menu_rect = menu_element.getBoundingClientRect();
55
+
56
+ let new_x = x - 30;
57
+ let new_y = y - 20;
58
+
59
+ if (new_x + menu_rect.width > viewport_width) {
60
+ new_x = x - menu_rect.width + 10;
61
+ }
62
+
63
+ if (new_y + menu_rect.height > viewport_height) {
64
+ new_y = y - menu_rect.height + 10;
65
+ }
66
+
67
+ menu_element.style.left = `${new_x}px`;
68
+ menu_element.style.top = `${new_y}px`;
69
+ }
70
+
71
+ function toggle_filter_menu(): void {
72
+ if (filter_active) {
73
+ on_filter("string", "", "");
74
+ return;
75
+ }
76
+
77
+ const menu_rect = menu_element.getBoundingClientRect();
78
+ active_filter_menu = {
79
+ x: menu_rect.right,
80
+ y: menu_rect.top + menu_rect.height / 2
81
+ };
82
+ }
65
83
  </script>
66
84
 
67
85
  <div bind:this={menu_element} class="cell-menu" role="menu">