@perspective-dev/viewer 4.0.1 → 4.1.1

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 (183) hide show
  1. package/dist/cdn/perspective-viewer.js +2 -2
  2. package/dist/cdn/perspective-viewer.js.map +4 -4
  3. package/dist/css/dracula.css +1 -1
  4. package/dist/css/gruvbox-dark.css +1 -1
  5. package/dist/css/gruvbox.css +1 -1
  6. package/dist/css/icons.css +1 -1
  7. package/dist/css/monokai.css +1 -1
  8. package/dist/css/pro-dark.css +1 -1
  9. package/dist/css/pro.css +1 -1
  10. package/dist/css/solarized-dark.css +1 -1
  11. package/dist/css/solarized.css +1 -1
  12. package/dist/css/themes.css +1 -1
  13. package/dist/css/vaporwave.css +1 -1
  14. package/dist/esm/extensions.d.ts +23 -2
  15. package/dist/esm/perspective-viewer.d.ts +2 -7
  16. package/dist/esm/perspective-viewer.inline.js +2 -2
  17. package/dist/esm/perspective-viewer.inline.js.map +4 -4
  18. package/dist/esm/perspective-viewer.js +2 -2
  19. package/dist/esm/perspective-viewer.js.map +4 -4
  20. package/dist/esm/plugin.d.ts +1 -1
  21. package/dist/esm/ts-rs/ViewerConfigUpdate.d.ts +1 -0
  22. package/dist/wasm/perspective-viewer.d.ts +218 -46
  23. package/dist/wasm/perspective-viewer.js +1242 -753
  24. package/dist/wasm/perspective-viewer.wasm +0 -0
  25. package/dist/wasm/perspective-viewer.wasm.d.ts +38 -19
  26. package/package.json +1 -1
  27. package/src/less/containers/scroll-panel.less +0 -1
  28. package/src/less/plugin-selector.less +15 -5
  29. package/src/less/status-bar.less +75 -27
  30. package/src/less/viewer.less +140 -58
  31. package/src/rust/components/column_dropdown.rs +21 -21
  32. package/src/rust/components/column_selector/active_column.rs +131 -120
  33. package/src/rust/components/column_selector/add_expression_button.rs +5 -0
  34. package/src/rust/components/column_selector/aggregate_selector.rs +8 -4
  35. package/src/rust/components/column_selector/config_selector.rs +170 -161
  36. package/src/rust/components/column_selector/empty_column.rs +16 -11
  37. package/src/rust/components/column_selector/{expression_toolbar.rs → expr_edit_button.rs} +7 -0
  38. package/src/rust/components/column_selector/filter_column.rs +195 -194
  39. package/src/rust/components/column_selector/inactive_column.rs +82 -67
  40. package/src/rust/components/column_selector/pivot_column.rs +16 -11
  41. package/src/rust/components/column_selector/sort_column.rs +9 -7
  42. package/src/rust/components/column_selector.rs +42 -37
  43. package/src/rust/components/column_settings_sidebar/save_settings.rs +3 -1
  44. package/src/rust/components/column_settings_sidebar/style_tab/agg_depth_selector.rs +58 -0
  45. package/src/rust/components/column_settings_sidebar/style_tab/symbol/row_selector.rs +6 -6
  46. package/src/rust/components/column_settings_sidebar/style_tab/symbol/symbol_pairs.rs +2 -94
  47. package/src/rust/components/column_settings_sidebar/style_tab/symbol/symbol_pairs_item.rs +111 -0
  48. package/src/rust/components/column_settings_sidebar/style_tab/symbol.rs +3 -3
  49. package/src/rust/components/column_settings_sidebar/style_tab.rs +23 -83
  50. package/src/rust/components/{column_settings_sidebar/sidebar.rs → column_settings_sidebar.rs} +198 -171
  51. package/src/rust/components/containers/dragdrop_list.rs +20 -20
  52. package/src/rust/components/containers/dropdown_menu.rs +4 -6
  53. package/src/rust/components/containers/mod.rs +1 -4
  54. package/src/rust/components/containers/scroll_panel.rs +80 -80
  55. package/src/rust/components/containers/scroll_panel_item.rs +36 -36
  56. package/src/rust/components/containers/select.rs +46 -44
  57. package/src/rust/components/containers/sidebar.rs +3 -19
  58. package/src/rust/components/{column_settings_sidebar/style_tab/symbol/symbol_config.rs → containers/sidebar_close_button.rs} +15 -9
  59. package/src/rust/components/containers/split_panel.rs +212 -200
  60. package/src/rust/components/containers/tab_list.rs +11 -11
  61. package/src/rust/components/copy_dropdown.rs +22 -25
  62. package/src/rust/components/datetime_column_style/custom.rs +19 -19
  63. package/src/rust/components/datetime_column_style/simple.rs +13 -14
  64. package/src/rust/components/datetime_column_style.rs +75 -76
  65. package/src/rust/components/editable_header.rs +18 -14
  66. package/src/rust/components/empty_row.rs +5 -5
  67. package/src/rust/components/export_dropdown.rs +42 -42
  68. package/src/rust/components/expression_editor.rs +25 -19
  69. package/src/rust/components/filter_dropdown.rs +22 -22
  70. package/src/rust/components/font_loader.rs +11 -9
  71. package/src/rust/components/form/code_editor.rs +106 -105
  72. package/src/rust/components/form/color_range_selector.rs +14 -12
  73. package/src/rust/components/form/color_selector.rs +3 -1
  74. package/src/rust/components/form/debug.rs +95 -94
  75. package/src/rust/components/form/highlight.rs +5 -3
  76. package/src/rust/components/form/mod.rs +3 -2
  77. package/src/rust/components/form/optional_field.rs +2 -2
  78. package/src/rust/components/form/{select_field.rs → select_enum_field.rs} +1 -46
  79. package/src/rust/components/form/select_value_field.rs +64 -0
  80. package/src/rust/components/function_dropdown.rs +21 -21
  81. package/src/rust/components/main_panel.rs +219 -0
  82. package/src/rust/components/mod.rs +6 -6
  83. package/src/rust/components/modal.rs +42 -42
  84. package/src/rust/components/number_column_style.rs +34 -88
  85. package/src/rust/components/plugin_selector.rs +22 -25
  86. package/src/rust/components/render_warning.rs +9 -6
  87. package/src/rust/components/settings_panel.rs +82 -0
  88. package/src/rust/components/status_bar.rs +250 -146
  89. package/src/rust/components/status_bar_counter.rs +26 -119
  90. package/src/rust/components/status_indicator.rs +95 -79
  91. package/src/rust/components/string_column_style.rs +45 -45
  92. package/src/rust/components/style/style_provider.rs +1 -15
  93. package/src/rust/components/style_controls/number_string_format/digits_section.rs +1 -1
  94. package/src/rust/components/style_controls/number_string_format/misc_section.rs +1 -1
  95. package/src/rust/components/style_controls/number_string_format/style_section.rs +1 -1
  96. package/src/rust/components/style_controls/number_string_format.rs +45 -46
  97. package/src/rust/components/type_icon.rs +14 -11
  98. package/src/rust/components/viewer.rs +241 -384
  99. package/src/rust/config/columns_config.rs +2 -2
  100. package/src/rust/config/datetime_column_style.rs +1 -6
  101. package/src/rust/config/mod.rs +1 -0
  102. package/src/rust/config/number_column_style.rs +0 -6
  103. package/src/rust/config/number_string_format.rs +27 -4
  104. package/src/rust/config/viewer_config.rs +27 -167
  105. package/src/rust/custom_elements/copy_dropdown.rs +14 -6
  106. package/src/rust/custom_elements/export_dropdown.rs +15 -7
  107. package/src/rust/custom_elements/filter_dropdown.rs +4 -4
  108. package/src/rust/custom_elements/mod.rs +3 -0
  109. package/src/rust/custom_elements/viewer.rs +367 -169
  110. package/src/rust/custom_events.rs +55 -32
  111. package/src/rust/dragdrop.rs +4 -24
  112. package/src/rust/exprtk/cursor.rs +10 -1
  113. package/src/rust/exprtk/mod.rs +2 -0
  114. package/src/rust/exprtk/tokenize.rs +20 -3
  115. package/src/rust/js/clipboard.rs +2 -2
  116. package/src/rust/js/mimetype.rs +2 -7
  117. package/src/rust/js/mod.rs +0 -1
  118. package/src/rust/js/plugin.rs +7 -0
  119. package/src/rust/lib.rs +18 -5
  120. package/src/rust/model/column_locator.rs +82 -0
  121. package/src/rust/model/columns_iter_set.rs +1 -0
  122. package/src/rust/model/copy_export.rs +50 -14
  123. package/src/rust/model/edit_expression.rs +2 -5
  124. package/src/rust/model/eject.rs +41 -0
  125. package/src/rust/model/get_viewer_config.rs +4 -28
  126. package/src/rust/model/intersection_observer.rs +20 -8
  127. package/src/rust/model/mod.rs +11 -4
  128. package/src/rust/model/plugin_column_styles.rs +0 -31
  129. package/src/rust/model/reset_all.rs +38 -0
  130. package/src/rust/model/resize_observer.rs +34 -7
  131. package/src/rust/model/restore_and_render.rs +12 -7
  132. package/src/rust/{utils/scope.rs → model/send_plugin_config.rs} +32 -35
  133. package/src/rust/model/structural.rs +194 -23
  134. package/src/rust/model/update_and_render.rs +14 -4
  135. package/src/rust/{model/create_col.rs → presentation/column_locator.rs} +73 -42
  136. package/src/rust/{utils/wasm_abi.rs → presentation/sheets.rs} +54 -40
  137. package/src/rust/presentation.rs +60 -119
  138. package/src/rust/renderer/activate.rs +20 -5
  139. package/src/rust/renderer/limits.rs +0 -149
  140. package/src/rust/renderer/render_timer.rs +1 -1
  141. package/src/rust/renderer.rs +34 -18
  142. package/src/rust/root.rs +50 -0
  143. package/src/rust/session/column_defaults_update.rs +4 -4
  144. package/src/rust/session/drag_drop_update.rs +1 -1
  145. package/src/rust/session/metadata.rs +3 -17
  146. package/src/rust/session/replace_expression_update.rs +1 -2
  147. package/src/rust/session.rs +162 -82
  148. package/src/rust/utils/browser/blob.rs +16 -2
  149. package/src/rust/utils/browser/download.rs +1 -0
  150. package/src/rust/{components/column_settings_sidebar/mod.rs → utils/browser/dragdrop.rs} +14 -5
  151. package/src/rust/utils/browser/mod.rs +8 -4
  152. package/src/rust/utils/browser/selection.rs +5 -0
  153. package/src/rust/utils/custom_element.rs +28 -13
  154. package/src/rust/utils/datetime.rs +5 -0
  155. package/src/rust/utils/debounce.rs +7 -1
  156. package/src/rust/utils/hooks/use_async_callback.rs +7 -17
  157. package/src/rust/utils/mod.rs +28 -40
  158. package/src/rust/utils/number_format.rs +6 -5
  159. package/src/rust/utils/pubsub.rs +15 -10
  160. package/src/rust/utils/weak_scope.rs +11 -1
  161. package/src/svg/bookmark-icon.svg +4 -0
  162. package/src/svg/drag-handle copy.svg +10 -0
  163. package/src/svg/drawer-tab-hover.svg +5 -7
  164. package/src/svg/drawer-tab-invert-hover.svg +4 -8
  165. package/src/svg/drawer-tab-invert.svg +4 -7
  166. package/src/svg/drawer-tab.svg +4 -6
  167. package/src/svg/status_ok.svg +24 -24
  168. package/src/ts/extensions.ts +51 -3
  169. package/src/ts/perspective-viewer.ts +2 -14
  170. package/src/ts/plugin.ts +1 -1
  171. package/src/ts/ts-rs/ViewerConfigUpdate.ts +1 -1
  172. package/src/rust/components/column_settings_sidebar/style_tab/column_style.rs +0 -177
  173. package/src/rust/components/containers/tests/mod.rs +0 -11
  174. package/src/rust/components/containers/tests/split_panel.rs +0 -91
  175. package/src/rust/js/testing.rs +0 -149
  176. package/src/rust/utils/tee.rs +0 -88
  177. /package/dist/wasm/snippets/{perspective-viewer-9a89352df1552d2b → perspective-viewer-11a3c51b6310ee99}/inline0.js +0 -0
  178. /package/dist/wasm/snippets/{perspective-viewer-9a89352df1552d2b → perspective-viewer-11a3c51b6310ee99}/inline1.js +0 -0
  179. /package/dist/wasm/snippets/{perspective-viewer-9a89352df1552d2b → perspective-viewer-11a3c51b6310ee99}/inline2.js +0 -0
  180. /package/dist/wasm/snippets/{perspective-viewer-9a89352df1552d2b → perspective-viewer-11a3c51b6310ee99}/inline3.js +0 -0
  181. /package/dist/wasm/snippets/{perspective-viewer-9a89352df1552d2b → perspective-viewer-11a3c51b6310ee99}/inline4.js +0 -0
  182. /package/src/rust/components/{style_controls.rs → style_controls/mod.rs} +0 -0
  183. /package/src/rust/{components/containers → config}/kvpair.rs +0 -0
