1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4use super::{ColumnResizeDirection, ColumnResizeMode, GroupedColumnMode, TableOptions};
5
6fn default_true() -> bool {
7 true
8}
9
10#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
11#[serde(rename_all = "camelCase")]
12pub enum TanStackColumnResizeMode {
13 OnChange,
14 OnEnd,
15}
16
17#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
18#[serde(rename_all = "lowercase")]
19pub enum TanStackColumnResizeDirection {
20 Ltr,
21 Rtl,
22}
23
24#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
25#[serde(rename_all = "lowercase")]
26pub enum TanStackGroupedColumnModeStr {
27 Reorder,
28 Remove,
29}
30
31#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
32#[serde(untagged)]
33pub enum TanStackGroupedColumnMode {
34 Bool(bool),
35 Str(TanStackGroupedColumnModeStr),
36}
37
38#[derive(Debug, Clone, Serialize, Deserialize)]
39pub struct TanStackTableOptions {
40 #[serde(default, rename = "manualFiltering")]
41 pub manual_filtering: bool,
42 #[serde(default = "default_true", rename = "enableFilters")]
43 pub enable_filters: bool,
44 #[serde(default = "default_true", rename = "enableColumnFilters")]
45 pub enable_column_filters: bool,
46 #[serde(default = "default_true", rename = "enableGlobalFilter")]
47 pub enable_global_filter: bool,
48 #[serde(default, rename = "filterFromLeafRows")]
49 pub filter_from_leaf_rows: bool,
50 #[serde(default, rename = "maxLeafRowFilterDepth")]
51 pub max_leaf_row_filter_depth: Option<usize>,
52 #[serde(default, rename = "manualSorting")]
53 pub manual_sorting: bool,
54 #[serde(default, rename = "manualPagination")]
55 pub manual_pagination: bool,
56 #[serde(default, rename = "autoResetPageIndex")]
57 pub auto_reset_page_index: Option<bool>,
58 #[serde(default, rename = "pageCount")]
59 pub page_count: Option<i32>,
60 #[serde(default, rename = "rowCount")]
61 pub row_count: Option<usize>,
62 #[serde(default, rename = "manualExpanding")]
63 pub manual_expanding: bool,
64 #[serde(default = "default_true", rename = "enableExpanding")]
65 pub enable_expanding: bool,
66 #[serde(default, rename = "autoResetAll")]
67 pub auto_reset_all: Option<bool>,
68 #[serde(default, rename = "autoResetExpanded")]
69 pub auto_reset_expanded: Option<bool>,
70 #[serde(default, rename = "manualGrouping")]
71 pub manual_grouping: bool,
72 #[serde(default = "default_true", rename = "paginateExpandedRows")]
73 pub paginate_expanded_rows: bool,
74 #[serde(default = "default_true", rename = "keepPinnedRows")]
75 pub keep_pinned_rows: bool,
76 #[serde(default, rename = "enableRowPinning")]
77 pub enable_row_pinning: Option<bool>,
78 #[serde(default = "default_true", rename = "enableGrouping")]
79 pub enable_grouping: bool,
80 #[serde(default, rename = "groupedColumnMode")]
81 pub grouped_column_mode: Option<TanStackGroupedColumnMode>,
82 #[serde(default, rename = "enableColumnPinning")]
83 pub enable_column_pinning: Option<bool>,
84 #[serde(default, rename = "enablePinning")]
85 pub enable_pinning: Option<bool>,
86 #[serde(default = "default_true", rename = "enableSorting")]
87 pub enable_sorting: bool,
88 #[serde(default = "default_true", rename = "enableMultiSort")]
89 pub enable_multi_sort: bool,
90 #[serde(default, rename = "maxMultiSortColCount")]
91 pub max_multi_sort_col_count: Option<usize>,
92 #[serde(default = "default_true", rename = "enableSortingRemoval")]
93 pub enable_sorting_removal: bool,
94 #[serde(default = "default_true", rename = "enableMultiRemove")]
95 pub enable_multi_remove: bool,
96 #[serde(default, rename = "sortDescFirst")]
97 pub sort_desc_first: Option<bool>,
98 #[serde(default = "default_true", rename = "enableRowSelection")]
99 pub enable_row_selection: bool,
100 #[serde(default = "default_true", rename = "enableMultiRowSelection")]
101 pub enable_multi_row_selection: bool,
102 #[serde(default = "default_true", rename = "enableSubRowSelection")]
103 pub enable_sub_row_selection: bool,
104 #[serde(default = "default_true", rename = "enableColumnResizing")]
105 pub enable_column_resizing: bool,
106 #[serde(default = "default_true", rename = "enableHiding")]
107 pub enable_hiding: bool,
108 #[serde(default, rename = "columnResizeMode")]
109 pub column_resize_mode: Option<TanStackColumnResizeMode>,
110 #[serde(default, rename = "columnResizeDirection")]
111 pub column_resize_direction: Option<TanStackColumnResizeDirection>,
112}
113
114impl Default for TanStackTableOptions {
115 fn default() -> Self {
116 Self {
117 manual_filtering: false,
118 enable_filters: true,
119 enable_column_filters: true,
120 enable_global_filter: true,
121 filter_from_leaf_rows: false,
122 max_leaf_row_filter_depth: None,
123 manual_sorting: false,
124 manual_pagination: false,
125 auto_reset_page_index: None,
126 page_count: None,
127 row_count: None,
128 manual_expanding: false,
129 enable_expanding: true,
130 auto_reset_all: None,
131 auto_reset_expanded: None,
132 manual_grouping: false,
133 paginate_expanded_rows: true,
134 keep_pinned_rows: true,
135 enable_row_pinning: None,
136 enable_grouping: true,
137 grouped_column_mode: None,
138 enable_column_pinning: None,
139 enable_pinning: None,
140 enable_sorting: true,
141 enable_multi_sort: true,
142 max_multi_sort_col_count: None,
143 enable_sorting_removal: true,
144 enable_multi_remove: true,
145 sort_desc_first: None,
146 enable_row_selection: true,
147 enable_multi_row_selection: true,
148 enable_sub_row_selection: true,
149 enable_column_resizing: true,
150 enable_hiding: true,
151 column_resize_mode: None,
152 column_resize_direction: None,
153 }
154 }
155}
156
157impl TanStackTableOptions {
158 pub fn from_json(value: &Value) -> serde_json::Result<Self> {
159 serde_json::from_value(value.clone())
160 }
161
162 pub fn to_table_options(&self) -> TableOptions {
163 let mut out = TableOptions::default();
164 out.enable_pinning = self.enable_pinning.unwrap_or(out.enable_pinning);
165 out.manual_filtering = self.manual_filtering;
166 out.enable_filters = self.enable_filters;
167 out.enable_column_filters = self.enable_column_filters;
168 out.enable_global_filter = self.enable_global_filter;
169 out.filter_from_leaf_rows = self.filter_from_leaf_rows;
170 out.max_leaf_row_filter_depth = self
171 .max_leaf_row_filter_depth
172 .unwrap_or(out.max_leaf_row_filter_depth);
173 out.manual_sorting = self.manual_sorting;
174 out.manual_pagination = self.manual_pagination;
175 out.auto_reset_page_index = self.auto_reset_page_index;
176 out.page_count = self.page_count;
177 out.row_count = self.row_count;
178 out.manual_expanding = self.manual_expanding;
179 out.enable_expanding = self.enable_expanding;
180 out.auto_reset_all = self.auto_reset_all;
181 out.auto_reset_expanded = self.auto_reset_expanded;
182 out.manual_grouping = self.manual_grouping;
183 out.paginate_expanded_rows = self.paginate_expanded_rows;
184 out.keep_pinned_rows = self.keep_pinned_rows;
185 out.enable_row_pinning = self.enable_row_pinning.unwrap_or(out.enable_pinning);
186 out.enable_grouping = self.enable_grouping;
187 out.grouped_column_mode = match self.grouped_column_mode {
188 None => out.grouped_column_mode,
189 Some(TanStackGroupedColumnMode::Bool(false)) => GroupedColumnMode::None,
190 Some(TanStackGroupedColumnMode::Bool(true)) => GroupedColumnMode::Reorder,
191 Some(TanStackGroupedColumnMode::Str(TanStackGroupedColumnModeStr::Reorder)) => {
192 GroupedColumnMode::Reorder
193 }
194 Some(TanStackGroupedColumnMode::Str(TanStackGroupedColumnModeStr::Remove)) => {
195 GroupedColumnMode::Remove
196 }
197 };
198 out.enable_column_pinning = self.enable_column_pinning.unwrap_or(out.enable_pinning);
199 out.enable_sorting = self.enable_sorting;
200 out.enable_multi_sort = self.enable_multi_sort;
201 out.max_multi_sort_col_count = self.max_multi_sort_col_count;
202 out.enable_sorting_removal = self.enable_sorting_removal;
203 out.enable_multi_remove = self.enable_multi_remove;
204 out.sort_desc_first = self.sort_desc_first;
205 out.enable_row_selection = self.enable_row_selection;
206 out.enable_multi_row_selection = self.enable_multi_row_selection;
207 out.enable_sub_row_selection = self.enable_sub_row_selection;
208 out.enable_column_resizing = self.enable_column_resizing;
209 out.enable_hiding = self.enable_hiding;
210 if let Some(mode) = self.column_resize_mode {
211 out.column_resize_mode = match mode {
212 TanStackColumnResizeMode::OnChange => ColumnResizeMode::OnChange,
213 TanStackColumnResizeMode::OnEnd => ColumnResizeMode::OnEnd,
214 };
215 }
216 if let Some(direction) = self.column_resize_direction {
217 out.column_resize_direction = match direction {
218 TanStackColumnResizeDirection::Ltr => ColumnResizeDirection::Ltr,
219 TanStackColumnResizeDirection::Rtl => ColumnResizeDirection::Rtl,
220 };
221 }
222 out
223 }
224}