Skip to main content

fret_ui_headless/table/
tanstack_options.rs

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}