@@ -15,6 +15,7 @@ use std::rc::Rc;
15
15
 
16
16
  use perspective_client::config::*;
17
17
  use perspective_client::utils::PerspectiveResultExt;
18
+ use perspective_js::utils::ApiFuture;
18
19
  use yew::prelude::*;
19
20
 
20
21
  use super::InPlaceColumn;
@@ -29,17 +30,19 @@ use crate::model::*;
29
30
  use crate::renderer::*;
30
31
  use crate::session::*;
31
32
  use crate::utils::*;
32
- use crate::*;
33
+ use crate::{PerspectiveProperties, css};
33
34
 
34
- #[derive(Properties)]
35
+ #[derive(Properties, PerspectiveProperties!)]
35
36
  pub struct ConfigSelectorProps {
36
- pub session: Session,
37
- pub renderer: Renderer,
38
- pub dragdrop: DragDrop,
39
37
  pub onselect: Callback<()>,
40
38
 
41
39
  #[prop_or_default]
42
40
  pub ondragenter: Callback<()>,
41
+
42
+ // State
43
+ pub session: Session,
44
+ pub renderer: Renderer,
45
+ pub dragdrop: DragDrop,
43
46
  }
44
47
 
45
48
  impl PartialEq for ConfigSelectorProps {
@@ -48,18 +51,6 @@ impl PartialEq for ConfigSelectorProps {
48
51
  }
49
52
  }
