@perspective-dev/viewer 4.0.1 → 4.1.0

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 +1250 -761
  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 +353 -161
  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-0d326a25c1022412}/inline0.js +0 -0
  178. /package/dist/wasm/snippets/{perspective-viewer-9a89352df1552d2b → perspective-viewer-0d326a25c1022412}/inline1.js +0 -0
  179. /package/dist/wasm/snippets/{perspective-viewer-9a89352df1552d2b → perspective-viewer-0d326a25c1022412}/inline2.js +0 -0
  180. /package/dist/wasm/snippets/{perspective-viewer-9a89352df1552d2b → perspective-viewer-0d326a25c1022412}/inline3.js +0 -0
  181. /package/dist/wasm/snippets/{perspective-viewer-9a89352df1552d2b → perspective-viewer-0d326a25c1022412}/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
@@ -18,10 +18,10 @@ use super::form::number_field::NumberFieldProps;
18
18
  use super::modal::*;
19
19
  use super::style::LocalStyle;
20
20
  use crate::components::form::number_field::NumberField;
21
- use crate::components::form::select_field::SelectEnumField;
21
+ use crate::components::form::select_enum_field::SelectEnumField;
22
22
  use crate::config::*;
23
23
  use crate::session::Session;
24
- use crate::utils::WeakScope;
24
+ use crate::utils::*;
25
25
  use crate::*;
26
26
 
27
27
  #[derive(PartialEq, Eq, Copy, Clone, Debug)]