50
53
 
51
- impl ConfigSelectorProps {
52
- fn default_op(&self, column: &str) -> Option<String> {
53
- let metadata = self.session.metadata();
54
- let features = metadata.get_features()?;
55
- let col_type = metadata.get_column_table_type(column)?;
56
- let first = features.default_op(col_type)?;
57
- Some(first.to_string())
58
- }
59
- }
60
-
61
- derive_model!(Renderer, Session for ConfigSelectorProps);
62
-
63
54
  #[derive(Debug)]
64
55
  pub enum ConfigSelectorMsg {
65
56
  DragStart,
@@ -81,104 +72,6 @@ pub struct ConfigSelector {
81
72
  _subscriptions: [Rc<Subscription>; 4],
82
73
  }
83
74
 
84
- struct GroupByContext {}
85
- struct SplitByContext {}
86
- struct SortDragContext {}
87
- struct FilterDragContext {}
88
-
89
- impl DragContext<ConfigSelectorMsg> for GroupByContext {
90
- fn dragenter(index: usize) -> ConfigSelectorMsg {
91
- ConfigSelectorMsg::DragOver(index, DragTarget::GroupBy)
92
- }
93
-
94
- fn close(index: usize) -> ConfigSelectorMsg {
95
- ConfigSelectorMsg::Close(index, DragTarget::GroupBy)
96
- }
97
-
98
- fn dragleave() -> ConfigSelectorMsg {
99
- ConfigSelectorMsg::DragLeave(DragTarget::GroupBy)
100
- }
101
-
102
- fn create(col: InPlaceColumn) -> ConfigSelectorMsg {
103
- ConfigSelectorMsg::New(DragTarget::GroupBy, col)
104
- }
105
-
106
- fn is_self_move(target: DragTarget) -> bool {
107
- target == DragTarget::GroupBy
108
- }
109
- }
110
-
111
- impl DragContext<ConfigSelectorMsg> for SplitByContext {
112
- fn dragenter(index: usize) -> ConfigSelectorMsg {
113
- ConfigSelectorMsg::DragOver(index, DragTarget::SplitBy)
114
- }
115
-
116
- fn close(index: usize) -> ConfigSelectorMsg {
117
- ConfigSelectorMsg::Close(index, DragTarget::SplitBy)
118
- }
119
-
120
- fn dragleave() -> ConfigSelectorMsg {
121
- ConfigSelectorMsg::DragLeave(DragTarget::SplitBy)
122
- }
123
-
124
- fn create(col: InPlaceColumn) -> ConfigSelectorMsg {
125
- ConfigSelectorMsg::New(DragTarget::SplitBy, col)
126
- }
127
-
128
- fn is_self_move(target: DragTarget) -> bool {
129
- target == DragTarget::SplitBy
130
- }
131
- }
132
-
133
- impl DragContext<ConfigSelectorMsg> for SortDragContext {
134
- fn dragenter(index: usize) -> ConfigSelectorMsg {
135
- ConfigSelectorMsg::DragOver(index, DragTarget::Sort)
136
- }
137
-
138
- fn close(index: usize) -> ConfigSelectorMsg {
139
- ConfigSelectorMsg::Close(index, DragTarget::Sort)
140
- }
141
-
142
- fn dragleave() -> ConfigSelectorMsg {
143
- ConfigSelectorMsg::DragLeave(DragTarget::Sort)
144
- }
145
-
146
- fn create(col: InPlaceColumn) -> ConfigSelectorMsg {
147
- ConfigSelectorMsg::New(DragTarget::Sort, col)
148
- }
149
-
150
- fn is_self_move(target: DragTarget) -> bool {
151
- target == DragTarget::Sort
152
- }
153
- }
154
-
155
- impl DragContext<ConfigSelectorMsg> for FilterDragContext {
156
- fn dragenter(index: usize) -> ConfigSelectorMsg {
157
- ConfigSelectorMsg::DragOver(index, DragTarget::Filter)
158
- }
159
-
160
- fn close(index: usize) -> ConfigSelectorMsg {
161
- ConfigSelectorMsg::Close(index, DragTarget::Filter)
162
- }
163
-
164
- fn dragleave() -> ConfigSelectorMsg {
165
- ConfigSelectorMsg::DragLeave(DragTarget::Filter)
166
- }
167
-
168
- fn create(col: InPlaceColumn) -> ConfigSelectorMsg {
169
- ConfigSelectorMsg::New(DragTarget::Filter, col)
170
- }
171
-
172
- fn is_self_move(target: DragTarget) -> bool {
173
- target == DragTarget::Filter
174
- }
175
- }
176
-
177
- type GroupBySelector = DragDropList<ConfigSelector, PivotColumn, GroupByContext>;
178
- type SplitBySelector = DragDropList<ConfigSelector, PivotColumn, SplitByContext>;
179
- type SortSelector = DragDropList<ConfigSelector, SortColumn, SortDragContext>;
180
- type FilterSelector = DragDropList<ConfigSelector, FilterColumn, FilterDragContext>;
181
-
182
75
  impl Component for ConfigSelector {
183
76
  type Message = ConfigSelectorMsg;
184
77
  type Properties = ConfigSelectorProps;
@@ -535,21 +428,27 @@ impl Component for ConfigSelector {
535
428
  // }
536
429
 
537
430
  fn view(&self, ctx: &Context<Self>) -> Html {
538
- let config = ctx.props().session.get_view_config();
431
+ let ConfigSelectorProps {
432
+ dragdrop,
433
+ renderer,
434
+ session,
435
+ ..
436
+ } = ctx.props();
437
+ let config = session.get_view_config();
539
438
  let transpose = ctx.link().callback(|_| ConfigSelectorMsg::TransposePivots);
540
439
  let column_dropdown = self.column_dropdown.clone();
541
- let class = if ctx.props().dragdrop.get_drag_column().is_some() {
440
+ let class = if dragdrop.get_drag_column().is_some() {
542
441
  "dragdrop-highlight"
543
442
  } else {
544
443
  ""
545
444
  };
546
445
 
547
446
  let dragend = Callback::from({
548
- let dragdrop = ctx.props().dragdrop.clone();
447
+ let dragdrop = dragdrop.clone();
549
448
  move |_event| dragdrop.notify_drag_end()
550
449
  });
551
450
 
552
- let metadata = ctx.props().session.metadata();
451
+ let metadata = session.metadata();
553
452
  let features = metadata.get_features().unwrap();
554
453
 
555
454
  html! {
@@ -570,18 +469,19 @@ impl Component for ConfigSelector {
570
469
  column_dropdown={column_dropdown.clone()}
571
470
  exclude={config.group_by.iter().cloned().collect::<HashSet<_>>()}
572
471
  is_dragover={ctx.props().dragdrop.is_dragover(DragTarget::GroupBy)}
573
- dragdrop={&ctx.props().dragdrop}
472
+ {dragdrop}
574
473
  >
575
474
  { for config.group_by.iter().map(|group_by| {
576
- html_nested! {
577
- <PivotColumn
578
- dragdrop={ &ctx.props().dragdrop }
579
- session={ &ctx.props().session }
580
- action={ DragTarget::GroupBy }
581
- column={ group_by.clone() }>
582
- </PivotColumn>
583
- }
584
- }) }
475
+ html_nested! {
476
+ <PivotColumn
477
+ action={DragTarget::GroupBy}
478
+ column={group_by.clone()}
479
+ {dragdrop}
480
+ {session}
481
+ >
482
+ </PivotColumn>
483
+ }
484
+ }) }
585
485
  </GroupBySelector>
586
486
  }
587
487
  if features.split_by {
@@ -598,16 +498,17 @@ impl Component for ConfigSelector {
598
498
  parent={ctx.link().clone()}
599
499
  column_dropdown={column_dropdown.clone()}
600
500
  exclude={config.split_by.iter().cloned().collect::<HashSet<_>>()}
601
- is_dragover={ctx.props().dragdrop.is_dragover(DragTarget::SplitBy)}
602
- dragdrop={&ctx.props().dragdrop}
501
+ is_dragover={dragdrop.is_dragover(DragTarget::SplitBy)}
502
+ {dragdrop}
603
503
  >
604
504
  { for config.split_by.iter().map(|split_by| {
605
505
  html_nested! {
606
506
  <PivotColumn
607
- dragdrop={ &ctx.props().dragdrop }
608
- session={ &ctx.props().session }
609
507
  action={ DragTarget::SplitBy }
610
- column={ split_by.clone() }>
508
+ column={ split_by.clone() }
509
+
510
+ {dragdrop}
511
+ {session}>
611
512
  </PivotColumn>
612
513
  }
613
514
  }) }
@@ -620,19 +521,19 @@ impl Component for ConfigSelector {
620
521
  parent={ctx.link().clone()}
621
522
  column_dropdown={column_dropdown.clone()}
622
523
  exclude={config.sort.iter().map(|x| x.0.clone()).collect::<HashSet<_>>()}
623
- dragdrop={&ctx.props().dragdrop}
624
- is_dragover={ctx.props().dragdrop.is_dragover(DragTarget::Sort).map(|(index, name)| {
625
- (index, Sort(name, SortDir::Asc))
626
- })}
524
+ is_dragover={dragdrop.is_dragover(DragTarget::Sort).map(|(index, name)| {
525
+ (index, Sort(name, SortDir::Asc))
526
+ })}
527
+ {dragdrop}
627
528
  >
628
529
  { for config.sort.iter().enumerate().map(|(idx, sort)| {
629
530
  html_nested! {
630
531
  <SortColumn
631
532
  idx={ idx }
632
- session={ &ctx.props().session }
633
- renderer={ &ctx.props().renderer }
634
- dragdrop={ &ctx.props().dragdrop }
635
- sort={ sort.clone() }>
533
+ sort={ sort.clone() }
534
+ {dragdrop}
535
+ {renderer}
536
+ {session}>
636
537
  </SortColumn>
637
538
  }
638
539
  }) }
@@ -645,30 +546,138 @@ impl Component for ConfigSelector {
645
546
  parent={ctx.link().clone()}
646
547
  {column_dropdown}
647
548
  exclude={config.filter.iter().map(|x| x.column().to_string()).collect::<HashSet<_>>()}
648
- dragdrop={&ctx.props().dragdrop}
649
- is_dragover={ctx.props().dragdrop.is_dragover(DragTarget::Filter).map(|(index, name)| {
650
- (index, Filter::new(&name, "", FilterTerm::Scalar(Scalar::Null)))
651
- })}
549
+ is_dragover={dragdrop.is_dragover(DragTarget::Filter).map(|(index, name)| {
550
+ (index, Filter::new(&name, "", FilterTerm::Scalar(Scalar::Null)))
551
+ })}
552
+ {dragdrop}
652
553
  >
653
554
  { for config.filter.iter().enumerate().map(|(idx, filter)| {
654
- let filter_keydown = ctx.link()
655
- .callback(move |txt| ConfigSelectorMsg::SetFilterValue(idx, txt));
656
-
657
- html_nested! {
658
- <FilterColumn
659
- idx={ idx }
660
- filter_dropdown={ &self.filter_dropdown }
661
- session={ &ctx.props().session }
662
- renderer={ &ctx.props().renderer }
663
- dragdrop={ &ctx.props().dragdrop }
664
- filter={ filter.clone() }
665
- on_keydown={ filter_keydown }>
666
- </FilterColumn>
667
- }
668
- }) }
555
+ let filter_keydown = ctx.link()
556
+ .callback(move |txt| ConfigSelectorMsg::SetFilterValue(idx, txt));
557
+
558
+ html_nested! {
559
+ <FilterColumn
560
+ idx={ idx }
561
+ filter_dropdown={ &self.filter_dropdown }
562
+ filter={ filter.clone() }
563
+ on_keydown={ filter_keydown }
564
+ {dragdrop}
565
+ {renderer}
566
+ {session}>
567
+ </FilterColumn>
568
+ }
569
+ }) }
669
570
  </FilterSelector>
670
571
  }
671
572
  </div>
672
573
  }
673
574
  }
674
575
  }
576
+
577
+ impl ConfigSelectorProps {
578
+ fn default_op(&self, column: &str) -> Option<String> {
579
+ let metadata = self.session.metadata();
580
+ let features = metadata.get_features()?;
581
+ let col_type = metadata.get_column_table_type(column)?;
582
+ let first = features.default_op(col_type)?;
583
+ Some(first.to_string())
584
+ }
585
+ }
586
+
587
+ struct GroupByContext {}
588
+ struct SplitByContext {}
589
+ struct SortDragContext {}
590
+ struct FilterDragContext {}
591
+
592
+ impl DragContext<ConfigSelectorMsg> for GroupByContext {
593
+ fn dragenter(index: usize) -> ConfigSelectorMsg {
594
+ ConfigSelectorMsg::DragOver(index, DragTarget::GroupBy)
595
+ }
596
+
597
+ fn close(index: usize) -> ConfigSelectorMsg {
598
+ ConfigSelectorMsg::Close(index, DragTarget::GroupBy)
599
+ }
600
+
601
+ fn dragleave() -> ConfigSelectorMsg {
602
+ ConfigSelectorMsg::DragLeave(DragTarget::GroupBy)
603
+ }
604
+
605
+ fn create(col: InPlaceColumn) -> ConfigSelectorMsg {
606
+ ConfigSelectorMsg::New(DragTarget::GroupBy, col)
607
+ }
608
+
609
+ fn is_self_move(target: DragTarget) -> bool {
610
+ target == DragTarget::GroupBy
611
+ }
612
+ }
613
+
614
+ impl DragContext<ConfigSelectorMsg> for SplitByContext {
615
+ fn dragenter(index: usize) -> ConfigSelectorMsg {
616
+ ConfigSelectorMsg::DragOver(index, DragTarget::SplitBy)
617
+ }
618
+
619
+ fn close(index: usize) -> ConfigSelectorMsg {
620
+ ConfigSelectorMsg::Close(index, DragTarget::SplitBy)
621
+ }
622
+
623
+ fn dragleave() -> ConfigSelectorMsg {
624
+ ConfigSelectorMsg::DragLeave(DragTarget::SplitBy)
625
+ }
626
+
627
+ fn create(col: InPlaceColumn) -> ConfigSelectorMsg {
628
+ ConfigSelectorMsg::New(DragTarget::SplitBy, col)
629
+ }
630
+
631
+ fn is_self_move(target: DragTarget) -> bool {
632
+ target == DragTarget::SplitBy
633
+ }
634
+ }
635
+
636
+ impl DragContext<ConfigSelectorMsg> for SortDragContext {
637
+ fn dragenter(index: usize) -> ConfigSelectorMsg {
638
+ ConfigSelectorMsg::DragOver(index, DragTarget::Sort)
639
+ }
640
+
641
+ fn close(index: usize) -> ConfigSelectorMsg {
642
+ ConfigSelectorMsg::Close(index, DragTarget::Sort)
643
+ }
644
+
645
+ fn dragleave() -> ConfigSelectorMsg {
646
+ ConfigSelectorMsg::DragLeave(DragTarget::Sort)
647
+ }
648
+
649
+ fn create(col: InPlaceColumn) -> ConfigSelectorMsg {
650
+ ConfigSelectorMsg::New(DragTarget::Sort, col)
651
+ }
652
+
653
+ fn is_self_move(target: DragTarget) -> bool {
654
+ target == DragTarget::Sort
655
+ }
656
+ }
657
+
658
+ impl DragContext<ConfigSelectorMsg> for FilterDragContext {
659
+ fn dragenter(index: usize) -> ConfigSelectorMsg {
660
+ ConfigSelectorMsg::DragOver(index, DragTarget::Filter)
661
+ }
662
+
663
+ fn close(index: usize) -> ConfigSelectorMsg {
664
+ ConfigSelectorMsg::Close(index, DragTarget::Filter)
665
+ }
666
+
667
+ fn dragleave() -> ConfigSelectorMsg {
668
+ ConfigSelectorMsg::DragLeave(DragTarget::Filter)
669
+ }
670
+
671
+ fn create(col: InPlaceColumn) -> ConfigSelectorMsg {
672
+ ConfigSelectorMsg::New(DragTarget::Filter, col)
673
+ }
674
+
675
+ fn is_self_move(target: DragTarget) -> bool {
676
+ target == DragTarget::Filter
677
+ }
678
+ }
679
+
680
+ type GroupBySelector = DragDropList<ConfigSelector, PivotColumn, GroupByContext>;
681
+ type SplitBySelector = DragDropList<ConfigSelector, PivotColumn, SplitByContext>;
682
+ type SortSelector = DragDropList<ConfigSelector, SortColumn, SortDragContext>;
683
+ type FilterSelector = DragDropList<ConfigSelector, FilterColumn, FilterDragContext>;
@@ -20,21 +20,15 @@ use crate::components::style::LocalStyle;
20
20
  use crate::css;