@@ -32,16 +32,6 @@ pub enum Side {
32
32
 
33
33
  use Side::*;
34
34
 
35
- #[derive(Debug)]
36
- pub enum NumberColumnStyleMsg {
37
- PosColorChanged(Side, String),
38
- NegColorChanged(Side, String),
39
- NumberForeModeChanged(NumberForegroundMode),
40
- NumberBackModeChanged(NumberBackgroundMode),
41
- GradientChanged(Side, Option<f64>),
42
- DefaultGradientChanged(f64),
43
- }
44
-
45
35
  /// A `ColumnStyle` component is mounted to the window anchored at the screen
46
36
  /// position of `elem`.
47
37
  ///
@@ -61,11 +51,11 @@ pub struct NumberColumnStyleProps {
61
51
  #[prop_or_default]
62
52
  pub weak_link: WeakScope<NumberColumnStyle>,
63
53
 
64
- #[prop_or_default]
65
- pub session: Option<Session>,
66
-
67
54
  #[prop_or_default]
68
55
  pub column_name: Option<String>,
56
+
57
+ // State
58
+ pub session: Session,
69
59
  }
70
60
 
71
61
  impl ModalLink<NumberColumnStyle> for NumberColumnStyleProps {
@@ -80,25 +70,35 @@ impl PartialEq for NumberColumnStyleProps {
80
70
  }
81
71
  }
82
72
 
83
- impl NumberColumnStyleProps {
84
- fn set_default_gradient(&self, ctx: &Context<NumberColumnStyle>) {
85
- if let Some(session) = self.session.clone()
86
- && let Some(column_name) = self.column_name.clone()
87
- {
88
- ctx.link().send_future(async move {
89
- let view = session.get_view().unwrap();
90
- let min_max = view.get_min_max(column_name).await.unwrap();
91
- let abs_max = max!(
92
- min_max.0.parse::<f64>().unwrap_or_default().abs(),
93
- min_max.1.parse::<f64>().unwrap_or_default().abs()
94
- );
95
- let gradient = (abs_max * 100.).round() / 100.;
96
- NumberColumnStyleMsg::DefaultGradientChanged(gradient)
97
- });
98
- }
73
+ fn set_default_gradient(session: &Session, ctx: &Context<NumberColumnStyle>) {
74
+ if let Some(column_name) = ctx.props().column_name.clone() {
75
+ let session = session.clone();
76
+ ctx.link().send_future(async move {
77
+ let view = session.get_view().unwrap();
78
+ let min_max = view.get_min_max(column_name).await.unwrap();
79
+ let abs_max = min_max
80
+ .0
81
+ .parse::<f64>()
82
+ .unwrap_or_default()
83
+ .abs()
84
+ .max(min_max.1.parse::<f64>().unwrap_or_default().abs());
85
+
86
+ let gradient = (abs_max * 100.).round() / 100.;
87
+ NumberColumnStyleMsg::DefaultGradientChanged(gradient)
88
+ });
99
89
  }
100
90
  }
101
91
 
92
+ #[derive(Debug)]
93
+ pub enum NumberColumnStyleMsg {
94
+ PosColorChanged(Side, String),
95
+ NegColorChanged(Side, String),
96
+ NumberForeModeChanged(NumberForegroundMode),
97
+ NumberBackModeChanged(NumberBackgroundMode),
98
+ GradientChanged(Side, Option<f64>),
99
+ DefaultGradientChanged(f64),
100
+ }
101
+
102
102
  /// A column style form control for `number` columns.
103
103
  pub struct NumberColumnStyle {
104
104
  config: NumberColumnStyleConfig,
@@ -119,7 +119,7 @@ impl Component for NumberColumnStyle {
119
119
 
120
120
  fn create(ctx: &Context<Self>) -> Self {
121
121
  ctx.set_modal_link();
122
- ctx.props().set_default_gradient(ctx);
122
+ set_default_gradient(&ctx.props().session, ctx);
123
123
  Self::reset(
124
124
  &ctx.props().config.clone().unwrap_or_default(),
125
125
  &ctx.props().default_config.clone(),
@@ -131,68 +131,14 @@ impl Component for NumberColumnStyle {
131
131
  &ctx.props().config.clone().unwrap_or_default(),
132
132
  &ctx.props().default_config.clone(),
133
133
  );
134
- ctx.props().set_default_gradient(ctx);
134
+
135
+ set_default_gradient(&ctx.props().session, ctx);
135
136
  std::mem::swap(self, &mut new);
136
137
  true
137
138
  }
138
139
 
139
140
  fn update(&mut self, ctx: &Context<Self>, msg: Self::Message) -> bool {
140
141
  match msg {
141
- // NumberColumnStyleMsg::Reset(config, default_config) => {
142
- // let mut new = Self::reset(&config, &default_config);
143
- // std::mem::swap(self, &mut new);
144
- // true
145
- // },
146
- // NumberColumnStyleMsg::ForeEnabledChanged(val) => {
147
- // if val {
148
- // let color_mode = match self.fg_mode {
149
- // NumberForegroundMode::Disabled => NumberForegroundMode::default(),
150
- // x => x,
151
- // };
152
-
153
- // self.config.number_fg_mode = color_mode;
154
- // self.config.pos_fg_color = Some(self.pos_fg_color.to_owned());
155
- // self.config.neg_fg_color = Some(self.neg_fg_color.to_owned());
156
- // if self.fg_mode.needs_gradient() {
157
- // self.config.fg_gradient = Some(self.fg_gradient.unwrap());
158
- // } else {
159
- // self.config.fg_gradient = None;
160
- // }
161
- // } else {
162
- // self.config.number_fg_mode = NumberForegroundMode::Disabled;
163
- // self.config.pos_fg_color = None;
164
- // self.config.neg_fg_color = None;
165
- // self.config.fg_gradient = None;
166
- // }
167
-
168
- // self.dispatch_config(ctx);
169
- // true
170
- // },
171
- // NumberColumnStyleMsg::BackEnabledChanged(val) => {
172
- // if val {
173
- // let color_mode = match self.bg_mode {
174
- // NumberBackgroundMode::Disabled => NumberBackgroundMode::Color,
175
- // x => x,
176
- // };
177
-
178
- // self.config.number_bg_mode = color_mode;
179
- // self.config.pos_bg_color = Some(self.pos_bg_color.to_owned());
180
- // self.config.neg_bg_color = Some(self.neg_bg_color.to_owned());
181
- // if self.bg_mode.needs_gradient() {
182
- // self.config.bg_gradient = Some(self.bg_gradient.unwrap());
183
- // } else {
184
- // self.config.bg_gradient = None;
185
- // }
186
- // } else {
187
- // self.config.number_bg_mode = NumberBackgroundMode::Disabled;
188
- // self.config.pos_bg_color = None;
189
- // self.config.neg_bg_color = None;
190
- // self.config.bg_gradient = None;
191
- // }
192
-
193
- // self.dispatch_config(ctx);
194
- // true
195
- // },
196
142
  NumberColumnStyleMsg::PosColorChanged(side, val) => {
197
143
  if side == Fg {
198
144
  self.pos_fg_color = val;
@@ -11,6 +11,7 @@
11
11
  // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
12
 
13
13
  use perspective_client::config::ViewConfigUpdate;
14
+ use perspective_js::utils::ApiFuture;
14
15
  use yew::prelude::*;
15
16
 
16
17
  use super::containers::select::*;
@@ -22,21 +23,15 @@ use crate::presentation::Presentation;
22
23
  use crate::renderer::*;
23
24
  use crate::session::*;
24
25
  use crate::utils::*;
25
- use crate::*;
26
+ use crate::{css, *};
26
27
 
27
- #[derive(Properties, PartialEq)]
28
+ #[derive(Properties, PartialEq, PerspectiveProperties!)]
28
29
  pub struct PluginSelectorProps {
30
+ pub presentation: Presentation,
29
31
  pub renderer: Renderer,
30
32
  pub session: Session,
31
- pub presentation: Presentation,
32
-
33
- #[cfg(test)]
34
- #[prop_or_default]
35
- pub weak_link: WeakScope<PluginSelector>,
36
33
  }
37
34
 
38
- derive_model!(Renderer, Session, Presentation for PluginSelectorProps);
39
-
40
35
  #[derive(Debug)]
41
36
  pub enum PluginSelectorMsg {
42
37
  ComponentSelectPlugin(String),
@@ -57,8 +52,9 @@ impl Component for PluginSelector {
57
52
  type Properties = PluginSelectorProps;
58
53
 
59
54
  fn create(ctx: &Context<Self>) -> Self {
60
- let options = generate_plugin_optgroups(&ctx.props().renderer);
61
- let _plugin_sub = ctx.props().renderer.plugin_changed.add_listener({
55
+ let PluginSelectorProps { renderer, .. } = ctx.props();
56
+ let options = generate_plugin_optgroups(renderer);
57
+ let _plugin_sub = renderer.plugin_changed.add_listener({
62
58
  let link = ctx.link().clone();
63
59
  move |plugin: JsPerspectiveViewerPlugin| {
64
60
  let name = plugin.name();
@@ -74,28 +70,30 @@ impl Component for PluginSelector {
74
70
  }
75
71
 
76
72
  fn update(&mut self, ctx: &Context<Self>, msg: Self::Message) -> bool {
73
+ let PluginSelectorProps {
74
+ presentation,
75
+ renderer,
76
+ session,
77
+ ..
78
+ } = ctx.props();
77
79
  match msg {
78
80
  RendererSelectPlugin(_plugin_name) => true,
79
81
  ComponentSelectPlugin(plugin_name) => {
80
- if !ctx.props().session.is_errored() {
81
- let metadata = ctx
82
- .props()
83
- .renderer
84
- .get_next_plugin_metadata(&PluginUpdate::Update(plugin_name));
82
+ if !session.is_errored() {
83
+ let metadata =
84
+ renderer.get_next_plugin_metadata(&PluginUpdate::Update(plugin_name));
85
85
 
86
86
  let mut update = ViewConfigUpdate::default();
87
- ctx.props().session.set_update_column_defaults(
87
+ session.set_update_column_defaults(
88
88
  &mut update,
89
- metadata
90
- .as_ref()
91
- .unwrap_or(&*ctx.props().renderer.metadata()),
89
+ metadata.as_ref().unwrap_or(&*renderer.metadata()),
92
90
  );
93
91
 
94
92
  if let Ok(task) = ctx.props().update_and_render(update) {
95
93
  ApiFuture::spawn(task);
96
94
  }
97
95
 
98
- ctx.props().presentation.set_open_column_settings(None);
96
+ presentation.set_open_column_settings(None);
99
97
  self.is_open = false;
100
98
  false
101
99
  } else {
@@ -116,7 +114,6 @@ impl Component for PluginSelector {
116
114
 
117
115
  fn view(&self, ctx: &Context<Self>) -> Html {
118
116
  let callback = ctx.link().callback(|_| OpenMenu);
119
-
120
117
  let plugin_name = ctx.props().renderer.get_active_plugin().unwrap().name();
121
118
  let plugin_name2 = plugin_name.clone();
122
119
  let class = if self.is_open { "open" } else { "" };
@@ -170,7 +167,7 @@ struct PluginSelectProps {
170
167
 
171
168
  #[function_component]
172
169
  fn PluginSelect(props: &PluginSelectProps) -> Html {
173
- let name = props.name.clone().tee::<2>();
170
+ let name = props.name.clone();
174
171
  let path: String = props
175
172
  .name
176
173
  .chars()
@@ -186,9 +183,9 @@ fn PluginSelect(props: &PluginSelectProps) -> Html {
186
183
  html! {
187
184
  <div
188
185
  class="plugin-select-item"
189
- data-plugin={name.0}
186
+ data-plugin={name.clone()}
190
187
  style={format!("--default-column-title:var(--plugin-name-{}--content, \"{}\")", path, props.name)}
191
- onclick={props.on_click.reform(move |_| name.1.clone())}
188
+ onclick={props.on_click.reform(move |_| name.clone())}
192
189
  >
193
190
  <span class="plugin-select-item-name" />
194
191
  </div>
@@ -13,14 +13,17 @@
13
13
  use yew::prelude::*;
14
14
 
15
15
  use super::style::LocalStyle;
16
+ use crate::model::*;
16
17
  use crate::renderer::*;
17
18
  use crate::session::*;
18
- use crate::utils::*;
19
19
  use crate::*;
20
20
 
21
- #[derive(Properties)]
21
+ #[derive(Properties, PerspectiveProperties!)]
22
22
  pub struct RenderWarningProps {
23
+ // Current dimensions
23
24
  pub dimensions: Option<(usize, usize, Option<usize>, Option<usize>)>,
25
+
26
+ // State
24
27
  pub renderer: Renderer,
25
28
  pub session: Session,
26
29
  }
@@ -67,7 +70,6 @@ impl Component for RenderWarning {
67
70
  type Properties = RenderWarningProps;
68
71
 
69
72
  fn create(ctx: &Context<Self>) -> Self {
70
- // enable_weak_link_test!(props, link);
71
73
  let mut elem = Self {
72
74
  col_warn: None,
73
75
  row_warn: None,
@@ -80,10 +82,11 @@ impl Component for RenderWarning {
80
82
  fn update(&mut self, ctx: &Context<Self>, msg: Self::Message) -> bool {
81
83
  match msg {
82
84
  RenderWarningMsg::DismissWarning => {
83
- clone!(ctx.props().renderer, ctx.props().session);
85
+ let state = ctx.props().clone_state();
84
86
  ApiFuture::spawn(async move {
85
- renderer.disable_active_plugin_render_warning();
86
- renderer.update(&session).await
87
+ state.renderer().disable_active_plugin_render_warning();
88
+ let view_task = state.session().get_view();
89
+ state.renderer().update(view_task).await
87
90
  });
88
91
  },
89
92
  };
@@ -0,0 +1,82 @@
1
+ // ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2
+ // ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
3
+ // ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
4
+ // ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
5
+ // ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
6
+ // ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
7
+ // ┃ Copyright (c) 2017, the Perspective Authors. ┃
8
+ // ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
9
+ // ┃ This file is part of the Perspective library, distributed under the terms ┃
10
+ // ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
+ // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
+
13
+ use std::rc::Rc;
14
+
15
+ use yew::prelude::*;
16
+
17
+ use super::column_selector::ColumnSelector;
18
+ use super::plugin_selector::PluginSelector;
19
+ use crate::PerspectiveProperties;
20
+ use crate::components::containers::sidebar_close_button::SidebarCloseButton;
21
+ use crate::dragdrop::*;
22
+ use crate::model::*;
23
+ use crate::presentation::{ColumnLocator, Presentation};
24
+ use crate::renderer::*;
25
+ use crate::session::*;
26
+ use crate::utils::*;
27
+
28
+ #[derive(Clone, Properties, PerspectiveProperties!)]
29
+ pub struct SettingsPanelProps {
30
+ pub on_close: Callback<()>,
31
+ pub on_resize: Rc<PubSub<()>>,
32
+ pub on_select_column: Callback<ColumnLocator>,
33
+ pub on_debug: Callback<()>,
34
+ pub is_debug: bool,
35
+
36
+ /// State
37
+ pub dragdrop: DragDrop,
38
+ pub session: Session,
39
+ pub renderer: Renderer,
40
+ pub presentation: Presentation,
41
+ }
42
+
43
+ impl PartialEq for SettingsPanelProps {
44
+ fn eq(&self, _rhs: &Self) -> bool {
45
+ false
46
+ }
47
+ }
48
+
49
+ #[function_component]
50
+ pub fn SettingsPanel(props: &SettingsPanelProps) -> Html {
51
+ let SettingsPanelProps {
52
+ dragdrop,
53
+ presentation,
54
+ renderer,
55
+ session,
56
+ ..
57
+ } = &props;
58
+ let selected_column = props.get_current_column_locator();
59
+ html! {
60
+ <div id="settings_panel" class="sidebar_column noselect split-panel orient-vertical">
61
+ if selected_column.is_none() {
62
+ <SidebarCloseButton
63
+ id="settings_close_button"
64
+ on_close_sidebar={&props.on_close.clone()}
65
+ />
66
+ }
67
+ <SidebarCloseButton
68
+ id={if props.is_debug {"debug_close_button"} else {"debug_open_button"}}
69
+ on_close_sidebar={&props.on_debug}
70
+ />
71
+ <PluginSelector {presentation} {renderer} {session} />
72
+ <ColumnSelector
73
+ on_resize={&props.on_resize}
74
+ on_open_expr_panel={&props.on_select_column}
75
+ selected_column={selected_column.clone()}
76
+ {dragdrop}
77
+ {renderer}
78
+ {session}
79
+ />
80
+ </div>
81
+ }
82
+ }