21
21
  use crate::custom_elements::ColumnDropDownElement;
22
22
 
23
- #[derive(Default)]
24
- pub struct EmptyColumn {
25
- input_ref: NodeRef,
26
- }
27
-
28
- #[derive(Clone, Debug)]
29
- pub enum InPlaceColumn {
30
- Column(String),
31
- Expression(Expression<'static>),
32
- }
33
-
34
23
  #[derive(Properties)]
35
24
  pub struct EmptyColumnProps {
25
+ /// The autocomplete dropdown element.
36
26
  pub column_dropdown: ColumnDropDownElement,
27
+
28
+ /// Values to exclude from autocomplete
37
29
  pub exclude: HashSet<String>,
30
+
31
+ /// Fires when a value is selected.
38
32
  pub on_select: Callback<InPlaceColumn>,
39
33
  }
40
34
 
@@ -44,6 +38,12 @@ impl PartialEq for EmptyColumnProps {
44
38
  }
45
39
  }
46
40
 
41
+ #[derive(Clone, Debug)]
42
+ pub enum InPlaceColumn {
43
+ Column(String),
44
+ Expression(Expression<'static>),
45
+ }
46
+
47
47
  pub enum EmptyColumnMsg {
48
48
  KeyDown(u32),
49
49
  Blur,
@@ -52,6 +52,11 @@ pub enum EmptyColumnMsg {
52
52
 
53
53
  use EmptyColumnMsg::*;
54
54
 
55
+ #[derive(Default)]
56
+ pub struct EmptyColumn {
57
+ input_ref: NodeRef,
58
+ }
59
+
55
60
  impl Component for EmptyColumn {
56
61
  type Message = EmptyColumnMsg;
57
62
  type Properties = EmptyColumnProps;
@@ -16,9 +16,16 @@ use super::ColumnLocator;
16
16
 
17
17
  #[derive(PartialEq, Clone, Properties)]
18
18
  pub struct ExprEditButtonProps {
19
+ /// Column name.
19
20
  pub name: String,
21
+
22
+ /// Is this an expression column?
20
23
  pub is_expression: bool,
24
+
25
+ /// Fires when the config/expresison button is clicked.
21
26
  pub on_open_expr_panel: Callback<ColumnLocator>,
27
+
28
+ /// Is the expression/config panel open?
22
29
  pub is_editing: bool,
23
30
  }
24
31